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 }