From f78d7b3caf6a438c286d64f038449a9c02638da3 Mon Sep 17 00:00:00 2001 From: StephenButtolph Date: Thu, 18 Jun 2020 13:34:04 -0400 Subject: [PATCH] use transitive dependencies when possible with transaction dependencies --- vms/avm/base_tx.go | 11 +++- vms/avm/base_tx_test.go | 112 ++++++++++++++++---------------- vms/avm/create_asset_tx_test.go | 8 +-- vms/avm/export_tx_test.go | 16 ++--- vms/avm/import_tx.go | 11 +++- vms/avm/import_tx_test.go | 10 +-- vms/avm/operation_test.go | 18 ++--- vms/avm/operation_tx.go | 13 +++- vms/avm/prefixed_state_test.go | 6 +- vms/avm/service.go | 8 +-- vms/avm/service_test.go | 8 +-- vms/avm/state_test.go | 2 +- vms/avm/static_service_test.go | 12 ++-- vms/avm/tx.go | 4 +- vms/avm/tx_test.go | 12 ++-- vms/avm/unique_tx.go | 27 ++++---- vms/avm/vm.go | 8 +-- vms/avm/vm_test.go | 60 +++++++++-------- 18 files changed, 186 insertions(+), 160 deletions(-) diff --git a/vms/avm/base_tx.go b/vms/avm/base_tx.go index 0ab3fa4..cf4371f 100644 --- a/vms/avm/base_tx.go +++ b/vms/avm/base_tx.go @@ -9,8 +9,8 @@ import ( "github.com/ava-labs/gecko/database" "github.com/ava-labs/gecko/ids" "github.com/ava-labs/gecko/snow" - "github.com/ava-labs/gecko/vms/components/ava" "github.com/ava-labs/gecko/utils/codec" + "github.com/ava-labs/gecko/vms/components/ava" "github.com/ava-labs/gecko/vms/components/verify" ) @@ -46,8 +46,8 @@ func (t *BaseTx) InputUTXOs() []*ava.UTXOID { return utxos } -// AssetIDs returns the IDs of the assets this transaction depends on -func (t *BaseTx) AssetIDs() ids.Set { +// ConsumedAssetIDs returns the IDs of the assets this transaction consumes +func (t *BaseTx) ConsumedAssetIDs() ids.Set { assets := ids.Set{} for _, in := range t.Ins { assets.Add(in.AssetID()) @@ -55,6 +55,11 @@ func (t *BaseTx) AssetIDs() ids.Set { return assets } +// AssetIDs returns the IDs of the assets this transaction depends on +func (t *BaseTx) AssetIDs() ids.Set { + return t.ConsumedAssetIDs() +} + // NumCredentials returns the number of expected credentials func (t *BaseTx) NumCredentials() int { return len(t.Ins) } diff --git a/vms/avm/base_tx_test.go b/vms/avm/base_tx_test.go index 163ef5c..9f7bbdd 100644 --- a/vms/avm/base_tx_test.go +++ b/vms/avm/base_tx_test.go @@ -77,7 +77,7 @@ func TestBaseTxSerialization(t *testing.T) { tx := &Tx{UnsignedTx: &BaseTx{ NetID: networkID, BCID: chainID, - Outs: []*ava.TransferableOutput{&ava.TransferableOutput{ + Outs: []*ava.TransferableOutput{{ Asset: ava.Asset{ID: asset}, Out: &secp256k1fx.TransferOutput{ Amt: 12345, @@ -87,7 +87,7 @@ func TestBaseTxSerialization(t *testing.T) { }, }, }}, - Ins: []*ava.TransferableInput{&ava.TransferableInput{ + Ins: []*ava.TransferableInput{{ UTXOID: ava.UTXOID{ TxID: ids.NewID([32]byte{ 0xff, 0xfe, 0xfd, 0xfc, 0xfb, 0xfa, 0xf9, 0xf8, @@ -125,7 +125,7 @@ func TestBaseTxGetters(t *testing.T) { tx := &BaseTx{ NetID: networkID, BCID: chainID, - Outs: []*ava.TransferableOutput{&ava.TransferableOutput{ + Outs: []*ava.TransferableOutput{{ Asset: ava.Asset{ID: asset}, Out: &secp256k1fx.TransferOutput{ Amt: 12345, @@ -135,7 +135,7 @@ func TestBaseTxGetters(t *testing.T) { }, }, }}, - Ins: []*ava.TransferableInput{&ava.TransferableInput{ + Ins: []*ava.TransferableInput{{ UTXOID: ava.UTXOID{ TxID: ids.NewID([32]byte{ 0xff, 0xfe, 0xfd, 0xfc, 0xfb, 0xfa, 0xf9, 0xf8, @@ -162,6 +162,10 @@ func TestBaseTxGetters(t *testing.T) { t.Fatalf("Wrong number of assets returned") } else if !assets.Contains(asset) { t.Fatalf("Wrong asset returned") + } else if assets := tx.ConsumedAssetIDs(); assets.Len() != 1 { + t.Fatalf("Wrong number of consumed assets returned") + } else if !assets.Contains(asset) { + t.Fatalf("Wrong consumed asset returned") } else if utxos := tx.UTXOs(); len(utxos) != 1 { t.Fatalf("Wrong number of utxos returned") } else if utxo := utxos[0]; !utxo.TxID.Equals(txID) { @@ -179,7 +183,7 @@ func TestBaseTxSyntacticVerify(t *testing.T) { tx := &BaseTx{ NetID: networkID, BCID: chainID, - Outs: []*ava.TransferableOutput{&ava.TransferableOutput{ + Outs: []*ava.TransferableOutput{{ Asset: ava.Asset{ID: asset}, Out: &secp256k1fx.TransferOutput{ Amt: 12345, @@ -189,7 +193,7 @@ func TestBaseTxSyntacticVerify(t *testing.T) { }, }, }}, - Ins: []*ava.TransferableInput{&ava.TransferableInput{ + Ins: []*ava.TransferableInput{{ UTXOID: ava.UTXOID{ TxID: ids.NewID([32]byte{ 0xff, 0xfe, 0xfd, 0xfc, 0xfb, 0xfa, 0xf9, 0xf8, @@ -230,7 +234,7 @@ func TestBaseTxSyntacticVerifyWrongNetworkID(t *testing.T) { tx := &BaseTx{ NetID: 0, BCID: chainID, - Outs: []*ava.TransferableOutput{&ava.TransferableOutput{ + Outs: []*ava.TransferableOutput{{ Asset: ava.Asset{ID: asset}, Out: &secp256k1fx.TransferOutput{ Amt: 12345, @@ -240,7 +244,7 @@ func TestBaseTxSyntacticVerifyWrongNetworkID(t *testing.T) { }, }, }}, - Ins: []*ava.TransferableInput{&ava.TransferableInput{ + Ins: []*ava.TransferableInput{{ UTXOID: ava.UTXOID{ TxID: ids.NewID([32]byte{ 0xff, 0xfe, 0xfd, 0xfc, 0xfb, 0xfa, 0xf9, 0xf8, @@ -272,7 +276,7 @@ func TestBaseTxSyntacticVerifyWrongChainID(t *testing.T) { tx := &BaseTx{ NetID: networkID, BCID: ids.Empty, - Outs: []*ava.TransferableOutput{&ava.TransferableOutput{ + Outs: []*ava.TransferableOutput{{ Asset: ava.Asset{ID: asset}, Out: &secp256k1fx.TransferOutput{ Amt: 12345, @@ -282,7 +286,7 @@ func TestBaseTxSyntacticVerifyWrongChainID(t *testing.T) { }, }, }}, - Ins: []*ava.TransferableInput{&ava.TransferableInput{ + Ins: []*ava.TransferableInput{{ UTXOID: ava.UTXOID{ TxID: ids.NewID([32]byte{ 0xff, 0xfe, 0xfd, 0xfc, 0xfb, 0xfa, 0xf9, 0xf8, @@ -315,7 +319,7 @@ func TestBaseTxSyntacticVerifyInvalidOutput(t *testing.T) { NetID: networkID, BCID: chainID, Outs: []*ava.TransferableOutput{nil}, - Ins: []*ava.TransferableInput{&ava.TransferableInput{ + Ins: []*ava.TransferableInput{{ UTXOID: ava.UTXOID{ TxID: ids.NewID([32]byte{ 0xff, 0xfe, 0xfd, 0xfc, 0xfb, 0xfa, 0xf9, 0xf8, @@ -348,7 +352,7 @@ func TestBaseTxSyntacticVerifyUnsortedOutputs(t *testing.T) { NetID: networkID, BCID: chainID, Outs: []*ava.TransferableOutput{ - &ava.TransferableOutput{ + { Asset: ava.Asset{ID: asset}, Out: &secp256k1fx.TransferOutput{ Amt: 2, @@ -358,7 +362,7 @@ func TestBaseTxSyntacticVerifyUnsortedOutputs(t *testing.T) { }, }, }, - &ava.TransferableOutput{ + { Asset: ava.Asset{ID: asset}, Out: &secp256k1fx.TransferOutput{ Amt: 1, @@ -370,7 +374,7 @@ func TestBaseTxSyntacticVerifyUnsortedOutputs(t *testing.T) { }, }, Ins: []*ava.TransferableInput{ - &ava.TransferableInput{ + { UTXOID: ava.UTXOID{ TxID: ids.NewID([32]byte{ 0xff, 0xfe, 0xfd, 0xfc, 0xfb, 0xfa, 0xf9, 0xf8, @@ -403,7 +407,7 @@ func TestBaseTxSyntacticVerifyInvalidInput(t *testing.T) { tx := &BaseTx{ NetID: networkID, BCID: chainID, - Outs: []*ava.TransferableOutput{&ava.TransferableOutput{ + Outs: []*ava.TransferableOutput{{ Asset: ava.Asset{ID: asset}, Out: &secp256k1fx.TransferOutput{ Amt: 12345, @@ -428,7 +432,7 @@ func TestBaseTxSyntacticVerifyInputOverflow(t *testing.T) { tx := &BaseTx{ NetID: networkID, BCID: chainID, - Outs: []*ava.TransferableOutput{&ava.TransferableOutput{ + Outs: []*ava.TransferableOutput{{ Asset: ava.Asset{ID: asset}, Out: &secp256k1fx.TransferOutput{ Amt: 12345, @@ -439,7 +443,7 @@ func TestBaseTxSyntacticVerifyInputOverflow(t *testing.T) { }, }}, Ins: []*ava.TransferableInput{ - &ava.TransferableInput{ + { UTXOID: ava.UTXOID{ TxID: ids.NewID([32]byte{ 0xff, 0xfe, 0xfd, 0xfc, 0xfb, 0xfa, 0xf9, 0xf8, @@ -457,7 +461,7 @@ func TestBaseTxSyntacticVerifyInputOverflow(t *testing.T) { }, }, }, - &ava.TransferableInput{ + { UTXOID: ava.UTXOID{ TxID: ids.NewID([32]byte{ 0xff, 0xfe, 0xfd, 0xfc, 0xfb, 0xfa, 0xf9, 0xf8, @@ -491,7 +495,7 @@ func TestBaseTxSyntacticVerifyOutputOverflow(t *testing.T) { NetID: networkID, BCID: chainID, Outs: []*ava.TransferableOutput{ - &ava.TransferableOutput{ + { Asset: ava.Asset{ID: asset}, Out: &secp256k1fx.TransferOutput{ Amt: 2, @@ -501,7 +505,7 @@ func TestBaseTxSyntacticVerifyOutputOverflow(t *testing.T) { }, }, }, - &ava.TransferableOutput{ + { Asset: ava.Asset{ID: asset}, Out: &secp256k1fx.TransferOutput{ Amt: math.MaxUint64, @@ -512,7 +516,7 @@ func TestBaseTxSyntacticVerifyOutputOverflow(t *testing.T) { }, }, }, - Ins: []*ava.TransferableInput{&ava.TransferableInput{ + Ins: []*ava.TransferableInput{{ UTXOID: ava.UTXOID{ TxID: ids.NewID([32]byte{ 0xff, 0xfe, 0xfd, 0xfc, 0xfb, 0xfa, 0xf9, 0xf8, @@ -544,7 +548,7 @@ func TestBaseTxSyntacticVerifyInsufficientFunds(t *testing.T) { tx := &BaseTx{ NetID: networkID, BCID: chainID, - Outs: []*ava.TransferableOutput{&ava.TransferableOutput{ + Outs: []*ava.TransferableOutput{{ Asset: ava.Asset{ID: asset}, Out: &secp256k1fx.TransferOutput{ Amt: math.MaxUint64, @@ -554,7 +558,7 @@ func TestBaseTxSyntacticVerifyInsufficientFunds(t *testing.T) { }, }, }}, - Ins: []*ava.TransferableInput{&ava.TransferableInput{ + Ins: []*ava.TransferableInput{{ UTXOID: ava.UTXOID{ TxID: ids.NewID([32]byte{ 0xff, 0xfe, 0xfd, 0xfc, 0xfb, 0xfa, 0xf9, 0xf8, @@ -586,7 +590,7 @@ func TestBaseTxSyntacticVerifyUninitialized(t *testing.T) { tx := &BaseTx{ NetID: networkID, BCID: chainID, - Outs: []*ava.TransferableOutput{&ava.TransferableOutput{ + Outs: []*ava.TransferableOutput{{ Asset: ava.Asset{ID: asset}, Out: &secp256k1fx.TransferOutput{ Amt: 12345, @@ -596,7 +600,7 @@ func TestBaseTxSyntacticVerifyUninitialized(t *testing.T) { }, }, }}, - Ins: []*ava.TransferableInput{&ava.TransferableInput{ + Ins: []*ava.TransferableInput{{ UTXOID: ava.UTXOID{ TxID: ids.NewID([32]byte{ 0xff, 0xfe, 0xfd, 0xfc, 0xfb, 0xfa, 0xf9, 0xf8, @@ -633,7 +637,7 @@ func TestBaseTxSemanticVerify(t *testing.T) { tx := &Tx{UnsignedTx: &BaseTx{ NetID: networkID, BCID: chainID, - Ins: []*ava.TransferableInput{&ava.TransferableInput{ + Ins: []*ava.TransferableInput{{ UTXOID: ava.UTXOID{ TxID: genesisTx.ID(), OutputIndex: 1, @@ -702,7 +706,7 @@ func TestBaseTxSemanticVerifyUnknownFx(t *testing.T) { tx := &Tx{UnsignedTx: &BaseTx{ NetID: networkID, BCID: chainID, - Ins: []*ava.TransferableInput{&ava.TransferableInput{ + Ins: []*ava.TransferableInput{{ UTXOID: ava.UTXOID{ TxID: genesisTx.ID(), OutputIndex: 1, @@ -754,7 +758,7 @@ func TestBaseTxSemanticVerifyWrongAssetID(t *testing.T) { tx := &Tx{UnsignedTx: &BaseTx{ NetID: networkID, BCID: chainID, - Ins: []*ava.TransferableInput{&ava.TransferableInput{ + Ins: []*ava.TransferableInput{{ UTXOID: ava.UTXOID{ TxID: genesisTx.ID(), OutputIndex: 1, @@ -825,11 +829,11 @@ func TestBaseTxSemanticVerifyUnauthorizedFx(t *testing.T) { genesisBytes, issuer, []*common.Fx{ - &common.Fx{ + { ID: ids.Empty, Fx: &secp256k1fx.Fx{}, }, - &common.Fx{ + { ID: ids.NewID([32]byte{1}), Fx: &testFx{}, }, @@ -863,7 +867,7 @@ func TestBaseTxSemanticVerifyUnauthorizedFx(t *testing.T) { tx := &Tx{UnsignedTx: &BaseTx{ NetID: networkID, BCID: chainID, - Ins: []*ava.TransferableInput{&ava.TransferableInput{ + Ins: []*ava.TransferableInput{{ UTXOID: ava.UTXOID{ TxID: genesisTx.ID(), OutputIndex: 1, @@ -923,7 +927,7 @@ func TestBaseTxSemanticVerifyInvalidSignature(t *testing.T) { tx := &Tx{UnsignedTx: &BaseTx{ NetID: networkID, BCID: chainID, - Ins: []*ava.TransferableInput{&ava.TransferableInput{ + Ins: []*ava.TransferableInput{{ UTXOID: ava.UTXOID{ TxID: genesisTx.ID(), OutputIndex: 1, @@ -941,9 +945,7 @@ func TestBaseTxSemanticVerifyInvalidSignature(t *testing.T) { }} tx.Creds = append(tx.Creds, &secp256k1fx.Credential{ - Sigs: [][crypto.SECP256K1RSigLen]byte{ - [crypto.SECP256K1RSigLen]byte{}, - }, + Sigs: [][crypto.SECP256K1RSigLen]byte{{}}, }) b, err := vm.codec.Marshal(tx) @@ -977,7 +979,7 @@ func TestBaseTxSemanticVerifyMissingUTXO(t *testing.T) { tx := &Tx{UnsignedTx: &BaseTx{ NetID: networkID, BCID: chainID, - Ins: []*ava.TransferableInput{&ava.TransferableInput{ + Ins: []*ava.TransferableInput{{ UTXOID: ava.UTXOID{ TxID: ids.Empty, OutputIndex: 1, @@ -1044,7 +1046,7 @@ func TestBaseTxSemanticVerifyInvalidUTXO(t *testing.T) { tx := &Tx{UnsignedTx: &BaseTx{ NetID: networkID, BCID: chainID, - Ins: []*ava.TransferableInput{&ava.TransferableInput{ + Ins: []*ava.TransferableInput{{ UTXOID: ava.UTXOID{ TxID: genesisTx.ID(), OutputIndex: math.MaxUint32, @@ -1107,7 +1109,7 @@ func TestBaseTxSemanticVerifyPendingInvalidUTXO(t *testing.T) { pendingTx := &Tx{UnsignedTx: &BaseTx{ NetID: networkID, BCID: chainID, - Ins: []*ava.TransferableInput{&ava.TransferableInput{ + Ins: []*ava.TransferableInput{{ UTXOID: ava.UTXOID{ TxID: genesisTx.ID(), OutputIndex: 1, @@ -1122,7 +1124,7 @@ func TestBaseTxSemanticVerifyPendingInvalidUTXO(t *testing.T) { }, }, }}, - Outs: []*ava.TransferableOutput{&ava.TransferableOutput{ + Outs: []*ava.TransferableOutput{{ Asset: ava.Asset{ID: genesisTx.ID()}, Out: &secp256k1fx.TransferOutput{ Amt: 50000, @@ -1179,7 +1181,7 @@ func TestBaseTxSemanticVerifyPendingInvalidUTXO(t *testing.T) { tx := &Tx{UnsignedTx: &BaseTx{ NetID: networkID, BCID: chainID, - Ins: []*ava.TransferableInput{&ava.TransferableInput{ + Ins: []*ava.TransferableInput{{ UTXOID: ava.UTXOID{ TxID: txID, OutputIndex: 2, @@ -1241,7 +1243,7 @@ func TestBaseTxSemanticVerifyPendingWrongAssetID(t *testing.T) { pendingTx := &Tx{UnsignedTx: &BaseTx{ NetID: networkID, BCID: chainID, - Ins: []*ava.TransferableInput{&ava.TransferableInput{ + Ins: []*ava.TransferableInput{{ UTXOID: ava.UTXOID{ TxID: genesisTx.ID(), OutputIndex: 1, @@ -1256,7 +1258,7 @@ func TestBaseTxSemanticVerifyPendingWrongAssetID(t *testing.T) { }, }, }}, - Outs: []*ava.TransferableOutput{&ava.TransferableOutput{ + Outs: []*ava.TransferableOutput{{ Asset: ava.Asset{ID: genesisTx.ID()}, Out: &secp256k1fx.TransferOutput{ Amt: 50000, @@ -1313,7 +1315,7 @@ func TestBaseTxSemanticVerifyPendingWrongAssetID(t *testing.T) { tx := &Tx{UnsignedTx: &BaseTx{ NetID: networkID, BCID: chainID, - Ins: []*ava.TransferableInput{&ava.TransferableInput{ + Ins: []*ava.TransferableInput{{ UTXOID: ava.UTXOID{ TxID: txID, OutputIndex: 0, @@ -1381,11 +1383,11 @@ func TestBaseTxSemanticVerifyPendingUnauthorizedFx(t *testing.T) { genesisBytes, issuer, []*common.Fx{ - &common.Fx{ + { ID: ids.NewID([32]byte{1}), Fx: &secp256k1fx.Fx{}, }, - &common.Fx{ + { ID: ids.Empty, Fx: &testFx{}, }, @@ -1419,7 +1421,7 @@ func TestBaseTxSemanticVerifyPendingUnauthorizedFx(t *testing.T) { pendingTx := &Tx{UnsignedTx: &BaseTx{ NetID: networkID, BCID: chainID, - Ins: []*ava.TransferableInput{&ava.TransferableInput{ + Ins: []*ava.TransferableInput{{ UTXOID: ava.UTXOID{ TxID: genesisTx.ID(), OutputIndex: 1, @@ -1434,7 +1436,7 @@ func TestBaseTxSemanticVerifyPendingUnauthorizedFx(t *testing.T) { }, }, }}, - Outs: []*ava.TransferableOutput{&ava.TransferableOutput{ + Outs: []*ava.TransferableOutput{{ Asset: ava.Asset{ID: genesisTx.ID()}, Out: &secp256k1fx.TransferOutput{ Amt: 50000, @@ -1491,7 +1493,7 @@ func TestBaseTxSemanticVerifyPendingUnauthorizedFx(t *testing.T) { tx := &Tx{UnsignedTx: &BaseTx{ NetID: networkID, BCID: chainID, - Ins: []*ava.TransferableInput{&ava.TransferableInput{ + Ins: []*ava.TransferableInput{{ UTXOID: ava.UTXOID{ TxID: txID, OutputIndex: 0, @@ -1543,11 +1545,11 @@ func TestBaseTxSemanticVerifyPendingInvalidSignature(t *testing.T) { genesisBytes, issuer, []*common.Fx{ - &common.Fx{ + { ID: ids.NewID([32]byte{1}), Fx: &secp256k1fx.Fx{}, }, - &common.Fx{ + { ID: ids.Empty, Fx: &testFx{}, }, @@ -1581,7 +1583,7 @@ func TestBaseTxSemanticVerifyPendingInvalidSignature(t *testing.T) { pendingTx := &Tx{UnsignedTx: &BaseTx{ NetID: networkID, BCID: chainID, - Ins: []*ava.TransferableInput{&ava.TransferableInput{ + Ins: []*ava.TransferableInput{{ UTXOID: ava.UTXOID{ TxID: genesisTx.ID(), OutputIndex: 1, @@ -1596,7 +1598,7 @@ func TestBaseTxSemanticVerifyPendingInvalidSignature(t *testing.T) { }, }, }}, - Outs: []*ava.TransferableOutput{&ava.TransferableOutput{ + Outs: []*ava.TransferableOutput{{ Asset: ava.Asset{ID: genesisTx.ID()}, Out: &secp256k1fx.TransferOutput{ Amt: 50000, @@ -1653,7 +1655,7 @@ func TestBaseTxSemanticVerifyPendingInvalidSignature(t *testing.T) { tx := &Tx{UnsignedTx: &BaseTx{ NetID: networkID, BCID: chainID, - Ins: []*ava.TransferableInput{&ava.TransferableInput{ + Ins: []*ava.TransferableInput{{ UTXOID: ava.UTXOID{ TxID: txID, OutputIndex: 0, @@ -1671,9 +1673,7 @@ func TestBaseTxSemanticVerifyPendingInvalidSignature(t *testing.T) { }} tx.Creds = append(tx.Creds, &secp256k1fx.Credential{ - Sigs: [][crypto.SECP256K1RSigLen]byte{ - [crypto.SECP256K1RSigLen]byte{}, - }, + Sigs: [][crypto.SECP256K1RSigLen]byte{{}}, }) b, err = vm.codec.Marshal(tx) diff --git a/vms/avm/create_asset_tx_test.go b/vms/avm/create_asset_tx_test.go index 324f403..6f1f686 100644 --- a/vms/avm/create_asset_tx_test.go +++ b/vms/avm/create_asset_tx_test.go @@ -8,8 +8,8 @@ import ( "testing" "github.com/ava-labs/gecko/ids" - "github.com/ava-labs/gecko/vms/components/ava" "github.com/ava-labs/gecko/utils/codec" + "github.com/ava-labs/gecko/vms/components/ava" "github.com/ava-labs/gecko/vms/components/verify" "github.com/ava-labs/gecko/vms/secp256k1fx" ) @@ -93,7 +93,7 @@ func TestCreateAssetTxSerialization(t *testing.T) { 0xbb, 0xbb, 0xbb, 0xbb, 0xaa, 0xaa, 0xaa, 0xaa, 0x99, 0x99, 0x99, 0x99, 0x88, 0x88, 0x88, 0x88, }), - Outs: []*ava.TransferableOutput{&ava.TransferableOutput{ + Outs: []*ava.TransferableOutput{{ Asset: ava.Asset{ ID: ids.NewID([32]byte{ 0x00, 0x01, 0x02, 0x03, 0x04, 0x05, 0x06, 0x07, @@ -122,7 +122,7 @@ func TestCreateAssetTxSerialization(t *testing.T) { }, }, }}, - Ins: []*ava.TransferableInput{&ava.TransferableInput{ + Ins: []*ava.TransferableInput{{ UTXOID: ava.UTXOID{ TxID: ids.NewID([32]byte{ 0xf1, 0xe1, 0xd1, 0xc1, 0xb1, 0xa1, 0x91, 0x81, @@ -152,7 +152,7 @@ func TestCreateAssetTxSerialization(t *testing.T) { Symbol: "VIX", Denomination: 2, States: []*InitialState{ - &InitialState{ + { FxID: 0, Outs: []verify.Verifiable{ &secp256k1fx.TransferOutput{ diff --git a/vms/avm/export_tx_test.go b/vms/avm/export_tx_test.go index fdef399..75b359f 100644 --- a/vms/avm/export_tx_test.go +++ b/vms/avm/export_tx_test.go @@ -12,11 +12,11 @@ import ( "github.com/ava-labs/gecko/ids" "github.com/ava-labs/gecko/snow" "github.com/ava-labs/gecko/snow/engine/common" + "github.com/ava-labs/gecko/utils/codec" "github.com/ava-labs/gecko/utils/crypto" "github.com/ava-labs/gecko/utils/hashing" "github.com/ava-labs/gecko/utils/logging" "github.com/ava-labs/gecko/vms/components/ava" - "github.com/ava-labs/gecko/utils/codec" "github.com/ava-labs/gecko/vms/secp256k1fx" ) @@ -68,7 +68,7 @@ func TestExportTxSerialization(t *testing.T) { 0xbb, 0xbb, 0xbb, 0xbb, 0xaa, 0xaa, 0xaa, 0xaa, 0x99, 0x99, 0x99, 0x99, 0x88, 0x88, 0x88, 0x88, }), - Ins: []*ava.TransferableInput{&ava.TransferableInput{ + Ins: []*ava.TransferableInput{{ UTXOID: ava.UTXOID{TxID: ids.NewID([32]byte{ 0x0f, 0x2f, 0x4f, 0x6f, 0x8e, 0xae, 0xce, 0xee, 0x0d, 0x2d, 0x4d, 0x6d, 0x8c, 0xac, 0xcc, 0xec, @@ -141,7 +141,7 @@ func TestIssueExportTx(t *testing.T) { memdb.New(), genesisBytes, issuer, - []*common.Fx{&common.Fx{ + []*common.Fx{{ ID: ids.Empty, Fx: &secp256k1fx.Fx{}, }}, @@ -167,7 +167,7 @@ func TestIssueExportTx(t *testing.T) { BaseTx: BaseTx{ NetID: networkID, BCID: chainID, - Ins: []*ava.TransferableInput{&ava.TransferableInput{ + Ins: []*ava.TransferableInput{{ UTXOID: ava.UTXOID{ TxID: avaID, OutputIndex: 1, @@ -179,7 +179,7 @@ func TestIssueExportTx(t *testing.T) { }, }}, }, - Outs: []*ava.TransferableOutput{&ava.TransferableOutput{ + Outs: []*ava.TransferableOutput{{ Asset: ava.Asset{ID: avaID}, Out: &secp256k1fx.TransferOutput{ Amt: 50000, @@ -297,7 +297,7 @@ func TestClearForceAcceptedExportTx(t *testing.T) { memdb.New(), genesisBytes, issuer, - []*common.Fx{&common.Fx{ + []*common.Fx{{ ID: ids.Empty, Fx: &secp256k1fx.Fx{}, }}, @@ -323,7 +323,7 @@ func TestClearForceAcceptedExportTx(t *testing.T) { BaseTx: BaseTx{ NetID: networkID, BCID: chainID, - Ins: []*ava.TransferableInput{&ava.TransferableInput{ + Ins: []*ava.TransferableInput{{ UTXOID: ava.UTXOID{ TxID: avaID, OutputIndex: 1, @@ -335,7 +335,7 @@ func TestClearForceAcceptedExportTx(t *testing.T) { }, }}, }, - Outs: []*ava.TransferableOutput{&ava.TransferableOutput{ + Outs: []*ava.TransferableOutput{{ Asset: ava.Asset{ID: avaID}, Out: &secp256k1fx.TransferOutput{ Amt: 50000, diff --git a/vms/avm/import_tx.go b/vms/avm/import_tx.go index 1729221..caf0f93 100644 --- a/vms/avm/import_tx.go +++ b/vms/avm/import_tx.go @@ -11,8 +11,8 @@ import ( "github.com/ava-labs/gecko/database/versiondb" "github.com/ava-labs/gecko/ids" "github.com/ava-labs/gecko/snow" - "github.com/ava-labs/gecko/vms/components/ava" "github.com/ava-labs/gecko/utils/codec" + "github.com/ava-labs/gecko/vms/components/ava" "github.com/ava-labs/gecko/vms/components/verify" ) @@ -33,6 +33,15 @@ func (t *ImportTx) InputUTXOs() []*ava.UTXOID { return utxos } +// ConsumedAssetIDs returns the IDs of the assets this transaction consumes +func (t *ImportTx) ConsumedAssetIDs() ids.Set { + assets := t.BaseTx.AssetIDs() + for _, in := range t.Ins { + assets.Add(in.AssetID()) + } + return assets +} + // AssetIDs returns the IDs of the assets this transaction depends on func (t *ImportTx) AssetIDs() ids.Set { assets := t.BaseTx.AssetIDs() diff --git a/vms/avm/import_tx_test.go b/vms/avm/import_tx_test.go index 696e841..e510aff 100644 --- a/vms/avm/import_tx_test.go +++ b/vms/avm/import_tx_test.go @@ -68,7 +68,7 @@ func TestImportTxSerialization(t *testing.T) { 0x99, 0x99, 0x99, 0x99, 0x88, 0x88, 0x88, 0x88, }), }, - Ins: []*ava.TransferableInput{&ava.TransferableInput{ + Ins: []*ava.TransferableInput{{ UTXOID: ava.UTXOID{TxID: ids.NewID([32]byte{ 0x0f, 0x2f, 0x4f, 0x6f, 0x8e, 0xae, 0xce, 0xee, 0x0d, 0x2d, 0x4d, 0x6d, 0x8c, 0xac, 0xcc, 0xec, @@ -130,7 +130,7 @@ func TestIssueImportTx(t *testing.T) { memdb.New(), genesisBytes, issuer, - []*common.Fx{&common.Fx{ + []*common.Fx{{ ID: ids.Empty, Fx: &secp256k1fx.Fx{}, }}, @@ -166,7 +166,7 @@ func TestIssueImportTx(t *testing.T) { NetID: networkID, BCID: chainID, }, - Ins: []*ava.TransferableInput{&ava.TransferableInput{ + Ins: []*ava.TransferableInput{{ UTXOID: utxoID, Asset: ava.Asset{ID: avaID}, In: &secp256k1fx.TransferInput{ @@ -288,7 +288,7 @@ func TestForceAcceptImportTx(t *testing.T) { memdb.New(), genesisBytes, issuer, - []*common.Fx{&common.Fx{ + []*common.Fx{{ ID: ids.Empty, Fx: &secp256k1fx.Fx{}, }}, @@ -326,7 +326,7 @@ func TestForceAcceptImportTx(t *testing.T) { NetID: networkID, BCID: chainID, }, - Ins: []*ava.TransferableInput{&ava.TransferableInput{ + Ins: []*ava.TransferableInput{{ UTXOID: utxoID, Asset: ava.Asset{ID: genesisTx.ID()}, In: &secp256k1fx.TransferInput{ diff --git a/vms/avm/operation_test.go b/vms/avm/operation_test.go index 8b85901..b3aed54 100644 --- a/vms/avm/operation_test.go +++ b/vms/avm/operation_test.go @@ -7,8 +7,8 @@ import ( "testing" "github.com/ava-labs/gecko/ids" - "github.com/ava-labs/gecko/vms/components/ava" "github.com/ava-labs/gecko/utils/codec" + "github.com/ava-labs/gecko/vms/components/ava" "github.com/ava-labs/gecko/vms/components/verify" ) @@ -43,11 +43,11 @@ func TestOperationVerifyUTXOIDsNotSorted(t *testing.T) { op := &Operation{ Asset: ava.Asset{ID: ids.Empty}, UTXOIDs: []*ava.UTXOID{ - &ava.UTXOID{ + { TxID: ids.Empty, OutputIndex: 1, }, - &ava.UTXOID{ + { TxID: ids.Empty, OutputIndex: 0, }, @@ -64,7 +64,7 @@ func TestOperationVerify(t *testing.T) { op := &Operation{ Asset: ava.Asset{ID: ids.Empty}, UTXOIDs: []*ava.UTXOID{ - &ava.UTXOID{ + { TxID: ids.Empty, OutputIndex: 1, }, @@ -81,20 +81,20 @@ func TestOperationSorting(t *testing.T) { c.RegisterType(&testOperable{}) ops := []*Operation{ - &Operation{ + { Asset: ava.Asset{ID: ids.Empty}, UTXOIDs: []*ava.UTXOID{ - &ava.UTXOID{ + { TxID: ids.Empty, OutputIndex: 1, }, }, Op: &testOperable{}, }, - &Operation{ + { Asset: ava.Asset{ID: ids.Empty}, UTXOIDs: []*ava.UTXOID{ - &ava.UTXOID{ + { TxID: ids.Empty, OutputIndex: 0, }, @@ -112,7 +112,7 @@ func TestOperationSorting(t *testing.T) { ops = append(ops, &Operation{ Asset: ava.Asset{ID: ids.Empty}, UTXOIDs: []*ava.UTXOID{ - &ava.UTXOID{ + { TxID: ids.Empty, OutputIndex: 1, }, diff --git a/vms/avm/operation_tx.go b/vms/avm/operation_tx.go index ec419c7..c45f0be 100644 --- a/vms/avm/operation_tx.go +++ b/vms/avm/operation_tx.go @@ -8,8 +8,8 @@ import ( "github.com/ava-labs/gecko/ids" "github.com/ava-labs/gecko/snow" - "github.com/ava-labs/gecko/vms/components/ava" "github.com/ava-labs/gecko/utils/codec" + "github.com/ava-labs/gecko/vms/components/ava" "github.com/ava-labs/gecko/vms/components/verify" ) @@ -39,6 +39,17 @@ func (t *OperationTx) InputUTXOs() []*ava.UTXOID { return utxos } +// ConsumedAssetIDs returns the IDs of the assets this transaction consumes +func (t *OperationTx) ConsumedAssetIDs() ids.Set { + assets := t.BaseTx.AssetIDs() + for _, op := range t.Ops { + if len(op.UTXOIDs) > 0 { + assets.Add(op.AssetID()) + } + } + return assets +} + // AssetIDs returns the IDs of the assets this transaction depends on func (t *OperationTx) AssetIDs() ids.Set { assets := t.BaseTx.AssetIDs() diff --git a/vms/avm/prefixed_state_test.go b/vms/avm/prefixed_state_test.go index 74c4b53..e325142 100644 --- a/vms/avm/prefixed_state_test.go +++ b/vms/avm/prefixed_state_test.go @@ -38,7 +38,7 @@ func TestPrefixedSetsAndGets(t *testing.T) { tx := &Tx{UnsignedTx: &BaseTx{ NetID: networkID, BCID: chainID, - Ins: []*ava.TransferableInput{&ava.TransferableInput{ + Ins: []*ava.TransferableInput{{ UTXOID: ava.UTXOID{ TxID: ids.Empty, OutputIndex: 0, @@ -160,9 +160,7 @@ func TestPrefixedFundingAddresses(t *testing.T) { }, Asset: ava.Asset{ID: ids.Empty}, Out: &ava.TestAddressable{ - Addrs: [][]byte{ - []byte{0}, - }, + Addrs: [][]byte{{0}}, }, } diff --git a/vms/avm/service.go b/vms/avm/service.go index 9b21414..3d33118 100644 --- a/vms/avm/service.go +++ b/vms/avm/service.go @@ -792,7 +792,7 @@ func (service *Service) Send(r *http.Request, args *SendArgs, reply *SendReply) ava.SortTransferableInputsWithSigners(ins, keys) - outs := []*ava.TransferableOutput{&ava.TransferableOutput{ + outs := []*ava.TransferableOutput{{ Asset: ava.Asset{ID: assetID}, Out: &secp256k1fx.TransferOutput{ Amt: uint64(args.Amount), @@ -946,7 +946,7 @@ func (service *Service) CreateMintTx(r *http.Request, args *CreateMintTxArgs, re BCID: service.vm.ctx.ChainID, }, Ops: []*Operation{ - &Operation{ + { Asset: ava.Asset{ID: assetID}, UTXOIDs: []*ava.UTXOID{ &utxo.UTXOID, @@ -1197,7 +1197,7 @@ func (service *Service) ImportAVA(_ *http.Request, args *ImportAVAArgs, reply *I ava.SortTransferableInputsWithSigners(ins, keys) - outs := []*ava.TransferableOutput{&ava.TransferableOutput{ + outs := []*ava.TransferableOutput{{ Asset: ava.Asset{ID: service.vm.ava}, Out: &secp256k1fx.TransferOutput{ Amt: amount, @@ -1352,7 +1352,7 @@ func (service *Service) ExportAVA(_ *http.Request, args *ExportAVAArgs, reply *E ava.SortTransferableInputsWithSigners(ins, keys) - exportOuts := []*ava.TransferableOutput{&ava.TransferableOutput{ + exportOuts := []*ava.TransferableOutput{{ Asset: ava.Asset{ID: service.vm.ava}, Out: &secp256k1fx.TransferOutput{ Amt: uint64(args.Amount), diff --git a/vms/avm/service_test.go b/vms/avm/service_test.go index 6e1d387..b8a7d56 100644 --- a/vms/avm/service_test.go +++ b/vms/avm/service_test.go @@ -300,7 +300,7 @@ func TestCreateFixedCapAsset(t *testing.T) { Name: "test asset", Symbol: "test", Denomination: 1, - InitialHolders: []*Holder{&Holder{ + InitialHolders: []*Holder{{ Amount: 123456789, Address: vm.Format(keys[0].PublicKey().Address().Bytes()), }}, @@ -326,7 +326,7 @@ func TestCreateVariableCapAsset(t *testing.T) { Name: "test asset", Symbol: "test", MinterSets: []Owners{ - Owners{ + { Threshold: 1, Minters: []string{ vm.Format(keys[0].PublicKey().Address().Bytes()), @@ -367,7 +367,7 @@ func TestImportAvmKey(t *testing.T) { factory := crypto.FactorySECP256K1R{} skIntf, err := factory.NewPrivateKey() if err != nil { - t.Fatalf("problem generating private key: %w", err) + t.Fatalf("problem generating private key: %s", err) } sk := skIntf.(*crypto.PrivateKeySECP256K1R) @@ -406,7 +406,7 @@ func TestImportAvmKeyNoDuplicates(t *testing.T) { factory := crypto.FactorySECP256K1R{} skIntf, err := factory.NewPrivateKey() if err != nil { - t.Fatalf("problem generating private key: %w", err) + t.Fatalf("problem generating private key: %s", err) } sk := skIntf.(*crypto.PrivateKeySECP256K1R) diff --git a/vms/avm/state_test.go b/vms/avm/state_test.go index 1feabab..3617ddc 100644 --- a/vms/avm/state_test.go +++ b/vms/avm/state_test.go @@ -288,7 +288,7 @@ func TestStateTXs(t *testing.T) { tx := &Tx{UnsignedTx: &BaseTx{ NetID: networkID, BCID: chainID, - Ins: []*ava.TransferableInput{&ava.TransferableInput{ + Ins: []*ava.TransferableInput{{ UTXOID: ava.UTXOID{ TxID: ids.Empty, OutputIndex: 0, diff --git a/vms/avm/static_service_test.go b/vms/avm/static_service_test.go index fd9acc0..34e8803 100644 --- a/vms/avm/static_service_test.go +++ b/vms/avm/static_service_test.go @@ -11,12 +11,12 @@ func TestBuildGenesis(t *testing.T) { ss := StaticService{} args := BuildGenesisArgs{GenesisData: map[string]AssetDefinition{ - "asset1": AssetDefinition{ + "asset1": { Name: "myFixedCapAsset", Symbol: "MFCA", Denomination: 8, InitialState: map[string][]interface{}{ - "fixedCap": []interface{}{ + "fixedCap": { Holder{ Amount: 100000, Address: "A9bTQjfYGBFK3JPRJqF2eh3JYL7cHocvy", @@ -36,11 +36,11 @@ func TestBuildGenesis(t *testing.T) { }, }, }, - "asset2": AssetDefinition{ + "asset2": { Name: "myVarCapAsset", Symbol: "MVCA", InitialState: map[string][]interface{}{ - "variableCap": []interface{}{ + "variableCap": { Owners{ Threshold: 1, Minters: []string{ @@ -58,10 +58,10 @@ func TestBuildGenesis(t *testing.T) { }, }, }, - "asset3": AssetDefinition{ + "asset3": { Name: "myOtherVarCapAsset", InitialState: map[string][]interface{}{ - "variableCap": []interface{}{ + "variableCap": { Owners{ Threshold: 1, Minters: []string{ diff --git a/vms/avm/tx.go b/vms/avm/tx.go index f1d0b71..6c32153 100644 --- a/vms/avm/tx.go +++ b/vms/avm/tx.go @@ -9,8 +9,8 @@ import ( "github.com/ava-labs/gecko/database" "github.com/ava-labs/gecko/ids" "github.com/ava-labs/gecko/snow" - "github.com/ava-labs/gecko/vms/components/ava" "github.com/ava-labs/gecko/utils/codec" + "github.com/ava-labs/gecko/vms/components/ava" "github.com/ava-labs/gecko/vms/components/verify" ) @@ -24,7 +24,9 @@ type UnsignedTx interface { ID() ids.ID Bytes() []byte + ConsumedAssetIDs() ids.Set AssetIDs() ids.Set + NumCredentials() int InputUTXOs() []*ava.UTXOID UTXOs() []*ava.UTXO diff --git a/vms/avm/tx_test.go b/vms/avm/tx_test.go index 53e20de..f088d9e 100644 --- a/vms/avm/tx_test.go +++ b/vms/avm/tx_test.go @@ -7,9 +7,9 @@ import ( "testing" "github.com/ava-labs/gecko/ids" + "github.com/ava-labs/gecko/utils/codec" "github.com/ava-labs/gecko/utils/units" "github.com/ava-labs/gecko/vms/components/ava" - "github.com/ava-labs/gecko/utils/codec" "github.com/ava-labs/gecko/vms/components/verify" "github.com/ava-labs/gecko/vms/secp256k1fx" ) @@ -56,7 +56,7 @@ func TestTxInvalidCredential(t *testing.T) { UnsignedTx: &BaseTx{ NetID: networkID, BCID: chainID, - Ins: []*ava.TransferableInput{&ava.TransferableInput{ + Ins: []*ava.TransferableInput{{ UTXOID: ava.UTXOID{ TxID: ids.Empty, OutputIndex: 0, @@ -95,7 +95,7 @@ func TestTxInvalidUnsignedTx(t *testing.T) { NetID: networkID, BCID: chainID, Ins: []*ava.TransferableInput{ - &ava.TransferableInput{ + { UTXOID: ava.UTXOID{ TxID: ids.Empty, OutputIndex: 0, @@ -110,7 +110,7 @@ func TestTxInvalidUnsignedTx(t *testing.T) { }, }, }, - &ava.TransferableInput{ + { UTXOID: ava.UTXOID{ TxID: ids.Empty, OutputIndex: 0, @@ -153,7 +153,7 @@ func TestTxInvalidNumberOfCredentials(t *testing.T) { NetID: networkID, BCID: chainID, Ins: []*ava.TransferableInput{ - &ava.TransferableInput{ + { UTXOID: ava.UTXOID{TxID: ids.Empty, OutputIndex: 0}, Asset: ava.Asset{ID: asset}, In: &secp256k1fx.TransferInput{ @@ -165,7 +165,7 @@ func TestTxInvalidNumberOfCredentials(t *testing.T) { }, }, }, - &ava.TransferableInput{ + { UTXOID: ava.UTXOID{TxID: ids.Empty, OutputIndex: 1}, Asset: ava.Asset{ID: asset}, In: &secp256k1fx.TransferInput{ diff --git a/vms/avm/unique_tx.go b/vms/avm/unique_tx.go index 8d3feb2..892b513 100644 --- a/vms/avm/unique_tx.go +++ b/vms/avm/unique_tx.go @@ -206,22 +206,25 @@ func (tx *UniqueTx) Dependencies() []snowstorm.Tx { continue } txID, _ := in.InputSource() - if !txIDs.Contains(txID) { - txIDs.Add(txID) - tx.deps = append(tx.deps, &UniqueTx{ - vm: tx.vm, - txID: txID, - }) + if txIDs.Contains(txID) { + continue } + txIDs.Add(txID) + tx.deps = append(tx.deps, &UniqueTx{ + vm: tx.vm, + txID: txID, + }) } + consumedIDs := tx.Tx.ConsumedAssetIDs() for _, assetID := range tx.Tx.AssetIDs().List() { - if !txIDs.Contains(assetID) { - txIDs.Add(assetID) - tx.deps = append(tx.deps, &UniqueTx{ - vm: tx.vm, - txID: assetID, - }) + if consumedIDs.Contains(assetID) || txIDs.Contains(assetID) { + continue } + txIDs.Add(assetID) + tx.deps = append(tx.deps, &UniqueTx{ + vm: tx.vm, + txID: assetID, + }) } return tx.deps } diff --git a/vms/avm/vm.go b/vms/avm/vm.go index 4c0820d..d89d625 100644 --- a/vms/avm/vm.go +++ b/vms/avm/vm.go @@ -20,12 +20,12 @@ import ( "github.com/ava-labs/gecko/snow/choices" "github.com/ava-labs/gecko/snow/consensus/snowstorm" "github.com/ava-labs/gecko/snow/engine/common" + "github.com/ava-labs/gecko/utils/codec" "github.com/ava-labs/gecko/utils/formatting" "github.com/ava-labs/gecko/utils/logging" "github.com/ava-labs/gecko/utils/timer" "github.com/ava-labs/gecko/utils/wrappers" "github.com/ava-labs/gecko/vms/components/ava" - "github.com/ava-labs/gecko/utils/codec" cjson "github.com/ava-labs/gecko/utils/json" ) @@ -248,8 +248,8 @@ func (vm *VM) CreateHandlers() map[string]*common.HTTPHandler { rpcServer.RegisterService(&Service{vm: vm}, "avm") // name this service "avm" return map[string]*common.HTTPHandler{ - "": &common.HTTPHandler{Handler: rpcServer}, - "/pubsub": &common.HTTPHandler{LockOptions: common.NoLock, Handler: vm.pubsub}, + "": {Handler: rpcServer}, + "/pubsub": {LockOptions: common.NoLock, Handler: vm.pubsub}, } } @@ -261,7 +261,7 @@ func (vm *VM) CreateStaticHandlers() map[string]*common.HTTPHandler { newServer.RegisterCodec(codec, "application/json;charset=UTF-8") newServer.RegisterService(&StaticService{}, "avm") // name this service "avm" return map[string]*common.HTTPHandler{ - "": &common.HTTPHandler{LockOptions: common.WriteLock, Handler: newServer}, + "": {LockOptions: common.WriteLock, Handler: newServer}, } } diff --git a/vms/avm/vm_test.go b/vms/avm/vm_test.go index d3a2d73..81a08f8 100644 --- a/vms/avm/vm_test.go +++ b/vms/avm/vm_test.go @@ -84,11 +84,11 @@ func BuildGenesisTest(t *testing.T) []byte { addr2 := keys[2].PublicKey().Address() args := BuildGenesisArgs{GenesisData: map[string]AssetDefinition{ - "asset1": AssetDefinition{ + "asset1": { Name: "myFixedCapAsset", Symbol: "MFCA", InitialState: map[string][]interface{}{ - "fixedCap": []interface{}{ + "fixedCap": { Holder{ Amount: 100000, Address: addr0.String(), @@ -108,11 +108,11 @@ func BuildGenesisTest(t *testing.T) []byte { }, }, }, - "asset2": AssetDefinition{ + "asset2": { Name: "myVarCapAsset", Symbol: "MVCA", InitialState: map[string][]interface{}{ - "variableCap": []interface{}{ + "variableCap": { Owners{ Threshold: 1, Minters: []string{ @@ -131,10 +131,10 @@ func BuildGenesisTest(t *testing.T) []byte { }, }, }, - "asset3": AssetDefinition{ + "asset3": { Name: "myOtherVarCapAsset", InitialState: map[string][]interface{}{ - "variableCap": []interface{}{ + "variableCap": { Owners{ Threshold: 1, Minters: []string{ @@ -168,7 +168,7 @@ func GenesisVM(t *testing.T) ([]byte, chan common.Message, *VM) { memdb.New(), genesisBytes, issuer, - []*common.Fx{&common.Fx{ + []*common.Fx{{ ID: ids.Empty, Fx: &secp256k1fx.Fx{}, }}, @@ -195,7 +195,7 @@ func NewTx(t *testing.T, genesisBytes []byte, vm *VM) *Tx { newTx := &Tx{UnsignedTx: &BaseTx{ NetID: networkID, BCID: chainID, - Ins: []*ava.TransferableInput{&ava.TransferableInput{ + Ins: []*ava.TransferableInput{{ UTXOID: ava.UTXOID{ TxID: genesisTx.ID(), OutputIndex: 1, @@ -357,7 +357,7 @@ func TestTxSerialization(t *testing.T) { Symbol: "symb", Denomination: 0, States: []*InitialState{ - &InitialState{ + { FxID: 0, Outs: []verify.Verifiable{ &secp256k1fx.MintOutput{ @@ -456,7 +456,7 @@ func TestFxInitializationFailure(t *testing.T) { /*db=*/ memdb.New(), /*genesisState=*/ genesisBytes, /*engineMessenger=*/ make(chan common.Message, 1), - /*fxs=*/ []*common.Fx{&common.Fx{ + /*fxs=*/ []*common.Fx{{ ID: ids.Empty, Fx: &testFx{initialize: errUnknownFx}, }}, @@ -537,7 +537,7 @@ func TestIssueDependentTx(t *testing.T) { firstTx := &Tx{UnsignedTx: &BaseTx{ NetID: networkID, BCID: chainID, - Ins: []*ava.TransferableInput{&ava.TransferableInput{ + Ins: []*ava.TransferableInput{{ UTXOID: ava.UTXOID{ TxID: genesisTx.ID(), OutputIndex: 1, @@ -552,7 +552,7 @@ func TestIssueDependentTx(t *testing.T) { }, }, }}, - Outs: []*ava.TransferableOutput{&ava.TransferableOutput{ + Outs: []*ava.TransferableOutput{{ Asset: ava.Asset{ID: genesisTx.ID()}, Out: &secp256k1fx.TransferOutput{ Amt: 50000, @@ -596,7 +596,7 @@ func TestIssueDependentTx(t *testing.T) { secondTx := &Tx{UnsignedTx: &BaseTx{ NetID: networkID, BCID: chainID, - Ins: []*ava.TransferableInput{&ava.TransferableInput{ + Ins: []*ava.TransferableInput{{ UTXOID: ava.UTXOID{ TxID: firstTx.ID(), OutputIndex: 0, @@ -671,11 +671,11 @@ func TestIssueNFT(t *testing.T) { genesisBytes, issuer, []*common.Fx{ - &common.Fx{ + { ID: ids.Empty.Prefix(0), Fx: &secp256k1fx.Fx{}, }, - &common.Fx{ + { ID: ids.Empty.Prefix(1), Fx: &nftfx.Fx{}, }, @@ -704,7 +704,7 @@ func TestIssueNFT(t *testing.T) { Name: "Team Rocket", Symbol: "TR", Denomination: 0, - States: []*InitialState{&InitialState{ + States: []*InitialState{{ FxID: 1, Outs: []verify.Verifiable{ &nftfx.MintOutput{ @@ -740,9 +740,9 @@ func TestIssueNFT(t *testing.T) { NetID: networkID, BCID: chainID, }, - Ops: []*Operation{&Operation{ + Ops: []*Operation{{ Asset: ava.Asset{ID: createAssetTx.ID()}, - UTXOIDs: []*ava.UTXOID{&ava.UTXOID{ + UTXOIDs: []*ava.UTXOID{{ TxID: createAssetTx.ID(), OutputIndex: 0, }}, @@ -752,9 +752,7 @@ func TestIssueNFT(t *testing.T) { }, GroupID: 1, Payload: []byte{'h', 'e', 'l', 'l', 'o'}, - Outputs: []*secp256k1fx.OutputOwners{ - &secp256k1fx.OutputOwners{}, - }, + Outputs: []*secp256k1fx.OutputOwners{{}}, }, }}, }} @@ -793,9 +791,9 @@ func TestIssueNFT(t *testing.T) { NetID: networkID, BCID: chainID, }, - Ops: []*Operation{&Operation{ + Ops: []*Operation{{ Asset: ava.Asset{ID: createAssetTx.ID()}, - UTXOIDs: []*ava.UTXOID{&ava.UTXOID{ + UTXOIDs: []*ava.UTXOID{{ TxID: mintNFTTx.ID(), OutputIndex: 0, }}, @@ -840,15 +838,15 @@ func TestIssueProperty(t *testing.T) { genesisBytes, issuer, []*common.Fx{ - &common.Fx{ + { ID: ids.Empty.Prefix(0), Fx: &secp256k1fx.Fx{}, }, - &common.Fx{ + { ID: ids.Empty.Prefix(1), Fx: &nftfx.Fx{}, }, - &common.Fx{ + { ID: ids.Empty.Prefix(2), Fx: &propertyfx.Fx{}, }, @@ -877,7 +875,7 @@ func TestIssueProperty(t *testing.T) { Name: "Team Rocket", Symbol: "TR", Denomination: 0, - States: []*InitialState{&InitialState{ + States: []*InitialState{{ FxID: 2, Outs: []verify.Verifiable{ &propertyfx.MintOutput{ @@ -905,9 +903,9 @@ func TestIssueProperty(t *testing.T) { NetID: networkID, BCID: chainID, }, - Ops: []*Operation{&Operation{ + Ops: []*Operation{{ Asset: ava.Asset{ID: createAssetTx.ID()}, - UTXOIDs: []*ava.UTXOID{&ava.UTXOID{ + UTXOIDs: []*ava.UTXOID{{ TxID: createAssetTx.ID(), OutputIndex: 0, }}, @@ -960,9 +958,9 @@ func TestIssueProperty(t *testing.T) { NetID: networkID, BCID: chainID, }, - Ops: []*Operation{&Operation{ + Ops: []*Operation{{ Asset: ava.Asset{ID: createAssetTx.ID()}, - UTXOIDs: []*ava.UTXOID{&ava.UTXOID{ + UTXOIDs: []*ava.UTXOID{{ TxID: mintPropertyTx.ID(), OutputIndex: 1, }},