diff --git a/genesis/genesis.go b/genesis/genesis.go index cdf0860..61e2344 100644 --- a/genesis/genesis.go +++ b/genesis/genesis.go @@ -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() +} diff --git a/node/node.go b/node/node.go index 9fdc92e..a5c42f0 100644 --- a/node/node.go +++ b/node/node.go @@ -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(), }, ) diff --git a/vms/avm/export_tx.go b/vms/avm/export_tx.go index 53906a4..fce9a99 100644 --- a/vms/avm/export_tx.go +++ b/vms/avm/export_tx.go @@ -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) diff --git a/vms/avm/export_tx_test.go b/vms/avm/export_tx_test.go index c95e831..6bcb2c1 100644 --- a/vms/avm/export_tx_test.go +++ b/vms/avm/export_tx_test.go @@ -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) diff --git a/vms/avm/factory.go b/vms/avm/factory.go index b76606d..b8896ad 100644 --- a/vms/avm/factory.go +++ b/vms/avm/factory.go @@ -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, + } +} diff --git a/vms/avm/import_tx.go b/vms/avm/import_tx.go index e34d24b..ed341be 100644 --- a/vms/avm/import_tx.go +++ b/vms/avm/import_tx.go @@ -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) diff --git a/vms/avm/import_tx_test.go b/vms/avm/import_tx_test.go index ec37aec..fb0bcfd 100644 --- a/vms/avm/import_tx_test.go +++ b/vms/avm/import_tx_test.go @@ -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() diff --git a/vms/avm/unique_tx.go b/vms/avm/unique_tx.go index 13673fa..6c4e3f4 100644 --- a/vms/avm/unique_tx.go +++ b/vms/avm/unique_tx.go @@ -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") diff --git a/vms/avm/vm.go b/vms/avm/vm.go index 0d6a460..543408c 100644 --- a/vms/avm/vm.go +++ b/vms/avm/vm.go @@ -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 diff --git a/vms/platformvm/create_chain_tx.go b/vms/platformvm/create_chain_tx.go index 74bd3f0..d5287ea 100644 --- a/vms/platformvm/create_chain_tx.go +++ b/vms/platformvm/create_chain_tx.go @@ -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) } } diff --git a/vms/platformvm/export_tx.go b/vms/platformvm/export_tx.go index 113bb5a..f3e3af3 100644 --- a/vms/platformvm/export_tx.go +++ b/vms/platformvm/export_tx.go @@ -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) diff --git a/vms/platformvm/factory.go b/vms/platformvm/factory.go index 25f9786..eea1467 100644 --- a/vms/platformvm/factory.go +++ b/vms/platformvm/factory.go @@ -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, } } diff --git a/vms/platformvm/import_tx.go b/vms/platformvm/import_tx.go index 01a12ce..aaa7aad 100644 --- a/vms/platformvm/import_tx.go +++ b/vms/platformvm/import_tx.go @@ -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) diff --git a/vms/platformvm/service.go b/vms/platformvm/service.go index c48fe2a..49f492f 100644 --- a/vms/platformvm/service.go +++ b/vms/platformvm/service.go @@ -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 diff --git a/vms/platformvm/vm.go b/vms/platformvm/vm.go index bb3a173..ed2dfdc 100644 --- a/vms/platformvm/vm.go +++ b/vms/platformvm/vm.go @@ -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) } diff --git a/vms/platformvm/vm_test.go b/vms/platformvm/vm_test.go index e4101b5..af9d41c 100644 --- a/vms/platformvm/vm_test.go +++ b/vms/platformvm/vm_test.go @@ -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 { diff --git a/xputtest/avmwallet/wallet.go b/xputtest/avmwallet/wallet.go index a8fd6ba..a94b7fd 100644 --- a/xputtest/avmwallet/wallet.go +++ b/xputtest/avmwallet/wallet.go @@ -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},