{"version":3,"file":"mintTokens.mjs","sources":["../../../../../src/plugins/tokenModule/operations/mintTokens.ts"],"sourcesContent":["import { createMintToInstruction } from '@solana/spl-token';\nimport { PublicKey } from '@solana/web3.js';\n\nimport { SendAndConfirmTransactionResponse } from '../../rpcModule';\nimport type { Convergence } from '../../../Convergence';\nimport {\n  isSigner,\n  KeypairSigner,\n  Operation,\n  OperationHandler,\n  OperationScope,\n  Signer,\n  SplTokenAmount,\n  toPublicKey,\n  useOperation,\n} from '../../../types';\nimport {\n  TransactionBuilder,\n  TransactionBuilderOptions,\n} from '../../../utils/TransactionBuilder';\nimport { addComputeBudgetIxsIfNeeded } from '@/utils/helpers';\n\n// -----------------\n// Operation\n// -----------------\n\nconst Key = 'MintTokensOperation' as const;\n\n/**\n * Mint tokens to an account.\n *\n * ```ts\n * await convergence\n *   .tokens()\n *   .mint({\n *     mintAddress,\n *     toOwner,\n *     amount: token(100),\n *   };\n * ```\n *\n * @group Operations\n * @category Constructors\n */\nexport const mintTokensOperation = useOperation<MintTokensOperation>(Key);\n\n/**\n * @group Operations\n * @category Types\n */\nexport type MintTokensOperation = Operation<\n  typeof Key,\n  MintTokensInput,\n  MintTokensOutput\n>;\n\n/**\n * @group Operations\n * @category Inputs\n */\nexport type MintTokensInput = {\n  /** The address of the mint account. */\n  mintAddress: PublicKey;\n\n  /** The amount of tokens to mint. */\n  amount: SplTokenAmount;\n\n  /**\n   * The owner of the token account to mint to.\n   *\n   * @defaultValue `convergence.identity().publicKey`\n   */\n  toOwner?: PublicKey;\n\n  /**\n   * The address of the token account to mint to.\n   *\n   * Note that this may be required as a `Signer` if the destination\n   * token account does not exist and we need to create it before\n   * minting the tokens.\n   *\n   * @defaultValue Defaults to using the associated token account\n   * from the `mintAddress` and `toOwner` parameters.\n   */\n  toToken?: PublicKey | Signer;\n\n  /**\n   * The authority that is allowed to mint new tokens as a Signer.\n   *\n   * This may be provided as a PublicKey if and only if\n   * the `multiSigners` parameter is provided.\n   *\n   * @defaultValue `convergence.identity()`\n   */\n  mintAuthority?: PublicKey | Signer;\n\n  /**\n   * The signing accounts to use if the mint authority is a multisig.\n   *\n   * @defaultValue `[]`\n   */\n  multiSigners?: KeypairSigner[];\n};\n\n/**\n * @group Operations\n * @category Outputs\n */\nexport type MintTokensOutput = {\n  /** The blockchain response from sending and confirming the transaction. */\n  response: SendAndConfirmTransactionResponse;\n};\n\n/**\n * @group Operations\n * @category Handlers\n */\nexport const mintTokensOperationHandler: OperationHandler<MintTokensOperation> =\n  {\n    async handle(\n      operation: MintTokensOperation,\n      convergence: Convergence,\n      scope: OperationScope\n    ): Promise<MintTokensOutput> {\n      const { programs, confirmOptions } = scope;\n      const {\n        mintAddress,\n        toOwner = convergence.identity().publicKey,\n        toToken,\n      } = operation.input;\n\n      const destination =\n        toToken ??\n        convergence.tokens().pdas().associatedTokenAccount({\n          mint: mintAddress,\n          owner: toOwner,\n          programs,\n        });\n      const destinationAddress = toPublicKey(destination);\n      const destinationAccountExists = await convergence\n        .rpc()\n        .accountExists(destinationAddress);\n      scope.throwIfCanceled();\n\n      const builder = await mintTokensBuilder(\n        convergence,\n        { ...operation.input, toTokenExists: destinationAccountExists },\n        scope\n      );\n      scope.throwIfCanceled();\n\n      return builder.sendAndConfirm(convergence, confirmOptions);\n    },\n  };\n\n// -----------------\n// Builder\n// -----------------\n\n/**\n * @group Transaction Builders\n * @category Inputs\n */\nexport type MintTokensBuilderParams = Omit<\n  MintTokensInput,\n  'confirmOptions'\n> & {\n  /**\n   * Whether or not the provided token account already exists.\n   * If `false`, we'll add another instruction to create it.\n   *\n   * @defaultValue `true`\n   */\n  toTokenExists?: boolean;\n\n  /** A key to distinguish the instruction that creates the associated token account. */\n  createAssociatedTokenAccountInstructionKey?: string;\n\n  /** A key to distinguish the instruction that creates the token account. */\n  createAccountInstructionKey?: string;\n\n  /** A key to distinguish the instruction that initializes the token account. */\n  initializeTokenInstructionKey?: string;\n\n  /** A key to distinguish the instruction that mints tokens. */\n  mintTokensInstructionKey?: string;\n};\n\n/**\n * Mint tokens to an account.\n *\n * ```ts\n * const transactionBuilder = await convergence\n *   .tokens()\n *   .builders()\n *   .mint({\n *     mintAddress,\n *     toOwner,\n *     amount: token(100),\n *   });\n * ```\n *\n * @group Transaction Builders\n * @category Constructors\n */\nexport const mintTokensBuilder = async (\n  convergence: Convergence,\n  params: MintTokensBuilderParams,\n  options: TransactionBuilderOptions = {}\n): Promise<TransactionBuilder> => {\n  const { programs, payer = convergence.rpc().getDefaultFeePayer() } = options;\n  const {\n    mintAddress,\n    amount,\n    toOwner = convergence.identity().publicKey,\n    toToken,\n    toTokenExists = true,\n    mintAuthority = convergence.identity(),\n    multiSigners = [],\n  } = params;\n\n  const [mintAuthorityPublicKey, signers] = isSigner(mintAuthority)\n    ? [mintAuthority.publicKey, [mintAuthority]]\n    : [mintAuthority, multiSigners];\n\n  const tokenProgram = convergence.programs().getToken(programs);\n  const destination =\n    toToken ??\n    convergence.tokens().pdas().associatedTokenAccount({\n      mint: mintAddress,\n      owner: toOwner,\n      programs,\n    });\n\n  const txBuilder = TransactionBuilder.make()\n    // Create token account if missing.\n    .add(\n      await convergence\n        .tokens()\n        .builders()\n        .createTokenIfMissing(\n          {\n            ...params,\n            mint: mintAddress,\n            owner: toOwner,\n            token: toToken,\n            tokenExists: toTokenExists,\n            tokenVariable: 'toToken',\n          },\n          { payer, programs }\n        )\n    )\n\n    // Mint tokens.\n    .add({\n      instruction: createMintToInstruction(\n        mintAddress,\n        toPublicKey(destination),\n        mintAuthorityPublicKey,\n        amount.basisPoints.toNumber(),\n        multiSigners,\n        tokenProgram.address\n      ),\n      signers,\n      key: params.mintTokensInstructionKey ?? 'mintTokens',\n    });\n  await addComputeBudgetIxsIfNeeded(txBuilder, convergence);\n  return txBuilder;\n};\n"],"names":["Key","mintTokensOperation","useOperation","mintTokensOperationHandler","handle","operation","convergence","scope","_asyncToGenerator","_regeneratorRuntime","mark","_callee","programs","confirmOptions","_operation$input","mintAddress","_operation$input$toOw","toOwner","toToken","destination","destinationAddress","destinationAccountExists","builder","wrap","_callee$","_context","prev","next","input","identity","publicKey","tokens","pdas","associatedTokenAccount","mint","owner","toPublicKey","rpc","accountExists","sent","throwIfCanceled","mintTokensBuilder","_objectSpread","toTokenExists","abrupt","sendAndConfirm","stop","_ref","_callee2","params","_params$mintTokensIns","options","_options$payer","payer","amount","_params$toOwner","_params$toTokenExists","_params$mintAuthority","mintAuthority","_params$multiSigners","multiSigners","_ref2","_ref3","mintAuthorityPublicKey","signers","tokenProgram","txBuilder","_args2","arguments","_callee2$","_context2","length","undefined","getDefaultFeePayer","isSigner","_slicedToArray","getToken","t0","TransactionBuilder","make","builders","createTokenIfMissing","token","tokenExists","tokenVariable","t1","add","call","instruction","createMintToInstruction","basisPoints","toNumber","address","key","mintTokensInstructionKey","addComputeBudgetIxsIfNeeded","_x","_x2","apply"],"mappings":"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"}