Skip to content
Open
79 changes: 79 additions & 0 deletions vms/evm/database/wrapped_database.go
Original file line number Diff line number Diff line change
@@ -0,0 +1,79 @@
// Copyright (C) 2019-2025, Ava Labs, Inc. All rights reserved.
// See the file LICENSE for licensing terms.

package database

import (
"errors"

"github.com/ava-labs/libevm/ethdb"

avalanchegodb "github.com/ava-labs/avalanchego/database"
)

var (
errSnapshotNotSupported = errors.New("snapshot is not supported")
errStatNotSupported = errors.New("stat is not supported")

_ ethdb.Batch = (*ethBatchWrapper)(nil)
_ ethdb.KeyValueStore = (*database)(nil)
)

type database struct {
db avalanchegodb.Database
}

func New(db avalanchegodb.Database) ethdb.KeyValueStore { return database{db} }

func (database) Stat(string) (string, error) { return "", errStatNotSupported }

func (db database) NewBatch() ethdb.Batch { return ethBatchWrapper{batch: db.db.NewBatch()} }

func (db database) Has(key []byte) (bool, error) { return db.db.Has(key) }

func (db database) Get(key []byte) ([]byte, error) { return db.db.Get(key) }

func (db database) Put(key, value []byte) error { return db.db.Put(key, value) }

func (db database) Delete(key []byte) error { return db.db.Delete(key) }

func (db database) Compact(start, limit []byte) error { return db.db.Compact(start, limit) }

func (db database) Close() error { return db.db.Close() }

func (db database) NewBatchWithSize(int) ethdb.Batch { return db.NewBatch() }

func (database) NewSnapshot() (ethdb.Snapshot, error) {
return nil, errSnapshotNotSupported
}

func (db database) NewIterator(prefix []byte, start []byte) ethdb.Iterator {
newStart := make([]byte, len(prefix)+len(start))
copy(newStart, prefix)
copy(newStart[len(prefix):], start)
start = newStart

return db.db.NewIteratorWithStartAndPrefix(start, prefix)
}

func (db database) NewIteratorWithStart(start []byte) ethdb.Iterator {
return db.db.NewIteratorWithStart(start)
}

type ethBatchWrapper struct {
batch avalanchegodb.Batch
}

func (e ethBatchWrapper) Put(key, value []byte) error { return e.batch.Put(key, value) }

func (e ethBatchWrapper) Delete(key []byte) error { return e.batch.Delete(key) }

func (e ethBatchWrapper) ValueSize() int { return e.batch.Size() }

func (e ethBatchWrapper) Write() error { return e.batch.Write() }

func (e ethBatchWrapper) Reset() { e.batch.Reset() }

func (e ethBatchWrapper) Replay(w ethdb.KeyValueWriter) error { return e.batch.Replay(w) }

func (e ethBatchWrapper) Inner() avalanchegodb.Batch { return e.batch.Inner() }