diff --git a/vms/platformvm/txs/executor/advance_time_test.go b/vms/platformvm/txs/executor/advance_time_test.go index c10c76ec7ba..aadf8413661 100644 --- a/vms/platformvm/txs/executor/advance_time_test.go +++ b/vms/platformvm/txs/executor/advance_time_test.go @@ -4,7 +4,6 @@ package executor import ( - "context" "fmt" "testing" "time" @@ -23,8 +22,6 @@ import ( "github.com/ava-labs/avalanchego/vms/platformvm/status" "github.com/ava-labs/avalanchego/vms/platformvm/txs" "github.com/ava-labs/avalanchego/vms/secp256k1fx" - - walletsigner "github.com/ava-labs/avalanchego/wallet/chain/p/signer" ) func newAdvanceTimeTx(t testing.TB, timestamp time.Time) (*txs.Tx, error) { @@ -50,14 +47,14 @@ func TestAdvanceTimeTxUpdatePrimaryNetworkStakers(t *testing.T) { pendingValidatorStartTime := genesistest.DefaultValidatorStartTime.Add(1 * time.Second) pendingValidatorEndTime := pendingValidatorStartTime.Add(defaultMinStakingDuration) nodeID := ids.GenerateTestNodeID() - addPendingValidatorTx, err := addPendingValidator( + addPendingValidatorTx := addPendingValidator( + t, env, pendingValidatorStartTime, pendingValidatorEndTime, nodeID, []*secp256k1.PrivateKey{genesistest.DefaultFundedKeys[0]}, ) - require.NoError(err) tx, err := newAdvanceTimeTx(t, pendingValidatorStartTime) require.NoError(err) @@ -140,8 +137,7 @@ func TestAdvanceTimeTxTimestampTooLate(t *testing.T) { pendingValidatorStartTime := genesistest.DefaultValidatorStartTime.Add(1 * time.Second) pendingValidatorEndTime := pendingValidatorStartTime.Add(defaultMinStakingDuration) nodeID := ids.GenerateTestNodeID() - _, err := addPendingValidator(env, pendingValidatorStartTime, pendingValidatorEndTime, nodeID, []*secp256k1.PrivateKey{genesistest.DefaultFundedKeys[0]}) - require.NoError(err) + addPendingValidator(t, env, pendingValidatorStartTime, pendingValidatorEndTime, nodeID, []*secp256k1.PrivateKey{genesistest.DefaultFundedKeys[0]}) { tx, err := newAdvanceTimeTx(t, pendingValidatorStartTime.Add(1*time.Second)) @@ -378,19 +374,22 @@ func TestAdvanceTimeTxUpdateStakers(t *testing.T) { env.config.TrackedSubnets.Add(subnetID) for _, staker := range test.stakers { - _, err := addPendingValidator( + addPendingValidator( + t, env, staker.startTime, staker.endTime, staker.nodeID, []*secp256k1.PrivateKey{genesistest.DefaultFundedKeys[0]}, ) - require.NoError(err) } for _, staker := range test.subnetStakers { - builder, signer := env.factory.NewWallet(genesistest.DefaultFundedKeys[:2]...) - utx, err := builder.NewAddSubnetValidatorTx( + wallet := newWallet(t, env, walletConfig{ + subnetIDs: []ids.ID{subnetID}, + }) + + tx, err := wallet.IssueAddSubnetValidatorTx( &txs.SubnetValidator{ Validator: txs.Validator{ NodeID: staker.nodeID, @@ -402,8 +401,6 @@ func TestAdvanceTimeTxUpdateStakers(t *testing.T) { }, ) require.NoError(err) - tx, err := walletsigner.SignUnsigned(context.Background(), signer, utx) - require.NoError(err) staker, err := state.NewPendingStaker( tx.ID(), @@ -485,13 +482,16 @@ func TestAdvanceTimeTxRemoveSubnetValidator(t *testing.T) { subnetID := testSubnet1.ID() env.config.TrackedSubnets.Add(subnetID) + wallet := newWallet(t, env, walletConfig{ + subnetIDs: []ids.ID{subnetID}, + }) + dummyHeight := uint64(1) // Add a subnet validator to the staker set subnetValidatorNodeID := genesistest.DefaultNodeIDs[0] subnetVdr1EndTime := genesistest.DefaultValidatorStartTime.Add(defaultMinStakingDuration) - builder, signer := env.factory.NewWallet(genesistest.DefaultFundedKeys[:2]...) - utx, err := builder.NewAddSubnetValidatorTx( + tx, err := wallet.IssueAddSubnetValidatorTx( &txs.SubnetValidator{ Validator: txs.Validator{ NodeID: subnetValidatorNodeID, @@ -503,8 +503,6 @@ func TestAdvanceTimeTxRemoveSubnetValidator(t *testing.T) { }, ) require.NoError(err) - tx, err := walletsigner.SignUnsigned(context.Background(), signer, utx) - require.NoError(err) addSubnetValTx := tx.Unsigned.(*txs.AddSubnetValidatorTx) staker, err := state.NewCurrentStaker( @@ -524,7 +522,7 @@ func TestAdvanceTimeTxRemoveSubnetValidator(t *testing.T) { // Queue a staker that joins the staker set after the above validator leaves subnetVdr2NodeID := genesistest.DefaultNodeIDs[1] - utx, err = builder.NewAddSubnetValidatorTx( + tx, err = wallet.IssueAddSubnetValidatorTx( &txs.SubnetValidator{ Validator: txs.Validator{ NodeID: subnetVdr2NodeID, @@ -536,8 +534,6 @@ func TestAdvanceTimeTxRemoveSubnetValidator(t *testing.T) { }, ) require.NoError(err) - tx, err = walletsigner.SignUnsigned(context.Background(), signer, utx) - require.NoError(err) staker, err = state.NewPendingStaker( tx.ID(), @@ -601,13 +597,16 @@ func TestTrackedSubnet(t *testing.T) { env.config.TrackedSubnets.Add(subnetID) } + wallet := newWallet(t, env, walletConfig{ + subnetIDs: []ids.ID{subnetID}, + }) + // Add a subnet validator to the staker set subnetValidatorNodeID := genesistest.DefaultNodeIDs[0] subnetVdr1StartTime := genesistest.DefaultValidatorStartTime.Add(1 * time.Minute) subnetVdr1EndTime := genesistest.DefaultValidatorStartTime.Add(10 * defaultMinStakingDuration).Add(1 * time.Minute) - builder, signer := env.factory.NewWallet(genesistest.DefaultFundedKeys[:2]...) - utx, err := builder.NewAddSubnetValidatorTx( + tx, err := wallet.IssueAddSubnetValidatorTx( &txs.SubnetValidator{ Validator: txs.Validator{ NodeID: subnetValidatorNodeID, @@ -619,8 +618,6 @@ func TestTrackedSubnet(t *testing.T) { }, ) require.NoError(err) - tx, err := walletsigner.SignUnsigned(context.Background(), signer, utx) - require.NoError(err) staker, err := state.NewPendingStaker( tx.ID(), @@ -676,14 +673,14 @@ func TestAdvanceTimeTxDelegatorStakerWeight(t *testing.T) { pendingValidatorStartTime := genesistest.DefaultValidatorStartTime.Add(1 * time.Second) pendingValidatorEndTime := pendingValidatorStartTime.Add(defaultMaxStakingDuration) nodeID := ids.GenerateTestNodeID() - _, err := addPendingValidator( + addPendingValidator( + t, env, pendingValidatorStartTime, pendingValidatorEndTime, nodeID, []*secp256k1.PrivateKey{genesistest.DefaultFundedKeys[0]}, ) - require.NoError(err) tx, err := newAdvanceTimeTx(t, pendingValidatorStartTime) require.NoError(err) @@ -709,6 +706,8 @@ func TestAdvanceTimeTxDelegatorStakerWeight(t *testing.T) { env.state.SetHeight(dummyHeight) require.NoError(env.state.Commit()) + wallet := newWallet(t, env, walletConfig{}) + // Test validator weight before delegation vdrWeight := env.config.Validators.GetWeight(constants.PrimaryNetworkID, nodeID) require.Equal(env.config.MinValidatorStake, vdrWeight) @@ -717,8 +716,7 @@ func TestAdvanceTimeTxDelegatorStakerWeight(t *testing.T) { pendingDelegatorStartTime := pendingValidatorStartTime.Add(1 * time.Second) pendingDelegatorEndTime := pendingDelegatorStartTime.Add(1 * time.Second) - builder, signer := env.factory.NewWallet(genesistest.DefaultFundedKeys[0], genesistest.DefaultFundedKeys[1], genesistest.DefaultFundedKeys[4]) - utx, err := builder.NewAddDelegatorTx( + addDelegatorTx, err := wallet.IssueAddDelegatorTx( &txs.Validator{ NodeID: nodeID, Start: uint64(pendingDelegatorStartTime.Unix()), @@ -727,12 +725,10 @@ func TestAdvanceTimeTxDelegatorStakerWeight(t *testing.T) { }, &secp256k1fx.OutputOwners{ Threshold: 1, - Addrs: []ids.ShortID{genesistest.DefaultFundedKeys[0].Address()}, + Addrs: []ids.ShortID{ids.GenerateTestShortID()}, }, ) require.NoError(err) - addDelegatorTx, err := walletsigner.SignUnsigned(context.Background(), signer, utx) - require.NoError(err) staker, err := state.NewPendingStaker( addDelegatorTx.ID(), @@ -786,8 +782,7 @@ func TestAdvanceTimeTxDelegatorStakers(t *testing.T) { pendingValidatorStartTime := genesistest.DefaultValidatorStartTime.Add(1 * time.Second) pendingValidatorEndTime := pendingValidatorStartTime.Add(defaultMinStakingDuration) nodeID := ids.GenerateTestNodeID() - _, err := addPendingValidator(env, pendingValidatorStartTime, pendingValidatorEndTime, nodeID, []*secp256k1.PrivateKey{genesistest.DefaultFundedKeys[0]}) - require.NoError(err) + addPendingValidator(t, env, pendingValidatorStartTime, pendingValidatorEndTime, nodeID, []*secp256k1.PrivateKey{genesistest.DefaultFundedKeys[0]}) tx, err := newAdvanceTimeTx(t, pendingValidatorStartTime) require.NoError(err) @@ -813,6 +808,8 @@ func TestAdvanceTimeTxDelegatorStakers(t *testing.T) { env.state.SetHeight(dummyHeight) require.NoError(env.state.Commit()) + wallet := newWallet(t, env, walletConfig{}) + // Test validator weight before delegation vdrWeight := env.config.Validators.GetWeight(constants.PrimaryNetworkID, nodeID) require.Equal(env.config.MinValidatorStake, vdrWeight) @@ -820,8 +817,7 @@ func TestAdvanceTimeTxDelegatorStakers(t *testing.T) { // Add delegator pendingDelegatorStartTime := pendingValidatorStartTime.Add(1 * time.Second) pendingDelegatorEndTime := pendingDelegatorStartTime.Add(defaultMinStakingDuration) - builder, signer := env.factory.NewWallet(genesistest.DefaultFundedKeys[0], genesistest.DefaultFundedKeys[1], genesistest.DefaultFundedKeys[4]) - utx, err := builder.NewAddDelegatorTx( + addDelegatorTx, err := wallet.IssueAddDelegatorTx( &txs.Validator{ NodeID: nodeID, Start: uint64(pendingDelegatorStartTime.Unix()), @@ -830,12 +826,10 @@ func TestAdvanceTimeTxDelegatorStakers(t *testing.T) { }, &secp256k1fx.OutputOwners{ Threshold: 1, - Addrs: []ids.ShortID{genesistest.DefaultFundedKeys[0].Address()}, + Addrs: []ids.ShortID{ids.GenerateTestShortID()}, }, ) require.NoError(err) - addDelegatorTx, err := walletsigner.SignUnsigned(context.Background(), signer, utx) - require.NoError(err) staker, err := state.NewPendingStaker( addDelegatorTx.ID(), @@ -935,14 +929,19 @@ func TestAdvanceTimeTxUnmarshal(t *testing.T) { } func addPendingValidator( + t testing.TB, env *environment, startTime time.Time, endTime time.Time, nodeID ids.NodeID, keys []*secp256k1.PrivateKey, -) (*txs.Tx, error) { - builder, signer := env.factory.NewWallet(keys...) - utx, err := builder.NewAddValidatorTx( +) *txs.Tx { + require := require.New(t) + + wallet := newWallet(t, env, walletConfig{ + keys: keys, + }) + addPendingValidatorTx, err := wallet.IssueAddValidatorTx( &txs.Validator{ NodeID: nodeID, Start: uint64(startTime.Unix()), @@ -955,28 +954,18 @@ func addPendingValidator( }, reward.PercentDenominator, ) - if err != nil { - return nil, err - } - addPendingValidatorTx, err := walletsigner.SignUnsigned(context.Background(), signer, utx) - if err != nil { - return nil, err - } + require.NoError(err) staker, err := state.NewPendingStaker( addPendingValidatorTx.ID(), addPendingValidatorTx.Unsigned.(*txs.AddValidatorTx), ) - if err != nil { - return nil, err - } + require.NoError(err) env.state.PutPendingValidator(staker) env.state.AddTx(addPendingValidatorTx, status.Committed) dummyHeight := uint64(1) env.state.SetHeight(dummyHeight) - if err := env.state.Commit(); err != nil { - return nil, err - } - return addPendingValidatorTx, nil + require.NoError(env.state.Commit()) + return addPendingValidatorTx } diff --git a/vms/platformvm/txs/executor/create_chain_test.go b/vms/platformvm/txs/executor/create_chain_test.go index d454cda30a7..61fead2677a 100644 --- a/vms/platformvm/txs/executor/create_chain_test.go +++ b/vms/platformvm/txs/executor/create_chain_test.go @@ -4,7 +4,6 @@ package executor import ( - "context" "testing" "time" @@ -21,11 +20,8 @@ import ( "github.com/ava-labs/avalanchego/vms/platformvm/genesis/genesistest" "github.com/ava-labs/avalanchego/vms/platformvm/state" "github.com/ava-labs/avalanchego/vms/platformvm/txs" - "github.com/ava-labs/avalanchego/vms/platformvm/txs/txstest" "github.com/ava-labs/avalanchego/vms/platformvm/utxo" "github.com/ava-labs/avalanchego/vms/secp256k1fx" - - walletsigner "github.com/ava-labs/avalanchego/wallet/chain/p/signer" ) // Ensure Execute fails when there are not enough control sigs @@ -35,17 +31,19 @@ func TestCreateChainTxInsufficientControlSigs(t *testing.T) { env.ctx.Lock.Lock() defer env.ctx.Lock.Unlock() - builder, signer := env.factory.NewWallet(genesistest.DefaultFundedKeys[:2]...) - utx, err := builder.NewCreateChainTx( - testSubnet1.ID(), + subnetID := testSubnet1.ID() + wallet := newWallet(t, env, walletConfig{ + subnetIDs: []ids.ID{subnetID}, + }) + + tx, err := wallet.IssueCreateChainTx( + subnetID, nil, constants.AVMID, nil, "chain name", ) require.NoError(err) - tx, err := walletsigner.SignUnsigned(context.Background(), signer, utx) - require.NoError(err) // Remove a signature tx.Creds[0].(*secp256k1fx.Credential).Sigs = tx.Creds[0].(*secp256k1fx.Credential).Sigs[1:] @@ -71,17 +69,19 @@ func TestCreateChainTxWrongControlSig(t *testing.T) { env.ctx.Lock.Lock() defer env.ctx.Lock.Unlock() - builder, signer := env.factory.NewWallet(testSubnet1ControlKeys[0], testSubnet1ControlKeys[1]) - utx, err := builder.NewCreateChainTx( - testSubnet1.ID(), + subnetID := testSubnet1.ID() + wallet := newWallet(t, env, walletConfig{ + subnetIDs: []ids.ID{subnetID}, + }) + + tx, err := wallet.IssueCreateChainTx( + subnetID, nil, constants.AVMID, nil, "chain name", ) require.NoError(err) - tx, err := walletsigner.SignUnsigned(context.Background(), signer, utx) - require.NoError(err) // Generate new, random key to sign tx with key, err := secp256k1.NewPrivateKey() @@ -114,17 +114,19 @@ func TestCreateChainTxNoSuchSubnet(t *testing.T) { env.ctx.Lock.Lock() defer env.ctx.Lock.Unlock() - builder, signer := env.factory.NewWallet(testSubnet1ControlKeys[0], testSubnet1ControlKeys[1]) - utx, err := builder.NewCreateChainTx( - testSubnet1.ID(), + subnetID := testSubnet1.ID() + wallet := newWallet(t, env, walletConfig{ + subnetIDs: []ids.ID{subnetID}, + }) + + tx, err := wallet.IssueCreateChainTx( + subnetID, nil, constants.AVMID, nil, "chain name", ) require.NoError(err) - tx, err := walletsigner.SignUnsigned(context.Background(), signer, utx) - require.NoError(err) tx.Unsigned.(*txs.CreateChainTx).SubnetID = ids.GenerateTestID() @@ -152,17 +154,19 @@ func TestCreateChainTxValid(t *testing.T) { env.ctx.Lock.Lock() defer env.ctx.Lock.Unlock() - builder, signer := env.factory.NewWallet(testSubnet1ControlKeys[0], testSubnet1ControlKeys[1]) - utx, err := builder.NewCreateChainTx( - testSubnet1.ID(), + subnetID := testSubnet1.ID() + wallet := newWallet(t, env, walletConfig{ + subnetIDs: []ids.ID{subnetID}, + }) + + tx, err := wallet.IssueCreateChainTx( + subnetID, nil, constants.AVMID, nil, "chain name", ) require.NoError(err) - tx, err := walletsigner.SignUnsigned(context.Background(), signer, utx) - require.NoError(err) stateDiff, err := state.NewDiff(lastAcceptedID, env) require.NoError(err) @@ -221,21 +225,22 @@ func TestCreateChainTxAP3FeeChange(t *testing.T) { env.state.SetTimestamp(test.time) // to duly set fee - cfg := *env.config + config := *env.config + config.StaticFeeConfig.CreateBlockchainTxFee = test.fee + subnetID := testSubnet1.ID() + wallet := newWallet(t, env, walletConfig{ + config: &config, + subnetIDs: []ids.ID{subnetID}, + }) - cfg.StaticFeeConfig.CreateBlockchainTxFee = test.fee - factory := txstest.NewWalletFactory(env.ctx, &cfg, env.state) - builder, signer := factory.NewWallet(genesistest.DefaultFundedKeys...) - utx, err := builder.NewCreateChainTx( - testSubnet1.ID(), + tx, err := wallet.IssueCreateChainTx( + subnetID, nil, ids.GenerateTestID(), nil, "", ) require.NoError(err) - tx, err := walletsigner.SignUnsigned(context.Background(), signer, utx) - require.NoError(err) stateDiff, err := state.NewDiff(lastAcceptedID, env) require.NoError(err) @@ -261,17 +266,19 @@ func TestEtnaCreateChainTxInvalidWithManagedSubnet(t *testing.T) { env.ctx.Lock.Lock() defer env.ctx.Lock.Unlock() - builder, signer := env.factory.NewWallet(testSubnet1ControlKeys[0], testSubnet1ControlKeys[1]) - utx, err := builder.NewCreateChainTx( - testSubnet1.ID(), + subnetID := testSubnet1.ID() + wallet := newWallet(t, env, walletConfig{ + subnetIDs: []ids.ID{subnetID}, + }) + + tx, err := wallet.IssueCreateChainTx( + subnetID, nil, constants.AVMID, nil, "chain name", ) require.NoError(err) - tx, err := walletsigner.SignUnsigned(context.Background(), signer, utx) - require.NoError(err) stateDiff, err := state.NewDiff(lastAcceptedID, env) require.NoError(err) @@ -279,7 +286,7 @@ func TestEtnaCreateChainTxInvalidWithManagedSubnet(t *testing.T) { builderDiff, err := state.NewDiffOn(stateDiff) require.NoError(err) - stateDiff.SetSubnetManager(testSubnet1.ID(), ids.GenerateTestID(), []byte{'a', 'd', 'd', 'r', 'e', 's', 's'}) + stateDiff.SetSubnetManager(subnetID, ids.GenerateTestID(), []byte{'a', 'd', 'd', 'r', 'e', 's', 's'}) feeCalculator := state.PickFeeCalculator(env.config, builderDiff) executor := StandardTxExecutor{ diff --git a/vms/platformvm/txs/executor/create_subnet_test.go b/vms/platformvm/txs/executor/create_subnet_test.go index ad51fdc0b2b..0290d181140 100644 --- a/vms/platformvm/txs/executor/create_subnet_test.go +++ b/vms/platformvm/txs/executor/create_subnet_test.go @@ -4,7 +4,6 @@ package executor import ( - "context" "testing" "time" @@ -16,11 +15,8 @@ import ( "github.com/ava-labs/avalanchego/utils/units" "github.com/ava-labs/avalanchego/vms/platformvm/genesis/genesistest" "github.com/ava-labs/avalanchego/vms/platformvm/state" - "github.com/ava-labs/avalanchego/vms/platformvm/txs/txstest" "github.com/ava-labs/avalanchego/vms/platformvm/utxo" "github.com/ava-labs/avalanchego/vms/secp256k1fx" - - walletsigner "github.com/ava-labs/avalanchego/wallet/chain/p/signer" ) func TestCreateSubnetTxAP3FeeChange(t *testing.T) { @@ -66,16 +62,16 @@ func TestCreateSubnetTxAP3FeeChange(t *testing.T) { addrs.Add(key.Address()) } - cfg := *env.config - cfg.StaticFeeConfig.CreateSubnetTxFee = test.fee - factory := txstest.NewWalletFactory(env.ctx, &cfg, env.state) - builder, signer := factory.NewWallet(genesistest.DefaultFundedKeys...) - utx, err := builder.NewCreateSubnetTx( + config := *env.config + config.StaticFeeConfig.CreateSubnetTxFee = test.fee + wallet := newWallet(t, env, walletConfig{ + config: &config, + }) + + tx, err := wallet.IssueCreateSubnetTx( &secp256k1fx.OutputOwners{}, ) require.NoError(err) - tx, err := walletsigner.SignUnsigned(context.Background(), signer, utx) - require.NoError(err) stateDiff, err := state.NewDiff(lastAcceptedID, env) require.NoError(err) diff --git a/vms/platformvm/txs/executor/export_test.go b/vms/platformvm/txs/executor/export_test.go index a6f292c92c3..34b1e804645 100644 --- a/vms/platformvm/txs/executor/export_test.go +++ b/vms/platformvm/txs/executor/export_test.go @@ -4,7 +4,6 @@ package executor import ( - "context" "testing" "time" @@ -12,13 +11,10 @@ import ( "github.com/ava-labs/avalanchego/ids" "github.com/ava-labs/avalanchego/upgrade/upgradetest" - "github.com/ava-labs/avalanchego/utils/crypto/secp256k1" "github.com/ava-labs/avalanchego/vms/components/avax" "github.com/ava-labs/avalanchego/vms/platformvm/genesis/genesistest" "github.com/ava-labs/avalanchego/vms/platformvm/state" "github.com/ava-labs/avalanchego/vms/secp256k1fx" - - walletsigner "github.com/ava-labs/avalanchego/wallet/chain/p/signer" ) func TestNewExportTx(t *testing.T) { @@ -26,53 +22,43 @@ func TestNewExportTx(t *testing.T) { env.ctx.Lock.Lock() defer env.ctx.Lock.Unlock() - type test struct { + tests := []struct { description string destinationChainID ids.ID - sourceKeys []*secp256k1.PrivateKey timestamp time.Time - } - - sourceKey := genesistest.DefaultFundedKeys[0] - - tests := []test{ + }{ { description: "P->X export", destinationChainID: env.ctx.XChainID, - sourceKeys: []*secp256k1.PrivateKey{sourceKey}, timestamp: genesistest.DefaultValidatorStartTime, }, { description: "P->C export", destinationChainID: env.ctx.CChainID, - sourceKeys: []*secp256k1.PrivateKey{sourceKey}, timestamp: env.config.UpgradeConfig.ApricotPhase5Time, }, } - to := ids.GenerateTestShortID() for _, tt := range tests { t.Run(tt.description, func(t *testing.T) { require := require.New(t) - builder, signer := env.factory.NewWallet(tt.sourceKeys...) - utx, err := builder.NewExportTx( + wallet := newWallet(t, env, walletConfig{}) + + tx, err := wallet.IssueExportTx( tt.destinationChainID, []*avax.TransferableOutput{{ Asset: avax.Asset{ID: env.ctx.AVAXAssetID}, Out: &secp256k1fx.TransferOutput{ Amt: genesistest.DefaultInitialBalance - defaultTxFee, OutputOwners: secp256k1fx.OutputOwners{ - Locktime: 0, Threshold: 1, - Addrs: []ids.ShortID{to}, + Addrs: []ids.ShortID{ids.GenerateTestShortID()}, }, }, }}, ) require.NoError(err) - tx, err := walletsigner.SignUnsigned(context.Background(), signer, utx) - require.NoError(err) stateDiff, err := state.NewDiff(lastAcceptedID, env) require.NoError(err) diff --git a/vms/platformvm/txs/executor/helpers_test.go b/vms/platformvm/txs/executor/helpers_test.go index e740178fbe4..595f4cc2ae6 100644 --- a/vms/platformvm/txs/executor/helpers_test.go +++ b/vms/platformvm/txs/executor/helpers_test.go @@ -4,7 +4,6 @@ package executor import ( - "context" "math" "testing" "time" @@ -25,6 +24,7 @@ import ( "github.com/ava-labs/avalanchego/upgrade/upgradetest" "github.com/ava-labs/avalanchego/utils" "github.com/ava-labs/avalanchego/utils/constants" + "github.com/ava-labs/avalanchego/utils/crypto/secp256k1" "github.com/ava-labs/avalanchego/utils/logging" "github.com/ava-labs/avalanchego/utils/timer/mockable" "github.com/ava-labs/avalanchego/utils/units" @@ -40,9 +40,7 @@ import ( "github.com/ava-labs/avalanchego/vms/platformvm/txs/txstest" "github.com/ava-labs/avalanchego/vms/platformvm/utxo" "github.com/ava-labs/avalanchego/vms/secp256k1fx" - "github.com/ava-labs/avalanchego/wallet/subnet/primary/common" - - walletsigner "github.com/ava-labs/avalanchego/wallet/chain/p/signer" + "github.com/ava-labs/avalanchego/wallet/chain/p/wallet" ) const ( @@ -57,8 +55,7 @@ const ( var ( lastAcceptedID = ids.GenerateTestID() - testSubnet1 *txs.Tx - testSubnet1ControlKeys = genesistest.DefaultFundedKeys[0:3] + testSubnet1 *txs.Tx ) type mutableSharedMemory struct { @@ -77,7 +74,6 @@ type environment struct { states map[ids.ID]state.Chain uptimes uptime.Manager utxosHandler utxo.Verifier - factory *txstest.WalletFactory backend Backend } @@ -124,8 +120,6 @@ func newEnvironment(t *testing.T, f upgradetest.Fork) *environment { uptimes := uptime.NewManager(baseState, clk) utxosVerifier := utxo.NewVerifier(ctx, clk, fx) - factory := txstest.NewWalletFactory(ctx, config, baseState) - backend := Backend{ Config: config, Ctx: ctx, @@ -149,7 +143,6 @@ func newEnvironment(t *testing.T, f upgradetest.Fork) *environment { states: make(map[ids.ID]state.Chain), uptimes: uptimes, utxosHandler: utxosVerifier, - factory: factory, backend: backend, } @@ -182,11 +175,40 @@ func newEnvironment(t *testing.T, f upgradetest.Fork) *environment { return env } +type walletConfig struct { + config *config.Config + keys []*secp256k1.PrivateKey + subnetIDs []ids.ID + chainIDs []ids.ID +} + +func newWallet(t testing.TB, e *environment, c walletConfig) wallet.Wallet { + if c.config == nil { + c.config = e.config + } + if len(c.keys) == 0 { + c.keys = genesistest.DefaultFundedKeys + } + return txstest.NewWallet( + t, + e.ctx, + c.config, + e.state, + secp256k1fx.NewKeychain(c.keys...), + c.subnetIDs, + c.chainIDs, + ) +} + func addSubnet(t *testing.T, env *environment) { require := require.New(t) - builder, signer := env.factory.NewWallet(genesistest.DefaultFundedKeys[0]) - utx, err := builder.NewCreateSubnetTx( + wallet := newWallet(t, env, walletConfig{ + keys: genesistest.DefaultFundedKeys[:1], + }) + + var err error + testSubnet1, err = wallet.IssueCreateSubnetTx( &secp256k1fx.OutputOwners{ Threshold: 2, Addrs: []ids.ShortID{ @@ -195,14 +217,8 @@ func addSubnet(t *testing.T, env *environment) { genesistest.DefaultFundedKeys[2].Address(), }, }, - common.WithChangeOwner(&secp256k1fx.OutputOwners{ - Threshold: 1, - Addrs: []ids.ShortID{genesistest.DefaultFundedKeys[0].Address()}, - }), ) require.NoError(err) - testSubnet1, err = walletsigner.SignUnsigned(context.Background(), signer, utx) - require.NoError(err) stateDiff, err := state.NewDiff(lastAcceptedID, env) require.NoError(err) diff --git a/vms/platformvm/txs/executor/import_test.go b/vms/platformvm/txs/executor/import_test.go index 6cc5c8a0cb3..d3c48f17e18 100644 --- a/vms/platformvm/txs/executor/import_test.go +++ b/vms/platformvm/txs/executor/import_test.go @@ -4,7 +4,6 @@ package executor import ( - "context" "math/rand" "testing" "time" @@ -21,8 +20,6 @@ import ( "github.com/ava-labs/avalanchego/vms/platformvm/txs" "github.com/ava-labs/avalanchego/vms/secp256k1fx" "github.com/ava-labs/avalanchego/wallet/chain/p/builder" - - walletsigner "github.com/ava-labs/avalanchego/wallet/chain/p/signer" ) var fundedSharedMemoryCalls byte @@ -34,7 +31,6 @@ func TestNewImportTx(t *testing.T) { description string sourceChainID ids.ID sharedMemory atomic.SharedMemory - sourceKeys []*secp256k1.PrivateKey timestamp time.Time expectedErr error } @@ -59,7 +55,6 @@ func TestNewImportTx(t *testing.T) { }, randSrc, ), - sourceKeys: []*secp256k1.PrivateKey{sourceKey}, expectedErr: builder.ErrInsufficientFunds, }, { @@ -75,7 +70,6 @@ func TestNewImportTx(t *testing.T) { }, randSrc, ), - sourceKeys: []*secp256k1.PrivateKey{sourceKey}, expectedErr: nil, }, { @@ -91,7 +85,6 @@ func TestNewImportTx(t *testing.T) { }, randSrc, ), - sourceKeys: []*secp256k1.PrivateKey{sourceKey}, timestamp: env.config.UpgradeConfig.ApricotPhase5Time, expectedErr: nil, }, @@ -109,7 +102,6 @@ func TestNewImportTx(t *testing.T) { }, randSrc, ), - sourceKeys: []*secp256k1.PrivateKey{sourceKey}, timestamp: env.config.UpgradeConfig.ApricotPhase5Time, expectedErr: nil, }, @@ -125,8 +117,12 @@ func TestNewImportTx(t *testing.T) { env.msm.SharedMemory = tt.sharedMemory - builder, signer := env.factory.NewWallet(tt.sourceKeys...) - utx, err := builder.NewImportTx( + wallet := newWallet(t, env, walletConfig{ + keys: []*secp256k1.PrivateKey{sourceKey}, + chainIDs: []ids.ID{tt.sourceChainID}, + }) + + tx, err := wallet.IssueImportTx( tt.sourceChainID, to, ) @@ -134,8 +130,6 @@ func TestNewImportTx(t *testing.T) { if tt.expectedErr != nil { return } - tx, err := walletsigner.SignUnsigned(context.Background(), signer, utx) - require.NoError(err) unsignedTx := tx.Unsigned.(*txs.ImportTx) require.NotEmpty(unsignedTx.ImportedInputs) diff --git a/vms/platformvm/txs/executor/proposal_tx_executor_test.go b/vms/platformvm/txs/executor/proposal_tx_executor_test.go index e7d79ca58eb..70687a96583 100644 --- a/vms/platformvm/txs/executor/proposal_tx_executor_test.go +++ b/vms/platformvm/txs/executor/proposal_tx_executor_test.go @@ -4,7 +4,6 @@ package executor import ( - "context" "math" "testing" "time" @@ -22,13 +21,14 @@ import ( "github.com/ava-labs/avalanchego/vms/platformvm/status" "github.com/ava-labs/avalanchego/vms/platformvm/txs" "github.com/ava-labs/avalanchego/vms/secp256k1fx" - - walletsigner "github.com/ava-labs/avalanchego/wallet/chain/p/signer" ) func TestProposalTxExecuteAddDelegator(t *testing.T) { dummyHeight := uint64(1) - rewardAddress := genesistest.DefaultFundedKeys[0].Address() + rewardsOwner := &secp256k1fx.OutputOwners{ + Threshold: 1, + Addrs: []ids.ShortID{ids.GenerateTestShortID()}, + } nodeID := genesistest.DefaultNodeIDs[0] newValidatorID := ids.GenerateTestNodeID() @@ -40,23 +40,21 @@ func TestProposalTxExecuteAddDelegator(t *testing.T) { addMinStakeValidator := func(env *environment) { require := require.New(t) - builder, signer := env.factory.NewWallet(genesistest.DefaultFundedKeys[0]) - utx, err := builder.NewAddValidatorTx( + wallet := newWallet(t, env, walletConfig{ + keys: genesistest.DefaultFundedKeys[:1], + }) + + tx, err := wallet.IssueAddValidatorTx( &txs.Validator{ NodeID: newValidatorID, Start: newValidatorStartTime, End: newValidatorEndTime, Wght: env.config.MinValidatorStake, }, - &secp256k1fx.OutputOwners{ - Threshold: 1, - Addrs: []ids.ShortID{rewardAddress}, - }, + rewardsOwner, reward.PercentDenominator, ) require.NoError(err) - tx, err := walletsigner.SignUnsigned(context.Background(), signer, utx) - require.NoError(err) addValTx := tx.Unsigned.(*txs.AddValidatorTx) staker, err := state.NewCurrentStaker( @@ -78,23 +76,21 @@ func TestProposalTxExecuteAddDelegator(t *testing.T) { addMaxStakeValidator := func(env *environment) { require := require.New(t) - builder, signer := env.factory.NewWallet(genesistest.DefaultFundedKeys[0]) - utx, err := builder.NewAddValidatorTx( + wallet := newWallet(t, env, walletConfig{ + keys: genesistest.DefaultFundedKeys[:1], + }) + + tx, err := wallet.IssueAddValidatorTx( &txs.Validator{ NodeID: newValidatorID, Start: newValidatorStartTime, End: newValidatorEndTime, Wght: env.config.MaxValidatorStake, }, - &secp256k1fx.OutputOwners{ - Threshold: 1, - Addrs: []ids.ShortID{rewardAddress}, - }, + rewardsOwner, reward.PercentDenominator, ) require.NoError(err) - tx, err := walletsigner.SignUnsigned(context.Background(), signer, utx) - require.NoError(err) addValTx := tx.Unsigned.(*txs.AddValidatorTx) staker, err := state.NewCurrentStaker( @@ -246,22 +242,20 @@ func TestProposalTxExecuteAddDelegator(t *testing.T) { env := newEnvironment(t, upgradetest.ApricotPhase5) env.config.UpgradeConfig.ApricotPhase3Time = tt.AP3Time - builder, signer := env.factory.NewWallet(tt.feeKeys...) - utx, err := builder.NewAddDelegatorTx( + wallet := newWallet(t, env, walletConfig{ + keys: tt.feeKeys, + }) + + tx, err := wallet.IssueAddDelegatorTx( &txs.Validator{ NodeID: tt.nodeID, Start: tt.startTime, End: tt.endTime, Wght: tt.stakeAmount, }, - &secp256k1fx.OutputOwners{ - Threshold: 1, - Addrs: []ids.ShortID{rewardAddress}, - }, + rewardsOwner, ) require.NoError(err) - tx, err := walletsigner.SignUnsigned(context.Background(), signer, utx) - require.NoError(err) if tt.setup != nil { tt.setup(env) @@ -294,12 +288,15 @@ func TestProposalTxExecuteAddSubnetValidator(t *testing.T) { defer env.ctx.Lock.Unlock() nodeID := genesistest.DefaultNodeIDs[0] + subnetID := testSubnet1.ID() { // Case: Proposed validator currently validating primary network // but stops validating subnet after stops validating primary network // (note that keys[0] is a genesis validator) - builder, signer := env.factory.NewWallet(testSubnet1ControlKeys[0], testSubnet1ControlKeys[1]) - utx, err := builder.NewAddSubnetValidatorTx( + wallet := newWallet(t, env, walletConfig{ + subnetIDs: []ids.ID{subnetID}, + }) + tx, err := wallet.IssueAddSubnetValidatorTx( &txs.SubnetValidator{ Validator: txs.Validator{ NodeID: nodeID, @@ -307,12 +304,10 @@ func TestProposalTxExecuteAddSubnetValidator(t *testing.T) { End: genesistest.DefaultValidatorEndTimeUnix + 1, Wght: genesistest.DefaultValidatorWeight, }, - Subnet: testSubnet1.ID(), + Subnet: subnetID, }, ) require.NoError(err) - tx, err := walletsigner.SignUnsigned(context.Background(), signer, utx) - require.NoError(err) onCommitState, err := state.NewDiff(lastAcceptedID, env) require.NoError(err) @@ -337,8 +332,10 @@ func TestProposalTxExecuteAddSubnetValidator(t *testing.T) { // and proposed subnet validation period is subset of // primary network validation period // (note that keys[0] is a genesis validator) - builder, signer := env.factory.NewWallet(testSubnet1ControlKeys[0], testSubnet1ControlKeys[1]) - utx, err := builder.NewAddSubnetValidatorTx( + wallet := newWallet(t, env, walletConfig{ + subnetIDs: []ids.ID{subnetID}, + }) + tx, err := wallet.IssueAddSubnetValidatorTx( &txs.SubnetValidator{ Validator: txs.Validator{ NodeID: nodeID, @@ -346,12 +343,10 @@ func TestProposalTxExecuteAddSubnetValidator(t *testing.T) { End: genesistest.DefaultValidatorEndTimeUnix, Wght: genesistest.DefaultValidatorWeight, }, - Subnet: testSubnet1.ID(), + Subnet: subnetID, }, ) require.NoError(err) - tx, err := walletsigner.SignUnsigned(context.Background(), signer, utx) - require.NoError(err) onCommitState, err := state.NewDiff(lastAcceptedID, env) require.NoError(err) @@ -376,8 +371,10 @@ func TestProposalTxExecuteAddSubnetValidator(t *testing.T) { dsStartTime := genesistest.DefaultValidatorStartTime.Add(10 * time.Second) dsEndTime := dsStartTime.Add(5 * defaultMinStakingDuration) - builder, signer := env.factory.NewWallet(genesistest.DefaultFundedKeys[0]) - utx, err := builder.NewAddValidatorTx( + wallet := newWallet(t, env, walletConfig{ + keys: genesistest.DefaultFundedKeys[:1], + }) + addDSTx, err := wallet.IssueAddValidatorTx( &txs.Validator{ NodeID: pendingDSValidatorID, Start: uint64(dsStartTime.Unix()), @@ -391,13 +388,13 @@ func TestProposalTxExecuteAddSubnetValidator(t *testing.T) { reward.PercentDenominator, ) require.NoError(err) - addDSTx, err := walletsigner.SignUnsigned(context.Background(), signer, utx) - require.NoError(err) { // Case: Proposed validator isn't in pending or current validator sets - builder, signer := env.factory.NewWallet(testSubnet1ControlKeys[0], testSubnet1ControlKeys[1]) - utx, err := builder.NewAddSubnetValidatorTx( + wallet := newWallet(t, env, walletConfig{ + subnetIDs: []ids.ID{subnetID}, + }) + tx, err := wallet.IssueAddSubnetValidatorTx( &txs.SubnetValidator{ Validator: txs.Validator{ NodeID: pendingDSValidatorID, @@ -405,12 +402,10 @@ func TestProposalTxExecuteAddSubnetValidator(t *testing.T) { End: uint64(dsEndTime.Unix()), Wght: genesistest.DefaultValidatorWeight, }, - Subnet: testSubnet1.ID(), + Subnet: subnetID, }, ) require.NoError(err) - tx, err := walletsigner.SignUnsigned(context.Background(), signer, utx) - require.NoError(err) onCommitState, err := state.NewDiff(lastAcceptedID, env) require.NoError(err) @@ -450,8 +445,10 @@ func TestProposalTxExecuteAddSubnetValidator(t *testing.T) { { // Case: Proposed validator is pending validator of primary network // but starts validating subnet before primary network - builder, signer := env.factory.NewWallet(testSubnet1ControlKeys[0], testSubnet1ControlKeys[1]) - utx, err := builder.NewAddSubnetValidatorTx( + wallet := newWallet(t, env, walletConfig{ + subnetIDs: []ids.ID{subnetID}, + }) + tx, err := wallet.IssueAddSubnetValidatorTx( &txs.SubnetValidator{ Validator: txs.Validator{ NodeID: pendingDSValidatorID, @@ -459,12 +456,10 @@ func TestProposalTxExecuteAddSubnetValidator(t *testing.T) { End: uint64(dsEndTime.Unix()), Wght: genesistest.DefaultValidatorWeight, }, - Subnet: testSubnet1.ID(), + Subnet: subnetID, }, ) require.NoError(err) - tx, err := walletsigner.SignUnsigned(context.Background(), signer, utx) - require.NoError(err) onCommitState, err := state.NewDiff(lastAcceptedID, env) require.NoError(err) @@ -487,8 +482,10 @@ func TestProposalTxExecuteAddSubnetValidator(t *testing.T) { { // Case: Proposed validator is pending validator of primary network // but stops validating subnet after primary network - builder, signer := env.factory.NewWallet(testSubnet1ControlKeys[0], testSubnet1ControlKeys[1]) - utx, err := builder.NewAddSubnetValidatorTx( + wallet := newWallet(t, env, walletConfig{ + subnetIDs: []ids.ID{subnetID}, + }) + tx, err := wallet.IssueAddSubnetValidatorTx( &txs.SubnetValidator{ Validator: txs.Validator{ NodeID: pendingDSValidatorID, @@ -496,12 +493,10 @@ func TestProposalTxExecuteAddSubnetValidator(t *testing.T) { End: uint64(dsEndTime.Unix()) + 1, // stop validating subnet after stopping validating primary network Wght: genesistest.DefaultValidatorWeight, }, - Subnet: testSubnet1.ID(), + Subnet: subnetID, }, ) require.NoError(err) - tx, err := walletsigner.SignUnsigned(context.Background(), signer, utx) - require.NoError(err) onCommitState, err := state.NewDiff(lastAcceptedID, env) require.NoError(err) @@ -524,8 +519,10 @@ func TestProposalTxExecuteAddSubnetValidator(t *testing.T) { { // Case: Proposed validator is pending validator of primary network and // period validating subnet is subset of time validating primary network - builder, signer := env.factory.NewWallet(testSubnet1ControlKeys[0], testSubnet1ControlKeys[1]) - utx, err := builder.NewAddSubnetValidatorTx( + wallet := newWallet(t, env, walletConfig{ + subnetIDs: []ids.ID{subnetID}, + }) + tx, err := wallet.IssueAddSubnetValidatorTx( &txs.SubnetValidator{ Validator: txs.Validator{ NodeID: pendingDSValidatorID, @@ -533,12 +530,10 @@ func TestProposalTxExecuteAddSubnetValidator(t *testing.T) { End: uint64(dsEndTime.Unix()), // same end time as for primary network Wght: genesistest.DefaultValidatorWeight, }, - Subnet: testSubnet1.ID(), + Subnet: subnetID, }, ) require.NoError(err) - tx, err := walletsigner.SignUnsigned(context.Background(), signer, utx) - require.NoError(err) onCommitState, err := state.NewDiff(lastAcceptedID, env) require.NoError(err) @@ -563,8 +558,10 @@ func TestProposalTxExecuteAddSubnetValidator(t *testing.T) { env.state.SetTimestamp(newTimestamp) { - builder, signer := env.factory.NewWallet(testSubnet1ControlKeys[0], testSubnet1ControlKeys[1]) - utx, err := builder.NewAddSubnetValidatorTx( + wallet := newWallet(t, env, walletConfig{ + subnetIDs: []ids.ID{subnetID}, + }) + tx, err := wallet.IssueAddSubnetValidatorTx( &txs.SubnetValidator{ Validator: txs.Validator{ NodeID: nodeID, @@ -572,12 +569,10 @@ func TestProposalTxExecuteAddSubnetValidator(t *testing.T) { End: uint64(newTimestamp.Add(defaultMinStakingDuration).Unix()), Wght: genesistest.DefaultValidatorWeight, }, - Subnet: testSubnet1.ID(), + Subnet: subnetID, }, ) require.NoError(err) - tx, err := walletsigner.SignUnsigned(context.Background(), signer, utx) - require.NoError(err) onCommitState, err := state.NewDiff(lastAcceptedID, env) require.NoError(err) @@ -602,8 +597,10 @@ func TestProposalTxExecuteAddSubnetValidator(t *testing.T) { // Case: Proposed validator already validating the subnet // First, add validator as validator of subnet - builder, signer = env.factory.NewWallet(testSubnet1ControlKeys[0], testSubnet1ControlKeys[1]) - uSubnetTx, err := builder.NewAddSubnetValidatorTx( + wallet = newWallet(t, env, walletConfig{ + subnetIDs: []ids.ID{subnetID}, + }) + subnetTx, err := wallet.IssueAddSubnetValidatorTx( &txs.SubnetValidator{ Validator: txs.Validator{ NodeID: nodeID, @@ -611,12 +608,10 @@ func TestProposalTxExecuteAddSubnetValidator(t *testing.T) { End: genesistest.DefaultValidatorEndTimeUnix, Wght: genesistest.DefaultValidatorWeight, }, - Subnet: testSubnet1.ID(), + Subnet: subnetID, }, ) require.NoError(err) - subnetTx, err := walletsigner.SignUnsigned(context.Background(), signer, uSubnetTx) - require.NoError(err) addSubnetValTx := subnetTx.Unsigned.(*txs.AddSubnetValidatorTx) staker, err = state.NewCurrentStaker( @@ -634,8 +629,10 @@ func TestProposalTxExecuteAddSubnetValidator(t *testing.T) { { // Node with ID nodeIDKey.Address() now validating subnet with ID testSubnet1.ID - builder, signer := env.factory.NewWallet(testSubnet1ControlKeys[0], testSubnet1ControlKeys[1]) - utx, err := builder.NewAddSubnetValidatorTx( + wallet = newWallet(t, env, walletConfig{ + subnetIDs: []ids.ID{subnetID}, + }) + duplicateSubnetTx, err := wallet.IssueAddSubnetValidatorTx( &txs.SubnetValidator{ Validator: txs.Validator{ NodeID: nodeID, @@ -643,12 +640,10 @@ func TestProposalTxExecuteAddSubnetValidator(t *testing.T) { End: genesistest.DefaultValidatorEndTimeUnix, Wght: genesistest.DefaultValidatorWeight, }, - Subnet: testSubnet1.ID(), + Subnet: subnetID, }, ) require.NoError(err) - duplicateSubnetTx, err := walletsigner.SignUnsigned(context.Background(), signer, utx) - require.NoError(err) onCommitState, err := state.NewDiff(lastAcceptedID, env) require.NoError(err) @@ -674,8 +669,10 @@ func TestProposalTxExecuteAddSubnetValidator(t *testing.T) { { // Case: Too few signatures - builder, signer := env.factory.NewWallet(testSubnet1ControlKeys[0], testSubnet1ControlKeys[1]) - utx, err := builder.NewAddSubnetValidatorTx( + wallet = newWallet(t, env, walletConfig{ + subnetIDs: []ids.ID{subnetID}, + }) + tx, err := wallet.IssueAddSubnetValidatorTx( &txs.SubnetValidator{ Validator: txs.Validator{ NodeID: nodeID, @@ -683,12 +680,10 @@ func TestProposalTxExecuteAddSubnetValidator(t *testing.T) { End: uint64(genesistest.DefaultValidatorStartTime.Add(defaultMinStakingDuration).Unix()) + 1, Wght: genesistest.DefaultValidatorWeight, }, - Subnet: testSubnet1.ID(), + Subnet: subnetID, }, ) require.NoError(err) - tx, err := walletsigner.SignUnsigned(context.Background(), signer, utx) - require.NoError(err) // Remove a signature addSubnetValidatorTx := tx.Unsigned.(*txs.AddSubnetValidatorTx) @@ -717,8 +712,10 @@ func TestProposalTxExecuteAddSubnetValidator(t *testing.T) { { // Case: Control Signature from invalid key (keys[3] is not a control key) - builder, signer := env.factory.NewWallet(testSubnet1ControlKeys[0], genesistest.DefaultFundedKeys[1]) - utx, err := builder.NewAddSubnetValidatorTx( + wallet = newWallet(t, env, walletConfig{ + subnetIDs: []ids.ID{subnetID}, + }) + tx, err := wallet.IssueAddSubnetValidatorTx( &txs.SubnetValidator{ Validator: txs.Validator{ NodeID: nodeID, @@ -726,12 +723,10 @@ func TestProposalTxExecuteAddSubnetValidator(t *testing.T) { End: uint64(genesistest.DefaultValidatorStartTime.Add(defaultMinStakingDuration).Unix()) + 1, Wght: genesistest.DefaultValidatorWeight, }, - Subnet: testSubnet1.ID(), + Subnet: subnetID, }, ) require.NoError(err) - tx, err := walletsigner.SignUnsigned(context.Background(), signer, utx) - require.NoError(err) // Replace a valid signature with one from keys[3] sig, err := genesistest.DefaultFundedKeys[3].SignHash(hashing.ComputeHash256(tx.Unsigned.Bytes())) @@ -759,8 +754,10 @@ func TestProposalTxExecuteAddSubnetValidator(t *testing.T) { { // Case: Proposed validator in pending validator set for subnet // First, add validator to pending validator set of subnet - builder, signer := env.factory.NewWallet(testSubnet1ControlKeys[0], testSubnet1ControlKeys[1]) - utx, err := builder.NewAddSubnetValidatorTx( + wallet = newWallet(t, env, walletConfig{ + subnetIDs: []ids.ID{subnetID}, + }) + tx, err := wallet.IssueAddSubnetValidatorTx( &txs.SubnetValidator{ Validator: txs.Validator{ NodeID: nodeID, @@ -768,12 +765,10 @@ func TestProposalTxExecuteAddSubnetValidator(t *testing.T) { End: uint64(genesistest.DefaultValidatorStartTime.Add(defaultMinStakingDuration).Unix()) + 1, Wght: genesistest.DefaultValidatorWeight, }, - Subnet: testSubnet1.ID(), + Subnet: subnetID, }, ) require.NoError(err) - tx, err := walletsigner.SignUnsigned(context.Background(), signer, utx) - require.NoError(err) addSubnetValTx := subnetTx.Unsigned.(*txs.AddSubnetValidatorTx) staker, err = state.NewCurrentStaker( @@ -816,26 +811,25 @@ func TestProposalTxExecuteAddValidator(t *testing.T) { nodeID := ids.GenerateTestNodeID() chainTime := env.state.GetTimestamp() + rewardsOwner := &secp256k1fx.OutputOwners{ + Threshold: 1, + Addrs: []ids.ShortID{ids.GenerateTestShortID()}, + } { // Case: Validator's start time too early - builder, signer := env.factory.NewWallet(genesistest.DefaultFundedKeys[0]) - utx, err := builder.NewAddValidatorTx( + wallet := newWallet(t, env, walletConfig{}) + tx, err := wallet.IssueAddValidatorTx( &txs.Validator{ NodeID: nodeID, Start: uint64(chainTime.Unix()), End: genesistest.DefaultValidatorEndTimeUnix, Wght: env.config.MinValidatorStake, }, - &secp256k1fx.OutputOwners{ - Threshold: 1, - Addrs: []ids.ShortID{ids.GenerateTestShortID()}, - }, + rewardsOwner, reward.PercentDenominator, ) require.NoError(err) - tx, err := walletsigner.SignUnsigned(context.Background(), signer, utx) - require.NoError(err) onCommitState, err := state.NewDiff(lastAcceptedID, env) require.NoError(err) @@ -859,23 +853,18 @@ func TestProposalTxExecuteAddValidator(t *testing.T) { nodeID := genesistest.DefaultNodeIDs[0] // Case: Validator already validating primary network - builder, signer := env.factory.NewWallet(genesistest.DefaultFundedKeys[0]) - utx, err := builder.NewAddValidatorTx( + wallet := newWallet(t, env, walletConfig{}) + tx, err := wallet.IssueAddValidatorTx( &txs.Validator{ NodeID: nodeID, Start: genesistest.DefaultValidatorStartTimeUnix + 1, End: genesistest.DefaultValidatorEndTimeUnix, Wght: env.config.MinValidatorStake, }, - &secp256k1fx.OutputOwners{ - Threshold: 1, - Addrs: []ids.ShortID{ids.GenerateTestShortID()}, - }, + rewardsOwner, reward.PercentDenominator, ) require.NoError(err) - tx, err := walletsigner.SignUnsigned(context.Background(), signer, utx) - require.NoError(err) onCommitState, err := state.NewDiff(lastAcceptedID, env) require.NoError(err) @@ -898,23 +887,18 @@ func TestProposalTxExecuteAddValidator(t *testing.T) { { // Case: Validator in pending validator set of primary network startTime := genesistest.DefaultValidatorStartTime.Add(1 * time.Second) - builder, signer := env.factory.NewWallet(genesistest.DefaultFundedKeys[0]) - utx, err := builder.NewAddValidatorTx( + wallet := newWallet(t, env, walletConfig{}) + tx, err := wallet.IssueAddValidatorTx( &txs.Validator{ NodeID: nodeID, Start: uint64(startTime.Unix()), End: uint64(startTime.Add(defaultMinStakingDuration).Unix()), Wght: env.config.MinValidatorStake, }, - &secp256k1fx.OutputOwners{ - Threshold: 1, - Addrs: []ids.ShortID{ids.GenerateTestShortID()}, - }, + rewardsOwner, reward.PercentDenominator, ) require.NoError(err) - tx, err := walletsigner.SignUnsigned(context.Background(), signer, utx) - require.NoError(err) addValTx := tx.Unsigned.(*txs.AddValidatorTx) staker, err := state.NewCurrentStaker( @@ -951,23 +935,20 @@ func TestProposalTxExecuteAddValidator(t *testing.T) { { // Case: Validator doesn't have enough tokens to cover stake amount - builder, signer := env.factory.NewWallet(genesistest.DefaultFundedKeys[0]) - utx, err := builder.NewAddValidatorTx( + wallet := newWallet(t, env, walletConfig{ + keys: genesistest.DefaultFundedKeys[:1], + }) + tx, err := wallet.IssueAddValidatorTx( &txs.Validator{ NodeID: ids.GenerateTestNodeID(), Start: genesistest.DefaultValidatorStartTimeUnix + 1, End: genesistest.DefaultValidatorEndTimeUnix, Wght: env.config.MinValidatorStake, }, - &secp256k1fx.OutputOwners{ - Threshold: 1, - Addrs: []ids.ShortID{ids.GenerateTestShortID()}, - }, + rewardsOwner, reward.PercentDenominator, ) require.NoError(err) - tx, err := walletsigner.SignUnsigned(context.Background(), signer, utx) - require.NoError(err) // Remove all UTXOs owned by preFundedKeys[0] utxoIDs, err := env.state.UTXOIDs(genesistest.DefaultFundedKeys[0].Address().Bytes(), ids.Empty, math.MaxInt32) diff --git a/vms/platformvm/txs/executor/reward_validator_test.go b/vms/platformvm/txs/executor/reward_validator_test.go index 27dd9d30493..55f210ebc95 100644 --- a/vms/platformvm/txs/executor/reward_validator_test.go +++ b/vms/platformvm/txs/executor/reward_validator_test.go @@ -4,7 +4,6 @@ package executor import ( - "context" "testing" "time" @@ -24,8 +23,6 @@ import ( "github.com/ava-labs/avalanchego/vms/platformvm/status" "github.com/ava-labs/avalanchego/vms/platformvm/txs" "github.com/ava-labs/avalanchego/vms/secp256k1fx" - - walletsigner "github.com/ava-labs/avalanchego/wallet/chain/p/signer" ) func newRewardValidatorTx(t testing.TB, txID ids.ID) (*txs.Tx, error) { @@ -244,6 +241,8 @@ func TestRewardDelegatorTxExecuteOnCommitPreDelegateeDeferral(t *testing.T) { env := newEnvironment(t, upgradetest.ApricotPhase5) dummyHeight := uint64(1) + wallet := newWallet(t, env, walletConfig{}) + vdrRewardAddress := ids.GenerateTestShortID() delRewardAddress := ids.GenerateTestShortID() @@ -251,8 +250,7 @@ func TestRewardDelegatorTxExecuteOnCommitPreDelegateeDeferral(t *testing.T) { vdrEndTime := uint64(genesistest.DefaultValidatorStartTime.Add(2 * defaultMinStakingDuration).Unix()) vdrNodeID := ids.GenerateTestNodeID() - builder, signer := env.factory.NewWallet(genesistest.DefaultFundedKeys[0]) - uVdrTx, err := builder.NewAddValidatorTx( + vdrTx, err := wallet.IssueAddValidatorTx( &txs.Validator{ NodeID: vdrNodeID, Start: vdrStartTime, @@ -266,13 +264,11 @@ func TestRewardDelegatorTxExecuteOnCommitPreDelegateeDeferral(t *testing.T) { reward.PercentDenominator/4, ) require.NoError(err) - vdrTx, err := walletsigner.SignUnsigned(context.Background(), signer, uVdrTx) - require.NoError(err) delStartTime := vdrStartTime delEndTime := vdrEndTime - uDelTx, err := builder.NewAddDelegatorTx( + delTx, err := wallet.IssueAddDelegatorTx( &txs.Validator{ NodeID: vdrNodeID, Start: delStartTime, @@ -285,8 +281,6 @@ func TestRewardDelegatorTxExecuteOnCommitPreDelegateeDeferral(t *testing.T) { }, ) require.NoError(err) - delTx, err := walletsigner.SignUnsigned(context.Background(), signer, uDelTx) - require.NoError(err) addValTx := vdrTx.Unsigned.(*txs.AddValidatorTx) vdrStaker, err := state.NewCurrentStaker( @@ -378,6 +372,8 @@ func TestRewardDelegatorTxExecuteOnCommitPostDelegateeDeferral(t *testing.T) { env := newEnvironment(t, upgradetest.Cortina) dummyHeight := uint64(1) + wallet := newWallet(t, env, walletConfig{}) + vdrRewardAddress := ids.GenerateTestShortID() delRewardAddress := ids.GenerateTestShortID() @@ -385,8 +381,7 @@ func TestRewardDelegatorTxExecuteOnCommitPostDelegateeDeferral(t *testing.T) { vdrEndTime := uint64(genesistest.DefaultValidatorStartTime.Add(2 * defaultMinStakingDuration).Unix()) vdrNodeID := ids.GenerateTestNodeID() - builder, signer := env.factory.NewWallet(genesistest.DefaultFundedKeys[0]) - uVdrTx, err := builder.NewAddValidatorTx( + vdrTx, err := wallet.IssueAddValidatorTx( &txs.Validator{ NodeID: vdrNodeID, Start: vdrStartTime, @@ -400,13 +395,11 @@ func TestRewardDelegatorTxExecuteOnCommitPostDelegateeDeferral(t *testing.T) { reward.PercentDenominator/4, ) require.NoError(err) - vdrTx, err := walletsigner.SignUnsigned(context.Background(), signer, uVdrTx) - require.NoError(err) delStartTime := vdrStartTime delEndTime := vdrEndTime - uDelTx, err := builder.NewAddDelegatorTx( + delTx, err := wallet.IssueAddDelegatorTx( &txs.Validator{ NodeID: vdrNodeID, Start: delStartTime, @@ -419,8 +412,6 @@ func TestRewardDelegatorTxExecuteOnCommitPostDelegateeDeferral(t *testing.T) { }, ) require.NoError(err) - delTx, err := walletsigner.SignUnsigned(context.Background(), signer, uDelTx) - require.NoError(err) addValTx := vdrTx.Unsigned.(*txs.AddValidatorTx) vdrRewardAmt := uint64(2000000) @@ -608,6 +599,8 @@ func TestRewardDelegatorTxAndValidatorTxExecuteOnCommitPostDelegateeDeferral(t * env := newEnvironment(t, upgradetest.Cortina) dummyHeight := uint64(1) + wallet := newWallet(t, env, walletConfig{}) + vdrRewardAddress := ids.GenerateTestShortID() delRewardAddress := ids.GenerateTestShortID() @@ -615,8 +608,7 @@ func TestRewardDelegatorTxAndValidatorTxExecuteOnCommitPostDelegateeDeferral(t * vdrEndTime := uint64(genesistest.DefaultValidatorStartTime.Add(2 * defaultMinStakingDuration).Unix()) vdrNodeID := ids.GenerateTestNodeID() - builder, signer := env.factory.NewWallet(genesistest.DefaultFundedKeys[0]) - uVdrTx, err := builder.NewAddValidatorTx( + vdrTx, err := wallet.IssueAddValidatorTx( &txs.Validator{ NodeID: vdrNodeID, Start: vdrStartTime, @@ -630,13 +622,11 @@ func TestRewardDelegatorTxAndValidatorTxExecuteOnCommitPostDelegateeDeferral(t * reward.PercentDenominator/4, ) require.NoError(err) - vdrTx, err := walletsigner.SignUnsigned(context.Background(), signer, uVdrTx) - require.NoError(err) delStartTime := vdrStartTime delEndTime := vdrEndTime - uDelTx, err := builder.NewAddDelegatorTx( + delTx, err := wallet.IssueAddDelegatorTx( &txs.Validator{ NodeID: vdrNodeID, Start: delStartTime, @@ -649,8 +639,6 @@ func TestRewardDelegatorTxAndValidatorTxExecuteOnCommitPostDelegateeDeferral(t * }, ) require.NoError(err) - delTx, err := walletsigner.SignUnsigned(context.Background(), signer, uDelTx) - require.NoError(err) addValTx := vdrTx.Unsigned.(*txs.AddValidatorTx) vdrRewardAmt := uint64(2000000) @@ -781,6 +769,8 @@ func TestRewardDelegatorTxExecuteOnAbort(t *testing.T) { env := newEnvironment(t, upgradetest.ApricotPhase5) dummyHeight := uint64(1) + wallet := newWallet(t, env, walletConfig{}) + initialSupply, err := env.state.GetCurrentSupply(constants.PrimaryNetworkID) require.NoError(err) @@ -791,8 +781,7 @@ func TestRewardDelegatorTxExecuteOnAbort(t *testing.T) { vdrEndTime := uint64(genesistest.DefaultValidatorStartTime.Add(2 * defaultMinStakingDuration).Unix()) vdrNodeID := ids.GenerateTestNodeID() - builder, signer := env.factory.NewWallet(genesistest.DefaultFundedKeys[0]) - uVdrTx, err := builder.NewAddValidatorTx( + vdrTx, err := wallet.IssueAddValidatorTx( &txs.Validator{ NodeID: vdrNodeID, Start: vdrStartTime, @@ -806,13 +795,11 @@ func TestRewardDelegatorTxExecuteOnAbort(t *testing.T) { reward.PercentDenominator/4, ) require.NoError(err) - vdrTx, err := walletsigner.SignUnsigned(context.Background(), signer, uVdrTx) - require.NoError(err) delStartTime := vdrStartTime delEndTime := vdrEndTime - uDelTx, err := builder.NewAddDelegatorTx( + delTx, err := wallet.IssueAddDelegatorTx( &txs.Validator{ NodeID: vdrNodeID, Start: delStartTime, @@ -825,8 +812,6 @@ func TestRewardDelegatorTxExecuteOnAbort(t *testing.T) { }, ) require.NoError(err) - delTx, err := walletsigner.SignUnsigned(context.Background(), signer, uDelTx) - require.NoError(err) addValTx := vdrTx.Unsigned.(*txs.AddValidatorTx) vdrStaker, err := state.NewCurrentStaker( diff --git a/vms/platformvm/txs/executor/standard_tx_executor_test.go b/vms/platformvm/txs/executor/standard_tx_executor_test.go index d0652e6bd41..2b01148a7f7 100644 --- a/vms/platformvm/txs/executor/standard_tx_executor_test.go +++ b/vms/platformvm/txs/executor/standard_tx_executor_test.go @@ -4,7 +4,6 @@ package executor import ( - "context" "errors" "math" "math/rand" @@ -37,8 +36,6 @@ import ( "github.com/ava-labs/avalanchego/vms/platformvm/utxo/utxomock" "github.com/ava-labs/avalanchego/vms/secp256k1fx" "github.com/ava-labs/avalanchego/wallet/subnet/primary/common" - - walletsigner "github.com/ava-labs/avalanchego/wallet/chain/p/signer" ) // This tests that the math performed during TransformSubnetTx execution can @@ -57,28 +54,25 @@ func TestStandardTxExecutorAddValidatorTxEmptyID(t *testing.T) { startTime := genesistest.DefaultValidatorStartTime.Add(1 * time.Second) tests := []struct { - banffTime time.Time - expectedError error + banffTime time.Time }{ { // Case: Before banff - banffTime: chainTime.Add(1), - expectedError: errEmptyNodeID, + banffTime: chainTime.Add(1), }, { // Case: At banff - banffTime: chainTime, - expectedError: errEmptyNodeID, + banffTime: chainTime, }, { // Case: After banff - banffTime: chainTime.Add(-1), - expectedError: errEmptyNodeID, + banffTime: chainTime.Add(-1), }, } for _, test := range tests { // Case: Empty validator node ID after banff env.config.UpgradeConfig.BanffTime = test.banffTime - builder, signer := env.factory.NewWallet(genesistest.DefaultFundedKeys[0]) - utx, err := builder.NewAddValidatorTx( + wallet := newWallet(t, env, walletConfig{}) + + tx, err := wallet.IssueAddValidatorTx( &txs.Validator{ NodeID: ids.EmptyNodeID, Start: uint64(startTime.Unix()), @@ -92,8 +86,6 @@ func TestStandardTxExecutorAddValidatorTxEmptyID(t *testing.T) { reward.PercentDenominator, ) require.NoError(err) - tx, err := walletsigner.SignUnsigned(context.Background(), signer, utx) - require.NoError(err) stateDiff, err := state.NewDiff(lastAcceptedID, env) require.NoError(err) @@ -106,13 +98,16 @@ func TestStandardTxExecutorAddValidatorTxEmptyID(t *testing.T) { Tx: tx, } err = tx.Unsigned.Visit(&executor) - require.ErrorIs(err, test.expectedError) + require.ErrorIs(err, errEmptyNodeID) } } func TestStandardTxExecutorAddDelegator(t *testing.T) { dummyHeight := uint64(1) - rewardAddress := genesistest.DefaultFundedKeys[0].Address() + rewardsOwner := &secp256k1fx.OutputOwners{ + Threshold: 1, + Addrs: []ids.ShortID{ids.GenerateTestShortID()}, + } nodeID := genesistest.DefaultNodeIDs[0] newValidatorID := ids.GenerateTestNodeID() @@ -124,23 +119,20 @@ func TestStandardTxExecutorAddDelegator(t *testing.T) { addMinStakeValidator := func(env *environment) { require := require.New(t) - builder, signer := env.factory.NewWallet(genesistest.DefaultFundedKeys[0]) - utx, err := builder.NewAddValidatorTx( + wallet := newWallet(t, env, walletConfig{ + keys: genesistest.DefaultFundedKeys[:1], + }) + tx, err := wallet.IssueAddValidatorTx( &txs.Validator{ NodeID: newValidatorID, Start: uint64(newValidatorStartTime.Unix()), End: uint64(newValidatorEndTime.Unix()), Wght: env.config.MinValidatorStake, }, - &secp256k1fx.OutputOwners{ - Threshold: 1, - Addrs: []ids.ShortID{rewardAddress}, - }, + rewardsOwner, reward.PercentDenominator, ) require.NoError(err) - tx, err := walletsigner.SignUnsigned(context.Background(), signer, utx) - require.NoError(err) addValTx := tx.Unsigned.(*txs.AddValidatorTx) staker, err := state.NewCurrentStaker( @@ -162,23 +154,20 @@ func TestStandardTxExecutorAddDelegator(t *testing.T) { addMaxStakeValidator := func(env *environment) { require := require.New(t) - builder, signer := env.factory.NewWallet(genesistest.DefaultFundedKeys[0]) - utx, err := builder.NewAddValidatorTx( + wallet := newWallet(t, env, walletConfig{ + keys: genesistest.DefaultFundedKeys[:1], + }) + tx, err := wallet.IssueAddValidatorTx( &txs.Validator{ NodeID: newValidatorID, Start: uint64(newValidatorStartTime.Unix()), End: uint64(newValidatorEndTime.Unix()), Wght: env.config.MaxValidatorStake, }, - &secp256k1fx.OutputOwners{ - Threshold: 1, - Addrs: []ids.ShortID{rewardAddress}, - }, + rewardsOwner, reward.PercentDenominator, ) require.NoError(err) - tx, err := walletsigner.SignUnsigned(context.Background(), signer, utx) - require.NoError(err) addValTx := tx.Unsigned.(*txs.AddValidatorTx) staker, err := state.NewCurrentStaker( @@ -330,22 +319,19 @@ func TestStandardTxExecutorAddDelegator(t *testing.T) { env := newEnvironment(t, upgradetest.ApricotPhase5) env.config.UpgradeConfig.ApricotPhase3Time = tt.AP3Time - builder, signer := env.factory.NewWallet(tt.feeKeys...) - utx, err := builder.NewAddDelegatorTx( + wallet := newWallet(t, env, walletConfig{ + keys: tt.feeKeys, + }) + tx, err := wallet.IssueAddDelegatorTx( &txs.Validator{ NodeID: tt.nodeID, Start: uint64(tt.startTime.Unix()), End: uint64(tt.endTime.Unix()), Wght: tt.stakeAmount, }, - &secp256k1fx.OutputOwners{ - Threshold: 1, - Addrs: []ids.ShortID{rewardAddress}, - }, + rewardsOwner, ) require.NoError(err) - tx, err := walletsigner.SignUnsigned(context.Background(), signer, utx) - require.NoError(err) if tt.setup != nil { tt.setup(env) @@ -376,14 +362,18 @@ func TestApricotStandardTxExecutorAddSubnetValidator(t *testing.T) { defer env.ctx.Lock.Unlock() nodeID := genesistest.DefaultNodeIDs[0] + subnetID := testSubnet1.ID() { // Case: Proposed validator currently validating primary network // but stops validating subnet after stops validating primary network // (note that keys[0] is a genesis validator) startTime := genesistest.DefaultValidatorStartTime.Add(time.Second) - builder, signer := env.factory.NewWallet(testSubnet1ControlKeys[0], testSubnet1ControlKeys[1]) - utx, err := builder.NewAddSubnetValidatorTx( + + wallet := newWallet(t, env, walletConfig{ + subnetIDs: []ids.ID{subnetID}, + }) + tx, err := wallet.IssueAddSubnetValidatorTx( &txs.SubnetValidator{ Validator: txs.Validator{ NodeID: nodeID, @@ -391,12 +381,10 @@ func TestApricotStandardTxExecutorAddSubnetValidator(t *testing.T) { End: genesistest.DefaultValidatorEndTimeUnix + 1, Wght: genesistest.DefaultValidatorWeight, }, - Subnet: testSubnet1.ID(), + Subnet: subnetID, }, ) require.NoError(err) - tx, err := walletsigner.SignUnsigned(context.Background(), signer, utx) - require.NoError(err) onAcceptState, err := state.NewDiff(lastAcceptedID, env) require.NoError(err) @@ -417,8 +405,10 @@ func TestApricotStandardTxExecutorAddSubnetValidator(t *testing.T) { // and proposed subnet validation period is subset of // primary network validation period // (note that keys[0] is a genesis validator) - builder, signer := env.factory.NewWallet(testSubnet1ControlKeys[0], testSubnet1ControlKeys[1]) - utx, err := builder.NewAddSubnetValidatorTx( + wallet := newWallet(t, env, walletConfig{ + subnetIDs: []ids.ID{subnetID}, + }) + tx, err := wallet.IssueAddSubnetValidatorTx( &txs.SubnetValidator{ Validator: txs.Validator{ NodeID: nodeID, @@ -426,12 +416,10 @@ func TestApricotStandardTxExecutorAddSubnetValidator(t *testing.T) { End: genesistest.DefaultValidatorEndTimeUnix, Wght: genesistest.DefaultValidatorWeight, }, - Subnet: testSubnet1.ID(), + Subnet: subnetID, }, ) require.NoError(err) - tx, err := walletsigner.SignUnsigned(context.Background(), signer, utx) - require.NoError(err) onAcceptState, err := state.NewDiff(lastAcceptedID, env) require.NoError(err) @@ -452,8 +440,8 @@ func TestApricotStandardTxExecutorAddSubnetValidator(t *testing.T) { dsStartTime := genesistest.DefaultValidatorStartTime.Add(10 * time.Second) dsEndTime := dsStartTime.Add(5 * defaultMinStakingDuration) - builder, signer := env.factory.NewWallet(genesistest.DefaultFundedKeys[0]) - utx, err := builder.NewAddValidatorTx( + wallet := newWallet(t, env, walletConfig{}) + addDSTx, err := wallet.IssueAddValidatorTx( &txs.Validator{ NodeID: pendingDSValidatorID, Start: uint64(dsStartTime.Unix()), @@ -467,13 +455,13 @@ func TestApricotStandardTxExecutorAddSubnetValidator(t *testing.T) { reward.PercentDenominator, ) require.NoError(err) - addDSTx, err := walletsigner.SignUnsigned(context.Background(), signer, utx) - require.NoError(err) { // Case: Proposed validator isn't in pending or current validator sets - builder, signer := env.factory.NewWallet(testSubnet1ControlKeys[0], testSubnet1ControlKeys[1]) - utx, err := builder.NewAddSubnetValidatorTx( + wallet := newWallet(t, env, walletConfig{ + subnetIDs: []ids.ID{subnetID}, + }) + tx, err := wallet.IssueAddSubnetValidatorTx( &txs.SubnetValidator{ Validator: txs.Validator{ NodeID: pendingDSValidatorID, @@ -481,12 +469,10 @@ func TestApricotStandardTxExecutorAddSubnetValidator(t *testing.T) { End: uint64(dsEndTime.Unix()), Wght: genesistest.DefaultValidatorWeight, }, - Subnet: testSubnet1.ID(), + Subnet: subnetID, }, ) require.NoError(err) - tx, err := walletsigner.SignUnsigned(context.Background(), signer, utx) - require.NoError(err) onAcceptState, err := state.NewDiff(lastAcceptedID, env) require.NoError(err) @@ -522,8 +508,10 @@ func TestApricotStandardTxExecutorAddSubnetValidator(t *testing.T) { { // Case: Proposed validator is pending validator of primary network // but starts validating subnet before primary network - builder, signer := env.factory.NewWallet(testSubnet1ControlKeys[0], testSubnet1ControlKeys[1]) - utx, err := builder.NewAddSubnetValidatorTx( + wallet := newWallet(t, env, walletConfig{ + subnetIDs: []ids.ID{subnetID}, + }) + tx, err := wallet.IssueAddSubnetValidatorTx( &txs.SubnetValidator{ Validator: txs.Validator{ NodeID: pendingDSValidatorID, @@ -531,12 +519,10 @@ func TestApricotStandardTxExecutorAddSubnetValidator(t *testing.T) { End: uint64(dsEndTime.Unix()), Wght: genesistest.DefaultValidatorWeight, }, - Subnet: testSubnet1.ID(), + Subnet: subnetID, }, ) require.NoError(err) - tx, err := walletsigner.SignUnsigned(context.Background(), signer, utx) - require.NoError(err) onAcceptState, err := state.NewDiff(lastAcceptedID, env) require.NoError(err) @@ -555,8 +541,10 @@ func TestApricotStandardTxExecutorAddSubnetValidator(t *testing.T) { { // Case: Proposed validator is pending validator of primary network // but stops validating subnet after primary network - builder, signer := env.factory.NewWallet(testSubnet1ControlKeys[0], testSubnet1ControlKeys[1]) - utx, err := builder.NewAddSubnetValidatorTx( + wallet := newWallet(t, env, walletConfig{ + subnetIDs: []ids.ID{subnetID}, + }) + tx, err := wallet.IssueAddSubnetValidatorTx( &txs.SubnetValidator{ Validator: txs.Validator{ NodeID: pendingDSValidatorID, @@ -564,12 +552,10 @@ func TestApricotStandardTxExecutorAddSubnetValidator(t *testing.T) { End: uint64(dsEndTime.Unix()) + 1, // stop validating subnet after stopping validating primary network Wght: genesistest.DefaultValidatorWeight, }, - Subnet: testSubnet1.ID(), + Subnet: subnetID, }, ) require.NoError(err) - tx, err := walletsigner.SignUnsigned(context.Background(), signer, utx) - require.NoError(err) onAcceptState, err := state.NewDiff(lastAcceptedID, env) require.NoError(err) @@ -588,8 +574,10 @@ func TestApricotStandardTxExecutorAddSubnetValidator(t *testing.T) { { // Case: Proposed validator is pending validator of primary network and // period validating subnet is subset of time validating primary network - builder, signer := env.factory.NewWallet(testSubnet1ControlKeys[0], testSubnet1ControlKeys[1]) - utx, err := builder.NewAddSubnetValidatorTx( + wallet := newWallet(t, env, walletConfig{ + subnetIDs: []ids.ID{subnetID}, + }) + tx, err := wallet.IssueAddSubnetValidatorTx( &txs.SubnetValidator{ Validator: txs.Validator{ NodeID: pendingDSValidatorID, @@ -597,12 +585,10 @@ func TestApricotStandardTxExecutorAddSubnetValidator(t *testing.T) { End: uint64(dsEndTime.Unix()), // same end time as for primary network Wght: genesistest.DefaultValidatorWeight, }, - Subnet: testSubnet1.ID(), + Subnet: subnetID, }, ) require.NoError(err) - tx, err := walletsigner.SignUnsigned(context.Background(), signer, utx) - require.NoError(err) onAcceptState, err := state.NewDiff(lastAcceptedID, env) require.NoError(err) @@ -623,8 +609,10 @@ func TestApricotStandardTxExecutorAddSubnetValidator(t *testing.T) { env.state.SetTimestamp(newTimestamp) { - builder, signer := env.factory.NewWallet(testSubnet1ControlKeys[0], testSubnet1ControlKeys[1]) - utx, err := builder.NewAddSubnetValidatorTx( + wallet := newWallet(t, env, walletConfig{ + subnetIDs: []ids.ID{subnetID}, + }) + tx, err := wallet.IssueAddSubnetValidatorTx( &txs.SubnetValidator{ Validator: txs.Validator{ NodeID: nodeID, @@ -632,12 +620,10 @@ func TestApricotStandardTxExecutorAddSubnetValidator(t *testing.T) { End: uint64(newTimestamp.Add(defaultMinStakingDuration).Unix()), Wght: genesistest.DefaultValidatorWeight, }, - Subnet: testSubnet1.ID(), + Subnet: subnetID, }, ) require.NoError(err) - tx, err := walletsigner.SignUnsigned(context.Background(), signer, utx) - require.NoError(err) onAcceptState, err := state.NewDiff(lastAcceptedID, env) require.NoError(err) @@ -658,8 +644,10 @@ func TestApricotStandardTxExecutorAddSubnetValidator(t *testing.T) { // Case: Proposed validator already validating the subnet // First, add validator as validator of subnet - builder, signer = env.factory.NewWallet(testSubnet1ControlKeys[0], testSubnet1ControlKeys[1]) - uSubnetTx, err := builder.NewAddSubnetValidatorTx( + wallet = newWallet(t, env, walletConfig{ + subnetIDs: []ids.ID{subnetID}, + }) + subnetTx, err := wallet.IssueAddSubnetValidatorTx( &txs.SubnetValidator{ Validator: txs.Validator{ NodeID: nodeID, @@ -667,12 +655,10 @@ func TestApricotStandardTxExecutorAddSubnetValidator(t *testing.T) { End: genesistest.DefaultValidatorEndTimeUnix, Wght: genesistest.DefaultValidatorWeight, }, - Subnet: testSubnet1.ID(), + Subnet: subnetID, }, ) require.NoError(err) - subnetTx, err := walletsigner.SignUnsigned(context.Background(), signer, uSubnetTx) - require.NoError(err) addSubnetValTx := subnetTx.Unsigned.(*txs.AddSubnetValidatorTx) staker, err = state.NewCurrentStaker( @@ -691,8 +677,10 @@ func TestApricotStandardTxExecutorAddSubnetValidator(t *testing.T) { { // Node with ID nodeIDKey.Address() now validating subnet with ID testSubnet1.ID startTime := genesistest.DefaultValidatorStartTime.Add(time.Second) - builder, signer := env.factory.NewWallet(testSubnet1ControlKeys[0], testSubnet1ControlKeys[1]) - utx, err := builder.NewAddSubnetValidatorTx( + wallet := newWallet(t, env, walletConfig{ + subnetIDs: []ids.ID{subnetID}, + }) + tx, err := wallet.IssueAddSubnetValidatorTx( &txs.SubnetValidator{ Validator: txs.Validator{ NodeID: nodeID, @@ -700,12 +688,10 @@ func TestApricotStandardTxExecutorAddSubnetValidator(t *testing.T) { End: genesistest.DefaultValidatorEndTimeUnix, Wght: genesistest.DefaultValidatorWeight, }, - Subnet: testSubnet1.ID(), + Subnet: subnetID, }, ) require.NoError(err) - tx, err := walletsigner.SignUnsigned(context.Background(), signer, utx) - require.NoError(err) onAcceptState, err := state.NewDiff(lastAcceptedID, env) require.NoError(err) @@ -728,8 +714,10 @@ func TestApricotStandardTxExecutorAddSubnetValidator(t *testing.T) { { // Case: Duplicate signatures startTime := genesistest.DefaultValidatorStartTime.Add(time.Second) - builder, signer := env.factory.NewWallet(testSubnet1ControlKeys[0], testSubnet1ControlKeys[1], testSubnet1ControlKeys[2]) - utx, err := builder.NewAddSubnetValidatorTx( + wallet := newWallet(t, env, walletConfig{ + subnetIDs: []ids.ID{subnetID}, + }) + tx, err := wallet.IssueAddSubnetValidatorTx( &txs.SubnetValidator{ Validator: txs.Validator{ NodeID: nodeID, @@ -737,12 +725,10 @@ func TestApricotStandardTxExecutorAddSubnetValidator(t *testing.T) { End: uint64(startTime.Add(defaultMinStakingDuration).Unix()) + 1, Wght: genesistest.DefaultValidatorWeight, }, - Subnet: testSubnet1.ID(), + Subnet: subnetID, }, ) require.NoError(err) - tx, err := walletsigner.SignUnsigned(context.Background(), signer, utx) - require.NoError(err) // Duplicate a signature addSubnetValidatorTx := tx.Unsigned.(*txs.AddSubnetValidatorTx) @@ -768,8 +754,10 @@ func TestApricotStandardTxExecutorAddSubnetValidator(t *testing.T) { { // Case: Too few signatures startTime := genesistest.DefaultValidatorStartTime.Add(time.Second) - builder, signer := env.factory.NewWallet(testSubnet1ControlKeys[0], testSubnet1ControlKeys[2]) - utx, err := builder.NewAddSubnetValidatorTx( + wallet := newWallet(t, env, walletConfig{ + subnetIDs: []ids.ID{subnetID}, + }) + tx, err := wallet.IssueAddSubnetValidatorTx( &txs.SubnetValidator{ Validator: txs.Validator{ NodeID: nodeID, @@ -777,12 +765,10 @@ func TestApricotStandardTxExecutorAddSubnetValidator(t *testing.T) { End: uint64(startTime.Add(defaultMinStakingDuration).Unix()), Wght: genesistest.DefaultValidatorWeight, }, - Subnet: testSubnet1.ID(), + Subnet: subnetID, }, ) require.NoError(err) - tx, err := walletsigner.SignUnsigned(context.Background(), signer, utx) - require.NoError(err) // Remove a signature addSubnetValidatorTx := tx.Unsigned.(*txs.AddSubnetValidatorTx) @@ -808,8 +794,10 @@ func TestApricotStandardTxExecutorAddSubnetValidator(t *testing.T) { { // Case: Control Signature from invalid key (keys[3] is not a control key) startTime := genesistest.DefaultValidatorStartTime.Add(time.Second) - builder, signer := env.factory.NewWallet(testSubnet1ControlKeys[0], genesistest.DefaultFundedKeys[1]) - utx, err := builder.NewAddSubnetValidatorTx( + wallet := newWallet(t, env, walletConfig{ + subnetIDs: []ids.ID{subnetID}, + }) + tx, err := wallet.IssueAddSubnetValidatorTx( &txs.SubnetValidator{ Validator: txs.Validator{ NodeID: nodeID, @@ -817,12 +805,10 @@ func TestApricotStandardTxExecutorAddSubnetValidator(t *testing.T) { End: uint64(startTime.Add(defaultMinStakingDuration).Unix()), Wght: genesistest.DefaultValidatorWeight, }, - Subnet: testSubnet1.ID(), + Subnet: subnetID, }, ) require.NoError(err) - tx, err := walletsigner.SignUnsigned(context.Background(), signer, utx) - require.NoError(err) // Replace a valid signature with one from keys[3] sig, err := genesistest.DefaultFundedKeys[3].SignHash(hashing.ComputeHash256(tx.Unsigned.Bytes())) @@ -847,8 +833,10 @@ func TestApricotStandardTxExecutorAddSubnetValidator(t *testing.T) { // Case: Proposed validator in pending validator set for subnet // First, add validator to pending validator set of subnet startTime := genesistest.DefaultValidatorStartTime.Add(time.Second) - builder, signer := env.factory.NewWallet(testSubnet1ControlKeys[0], testSubnet1ControlKeys[1]) - utx, err := builder.NewAddSubnetValidatorTx( + wallet := newWallet(t, env, walletConfig{ + subnetIDs: []ids.ID{subnetID}, + }) + tx, err := wallet.IssueAddSubnetValidatorTx( &txs.SubnetValidator{ Validator: txs.Validator{ NodeID: nodeID, @@ -856,12 +844,10 @@ func TestApricotStandardTxExecutorAddSubnetValidator(t *testing.T) { End: uint64(startTime.Add(defaultMinStakingDuration).Unix()) + 1, Wght: genesistest.DefaultValidatorWeight, }, - Subnet: testSubnet1.ID(), + Subnet: subnetID, }, ) require.NoError(err) - tx, err := walletsigner.SignUnsigned(context.Background(), signer, utx) - require.NoError(err) addSubnetValTx := subnetTx.Unsigned.(*txs.AddSubnetValidatorTx) staker, err = state.NewCurrentStaker( @@ -899,9 +885,12 @@ func TestEtnaStandardTxExecutorAddSubnetValidator(t *testing.T) { defer env.ctx.Lock.Unlock() nodeID := genesistest.DefaultNodeIDs[0] + subnetID := testSubnet1.ID() - builder, signer := env.factory.NewWallet(testSubnet1ControlKeys[0], testSubnet1ControlKeys[1]) - utx, err := builder.NewAddSubnetValidatorTx( + wallet := newWallet(t, env, walletConfig{ + subnetIDs: []ids.ID{subnetID}, + }) + tx, err := wallet.IssueAddSubnetValidatorTx( &txs.SubnetValidator{ Validator: txs.Validator{ NodeID: nodeID, @@ -909,17 +898,15 @@ func TestEtnaStandardTxExecutorAddSubnetValidator(t *testing.T) { End: genesistest.DefaultValidatorEndTimeUnix, Wght: genesistest.DefaultValidatorWeight, }, - Subnet: testSubnet1.ID(), + Subnet: subnetID, }, ) require.NoError(err) - tx, err := walletsigner.SignUnsigned(context.Background(), signer, utx) - require.NoError(err) onAcceptState, err := state.NewDiff(lastAcceptedID, env) require.NoError(err) - onAcceptState.SetSubnetManager(testSubnet1.ID(), ids.GenerateTestID(), []byte{'a', 'd', 'd', 'r', 'e', 's', 's'}) + onAcceptState.SetSubnetManager(subnetID, ids.GenerateTestID(), []byte{'a', 'd', 'd', 'r', 'e', 's', 's'}) executor := StandardTxExecutor{ Backend: &env.backend, @@ -937,26 +924,25 @@ func TestBanffStandardTxExecutorAddValidator(t *testing.T) { defer env.ctx.Lock.Unlock() nodeID := ids.GenerateTestNodeID() + rewardsOwner := &secp256k1fx.OutputOwners{ + Threshold: 1, + Addrs: []ids.ShortID{ids.GenerateTestShortID()}, + } { // Case: Validator's start time too early - builder, signer := env.factory.NewWallet(genesistest.DefaultFundedKeys[0]) - utx, err := builder.NewAddValidatorTx( + wallet := newWallet(t, env, walletConfig{}) + tx, err := wallet.IssueAddValidatorTx( &txs.Validator{ NodeID: nodeID, Start: genesistest.DefaultValidatorStartTimeUnix - 1, End: genesistest.DefaultValidatorEndTimeUnix, Wght: env.config.MinValidatorStake, }, - &secp256k1fx.OutputOwners{ - Threshold: 1, - Addrs: []ids.ShortID{ids.ShortEmpty}, - }, + rewardsOwner, reward.PercentDenominator, ) require.NoError(err) - tx, err := walletsigner.SignUnsigned(context.Background(), signer, utx) - require.NoError(err) onAcceptState, err := state.NewDiff(lastAcceptedID, env) require.NoError(err) @@ -974,24 +960,20 @@ func TestBanffStandardTxExecutorAddValidator(t *testing.T) { { // Case: Validator in current validator set of primary network + wallet := newWallet(t, env, walletConfig{}) + startTime := genesistest.DefaultValidatorStartTime.Add(1 * time.Second) - builder, signer := env.factory.NewWallet(genesistest.DefaultFundedKeys[0]) - utx, err := builder.NewAddValidatorTx( + tx, err := wallet.IssueAddValidatorTx( &txs.Validator{ NodeID: nodeID, Start: uint64(startTime.Unix()), End: uint64(startTime.Add(defaultMinStakingDuration).Unix()), Wght: env.config.MinValidatorStake, }, - &secp256k1fx.OutputOwners{ - Threshold: 1, - Addrs: []ids.ShortID{ids.ShortEmpty}, - }, + rewardsOwner, reward.PercentDenominator, ) require.NoError(err) - tx, err := walletsigner.SignUnsigned(context.Background(), signer, utx) - require.NoError(err) addValTx := tx.Unsigned.(*txs.AddValidatorTx) staker, err := state.NewCurrentStaker( @@ -1021,24 +1003,20 @@ func TestBanffStandardTxExecutorAddValidator(t *testing.T) { { // Case: Validator in pending validator set of primary network + wallet := newWallet(t, env, walletConfig{}) + startTime := genesistest.DefaultValidatorStartTime.Add(1 * time.Second) - builder, signer := env.factory.NewWallet(genesistest.DefaultFundedKeys[0]) - utx, err := builder.NewAddValidatorTx( + tx, err := wallet.IssueAddValidatorTx( &txs.Validator{ NodeID: nodeID, Start: uint64(startTime.Unix()), End: uint64(startTime.Add(defaultMinStakingDuration).Unix()), Wght: env.config.MinValidatorStake, }, - &secp256k1fx.OutputOwners{ - Threshold: 1, - Addrs: []ids.ShortID{ids.ShortEmpty}, - }, + rewardsOwner, reward.PercentDenominator, ) require.NoError(err) - tx, err := walletsigner.SignUnsigned(context.Background(), signer, utx) - require.NoError(err) staker, err := state.NewPendingStaker( tx.ID(), @@ -1065,24 +1043,22 @@ func TestBanffStandardTxExecutorAddValidator(t *testing.T) { { // Case: Validator doesn't have enough tokens to cover stake amount + wallet := newWallet(t, env, walletConfig{ + keys: genesistest.DefaultFundedKeys[:1], + }) + startTime := genesistest.DefaultValidatorStartTime.Add(1 * time.Second) - builder, signer := env.factory.NewWallet(genesistest.DefaultFundedKeys[0]) - utx, err := builder.NewAddValidatorTx( + tx, err := wallet.IssueAddValidatorTx( &txs.Validator{ NodeID: nodeID, Start: uint64(startTime.Unix()), End: uint64(startTime.Add(defaultMinStakingDuration).Unix()), Wght: env.config.MinValidatorStake, }, - &secp256k1fx.OutputOwners{ - Threshold: 1, - Addrs: []ids.ShortID{ids.ShortEmpty}, - }, + rewardsOwner, reward.PercentDenominator, ) require.NoError(err) - tx, err := walletsigner.SignUnsigned(context.Background(), signer, utx) - require.NoError(err) // Remove all UTXOs owned by preFundedKeys[0] utxoIDs, err := env.state.UTXOIDs(genesistest.DefaultFundedKeys[0].Address().Bytes(), ids.Empty, math.MaxInt32) @@ -1111,37 +1087,37 @@ func TestBanffStandardTxExecutorAddValidator(t *testing.T) { func TestDurangoDisabledTransactions(t *testing.T) { type test struct { name string - buildTx func(*environment) *txs.Tx + buildTx func(t *testing.T, env *environment) *txs.Tx expectedErr error } + rewardsOwner := &secp256k1fx.OutputOwners{ + Threshold: 1, + Addrs: []ids.ShortID{ids.GenerateTestShortID()}, + } + tests := []test{ { name: "AddValidatorTx", - buildTx: func(env *environment) *txs.Tx { + buildTx: func(t *testing.T, env *environment) *txs.Tx { var ( nodeID = ids.GenerateTestNodeID() chainTime = env.state.GetTimestamp() endTime = chainTime.Add(defaultMaxStakingDuration) ) - builder, signer := env.factory.NewWallet(genesistest.DefaultFundedKeys...) - utx, err := builder.NewAddValidatorTx( + wallet := newWallet(t, env, walletConfig{}) + tx, err := wallet.IssueAddValidatorTx( &txs.Validator{ NodeID: nodeID, Start: 0, End: uint64(endTime.Unix()), Wght: defaultMinValidatorStake, }, - &secp256k1fx.OutputOwners{ - Threshold: 1, - Addrs: []ids.ShortID{ids.ShortEmpty}, - }, + rewardsOwner, reward.PercentDenominator, ) require.NoError(t, err) - tx, err := walletsigner.SignUnsigned(context.Background(), signer, utx) - require.NoError(t, err) return tx }, @@ -1149,10 +1125,12 @@ func TestDurangoDisabledTransactions(t *testing.T) { }, { name: "AddDelegatorTx", - buildTx: func(env *environment) *txs.Tx { + buildTx: func(t *testing.T, env *environment) *txs.Tx { + require := require.New(t) + var primaryValidator *state.Staker it, err := env.state.GetCurrentStakerIterator() - require.NoError(t, err) + require.NoError(err) for it.Next() { staker := it.Value() if staker.Priority != txs.PrimaryNetworkValidatorCurrentPriority { @@ -1163,22 +1141,17 @@ func TestDurangoDisabledTransactions(t *testing.T) { } it.Release() - builder, signer := env.factory.NewWallet(genesistest.DefaultFundedKeys...) - utx, err := builder.NewAddDelegatorTx( + wallet := newWallet(t, env, walletConfig{}) + tx, err := wallet.IssueAddDelegatorTx( &txs.Validator{ NodeID: primaryValidator.NodeID, Start: 0, End: uint64(primaryValidator.EndTime.Unix()), Wght: defaultMinValidatorStake, }, - &secp256k1fx.OutputOwners{ - Threshold: 1, - Addrs: []ids.ShortID{ids.ShortEmpty}, - }, + rewardsOwner, ) - require.NoError(t, err) - tx, err := walletsigner.SignUnsigned(context.Background(), signer, utx) - require.NoError(t, err) + require.NoError(err) return tx }, @@ -1197,7 +1170,7 @@ func TestDurangoDisabledTransactions(t *testing.T) { onAcceptState, err := state.NewDiff(env.state.GetLastAccepted(), env) require.NoError(err) - tx := tt.buildTx(env) + tx := tt.buildTx(t, env) feeCalculator := state.PickFeeCalculator(env.config, onAcceptState) err = tx.Unsigned.Visit(&StandardTxExecutor{ @@ -1215,16 +1188,23 @@ func TestDurangoDisabledTransactions(t *testing.T) { func TestDurangoMemoField(t *testing.T) { type test struct { name string - setupTest func(env *environment, memoField []byte) (*txs.Tx, state.Diff) + setupTest func(t *testing.T, env *environment, memoField []byte) (*txs.Tx, state.Diff) + } + + owners := &secp256k1fx.OutputOwners{ + Threshold: 1, + Addrs: []ids.ShortID{ids.GenerateTestShortID()}, } tests := []test{ { name: "AddSubnetValidatorTx", - setupTest: func(env *environment, memoField []byte) (*txs.Tx, state.Diff) { + setupTest: func(t *testing.T, env *environment, memoField []byte) (*txs.Tx, state.Diff) { + require := require.New(t) + var primaryValidator *state.Staker it, err := env.state.GetCurrentStakerIterator() - require.NoError(t, err) + require.NoError(err) for it.Next() { staker := it.Value() if staker.Priority != txs.PrimaryNetworkValidatorCurrentPriority { @@ -1235,8 +1215,11 @@ func TestDurangoMemoField(t *testing.T) { } it.Release() - builder, signer := env.factory.NewWallet(genesistest.DefaultFundedKeys...) - utx, err := builder.NewAddSubnetValidatorTx( + subnetID := testSubnet1.ID() + wallet := newWallet(t, env, walletConfig{ + subnetIDs: []ids.ID{subnetID}, + }) + tx, err := wallet.IssueAddSubnetValidatorTx( &txs.SubnetValidator{ Validator: txs.Validator{ NodeID: primaryValidator.NodeID, @@ -1244,67 +1227,63 @@ func TestDurangoMemoField(t *testing.T) { End: uint64(primaryValidator.EndTime.Unix()), Wght: defaultMinValidatorStake, }, - Subnet: testSubnet1.TxID, + Subnet: subnetID, }, common.WithMemo(memoField), ) - require.NoError(t, err) - tx, err := walletsigner.SignUnsigned(context.Background(), signer, utx) - require.NoError(t, err) + require.NoError(err) onAcceptState, err := state.NewDiff(env.state.GetLastAccepted(), env) - require.NoError(t, err) + require.NoError(err) return tx, onAcceptState }, }, { name: "CreateChainTx", - setupTest: func(env *environment, memoField []byte) (*txs.Tx, state.Diff) { - builder, signer := env.factory.NewWallet(genesistest.DefaultFundedKeys...) - utx, err := builder.NewCreateChainTx( - testSubnet1.TxID, + setupTest: func(t *testing.T, env *environment, memoField []byte) (*txs.Tx, state.Diff) { + require := require.New(t) + + subnetID := testSubnet1.ID() + wallet := newWallet(t, env, walletConfig{ + subnetIDs: []ids.ID{subnetID}, + }) + + tx, err := wallet.IssueCreateChainTx( + subnetID, []byte{}, ids.GenerateTestID(), []ids.ID{}, "aaa", common.WithMemo(memoField), ) - require.NoError(t, err) - tx, err := walletsigner.SignUnsigned(context.Background(), signer, utx) - require.NoError(t, err) + require.NoError(err) onAcceptState, err := state.NewDiff(env.state.GetLastAccepted(), env) - require.NoError(t, err) - + require.NoError(err) return tx, onAcceptState }, }, { name: "CreateSubnetTx", - setupTest: func(env *environment, memoField []byte) (*txs.Tx, state.Diff) { - builder, signer := env.factory.NewWallet(genesistest.DefaultFundedKeys...) - utx, err := builder.NewCreateSubnetTx( - &secp256k1fx.OutputOwners{ - Threshold: 1, - Addrs: []ids.ShortID{ids.GenerateTestShortID()}, - }, + setupTest: func(t *testing.T, env *environment, memoField []byte) (*txs.Tx, state.Diff) { + require := require.New(t) + + wallet := newWallet(t, env, walletConfig{}) + tx, err := wallet.IssueCreateSubnetTx( + owners, common.WithMemo(memoField), ) - require.NoError(t, err) - tx, err := walletsigner.SignUnsigned(context.Background(), signer, utx) - require.NoError(t, err) + require.NoError(err) onAcceptState, err := state.NewDiff(env.state.GetLastAccepted(), env) - require.NoError(t, err) - + require.NoError(err) return tx, onAcceptState }, }, { name: "ImportTx", - setupTest: func(env *environment, memoField []byte) (*txs.Tx, state.Diff) { - // Skip shared memory checks - env.backend.Bootstrapped.Set(false) + setupTest: func(t *testing.T, env *environment, memoField []byte) (*txs.Tx, state.Diff) { + require := require.New(t) var ( sourceChain = env.ctx.XChainID @@ -1324,61 +1303,54 @@ func TestDurangoMemoField(t *testing.T) { ) env.msm.SharedMemory = sharedMemory - builder, signer := env.factory.NewWallet(genesistest.DefaultFundedKeys...) - utx, err := builder.NewImportTx( + wallet := newWallet(t, env, walletConfig{ + chainIDs: []ids.ID{sourceChain}, + }) + + tx, err := wallet.IssueImportTx( sourceChain, - &secp256k1fx.OutputOwners{ - Locktime: 0, - Threshold: 1, - Addrs: []ids.ShortID{sourceKey.Address()}, - }, + owners, common.WithMemo(memoField), ) - require.NoError(t, err) - tx, err := walletsigner.SignUnsigned(context.Background(), signer, utx) - require.NoError(t, err) + require.NoError(err) onAcceptState, err := state.NewDiff(env.state.GetLastAccepted(), env) - require.NoError(t, err) - + require.NoError(err) return tx, onAcceptState }, }, { name: "ExportTx", - setupTest: func(env *environment, memoField []byte) (*txs.Tx, state.Diff) { - builder, signer := env.factory.NewWallet(genesistest.DefaultFundedKeys...) - utx, err := builder.NewExportTx( + setupTest: func(t *testing.T, env *environment, memoField []byte) (*txs.Tx, state.Diff) { + require := require.New(t) + + wallet := newWallet(t, env, walletConfig{}) + tx, err := wallet.IssueExportTx( env.ctx.XChainID, []*avax.TransferableOutput{{ Asset: avax.Asset{ID: env.ctx.AVAXAssetID}, Out: &secp256k1fx.TransferOutput{ - Amt: units.Avax, - OutputOwners: secp256k1fx.OutputOwners{ - Locktime: 0, - Threshold: 1, - Addrs: []ids.ShortID{ids.GenerateTestShortID()}, - }, + Amt: units.Avax, + OutputOwners: *owners, }, }}, common.WithMemo(memoField), ) - require.NoError(t, err) - tx, err := walletsigner.SignUnsigned(context.Background(), signer, utx) - require.NoError(t, err) + require.NoError(err) onAcceptState, err := state.NewDiff(env.state.GetLastAccepted(), env) - require.NoError(t, err) - + require.NoError(err) return tx, onAcceptState }, }, { name: "RemoveSubnetValidatorTx", - setupTest: func(env *environment, memoField []byte) (*txs.Tx, state.Diff) { + setupTest: func(t *testing.T, env *environment, memoField []byte) (*txs.Tx, state.Diff) { + require := require.New(t) + var primaryValidator *state.Staker it, err := env.state.GetCurrentStakerIterator() - require.NoError(t, err) + require.NoError(err) for it.Next() { staker := it.Value() if staker.Priority != txs.PrimaryNetworkValidatorCurrentPriority { @@ -1390,8 +1362,12 @@ func TestDurangoMemoField(t *testing.T) { it.Release() endTime := primaryValidator.EndTime - builder, signer := env.factory.NewWallet(testSubnet1ControlKeys[0], testSubnet1ControlKeys[1]) - utx, err := builder.NewAddSubnetValidatorTx( + + subnetID := testSubnet1.ID() + wallet := newWallet(t, env, walletConfig{ + subnetIDs: []ids.ID{subnetID}, + }) + subnetValTx, err := wallet.IssueAddSubnetValidatorTx( &txs.SubnetValidator{ Validator: txs.Validator{ NodeID: primaryValidator.NodeID, @@ -1399,43 +1375,43 @@ func TestDurangoMemoField(t *testing.T) { End: uint64(endTime.Unix()), Wght: genesistest.DefaultValidatorWeight, }, - Subnet: testSubnet1.ID(), + Subnet: subnetID, }, ) - require.NoError(t, err) - subnetValTx, err := walletsigner.SignUnsigned(context.Background(), signer, utx) - require.NoError(t, err) + require.NoError(err) onAcceptState, err := state.NewDiff(env.state.GetLastAccepted(), env) - require.NoError(t, err) + require.NoError(err) feeCalculator := state.PickFeeCalculator(env.config, onAcceptState) - require.NoError(t, subnetValTx.Unsigned.Visit(&StandardTxExecutor{ + require.NoError(subnetValTx.Unsigned.Visit(&StandardTxExecutor{ Backend: &env.backend, State: onAcceptState, FeeCalculator: feeCalculator, Tx: subnetValTx, })) - builder, signer = env.factory.NewWallet(genesistest.DefaultFundedKeys...) - utx2, err := builder.NewRemoveSubnetValidatorTx( + tx, err := wallet.IssueRemoveSubnetValidatorTx( primaryValidator.NodeID, - testSubnet1.ID(), + subnetID, common.WithMemo(memoField), ) - require.NoError(t, err) - tx, err := walletsigner.SignUnsigned(context.Background(), signer, utx2) - require.NoError(t, err) - + require.NoError(err) return tx, onAcceptState }, }, { name: "TransformSubnetTx", - setupTest: func(env *environment, memoField []byte) (*txs.Tx, state.Diff) { - builder, signer := env.factory.NewWallet(genesistest.DefaultFundedKeys...) - utx, err := builder.NewTransformSubnetTx( - testSubnet1.TxID, // subnetID + setupTest: func(t *testing.T, env *environment, memoField []byte) (*txs.Tx, state.Diff) { + require := require.New(t) + + subnetID := testSubnet1.ID() + wallet := newWallet(t, env, walletConfig{ + subnetIDs: []ids.ID{subnetID}, + }) + + tx, err := wallet.IssueTransformSubnetTx( + subnetID, // subnetID ids.GenerateTestID(), // assetID 10, // initial supply 10, // max supply @@ -1451,29 +1427,27 @@ func TestDurangoMemoField(t *testing.T) { 80, // uptime requirement common.WithMemo(memoField), ) - require.NoError(t, err) - tx, err := walletsigner.SignUnsigned(context.Background(), signer, utx) - require.NoError(t, err) + require.NoError(err) onAcceptState, err := state.NewDiff(env.state.GetLastAccepted(), env) - require.NoError(t, err) - + require.NoError(err) return tx, onAcceptState }, }, { name: "AddPermissionlessValidatorTx", - setupTest: func(env *environment, memoField []byte) (*txs.Tx, state.Diff) { + setupTest: func(t *testing.T, env *environment, memoField []byte) (*txs.Tx, state.Diff) { + require := require.New(t) var ( nodeID = ids.GenerateTestNodeID() chainTime = env.state.GetTimestamp() endTime = chainTime.Add(defaultMaxStakingDuration) ) sk, err := bls.NewSecretKey() - require.NoError(t, err) + require.NoError(err) - builder, txSigner := env.factory.NewWallet(genesistest.DefaultFundedKeys...) - utx, err := builder.NewAddPermissionlessValidatorTx( + wallet := newWallet(t, env, walletConfig{}) + tx, err := wallet.IssueAddPermissionlessValidatorTx( &txs.SubnetValidator{ Validator: txs.Validator{ NodeID: nodeID, @@ -1485,33 +1459,26 @@ func TestDurangoMemoField(t *testing.T) { }, signer.NewProofOfPossession(sk), env.ctx.AVAXAssetID, - &secp256k1fx.OutputOwners{ - Threshold: 1, - Addrs: []ids.ShortID{ids.ShortEmpty}, - }, - &secp256k1fx.OutputOwners{ - Threshold: 1, - Addrs: []ids.ShortID{ids.ShortEmpty}, - }, + owners, + owners, reward.PercentDenominator, common.WithMemo(memoField), ) - require.NoError(t, err) - tx, err := walletsigner.SignUnsigned(context.Background(), txSigner, utx) - require.NoError(t, err) + require.NoError(err) onAcceptState, err := state.NewDiff(env.state.GetLastAccepted(), env) - require.NoError(t, err) - + require.NoError(err) return tx, onAcceptState }, }, { name: "AddPermissionlessDelegatorTx", - setupTest: func(env *environment, memoField []byte) (*txs.Tx, state.Diff) { + setupTest: func(t *testing.T, env *environment, memoField []byte) (*txs.Tx, state.Diff) { + require := require.New(t) + var primaryValidator *state.Staker it, err := env.state.GetCurrentStakerIterator() - require.NoError(t, err) + require.NoError(err) for it.Next() { staker := it.Value() if staker.Priority != txs.PrimaryNetworkValidatorCurrentPriority { @@ -1522,8 +1489,8 @@ func TestDurangoMemoField(t *testing.T) { } it.Release() - builder, signer := env.factory.NewWallet(genesistest.DefaultFundedKeys...) - utx, err := builder.NewAddPermissionlessDelegatorTx( + wallet := newWallet(t, env, walletConfig{}) + tx, err := wallet.IssueAddPermissionlessDelegatorTx( &txs.SubnetValidator{ Validator: txs.Validator{ NodeID: primaryValidator.NodeID, @@ -1534,49 +1501,45 @@ func TestDurangoMemoField(t *testing.T) { Subnet: constants.PrimaryNetworkID, }, env.ctx.AVAXAssetID, - &secp256k1fx.OutputOwners{ - Threshold: 1, - Addrs: []ids.ShortID{ids.ShortEmpty}, - }, + owners, common.WithMemo(memoField), ) - require.NoError(t, err) - tx, err := walletsigner.SignUnsigned(context.Background(), signer, utx) - require.NoError(t, err) + require.NoError(err) onAcceptState, err := state.NewDiff(env.state.GetLastAccepted(), env) - require.NoError(t, err) - + require.NoError(err) return tx, onAcceptState }, }, { name: "TransferSubnetOwnershipTx", - setupTest: func(env *environment, memoField []byte) (*txs.Tx, state.Diff) { - builder, signer := env.factory.NewWallet(genesistest.DefaultFundedKeys...) - utx, err := builder.NewTransferSubnetOwnershipTx( - testSubnet1.TxID, - &secp256k1fx.OutputOwners{ - Threshold: 1, - Addrs: []ids.ShortID{ids.ShortEmpty}, - }, + setupTest: func(t *testing.T, env *environment, memoField []byte) (*txs.Tx, state.Diff) { + require := require.New(t) + + subnetID := testSubnet1.ID() + wallet := newWallet(t, env, walletConfig{ + subnetIDs: []ids.ID{subnetID}, + }) + + tx, err := wallet.IssueTransferSubnetOwnershipTx( + subnetID, + owners, common.WithMemo(memoField), ) - require.NoError(t, err) - tx, err := walletsigner.SignUnsigned(context.Background(), signer, utx) - require.NoError(t, err) + require.NoError(err) onAcceptState, err := state.NewDiff(env.state.GetLastAccepted(), env) - require.NoError(t, err) - + require.NoError(err) return tx, onAcceptState }, }, { name: "BaseTx", - setupTest: func(env *environment, memoField []byte) (*txs.Tx, state.Diff) { - builder, signer := env.factory.NewWallet(genesistest.DefaultFundedKeys...) - utx, err := builder.NewBaseTx( + setupTest: func(t *testing.T, env *environment, memoField []byte) (*txs.Tx, state.Diff) { + require := require.New(t) + + wallet := newWallet(t, env, walletConfig{}) + tx, err := wallet.IssueBaseTx( []*avax.TransferableOutput{ { Asset: avax.Asset{ID: env.ctx.AVAXAssetID}, @@ -1591,13 +1554,10 @@ func TestDurangoMemoField(t *testing.T) { }, common.WithMemo(memoField), ) - require.NoError(t, err) - tx, err := walletsigner.SignUnsigned(context.Background(), signer, utx) - require.NoError(t, err) + require.NoError(err) onAcceptState, err := state.NewDiff(env.state.GetLastAccepted(), env) - require.NoError(t, err) - + require.NoError(err) return tx, onAcceptState }, }, @@ -1614,7 +1574,7 @@ func TestDurangoMemoField(t *testing.T) { feeCalculator := state.PickFeeCalculator(env.config, env.state) // Populated memo field should error - tx, onAcceptState := tt.setupTest(env, []byte{'m', 'e', 'm', 'o'}) + tx, onAcceptState := tt.setupTest(t, env, []byte{'m', 'e', 'm', 'o'}) err := tx.Unsigned.Visit(&StandardTxExecutor{ Backend: &env.backend, State: onAcceptState, @@ -1624,7 +1584,7 @@ func TestDurangoMemoField(t *testing.T) { require.ErrorIs(err, avax.ErrMemoTooLarge) // Empty memo field should not error - tx, onAcceptState = tt.setupTest(env, []byte{}) + tx, onAcceptState = tt.setupTest(t, env, []byte{}) require.NoError(tx.Unsigned.Visit(&StandardTxExecutor{ Backend: &env.backend, State: onAcceptState, diff --git a/vms/platformvm/txs/txstest/backend.go b/vms/platformvm/txs/txstest/backend.go deleted file mode 100644 index 3ef798c0b69..00000000000 --- a/vms/platformvm/txs/txstest/backend.go +++ /dev/null @@ -1,81 +0,0 @@ -// Copyright (C) 2019-2024, Ava Labs, Inc. All rights reserved. -// See the file LICENSE for licensing terms. - -package txstest - -import ( - "context" - "math" - - "github.com/ava-labs/avalanchego/chains/atomic" - "github.com/ava-labs/avalanchego/ids" - "github.com/ava-labs/avalanchego/utils/constants" - "github.com/ava-labs/avalanchego/utils/set" - "github.com/ava-labs/avalanchego/vms/components/avax" - "github.com/ava-labs/avalanchego/vms/platformvm/fx" - "github.com/ava-labs/avalanchego/vms/platformvm/state" - "github.com/ava-labs/avalanchego/vms/platformvm/txs" - "github.com/ava-labs/avalanchego/wallet/chain/p/builder" - "github.com/ava-labs/avalanchego/wallet/chain/p/signer" -) - -var ( - _ builder.Backend = (*Backend)(nil) - _ signer.Backend = (*Backend)(nil) -) - -func newBackend( - addrs set.Set[ids.ShortID], - state state.State, - sharedMemory atomic.SharedMemory, -) *Backend { - return &Backend{ - addrs: addrs, - state: state, - sharedMemory: sharedMemory, - } -} - -type Backend struct { - addrs set.Set[ids.ShortID] - state state.State - sharedMemory atomic.SharedMemory -} - -func (b *Backend) UTXOs(_ context.Context, sourceChainID ids.ID) ([]*avax.UTXO, error) { - if sourceChainID == constants.PlatformChainID { - return avax.GetAllUTXOs(b.state, b.addrs) - } - - utxos, _, _, err := avax.GetAtomicUTXOs( - b.sharedMemory, - txs.Codec, - sourceChainID, - b.addrs, - ids.ShortEmpty, - ids.Empty, - math.MaxInt, - ) - return utxos, err -} - -func (b *Backend) GetUTXO(_ context.Context, chainID, utxoID ids.ID) (*avax.UTXO, error) { - if chainID == constants.PlatformChainID { - return b.state.GetUTXO(utxoID) - } - - utxoBytes, err := b.sharedMemory.Get(chainID, [][]byte{utxoID[:]}) - if err != nil { - return nil, err - } - - utxo := avax.UTXO{} - if _, err := txs.Codec.Unmarshal(utxoBytes[0], &utxo); err != nil { - return nil, err - } - return &utxo, nil -} - -func (b *Backend) GetSubnetOwner(_ context.Context, subnetID ids.ID) (fx.Owner, error) { - return b.state.GetSubnetOwner(subnetID) -} diff --git a/vms/platformvm/txs/txstest/builder.go b/vms/platformvm/txs/txstest/builder.go deleted file mode 100644 index 532720be981..00000000000 --- a/vms/platformvm/txs/txstest/builder.go +++ /dev/null @@ -1,43 +0,0 @@ -// Copyright (C) 2019-2024, Ava Labs, Inc. All rights reserved. -// See the file LICENSE for licensing terms. - -package txstest - -import ( - "github.com/ava-labs/avalanchego/snow" - "github.com/ava-labs/avalanchego/utils/crypto/secp256k1" - "github.com/ava-labs/avalanchego/vms/platformvm/config" - "github.com/ava-labs/avalanchego/vms/platformvm/state" - "github.com/ava-labs/avalanchego/vms/secp256k1fx" - "github.com/ava-labs/avalanchego/wallet/chain/p/builder" - "github.com/ava-labs/avalanchego/wallet/chain/p/signer" -) - -func NewWalletFactory( - ctx *snow.Context, - cfg *config.Config, - state state.State, -) *WalletFactory { - return &WalletFactory{ - ctx: ctx, - cfg: cfg, - state: state, - } -} - -type WalletFactory struct { - ctx *snow.Context - cfg *config.Config - state state.State -} - -func (w *WalletFactory) NewWallet(keys ...*secp256k1.PrivateKey) (builder.Builder, signer.Signer) { - var ( - kc = secp256k1fx.NewKeychain(keys...) - addrs = kc.Addresses() - backend = newBackend(addrs, w.state, w.ctx.SharedMemory) - context = newContext(w.ctx, w.cfg, w.state.GetTimestamp()) - ) - - return builder.New(addrs, context, backend), signer.New(kc, backend) -}