github.com/ava-labs/avalanchego@v1.11.11/vms/platformvm/block/builder/standard_block_test.go (about)

     1  // Copyright (C) 2019-2024, Ava Labs, Inc. All rights reserved.
     2  // See the file LICENSE for licensing terms.
     3  
     4  package builder
     5  
     6  import (
     7  	"context"
     8  	"testing"
     9  
    10  	"github.com/stretchr/testify/require"
    11  
    12  	"github.com/ava-labs/avalanchego/chains/atomic"
    13  	"github.com/ava-labs/avalanchego/database/prefixdb"
    14  	"github.com/ava-labs/avalanchego/ids"
    15  	"github.com/ava-labs/avalanchego/upgrade/upgradetest"
    16  	"github.com/ava-labs/avalanchego/utils/units"
    17  	"github.com/ava-labs/avalanchego/vms/components/avax"
    18  	"github.com/ava-labs/avalanchego/vms/platformvm/genesis/genesistest"
    19  	"github.com/ava-labs/avalanchego/vms/platformvm/status"
    20  	"github.com/ava-labs/avalanchego/vms/platformvm/txs"
    21  	"github.com/ava-labs/avalanchego/vms/secp256k1fx"
    22  )
    23  
    24  func TestAtomicTxImports(t *testing.T) {
    25  	require := require.New(t)
    26  
    27  	env := newEnvironment(t, upgradetest.Latest)
    28  	env.ctx.Lock.Lock()
    29  	defer env.ctx.Lock.Unlock()
    30  
    31  	addr := genesistest.DefaultFundedKeys[0].Address()
    32  	owner := &secp256k1fx.OutputOwners{
    33  		Threshold: 1,
    34  		Addrs:     []ids.ShortID{addr},
    35  	}
    36  
    37  	m := atomic.NewMemory(prefixdb.New([]byte{5}, env.baseDB))
    38  
    39  	env.msm.SharedMemory = m.NewSharedMemory(env.ctx.ChainID)
    40  	peerSharedMemory := m.NewSharedMemory(env.ctx.XChainID)
    41  	utxo := &avax.UTXO{
    42  		UTXOID: avax.UTXOID{
    43  			TxID:        ids.GenerateTestID(),
    44  			OutputIndex: 1,
    45  		},
    46  		Asset: avax.Asset{ID: env.ctx.AVAXAssetID},
    47  		Out: &secp256k1fx.TransferOutput{
    48  			Amt:          70 * units.MicroAvax,
    49  			OutputOwners: *owner,
    50  		},
    51  	}
    52  	utxoBytes, err := txs.Codec.Marshal(txs.CodecVersion, utxo)
    53  	require.NoError(err)
    54  
    55  	inputID := utxo.InputID()
    56  	require.NoError(peerSharedMemory.Apply(map[ids.ID]*atomic.Requests{
    57  		env.ctx.ChainID: {PutRequests: []*atomic.Element{{
    58  			Key:   inputID[:],
    59  			Value: utxoBytes,
    60  			Traits: [][]byte{
    61  				addr.Bytes(),
    62  			},
    63  		}}},
    64  	}))
    65  
    66  	wallet := newWallet(t, env, walletConfig{})
    67  
    68  	tx, err := wallet.IssueImportTx(
    69  		env.ctx.XChainID,
    70  		owner,
    71  	)
    72  	require.NoError(err)
    73  
    74  	require.NoError(env.Builder.Add(tx))
    75  	b, err := env.Builder.BuildBlock(context.Background())
    76  	require.NoError(err)
    77  	// Test multiple verify calls work
    78  	require.NoError(b.Verify(context.Background()))
    79  	require.NoError(b.Accept(context.Background()))
    80  	_, txStatus, err := env.state.GetTx(tx.ID())
    81  	require.NoError(err)
    82  	// Ensure transaction is in the committed state
    83  	require.Equal(status.Committed, txStatus)
    84  }