{"version":3,"file":"sendTokens.cjs","sources":["../../../../../src/plugins/tokenModule/operations/sendTokens.ts"],"sourcesContent":["import { createTransferInstruction } 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\nconst Key = 'SendTokensOperation' as const;\n\n/**\n * Send tokens from one account to another.\n *\n * ```ts\n * await convergence\n *   .tokens()\n *   .send({\n *     mintAddress,\n *     toOwner,\n *     amount: token(100),\n *   };\n * ```\n *\n * @group Operations\n * @category Constructors\n */\nexport const sendTokensOperation = useOperation<SendTokensOperation>(Key);\n\n/**\n * @group Operations\n * @category Types\n */\nexport type SendTokensOperation = Operation<\n  typeof Key,\n  SendTokensInput,\n  SendTokensOutput\n>;\n\n/**\n * @group Operations\n * @category Inputs\n */\nexport type SendTokensInput = {\n  /** The address of the mint account. */\n  mintAddress: PublicKey;\n\n  /** The amount of tokens to send. */\n  amount: SplTokenAmount;\n\n  /**\n   * The owner of the destination token account.\n   *\n   * @defaultValue `convergence.identity().publicKey`\n   */\n  toOwner?: PublicKey;\n\n  /**\n   * The address of the destination token account.\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   * sending 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 owner of the source token account.\n   *\n   * This may be provided as a PublicKey if one of the following is true:\n   * - the owner of the source token account is a multisig and the\n   *   `fromMultiSigners` parameter is provided.\n   * - we are using a delegate authority to send the tokens and the\n   *   `delegateAuthority` parameter is provided.\n   *\n   * @defaultValue `convergence.identity()`\n   */\n  fromOwner?: PublicKey | Signer; // Defaults to mx.identity().\n\n  /**\n   * The address of the source token account.\n   *\n   * @defaultValue Defaults to using the associated token account\n   * from the `mintAddress` and `fromOwner` parameters.\n   */\n  fromToken?: PublicKey;\n\n  /**\n   * The signing accounts to use if the source token owner is a multisig.\n   *\n   * @defaultValue `[]`\n   */\n  fromMultiSigners?: KeypairSigner[];\n\n  /**\n   * The delegate authority of the source token account as a Signer.\n   *\n   * This is required when the owner of the source token account\n   * is provided as a PublicKey as someone needs to authorize\n   * that transfer of tokens.\n   *\n   * @defaultValue Defaults to not using a delegate authority.\n   */\n  delegateAuthority?: Signer;\n};\n\n/**\n * @group Operations\n * @category Outputs\n */\nexport type SendTokensOutput = {\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 sendTokensOperationHandler: OperationHandler<SendTokensOperation> =\n  {\n    async handle(\n      operation: SendTokensOperation,\n      convergence: Convergence,\n      scope: OperationScope\n    ): Promise<SendTokensOutput> {\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: scope.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 sendTokensBuilder(\n        convergence,\n        { ...operation.input, toTokenExists: destinationAccountExists },\n        scope\n      );\n      scope.throwIfCanceled();\n\n      return builder.sendAndConfirm(convergence, scope.confirmOptions);\n    },\n  };\n\n// -----------------\n// Builder\n// -----------------\n\n/**\n * @group Transaction Builders\n * @category Inputs\n */\nexport type SendTokensBuilderParams = Omit<\n  SendTokensInput,\n  'confirmOptions'\n> & {\n  /**\n   * Whether or not the receiving 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 transfers the tokens. */\n  transferTokensInstructionKey?: string;\n};\n\n/**\n * Send tokens from one account to another.\n *\n * ```ts\n * const transactionBuilder = await convergence\n *   .tokens()\n *   .builders()\n *   .send({\n *     mintAddress,\n *     toOwner,\n *     amount: token(100),\n *   });\n * ```\n *\n * @group Transaction Builders\n * @category Constructors\n */\nexport const sendTokensBuilder = async (\n  convergence: Convergence,\n  params: SendTokensBuilderParams,\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    fromOwner = convergence.identity(),\n    fromToken,\n    fromMultiSigners = [],\n    delegateAuthority,\n  } = params;\n\n  const [fromOwnerPublicKey, signers] = isSigner(fromOwner)\n    ? [fromOwner.publicKey, [fromOwner]]\n    : [fromOwner, [delegateAuthority, ...fromMultiSigners].filter(isSigner)];\n\n  const tokenProgram = convergence.programs().getToken(programs);\n  const source =\n    fromToken ??\n    convergence.tokens().pdas().associatedTokenAccount({\n      mint: mintAddress,\n      owner: fromOwnerPublicKey,\n      programs,\n    });\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    .setFeePayer(payer)\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          { programs, payer }\n        )\n    )\n\n    // Transfer tokens.\n    .add({\n      instruction: createTransferInstruction(\n        source,\n        toPublicKey(destination),\n        delegateAuthority ? delegateAuthority.publicKey : fromOwnerPublicKey,\n        amount.basisPoints.toNumber(),\n        fromMultiSigners,\n        tokenProgram.address\n      ),\n      signers,\n      key: params.transferTokensInstructionKey ?? 'transferTokens',\n    });\n  await addComputeBudgetIxsIfNeeded(txBuilder, convergence);\n  return txBuilder;\n};\n"],"names":["Key","sendTokensOperation","useOperation","sendTokensOperationHandler","handle","operation","convergence","scope","_asyncToGenerator","_regeneratorRuntime","mark","_callee","_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","programs","toPublicKey","rpc","accountExists","sent","throwIfCanceled","sendTokensBuilder","_objectSpread","toTokenExists","abrupt","sendAndConfirm","confirmOptions","stop","_ref","_callee2","params","_params$transferToken","options","_options$payer","payer","amount","_params$toOwner","_params$toTokenExists","_params$fromOwner","fromOwner","fromToken","_params$fromMultiSign","fromMultiSigners","delegateAuthority","_ref2","_ref3","fromOwnerPublicKey","signers","tokenProgram","source","txBuilder","_args2","arguments","_callee2$","_context2","length","undefined","getDefaultFeePayer","isSigner","concat","_toConsumableArray","filter","_slicedToArray","getToken","t0","TransactionBuilder","make","setFeePayer","builders","createTokenIfMissing","token","tokenExists","tokenVariable","t1","add","call","instruction","createTransferInstruction","basisPoints","toNumber","address","key","transferTokensInstructionKey","addComputeBudgetIxsIfNeeded","_x","_x2","apply"],"mappings":"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"}