Links

Transfer (Token)

Token Program - Transfer Checked

tokenprog.TransferChecked(tokenprog.TransferCheckedParam{
From: aliceTokenRandomTokenPubkey,
To: aliceTokenATAPubkey,
Mint: mintPubkey,
Auth: alice.PublicKey,
Signers: []common.PublicKey{},
Amount: 1e8,
Decimals: 8,
}),
From a token account to give token
To a token account to receive token
Mint which token wants to transfer
Auth the owner of from, need to sign the tx
Singers we pass empty first, I will write a another chapter to discuss it.
Amount the number you want to transfer
Decimals the decimals of mint
There is an instruction call Transferin tokenprog also can transfer token.
package main
import (
"context"
"log"
"github.com/portto/solana-go-sdk/client"
"github.com/portto/solana-go-sdk/common"
"github.com/portto/solana-go-sdk/program/sysprog"
"github.com/portto/solana-go-sdk/rpc"
"github.com/portto/solana-go-sdk/types"
)
// you can fill your key here
var feePayer, _ = types.AccountFromBytes([]byte{178, 244, 76, 4, 247, 41, 113, 40, 111, 103, 12, 76, 195, 4, 100, 123, 88, 226, 37, 56, 209, 180, 92, 77, 39, 85, 78, 202, 121, 162, 88, 29, 125, 155, 223, 107, 139, 223, 229, 82, 89, 209, 27, 43, 108, 205, 144, 2, 74, 159, 215, 57, 198, 4, 193, 36, 161, 50, 160, 119, 89, 240, 102, 184})
// you can fill your key here
var alice, _ = types.AccountFromBytes([]byte{196, 114, 86, 165, 59, 177, 63, 87, 43, 10, 176, 101, 225, 42, 129, 158, 167, 43, 81, 214, 254, 28, 196, 158, 159, 64, 55, 123, 48, 211, 78, 166, 127, 96, 107, 250, 152, 133, 208, 224, 73, 251, 113, 151, 128, 139, 86, 80, 101, 70, 138, 50, 141, 153, 218, 110, 56, 39, 122, 181, 120, 55, 86, 185})
func main() {
c := client.NewClient(rpc.LocalnetRPCEndpoint)
// to fetch recent blockhash
res, err := c.GetRecentBlockhash(context.Background())
if err != nil {
log.Fatalf("get recent block hash error, err: %v\n", err)
}
// create a message
message := types.NewMessage(types.NewMessageParam{
FeePayer: feePayer.PublicKey,
RecentBlockhash: res.Blockhash, // recent blockhash
Instructions: []types.Instruction{
sysprog.Transfer(sysprog.TransferParam{
From: alice.PublicKey, // from
To: common.PublicKeyFromString("2xNweLHLqrbx4zo1waDvgWJHgsUpPj8Y8icbAFeR4a8i"), // to
Amount: 1e9, // 1 SOL
}),
},
})
// create tx by message + signer
tx, err := types.NewTransaction(types.NewTransactionParam{
Message: message,
Signers: []types.Account{feePayer, alice},
})
if err != nil {
log.Fatalf("failed to new transaction, err: %v", err)
}
// send tx
txhash, err := c.SendTransaction(context.Background(), tx)
if err != nil {
log.Fatalf("failed to send tx, err: %v", err)
}
log.Println("txhash:", txhash)
}