linked atomic swaps to main

This commit is contained in:
StephenButtolph 2020-03-26 18:04:41 -04:00
parent 3efccbf354
commit 87ea21c63f
17 changed files with 157 additions and 87 deletions

View File

@ -14,8 +14,10 @@ import (
"github.com/ava-labs/gecko/ids"
"github.com/ava-labs/gecko/vms/avm"
"github.com/ava-labs/gecko/vms/components/codec"
"github.com/ava-labs/gecko/vms/evm"
"github.com/ava-labs/gecko/vms/platformvm"
"github.com/ava-labs/gecko/vms/secp256k1fx"
"github.com/ava-labs/gecko/vms/spchainvm"
"github.com/ava-labs/gecko/vms/spdagvm"
"github.com/ava-labs/gecko/vms/timestampvm"
@ -514,3 +516,29 @@ func VMGenesis(networkID uint32, vmID ids.ID) *platformvm.CreateChainTx {
}
return nil
}
// AVAAssetID ...
func AVAAssetID(networkID uint32) ids.ID {
createAVM := VMGenesis(networkID, avm.ID)
c := codec.NewDefault()
c.RegisterType(&avm.BaseTx{})
c.RegisterType(&avm.CreateAssetTx{})
c.RegisterType(&avm.OperationTx{})
c.RegisterType(&avm.ImportTx{})
c.RegisterType(&avm.ExportTx{})
c.RegisterType(&secp256k1fx.MintOutput{})
c.RegisterType(&secp256k1fx.TransferOutput{})
c.RegisterType(&secp256k1fx.MintInput{})
c.RegisterType(&secp256k1fx.TransferInput{})
c.RegisterType(&secp256k1fx.Credential{})
genesis := avm.Genesis{}
c.Unmarshal(createAVM.GenesisData, &genesis)
genesisTx := genesis.Txs[0]
tx := avm.Tx{UnsignedTx: &genesisTx.CreateAssetTx}
txBytes, _ := c.Marshal(&tx)
tx.Initialize(txBytes)
return tx.ID()
}

View File

