package token import ( "encoding/binary" "errors" ag_binary "github.com/gagliardetto/binary" ag_solanago "github.com/gagliardetto/solana-go" ag_format "github.com/gagliardetto/solana-go/text/format" ag_treeout "github.com/gagliardetto/treeout" ) // Mints new tokens to an account. The native mint does not support minting. // // This instruction differs from MintTo in that the decimals value is // checked by the caller. This may be useful when creating transactions // offline or within a hardware wallet. type MintToChecked struct { // The amount of new tokens to mint. Amount *uint64 // Expected number of base 10 digits to the right of the decimal place. Decimals *uint8 // [0] = [WRITE] mint // ··········· The mint. // // [1] = [WRITE] destination // ··········· The account to mint tokens to. // // [2] = [] authority // ··········· The mint's minting authority. ag_solanago.AccountMetaSlice `bin:"-" borsh_skip:"true"` } // NewMintToCheckedInstructionBuilder creates a new `MintToChecked` instruction builder. func NewMintToCheckedInstructionBuilder() *MintToChecked { nd := &MintToChecked{ AccountMetaSlice: make(ag_solanago.AccountMetaSlice, 3), } return nd } // SetAmount sets the "amount" parameter. // The amount of new tokens to mint. func (inst *MintToChecked) SetAmount(amount uint64) *MintToChecked { inst.Amount = &amount return inst } // SetDecimals sets the "decimals" parameter. // Expected number of base 10 digits to the right of the decimal place. func (inst *MintToChecked) SetDecimals(decimals uint8) *MintToChecked { inst.Decimals = &decimals return inst } // SetMintAccount sets the "mint" account. // The mint. func (inst *MintToChecked) SetMintAccount(mint ag_solanago.PublicKey) *MintToChecked { inst.AccountMetaSlice[0] = ag_solanago.Meta(mint).WRITE() return inst } // GetMintAccount gets the "mint" account. // The mint. func (inst *MintToChecked) GetMintAccount() *ag_solanago.AccountMeta { return inst.AccountMetaSlice[0] } // SetDestinationAccount sets the "destination" account. // The account to mint tokens to. func (inst *MintToChecked) SetDestinationAccount(destination ag_solanago.PublicKey) *MintToChecked { inst.AccountMetaSlice[1] = ag_solanago.Meta(destination).WRITE() return inst } // GetDestinationAccount gets the "destination" account. // The account to mint tokens to. func (inst *MintToChecked) GetDestinationAccount() *ag_solanago.AccountMeta { return inst.AccountMetaSlice[1] } // SetAuthorityAccount sets the "authority" account. // The mint's minting authority. func (inst *MintToChecked) SetAuthorityAccount(authority ag_solanago.PublicKey) *MintToChecked { inst.AccountMetaSlice[2] = ag_solanago.Meta(authority) return inst } // GetAuthorityAccount gets the "authority" account. // The mint's minting authority. func (inst *MintToChecked) GetAuthorityAccount() *ag_solanago.AccountMeta { return inst.AccountMetaSlice[2] } func (inst MintToChecked) Build() *Instruction { return &Instruction{BaseVariant: ag_binary.BaseVariant{ Impl: inst, TypeID: ag_binary.TypeIDFromUint32(Instruction_MintToChecked, binary.LittleEndian), }} } // ValidateAndBuild validates the instruction parameters and accounts; // if there is a validation error, it returns the error. // Otherwise, it builds and returns the instruction. func (inst MintToChecked) ValidateAndBuild() (*Instruction, error) { if err := inst.Validate(); err != nil { return nil, err } return inst.Build(), nil } func (inst *MintToChecked) Validate() error { // Check whether all (required) parameters are set: { if inst.Amount == nil { return errors.New("Amount parameter is not set") } if inst.Decimals == nil { return errors.New("Decimals parameter is not set") } } // Check whether all (required) accounts are set: { if inst.AccountMetaSlice[0] == nil { return errors.New("accounts.Mint is not set") } if inst.AccountMetaSlice[1] == nil { return errors.New("accounts.Destination is not set") } if inst.AccountMetaSlice[2] == nil { return errors.New("accounts.Authority is not set") } } return nil } func (inst *MintToChecked) EncodeToTree(parent ag_treeout.Branches) { parent.Child(ag_format.Program(ProgramName, ProgramID)). // ParentFunc(func(programBranch ag_treeout.Branches) { programBranch.Child(ag_format.Instruction("MintToChecked")). // ParentFunc(func(instructionBranch ag_treeout.Branches) { // Parameters of the instruction: instructionBranch.Child("Params").ParentFunc(func(paramsBranch ag_treeout.Branches) { paramsBranch.Child(ag_format.Param("Amount", *inst.Amount)) paramsBranch.Child(ag_format.Param("Decimals", *inst.Decimals)) }) // Accounts of the instruction: instructionBranch.Child("Accounts").ParentFunc(func(accountsBranch ag_treeout.Branches) { accountsBranch.Child(ag_format.Meta("mint", inst.AccountMetaSlice[0])) accountsBranch.Child(ag_format.Meta("destination", inst.AccountMetaSlice[1])) accountsBranch.Child(ag_format.Meta("authority", inst.AccountMetaSlice[2])) }) }) }) } func (obj MintToChecked) MarshalWithEncoder(encoder *ag_binary.Encoder) (err error) { // Serialize `Amount` param: err = encoder.Encode(obj.Amount) if err != nil { return err } // Serialize `Decimals` param: err = encoder.Encode(obj.Decimals) if err != nil { return err } return nil } func (obj *MintToChecked) UnmarshalWithDecoder(decoder *ag_binary.Decoder) (err error) { // Deserialize `Amount`: err = decoder.Decode(&obj.Amount) if err != nil { return err } // Deserialize `Decimals`: err = decoder.Decode(&obj.Decimals) if err != nil { return err } return nil } // NewMintToCheckedInstruction declares a new MintToChecked instruction with the provided parameters and accounts. func NewMintToCheckedInstruction( // Parameters: amount uint64, decimals uint8, // Accounts: mint ag_solanago.PublicKey, destination ag_solanago.PublicKey, authority ag_solanago.PublicKey) *MintToChecked { return NewMintToCheckedInstructionBuilder(). SetAmount(amount). SetDecimals(decimals). SetMintAccount(mint). SetDestinationAccount(destination). SetAuthorityAccount(authority) }