github.com/gagliardetto/solana-go@v1.11.0/transaction_v0_test.go (about)

     1  package solana
     2  
     3  import (
     4  	"testing"
     5  
     6  	"github.com/davecgh/go-spew/spew"
     7  	"github.com/stretchr/testify/require"
     8  )
     9  
    10  func TestTransactionV0(t *testing.T) {
    11  	txB64 := "Alkhq/BfGdBeok4oBP21xAwT4oO/R5PvkKqbCTq4sHHRsto+uDQCFcdp8hXh1g5D3mTh8GAJW8xE+EDD27f9IweTkH2Afiu4h5aM+Xbo0mklc0/Vi1xawd7SZVbstXDLtWdoJaf4Zt+20F/SasURzw/P4dkD+Q6BjgUNHT+vg5gOgAIBAQgaJV0Ch/DG6XwNcizWbI7STLgSbIOrg0Dl67Oo30WU1uA/NIbYLPRmuLarIJ4J0CcN3IWEm4Gf8675KhnXef2LaDXzjFgWVSbAO2yyTF6dK1oO3gTExie957LXDwu6oJMAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAVKU1qZKSEGTSTocWDaOHx8NbXdvJK7geQfqEBBBUSN1LfoiB9oYLDSHJL9rjAlchZhn+fd/23ACfq0oIGla54pt5JT0MdBTJhQI+z7dnVsisw2xWwW+vFSTs97l0tJPxmv9kxpXbHYZFenDpT2s6CT75/9QNFVTkHFLMK+UG6VlyFnQmYh1aMkGtq3c6TIOsk32S6XMUnN9DQgFGQq4lwEAwIAAgwCAAAAgJaYAAAAAAADAgAFDAIAAACAlpgAAAAAAAMCAAYMAgAAAICWmAAAAAAABAAMSGVsbG8gRmFiaW8hAX5s37FH6IeB4QeMYxD4LtpXf1DaupH/ro7W+kEQnofaAgECAQA="
    12  
    13  	tx := new(Transaction)
    14  	err := tx.UnmarshalBase64(txB64)
    15  	require.NoError(t, err)
    16  
    17  	require.NotPanics(t, func() {
    18  		spew.Dump(tx.Message)
    19  	})
    20  	require.NotPanics(t, func() {
    21  		tx.MustToBase64()
    22  	})
    23  
    24  	require.True(t, tx.Message.IsVersioned())
    25  	require.Equal(t, PublicKeySlice{MPK("9WWfC3y4uCNofr2qEFHSVUXkCxW99JiYkMWmSZvVt8j3")}, tx.Message.GetAddressTableLookups().GetTableIDs())
    26  	require.False(t, tx.Message.resolved)
    27  
    28  	// You would fetch the tables from the chain.
    29  	tables := map[PublicKey]PublicKeySlice{
    30  		MPK("9WWfC3y4uCNofr2qEFHSVUXkCxW99JiYkMWmSZvVt8j3"): {
    31  			MPK("2jGpE3ADYRoJPMjyGC4tvqqDfobvdvwGr3vhd66zA1rc"),
    32  			MPK("FKN5imdi7yadX4axe4hxaqBET4n6DBDRF5LKo5aBF53j"),
    33  			MPK("3or4uF7ZyuQW5GGmcmdXDJasNiSZUURF2az1UrRPYQTg"),
    34  			MPK("MemoSq4gqABAXKb96qnH8TysNcWxMyWCqXgDLGmfcHr"),
    35  		},
    36  	}
    37  	// set the address tables
    38  	err = tx.Message.SetAddressTables(
    39  		tables,
    40  	)
    41  	require.NoError(t, err)
    42  	require.Equal(t, tables, tx.Message.addressTables)
    43  	require.Equal(t, tables, tx.Message.GetAddressTables())
    44  
    45  	require.Equal(t, MessageVersionV0, tx.Message.GetVersion())
    46  	require.Equal(t, uint8(2), tx.Message.Header.NumRequiredSignatures)
    47  	require.Equal(t, uint8(1), tx.Message.Header.NumReadonlySignedAccounts)
    48  	require.Equal(t, uint8(1), tx.Message.Header.NumReadonlyUnsignedAccounts)
    49  
    50  	require.Equal(t, "2nMjR8mdczMJZZ1XeQ5Y37GxfrRQmaV74eypnD9ggpQMmaWfETq9C5DoGKha4bMamu9tFQQArBAgxzQ5vnng1ZdG", tx.Signatures[0].String())
    51  	require.Equal(t, "3x7m4nDNGiZiDgadNtewvHKGcCEWe16QpHo197Azs5ybKNqjzbknuF7VFWeHJ6jowdSeDqVZ2EVgpoq9rNoHvPrM", tx.Signatures[1].String())
    52  	require.Equal(t,
    53  		PublicKeySlice{
    54  			MPK("2m4eNwBVqu6SgFk23HgE3W5MW89yT5z1vspz2WsiFBHF"),
    55  			MPK("G6NDx85GM481GPjT5kUBAvjLxzDMsgRMQ1EAxzGswEJn"),
    56  			MPK("81o7hHYN5a8fc5wdjjfznK9ziJ9wcuKXwbZnuYpanxMQ"),
    57  			MPK("11111111111111111111111111111111"),
    58  			MPK("MemoSq4gqABAXKb96qnH8TysNcWxMyWCqXgDLGmfcHr"),
    59  			MPK("FKN5imdi7yadX4axe4hxaqBET4n6DBDRF5LKo5aBF53j"),
    60  			MPK("3or4uF7ZyuQW5GGmcmdXDJasNiSZUURF2az1UrRPYQTg"),
    61  			MPK("2jGpE3ADYRoJPMjyGC4tvqqDfobvdvwGr3vhd66zA1rc"),
    62  		},
    63  		tx.Message.AccountKeys,
    64  	)
    65  	require.Equal(t,
    66  		MustHashFromBase58("BAx74QRmMwhnTytrPoG5ogw2BQn4CdhB14jxJnbDMUS7"),
    67  		tx.Message.RecentBlockhash,
    68  	)
    69  	require.NotPanics(t, func() {
    70  		spew.Dump(tx.Message)
    71  	})
    72  	require.NotPanics(t, func() {
    73  		tx.MustToBase64()
    74  	})
    75  
    76  	{
    77  		err = tx.Message.ResolveLookups()
    78  		require.NoError(t, err)
    79  		require.True(t, tx.Message.resolved)
    80  		// call again
    81  		err = tx.Message.ResolveLookups()
    82  		require.NoError(t, err)
    83  		{
    84  			spew.Dump(tx.Message.AccountKeys)
    85  			require.Equal(t,
    86  				PublicKeySlice{
    87  					MPK("2m4eNwBVqu6SgFk23HgE3W5MW89yT5z1vspz2WsiFBHF"),
    88  					MPK("G6NDx85GM481GPjT5kUBAvjLxzDMsgRMQ1EAxzGswEJn"),
    89  					MPK("81o7hHYN5a8fc5wdjjfznK9ziJ9wcuKXwbZnuYpanxMQ"),
    90  					MPK("11111111111111111111111111111111"),
    91  					MPK("MemoSq4gqABAXKb96qnH8TysNcWxMyWCqXgDLGmfcHr"),
    92  					MPK("FKN5imdi7yadX4axe4hxaqBET4n6DBDRF5LKo5aBF53j"),
    93  					MPK("3or4uF7ZyuQW5GGmcmdXDJasNiSZUURF2az1UrRPYQTg"),
    94  					MPK("2jGpE3ADYRoJPMjyGC4tvqqDfobvdvwGr3vhd66zA1rc"),
    95  					// from tables:
    96  					MPK("FKN5imdi7yadX4axe4hxaqBET4n6DBDRF5LKo5aBF53j"),
    97  					MPK("3or4uF7ZyuQW5GGmcmdXDJasNiSZUURF2az1UrRPYQTg"),
    98  					MPK("2jGpE3ADYRoJPMjyGC4tvqqDfobvdvwGr3vhd66zA1rc"),
    99  				},
   100  				tx.Message.AccountKeys,
   101  			)
   102  		}
   103  	}
   104  	{
   105  		lookups := tx.Message.GetAddressTableLookups()
   106  		require.Equal(t, 1, len(lookups))
   107  		first := lookups[0]
   108  		require.Equal(t,
   109  			MessageAddressTableLookup{
   110  				AccountKey:      MPK("9WWfC3y4uCNofr2qEFHSVUXkCxW99JiYkMWmSZvVt8j3"),
   111  				WritableIndexes: []uint8{1, 2},
   112  				ReadonlyIndexes: []uint8{0},
   113  			}, first)
   114  	}
   115  
   116  	{
   117  		encoded := tx.MustToBase64()
   118  		require.Equal(t, txB64, encoded)
   119  	}
   120  }