To create a new token, you must perform a sequence of instructions: create the mint account, initialize it, create a token account for the owner, initialize that account, and finally mint tokens to it.
Required Steps:
- Rent Exemption: Use
rpcClient.GetMinimumBalanceForRentExemption for both TokenProgram.TokenAccountDataSize and TokenProgram.MintAccountDataSize. - Create Mint:
SystemProgram.CreateAccount with TokenProgram.ProgramIdKey. - Initialize Mint:
TokenProgram.InitializeMint. - Create Token Account:
SystemProgram.CreateAccount for the owner's token account. - Initialize Token Account:
TokenProgram.InitializeAccount. - Mint:
TokenProgram.MintTo to move supply into the account.
var wallet = new Wallet(MnemonicWords);
var blockHash = rpcClient.GetLatestBlockHash();
var minBalanceForExemptionAcc = rpcClient.GetMinimumBalanceForRentExemption(TokenProgram.TokenAccountDataSize).Result;
var minBalanceForExemptionMint = rpcClient.GetMinimumBalanceForRentExemption(TokenProgram.MintAccountDataSize).Result;
var mintAccount = wallet.GetAccount(21);
var ownerAccount = wallet.GetAccount(10);
var initialAccount = wallet.GetAccount(22);
var tx = new TransactionBuilder()
.SetRecentBlockHash(blockHash.Result.Value.Blockhash)
.SetFeePayer(ownerAccount)
.AddInstruction(ComputeBudgetProgram.SetComputeUnitLimit(30000))
.AddInstruction(ComputeBudgetProgram.SetComputeUnitPrice(1000000))
.AddInstruction(SystemProgram.CreateAccount(
ownerAccount,
mintAccount,
minBalanceForExemptionMint,
TokenProgram.MintAccountDataSize,
TokenProgram.ProgramIdKey))
.AddInstruction(TokenProgram.InitializeMint(
mintAccount.PublicKey,
2,
ownerAccount.PublicKey,
ownerAccount.PublicKey))
.AddInstruction(SystemProgram.CreateAccount(
ownerAccount,
initialAccount,
minBalanceForExemptionAcc,
TokenProgram.TokenAccountDataSize,
TokenProgram.ProgramIdKey))
.AddInstruction(TokenProgram.InitializeAccount(
initialAccount.PublicKey,
mintAccount.PublicKey,
ownerAccount.PublicKey))
.AddInstruction(TokenProgram.MintTo(
mintAccount.PublicKey,
initialAccount.PublicKey,
25000,
ownerAccount))
.AddInstruction(MemoProgram.NewMemo(initialAccount, "Hello from Sol.Net"))
.Build(new List<Account>{ ownerAccount, mintAccount, initialAccount });