@ -326,7 +326,10 @@ func (n *Node) initNodeID() error {
// its factory needs to reference n.chainManager, which is nil right now
func (n *Node) initVMManager() {
n.vmManager = vms.NewManager(&n.APIServer, n.HTTPLog)
n.vmManager.RegisterVMFactory(avm.ID, &avm.Factory{})
n.vmManager.RegisterVMFactory(avm.ID, &avm.Factory{
AVA: genesis.AVAAssetID(n.Config.NetworkID),
Platform: ids.Empty,
})
n.vmManager.RegisterVMFactory(evm.ID, &evm.Factory{})
n.vmManager.RegisterVMFactory(spdagvm.ID, &spdagvm.Factory{TxFee: n.Config.AvaTxFee})
n.vmManager.RegisterVMFactory(spchainvm.ID, &spchainvm.Factory{})
@ -362,6 +365,8 @@ func (n *Node) initChains() {
/*vmFactory=*/ &platformvm.Factory{
ChainManager: n.chainManager,
Validators: vdrs,
AVA: genesis.AVAAssetID(n.Config.NetworkID),
AVM: genesis.VMGenesis(n.Config.NetworkID, avm.ID).ID(),
},
)

View File

@ -112,6 +112,9 @@ func (t *ExportTx) SemanticVerify(vm *VM, uTx *UniqueTx, creds []verify.Verifiab
if !utxoAssetID.Equals(inAssetID) {
return errAssetIDMismatch
}
if !utxoAssetID.Equals(vm.ava) {
return errWrongAssetID
}
if !vm.verifyFxUsage(fxIndex, inAssetID) {
return errIncompatibleFx
@ -128,9 +131,8 @@ func (t *ExportTx) SemanticVerify(vm *VM, uTx *UniqueTx, creds []verify.Verifiab
func (t *ExportTx) ExecuteWithSideEffects(vm *VM, batch database.Batch) error {
txID := t.ID()
bID := ids.Empty // TODO: Needs to be set to the platform chain
smDB := vm.ctx.SharedMemory.GetDatabase(bID)
defer vm.ctx.SharedMemory.ReleaseDatabase(bID)
smDB := vm.ctx.SharedMemory.GetDatabase(vm.platform)
defer vm.ctx.SharedMemory.ReleaseDatabase(vm.platform)
vsmDB := versiondb.New(smDB)

View File

@ -130,8 +130,16 @@ func TestIssueExportTx(t *testing.T) {
ctx.ChainID = chainID
ctx.SharedMemory = sm.NewBlockchainSharedMemory(chainID)
genesisTx := GetFirstTxFromGenesisTest(genesisBytes, t)
avaID := genesisTx.ID()
platformID := ids.Empty.Prefix(0)
ctx.Lock.Lock()
vm := &VM{}
vm := &VM{
ava: avaID,
platform: platformID,
}
err := vm.Initialize(
ctx,
memdb.New(),
@ -149,8 +157,6 @@ func TestIssueExportTx(t *testing.T) {
key := keys[0]
genesisTx := GetFirstTxFromGenesisTest(genesisBytes, t)
tx := &Tx{UnsignedTx: &ExportTx{
BaseTx: BaseTx{
NetID: networkID,
@ -158,17 +164,17 @@ func TestIssueExportTx(t *testing.T) {
},
Ins: []*ava.TransferableInput{&ava.TransferableInput{
UTXOID: ava.UTXOID{
TxID: genesisTx.ID(),
TxID: avaID,
OutputIndex: 1,
},
Asset: ava.Asset{ID: genesisTx.ID()},
Asset: ava.Asset{ID: avaID},
In: &secp256k1fx.TransferInput{
Amt: 50000,
Input: secp256k1fx.Input{SigIndices: []uint32{0}},
},
}},
Outs: []*ava.TransferableOutput{&ava.TransferableOutput{
Asset: ava.Asset{ID: genesisTx.ID()},
Asset: ava.Asset{ID: avaID},
Out: &secp256k1fx.TransferOutput{
Amt: 50000,
OutputOwners: secp256k1fx.OutputOwners{
@ -228,9 +234,8 @@ func TestIssueExportTx(t *testing.T) {
}
parsedTx.Accept()
bID := ids.Empty // TODO: Needs to be set to the platform chain
smDB := vm.ctx.SharedMemory.GetDatabase(bID)
defer vm.ctx.SharedMemory.ReleaseDatabase(bID)
smDB := vm.ctx.SharedMemory.GetDatabase(platformID)
defer vm.ctx.SharedMemory.ReleaseDatabase(platformID)
state := ava.NewPrefixedState(smDB, vm.codec)
@ -261,8 +266,16 @@ func TestClearForceAcceptedExportTx(t *testing.T) {
ctx.ChainID = chainID
ctx.SharedMemory = sm.NewBlockchainSharedMemory(chainID)
genesisTx := GetFirstTxFromGenesisTest(genesisBytes, t)
avaID := genesisTx.ID()
platformID := ids.Empty.Prefix(0)
ctx.Lock.Lock()
vm := &VM{}
vm := &VM{
ava: avaID,
platform: platformID,
}
err := vm.Initialize(
ctx,
memdb.New(),
@ -280,8 +293,6 @@ func TestClearForceAcceptedExportTx(t *testing.T) {
key := keys[0]
genesisTx := GetFirstTxFromGenesisTest(genesisBytes, t)
tx := &Tx{UnsignedTx: &ExportTx{
BaseTx: BaseTx{
NetID: networkID,
@ -289,17 +300,17 @@ func TestClearForceAcceptedExportTx(t *testing.T) {
},
Ins: []*ava.TransferableInput{&ava.TransferableInput{
UTXOID: ava.UTXOID{
TxID: genesisTx.ID(),
TxID: avaID,
OutputIndex: 1,
},
Asset: ava.Asset{ID: genesisTx.ID()},
Asset: ava.Asset{ID: avaID},
In: &secp256k1fx.TransferInput{
Amt: 50000,
Input: secp256k1fx.Input{SigIndices: []uint32{0}},
},
}},
Outs: []*ava.TransferableOutput{&ava.TransferableOutput{
Asset: ava.Asset{ID: genesisTx.ID()},
Asset: ava.Asset{ID: avaID},
Out: &secp256k1fx.TransferOutput{
Amt: 50000,
OutputOwners: secp256k1fx.OutputOwners{
@ -358,8 +369,7 @@ func TestClearForceAcceptedExportTx(t *testing.T) {
t.Fatal(err)
}
bID := ids.Empty // TODO: Needs to be set to the platform chain
smDB := vm.ctx.SharedMemory.GetDatabase(bID)
smDB := vm.ctx.SharedMemory.GetDatabase(platformID)
state := ava.NewPrefixedState(smDB, vm.codec)
@ -372,12 +382,12 @@ func TestClearForceAcceptedExportTx(t *testing.T) {
t.Fatal(err)
}
vm.ctx.SharedMemory.ReleaseDatabase(bID)
vm.ctx.SharedMemory.ReleaseDatabase(platformID)
parsedTx.Accept()
smDB = vm.ctx.SharedMemory.GetDatabase(bID)
defer vm.ctx.SharedMemory.ReleaseDatabase(bID)
smDB = vm.ctx.SharedMemory.GetDatabase(platformID)
defer vm.ctx.SharedMemory.ReleaseDatabase(platformID)
state = ava.NewPrefixedState(smDB, vm.codec)

View File

@ -13,7 +13,15 @@ var (
)
// Factory ...
type Factory struct{}
type Factory struct {
AVA ids.ID
Platform ids.ID
}
// New ...
func (f *Factory) New() interface{} { return &VM{} }
func (f *Factory) New() interface{} {
return &VM{
ava: f.AVA,
platform: f.Platform,
}
}

View File

@ -112,9 +112,8 @@ func (t *ImportTx) SemanticVerify(vm *VM, uTx *UniqueTx, creds []verify.Verifiab
return err
}
bID := ids.Empty // TODO: Needs to be set to the platform chain
smDB := vm.ctx.SharedMemory.GetDatabase(bID)
defer vm.ctx.SharedMemory.ReleaseDatabase(bID)
smDB := vm.ctx.SharedMemory.GetDatabase(vm.platform)
defer vm.ctx.SharedMemory.ReleaseDatabase(vm.platform)
state := ava.NewPrefixedState(smDB, vm.codec)
@ -138,6 +137,9 @@ func (t *ImportTx) SemanticVerify(vm *VM, uTx *UniqueTx, creds []verify.Verifiab
if !utxoAssetID.Equals(inAssetID) {
return errAssetIDMismatch
}
if !utxoAssetID.Equals(vm.ava) {
return errWrongAssetID
}
if !vm.verifyFxUsage(fxIndex, inAssetID) {
return errIncompatibleFx
@ -152,9 +154,8 @@ func (t *ImportTx) SemanticVerify(vm *VM, uTx *UniqueTx, creds []verify.Verifiab
// ExecuteWithSideEffects writes the batch with any additional side effects
func (t *ImportTx) ExecuteWithSideEffects(vm *VM, batch database.Batch) error {
bID := ids.Empty // TODO: Needs to be set to the platform chain
smDB := vm.ctx.SharedMemory.GetDatabase(bID)
defer vm.ctx.SharedMemory.ReleaseDatabase(bID)
smDB := vm.ctx.SharedMemory.GetDatabase(vm.platform)
defer vm.ctx.SharedMemory.ReleaseDatabase(vm.platform)
vsmDB := versiondb.New(smDB)

View File

@ -130,8 +130,16 @@ func TestIssueImportTx(t *testing.T) {
ctx.ChainID = chainID
ctx.SharedMemory = sm.NewBlockchainSharedMemory(chainID)
genesisTx := GetFirstTxFromGenesisTest(genesisBytes, t)
avaID := genesisTx.ID()
platformID := ids.Empty.Prefix(0)
ctx.Lock.Lock()
vm := &VM{}
vm := &VM{
ava: avaID,
platform: platformID,
}
err := vm.Initialize(
ctx,
memdb.New(),
@ -149,8 +157,6 @@ func TestIssueImportTx(t *testing.T) {
key := keys[0]
genesisTx := GetFirstTxFromGenesisTest(genesisBytes, t)
utxoID := ava.UTXOID{
TxID: ids.NewID([32]byte{
0x0f, 0x2f, 0x4f, 0x6f, 0x8e, 0xae, 0xce, 0xee,
@ -167,7 +173,7 @@ func TestIssueImportTx(t *testing.T) {
},
Ins: []*ava.TransferableInput{&ava.TransferableInput{
UTXOID: utxoID,
Asset: ava.Asset{ID: genesisTx.ID()},
Asset: ava.Asset{ID: avaID},
In: &secp256k1fx.TransferInput{
Amt: 1000,
Input: secp256k1fx.Input{SigIndices: []uint32{0}},
@ -205,12 +211,11 @@ func TestIssueImportTx(t *testing.T) {
// Provide the platform UTXO:
bID := ids.Empty // TODO: Needs to be set to the platform chain
smDB := vm.ctx.SharedMemory.GetDatabase(bID)
smDB := vm.ctx.SharedMemory.GetDatabase(platformID)
utxo := &ava.UTXO{
UTXOID: utxoID,
Asset: ava.Asset{ID: genesisTx.ID()},
Asset: ava.Asset{ID: avaID},
Out: &secp256k1fx.TransferOutput{
Amt: 1000,
OutputOwners: secp256k1fx.OutputOwners{
@ -225,7 +230,7 @@ func TestIssueImportTx(t *testing.T) {
t.Fatal(err)
}
vm.ctx.SharedMemory.ReleaseDatabase(bID)
vm.ctx.SharedMemory.ReleaseDatabase(platformID)
if _, err := vm.IssueTx(tx.Bytes(), nil); err != nil {
t.Fatalf("should have issued the transaction correctly but errored: %s", err)
@ -246,8 +251,8 @@ func TestIssueImportTx(t *testing.T) {
parsedTx := txs[0]
parsedTx.Accept()
smDB = vm.ctx.SharedMemory.GetDatabase(bID)
defer vm.ctx.SharedMemory.ReleaseDatabase(bID)
smDB = vm.ctx.SharedMemory.GetDatabase(platformID)
defer vm.ctx.SharedMemory.ReleaseDatabase(platformID)
state = ava.NewPrefixedState(smDB, vm.codec)
if _, err := state.PlatformUTXO(utxoID.InputID()); err == nil {
@ -269,10 +274,12 @@ func TestForceAcceptImportTx(t *testing.T) {
ctx.ChainID = chainID
ctx.SharedMemory = sm.NewBlockchainSharedMemory(chainID)
platformID := ids.Empty.Prefix(0)
ctx.Lock.Lock()
defer ctx.Lock.Unlock()
vm := &VM{}
vm := &VM{platform: platformID}
err := vm.Initialize(
ctx,
memdb.New(),
@ -351,9 +358,8 @@ func TestForceAcceptImportTx(t *testing.T) {
parsedTx.Accept()
bID := ids.Empty // TODO: Needs to be set to the platform chain
smDB := vm.ctx.SharedMemory.GetDatabase(bID)
defer vm.ctx.SharedMemory.ReleaseDatabase(bID)
smDB := vm.ctx.SharedMemory.GetDatabase(platformID)
defer vm.ctx.SharedMemory.ReleaseDatabase(platformID)
state := ava.NewPrefixedState(smDB, vm.codec)
utxoSource := utxoID.InputID()

View File

@ -14,6 +14,7 @@ import (
var (
errAssetIDMismatch = errors.New("asset IDs in the input don't match the utxo")
errWrongAssetID = errors.New("asset ID must be AVA in the atomic tx")
errMissingUTXO = errors.New("missing utxo")
errUnknownTx = errors.New("transaction is unknown")
errRejectedTx = errors.New("transaction is rejected")

View File

@ -50,6 +50,9 @@ var (
type VM struct {
ids.Aliaser
ava ids.ID
platform ids.ID
// Contains information of where this VM is executing
ctx *snow.Context

View File

@ -148,8 +148,8 @@ func (tx *CreateChainTx) SemanticVerify(db database.Database) (func(), error) {
chainParams.FxAliases = append(chainParams.FxAliases, fxID.String())
}
// TODO: Not sure how else to make this not nil pointer error during tests
if tx.vm.ChainManager != nil {
tx.vm.ChainManager.CreateChain(chainParams)
if tx.vm.chainManager != nil {
tx.vm.chainManager.CreateChain(chainParams)
}
}

View File

@ -86,7 +86,7 @@ func (tx *ExportTx) SyntacticVerify() error {
if err := out.Verify(); err != nil {
return err
}
if !out.AssetID().Equals(tx.vm.AVA) {
if !out.AssetID().Equals(tx.vm.ava) {
return errUnknownAsset
}
}
@ -141,9 +141,8 @@ func (tx *ExportTx) SemanticVerify(db database.Database) error {
func (tx *ExportTx) Accept(batch database.Batch) error {
txID := tx.ID()
bID := ids.Empty // TODO: Needs to be set to the platform chain
smDB := tx.vm.Ctx.SharedMemory.GetDatabase(bID)
defer tx.vm.Ctx.SharedMemory.ReleaseDatabase(bID)
smDB := tx.vm.Ctx.SharedMemory.GetDatabase(tx.vm.avm)
defer tx.vm.Ctx.SharedMemory.ReleaseDatabase(tx.vm.avm)
vsmDB := versiondb.New(smDB)

View File

@ -18,12 +18,16 @@ var (
type Factory struct {
ChainManager chains.Manager
Validators validators.Manager
AVA ids.ID
AVM ids.ID
}
// New returns a new instance of the Platform Chain
func (f *Factory) New() interface{} {
return &VM{
ChainManager: f.ChainManager,
Validators: f.Validators,
chainManager: f.ChainManager,
validators: f.Validators,
ava: f.AVA,
avm: f.AVM,
}
}

View File

@ -110,7 +110,7 @@ func (tx *ImportTx) SyntacticVerify() error {
if err := in.Verify(); err != nil {
return err
}
if !in.AssetID().Equals(tx.vm.AVA) {
if !in.AssetID().Equals(tx.vm.ava) {
return errUnknownAsset
}
}
@ -181,9 +181,8 @@ func (tx *ImportTx) SemanticVerify(db database.Database) error {
return err
}
bID := ids.Empty // TODO: Needs to be set to the platform chain
smDB := tx.vm.Ctx.SharedMemory.GetDatabase(bID)
defer tx.vm.Ctx.SharedMemory.ReleaseDatabase(bID)
smDB := tx.vm.Ctx.SharedMemory.GetDatabase(tx.vm.avm)
defer tx.vm.Ctx.SharedMemory.ReleaseDatabase(tx.vm.avm)
state := ava.NewPrefixedState(smDB, Codec)
@ -211,9 +210,8 @@ func (tx *ImportTx) SemanticVerify(db database.Database) error {
// Accept this transaction.
func (tx *ImportTx) Accept(batch database.Batch) error {
bID := ids.Empty // TODO: Needs to be set to the platform chain
smDB := tx.vm.Ctx.SharedMemory.GetDatabase(bID)
defer tx.vm.Ctx.SharedMemory.ReleaseDatabase(bID)
smDB := tx.vm.Ctx.SharedMemory.GetDatabase(tx.vm.avm)
defer tx.vm.Ctx.SharedMemory.ReleaseDatabase(tx.vm.avm)
vsmDB := versiondb.New(smDB)

View File

@ -248,7 +248,7 @@ func (service *Service) SampleValidators(_ *http.Request, args *SampleValidators
args.SubnetID = DefaultSubnetID
}
validators, ok := service.vm.Validators.GetValidatorSet(args.SubnetID)
validators, ok := service.vm.validators.GetValidatorSet(args.SubnetID)
if !ok {
return fmt.Errorf("couldn't get validators of subnet with ID %s. Does it exist?", args.SubnetID)
}
@ -902,14 +902,14 @@ type CreateBlockchainReply struct {
// CreateBlockchain issues a transaction to the network to create a new blockchain
func (service *Service) CreateBlockchain(_ *http.Request, args *CreateBlockchainArgs, reply *CreateBlockchainReply) error {
vmID, err := service.vm.ChainManager.LookupVM(args.VMID)
vmID, err := service.vm.chainManager.LookupVM(args.VMID)
if err != nil {
return fmt.Errorf("no VM with ID '%s' found", args.VMID)
}
fxIDs := []ids.ID(nil)
for _, fxIDStr := range args.FxIDs {
fxID, err := service.vm.ChainManager.LookupVM(fxIDStr)
fxID, err := service.vm.chainManager.LookupVM(fxIDStr)
if err != nil {
return fmt.Errorf("no FX with ID '%s' found", fxIDStr)
}
@ -974,7 +974,7 @@ type GetBlockchainStatusReply struct {
// GetBlockchainStatus gets the status of a blockchain with the ID [args.BlockchainID].
func (service *Service) GetBlockchainStatus(_ *http.Request, args *GetBlockchainStatusArgs, reply *GetBlockchainStatusReply) error {
_, err := service.vm.ChainManager.Lookup(args.BlockchainID)
_, err := service.vm.chainManager.Lookup(args.BlockchainID)
if err == nil {
reply.Status = Validating
return nil

View File

@ -150,13 +150,16 @@ func init() {
type VM struct {
*core.SnowmanVM
Validators validators.Manager
validators validators.Manager
// The node's chain manager
ChainManager chains.Manager
chainManager chains.Manager
// AVA asset ID
AVA ids.ID
ava ids.ID
// AVM is the ID of the ava virtual machine
avm ids.ID
fx secp256k1fx.Fx
codec codec.Codec
@ -325,7 +328,7 @@ func (vm *VM) initBlockchains() error {
for _, fxID := range chain.FxIDs {
chainParams.FxAliases = append(chainParams.FxAliases, fxID.String())
}
vm.ChainManager.CreateChain(chainParams)
vm.chainManager.CreateChain(chainParams)
}
return nil
}
@ -717,7 +720,7 @@ func (vm *VM) getValidators(validatorEvents *EventHeap) []validators.Validator {
}
func (vm *VM) updateValidators(subnetID ids.ID) error {
validatorSet, ok := vm.Validators.GetValidatorSet(subnetID)
validatorSet, ok := vm.validators.GetValidatorSet(subnetID)
if !ok {
return fmt.Errorf("couldn't get the validator sampler of the %s subnet", subnetID)
}

View File

@ -120,8 +120,8 @@ func defaultVM() *VM {
}
defaultSubnet := validators.NewSet()
vm.Validators = validators.NewManager()
vm.Validators.PutValidatorSet(DefaultSubnetID, defaultSubnet)
vm.validators = validators.NewManager()
vm.validators.PutValidatorSet(DefaultSubnetID, defaultSubnet)
vm.clock.Set(defaultGenesisTime)
db := memdb.New()
@ -1068,11 +1068,12 @@ func TestCreateSubnet(t *testing.T) {
func TestAtomicImport(t *testing.T) {
vm := defaultVM()
avmID := ids.Empty.Prefix(0)
utxoID := ava.UTXOID{
TxID: ids.Empty.Prefix(0),
TxID: ids.Empty.Prefix(1),
OutputIndex: 1,
}
assetID := ids.Empty.Prefix(1)
assetID := ids.Empty.Prefix(2)
amount := uint64(50000)
key := keys[0]
@ -1102,7 +1103,8 @@ func TestAtomicImport(t *testing.T) {
vm.Ctx.Lock.Lock()
defer vm.Ctx.Lock.Unlock()
vm.AVA = assetID
vm.ava = assetID
vm.avm = avmID
vm.unissuedAtomicTxs = append(vm.unissuedAtomicTxs, tx)
if _, err := vm.BuildBlock(); err == nil {
@ -1111,8 +1113,7 @@ func TestAtomicImport(t *testing.T) {
// Provide the avm UTXO:
bID := ids.Empty // TODO: Needs to be set to the platform chain
smDB := vm.Ctx.SharedMemory.GetDatabase(bID)
smDB := vm.Ctx.SharedMemory.GetDatabase(avmID)
utxo := &ava.UTXO{
UTXOID: utxoID,
@ -1131,7 +1132,7 @@ func TestAtomicImport(t *testing.T) {
t.Fatal(err)
}
vm.Ctx.SharedMemory.ReleaseDatabase(bID)
vm.Ctx.SharedMemory.ReleaseDatabase(avmID)
vm.unissuedAtomicTxs = append(vm.unissuedAtomicTxs, tx)
blk, err := vm.BuildBlock()
@ -1145,8 +1146,8 @@ func TestAtomicImport(t *testing.T) {
blk.Accept()
smDB = vm.Ctx.SharedMemory.GetDatabase(bID)
defer vm.Ctx.SharedMemory.ReleaseDatabase(bID)
smDB = vm.Ctx.SharedMemory.GetDatabase(avmID)
defer vm.Ctx.SharedMemory.ReleaseDatabase(avmID)
state = ava.NewPrefixedState(smDB, vm.codec)
if _, err := state.AVMUTXO(utxoID.InputID()); err == nil {
@ -1158,11 +1159,12 @@ func TestAtomicImport(t *testing.T) {
func TestOptimisticAtomicImport(t *testing.T) {
vm := defaultVM()
avmID := ids.Empty.Prefix(0)
utxoID := ava.UTXOID{
TxID: ids.Empty.Prefix(0),
TxID: ids.Empty.Prefix(1),
OutputIndex: 1,
}
assetID := ids.Empty.Prefix(1)
assetID := ids.Empty.Prefix(2)
amount := uint64(50000)
key := keys[0]
@ -1192,7 +1194,8 @@ func TestOptimisticAtomicImport(t *testing.T) {
vm.Ctx.Lock.Lock()
defer vm.Ctx.Lock.Unlock()
vm.AVA = assetID
vm.ava = assetID
vm.avm = avmID
blk, err := vm.newAtomicBlock(vm.Preferred(), tx)
if err != nil {
@ -1219,9 +1222,8 @@ func TestOptimisticAtomicImport(t *testing.T) {
t.Fatalf("failed to provide funds")
}
bID := ids.Empty // TODO: Needs to be set to the platform chain
smDB := vm.Ctx.SharedMemory.GetDatabase(bID)
defer vm.Ctx.SharedMemory.ReleaseDatabase(bID)
smDB := vm.Ctx.SharedMemory.GetDatabase(avmID)
defer vm.Ctx.SharedMemory.ReleaseDatabase(avmID)
state := ava.NewPrefixedState(smDB, Codec)
if _, err := state.AVMStatus(utxoID.InputID()); err != nil {

View File

@ -176,7 +176,7 @@ func (w *Wallet) CreateTx(assetID ids.ID, amount uint64, destAddr ids.ShortID) (
return nil, errors.New("insufficient funds")
}
avm.SortTransferableInputsWithSigners(ins, keys)
ava.SortTransferableInputsWithSigners(ins, keys)
outs := []*ava.TransferableOutput{&ava.TransferableOutput{
Asset: ava.Asset{ID: assetID},