{"version":3,"sources":["../../src/schemes/exact/evm/utils/paymentUtils.ts","../../src/schemes/exact/evm/sign.ts","../../src/schemes/exact/evm/client.ts","../../src/schemes/exact/evm/permit-client.ts","../../src/schemes/exact/evm/permit-sign.ts","../../src/schemes/exact/svm/client.ts"],"sourcesContent":["import { safeBase64Encode, safeBase64Decode } from \"../../../../shared\";\nimport { SupportedEVMNetworks, SupportedSVMNetworks } from \"../../../../types\";\nimport {\n  PaymentPayload,\n  PaymentPayloadSchema,\n  ExactEvmPayload,\n  ExactEvmPermitPayload,\n  ExactSvmPayload,\n} from \"../../../../types/verify\";\n\n/**\n * Encodes a payment payload into a base64 string, ensuring bigint values are properly stringified\n *\n * @param payment - The payment payload to encode\n * @returns A base64 encoded string representation of the payment payload\n */\nexport function encodePayment(payment: PaymentPayload): string {\n  let safe: PaymentPayload;\n\n  // evm\n  if (SupportedEVMNetworks.includes(payment.network)) {\n    // Handle EIP-3009 authorization payload\n    if (\"authorization\" in payment.payload) {\n      const evmPayload = payment.payload as ExactEvmPayload;\n      safe = {\n        ...payment,\n        payload: {\n          ...evmPayload,\n          authorization: Object.fromEntries(\n            Object.entries(evmPayload.authorization).map(([key, value]) => [\n              key,\n              typeof value === \"bigint\" ? (value as bigint).toString() : value,\n            ]),\n          ) as ExactEvmPayload[\"authorization\"],\n        },\n      };\n      return safeBase64Encode(JSON.stringify(safe));\n    }\n    // Handle ERC-2612 permit payload\n    else if (\"permit\" in payment.payload) {\n      const permitPayload = payment.payload as ExactEvmPermitPayload;\n      safe = {\n        ...payment,\n        payload: {\n          ...permitPayload,\n          permit: Object.fromEntries(\n            Object.entries(permitPayload.permit).map(([key, value]) => [\n              key,\n              typeof value === \"bigint\" ? (value as bigint).toString() : value,\n            ]),\n          ) as ExactEvmPermitPayload[\"permit\"],\n        },\n      };\n      return safeBase64Encode(JSON.stringify(safe));\n    } else {\n      throw new Error(\"Invalid EVM payload: must contain either authorization or permit\");\n    }\n  }\n\n  // svm\n  if (SupportedSVMNetworks.includes(payment.network)) {\n    safe = { ...payment, payload: payment.payload as ExactSvmPayload };\n    return safeBase64Encode(JSON.stringify(safe));\n  }\n\n  throw new Error(\"Invalid network\");\n}\n\n/**\n * Decodes a base64 encoded payment string back into a PaymentPayload object\n *\n * @param payment - The base64 encoded payment string to decode\n * @returns The decoded and validated PaymentPayload object\n */\nexport function decodePayment(payment: string): PaymentPayload {\n  const decoded = safeBase64Decode(payment);\n  const parsed = JSON.parse(decoded);\n\n  let obj: PaymentPayload;\n\n  // evm - handles both authorization and permit payloads\n  if (SupportedEVMNetworks.includes(parsed.network)) {\n    obj = {\n      ...parsed,\n      payload: parsed.payload as ExactEvmPayload | ExactEvmPermitPayload,\n    };\n  }\n\n  // svm\n  else if (SupportedSVMNetworks.includes(parsed.network)) {\n    obj = {\n      ...parsed,\n      payload: parsed.payload as ExactSvmPayload,\n    };\n  } else {\n    throw new Error(\"Invalid network\");\n  }\n\n  // PaymentPayloadSchema validates the union type correctly\n  const validated = PaymentPayloadSchema.parse(obj);\n  return validated;\n}\n","import { Chain, getAddress, Hex, LocalAccount, toHex, Transport } from \"viem\";\nimport { getNetworkId } from \"../../../shared\";\nimport {\n  authorizationTypes,\n  isAccount,\n  isSignerWallet,\n  SignerWallet,\n} from \"../../../types/shared/evm\";\nimport { ExactEvmPayloadAuthorization, PaymentRequirements } from \"../../../types/verify\";\n\n/**\n * Signs an EIP-3009 authorization for USDC transfer\n *\n * @param walletClient - The wallet client that will sign the authorization\n * @param params - The authorization parameters containing transfer details\n * @param params.from - The address tokens will be transferred from\n * @param params.to - The address tokens will be transferred to\n * @param params.value - The amount of USDC tokens to transfer (in base units)\n * @param params.validAfter - Unix timestamp after which the authorization becomes valid\n * @param params.validBefore - Unix timestamp before which the authorization is valid\n * @param params.nonce - Random 32-byte nonce to prevent replay attacks\n * @param paymentRequirements - The payment requirements containing asset and network information\n * @param paymentRequirements.asset - The address of the USDC contract\n * @param paymentRequirements.network - The network where the USDC contract exists\n * @param paymentRequirements.extra - The extra information containing the name and version of the ERC20 contract\n * @returns The signature for the authorization\n */\nexport async function signAuthorization<transport extends Transport, chain extends Chain>(\n  walletClient: SignerWallet<chain, transport> | LocalAccount,\n  { from, to, value, validAfter, validBefore, nonce }: ExactEvmPayloadAuthorization,\n  { asset, network, extra }: PaymentRequirements,\n): Promise<{ signature: Hex }> {\n  const chainId = getNetworkId(network);\n  const name = extra?.name;\n  const version = extra?.version;\n\n  const data = {\n    types: authorizationTypes,\n    domain: {\n      name,\n      version,\n      chainId,\n      verifyingContract: getAddress(asset),\n    },\n    primaryType: \"TransferWithAuthorization\" as const,\n    message: {\n      from: getAddress(from),\n      to: getAddress(to),\n      value,\n      validAfter,\n      validBefore,\n      nonce: nonce,\n    },\n  };\n\n  if (isSignerWallet(walletClient)) {\n    const signature = await walletClient.signTypedData(data);\n    return {\n      signature,\n    };\n  } else if (isAccount(walletClient) && walletClient.signTypedData) {\n    const signature = await walletClient.signTypedData(data);\n    return {\n      signature,\n    };\n  } else {\n    throw new Error(\"Invalid wallet client provided does not support signTypedData\");\n  }\n}\n\n/**\n * Generates a random 32-byte nonce for use in authorization signatures\n *\n * @returns A random 32-byte nonce as a hex string\n */\nexport function createNonce(): Hex {\n  const cryptoObj =\n    typeof globalThis.crypto !== \"undefined\" &&\n    typeof globalThis.crypto.getRandomValues === \"function\"\n      ? globalThis.crypto\n      : // Dynamic require is needed to support node.js\n        // eslint-disable-next-line @typescript-eslint/no-require-imports\n        require(\"crypto\").webcrypto;\n  return toHex(cryptoObj.getRandomValues(new Uint8Array(32)));\n}\n","import { Address, Chain, LocalAccount, Transport } from \"viem\";\nimport { isSignerWallet, SignerWallet } from \"../../../types/shared/evm\";\nimport { ExactEvmPayload, PaymentPayload, PaymentRequirements } from \"../../../types/verify\";\nimport { createNonce, signAuthorization } from \"./sign\";\nimport { encodePayment } from \"./utils/paymentUtils\";\n\n// Type for unsigned EIP-3009 authorization payload\ntype UnsignedAuthorizationPayload = Omit<PaymentPayload, \"payload\"> & {\n  payload: Omit<ExactEvmPayload, \"signature\"> & { signature: undefined };\n};\n\n/**\n * Prepares an unsigned payment header with the given sender address and payment requirements.\n *\n * @param from - The sender's address from which the payment will be made\n * @param x402Version - The version of the X402 protocol to use\n * @param paymentRequirements - The payment requirements containing scheme and network information\n * @returns An unsigned payment payload containing authorization details\n */\nexport function preparePaymentHeader(\n  from: Address,\n  x402Version: number,\n  paymentRequirements: PaymentRequirements,\n): UnsignedAuthorizationPayload {\n  const nonce = createNonce();\n\n  const validAfter = BigInt(\n    Math.floor(Date.now() / 1000) - 600, // 10 minutes before\n  ).toString();\n  const validBefore = BigInt(\n    Math.floor(Date.now() / 1000 + paymentRequirements.maxTimeoutSeconds),\n  ).toString();\n\n  // For cross-chain/swap payments, send to the appropriate wallet:\n  // - recipient (preferred): Pre-allocated wallet from quote for swaps\n  // - globalWalletAddress (deprecated): Backward compatible alias for recipient\n  // - facilitatorAddress (fallback): Static facilitator EOA for legacy flow\n  // For direct payments (same chain, same token), send directly to payTo\n  const isCrossChainOrSwap =\n    paymentRequirements.srcNetwork !== paymentRequirements.network ||\n    (paymentRequirements.srcTokenAddress &&\n      paymentRequirements.srcTokenAddress.toLowerCase() !== paymentRequirements.asset?.toLowerCase());\n\n  // Prefer recipient for cross-chain swaps (allows authorization.to to be set correctly)\n  // Fall back to globalWalletAddress (deprecated) or facilitatorAddress for backward compatibility\n  const toAddress =\n    isCrossChainOrSwap && paymentRequirements.extra?.recipient\n      ? (paymentRequirements.extra.recipient as Address)\n      : isCrossChainOrSwap && paymentRequirements.extra?.globalWalletAddress\n        ? (paymentRequirements.extra.globalWalletAddress as Address)\n        : isCrossChainOrSwap && paymentRequirements.extra?.facilitatorAddress\n          ? (paymentRequirements.extra.facilitatorAddress as Address)\n          : (paymentRequirements.payTo as Address);\n\n  return {\n    x402Version,\n    scheme: paymentRequirements.scheme,\n    network: paymentRequirements.srcNetwork ?? paymentRequirements.network,\n    payload: {\n      signature: undefined,\n      authorization: {\n        from,\n        to: toAddress,\n        value: paymentRequirements.srcAmountRequired || paymentRequirements.maxAmountRequired,\n        validAfter: validAfter.toString(),\n        validBefore: validBefore.toString(),\n        nonce,\n      },\n    },\n  };\n}\n\n/**\n * Signs a payment header using the provided client and payment requirements.\n *\n * @param client - The signer wallet instance used to sign the payment header\n * @param paymentRequirements - The payment requirements containing scheme and network information\n * @param unsignedPaymentHeader - The unsigned payment payload to be signed\n * @returns A promise that resolves to the signed payment payload\n */\nexport async function signPaymentHeader<transport extends Transport, chain extends Chain>(\n  client: SignerWallet<chain, transport> | LocalAccount,\n  paymentRequirements: PaymentRequirements,\n  unsignedPaymentHeader: UnsignedAuthorizationPayload,\n): Promise<PaymentPayload> {\n  const { signature } = await signAuthorization(\n    client,\n    unsignedPaymentHeader.payload.authorization,\n    paymentRequirements,\n  );\n\n  return {\n    ...unsignedPaymentHeader,\n    payload: {\n      ...unsignedPaymentHeader.payload,\n      signature,\n    },\n  };\n}\n\n/**\n * Creates a complete payment payload by preparing and signing a payment header.\n *\n * @param client - The signer wallet instance used to create and sign the payment\n * @param x402Version - The version of the X402 protocol to use\n * @param paymentRequirements - The payment requirements containing scheme and network information\n * @returns A promise that resolves to the complete signed payment payload\n */\nexport async function createPayment<transport extends Transport, chain extends Chain>(\n  client: SignerWallet<chain, transport> | LocalAccount,\n  x402Version: number,\n  paymentRequirements: PaymentRequirements,\n): Promise<PaymentPayload> {\n  const from = isSignerWallet(client) ? client.account!.address : client.address;\n  const unsignedPaymentHeader = preparePaymentHeader(from, x402Version, paymentRequirements);\n  return signPaymentHeader(client, paymentRequirements, unsignedPaymentHeader);\n}\n\n/**\n * Creates and encodes a payment header for the given client and payment requirements.\n *\n * @param client - The signer wallet instance used to create the payment header\n * @param x402Version - The version of the X402 protocol to use\n * @param paymentRequirements - The payment requirements containing scheme and network information\n * @returns A promise that resolves to the encoded payment header string\n */\nexport async function createPaymentHeader(\n  client: SignerWallet | LocalAccount,\n  x402Version: number,\n  paymentRequirements: PaymentRequirements,\n): Promise<string> {\n  const payment = await createPayment(client, x402Version, paymentRequirements);\n  return encodePayment(payment);\n}\n","import {\n  Address,\n  Chain,\n  LocalAccount,\n  PublicClient,\n  Transport,\n  createPublicClient,\n  http,\n} from \"viem\";\nimport { getNetworkId } from \"../../../shared\";\nimport { isSignerWallet, SignerWallet, getChainFromNetwork } from \"../../../types/shared/evm\";\nimport { ChainIdToNetwork } from \"../../../types/shared\";\nimport {\n  ExactEvmPermitPayload,\n  PaymentPayload,\n  PaymentRequirements,\n  UnsignedPaymentPayload,\n} from \"../../../types/verify\";\nimport { signPermit } from \"./permit-sign\";\nimport { encodePayment } from \"./utils/paymentUtils\";\n\n/**\n * Gets the current nonce for an owner address from the ERC-20 contract\n *\n * @param client - The wallet client to query the contract\n * @param asset - The ERC-20 token contract address\n * @param owner - The owner address\n * @param chainId - Optional chain ID to query the nonce from (for cross-chain payments)\n * @returns The current nonce as a string\n */\nexport async function getPermitNonce<transport extends Transport, chain extends Chain>(\n  client: SignerWallet<chain, transport> | LocalAccount,\n  asset: Address,\n  owner: Address,\n  chainId?: number,\n): Promise<string> {\n  // If chainId is provided and differs from the wallet's chain, create a temporary client\n  const walletClient = isSignerWallet(client) ? client : null;\n\n  let queryClient: PublicClient | SignerWallet<chain, transport>;\n  if (chainId && walletClient && walletClient.chain?.id !== chainId) {\n    // Cross-chain case: create a temporary public client for the source chain\n    const network = ChainIdToNetwork[chainId];\n    if (!network) {\n      throw new Error(`Unsupported chain ID: ${chainId}`);\n    }\n    const sourceChain = getChainFromNetwork(network);\n    // @ts-expect-error - Type mismatch between PublicClient and SignerWallet, but both support readContract\n    queryClient = createPublicClient({\n      chain: sourceChain,\n      transport: http(),\n    });\n  } else {\n    // Same-chain case: use the wallet client\n    if (!walletClient) {\n      throw new Error(\"Permit nonce query requires a connected wallet client\");\n    }\n    queryClient = walletClient;\n  }\n\n  const nonce = await queryClient.readContract({\n    address: asset,\n    abi: [\n      {\n        inputs: [{ internalType: \"address\", name: \"owner\", type: \"address\" }],\n        name: \"nonces\",\n        outputs: [{ internalType: \"uint256\", name: \"\", type: \"uint256\" }],\n        stateMutability: \"view\",\n        type: \"function\",\n      },\n    ],\n    functionName: \"nonces\",\n    args: [owner],\n  });\n  return nonce.toString();\n}\n\n/**\n * Prepares an unsigned permit payment header with the given owner address and payment requirements.\n *\n * @param owner - The owner's address that will approve the spender\n * @param x402Version - The version of the X402 protocol to use\n * @param paymentRequirements - The payment requirements containing scheme and network information\n * @param nonce - The current nonce for the owner (should be queried from contract)\n * @returns An unsigned payment payload containing permit details\n */\nexport function preparePermitPaymentHeader(\n  owner: Address,\n  x402Version: number,\n  paymentRequirements: PaymentRequirements,\n  nonce: string,\n): UnsignedPaymentPayload {\n  const deadline = BigInt(\n    Math.floor(Date.now() / 1000 + paymentRequirements.maxTimeoutSeconds),\n  ).toString();\n\n  // For permit, the spender needs to be specified in payment requirements extra field\n  // This is the facilitator address that will execute the transferFrom call\n  const spender = (paymentRequirements.extra?.facilitatorAddress ||\n    paymentRequirements.payTo) as Address;\n\n  // Extract domain information from payment requirements\n  // If chainId and verifyingContract are provided in extra (from quote), use them\n  // Otherwise, infer from network and asset\n  const chainId = paymentRequirements.extra?.chainId ?? getNetworkId(paymentRequirements.network);\n  const verifyingContract =\n    (paymentRequirements.extra?.verifyingContract as Address) ??\n    (paymentRequirements.asset as Address);\n  const name = paymentRequirements.extra?.name;\n  const version = paymentRequirements.extra?.version;\n\n  if (!name) {\n    throw new Error(\"permit requires paymentRequirements.extra.name (ERC-20 token name)\");\n  }\n  if (!version) {\n    throw new Error(\"permit requires paymentRequirements.extra.version (ERC-20 token version)\");\n  }\n\n  return {\n    x402Version,\n    scheme: paymentRequirements.scheme,\n    network: paymentRequirements.srcNetwork || paymentRequirements.network,\n    payload: {\n      signature: undefined,\n      permit: {\n        owner,\n        spender,\n        value: paymentRequirements.srcAmountRequired || paymentRequirements.maxAmountRequired,\n        nonce,\n        deadline,\n        domain: {\n          name,\n          version,\n          chainId,\n          verifyingContract,\n        },\n      },\n    },\n  };\n}\n\n/**\n * Signs a permit payment header using the provided client and payment requirements.\n *\n * @param client - The signer wallet instance used to sign the permit header\n * @param paymentRequirements - The payment requirements containing scheme and network information\n * @param unsignedPaymentHeader - The unsigned payment payload to be signed\n * @returns A promise that resolves to the signed payment payload\n */\nexport async function signPermitPaymentHeader<transport extends Transport, chain extends Chain>(\n  client: SignerWallet<chain, transport> | LocalAccount,\n  paymentRequirements: PaymentRequirements,\n  unsignedPaymentHeader: UnsignedPaymentPayload,\n): Promise<PaymentPayload> {\n  const permitPayload = unsignedPaymentHeader.payload as Omit<\n    ExactEvmPermitPayload,\n    \"signature\"\n  > & {\n    signature: undefined;\n  };\n\n  const { signature } = await signPermit(client, permitPayload.permit);\n\n  // For swaps: include recipient from payment requirements extra field\n  // This is the intermediate address (global wallet) where funds should be transferred\n  const recipient = paymentRequirements.extra?.recipient as string | undefined;\n\n  return {\n    ...unsignedPaymentHeader,\n    payload: {\n      ...permitPayload,\n      signature,\n      ...(recipient && { recipient }),\n    },\n  };\n}\n\n/**\n * Creates a complete permit payment payload by preparing and signing a permit header.\n *\n * @param client - The signer wallet instance used to create and sign the permit\n * @param x402Version - The version of the X402 protocol to use\n * @param paymentRequirements - The payment requirements containing scheme and network information\n * @returns A promise that resolves to the complete signed permit payment payload\n */\nexport async function createPermitPayment<transport extends Transport, chain extends Chain>(\n  client: SignerWallet<chain, transport> | LocalAccount,\n  x402Version: number,\n  paymentRequirements: PaymentRequirements,\n): Promise<PaymentPayload> {\n  const owner = isSignerWallet(client) ? client.account!.address : client.address;\n\n  // Query the current nonce from the contract\n  // For cross-chain payments (AnySpend), use the source token (verifyingContract) instead of destination asset\n  const tokenAddress =\n    (paymentRequirements.extra?.verifyingContract as Address) ||\n    (paymentRequirements.asset as Address);\n  console.log(\"owner\", owner);\n  console.log(\"tokenAddress for nonce query\", tokenAddress);\n  console.log(\"paymentRequirements.asset (destination)\", paymentRequirements.asset);\n\n  // Pass the chainId from payment requirements for cross-chain queries\n  const chainId = paymentRequirements.extra?.chainId ?? getNetworkId(paymentRequirements.network);\n  const nonce = await getPermitNonce(client, tokenAddress, owner, chainId);\n  console.log(\"nonce\", nonce);\n  const unsignedPaymentHeader = preparePermitPaymentHeader(\n    owner,\n    x402Version,\n    paymentRequirements,\n    nonce,\n  );\n  return signPermitPaymentHeader(client, paymentRequirements, unsignedPaymentHeader);\n}\n\n/**\n * Creates and encodes a permit payment header for the given client and payment requirements.\n *\n * @param client - The signer wallet instance used to create the permit payment header\n * @param x402Version - The version of the X402 protocol to use\n * @param paymentRequirements - The payment requirements containing scheme and network information\n * @returns A promise that resolves to the encoded permit payment header string\n */\nexport async function createPermitPaymentHeader(\n  client: SignerWallet | LocalAccount,\n  x402Version: number,\n  paymentRequirements: PaymentRequirements,\n): Promise<string> {\n  const payment = await createPermitPayment(client, x402Version, paymentRequirements);\n  return encodePayment(payment);\n}\n","import { Chain, getAddress, Hex, LocalAccount, Transport } from \"viem\";\nimport { permitTypes, isAccount, isSignerWallet, SignerWallet } from \"../../../types/shared/evm\";\nimport { ExactEvmPermitPayloadAuthorization } from \"../../../types/verify\";\n\n/**\n * Signs an ERC-2612 permit for ERC-20 token approval\n *\n * @param walletClient - The wallet client that will sign the permit\n * @param params - The permit parameters containing approval details\n * @param params.owner - The address that owns the tokens\n * @param params.spender - The address that will be approved to spend tokens\n * @param params.value - The amount of tokens to approve (in base units)\n * @param params.nonce - Sequential nonce for the owner (uint256)\n * @param params.deadline - Unix timestamp after which the permit expires\n * @param params.domain - The EIP-712 domain containing name, version, chainId, and verifyingContract\n * @returns The signature for the permit\n */\nexport async function signPermit<transport extends Transport, chain extends Chain>(\n  walletClient: SignerWallet<chain, transport> | LocalAccount,\n  { owner, spender, value, nonce, deadline, domain }: ExactEvmPermitPayloadAuthorization,\n): Promise<{ signature: Hex }> {\n  const data = {\n    types: permitTypes,\n    domain: {\n      name: domain.name,\n      version: domain.version,\n      chainId: domain.chainId,\n      verifyingContract: getAddress(domain.verifyingContract),\n    },\n    primaryType: \"Permit\" as const,\n    message: {\n      owner: getAddress(owner),\n      spender: getAddress(spender),\n      value: BigInt(value),\n      nonce: BigInt(nonce),\n      deadline: BigInt(deadline),\n    },\n  };\n\n  if (isSignerWallet(walletClient)) {\n    const signature = await walletClient.signTypedData(data);\n    return {\n      signature,\n    };\n  } else if (isAccount(walletClient) && walletClient.signTypedData) {\n    const signature = await walletClient.signTypedData(data);\n    return {\n      signature,\n    };\n  } else {\n    throw new Error(\"Invalid wallet client provided does not support signTypedData\");\n  }\n}\n","import { encodePayment } from \"../../utils\";\nimport {\n  Address,\n  pipe,\n  createTransactionMessage,\n  setTransactionMessageFeePayer,\n  setTransactionMessageLifetimeUsingBlockhash,\n  appendTransactionMessageInstructions,\n  partiallySignTransactionMessageWithSigners,\n  prependTransactionMessageInstruction,\n  getBase64EncodedWireTransaction,\n  fetchEncodedAccount,\n  TransactionSigner,\n  Instruction,\n} from \"@solana/kit\";\nimport { PaymentPayload, PaymentRequirements } from \"../../../types/verify\";\nimport { X402Config } from \"../../../types/config\";\nimport {\n  fetchMint,\n  findAssociatedTokenPda,\n  getCreateAssociatedTokenInstruction,\n  getTransferCheckedInstruction,\n  TOKEN_2022_PROGRAM_ADDRESS,\n} from \"@solana-program/token-2022\";\nimport { TOKEN_PROGRAM_ADDRESS } from \"@solana-program/token\";\nimport {\n  estimateComputeUnitLimitFactory,\n  getSetComputeUnitLimitInstruction,\n  setTransactionMessageComputeUnitPrice,\n} from \"@solana-program/compute-budget\";\nimport { getRpcClient } from \"../../../shared/svm/rpc\";\n\n/**\n * Creates and encodes a payment header for the given client and payment requirements.\n *\n * @param client - The signer instance used to create the payment header\n * @param x402Version - The version of the X402 protocol to use\n * @param paymentRequirements - The payment requirements containing scheme and network information\n * @param config - Optional configuration for X402 operations (e.g., custom RPC URLs)\n * @returns A promise that resolves to a base64 encoded payment header string\n */\nexport async function createPaymentHeader(\n  client: TransactionSigner,\n  x402Version: number,\n  paymentRequirements: PaymentRequirements,\n  config?: X402Config,\n): Promise<string> {\n  const paymentPayload = await createAndSignPayment(\n    client,\n    x402Version,\n    paymentRequirements,\n    config,\n  );\n  return encodePayment(paymentPayload);\n}\n\n/**\n * Creates and signs a payment for the given client and payment requirements.\n *\n * @param client - The signer instance used to create and sign the payment tx\n * @param x402Version - The version of the X402 protocol to use\n * @param paymentRequirements - The payment requirements\n * @param config - Optional configuration for X402 operations (e.g., custom RPC URLs)\n * @returns A promise that resolves to a payment payload containing a base64 encoded solana token transfer tx\n */\nexport async function createAndSignPayment(\n  client: TransactionSigner,\n  x402Version: number,\n  paymentRequirements: PaymentRequirements,\n  config?: X402Config,\n): Promise<PaymentPayload> {\n  const transactionMessage = await createTransferTransactionMessage(\n    client,\n    paymentRequirements,\n    config,\n  );\n  const signedTransaction = await partiallySignTransactionMessageWithSigners(transactionMessage);\n  const base64EncodedWireTransaction = getBase64EncodedWireTransaction(signedTransaction);\n\n  // return payment payload\n  return {\n    scheme: paymentRequirements.scheme,\n    network: paymentRequirements.network,\n    x402Version: x402Version,\n    payload: {\n      transaction: base64EncodedWireTransaction,\n    },\n  } as PaymentPayload;\n}\n\n/**\n * Creates a transfer transaction message for the given client and payment requirements.\n *\n * @param client - The signer instance used to create the transfer transaction message\n * @param paymentRequirements - The payment requirements\n * @param config - Optional configuration for X402 operations (e.g., custom RPC URLs)\n * @returns A promise that resolves to the transaction message with the transfer instruction\n */\nasync function createTransferTransactionMessage(\n  client: TransactionSigner,\n  paymentRequirements: PaymentRequirements,\n  config?: X402Config,\n) {\n  const rpc = getRpcClient(paymentRequirements.network, config?.svmConfig?.rpcUrl);\n\n  // create the transfer instruction\n  const transferInstructions = await createAtaAndTransferInstructions(\n    client,\n    paymentRequirements,\n    config,\n  );\n\n  // create tx to simulate\n  const feePayer = paymentRequirements.extra?.feePayer as Address;\n  const txToSimulate = pipe(\n    createTransactionMessage({ version: 0 }),\n    tx => setTransactionMessageComputeUnitPrice(1, tx), // 1 microlamport priority fee\n    tx => setTransactionMessageFeePayer(feePayer, tx),\n    tx => appendTransactionMessageInstructions(transferInstructions, tx),\n  );\n\n  // estimate the compute budget limit (gas limit)\n  const estimateComputeUnitLimit = estimateComputeUnitLimitFactory({ rpc });\n  const estimatedUnits = await estimateComputeUnitLimit(txToSimulate);\n\n  // finalize the transaction message by adding the compute budget limit and blockhash\n  const { value: latestBlockhash } = await rpc.getLatestBlockhash().send();\n  const tx = pipe(\n    txToSimulate,\n    tx =>\n      prependTransactionMessageInstruction(\n        getSetComputeUnitLimitInstruction({ units: estimatedUnits }),\n        tx,\n      ),\n    tx => setTransactionMessageLifetimeUsingBlockhash(latestBlockhash, tx),\n  );\n\n  return tx;\n}\n\n/**\n * Creates a transfer instruction for the given client and payment requirements.\n * This function will determine which transfer instruction to create\n * based on the program that created the token (token-2022 or token).\n *\n * @param client - The signer instance used to create the transfer instruction\n * @param paymentRequirements - The payment requirements\n * @param config - Optional configuration for X402 operations (e.g., custom RPC URLs)\n * @returns A promise that resolves to the create ATA (if needed) and transfer instruction\n */\nasync function createAtaAndTransferInstructions(\n  client: TransactionSigner,\n  paymentRequirements: PaymentRequirements,\n  config?: X402Config,\n): Promise<Instruction[]> {\n  const { asset } = paymentRequirements;\n\n  const rpc = getRpcClient(paymentRequirements.network, config?.svmConfig?.rpcUrl);\n  const tokenMint = await fetchMint(rpc, asset as Address);\n  const tokenProgramAddress = tokenMint.programAddress;\n\n  // validate that the asset was created by a known token program\n  if (\n    tokenProgramAddress.toString() !== TOKEN_PROGRAM_ADDRESS.toString() &&\n    tokenProgramAddress.toString() !== TOKEN_2022_PROGRAM_ADDRESS.toString()\n  ) {\n    throw new Error(\"Asset was not created by a known token program\");\n  }\n\n  const instructions: Instruction[] = [];\n\n  // create the ATA (if needed)\n  const createAtaIx = await createAtaInstructionOrUndefined(\n    paymentRequirements,\n    tokenProgramAddress,\n    config,\n  );\n  if (createAtaIx) {\n    instructions.push(createAtaIx);\n  }\n\n  // create the transfer instruction\n  const transferIx = await createTransferInstruction(\n    client,\n    paymentRequirements,\n    tokenMint.data.decimals,\n    tokenProgramAddress,\n  );\n  instructions.push(transferIx);\n\n  return instructions;\n}\n\n/**\n * Returns a create ATA instruction for the payTo address if the ATA account does not exist.\n * The create ATA instruction will be paid for by the feePayer in the payment requirements.\n *\n * This function will work for both spl-token and token-2022.\n *\n * Returns undefined if the ATA account already exists.\n *\n * @param paymentRequirements - The payment requirements\n * @param tokenProgramAddress - The address of the token program\n * @param config - Optional configuration for X402 operations (e.g., custom RPC URLs)\n * @returns A promise that resolves to the create ATA instruction or undefined if the ATA account already exists\n * @throws an error if the feePayer is not provided in the payment requirements\n */\nasync function createAtaInstructionOrUndefined(\n  paymentRequirements: PaymentRequirements,\n  tokenProgramAddress: Address,\n  config?: X402Config,\n): Promise<Instruction | undefined> {\n  const { asset, payTo, extra } = paymentRequirements;\n  const feePayer = extra?.feePayer as Address;\n\n  // feePayer is required\n  if (!feePayer) {\n    throw new Error(\n      \"feePayer is required in paymentRequirements.extra in order to set the \" +\n        \"facilitator as the fee payer for the create associated token account instruction\",\n    );\n  }\n\n  // derive the ATA of the payTo address\n  const [destinationATAAddress] = await findAssociatedTokenPda({\n    mint: asset as Address,\n    owner: payTo as Address,\n    tokenProgram: tokenProgramAddress,\n  });\n\n  // check if the ATA exists\n  const rpc = getRpcClient(paymentRequirements.network, config?.svmConfig?.rpcUrl);\n  const maybeAccount = await fetchEncodedAccount(rpc, destinationATAAddress);\n\n  // if the ATA does not exist, return an instruction to create it\n  if (!maybeAccount.exists) {\n    return getCreateAssociatedTokenInstruction({\n      payer: paymentRequirements.extra?.feePayer as TransactionSigner<string>,\n      ata: destinationATAAddress,\n      owner: payTo as Address,\n      mint: asset as Address,\n      tokenProgram: tokenProgramAddress,\n    });\n  }\n\n  // if the ATA exists, return undefined\n  return undefined;\n}\n\n/**\n * Creates a transfer instruction for the given client and payment requirements.\n * This function will create a transfer instruction for a token created by either\n * the token program or the token-2022 program.\n *\n * @param client - The signer instance who's tokens will be debited from\n * @param paymentRequirements - The payment requirements\n * @param decimals - The decimals of the token\n * @param tokenProgramAddress - The address of the token program\n * @returns A promise that resolves to the transfer instruction\n */\nasync function createTransferInstruction(\n  client: TransactionSigner,\n  paymentRequirements: PaymentRequirements,\n  decimals: number,\n  tokenProgramAddress: Address,\n): Promise<Instruction> {\n  const { asset, maxAmountRequired: amount, payTo } = paymentRequirements;\n\n  const [sourceATA] = await findAssociatedTokenPda({\n    mint: asset as Address,\n    owner: client.address,\n    tokenProgram: tokenProgramAddress,\n  });\n\n  const [destinationATA] = await findAssociatedTokenPda({\n    mint: asset as Address,\n    owner: payTo as Address,\n    tokenProgram: tokenProgramAddress,\n  });\n\n  return getTransferCheckedInstruction(\n    {\n      source: sourceATA,\n      mint: asset as Address,\n      destination: destinationATA,\n      authority: client,\n      amount: BigInt(amount),\n      decimals: decimals,\n    },\n    { programAddress: tokenProgramAddress },\n  );\n}\n"],"mappings":"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","names":["getAddress","getAddress","createPaymentHeader","tx"]}