Random Token Account
feel free to skip. I strongly recommend you use associated token address.
Token Program - Initialize Account
tokenprog.InitializeAccount(tokenprog.InitializeAccountParam{
Account: aliceTokenAccount.PublicKey,
Mint: mintPubkey,
Owner: alice.PublicKey,
}),
token account
a token account you want to init.
mint
which mint to store. one token account can only hold one mint. If you want to hold the other mint (token). Create another token account.
owner
If you want to transfer or burn your token, the owner must sign the tx.
Full code:
package main
import (
"context"
"fmt"
"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/program/tokenprog"
"github.com/portto/solana-go-sdk/rpc"
"github.com/portto/solana-go-sdk/types"
)
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})
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})
var mintPubkey = common.PublicKeyFromString("29oPCpWj6QiXEipwtmXPrDJAR2P29Z6wHKpHRxEsbnSr")
func main() {
c := client.NewClient(rpc.LocalnetRPCEndpoint)
aliceTokenAccount := types.NewAccount()
fmt.Println("alice token account:", aliceTokenAccount.PublicKey.ToBase58())
rentExemptionBalance, err := c.GetMinimumBalanceForRentExemption(context.Background(), tokenprog.TokenAccountSize)
if err != nil {
log.Fatalf("get min balacne for rent exemption, err: %v", err)
}
res, err := c.GetRecentBlockhash(context.Background())
if err != nil {
log.Fatalf("get recent block hash error, err: %v\n", err)
}
tx, err := types.NewTransaction(types.NewTransactionParam{
Message: types.NewMessage(types.NewMessageParam{
FeePayer: feePayer.PublicKey,
RecentBlockhash: res.Blockhash,
Instructions: []types.Instruction{
sysprog.CreateAccount(sysprog.CreateAccountParam{
From: feePayer.PublicKey,
New: aliceTokenAccount.PublicKey,
Owner: common.TokenProgramID,
Lamports: rentExemptionBalance,
Space: tokenprog.TokenAccountSize,
}),
tokenprog.InitializeAccount(tokenprog.InitializeAccountParam{
Account: aliceTokenAccount.PublicKey,
Mint: mintPubkey,
Owner: alice.PublicKey,
}),
},
}),
Signers: []types.Account{feePayer, aliceTokenAccount},
})
if err != nil {
log.Fatalf("generate tx error, err: %v\n", err)
}
txhash, err := c.SendTransaction(context.Background(), tx)
if err != nil {
log.Fatalf("send tx error, err: %v\n", err)
}
log.Println("txhash:", txhash)
}
Last updated
Was this helpful?