@paxoslabs/amplify-sdk 0.5.2 → 0.5.3

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (58) hide show
  1. package/dist/{chain-utils-BdJecHBA.d.mts → chain-utils-5r2UnCDS.d.mts} +47 -1
  2. package/dist/{chain-utils-BdJecHBA.d.ts → chain-utils-5r2UnCDS.d.ts} +47 -1
  3. package/dist/{chunk-5OK753GA.js → chunk-4NQPS3JC.js} +470 -358
  4. package/dist/chunk-4NQPS3JC.js.map +1 -0
  5. package/dist/chunk-6JLKHV6O.js +128 -0
  6. package/dist/chunk-6JLKHV6O.js.map +1 -0
  7. package/dist/{chunk-NNDY5TID.js → chunk-FHE43NKY.js} +12 -12
  8. package/dist/{chunk-NNDY5TID.js.map → chunk-FHE43NKY.js.map} +1 -1
  9. package/dist/chunk-GOJQYEJQ.js +3212 -0
  10. package/dist/chunk-GOJQYEJQ.js.map +1 -0
  11. package/dist/{chunk-HU5CTL4C.mjs → chunk-LMNADWTH.mjs} +364 -253
  12. package/dist/chunk-LMNADWTH.mjs.map +1 -0
  13. package/dist/chunk-ODXJYXUH.mjs +3168 -0
  14. package/dist/chunk-ODXJYXUH.mjs.map +1 -0
  15. package/dist/{chunk-QZHI2T7O.mjs → chunk-QMFYPHX5.mjs} +280 -47
  16. package/dist/chunk-QMFYPHX5.mjs.map +1 -0
  17. package/dist/{chunk-Q5FXJU5Y.mjs → chunk-UY2WD7MF.mjs} +3 -3
  18. package/dist/{chunk-Q5FXJU5Y.mjs.map → chunk-UY2WD7MF.mjs.map} +1 -1
  19. package/dist/chunk-WD6QFSXZ.js +701 -0
  20. package/dist/chunk-WD6QFSXZ.js.map +1 -0
  21. package/dist/chunk-Y5LBT2WT.mjs +118 -0
  22. package/dist/chunk-Y5LBT2WT.mjs.map +1 -0
  23. package/dist/core.d.mts +50 -7
  24. package/dist/core.d.ts +50 -7
  25. package/dist/core.js +32 -16
  26. package/dist/core.mjs +4 -4
  27. package/dist/display.d.mts +211 -2
  28. package/dist/display.d.ts +211 -2
  29. package/dist/display.js +26 -10
  30. package/dist/display.mjs +4 -4
  31. package/dist/{index-DXXA8gEA.d.mts → index-D8RtV9cB.d.mts} +498 -410
  32. package/dist/{index-aE5lTOUH.d.ts → index-ev_V5sjt.d.ts} +498 -410
  33. package/dist/index.d.mts +40 -5
  34. package/dist/index.d.ts +40 -5
  35. package/dist/index.js +80 -60
  36. package/dist/index.mjs +5 -5
  37. package/dist/utils.d.mts +1 -1
  38. package/dist/utils.d.ts +1 -1
  39. package/dist/utils.js +7 -7
  40. package/dist/utils.mjs +2 -2
  41. package/dist/vaults.d.mts +2 -2
  42. package/dist/vaults.d.ts +2 -2
  43. package/dist/vaults.js +25 -25
  44. package/dist/vaults.mjs +4 -4
  45. package/package.json +1 -1
  46. package/dist/chunk-5OK753GA.js.map +0 -1
  47. package/dist/chunk-7JQQ2TH4.mjs +0 -1231
  48. package/dist/chunk-7JQQ2TH4.mjs.map +0 -1
  49. package/dist/chunk-HU5CTL4C.mjs.map +0 -1
  50. package/dist/chunk-QZHI2T7O.mjs.map +0 -1
  51. package/dist/chunk-SWUG4PTB.js +0 -464
  52. package/dist/chunk-SWUG4PTB.js.map +0 -1
  53. package/dist/chunk-WK7EJRBB.mjs +0 -1482
  54. package/dist/chunk-WK7EJRBB.mjs.map +0 -1
  55. package/dist/chunk-WYBYBPX5.js +0 -1518
  56. package/dist/chunk-WYBYBPX5.js.map +0 -1
  57. package/dist/chunk-ZKDXRGI5.js +0 -1239
  58. package/dist/chunk-ZKDXRGI5.js.map +0 -1
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../src/client/kyt-client.ts","../src/utils/approvals.ts","../src/vaults/deposit/approve-deposit.ts","../src/abi/distributor-code-depositor-abi-v1.ts","../src/vaults/deposit/utils.ts","../src/vaults/deposit/deposit.ts","../src/vaults/deposit/deposit-with-permit.ts","../src/utils/wallet.ts","../src/vaults/deposit/index.ts","../src/vaults/withdraw/approve-withdraw.ts","../src/vaults/withdraw/cancel-withdraw.ts","../src/vaults/withdraw/standard-withdraw.ts","../src/vaults/withdraw/atomic-withdraw.ts","../src/vaults/withdraw/index.ts"],"names":["parseUnits","zeroAddress","stringToHex","txData","tokenInfo"],"mappings":"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","file":"chunk-LMNADWTH.mjs","sourcesContent":["/**\n * KYT (Know Your Transaction) API Client\n *\n * Calls the backend-v2 KYT attestation endpoint to obtain Predicate\n * compliance attestations for deposit transactions.\n *\n * @module client/kyt-client\n */\n\nimport type { Address, Hex } from 'viem'\nimport { getRestV2BaseURL } from '../constants/environment'\nimport { getLogger } from '../lib/logger'\nimport { getRequestHeaders } from '../lib/sdk-config'\nimport type { Attestation } from '../vaults/deposit/deposit'\nimport { APIError } from '../types/amplify-sdk-api'\nimport { DEFAULT_TIMEOUT, createTimeoutSignal } from '../utils/fetch'\n\n/**\n * Maps chain IDs to the lowercase chain identifier strings\n * expected by the Predicate attestation API.\n */\nconst CHAIN_ID_TO_PREDICATE_CHAIN: Record<number, string> = {\n 1: 'ethereum',\n 11155111: 'sepolia',\n 8453: 'base',\n 84532: 'base-sepolia',\n 999: 'hyperevm',\n 2201: 'stable-testnet',\n}\n\ninterface KytAttestationResponse {\n attestation: {\n uuid: string\n expiration: number\n attester: string\n signature: string\n }\n}\n\nexport interface FetchKytAttestationParams {\n /** Destination contract address (e.g. the DCD contract receiving the deposit) */\n to: Address\n /** User wallet address initiating the deposit */\n from: Address\n /** Numeric chain ID where the deposit occurs */\n chainId: number\n}\n\n/**\n * Fetches a KYT compliance attestation from backend-v2.\n *\n * Calls `POST /v2/kytAttestation` with the deposit's `to`, `from`, and `chain`\n * parameters. The backend forwards the request to the Predicate API\n * and returns the attestation if the transaction is compliant.\n *\n * @throws {APIError} If the request fails, the user is non-compliant (403),\n * or the response is malformed.\n */\nexport async function fetchKytAttestation(\n params: FetchKytAttestationParams\n): Promise<Attestation> {\n const { to, from, chainId } = params\n const logger = getLogger()\n\n const chain = CHAIN_ID_TO_PREDICATE_CHAIN[chainId]\n if (!chain) {\n throw new APIError(\n `KYT attestation not supported for chain ID ${chainId}. Supported chains: ${Object.keys(CHAIN_ID_TO_PREDICATE_CHAIN).join(', ')}`,\n { endpoint: 'kytAttestation' }\n )\n }\n\n const url = `${getRestV2BaseURL()}/kytAttestation`\n const headers = getRequestHeaders()\n\n logger.debug('Fetching KYT attestation', { to, from, chain })\n\n let response: Response\n try {\n response = await fetch(url, {\n method: 'POST',\n headers,\n body: JSON.stringify({ to, from, chain }),\n signal: createTimeoutSignal(DEFAULT_TIMEOUT),\n })\n } catch (error) {\n if (error instanceof Error && error.name === 'AbortError') {\n throw new APIError('KYT attestation request timed out', {\n endpoint: 'kytAttestation',\n cause: error,\n })\n }\n throw new APIError(\n `KYT attestation request failed: ${error instanceof Error ? error.message : String(error)}`,\n { endpoint: 'kytAttestation', cause: error }\n )\n }\n\n if (!response.ok) {\n let serverMessage: string | undefined\n try {\n const errorBody = await response.json()\n serverMessage = errorBody?.error?.message\n } catch {\n // response body may not be JSON\n }\n\n if (response.status === 403) {\n throw new APIError(\n serverMessage ??\n 'Deposit blocked: transaction is not compliant with KYT policy',\n { endpoint: 'kytAttestation', statusCode: 403 }\n )\n }\n\n if (response.status === 400) {\n throw new APIError(\n serverMessage ??\n 'KYT attestation request was rejected: invalid parameters',\n { endpoint: 'kytAttestation', statusCode: 400 }\n )\n }\n\n throw new APIError(\n serverMessage ??\n `KYT attestation request failed (HTTP ${response.status})`,\n { endpoint: 'kytAttestation', statusCode: response.status }\n )\n }\n\n let body: KytAttestationResponse\n try {\n body = await response.json()\n } catch (error) {\n throw new APIError('KYT attestation response contained invalid JSON', {\n endpoint: 'kytAttestation',\n cause: error,\n })\n }\n\n if (!body.attestation) {\n throw new APIError('KYT attestation response missing attestation field', {\n endpoint: 'kytAttestation',\n })\n }\n\n const { attestation } = body\n\n const missingFields = (\n ['uuid', 'attester', 'signature', 'expiration'] as const\n ).filter((f) => attestation[f] == null)\n\n if (missingFields.length > 0) {\n throw new APIError(\n `KYT attestation response missing required fields: ${missingFields.join(', ')}`,\n { endpoint: 'kytAttestation' }\n )\n }\n\n if (\n typeof attestation.expiration !== 'number' &&\n typeof attestation.expiration !== 'string'\n ) {\n throw new APIError(\n 'KYT attestation response has invalid expiration value',\n { endpoint: 'kytAttestation' }\n )\n }\n\n const sig = attestation.signature.startsWith('0x')\n ? (attestation.signature as Hex)\n : (`0x${attestation.signature}` as Hex)\n\n return {\n uuid: attestation.uuid,\n expiration: BigInt(attestation.expiration),\n attester: attestation.attester as Address,\n signature: sig,\n }\n}\n","import type { Address } from 'viem'\nimport { formatUnits } from 'viem'\nimport {\n getErc20AllowanceWithDecimals,\n getTokenPermitInfoWithAllowance,\n} from '../api/erc20'\nimport { resolveVault } from '../client/resolve-vault'\nimport { APIError } from '../types/amplify-sdk-api'\nimport { type ChainId, toChainId } from './chain-utils'\n\n/**\n * Checks whether a deposit spend has been approved for the CommunityCodeDepositor contract.\n *\n * Resolves the vault by `vaultName` + `chainId` + `depositAssetAddress`, then reads the\n * current ERC20 allowance and permit support via a single multicall.\n *\n * @param vaultName - Human-readable vault name\n * @param chainId - Chain ID where the vault is deployed\n * @param depositAssetAddress - Token contract address being deposited\n * @param recipientAddress - Wallet address that owns the tokens (permit owner / approval sender)\n * @returns Allowance, permit support info, and token metadata\n * @throws {APIError} If vault not found, chain/asset mismatch, or contract read fails\n */\nexport const isDepositSpendApproved = async ({\n vaultName,\n chainId,\n depositAssetAddress,\n recipientAddress,\n}: {\n vaultName: string\n chainId: ChainId\n depositAssetAddress: Address\n recipientAddress: Address\n}) => {\n try {\n const normalizedChainId = toChainId(chainId)\n const config = await resolveVault({\n vaultName,\n chainId: normalizedChainId,\n assetAddress: depositAssetAddress,\n callerEndpoint: 'isDepositSpendApproved',\n })\n\n const communityCodeDepositorAddress =\n config.vault.communityCodeDepositorAddress\n if (!communityCodeDepositorAddress) {\n throw new APIError(\n `Community code depositor contract address not configured for vault ${config.id}`,\n {\n endpoint: 'isDepositSpendApproved',\n }\n )\n }\n\n const {\n decimals,\n allowance,\n supportsPermit,\n nonce,\n domainSeparator,\n tokenName,\n tokenVersion,\n } = await getTokenPermitInfoWithAllowance({\n chainId: normalizedChainId,\n tokenAddress: depositAssetAddress,\n owner: recipientAddress,\n spender: communityCodeDepositorAddress,\n })\n\n return {\n isApproved: allowance > 0n,\n allowance: formatUnits(allowance, decimals),\n allowanceAsBigInt: allowance.toString(),\n decimals,\n supportsPermit,\n nonce,\n domainSeparator,\n tokenName,\n tokenVersion,\n error: null,\n }\n } catch (error) {\n if (error instanceof APIError) {\n throw error\n }\n\n throw new APIError(\n `Failed to check deposit approval: ${\n error instanceof Error ? error.message : String(error)\n }`,\n {\n endpoint: 'isDepositSpendApproved',\n cause: error,\n }\n )\n }\n}\n\n/**\n * Checks whether a withdrawal spend has been approved for the WithdrawQueue contract.\n *\n * Resolves the vault by `vaultName` + `chainId` + `wantAssetAddress`, then reads the\n * current vault-share allowance via a multicall.\n *\n * @param vaultName - Human-readable vault name\n * @param chainId - Chain ID where the vault is deployed\n * @param wantAssetAddress - Token contract address the user wants to receive upon withdrawal\n * @param recipientAddress - Wallet address that owns the vault shares\n * @returns Allowance info\n * @throws {APIError} If vault not found, chain/asset mismatch, or contract read fails\n */\nexport const isWithdrawalSpendApproved = async ({\n vaultName,\n chainId,\n wantAssetAddress,\n recipientAddress,\n}: {\n vaultName: string\n chainId: ChainId\n wantAssetAddress: Address\n recipientAddress: Address\n}) => {\n try {\n const normalizedChainId = toChainId(chainId)\n\n const config = await resolveVault({\n vaultName,\n chainId: normalizedChainId,\n assetAddress: wantAssetAddress,\n callerEndpoint: 'isWithdrawalSpendApproved',\n })\n\n const boringVaultAddress = config.vault.boringVaultAddress\n\n if (!boringVaultAddress) {\n throw new APIError(\n `BoringVault contract address not configured for vault ${config.id}`,\n {\n endpoint: 'isWithdrawalSpendApproved',\n }\n )\n }\n\n const withdrawQueueAddress = config.vault.withdrawQueueAddress\n\n if (!withdrawQueueAddress) {\n throw new APIError(\n `WithdrawQueue contract address not configured for vault ${config.id}`,\n {\n endpoint: 'isWithdrawalSpendApproved',\n }\n )\n }\n\n const [allowance, decimals] = await getErc20AllowanceWithDecimals({\n chainId: normalizedChainId,\n tokenAddress: boringVaultAddress,\n recipientAddress: recipientAddress,\n spenderAddress: withdrawQueueAddress,\n })\n\n if (allowance.status === 'failure' || decimals.status === 'failure') {\n return {\n isApproved: false,\n allowance: '0',\n allowanceAsBigInt: '0',\n decimals: '0',\n error: allowance.error || decimals.error,\n }\n }\n\n return {\n isApproved: allowance.result > 0n,\n allowance: formatUnits(allowance.result, decimals.result),\n allowanceAsBigInt: allowance.result.toString(),\n decimals: decimals.result,\n error: null,\n }\n } catch (error) {\n if (error instanceof APIError) {\n throw error\n }\n\n throw new APIError(\n `Failed to check withdrawal approval: ${\n error instanceof Error ? error.message : String(error)\n }`,\n { endpoint: 'isWithdrawalSpendApproved', cause: error }\n )\n }\n}\n","/**\n * @file Approve Asset for deposit functionality for Paxos Labs vaults\n * @module vaults/deposit\n */\n\nimport { type Address, erc20Abi, parseUnits } from 'viem'\nimport { getSupportedAssets } from '../../client/amplify-sdk-client'\nimport { resolveVault } from '../../client/resolve-vault'\nimport { DEFAULT_APPROVAL_AMOUNT } from '../../constants'\nimport { APIError } from '../../types/amplify-sdk-api'\nimport { type ChainId, toChainId } from '../../utils/chain-utils'\n\n/**\n * Parameters required for preparing an ERC20 approval transaction\n *\n * @interface PrepareApproveDepositTokenTxParams\n * @property {string} vaultName - Human-readable vault name (e.g. \"Amplify USDC Core\")\n * @property {Address} depositAsset - Token contract address to approve. Must match the vault's supported asset.\n * @property {string} [approvalAmount] - Optional amount to approve as a decimal string (defaults to maximum approval)\n * @property {ChainId} chainId - ID of the chain where the approval will occur. Must match the vault's chain.\n */\ninterface PrepareApproveDepositTokenTxParams {\n vaultName: string\n depositAsset: Address\n approvalAmount?: string\n chainId: ChainId\n}\n\n/**\n * Result object containing transaction data for an ERC20 approval operation\n * @interface ApproveDepositTokenTxData\n * @property {typeof erc20Abi} abi - ABI for the ERC20 token contract\n * @property {Address} address - Address of the ERC20 token being approved\n * @property {'approve'} functionName - Name of the function to call\n * @property {[Address, bigint]} args - Arguments for the approve function:\n * [spender (CommunityCodeDepositor address), amount]\n */\ninterface ApproveDepositTokenTxData {\n abi: typeof erc20Abi\n address: Address\n functionName: 'approve'\n args: [Address, bigint]\n}\n\n/**\n * Prepares the transaction data needed to approve a deposit token for the vault\n *\n * This function prepares an ERC20 approval transaction that allows the vault's\n * CommunityCodeDepositor contract to spend the user's deposit tokens.\n * The vault is validated against the provided `vaultName`, `chainId`, and `depositAsset`.\n *\n * @example\n * ```typescript\n * const approveData = await prepareApproveDepositTokenTxData({\n * vaultName: \"Amplify USDC Core\",\n * depositAsset: '0xA0b86991c6218b36c1d19D4a2e9Eb0cE3606eB48', // USDC\n * approvalAmount: \"1000.0\", // Approve 1000 USDC\n * chainId: 1,\n * });\n * ```\n *\n * @param {PrepareApproveDepositTokenTxParams} params - Parameters for the approval operation\n * @returns {Promise<ApproveDepositTokenTxData>} Promise resolving to the prepared transaction data\n * @throws {APIError} If vault not found, chain/asset mismatch, or contracts not configured\n */\nexport async function prepareApproveDepositTokenTxData({\n vaultName,\n depositAsset,\n approvalAmount,\n chainId,\n}: PrepareApproveDepositTokenTxParams): Promise<ApproveDepositTokenTxData> {\n const normalizedChainId = toChainId(chainId)\n\n try {\n const config = await resolveVault({\n vaultName,\n assetAddress: depositAsset,\n chainId: normalizedChainId,\n callerEndpoint: 'prepareApproveDepositToken',\n })\n\n const communityCodeDepositorAddress =\n config.vault.communityCodeDepositorAddress\n if (!communityCodeDepositorAddress) {\n throw new APIError(\n `Community Code Depositor contract address not configured for vault ${config.id}`,\n { endpoint: 'prepareApproveDepositToken' }\n )\n }\n\n const assets = await getSupportedAssets({ address: depositAsset })\n if (assets.length === 0) {\n throw new APIError(\n `Asset metadata not found for token ${depositAsset} on chain ${normalizedChainId}`,\n { endpoint: 'prepareApproveDepositToken' }\n )\n }\n\n const verifiedAsset = assets.find(\n (asset) =>\n asset.address.toLowerCase() === depositAsset.toLowerCase() &&\n asset.chains.includes(normalizedChainId)\n )\n\n if (!verifiedAsset) {\n throw new APIError(\n `Asset ${depositAsset} not verified on chain ${normalizedChainId}`,\n { endpoint: 'prepareApproveDepositToken' }\n )\n }\n const decimals = verifiedAsset.decimals\n\n const amount = approvalAmount\n ? parseUnits(approvalAmount, decimals)\n : DEFAULT_APPROVAL_AMOUNT\n return {\n abi: erc20Abi,\n address: depositAsset,\n functionName: 'approve',\n args: [communityCodeDepositorAddress, amount],\n }\n } catch (error) {\n if (error instanceof APIError) {\n throw error\n }\n\n throw new APIError(\n `Failed to prepare approval transaction: ${\n error instanceof Error ? error.message : String(error)\n }`,\n {\n endpoint: 'prepareApproveDepositToken',\n cause: error,\n }\n )\n }\n}\n\nexport type { ApproveDepositTokenTxData, PrepareApproveDepositTokenTxParams }\n","export const DistributorCodeDepositorAbiV1 = [\n {\n inputs: [\n {\n internalType: 'contract TellerWithMultiAssetSupport',\n name: '_teller',\n type: 'address',\n },\n {\n internalType: 'contract INativeWrapper',\n name: '_nativeWrapper',\n type: 'address',\n },\n {\n internalType: 'contract Authority',\n name: '_rolesAuthority',\n type: 'address',\n },\n { internalType: 'bool', name: '_isNativeDepositSupported', type: 'bool' },\n { internalType: 'uint256', name: '_supplyCap', type: 'uint256' },\n {\n internalType: 'contract IFeeModule',\n name: '_feeModule',\n type: 'address',\n },\n { internalType: 'address', name: '_feeRecipient', type: 'address' },\n { internalType: 'address', name: '_registry', type: 'address' },\n { internalType: 'string', name: '_policyID', type: 'string' },\n { internalType: 'address', name: '_owner', type: 'address' },\n ],\n stateMutability: 'nonpayable',\n type: 'constructor',\n },\n { inputs: [], name: 'FeesExceedOrEqualAmount', type: 'error' },\n { inputs: [], name: 'IncorrectNativeDepositAmount', type: 'error' },\n {\n inputs: [\n { internalType: 'uint256', name: 'actual', type: 'uint256' },\n { internalType: 'uint256', name: 'minimum', type: 'uint256' },\n ],\n name: 'InsufficientSharesAfterFees',\n type: 'error',\n },\n { inputs: [], name: 'NativeDepositNotSupported', type: 'error' },\n {\n inputs: [],\n name: 'NativeWrapperAccountantDecimalsMismatch',\n type: 'error',\n },\n {\n inputs: [\n { internalType: 'address', name: 'addressEmptyCode', type: 'address' },\n ],\n name: 'NoCode',\n type: 'error',\n },\n { inputs: [], name: 'PermitFailedAndAllowanceTooLow', type: 'error' },\n {\n inputs: [\n { internalType: 'uint256', name: 'resultingValue', type: 'uint256' },\n { internalType: 'uint256', name: 'supplyCapInBase', type: 'uint256' },\n ],\n name: 'SupplyCapInBaseError',\n type: 'error',\n },\n { inputs: [], name: 'UnauthorizedTransaction', type: 'error' },\n { inputs: [], name: 'ZeroAddress', type: 'error' },\n {\n anonymous: false,\n inputs: [\n { indexed: true, internalType: 'address', name: 'user', type: 'address' },\n {\n indexed: true,\n internalType: 'contract Authority',\n name: 'newAuthority',\n type: 'address',\n },\n ],\n name: 'AuthorityUpdated',\n type: 'event',\n },\n {\n anonymous: false,\n inputs: [\n {\n indexed: true,\n internalType: 'address',\n name: 'depositor',\n type: 'address',\n },\n {\n indexed: true,\n internalType: 'contract ERC20',\n name: 'depositAsset',\n type: 'address',\n },\n {\n indexed: false,\n internalType: 'uint256',\n name: 'depositAmount',\n type: 'uint256',\n },\n {\n indexed: false,\n internalType: 'uint256',\n name: 'minimumMint',\n type: 'uint256',\n },\n { indexed: false, internalType: 'address', name: 'to', type: 'address' },\n {\n indexed: false,\n internalType: 'bytes32',\n name: 'depositHash',\n type: 'bytes32',\n },\n {\n indexed: true,\n internalType: 'bytes',\n name: 'distributorCode',\n type: 'bytes',\n },\n ],\n name: 'DepositWithDistributorCode',\n type: 'event',\n },\n {\n anonymous: false,\n inputs: [\n {\n indexed: true,\n internalType: 'contract IFeeModule',\n name: 'newFeeModule',\n type: 'address',\n },\n ],\n name: 'FeeModuleUpdated',\n type: 'event',\n },\n {\n anonymous: false,\n inputs: [\n {\n indexed: true,\n internalType: 'address',\n name: 'newFeeRecipient',\n type: 'address',\n },\n ],\n name: 'FeeRecipientUpdated',\n type: 'event',\n },\n {\n anonymous: false,\n inputs: [\n {\n indexed: true,\n internalType: 'contract ERC20',\n name: 'depositAsset',\n type: 'address',\n },\n { indexed: true, internalType: 'bool', name: 'enabled', type: 'bool' },\n ],\n name: 'KytStatusUpdated',\n type: 'event',\n },\n {\n anonymous: false,\n inputs: [\n { indexed: true, internalType: 'address', name: 'user', type: 'address' },\n {\n indexed: true,\n internalType: 'address',\n name: 'newOwner',\n type: 'address',\n },\n ],\n name: 'OwnershipTransferred',\n type: 'event',\n },\n {\n anonymous: false,\n inputs: [\n {\n indexed: false,\n internalType: 'string',\n name: 'oldPolicyID',\n type: 'string',\n },\n {\n indexed: false,\n internalType: 'string',\n name: 'newPolicyID',\n type: 'string',\n },\n ],\n name: 'PredicatePolicyIDUpdated',\n type: 'event',\n },\n {\n anonymous: false,\n inputs: [\n {\n indexed: true,\n internalType: 'address',\n name: 'oldRegistry',\n type: 'address',\n },\n {\n indexed: true,\n internalType: 'address',\n name: 'newRegistry',\n type: 'address',\n },\n ],\n name: 'PredicateRegistryUpdated',\n type: 'event',\n },\n {\n anonymous: false,\n inputs: [\n {\n indexed: false,\n internalType: 'uint256',\n name: 'newSupplyCapInBase',\n type: 'uint256',\n },\n ],\n name: 'SupplyCapInBaseUpdated',\n type: 'event',\n },\n {\n inputs: [],\n name: 'PREDICATE_DEPOSIT_SIGNATURE',\n outputs: [{ internalType: 'string', name: '', type: 'string' }],\n stateMutability: 'view',\n type: 'function',\n },\n {\n inputs: [],\n name: 'authority',\n outputs: [\n { internalType: 'contract Authority', name: '', type: 'address' },\n ],\n stateMutability: 'view',\n type: 'function',\n },\n {\n inputs: [],\n name: 'boringVault',\n outputs: [{ internalType: 'address', name: '', type: 'address' }],\n stateMutability: 'view',\n type: 'function',\n },\n {\n inputs: [\n { internalType: 'contract ERC20', name: 'depositAsset', type: 'address' },\n { internalType: 'uint256', name: 'depositAmount', type: 'uint256' },\n { internalType: 'uint256', name: 'minimumMint', type: 'uint256' },\n { internalType: 'address', name: 'to', type: 'address' },\n { internalType: 'bytes', name: 'distributorCode', type: 'bytes' },\n {\n components: [\n { internalType: 'string', name: 'uuid', type: 'string' },\n { internalType: 'uint256', name: 'expiration', type: 'uint256' },\n { internalType: 'address', name: 'attester', type: 'address' },\n { internalType: 'bytes', name: 'signature', type: 'bytes' },\n ],\n internalType: 'struct Attestation',\n name: '_attestation',\n type: 'tuple',\n },\n ],\n name: 'deposit',\n outputs: [{ internalType: 'uint256', name: 'shares', type: 'uint256' }],\n stateMutability: 'nonpayable',\n type: 'function',\n },\n {\n inputs: [\n { internalType: 'uint256', name: 'depositAmount', type: 'uint256' },\n { internalType: 'uint256', name: 'minimumMint', type: 'uint256' },\n { internalType: 'address', name: 'to', type: 'address' },\n { internalType: 'bytes', name: 'distributorCode', type: 'bytes' },\n {\n components: [\n { internalType: 'string', name: 'uuid', type: 'string' },\n { internalType: 'uint256', name: 'expiration', type: 'uint256' },\n { internalType: 'address', name: 'attester', type: 'address' },\n { internalType: 'bytes', name: 'signature', type: 'bytes' },\n ],\n internalType: 'struct Attestation',\n name: '_attestation',\n type: 'tuple',\n },\n ],\n name: 'depositNative',\n outputs: [{ internalType: 'uint256', name: 'shares', type: 'uint256' }],\n stateMutability: 'payable',\n type: 'function',\n },\n {\n inputs: [],\n name: 'depositNonce',\n outputs: [{ internalType: 'uint256', name: '', type: 'uint256' }],\n stateMutability: 'view',\n type: 'function',\n },\n {\n inputs: [\n { internalType: 'contract ERC20', name: 'depositAsset', type: 'address' },\n { internalType: 'uint256', name: 'depositAmount', type: 'uint256' },\n { internalType: 'uint256', name: 'minimumMint', type: 'uint256' },\n { internalType: 'address', name: 'to', type: 'address' },\n { internalType: 'bytes', name: 'distributorCode', type: 'bytes' },\n {\n components: [\n { internalType: 'string', name: 'uuid', type: 'string' },\n { internalType: 'uint256', name: 'expiration', type: 'uint256' },\n { internalType: 'address', name: 'attester', type: 'address' },\n { internalType: 'bytes', name: 'signature', type: 'bytes' },\n ],\n internalType: 'struct Attestation',\n name: '_attestation',\n type: 'tuple',\n },\n { internalType: 'uint256', name: 'deadline', type: 'uint256' },\n { internalType: 'uint8', name: 'v', type: 'uint8' },\n { internalType: 'bytes32', name: 'r', type: 'bytes32' },\n { internalType: 'bytes32', name: 's', type: 'bytes32' },\n ],\n name: 'depositWithPermit',\n outputs: [{ internalType: 'uint256', name: 'shares', type: 'uint256' }],\n stateMutability: 'nonpayable',\n type: 'function',\n },\n {\n inputs: [],\n name: 'feeModule',\n outputs: [\n { internalType: 'contract IFeeModule', name: '', type: 'address' },\n ],\n stateMutability: 'view',\n type: 'function',\n },\n {\n inputs: [],\n name: 'feeRecipient',\n outputs: [{ internalType: 'address', name: '', type: 'address' }],\n stateMutability: 'view',\n type: 'function',\n },\n {\n inputs: [],\n name: 'getPolicyID',\n outputs: [{ internalType: 'string', name: 'policyID', type: 'string' }],\n stateMutability: 'view',\n type: 'function',\n },\n {\n inputs: [],\n name: 'getRegistry',\n outputs: [{ internalType: 'address', name: '', type: 'address' }],\n stateMutability: 'view',\n type: 'function',\n },\n {\n inputs: [],\n name: 'isNativeDepositSupported',\n outputs: [{ internalType: 'bool', name: '', type: 'bool' }],\n stateMutability: 'view',\n type: 'function',\n },\n {\n inputs: [{ internalType: 'contract ERC20', name: '', type: 'address' }],\n name: 'kytEnabled',\n outputs: [{ internalType: 'bool', name: '', type: 'bool' }],\n stateMutability: 'view',\n type: 'function',\n },\n {\n inputs: [],\n name: 'nativeWrapper',\n outputs: [\n { internalType: 'contract INativeWrapper', name: '', type: 'address' },\n ],\n stateMutability: 'view',\n type: 'function',\n },\n {\n inputs: [],\n name: 'owner',\n outputs: [{ internalType: 'address', name: '', type: 'address' }],\n stateMutability: 'view',\n type: 'function',\n },\n {\n inputs: [\n {\n internalType: 'contract Authority',\n name: 'newAuthority',\n type: 'address',\n },\n ],\n name: 'setAuthority',\n outputs: [],\n stateMutability: 'nonpayable',\n type: 'function',\n },\n {\n inputs: [{ internalType: 'string', name: '_policyID', type: 'string' }],\n name: 'setPolicyID',\n outputs: [],\n stateMutability: 'nonpayable',\n type: 'function',\n },\n {\n inputs: [{ internalType: 'address', name: '_registry', type: 'address' }],\n name: 'setRegistry',\n outputs: [],\n stateMutability: 'nonpayable',\n type: 'function',\n },\n {\n inputs: [],\n name: 'supplyCapInBase',\n outputs: [{ internalType: 'uint256', name: '', type: 'uint256' }],\n stateMutability: 'view',\n type: 'function',\n },\n {\n inputs: [],\n name: 'teller',\n outputs: [\n {\n internalType: 'contract TellerWithMultiAssetSupport',\n name: '',\n type: 'address',\n },\n ],\n stateMutability: 'view',\n type: 'function',\n },\n {\n inputs: [{ internalType: 'address', name: 'newOwner', type: 'address' }],\n name: 'transferOwnership',\n outputs: [],\n stateMutability: 'nonpayable',\n type: 'function',\n },\n {\n inputs: [\n {\n internalType: 'contract IFeeModule',\n name: 'newFeeModule',\n type: 'address',\n },\n ],\n name: 'updateFeeModule',\n outputs: [],\n stateMutability: 'nonpayable',\n type: 'function',\n },\n {\n inputs: [\n { internalType: 'address', name: 'newFeeRecipient', type: 'address' },\n ],\n name: 'updateFeeRecipient',\n outputs: [],\n stateMutability: 'nonpayable',\n type: 'function',\n },\n {\n inputs: [\n { internalType: 'contract ERC20', name: 'depositAsset', type: 'address' },\n { internalType: 'bool', name: 'enabled', type: 'bool' },\n ],\n name: 'updateKytStatus',\n outputs: [],\n stateMutability: 'nonpayable',\n type: 'function',\n },\n {\n inputs: [\n { internalType: 'uint256', name: 'newSupplyCapInBase', type: 'uint256' },\n ],\n name: 'updateSupplyCapInBase',\n outputs: [],\n stateMutability: 'nonpayable',\n type: 'function',\n },\n] as const\n","import { type Address, maxUint256, zeroAddress } from 'viem'\nimport { AccountantAbi } from '../../abi/accountant-abi'\nimport { BoringVaultAbi } from '../../abi/boring-vault-abi'\nimport {\n readDepositFeeStructure,\n readSupplyCapInBase,\n} from '../../api/fees-and-supply-cap'\nimport { DEFAULT_SLIPPAGE_BPS } from '../../constants/config'\nimport { getClient } from '../../lib/viem/client'\nimport type { AmplifyVault } from '../../types/amplify-sdk-api'\nimport { APIError } from '../../types/amplify-sdk-api'\nimport { WAD } from '../../utils/bigint'\n\n/**\n * Calculates the minimum amount of tokens to mint based on deposit amount, rate, and slippage\n * @param depositAmount The amount being deposited (in base units)\n * @param rate The current exchange rate between deposit and mint tokens\n * @param vaultTokenDecimals The number of precision decimals of the vault token\n * @param slippage The maximum acceptable slippage as a decimal (e.g., 0.01 for 1%)\n * @returns The minimum amount of tokens that should be minted accounting for slippage in vault token precision decimals\n */\nconst calculateMinimumMint = (\n depositAmount: bigint, // In deposit token decimals\n rate: bigint, // In deposit token decimals\n vaultTokenDecimals: number, // The number of precision decimals of the vault token\n slippage?: number // In bps (e.g., 50 for 0.5%) = 50 / 10000 = 0.005 = 0.5%\n): bigint => {\n const slippageValue = slippage ?? DEFAULT_SLIPPAGE_BPS\n // Convert bps to WAD format (multiply by WAD/10000)\n const slippageAsBigInt = (BigInt(slippageValue) * WAD.bigint) / BigInt(10000)\n\n // Calculate ideal mint amount without slippage\n const minimumMint = (depositAmount * WAD.bigint) / rate\n\n // Calculate the amount to subtract for slippage tolerance\n const slippageAmount = (minimumMint * slippageAsBigInt) / WAD.bigint\n\n // Return mint amount minus slippage buffer\n if (vaultTokenDecimals > 18) {\n return (\n (minimumMint - slippageAmount) *\n BigInt(10) ** (BigInt(vaultTokenDecimals) - BigInt(18))\n )\n }\n return (\n (minimumMint - slippageAmount) /\n BigInt(10) ** (BigInt(18) - BigInt(vaultTokenDecimals))\n )\n}\n\n/**\n * Reads the deposit fee from the fee module contract and returns the total fee\n * amount for a given deposit. Returns 0n if no fee module is configured.\n *\n * @param depositFeeModuleAddress - Fee module contract address (zeroAddress or undefined = no fees)\n * @param depositAsset - The deposit token address (used to look up per-token fee data)\n * @param depositAmount - The raw deposit amount in token base units\n * @param chainId - Chain ID for the RPC call\n * @returns The total fee amount (variable + flat) in deposit token units\n */\nasync function getDepositFeeForAmount(\n depositFeeModuleAddress: Address | undefined,\n depositAsset: Address,\n depositAmount: bigint,\n chainId: number\n): Promise<bigint> {\n if (!depositFeeModuleAddress || depositFeeModuleAddress === zeroAddress) {\n return 0n\n }\n\n const { feePercentage, flatFee, oneHundredPercent } =\n await readDepositFeeStructure(\n depositFeeModuleAddress,\n depositAsset,\n chainId\n )\n\n const variableFee =\n oneHundredPercent > 0n\n ? (depositAmount * feePercentage) / oneHundredPercent\n : 0n\n\n return variableFee + flatFee\n}\n\n/**\n * Throws if the deposit would exceed the vault's supply cap.\n * Converts depositAmountRaw from deposit-asset units to base-token units\n * via the accountant rate ratio before comparing against the cap.\n * Throws APIError if cap or on-chain data cannot be read.\n */\nasync function assertDepositWithinCap(\n vault: AmplifyVault,\n depositAmountRaw: bigint,\n depositAssetAddress: Address,\n chainId: number,\n callerEndpoint: string\n): Promise<void> {\n let supplyCapInBase: bigint | null = null\n let hasDepositCap = false\n\n if (vault.depositCap) {\n supplyCapInBase = vault.depositCap.supplyCapInBase\n hasDepositCap = vault.depositCap.hasDepositCap\n } else if (\n vault.vault.communityCodeDepositorAddress &&\n vault.vault.depositFeeModuleAddress\n ) {\n const onChainCap = await readSupplyCapInBase(\n vault.vault.communityCodeDepositorAddress,\n chainId\n )\n supplyCapInBase = onChainCap\n hasDepositCap = onChainCap !== 0n && onChainCap !== maxUint256\n }\n\n if (!hasDepositCap || supplyCapInBase == null) return\n\n const client = await getClient(chainId)\n const [supplyResult, baseRateResult, quoteRateResult, decResult] =\n await client.multicall({\n contracts: [\n {\n abi: BoringVaultAbi,\n address: vault.vault.boringVaultAddress,\n functionName: 'totalSupply',\n },\n {\n abi: AccountantAbi,\n address: vault.vault.accountantAddress,\n functionName: 'getRate',\n },\n {\n abi: AccountantAbi,\n address: vault.vault.accountantAddress,\n functionName: 'getRateInQuote',\n args: [depositAssetAddress],\n },\n {\n abi: AccountantAbi,\n address: vault.vault.accountantAddress,\n functionName: 'decimals',\n },\n ],\n })\n\n if (\n supplyResult.status !== 'success' ||\n baseRateResult.status !== 'success' ||\n quoteRateResult.status !== 'success' ||\n decResult.status !== 'success'\n ) {\n throw new APIError(\n 'Unable to verify deposit against supply cap: on-chain read failed',\n { endpoint: callerEndpoint }\n )\n }\n\n const currentValueInBase =\n (supplyResult.result * baseRateResult.result) /\n 10n ** BigInt(decResult.result)\n\n const depositAmountInBase =\n quoteRateResult.result > 0n\n ? (depositAmountRaw * baseRateResult.result) / quoteRateResult.result\n : depositAmountRaw\n\n const remaining =\n supplyCapInBase > currentValueInBase\n ? supplyCapInBase - currentValueInBase\n : 0n\n\n if (depositAmountInBase > remaining) {\n throw new APIError(\n `Deposit would exceed vault supply cap. ` +\n `Remaining capacity: ${remaining}, deposit amount (in base): ${depositAmountInBase}`,\n { endpoint: callerEndpoint }\n )\n }\n}\n\nexport { assertDepositWithinCap, calculateMinimumMint, getDepositFeeForAmount }\n","/**\n * @file Deposit functionality for Nucleus vaults\n * @module vaults/deposit\n */\n\nimport {\n type Address,\n type Hex,\n parseUnits,\n stringToHex,\n zeroAddress,\n} from 'viem'\nimport { DistributorCodeDepositorAbiV0 } from '../../abi/distributor-code-depositor-abi-v0'\nimport { DistributorCodeDepositorAbiV1 } from '../../abi/distributor-code-depositor-abi-v1'\nimport { getRateInQuoteWithAssetDecimals } from '../../api/accountant'\nimport { getSupportedAssets } from '../../client/amplify-sdk-client'\nimport { fetchKytAttestation } from '../../client/kyt-client'\nimport { resolveVault } from '../../client/resolve-vault'\nimport { DEFAULT_SLIPPAGE_BPS } from '../../constants/config'\nimport { getLogger } from '../../lib/logger'\nimport { APIError } from '../../types/amplify-sdk-api'\nimport { type ChainId, toChainId } from '../../utils/chain-utils'\nimport {\n assertDepositWithinCap,\n calculateMinimumMint,\n getDepositFeeForAmount,\n} from './utils'\n\n// ============================================================================\n// TYPES & ENUMS\n// ============================================================================\n\n/**\n * Attestation struct matching the KYT ABI tuple\n */\nexport interface Attestation {\n uuid: string\n expiration: bigint\n attester: Address\n signature: Hex\n}\n\n/**\n * Discriminant for deposit contract variant\n */\nexport const DepositType = {\n STANDARD: 'standard',\n KYT: 'kyt',\n} as const\n\nexport type DepositType = (typeof DepositType)[keyof typeof DepositType]\n\n// ============================================================================\n// TRANSACTION DATA INTERFACES (discriminated union)\n// ============================================================================\n\n/**\n * Standard deposit transaction data via DistributorCodeDepositor\n */\nexport interface StandardDepositTxData {\n depositType: typeof DepositType.STANDARD\n abi: typeof DistributorCodeDepositorAbiV0\n address: Address\n functionName: 'deposit'\n args: readonly [\n depositAsset: Address,\n depositAmount: bigint,\n minimumMint: bigint,\n to: Address,\n distributorCode: Hex,\n ]\n chainId: number\n}\n\n/**\n * KYT deposit transaction data via DistributorCodeDepositorWithKyt\n */\nexport interface KytDepositTxData {\n depositType: typeof DepositType.KYT\n abi: typeof DistributorCodeDepositorAbiV1\n address: Address\n functionName: 'deposit'\n args: readonly [\n depositAsset: Address,\n depositAmount: bigint,\n minimumMint: bigint,\n to: Address,\n distributorCode: Hex,\n attestation: Attestation,\n ]\n chainId: number\n}\n\n/**\n * Discriminated union of deposit transaction data variants.\n * Use `depositType` or the type guards to narrow.\n */\nexport type DepositTxData = StandardDepositTxData | KytDepositTxData\n\n// ============================================================================\n// TYPE GUARDS\n// ============================================================================\n\nexport function isKytDeposit(data: DepositTxData): data is KytDepositTxData {\n return data.depositType === DepositType.KYT\n}\n\nexport function isStandardDeposit(\n data: DepositTxData\n): data is StandardDepositTxData {\n return data.depositType === DepositType.STANDARD\n}\n\n// ============================================================================\n// PARAMS\n// ============================================================================\n\n/**\n * Parameters for prepareDepositTxData()\n *\n * @interface PrepareDepositTxDataParams\n * @property {string} vaultName - Human-readable vault name (e.g. \"Amplify USDC Core\")\n * @property {Address} to - Ethereum address of the recipient. Must be the same as the address used to sign the deposit transaction.\n * @property {Address} depositAsset - Token contract address to deposit. Must match the vault's supported asset.\n * @property {string} depositAmount - Amount of assets to deposit as a decimal string (e.g., \"1.5\")\n * @property {ChainId} chainId - ID of the chain where the deposit will occur. Must match the vault's chain.\n * @property {number} [slippage] - Optional (default is 50 (0.5%)): Maximum acceptable slippage in basis points (e.g., 100 for 1%).\n * @property {string} [distributorCode] - Optional (default is empty string): Distributor code for fee attribution\n */\ninterface PrepareDepositTxDataParams {\n vaultName: string\n to: Address\n depositAsset: Address\n depositAmount: string\n chainId: ChainId\n slippage?: number\n distributorCode?: string\n}\n\n// ============================================================================\n// FUNCTION\n// ============================================================================\n\n/**\n * Prepares the transaction data needed to deposit assets into a vault.\n *\n * Automatically routes to standard or KYT deposit based on vault configuration.\n * When `vault.enterpriseConfig?.predicatePolicyId` is set, returns\n * `KytDepositTxData`; otherwise returns `StandardDepositTxData`.\n *\n * @param {PrepareDepositTxDataParams} params - Parameters for the deposit operation\n * @returns {Promise<DepositTxData>} Promise resolving to the prepared transaction data\n * @throws {APIError} If vault cannot be resolved, asset not found, or contracts not configured\n */\nexport async function prepareDepositTxData(\n params: PrepareDepositTxDataParams\n): Promise<DepositTxData> {\n const {\n vaultName,\n depositAsset,\n depositAmount,\n chainId,\n slippage = DEFAULT_SLIPPAGE_BPS,\n to,\n distributorCode,\n } = params\n\n try {\n const normalizedChainId = toChainId(chainId)\n\n const vault = await resolveVault({\n vaultName,\n assetAddress: depositAsset,\n chainId: normalizedChainId,\n callerEndpoint: 'prepareDepositTransactionData',\n })\n\n if (vault.inDeprecation) {\n getLogger().warn(\n `Vault \"${vault.name}\" is being deprecated. Please contact the Paxos Labs team for migration guidance.`\n )\n }\n\n // Fetch the asset metadata for the deposit asset\n const assets = await getSupportedAssets({ address: depositAsset })\n\n // Find the asset for the correct chain\n const asset =\n assets.find((a) => a.chains.includes(normalizedChainId)) ||\n assets.find((a) => a.address.toLowerCase() === depositAsset.toLowerCase())\n\n if (!asset) {\n throw new APIError(\n `Asset metadata not found for token ${depositAsset} on chain ${normalizedChainId}`,\n {\n endpoint: 'prepareDepositTransactionData',\n }\n )\n }\n\n // Verify transaction data includes correct vault contract addresses\n const communityCodeDepositorAddress =\n vault.vault.communityCodeDepositorAddress\n if (!communityCodeDepositorAddress) {\n throw new APIError(\n `Community Code Depositor contract address not found for vault ${vault.id}`,\n { endpoint: 'prepareDepositTransactionData' }\n )\n }\n\n const accountantAddress = vault.vault.accountantAddress\n\n if (!accountantAddress) {\n throw new APIError(\n `Accountant contract address not found for vault ${vault.id}`,\n { endpoint: 'prepareDepositTransactionData' }\n )\n }\n const depositAssetAddress = asset.address\n\n // Get exchange rate from accountant (returns tuple from multicall)\n const [depositAssetDecimalsResult, rateInQuoteResult] =\n await getRateInQuoteWithAssetDecimals({\n assetAddress: depositAssetAddress,\n accountantAddress: accountantAddress,\n chainId: normalizedChainId,\n })\n\n // Check decimals call result\n if (depositAssetDecimalsResult.status === 'failure') {\n throw new APIError(\n `Failed to get asset decimals: ${\n depositAssetDecimalsResult.error?.message || 'Unknown error'\n }`,\n {\n endpoint: 'prepareDepositTransactionData',\n cause: depositAssetDecimalsResult.error,\n }\n )\n }\n\n // Check rate call result\n if (rateInQuoteResult.status === 'failure') {\n throw new APIError(\n `Failed to get exchange rate: ${\n rateInQuoteResult.error?.message || 'Unknown error'\n }`,\n {\n endpoint: 'prepareDepositTransactionData',\n cause: rateInQuoteResult.error,\n }\n )\n }\n\n const depositAmountAsBigInt = parseUnits(\n depositAmount,\n depositAssetDecimalsResult.result\n )\n\n const totalFee = await getDepositFeeForAmount(\n vault.vault.depositFeeModuleAddress,\n depositAssetAddress,\n depositAmountAsBigInt,\n normalizedChainId\n )\n\n if (totalFee >= depositAmountAsBigInt) {\n throw new APIError(\n 'Deposit amount is entirely consumed by fees. Increase the deposit amount.',\n { endpoint: 'prepareDepositTransactionData' }\n )\n }\n\n const depositAmountAfterFees = depositAmountAsBigInt - totalFee\n\n await assertDepositWithinCap(\n vault,\n depositAmountAfterFees,\n depositAssetAddress,\n normalizedChainId,\n 'prepareDepositTransactionData'\n )\n\n const minimumMint = calculateMinimumMint(\n depositAmountAfterFees,\n rateInQuoteResult.result,\n depositAssetDecimalsResult.result,\n slippage\n )\n\n const distributorCodeHex = stringToHex(distributorCode || '')\n\n const policyId = vault.enterpriseConfig?.predicatePolicyId\n\n // undefined → no enterprise config → V0 standard deposit (old signature)\n if (policyId === undefined) {\n return {\n depositType: DepositType.STANDARD,\n abi: DistributorCodeDepositorAbiV0,\n address: communityCodeDepositorAddress,\n functionName: 'deposit',\n args: [\n depositAssetAddress,\n depositAmountAsBigInt,\n minimumMint,\n to,\n distributorCodeHex,\n ],\n chainId: normalizedChainId,\n }\n }\n\n // null → V1 DCD deposit with empty attestation (no KYT API call)\n if (policyId === null) {\n const emptyAttestation: Attestation = {\n uuid: '',\n expiration: 0n,\n attester: zeroAddress,\n signature: '0x',\n }\n\n return {\n depositType: DepositType.KYT,\n address: communityCodeDepositorAddress,\n abi: DistributorCodeDepositorAbiV1,\n functionName: 'deposit',\n args: [\n depositAssetAddress,\n depositAmountAsBigInt,\n minimumMint,\n to,\n distributorCodeHex,\n emptyAttestation,\n ],\n chainId: normalizedChainId,\n }\n }\n\n // string → V1 DCD deposit with real attestation from KYT API\n const attestation = await fetchKytAttestation({\n to: communityCodeDepositorAddress,\n from: to,\n chainId: normalizedChainId,\n })\n\n return {\n depositType: DepositType.KYT,\n address: communityCodeDepositorAddress,\n abi: DistributorCodeDepositorAbiV1,\n functionName: 'deposit',\n args: [\n depositAssetAddress,\n depositAmountAsBigInt,\n minimumMint,\n to,\n distributorCodeHex,\n attestation,\n ],\n chainId: normalizedChainId,\n }\n } catch (error) {\n // Re-throw APIError as-is\n if (error instanceof APIError) {\n throw error\n }\n\n // Wrap other errors with context\n throw new APIError(\n `Failed to prepare deposit transaction: ${\n error instanceof Error ? error.message : String(error)\n }`,\n {\n endpoint: 'prepareDepositTransactionData',\n cause: error,\n }\n )\n }\n}\n\nexport type { PrepareDepositTxDataParams }\n","/**\n * @file Deposit with permit functionality for Nucleus vaults\n * @module vaults/deposit/deposit-with-permit\n */\n\nimport {\n type Address,\n type Hex,\n hexToSignature,\n parseUnits,\n stringToHex,\n zeroAddress,\n} from 'viem'\nimport { DistributorCodeDepositorAbiV0 } from '../../abi/distributor-code-depositor-abi-v0'\nimport { DistributorCodeDepositorAbiV1 } from '../../abi/distributor-code-depositor-abi-v1'\nimport { erc2612Abi } from '../../abi/erc2612-abi'\nimport { getRateInQuoteWithAssetDecimals } from '../../api/accountant'\nimport { getErc20Decimals } from '../../api/erc20'\nimport { getSupportedAssets } from '../../client/amplify-sdk-client'\nimport { fetchKytAttestation } from '../../client/kyt-client'\nimport { resolveVault } from '../../client/resolve-vault'\nimport { DEFAULT_SLIPPAGE_BPS } from '../../constants/config'\nimport { getLogger } from '../../lib/logger'\nimport { getClient } from '../../lib/viem/client'\nimport type { SupportedAsset } from '../../types/amplify-sdk-api'\nimport { APIError } from '../../types/amplify-sdk-api'\nimport { type ChainId, toChainId } from '../../utils/chain-utils'\nimport { type Attestation, DepositType } from './deposit'\nimport {\n assertDepositWithinCap,\n calculateMinimumMint,\n getDepositFeeForAmount,\n} from './utils'\n\n// ============================================================================\n// EIP-712 TYPES\n// ============================================================================\n\n/**\n * Strict EIP-712 domain separator conforming to the EIP-712 TypedData JSON schema\n * Compatible with viem's TypedDataDomain and standard EIP-712 signing libraries\n *\n * @property name - Human-readable name of the signing domain\n * @property version - Version of the signing domain\n * @property chainId - Ethereum chain ID as a number (not bigint)\n * @property verifyingContract - Address of the contract that will verify the signature\n * @property salt - Optional salt for disambiguation (hex string)\n */\nexport interface EIP712Domain {\n name: string\n version: string\n chainId: number\n verifyingContract: Address\n salt?: Hex\n}\n\n/**\n * T008: EIP-2612 Permit type definition\n */\nexport const PERMIT_TYPES = {\n Permit: [\n { name: 'owner', type: 'address' },\n { name: 'spender', type: 'address' },\n { name: 'value', type: 'uint256' },\n { name: 'nonce', type: 'uint256' },\n { name: 'deadline', type: 'uint256' },\n ],\n} as const\n\n/**\n * EIP-712 domain type definition for raw JSON-RPC calls\n */\nconst EIP712_DOMAIN_TYPE = [\n { name: 'name', type: 'string' },\n { name: 'version', type: 'string' },\n { name: 'chainId', type: 'uint256' },\n { name: 'verifyingContract', type: 'address' },\n] as const\n\n/**\n * Converts PermitSignatureData to the format required by eth_signTypedData_v4\n */\nexport function toEthSignTypedDataV4(permitData: PermitSignatureData): string {\n return JSON.stringify({\n domain: permitData.domain,\n types: {\n EIP712Domain: EIP712_DOMAIN_TYPE,\n ...permitData.types,\n },\n primaryType: permitData.primaryType,\n message: {\n owner: permitData.message.owner,\n spender: permitData.message.spender,\n value: permitData.message.value.toString(),\n nonce: permitData.message.nonce.toString(),\n deadline: permitData.message.deadline.toString(),\n },\n })\n}\n\nexport type PermitSignatureData = Awaited<\n ReturnType<typeof prepareDepositPermitSignature>\n>\n\n/**\n * T009: Parsed permit signature components\n */\nexport interface ParsedPermitSignature {\n v: number\n r: Hex\n s: Hex\n}\n\n// ============================================================================\n// DISCRIMINATED UNION: DEPOSIT WITH PERMIT TX DATA\n// ============================================================================\n\n/**\n * Standard deposit with permit transaction data\n */\nexport interface StandardDepositWithPermitData {\n depositType: typeof DepositType.STANDARD\n abi: typeof DistributorCodeDepositorAbiV0\n address: Address\n functionName: 'depositWithPermit'\n args: readonly [\n depositAsset: Address,\n depositAmount: bigint,\n minimumMint: bigint,\n to: Address,\n distributorCode: Hex,\n deadline: bigint,\n v: number,\n r: Hex,\n s: Hex,\n ]\n chainId: number\n}\n\n/**\n * KYT deposit with permit transaction data\n */\nexport interface KytDepositWithPermitData {\n depositType: typeof DepositType.KYT\n abi: typeof DistributorCodeDepositorAbiV1\n address: Address\n functionName: 'depositWithPermit'\n args: readonly [\n depositAsset: Address,\n depositAmount: bigint,\n minimumMint: bigint,\n to: Address,\n distributorCode: Hex,\n attestation: Attestation,\n deadline: bigint,\n v: number,\n r: Hex,\n s: Hex,\n ]\n chainId: number\n}\n\n/**\n * Discriminated union of deposit-with-permit transaction data variants\n */\nexport type DepositWithPermitData =\n | StandardDepositWithPermitData\n | KytDepositWithPermitData\n\nexport type UnencodedDepositWithPermitData = Awaited<\n ReturnType<typeof prepareDepositWithPermitTxData>\n>\n\n// ============================================================================\n// PARAMS\n// ============================================================================\n\n/**\n * T009: Parameters for prepareDepositPermitSignature\n */\nexport interface PrepareDepositPermitSignatureParams {\n vaultName: string\n depositAsset: Address\n depositAmount: string\n to: Address\n chainId: ChainId\n deadline?: bigint\n /** Pre-fetched nonce from getTokenPermitInfoWithAllowance */\n nonce?: bigint\n /** Pre-fetched token decimals */\n decimals?: number\n /** Pre-fetched token name for EIP-712 domain */\n tokenName?: string\n /** Pre-fetched token version for EIP-712 domain (defaults to \"1\") */\n tokenVersion?: string\n}\n\n/**\n * T048: Parameters for prepareDepositWithPermitTxData()\n */\nexport interface PrepareDepositWithPermitTxDataParams {\n vaultName: string\n to: Address\n depositAsset: Address\n depositAmount: string\n chainId: ChainId\n signature: Hex\n deadline: bigint\n slippage?: number\n distributorCode?: string\n}\n\n// ============================================================================\n// FUNCTIONS\n// ============================================================================\n\n/**\n * T018-T030: Prepare complete EIP-712 typed data for permit signature\n */\nexport async function prepareDepositPermitSignature(\n params: PrepareDepositPermitSignatureParams\n) {\n const {\n vaultName,\n depositAsset,\n depositAmount,\n to,\n chainId,\n deadline,\n // Optional pre-fetched data to skip RPC calls\n nonce: prefetchedNonce,\n decimals: prefetchedDecimals,\n tokenName: prefetchedTokenName,\n tokenVersion: prefetchedTokenVersion,\n } = params\n\n try {\n const normalizedChainId = toChainId(chainId)\n\n const vault = await resolveVault({\n vaultName,\n assetAddress: depositAsset,\n chainId: normalizedChainId,\n callerEndpoint: 'prepareDepositPermitSignature',\n })\n\n const communityCodeDepositorAddress =\n vault.vault.communityCodeDepositorAddress\n if (!communityCodeDepositorAddress) {\n throw new APIError(\n `CommunityCodeDepositor contract address not found for vault ${vault.id}`,\n { endpoint: 'prepareDepositPermitSignature' }\n )\n }\n\n // Use pre-fetched data if available, otherwise fetch from chain\n let resolvedTokenName: string\n let resolvedTokenVersion: string\n let resolvedNonce: bigint\n\n const hasAllPrefetchedData =\n prefetchedTokenName !== undefined &&\n prefetchedTokenVersion !== undefined &&\n prefetchedNonce !== undefined\n\n if (hasAllPrefetchedData) {\n resolvedTokenName = prefetchedTokenName\n resolvedTokenVersion = prefetchedTokenVersion\n resolvedNonce = prefetchedNonce\n } else {\n const client = await getClient(normalizedChainId)\n\n try {\n const [nameResult, versionResult, nonceResult] = await client.multicall(\n {\n contracts: [\n {\n address: depositAsset,\n abi: erc2612Abi,\n functionName: 'name',\n },\n {\n address: depositAsset,\n abi: erc2612Abi,\n functionName: 'version',\n },\n {\n address: depositAsset,\n abi: erc2612Abi,\n functionName: 'nonces',\n args: [to],\n },\n ],\n }\n )\n\n if (prefetchedTokenName !== undefined) {\n resolvedTokenName = prefetchedTokenName\n } else if (nameResult.status === 'success') {\n resolvedTokenName = nameResult.result as string\n } else {\n throw new APIError(`Failed to read token name from ${depositAsset}`, {\n endpoint: 'prepareDepositPermitSignature',\n cause: nameResult.error,\n })\n }\n\n if (prefetchedTokenVersion !== undefined) {\n resolvedTokenVersion = prefetchedTokenVersion\n } else if (versionResult.status === 'success') {\n resolvedTokenVersion = versionResult.result as string\n } else {\n resolvedTokenVersion = '1'\n }\n\n if (prefetchedNonce !== undefined) {\n resolvedNonce = prefetchedNonce\n } else if (nonceResult.status === 'success') {\n resolvedNonce = nonceResult.result as bigint\n } else {\n throw new APIError(\n `Token ${depositAsset} does not support EIP-2612 permit. Missing required function: nonces()`,\n {\n endpoint: 'prepareDepositPermitSignature',\n cause: nonceResult.error,\n }\n )\n }\n } catch (error) {\n if (error instanceof APIError) {\n throw error\n }\n throw new APIError(\n `Failed to read token metadata: ${\n error instanceof Error ? error.message : 'Unknown error'\n }`,\n {\n endpoint: 'prepareDepositPermitSignature',\n cause: error,\n }\n )\n }\n }\n\n const permitDeadline =\n deadline ?? BigInt(Math.floor(Date.now() / 1000) + 3600)\n\n let resolvedDecimals: number\n if (prefetchedDecimals !== undefined) {\n resolvedDecimals = prefetchedDecimals\n } else {\n resolvedDecimals = await getErc20Decimals({\n tokenAddress: depositAsset,\n chainId: normalizedChainId,\n })\n }\n const value = parseUnits(depositAmount, resolvedDecimals)\n\n const domain = {\n name: resolvedTokenName,\n version: resolvedTokenVersion,\n chainId: normalizedChainId,\n verifyingContract: depositAsset,\n } satisfies EIP712Domain\n\n const message = {\n owner: to,\n spender: communityCodeDepositorAddress,\n value: value,\n nonce: resolvedNonce,\n deadline: permitDeadline,\n }\n\n return {\n account: to,\n domain,\n types: PERMIT_TYPES,\n primaryType: 'Permit' as const,\n message,\n }\n } catch (error) {\n if (error instanceof APIError) {\n throw error\n }\n\n throw new APIError(\n `Failed to prepare permit signature: ${\n error instanceof Error ? error.message : String(error)\n }`,\n {\n endpoint: 'prepareDepositPermitSignature',\n cause: error,\n }\n )\n }\n}\n\n/**\n * T036-T040: Parse raw hex signature into v, r, s components\n */\nexport function parsePermitSignature(signature: Hex): ParsedPermitSignature {\n try {\n const parsed = hexToSignature(signature)\n\n let v: number\n if (parsed.v !== undefined) {\n v = Number(parsed.v)\n } else if (parsed.yParity !== undefined) {\n v = parsed.yParity + 27\n } else {\n v = 27\n }\n\n return {\n v,\n r: parsed.r,\n s: parsed.s,\n }\n } catch (error) {\n throw new APIError(\n `Invalid permit signature format. Expected hex string but received: ${signature}. ${\n error instanceof Error ? error.message : 'Unknown error'\n }`,\n {\n endpoint: 'parsePermitSignature',\n cause: error,\n }\n )\n }\n}\n\n/**\n * T048-T057: Prepare complete deposit transaction with permit signature\n *\n * Automatically routes to standard or KYT deposit based on vault configuration.\n */\nexport async function prepareDepositWithPermitTxData(\n params: PrepareDepositWithPermitTxDataParams\n) {\n const {\n vaultName,\n depositAsset,\n depositAmount,\n chainId,\n signature,\n deadline,\n slippage = DEFAULT_SLIPPAGE_BPS,\n to,\n distributorCode,\n } = params\n\n try {\n const { v, r, s } = parsePermitSignature(signature)\n\n if (slippage < 0 || slippage > 10000) {\n throw new APIError(\n `Invalid slippage value: ${slippage}. Slippage must be between 0 and 10000 basis points.`,\n {\n endpoint: 'prepareDepositWithPermitTxData',\n }\n )\n }\n\n const normalizedChainId = toChainId(chainId)\n\n const vault = await resolveVault({\n vaultName,\n assetAddress: depositAsset,\n chainId: normalizedChainId,\n callerEndpoint: 'prepareDepositWithPermitTxData',\n })\n\n if (vault.inDeprecation) {\n getLogger().warn(\n `Vault \"${vault.name}\" is being deprecated. Please contact the Paxos Labs team for migration guidance.`\n )\n }\n\n let asset: SupportedAsset | null = null\n const assets = await getSupportedAssets({ address: depositAsset })\n if (assets.length > 0) {\n asset =\n assets.find((a) => a.chains.includes(normalizedChainId)) ||\n assets[0] ||\n null\n }\n\n if (!asset) {\n throw new APIError(\n `Asset metadata not found for token ${depositAsset} on chain ${normalizedChainId}`,\n {\n endpoint: 'prepareDepositWithPermitTxData',\n }\n )\n }\n\n if (!asset.chains || !asset.chains.includes(normalizedChainId)) {\n throw new APIError(\n `Token ${\n asset.symbol || depositAsset\n } not supported on chain ${normalizedChainId}`,\n {\n endpoint: 'prepareDepositWithPermitTxData',\n }\n )\n }\n\n const communityCodeDepositorAddress =\n vault.vault.communityCodeDepositorAddress\n const accountantAddress = vault.vault.accountantAddress\n const depositAssetAddress = depositAsset\n\n if (!communityCodeDepositorAddress) {\n throw new APIError(\n `CommunityCodeDepositor contract address not found for vault ${vault.id}`,\n { endpoint: 'prepareDepositWithPermitTxData' }\n )\n }\n\n if (!accountantAddress) {\n throw new APIError(\n `Accountant contract address not found for vault ${vault.id}`,\n { endpoint: 'prepareDepositWithPermitTxData' }\n )\n }\n\n const rateAndDecimalResults = await getRateInQuoteWithAssetDecimals({\n assetAddress: depositAssetAddress,\n accountantAddress: accountantAddress,\n chainId: normalizedChainId,\n })\n const [depositAssetDecimalsResult, rateInQuoteResult] =\n rateAndDecimalResults\n\n if (depositAssetDecimalsResult.status === 'failure') {\n throw new APIError(\n `Failed to get asset decimals: ${\n depositAssetDecimalsResult.error?.message || 'Unknown error'\n }`,\n {\n endpoint: 'prepareDepositWithPermitTxData',\n cause: depositAssetDecimalsResult.error,\n }\n )\n }\n\n if (rateInQuoteResult.status === 'failure') {\n throw new APIError(\n `Failed to get exchange rate: ${\n rateInQuoteResult.error?.message || 'Unknown error'\n }`,\n {\n endpoint: 'prepareDepositWithPermitTxData',\n cause: rateInQuoteResult.error,\n }\n )\n }\n\n const onChainDecimals = depositAssetDecimalsResult.result as number\n const depositAmountAsBigInt = parseUnits(depositAmount, onChainDecimals)\n\n const totalFee = await getDepositFeeForAmount(\n vault.vault.depositFeeModuleAddress,\n depositAssetAddress,\n depositAmountAsBigInt,\n normalizedChainId\n )\n\n if (totalFee >= depositAmountAsBigInt) {\n throw new APIError(\n 'Deposit amount is entirely consumed by fees. Increase the deposit amount.',\n { endpoint: 'prepareDepositWithPermitTxData' }\n )\n }\n\n const depositAmountAfterFees = depositAmountAsBigInt - totalFee\n\n await assertDepositWithinCap(\n vault,\n depositAmountAfterFees,\n depositAssetAddress,\n normalizedChainId,\n 'prepareDepositWithPermitTxData'\n )\n\n const minimumMint = calculateMinimumMint(\n depositAmountAfterFees,\n rateInQuoteResult.result,\n onChainDecimals,\n slippage\n )\n\n const distributorCodeHex = stringToHex(distributorCode || '')\n\n const policyId = vault.enterpriseConfig?.predicatePolicyId\n\n // undefined → no enterprise config → V0 standard deposit (old signature)\n if (policyId === undefined) {\n return {\n depositType: DepositType.STANDARD as typeof DepositType.STANDARD,\n abi: DistributorCodeDepositorAbiV0,\n address: communityCodeDepositorAddress,\n functionName: 'depositWithPermit' as const,\n args: [\n depositAssetAddress,\n depositAmountAsBigInt,\n minimumMint,\n to,\n distributorCodeHex,\n deadline,\n v,\n r,\n s,\n ] as const,\n chainId: normalizedChainId,\n }\n }\n\n // null → V1 DCD deposit with empty attestation (no KYT API call)\n if (policyId === null) {\n const emptyAttestation: Attestation = {\n uuid: '',\n expiration: 0n,\n attester: zeroAddress,\n signature: '0x',\n }\n\n return {\n depositType: DepositType.KYT as typeof DepositType.KYT,\n abi: DistributorCodeDepositorAbiV1,\n address: communityCodeDepositorAddress,\n functionName: 'depositWithPermit' as const,\n args: [\n depositAssetAddress,\n depositAmountAsBigInt,\n minimumMint,\n to,\n distributorCodeHex,\n emptyAttestation,\n deadline,\n v,\n r,\n s,\n ] as const,\n chainId: normalizedChainId,\n }\n }\n\n // string → V1 DCD deposit with real attestation from KYT API\n const attestation = await fetchKytAttestation({\n to: communityCodeDepositorAddress,\n from: to,\n chainId: normalizedChainId,\n })\n\n return {\n depositType: DepositType.KYT as typeof DepositType.KYT,\n abi: DistributorCodeDepositorAbiV1,\n address: communityCodeDepositorAddress,\n functionName: 'depositWithPermit' as const,\n args: [\n depositAssetAddress,\n depositAmountAsBigInt,\n minimumMint,\n to,\n distributorCodeHex,\n attestation,\n deadline,\n v,\n r,\n s,\n ] as const,\n chainId: normalizedChainId,\n }\n } catch (error) {\n if (error instanceof APIError) {\n throw error\n }\n\n throw new APIError(\n `Failed to prepare deposit with permit transaction: ${\n error instanceof Error ? error.message : String(error)\n }`,\n {\n endpoint: 'prepareDepositWithPermitTxData',\n cause: error,\n }\n )\n }\n}\n","/**\n * Wallet detection utilities\n *\n * Provides helpers to determine wallet type (EOA vs smart contract wallet)\n * by inspecting on-chain bytecode.\n *\n * @module utils/wallet\n */\n\nimport type { Address } from 'viem'\nimport { getClient } from '../lib/viem/client'\nimport type { ChainId } from './chain-utils'\n\n/**\n * Checks whether an address is a smart contract wallet\n *\n * Uses viem's `getCode` to retrieve bytecode at the address:\n * - No bytecode (undefined / \"0x\") → EOA (externally owned account)\n * - Bytecode present → smart contract wallet (or EIP-7702 delegated EOA)\n *\n * Smart contract wallets can batch approve + execute atomically,\n * so pre-approval checks can be skipped for them.\n *\n * @param address - The wallet address to check\n * @param chainId - The chain to query\n * @returns true if the address has deployed bytecode (smart contract wallet)\n */\nexport async function isSmartContractWallet(\n address: Address,\n chainId: ChainId\n): Promise<boolean> {\n const client = await getClient(chainId)\n const code = await client.getCode({ address })\n return !!code && code !== '0x'\n}\n","/**\n * @file Unified deposit module with wrapper functions\n * @module vaults/deposit\n *\n * Provides high-level wrapper functions for deposit authorization and execution:\n * - `prepareDepositAuthorization`: Determines optimal authorization method (permit/approval)\n * - `prepareDeposit`: Unified deposit preparation with automatic routing\n */\n\nimport { type Address, type Hex, parseUnits } from 'viem'\nimport { resolveVault } from '../../client/resolve-vault'\nimport { APIError } from '../../types/amplify-sdk-api'\nimport { isDepositSpendApproved } from '../../utils/approvals'\nimport { type ChainId, toChainId } from '../../utils/chain-utils'\nimport { isSmartContractWallet } from '../../utils/wallet'\nimport {\n type ApproveDepositTokenTxData,\n prepareApproveDepositTokenTxData,\n} from './approve-deposit'\nimport { type DepositTxData, prepareDepositTxData } from './deposit'\nimport {\n type PermitSignatureData,\n prepareDepositPermitSignature,\n prepareDepositWithPermitTxData,\n type UnencodedDepositWithPermitData,\n} from './deposit-with-permit'\n\n// ============================================================================\n// ENUMS\n// ============================================================================\n\n/**\n * Authorization methods for deposit operations\n *\n * Extensible const object for current and future authorization mechanisms:\n * - PERMIT: EIP-2612 off-chain signature (gas efficient, single transaction)\n * - APPROVAL: Traditional ERC20 approval (two transactions)\n * - ALREADY_APPROVED: Existing allowance is sufficient (no action needed)\n *\n * @example\n * ```typescript\n * import { DepositAuthMethod } from \"@paxoslabs/amplify-sdk\";\n *\n * if (result.method === DepositAuthMethod.PERMIT) {\n * // Handle permit flow\n * }\n * ```\n */\nexport const DepositAuthMethod = {\n PERMIT: 'permit',\n APPROVAL: 'approval',\n ALREADY_APPROVED: 'already_approved',\n} as const\n\nexport type DepositAuthMethod =\n (typeof DepositAuthMethod)[keyof typeof DepositAuthMethod]\n\n// ============================================================================\n// TYPE DEFINITIONS - Authorization\n// ============================================================================\n\n/**\n * Permit authorization result\n * Returned when token supports EIP-2612 permit\n */\nexport interface PermitAuthorizationResult {\n method: typeof DepositAuthMethod.PERMIT\n /** EIP-712 typed data ready for wallet signing */\n permitData: PermitSignatureData\n}\n\n/**\n * Approval authorization result\n * Returned when an ERC20 approval transaction is needed\n */\nexport interface ApprovalAuthorizationResult {\n method: typeof DepositAuthMethod.APPROVAL\n /** Transaction data for ERC20 approve() call */\n txData: ApproveDepositTokenTxData\n}\n\n/**\n * Already approved authorization result\n * Returned when existing allowance is sufficient for the deposit\n */\nexport interface AlreadyApprovedAuthorizationResult {\n method: typeof DepositAuthMethod.ALREADY_APPROVED\n /** Current allowance (human-readable) */\n allowance: string\n /** Current allowance as BigInt string */\n allowanceAsBigInt: string\n}\n\n/**\n * Discriminated union of all authorization result types\n *\n * Use type guards or type narrowing with `result.method` to access specific fields:\n *\n * @example Using type guards (recommended)\n * ```typescript\n * import {\n * prepareDepositAuthorization,\n * isPermitAuth,\n * isApprovalAuth,\n * isAlreadyApprovedAuth,\n * } from \"@paxoslabs/amplify-sdk\";\n *\n * const result = await prepareDepositAuthorization({...});\n *\n * if (isPermitAuth(result)) {\n * // TypeScript knows result.permitData exists\n * const signature = await signTypedData(result.permitData);\n * } else if (isApprovalAuth(result)) {\n * // TypeScript knows result.txData exists\n * await writeContract(result.txData);\n * } else if (isAlreadyApprovedAuth(result)) {\n * // TypeScript knows result.allowance exists\n * console.log(`Already approved: ${result.allowance}`);\n * }\n * ```\n *\n * @example Using switch statement\n * ```typescript\n * switch (result.method) {\n * case DepositAuthMethod.PERMIT:\n * // TypeScript knows result.permitData exists\n * const signature = await signTypedData(result.permitData);\n * break;\n * case DepositAuthMethod.APPROVAL:\n * // TypeScript knows result.txData exists\n * await writeContract(result.txData);\n * break;\n * case DepositAuthMethod.ALREADY_APPROVED:\n * // TypeScript knows result.allowance exists\n * console.log(`Already approved: ${result.allowance}`);\n * break;\n * }\n * ```\n */\nexport type DepositAuthorizationResult =\n | PermitAuthorizationResult\n | ApprovalAuthorizationResult\n | AlreadyApprovedAuthorizationResult\n\n// ============================================================================\n// TYPE GUARDS\n// ============================================================================\n\n/**\n * Type guard for permit authorization result\n *\n * @param result - Authorization result to check\n * @returns true if result is a permit authorization\n *\n * @example\n * ```typescript\n * if (isPermitAuth(result)) {\n * // TypeScript knows result.permitData exists\n * const signature = await signTypedData(result.permitData);\n * }\n * ```\n */\nexport function isPermitAuth(\n result: DepositAuthorizationResult\n): result is PermitAuthorizationResult {\n return result.method === DepositAuthMethod.PERMIT\n}\n\n/**\n * Type guard for approval authorization result\n *\n * @param result - Authorization result to check\n * @returns true if result requires an ERC20 approval transaction\n *\n * @example\n * ```typescript\n * if (isApprovalAuth(result)) {\n * // TypeScript knows result.txData exists\n * await writeContract(result.txData);\n * }\n * ```\n */\nexport function isApprovalAuth(\n result: DepositAuthorizationResult\n): result is ApprovalAuthorizationResult {\n return result.method === DepositAuthMethod.APPROVAL\n}\n\n/**\n * Type guard for already-approved authorization result\n *\n * @param result - Authorization result to check\n * @returns true if existing allowance is sufficient (no action needed)\n *\n * @example\n * ```typescript\n * if (isAlreadyApprovedAuth(result)) {\n * // TypeScript knows result.allowance exists\n * console.log(`Sufficient allowance: ${result.allowance}`);\n * }\n * ```\n */\nexport function isAlreadyApprovedAuth(\n result: DepositAuthorizationResult\n): result is AlreadyApprovedAuthorizationResult {\n return result.method === DepositAuthMethod.ALREADY_APPROVED\n}\n\n/**\n * Parameters for prepareDepositAuthorization\n */\nexport interface PrepareDepositAuthorizationParams {\n /** Human-readable vault name (e.g. \"Amplify USDC Core\") */\n vaultName: string\n /** Token contract address to deposit. Must match the vault's supported asset. */\n depositAsset: Address\n /** Amount of assets to deposit as decimal string (e.g., \"100.25\") */\n depositAmount: string\n /** User's wallet address (permit owner / approval sender) */\n to: Address\n /** Chain ID where the vault is deployed. Must match the vault's chain. */\n chainId: ChainId\n /** Optional deadline for permit signature (defaults to 1 hour from now) */\n deadline?: bigint\n /** Force specific authorization method (bypasses automatic detection) */\n forceMethod?: 'permit' | 'approval'\n}\n\n// ============================================================================\n// TYPE DEFINITIONS - Deposit\n// ============================================================================\n\n/**\n * Parameters for prepareDeposit\n * Unified deposit function accepting optional permit signature\n */\nexport interface PrepareDepositParams {\n /** Human-readable vault name (e.g. \"Amplify USDC Core\") */\n vaultName: string\n /** Token contract address to deposit. Must match the vault's supported asset. */\n depositAsset: Address\n /** Amount of assets to deposit as decimal string (e.g., \"100.25\") */\n depositAmount: string\n /** Recipient address for vault shares */\n to: Address\n /** Chain ID where the vault is deployed. Must match the vault's chain. */\n chainId: ChainId\n /** Optional slippage in basis points (default: 50 = 0.5%) */\n slippage?: number\n /** Optional distributor code for fee attribution */\n distributorCode?: string\n /** Optional permit signature (hex string from wallet signing) */\n signature?: Hex\n /** Optional permit deadline (must match signature deadline) */\n deadline?: bigint\n /** Force deposit method (bypasses automatic routing) */\n forceMethod?: 'permit' | 'approval'\n}\n\n/**\n * Standard deposit result (approval flow)\n */\nexport interface StandardDepositResult {\n method: typeof DepositAuthMethod.APPROVAL\n txData: DepositTxData\n}\n\n/**\n * Permit deposit result\n */\nexport interface PermitDepositResult {\n method: typeof DepositAuthMethod.PERMIT\n txData: UnencodedDepositWithPermitData\n}\n\n/**\n * Unified deposit result\n * Returns either standard deposit or permit deposit transaction data\n */\nexport type PrepareDepositResult = StandardDepositResult | PermitDepositResult\n\n// ============================================================================\n// FUNCTIONS\n// ============================================================================\n\n/**\n * Prepares authorization for a deposit operation\n *\n * Intelligently determines the best authorization method:\n * 1. Check if token supports EIP-2612 permit → return permit signature data\n * 2. Check existing allowance → if sufficient, return \"already approved\"\n * 3. Otherwise → return approval transaction data\n *\n * Supports force override via `forceMethod` parameter.\n *\n * @param params - Authorization parameters\n * @returns Discriminated union of authorization results\n * @throws {APIError} If vault not found, chain not supported, or token invalid\n *\n * @example\n * ```typescript\n * import { prepareDepositAuthorization, DepositAuthMethod } from \"@paxoslabs/amplify-sdk\";\n *\n * const authResult = await prepareDepositAuthorization({\n * vaultName: \"Amplify USDC Core\",\n * depositAsset: \"0xA0b86991c6218b36c1d19D4a2e9Eb0cE3606eB48\", // USDC\n * depositAmount: \"1000.0\",\n * to: \"0x1234...\",\n * chainId: 1,\n * });\n *\n * if (authResult.method === DepositAuthMethod.PERMIT) {\n * const signature = await signTypedData(authResult.permitData);\n * // Use signature in prepareDeposit\n * } else if (authResult.method === DepositAuthMethod.APPROVAL) {\n * await writeContract(authResult.txData);\n * // Wait for confirmation, then call prepareDeposit\n * } else {\n * // Already approved, proceed directly to deposit\n * console.log(`Approved amount: ${authResult.allowance}`);\n * }\n * ```\n */\nexport async function prepareDepositAuthorization(\n params: PrepareDepositAuthorizationParams\n) {\n const {\n vaultName,\n depositAsset,\n depositAmount,\n to,\n chainId,\n deadline,\n forceMethod,\n } = params\n\n try {\n const normalizedChainId = toChainId(chainId)\n const vault = await resolveVault({\n vaultName,\n assetAddress: depositAsset,\n chainId: normalizedChainId,\n callerEndpoint: 'prepareDepositAuthorization',\n })\n\n // Force override: always return approval tx data.\n if (forceMethod === 'approval') {\n const txData = await prepareApproveDepositTokenTxData({\n vaultName,\n depositAsset,\n approvalAmount: depositAmount,\n chainId: normalizedChainId,\n })\n\n return {\n method: DepositAuthMethod.APPROVAL,\n txData,\n }\n }\n\n // Force override: always return permit signature data.\n if (forceMethod === 'permit') {\n const tokenInfo = await isDepositSpendApproved({\n vaultName: vault.name,\n chainId: normalizedChainId,\n depositAssetAddress: depositAsset,\n recipientAddress: to,\n })\n\n const permitData = await prepareDepositPermitSignature({\n vaultName,\n depositAsset,\n depositAmount,\n to,\n chainId: normalizedChainId,\n deadline,\n nonce: tokenInfo.nonce ?? undefined,\n decimals: tokenInfo.decimals,\n tokenName: tokenInfo.tokenName,\n tokenVersion: tokenInfo.tokenVersion,\n })\n\n return {\n method: DepositAuthMethod.PERMIT,\n permitData,\n }\n }\n\n const smartWallet = await isSmartContractWallet(to, normalizedChainId)\n\n if (smartWallet) {\n const txData = await prepareApproveDepositTokenTxData({\n vaultName,\n depositAsset,\n approvalAmount: depositAmount,\n chainId: normalizedChainId,\n })\n\n return {\n method: DepositAuthMethod.APPROVAL,\n txData,\n }\n }\n\n const tokenInfo = await isDepositSpendApproved({\n vaultName: vault.name,\n chainId: normalizedChainId,\n depositAssetAddress: depositAsset,\n recipientAddress: to,\n })\n\n // Automatic detection: Use dynamic on-chain permit support detection\n if (tokenInfo.supportsPermit) {\n const permitData = await prepareDepositPermitSignature({\n vaultName,\n depositAsset,\n depositAmount,\n to,\n chainId: normalizedChainId,\n deadline,\n nonce: tokenInfo.nonce ?? undefined,\n decimals: tokenInfo.decimals,\n tokenName: tokenInfo.tokenName,\n tokenVersion: tokenInfo.tokenVersion,\n })\n\n return {\n method: DepositAuthMethod.PERMIT,\n permitData,\n }\n }\n\n // No permit support: Check existing allowance\n const depositAmountBigInt = parseUnits(depositAmount, tokenInfo.decimals)\n const currentAllowanceBigInt = BigInt(tokenInfo.allowanceAsBigInt)\n\n // Check if existing allowance is sufficient\n if (tokenInfo.isApproved && currentAllowanceBigInt >= depositAmountBigInt) {\n return {\n method: DepositAuthMethod.ALREADY_APPROVED,\n allowance: tokenInfo.allowance,\n allowanceAsBigInt: tokenInfo.allowanceAsBigInt,\n }\n }\n\n const txData = await prepareApproveDepositTokenTxData({\n vaultName,\n depositAsset,\n approvalAmount: depositAmount,\n chainId: normalizedChainId,\n })\n\n return {\n method: DepositAuthMethod.APPROVAL,\n txData,\n }\n } catch (error) {\n if (error instanceof APIError) {\n throw error\n }\n\n throw new APIError(\n `Failed to prepare deposit authorization: ${\n error instanceof Error ? error.message : String(error)\n }`,\n {\n endpoint: 'prepareDepositAuthorization',\n cause: error,\n }\n )\n }\n}\n\n/**\n * Unified deposit preparation function\n *\n * Intelligently routes to permit deposit or standard deposit based on:\n * 1. Presence of signature/deadline parameters → permit deposit\n * 2. Force method override → specified method\n * 3. Otherwise → standard deposit\n *\n * @param params - Deposit parameters with optional permit signature\n * @returns Discriminated union of deposit transaction data\n * @throws {APIError} If vault not found, invalid signature, or validation fails\n *\n * @example\n * ```typescript\n * import { prepareDeposit, DepositAuthMethod } from \"@paxoslabs/amplify-sdk\";\n *\n * // Scenario 1: Permit deposit (with signature from prepareDepositAuthorization)\n * const permitDeposit = await prepareDeposit({\n * vaultName: \"Amplify USDC Core\",\n * depositAsset: \"0xA0b86991c6218b36c1d19D4a2e9Eb0cE3606eB48\",\n * depositAmount: \"1000.0\",\n * to: \"0x1234...\",\n * chainId: 1,\n * signature: \"0xabc...\",\n * deadline: 1234567890n,\n * });\n * // permitDeposit.method === DepositAuthMethod.PERMIT\n *\n * // Scenario 2: Standard deposit (after approval)\n * const standardDeposit = await prepareDeposit({\n * vaultName: \"Amplify USDC Core\",\n * depositAsset: \"0xA0b86991c6218b36c1d19D4a2e9Eb0cE3606eB48\",\n * depositAmount: \"1000.0\",\n * to: \"0x1234...\",\n * chainId: 1,\n * });\n * // standardDeposit.method === DepositAuthMethod.APPROVAL\n *\n * // Submit transaction\n * await writeContract(standardDeposit.txData);\n * ```\n */\nexport async function prepareDeposit(\n params: PrepareDepositParams\n): Promise<PrepareDepositResult> {\n const {\n vaultName,\n depositAsset,\n depositAmount,\n to,\n chainId,\n slippage,\n distributorCode,\n signature,\n deadline,\n forceMethod,\n } = params\n\n try {\n // Validate force method constraints\n if (forceMethod === 'permit' && (!signature || deadline === undefined)) {\n throw new APIError(\n \"Permit deposit requires both signature and deadline parameters when forceMethod is 'permit'\",\n { endpoint: 'prepareDeposit' }\n )\n }\n\n // Determine deposit method\n const usePermit =\n forceMethod === 'permit' ||\n (forceMethod !== 'approval' &&\n signature !== undefined &&\n deadline !== undefined)\n\n if (usePermit) {\n // Permit deposit path\n if (!signature || deadline === undefined) {\n throw new APIError(\n 'Permit deposit requires both signature and deadline parameters',\n { endpoint: 'prepareDeposit' }\n )\n }\n\n const txData = await prepareDepositWithPermitTxData({\n vaultName,\n depositAsset,\n depositAmount,\n to,\n chainId,\n signature,\n deadline,\n slippage,\n distributorCode,\n })\n return {\n method: DepositAuthMethod.PERMIT,\n txData,\n }\n }\n\n // Standard deposit path\n const txData = await prepareDepositTxData({\n vaultName,\n depositAsset,\n depositAmount,\n to,\n chainId,\n slippage,\n distributorCode,\n })\n return {\n method: DepositAuthMethod.APPROVAL,\n txData,\n }\n } catch (error) {\n if (error instanceof APIError) {\n throw error\n }\n\n throw new APIError(\n `Failed to prepare deposit: ${\n error instanceof Error ? error.message : String(error)\n }`,\n {\n endpoint: 'prepareDeposit',\n cause: error,\n }\n )\n }\n}\n\n// ============================================================================\n// RE-EXPORTS\n// ============================================================================\n\nexport type {\n ApproveDepositTokenTxData,\n PrepareApproveDepositTokenTxParams,\n} from './approve-deposit'\n// Re-export existing functions for backwards compatibility\nexport { prepareApproveDepositTokenTxData } from './approve-deposit'\nexport {\n DepositType,\n isKytDeposit,\n isStandardDeposit,\n prepareDepositTxData,\n} from './deposit'\nexport type {\n Attestation,\n DepositTxData,\n KytDepositTxData,\n PrepareDepositTxDataParams,\n StandardDepositTxData,\n} from './deposit'\nexport {\n parsePermitSignature,\n PERMIT_TYPES,\n prepareDepositPermitSignature,\n prepareDepositWithPermitTxData,\n toEthSignTypedDataV4,\n} from './deposit-with-permit'\nexport type {\n DepositWithPermitData,\n EIP712Domain,\n KytDepositWithPermitData,\n ParsedPermitSignature,\n PermitSignatureData,\n PrepareDepositPermitSignatureParams,\n PrepareDepositWithPermitTxDataParams,\n StandardDepositWithPermitData,\n UnencodedDepositWithPermitData,\n} from './deposit-with-permit'\n","import { type Address, parseUnits } from 'viem'\nimport { BoringVaultAbi } from '../../abi/boring-vault-abi'\nimport { getErc20Decimals } from '../../api/erc20'\nimport { resolveVault } from '../../client/resolve-vault'\nimport { DEFAULT_APPROVAL_AMOUNT } from '../../constants'\nimport { APIError } from '../../types/amplify-sdk-api'\nimport { type ChainId, toChainId } from '../../utils/chain-utils'\n\n/**\n * Parameters required for preparing a vault-share approval transaction\n *\n * @interface PrepareApproveWithdrawOrderTxDataParams\n * @property {string} vaultName - Human-readable vault name (e.g. \"Amplify USDC Core\")\n * @property {Address} wantAssetAddress - Address of the want token. Must match the vault's supported asset.\n * @property {string} [withdrawAmount] - Optional amount to approve as a decimal string (defaults to maximum approval)\n * @property {ChainId} chainId - ID of the chain where the vault is deployed. Must match the vault's chain.\n * @property {number} [shareDecimals] - Optional: Pre-fetched vault share decimals (avoids redundant RPC call)\n */\ninterface PrepareApproveWithdrawOrderTxDataParams {\n vaultName: string\n wantAssetAddress: Address\n withdrawAmount?: string\n chainId: ChainId\n /** Pre-fetched vault share decimals (avoids redundant RPC call) */\n shareDecimals?: number\n}\n\n/**\n * Result object containing transaction data for a vault shares approval operation (vault shares token)\n * @interface ApproveWithdrawOrderTxData\n * @property {typeof BoringVaultAbi} abi - ABI for the BoringVault contract (vault shares token)\n * @property {Address} address - Address of the BoringVault (vault shares token)\n * @property {'approve'} functionName - Name of the function to call\n * @property {[Address, bigint]} args - Arguments for the approve function:\n * [spender (WithdrawQueue address), amount]\n */\ninterface ApproveWithdrawOrderTxData {\n abi: typeof BoringVaultAbi\n address: Address\n functionName: 'approve'\n args: [Address, bigint]\n}\n\n/**\n * Prepares the transaction data needed to approve vault shares for the WithdrawQueue contract\n *\n * The vault is resolved and validated against `vaultName`, `chainId`, and `wantAssetAddress`\n * before any calldata is constructed.\n *\n * @example\n * ```typescript\n * const approveData = await prepareApproveWithdrawOrderTxData({\n * vaultName: \"Amplify USDC Core\",\n * wantAssetAddress: '0xA0b86991c6218b36c1d19D4a2e9Eb0cE3606eB48', // USDC\n * withdrawAmount: \"10.0\", // Approve 10 vault shares\n * chainId: 1,\n * });\n * ```\n *\n * @param {PrepareApproveWithdrawOrderTxDataParams} params - Parameters for the approval operation\n * @param {string} params.vaultName - Human-readable vault name\n * @param {Address} params.wantAssetAddress - Address of the want token\n * @param {string} [params.withdrawAmount] - Optional amount to approve as a decimal string (defaults to maximum approval)\n * @param {ChainId} params.chainId - ID of the chain where the vault is deployed\n *\n * @returns {Promise<ApproveWithdrawOrderTxData>} Promise resolving to the prepared transaction data\n * @throws {APIError} If vault not found, chain/asset mismatch, or contracts not configured\n */\nexport async function prepareApproveWithdrawOrderTxData({\n vaultName,\n wantAssetAddress,\n withdrawAmount,\n chainId,\n shareDecimals,\n}: PrepareApproveWithdrawOrderTxDataParams): Promise<ApproveWithdrawOrderTxData> {\n try {\n const normalizedChainId = toChainId(chainId)\n\n const config = await resolveVault({\n vaultName,\n assetAddress: wantAssetAddress,\n chainId: normalizedChainId,\n callerEndpoint: 'prepareApproveWithdrawOrderTxData',\n })\n\n // Validation: Ensure boringVault address is configured\n if (!config.vault.boringVaultAddress) {\n throw new APIError(\n `BoringVault contract address not configured for vault ${config.id}`,\n { endpoint: 'prepareApproveWithdrawOrderTxData' }\n )\n }\n if (!config.vault.withdrawQueueAddress) {\n throw new APIError(\n `WithdrawQueue contract address not configured for vault ${config.id}`,\n { endpoint: 'prepareApproveWithdrawOrderTxData' }\n )\n }\n\n const boringVaultAddress = config.vault.boringVaultAddress\n const withdrawQueueAddress = config.vault.withdrawQueueAddress\n\n // Resolve vault share decimals:\n // Use pre-fetched value if provided, otherwise read from chain\n const decimals =\n shareDecimals ??\n (await getErc20Decimals({\n tokenAddress: boringVaultAddress,\n chainId: normalizedChainId,\n }))\n\n const withdrawAmountAsBigInt = withdrawAmount\n ? parseUnits(withdrawAmount, decimals)\n : DEFAULT_APPROVAL_AMOUNT\n\n return {\n abi: BoringVaultAbi,\n address: boringVaultAddress,\n functionName: 'approve',\n args: [withdrawQueueAddress, withdrawAmountAsBigInt],\n }\n } catch (error) {\n // Re-throw APIError as-is\n if (error instanceof APIError) {\n throw error\n }\n\n // Wrap other errors\n throw new APIError(\n `Failed to prepare approval transaction: ${\n error instanceof Error ? error.message : String(error)\n }`,\n {\n endpoint: 'prepareApproveWithdrawOrderTxData',\n cause: error,\n }\n )\n }\n}\n\nexport type {\n ApproveWithdrawOrderTxData,\n PrepareApproveWithdrawOrderTxDataParams,\n}\n","/**\n * @file Cancel withdrawal order functionality for WithdrawQueue contract\n * @module vaults/withdraw/cancel-withdraw\n */\n\nimport type { Address } from 'viem'\nimport { WithdrawQueueAbi } from '../../abi/withdraw-queue-abi'\nimport { resolveVault } from '../../client/resolve-vault'\nimport { APIError } from '../../types/amplify-sdk-api'\nimport { type ChainId, toChainId } from '../../utils/chain-utils'\n\n/**\n * Parameters for preparing a cancel withdrawal order transaction\n *\n * @interface PrepareCancelWithdrawOrderTxDataParams\n * @property {string} vaultName - Human-readable vault name (e.g. \"Amplify USDC Core\")\n * @property {Address} wantAsset - Address of the want token (used to validate the vault). Must match the vault's supported asset.\n * @property {ChainId} chainId - ID of the chain where the order exists. Must match the vault's chain.\n * @property {bigint} orderIndex - Index of the order to cancel (provided by user)\n */\ninterface PrepareCancelWithdrawOrderTxDataParams {\n vaultName: string\n wantAsset: Address\n chainId: ChainId\n orderIndex: bigint\n}\n\n/**\n * Transaction data for canceling a withdrawal order on the WithdrawQueue contract\n *\n * Ready-to-use transaction data that can be passed directly to viem's writeContract\n * or wagmi's useWriteContract hook.\n *\n * @interface CancelWithdrawOrderTxData\n */\ninterface CancelWithdrawOrderTxData {\n abi: typeof WithdrawQueueAbi\n address: Address\n functionName: 'cancelOrder'\n args: [orderIndex: bigint]\n chainId: number\n}\n\n/**\n * Prepares transaction data to cancel a withdrawal order on the WithdrawQueue contract\n *\n * The vault is resolved and validated against `vaultName`, `chainId`, and `wantAsset`\n * before any calldata is constructed. Only the order owner can cancel their order.\n *\n * @param {PrepareCancelWithdrawOrderTxDataParams} params - Parameters for the cancel operation\n * @returns {Promise<CancelWithdrawOrderTxData>} Promise resolving to the prepared transaction data\n * @throws {APIError} If vault not found, chain/asset mismatch, or contracts not configured\n *\n * @example\n * ```typescript\n * import { prepareCancelWithdrawOrderTxData } from \"@paxoslabs/amplify-sdk\";\n *\n * const txData = await prepareCancelWithdrawOrderTxData({\n * vaultName: \"Amplify USDC Core\",\n * wantAsset: \"0xA0b86991c6218b36c1d19D4a2e9Eb0cE3606eB48\", // USDC\n * chainId: 1,\n * orderIndex: 42n,\n * });\n *\n * // Execute with viem\n * const hash = await walletClient.writeContract(txData);\n *\n * // Or with wagmi\n * const { writeContract } = useWriteContract();\n * await writeContract(txData);\n * ```\n */\nconst prepareCancelWithdrawOrderTxData = async ({\n vaultName,\n wantAsset,\n chainId,\n orderIndex,\n}: PrepareCancelWithdrawOrderTxDataParams): Promise<CancelWithdrawOrderTxData> => {\n try {\n const normalizedChainId = toChainId(chainId)\n\n const config = await resolveVault({\n vaultName,\n assetAddress: wantAsset,\n chainId: normalizedChainId,\n callerEndpoint: 'prepareCancelWithdrawOrderTxData',\n })\n\n // Validation: Ensure vault is on the correct chain\n if (config.chainId !== normalizedChainId) {\n throw new APIError(\n `Vault chain mismatch: vault is on chain ${config.chainId}, requested chain ${normalizedChainId}`,\n { endpoint: 'prepareCancelWithdrawOrderTxData' }\n )\n }\n\n // Validation: Ensure withdrawQueueAddress is configured\n if (!config.vault.withdrawQueueAddress) {\n throw new APIError(\n `WithdrawQueue contract address not configured for vault ${config.id}`,\n { endpoint: 'prepareCancelWithdrawOrderTxData' }\n )\n }\n\n return {\n abi: WithdrawQueueAbi,\n address: config.vault.withdrawQueueAddress,\n functionName: 'cancelOrder',\n args: [orderIndex],\n chainId: normalizedChainId,\n }\n } catch (error) {\n if (error instanceof APIError) {\n throw error\n }\n\n throw new APIError(\n `Failed to prepare cancel order transaction: ${\n error instanceof Error ? error.message : String(error)\n }`,\n {\n endpoint: 'prepareCancelWithdrawOrderTxData',\n cause: error,\n }\n )\n }\n}\n\nexport { prepareCancelWithdrawOrderTxData }\nexport type {\n CancelWithdrawOrderTxData,\n PrepareCancelWithdrawOrderTxDataParams,\n}\n","/**\n * @file Standard withdrawal functionality for WithdrawQueue contract\n * @module vaults/withdraw/standard-withdraw\n */\n\nimport { type Address, parseUnits } from 'viem'\nimport { WithdrawQueueAbi } from '../../abi/withdraw-queue-abi'\nimport { getErc20Decimals } from '../../api/erc20'\nimport { resolveVault } from '../../client/resolve-vault'\nimport { APIError } from '../../types/amplify-sdk-api'\nimport { type ChainId, toChainId } from '../../utils/chain-utils'\n\n/**\n * Approval method enum for WithdrawQueue signature params\n * Maps to contract's ApprovalMethod enum\n */\nconst ApprovalMethod = {\n /** Standard ERC20 approve (user has pre-approved via approve()) */\n EIP20_APPROVE: 0,\n /** EIP-2612 permit signature */\n EIP2612_APPROVE: 1,\n} as const\n\n/**\n * Empty signature params for submitOrder when no permit/signature is used\n *\n * The contract expects this struct even when using pre-approved allowance.\n * ApprovalMethod enum: 0 = NONE, 1 = PERMIT, 2 = ALLOWANCE\n */\nconst EMPTY_SIGNATURE_PARAMS = {\n approvalMethod: ApprovalMethod.EIP20_APPROVE,\n approvalV: 0,\n approvalR:\n '0x0000000000000000000000000000000000000000000000000000000000000000' as `0x${string}`,\n approvalS:\n '0x0000000000000000000000000000000000000000000000000000000000000000' as `0x${string}`,\n submitWithSignature: false,\n deadline: 0n,\n eip2612Signature: '0x' as `0x${string}`,\n} as const\n\n/**\n * Parameters for preparing a submit order transaction\n *\n * @interface PrepareWithdrawOrderTxDataParams\n * @property {string} vaultName - Human-readable vault name (e.g. \"Amplify USDC Core\")\n * @property {Address} wantAsset - Address of the token to receive upon withdrawal. Must match the vault's supported asset.\n * @property {Address} userAddress - User's wallet address (used for intendedDepositor, receiver, refundReceiver)\n * @property {ChainId} chainId - ID of the chain where the vault is deployed. Must match the vault's chain.\n * @property {string} amountOffer - Amount of vault shares to withdraw as a decimal string\n */\ninterface PrepareWithdrawOrderTxDataParams {\n vaultName: string\n wantAsset: Address\n userAddress: Address\n chainId: ChainId\n amountOffer: string\n}\n\n/**\n * Transaction data for submitting a withdrawal order to the WithdrawQueue contract\n *\n * Ready-to-use transaction data that can be passed directly to viem's writeContract\n * or wagmi's useWriteContract hook.\n *\n * @interface WithdrawOrderTxData\n */\ninterface WithdrawOrderTxData {\n abi: typeof WithdrawQueueAbi\n address: Address\n functionName: 'submitOrder'\n args: [\n {\n amountOffer: bigint\n wantAsset: Address\n intendedDepositor: Address\n receiver: Address\n refundReceiver: Address\n signatureParams: typeof EMPTY_SIGNATURE_PARAMS\n },\n ]\n chainId: number\n}\n\n/**\n * Prepares transaction data to submit a withdrawal order to the WithdrawQueue contract\n *\n * The vault is resolved and validated against `vaultName`, `chainId`, and `wantAsset`\n * before any calldata is constructed. Unlike the old AtomicQueue, this does not require\n * exchange rate queries or slippage parameters.\n * It intentionally does not perform allowance pre-checks; callers should use\n * `prepareWithdrawalAuthorization` when they need approval routing.\n *\n * @param {PrepareWithdrawOrderTxDataParams} params - Parameters for the withdraw operation\n * @returns {Promise<WithdrawOrderTxData>} Promise resolving to the prepared transaction data\n * @throws {APIError} If vault not found, chain/asset mismatch, or contracts not configured\n *\n * @example\n * ```typescript\n * import { prepareWithdrawOrderTxData } from \"@paxoslabs/amplify-sdk\";\n *\n * const txData = await prepareWithdrawOrderTxData({\n * vaultName: \"Amplify USDC Core\",\n * wantAsset: \"0xA0b86991c6218b36c1d19D4a2e9Eb0cE3606eB48\", // USDC\n * userAddress: \"0x1234...\",\n * chainId: 1,\n * amountOffer: \"1.0\", // 1 vault share\n * });\n *\n * // Execute with viem\n * const hash = await walletClient.writeContract(txData);\n *\n * // Or with wagmi\n * const { writeContract } = useWriteContract();\n * await writeContract(txData);\n * ```\n */\nconst prepareWithdrawOrderTxData = async ({\n vaultName,\n wantAsset,\n userAddress,\n chainId,\n amountOffer,\n}: PrepareWithdrawOrderTxDataParams): Promise<WithdrawOrderTxData> => {\n try {\n const normalizedChainId = toChainId(chainId)\n\n const config = await resolveVault({\n vaultName,\n assetAddress: wantAsset,\n chainId: normalizedChainId,\n callerEndpoint: 'prepareWithdrawOrderTxData',\n })\n\n // Validation: Ensure vault is on the correct chain\n if (config.chainId !== normalizedChainId) {\n throw new APIError(\n `Vault chain mismatch: vault is on chain ${config.chainId}, requested chain ${normalizedChainId}`,\n { endpoint: 'prepareWithdrawOrderTxData' }\n )\n }\n\n // Validation: Ensure withdrawQueueAddress is configured\n if (!config.vault.withdrawQueueAddress) {\n throw new APIError(\n `WithdrawQueue contract address not configured for vault ${config.id}`,\n { endpoint: 'prepareWithdrawOrderTxData' }\n )\n }\n\n // Validation: Ensure boringVaultAddress is configured (needed for share decimals)\n if (!config.vault.boringVaultAddress) {\n throw new APIError(\n `BoringVault contract address not configured for vault ${config.id}`,\n { endpoint: 'prepareWithdrawOrderTxData' }\n )\n }\n\n // Get vault share decimals from the BoringVault contract\n const sharesDecimals = await getErc20Decimals({\n tokenAddress: config.vault.boringVaultAddress,\n chainId: normalizedChainId,\n })\n\n // Parse offer amount using vault share decimals\n const formattedAmountOffer = parseUnits(amountOffer, sharesDecimals)\n\n return {\n abi: WithdrawQueueAbi,\n address: config.vault.withdrawQueueAddress,\n functionName: 'submitOrder',\n args: [\n {\n amountOffer: formattedAmountOffer,\n wantAsset,\n intendedDepositor: userAddress,\n receiver: userAddress,\n refundReceiver: userAddress,\n signatureParams: EMPTY_SIGNATURE_PARAMS,\n },\n ],\n chainId: normalizedChainId,\n }\n } catch (error) {\n if (error instanceof APIError) {\n throw error\n }\n\n throw new APIError(\n `Failed to prepare withdraw order transaction: ${\n error instanceof Error ? error.message : String(error)\n }`,\n {\n endpoint: 'prepareWithdrawOrderTxData',\n cause: error,\n }\n )\n }\n}\n\nexport { prepareWithdrawOrderTxData, EMPTY_SIGNATURE_PARAMS }\nexport type { PrepareWithdrawOrderTxDataParams, WithdrawOrderTxData }\n","/**\n * @file Atomic withdrawal functionality for WithdrawQueue contract\n * @module vaults/withdraw/atomic-withdraw\n *\n * Builds transaction data for WithdrawQueue.submitOrderAndProcessAll.\n * Unlike prepareWithdrawOrderTxData (which calls submitOrder and queues\n * the withdrawal for later processing), this submits the order and\n * processes the entire queue in the same transaction.\n */\n\nimport { type Address, parseUnits } from 'viem'\nimport { WithdrawQueueAbi } from '../../abi/withdraw-queue-abi'\nimport { getErc20Decimals } from '../../api/erc20'\nimport { resolveVault } from '../../client/resolve-vault'\nimport {\n InvalidChainIdError,\n TransactionDataError,\n WithdrawError,\n} from '../../types/withdraw-errors'\nimport { type ChainId, toChainId } from '../../utils/chain-utils'\nimport { EMPTY_SIGNATURE_PARAMS } from './standard-withdraw'\n\ninterface PrepareAtomicWithdrawOrderTxDataParams {\n vaultName: string\n wantAsset: Address\n userAddress: Address\n chainId: ChainId\n amountOffer: string\n}\n\ninterface AtomicWithdrawOrderTxData {\n abi: typeof WithdrawQueueAbi\n address: Address\n functionName: 'submitOrderAndProcessAll'\n args: [\n {\n amountOffer: bigint\n wantAsset: Address\n intendedDepositor: Address\n receiver: Address\n refundReceiver: Address\n signatureParams: typeof EMPTY_SIGNATURE_PARAMS\n },\n ]\n chainId: number\n}\n\nconst prepareAtomicWithdrawOrderTxData = async ({\n vaultName,\n wantAsset,\n userAddress,\n chainId,\n amountOffer,\n}: PrepareAtomicWithdrawOrderTxDataParams): Promise<AtomicWithdrawOrderTxData> => {\n try {\n const normalizedChainId = toChainId(chainId)\n\n const config = await resolveVault({\n vaultName,\n assetAddress: wantAsset,\n chainId: normalizedChainId,\n callerEndpoint: 'prepareAtomicWithdrawOrderTxData',\n })\n\n if (config.chainId !== normalizedChainId) {\n throw new InvalidChainIdError(\n `Vault chain mismatch: vault is on chain ${config.chainId}, requested chain ${normalizedChainId}`,\n {\n vaultId: config.id,\n vaultChainId: config.chainId,\n requestedChainId: normalizedChainId,\n }\n )\n }\n\n if (!config.vault.withdrawQueueAddress) {\n throw new TransactionDataError(\n `WithdrawQueue contract address not configured for vault ${config.id}`,\n { vaultId: config.id, field: 'withdrawQueueAddress' }\n )\n }\n\n if (!config.vault.boringVaultAddress) {\n throw new TransactionDataError(\n `BoringVault contract address not configured for vault ${config.id}`,\n { vaultId: config.id, field: 'boringVaultAddress' }\n )\n }\n\n const sharesDecimals = await getErc20Decimals({\n tokenAddress: config.vault.boringVaultAddress,\n chainId: normalizedChainId,\n })\n\n const formattedAmountOffer = parseUnits(amountOffer, sharesDecimals)\n\n return {\n abi: WithdrawQueueAbi,\n address: config.vault.withdrawQueueAddress,\n functionName: 'submitOrderAndProcessAll',\n args: [\n {\n amountOffer: formattedAmountOffer,\n wantAsset,\n intendedDepositor: userAddress,\n receiver: userAddress,\n refundReceiver: userAddress,\n signatureParams: EMPTY_SIGNATURE_PARAMS,\n },\n ],\n chainId: normalizedChainId,\n }\n } catch (error) {\n if (error instanceof WithdrawError) {\n throw error\n }\n\n throw new TransactionDataError(\n `Failed to prepare atomic withdraw order transaction: ${\n error instanceof Error ? error.message : String(error)\n }`,\n {\n endpoint: 'prepareAtomicWithdrawOrderTxData',\n cause: error,\n }\n )\n }\n}\n\nexport { prepareAtomicWithdrawOrderTxData }\nexport type {\n AtomicWithdrawOrderTxData,\n PrepareAtomicWithdrawOrderTxDataParams,\n}\n","/**\n * @file Unified withdrawal module with wrapper functions\n * @module vaults/withdraw\n *\n * Provides high-level wrapper functions for withdrawal authorization:\n * - `prepareWithdrawal`: Unified withdrawal preparation wrapper\n * - `prepareWithdrawalAuthorization`: Determines if approval is needed\n */\n\nimport { type Address, parseUnits } from 'viem'\nimport { resolveVault } from '../../client/resolve-vault'\nimport { APIError } from '../../types/amplify-sdk-api'\nimport { isWithdrawalSpendApproved } from '../../utils/approvals'\nimport { type ChainId, toChainId } from '../../utils/chain-utils'\nimport { isSmartContractWallet } from '../../utils/wallet'\nimport {\n type ApproveWithdrawOrderTxData,\n prepareApproveWithdrawOrderTxData,\n} from './approve-withdraw'\nimport {\n type AtomicWithdrawOrderTxData,\n prepareAtomicWithdrawOrderTxData,\n} from './atomic-withdraw'\nimport {\n type WithdrawOrderTxData,\n prepareWithdrawOrderTxData,\n} from './standard-withdraw'\n\n// ============================================================================\n// ENUMS\n// ============================================================================\n\n/**\n * Authorization methods for withdrawal operations\n *\n * Withdrawals do not support EIP-2612 permit — only two paths:\n * - APPROVAL: ERC20 approval of vault shares to WithdrawQueue\n * - ALREADY_APPROVED: Existing allowance is sufficient\n *\n * @example\n * ```typescript\n * import { WithdrawAuthMethod } from \"@paxoslabs/amplify-sdk\";\n *\n * if (result.method === WithdrawAuthMethod.ALREADY_APPROVED) {\n * // Proceed directly to withdrawal\n * }\n * ```\n */\nexport const WithdrawAuthMethod = {\n APPROVAL: 'approval',\n ALREADY_APPROVED: 'already_approved',\n} as const\n\nexport type WithdrawAuthMethod =\n (typeof WithdrawAuthMethod)[keyof typeof WithdrawAuthMethod]\n\n// ============================================================================\n// TYPE DEFINITIONS - Authorization\n// ============================================================================\n\n/**\n * Approval authorization result\n * Returned when an ERC20 approval transaction is needed\n */\nexport interface WithdrawApprovalAuthorizationResult {\n method: typeof WithdrawAuthMethod.APPROVAL\n /** Transaction data for ERC20 approve() call on vault shares */\n txData: ApproveWithdrawOrderTxData\n}\n\n/**\n * Already approved authorization result\n * Returned when existing allowance is sufficient for the withdrawal\n */\nexport interface WithdrawAlreadyApprovedAuthorizationResult {\n method: typeof WithdrawAuthMethod.ALREADY_APPROVED\n /** Current allowance (human-readable) */\n allowance: string\n /** Current allowance as BigInt string */\n allowanceAsBigInt: string\n}\n\n/**\n * Discriminated union of all withdrawal authorization result types\n *\n * Use type guards or type narrowing with `result.method`:\n *\n * @example Using type guards (recommended)\n * ```typescript\n * import {\n * prepareWithdrawalAuthorization,\n * isWithdrawApprovalAuth,\n * isWithdrawAlreadyApprovedAuth,\n * } from \"@paxoslabs/amplify-sdk\";\n *\n * const result = await prepareWithdrawalAuthorization({...});\n *\n * if (isWithdrawApprovalAuth(result)) {\n * await writeContract(result.txData);\n * } else if (isWithdrawAlreadyApprovedAuth(result)) {\n * console.log(`Already approved: ${result.allowance}`);\n * }\n * ```\n */\nexport type WithdrawAuthorizationResult =\n | WithdrawApprovalAuthorizationResult\n | WithdrawAlreadyApprovedAuthorizationResult\n\n// ============================================================================\n// TYPE GUARDS\n// ============================================================================\n\n/**\n * Type guard for approval authorization result\n *\n * @param result - Authorization result to check\n * @returns true if result requires an ERC20 approval transaction\n */\nexport function isWithdrawApprovalAuth(\n result: WithdrawAuthorizationResult\n): result is WithdrawApprovalAuthorizationResult {\n return result.method === WithdrawAuthMethod.APPROVAL\n}\n\n/**\n * Type guard for already-approved authorization result\n *\n * @param result - Authorization result to check\n * @returns true if existing allowance is sufficient\n */\nexport function isWithdrawAlreadyApprovedAuth(\n result: WithdrawAuthorizationResult\n): result is WithdrawAlreadyApprovedAuthorizationResult {\n return result.method === WithdrawAuthMethod.ALREADY_APPROVED\n}\n\n// ============================================================================\n// PARAMETERS\n// ============================================================================\n\n/**\n * Parameters for prepareWithdrawalAuthorization\n */\nexport interface PrepareWithdrawalAuthorizationParams {\n /** Human-readable vault name (e.g. \"Amplify USDC Core\") */\n vaultName: string\n /** Token address the user wants to receive upon withdrawal. Must match the vault's supported asset. */\n wantAsset: Address\n /** Amount of vault shares to withdraw as decimal string */\n withdrawAmount: string\n /** User's wallet address (owner of vault shares) */\n userAddress: Address\n /** Chain ID where the vault is deployed. Must match the vault's chain. */\n chainId: ChainId\n /**\n * Force specific authorization routing behavior:\n * - \"approval\": Always return approval tx data\n * - \"allowance_check\": Always check allowance (skip smart-wallet heuristic)\n */\n forceMethod?: 'approval' | 'allowance_check'\n}\n\n/**\n * Parameters for prepareWithdrawal\n * Unified withdrawal wrapper that maps to standard withdraw tx preparation.\n */\nexport interface PrepareWithdrawalParams {\n /** Human-readable vault name (e.g. \"Amplify USDC Core\") */\n vaultName: string\n /** Token address the user wants to receive upon withdrawal. Must match the vault's supported asset. */\n wantAsset: Address\n /** Amount of vault shares to withdraw as decimal string */\n withdrawAmount: string\n /** User's wallet address (owner of vault shares) */\n userAddress: Address\n /** Chain ID where the vault is deployed. Must match the vault's chain. */\n chainId: ChainId\n}\n\n/**\n * Unified withdrawal result.\n * Routes to atomic (submitOrderAndProcessAll) or standard (submitOrder)\n * based on vault.atomicWithdrawal configuration.\n */\nexport type PrepareWithdrawalResult =\n | WithdrawOrderTxData\n | AtomicWithdrawOrderTxData\n\n// ============================================================================\n// FUNCTIONS\n// ============================================================================\n\n/**\n * Unified withdrawal preparation wrapper\n *\n * Provides a stable high-level API for withdrawal execution while reusing\n * the low-level WithdrawQueue transaction builder under the hood.\n *\n * @param params - Withdrawal parameters\n * @returns Transaction data for submitOrder on WithdrawQueue\n * @throws {APIError} If preparation fails\n */\nexport async function prepareWithdrawal(\n params: PrepareWithdrawalParams\n): Promise<PrepareWithdrawalResult> {\n const { vaultName, wantAsset, withdrawAmount, userAddress, chainId } = params\n\n try {\n const normalizedChainId = toChainId(chainId)\n\n // Resolve vault to read atomicWithdrawal — settlement differs by vault.\n // Atomic vaults settle immediately; async vaults queue for later processing.\n const vault = await resolveVault({\n vaultName,\n assetAddress: wantAsset,\n chainId: normalizedChainId,\n callerEndpoint: 'prepareWithdrawal',\n })\n\n const builderParams = {\n vaultName,\n wantAsset,\n userAddress,\n chainId,\n amountOffer: withdrawAmount,\n }\n\n return vault.atomicWithdrawal\n ? await prepareAtomicWithdrawOrderTxData(builderParams)\n : await prepareWithdrawOrderTxData(builderParams)\n } catch (error) {\n if (error instanceof APIError) {\n throw error\n }\n\n throw new APIError(\n `Failed to prepare withdrawal: ${\n error instanceof Error ? error.message : String(error)\n }`,\n {\n endpoint: 'prepareWithdrawal',\n cause: error,\n }\n )\n }\n}\n\n/**\n * Prepares authorization for a withdrawal operation\n *\n * Determines if the user needs to approve vault shares for the\n * WithdrawQueue contract:\n * 1. Optional force override (`forceMethod`)\n * 2. Auto smart-wallet heuristic (returns approval for smart wallets)\n * 3. Check existing allowance → if sufficient, return \"already approved\"\n * 4. Otherwise → return approval transaction data\n *\n * @param params - Authorization parameters\n * @returns Discriminated union of authorization results\n * @throws {APIError} If vault not found or approval check fails\n *\n * @example\n * ```typescript\n * import {\n * prepareWithdrawalAuthorization,\n * WithdrawAuthMethod,\n * } from \"@paxoslabs/amplify-sdk\";\n *\n * const authResult = await prepareWithdrawalAuthorization({\n * vaultName: \"Amplify USDC Core\",\n * wantAsset: \"0xA0b86991c6218b36c1d19D4a2e9Eb0cE3606eB48\",\n * withdrawAmount: \"1.0\",\n * userAddress: \"0x1234...\",\n * chainId: 1,\n * });\n *\n * if (authResult.method === WithdrawAuthMethod.APPROVAL) {\n * await writeContract(authResult.txData);\n * // Wait for confirmation, then submit withdraw order\n * } else {\n * // Already approved, proceed to withdrawal\n * }\n * ```\n */\nexport async function prepareWithdrawalAuthorization(\n params: PrepareWithdrawalAuthorizationParams\n): Promise<WithdrawAuthorizationResult> {\n const {\n vaultName,\n wantAsset,\n withdrawAmount,\n userAddress,\n chainId,\n forceMethod,\n } = params\n\n try {\n const normalizedChainId = toChainId(chainId)\n\n const vault = await resolveVault({\n vaultName,\n assetAddress: wantAsset,\n chainId: normalizedChainId,\n callerEndpoint: 'prepareWithdrawalAuthorization',\n })\n\n // Force override: always return approval tx data.\n if (forceMethod === 'approval') {\n const txData = await prepareApproveWithdrawOrderTxData({\n vaultName,\n wantAssetAddress: wantAsset,\n withdrawAmount,\n chainId: normalizedChainId,\n })\n\n return {\n method: WithdrawAuthMethod.APPROVAL,\n txData,\n }\n }\n\n // Smart contract wallets (e.g. Safe, EIP-4337, EIP-7702) can batch\n // approve + withdraw atomically. In auto mode, skip allowance checks\n // and return approval tx data directly.\n if (forceMethod !== 'allowance_check') {\n const smartWallet = await isSmartContractWallet(\n userAddress,\n normalizedChainId\n )\n\n if (smartWallet) {\n const txData = await prepareApproveWithdrawOrderTxData({\n vaultName,\n wantAssetAddress: wantAsset,\n withdrawAmount,\n chainId: normalizedChainId,\n })\n\n return {\n method: WithdrawAuthMethod.APPROVAL,\n txData,\n }\n }\n }\n\n // Check current withdrawal approval status\n const approvalInfo = await isWithdrawalSpendApproved({\n vaultName: vault.name,\n chainId: normalizedChainId,\n wantAssetAddress: wantAsset,\n recipientAddress: userAddress,\n })\n\n // Handle multicall failure\n if (approvalInfo.error) {\n throw new APIError(\n `Failed to check withdrawal approval: ${approvalInfo.error}`,\n { endpoint: 'prepareWithdrawalAuthorization' }\n )\n }\n\n // Parse withdraw amount to compare against allowance\n const decimals =\n typeof approvalInfo.decimals === 'string'\n ? Number(approvalInfo.decimals)\n : approvalInfo.decimals\n const withdrawAmountBigInt = parseUnits(withdrawAmount, decimals)\n const currentAllowanceBigInt = BigInt(approvalInfo.allowanceAsBigInt)\n\n // Check if existing allowance is sufficient\n if (\n approvalInfo.isApproved &&\n currentAllowanceBigInt >= withdrawAmountBigInt\n ) {\n return {\n method: WithdrawAuthMethod.ALREADY_APPROVED,\n allowance: approvalInfo.allowance,\n allowanceAsBigInt: approvalInfo.allowanceAsBigInt,\n }\n }\n\n // Insufficient allowance: prepare approval transaction\n // Pass share decimals to avoid redundant RPC call\n const txData = await prepareApproveWithdrawOrderTxData({\n vaultName,\n wantAssetAddress: wantAsset,\n withdrawAmount,\n chainId: normalizedChainId,\n shareDecimals: decimals,\n })\n\n return {\n method: WithdrawAuthMethod.APPROVAL,\n txData,\n }\n } catch (error) {\n if (error instanceof APIError) {\n throw error\n }\n\n throw new APIError(\n `Failed to prepare withdrawal authorization: ${\n error instanceof Error ? error.message : String(error)\n }`,\n {\n endpoint: 'prepareWithdrawalAuthorization',\n cause: error,\n }\n )\n }\n}\n\n// ============================================================================\n// RE-EXPORTS\n// ============================================================================\n\nexport type {\n ApproveWithdrawOrderTxData,\n PrepareApproveWithdrawOrderTxDataParams,\n} from './approve-withdraw'\nexport { prepareApproveWithdrawOrderTxData } from './approve-withdraw'\nexport type {\n CancelWithdrawOrderTxData,\n PrepareCancelWithdrawOrderTxDataParams,\n} from './cancel-withdraw'\nexport { prepareCancelWithdrawOrderTxData } from './cancel-withdraw'\nexport type {\n PrepareWithdrawOrderTxDataParams,\n WithdrawOrderTxData,\n} from './standard-withdraw'\nexport { prepareWithdrawOrderTxData } from './standard-withdraw'\n"]}