{"version":3,"file":"evmTransferAmount-CeNqafVB.cjs","names":["BaseError","InvalidParamError","createPublicClientFromNetworkData","createWalletClientForWalletAccount","erc20Abi","createPublicClientFromNetworkData","erc20Abi","createPublicClientFromNetworkData","InvalidParamError","createWalletClientForWalletAccount","gasParams: Record<string, bigint>","InvalidParamError","createPublicClientFromNetworkData","createWalletClientForWalletAccount","erc20Abi"],"sources":["../src/errors/RpcError.ts","../src/utils/fetchEvmBalance/fetchEvmBalance.ts","../src/utils/createEvmNetworkProvider/createEvmNetworkProvider.ts","../src/registerEvmNetworkProviderBuilder/registerEvmNetworkProviderBuilder.ts","../src/utils/isEvmWalletAccount/isEvmWalletAccount.ts","../src/utils/evmConfirmTransaction/evmConfirmTransaction.ts","../src/utils/approveErc20/approveErc20.ts","../src/utils/getErc20Allowance/getErc20Allowance.ts","../src/utils/approveErc20IfRequiredAndWaitReceipt/approveErc20IfRequiredAndWaitReceipt.ts","../src/utils/evmExecuteSwapTransaction/evmExecuteSwapTransaction.ts","../src/utils/evmTransferAmount/evmTransferAmount.ts"],"sourcesContent":["import { BaseError, type BaseErrorParameters } from '@dynamic-labs-sdk/client';\n\nexport type RpcErrorParameters = Pick<BaseErrorParameters, 'shortMessage'> &\n  Partial<Omit<BaseErrorParameters, 'shortMessage'>>;\n\nexport class RpcError extends BaseError {\n  constructor(args: RpcErrorParameters) {\n    super({\n      cause: args.cause ?? null,\n      code: args.code ?? 'rpc_error',\n      details: args.details,\n      docsUrl: args.docsUrl ?? null,\n      metaMessages: args.metaMessages,\n      name: args.name ?? 'RpcError',\n      shortMessage: args.shortMessage,\n    });\n  }\n}\n","import type { DynamicClient, NetworkData } from '@dynamic-labs-sdk/client';\nimport { getCore } from '@dynamic-labs-sdk/client/core';\n\nimport { RpcError } from '../../errors/RpcError';\n\ntype FetchEvmBalanceParams = {\n  address: string;\n  networkData: NetworkData;\n};\n\n/** @not-instrumented */\nexport const fetchEvmBalance = async (\n  { address, networkData }: FetchEvmBalanceParams,\n  client: DynamicClient\n): Promise<string | null> => {\n  const rpcUrl = networkData.rpcUrls.http[0];\n  const core = getCore(client);\n\n  try {\n    // Perform a POST request to the RPC URL with the JSON-RPC payload\n    const response = await core.fetch(rpcUrl, {\n      /**\n       * The JSON-RPC method 'eth_getBalance' takes the address and a block tag ('latest' is the most recent)\n       * See EIP-1474: https://eips.ethereum.org/EIPS/eip-1474\n       * See eth_getBalance spec: https://ethereum.org/en/developers/docs/apis/json-rpc/#eth_getbalance\n       */\n      body: JSON.stringify({\n        id: Math.floor(Date.now() + Math.random() * 1000),\n        jsonrpc: '2.0',\n        method: 'eth_getBalance',\n        params: [address, 'latest'],\n      }),\n\n      headers: {\n        'Content-Type': 'application/json',\n      },\n\n      method: 'POST',\n    });\n\n    // Check if the network response was successful\n    if (!response.ok) {\n      throw new RpcError({\n        code: 'http_error',\n        shortMessage: `HTTP error! status: ${response.status}`,\n      });\n    }\n\n    const data = await response.json();\n\n    // Check for a JSON-RPC error in the response\n    if (data.error) {\n      throw new RpcError({\n        cause: data.error instanceof Error ? data.error : undefined,\n        code: 'json_rpc_error',\n        shortMessage: `RPC Error: ${data.error.message}`,\n      });\n    }\n\n    // The result is a hexadecimal string representing the balance in Wei\n    const balanceWeiHex = data.result;\n\n    // Convert the hexadecimal string to a BigInt\n    const balanceWei = BigInt(balanceWeiHex);\n\n    // Convert the balance from Wei to Ether (1 Ether = 10^18 Wei)\n    // We use a BigInt for the conversion to maintain precision with large numbers\n    const oneEther = BigInt(1e18);\n\n    // Perform the division and return the result as a number\n    // Note: This conversion can lose precision for very small amounts, but is generally fine for display purposes.\n    const balanceEther = Number(balanceWei) / Number(oneEther);\n\n    return balanceEther.toString();\n  } catch (error) {\n    if (error instanceof Error) {\n      throw new RpcError({\n        cause: error,\n        code: 'rpc_error',\n        shortMessage: `Failed to fetch balance for address ${address}`,\n      });\n    }\n\n    throw error;\n  }\n};\n","import type { DynamicClient, NetworkData } from '@dynamic-labs-sdk/client';\nimport { createBaseNetworkProvider } from '@dynamic-labs-sdk/client/core';\n\nimport type { EvmNetworkProvider } from '../../EvmNetworkProvider';\nimport { fetchEvmBalance } from '../fetchEvmBalance';\n\n/** @not-instrumented */\nexport const createEvmNetworkProvider = (\n  networkData: NetworkData,\n  client: DynamicClient\n): EvmNetworkProvider => ({\n  ...createBaseNetworkProvider('EVM', networkData),\n\n  getBalance: async ({ address }) => ({\n    balance: await fetchEvmBalance(\n      {\n        address,\n        networkData,\n      },\n      client\n    ),\n  }),\n});\n","import { type DynamicClient } from '@dynamic-labs-sdk/client';\nimport { getNetworkProviderBuilderRegistry } from '@dynamic-labs-sdk/client/core';\n\nimport { createEvmNetworkProvider } from '../utils/createEvmNetworkProvider';\n\n/** @not-instrumented */\nexport const registerEvmNetworkProviderBuilder = (\n  client: DynamicClient\n): void => {\n  const networkProviderBuilderRegistry =\n    getNetworkProviderBuilderRegistry(client);\n\n  /**\n   * If the Ethereum network provider builder is already registered, return.\n   */\n  if (networkProviderBuilderRegistry.get().get('EVM')) {\n    return;\n  }\n\n  networkProviderBuilderRegistry.register({\n    builder: (networkData) => createEvmNetworkProvider(networkData, client),\n    chain: 'EVM',\n  });\n};\n","import type { WalletAccount } from '@dynamic-labs-sdk/client';\n\nimport type { EvmWalletAccount } from '../../EvmWalletAccount.types';\n\n/**\n * Type guard function to check if a wallet account is an EVM wallet account.\n *\n * @param walletAccount - The wallet account to check.\n * @returns True if the wallet account is an EVM wallet account, false otherwise.\n  * @not-instrumented\n */\nexport const isEvmWalletAccount = (\n  walletAccount: WalletAccount\n): walletAccount is EvmWalletAccount => walletAccount.chain === 'EVM';\n","import {\n  type DynamicClient,\n  InvalidParamError,\n  getActiveNetworkData,\n} from '@dynamic-labs-sdk/client';\nimport type { ConfirmTransactionParams } from '@dynamic-labs-sdk/client/core';\nimport { assertDefined } from '@dynamic-labs-sdk/client/core';\n\nimport { createPublicClientFromNetworkData } from '../../viem/createPublicClientFromNetworkData';\nimport { isEvmWalletAccount } from '../isEvmWalletAccount';\n\n/**\n * Waits for an EVM transaction to be confirmed on-chain.\n *\n * @param params.transactionHash - The transaction hash to wait for.\n * @param params.walletAccount - The EVM wallet account used to resolve the active network.\n * @param client - The Dynamic client instance.\n * @not-instrumented\n */\nexport const evmConfirmTransaction = async (\n  { transactionHash, walletAccount }: ConfirmTransactionParams,\n  client: DynamicClient\n): Promise<void> => {\n  if (!isEvmWalletAccount(walletAccount)) {\n    throw new InvalidParamError('Wallet account is not an EVM wallet account');\n  }\n\n  const { networkData } = await getActiveNetworkData({ walletAccount }, client);\n\n  assertDefined(\n    networkData,\n    `No network data found for wallet account ${walletAccount.address}`\n  );\n\n  const publicClient = createPublicClientFromNetworkData({ networkData });\n\n  await publicClient.waitForTransactionReceipt({\n    hash: transactionHash as `0x${string}`,\n  });\n};\n","import type { DynamicClient } from '@dynamic-labs-sdk/client';\nimport { encodeFunctionData, erc20Abi } from 'viem';\n\nimport type { EvmWalletAccount } from '../../EvmWalletAccount.types';\nimport { createWalletClientForWalletAccount } from '../../viem/createWalletClientForWalletAccount';\n\ntype ApproveErc20Params = {\n  amount: bigint;\n  spenderAddress: string;\n  tokenAddress: string;\n  walletAccount: EvmWalletAccount;\n};\n\n/**\n * Sends an ERC-20 `approve` transaction, granting a spender an allowance\n * to transfer tokens on behalf of the wallet account.\n *\n * Encodes the `approve(spender, amount)` call using viem's `encodeFunctionData`\n * and sends it through the wallet account's viem wallet client.\n *\n * @param params.amount - The amount to approve in the token's smallest unit.\n * @param params.spenderAddress - The address being granted the allowance.\n * @param params.tokenAddress - The ERC-20 token contract address.\n * @param params.walletAccount - The EVM wallet account sending the approval.\n * @param client - The Dynamic client instance.\n * @returns The approval transaction hash.\n  * @not-instrumented\n */\nexport const approveErc20 = async (\n  { amount, spenderAddress, tokenAddress, walletAccount }: ApproveErc20Params,\n  client: DynamicClient\n): Promise<{ transactionHash: string }> => {\n  const walletClient = await createWalletClientForWalletAccount(\n    { walletAccount },\n    client\n  );\n\n  const data = encodeFunctionData({\n    abi: erc20Abi,\n    args: [spenderAddress as `0x${string}`, amount],\n    functionName: 'approve',\n  });\n\n  const hash = await walletClient.sendTransaction({\n    data,\n    to: tokenAddress as `0x${string}`,\n  });\n\n  return { transactionHash: hash };\n};\n","import {\n  type DynamicClient,\n  type NetworkData,\n  getActiveNetworkData,\n} from '@dynamic-labs-sdk/client';\nimport { assertDefined } from '@dynamic-labs-sdk/client/core';\nimport { erc20Abi } from 'viem';\n\nimport type { EvmWalletAccount } from '../../EvmWalletAccount.types';\nimport { createPublicClientFromNetworkData } from '../../viem/createPublicClientFromNetworkData';\n\ntype GetErc20AllowanceParams = {\n  networkData?: NetworkData;\n  ownerAddress: string;\n  spenderAddress: string;\n  tokenAddress: string;\n  walletAccount: EvmWalletAccount;\n};\n\n/**\n * Reads the current ERC-20 token allowance granted by an owner to a spender.\n *\n * Uses a viem public client derived from the wallet account's active network\n * to call the `allowance(owner, spender)` method on the token contract.\n *\n * @param params.tokenAddress - The ERC-20 token contract address.\n * @param params.ownerAddress - The address that granted the allowance.\n * @param params.spenderAddress - The address allowed to spend the tokens.\n * @param params.walletAccount - The EVM wallet account used to resolve the active network.\n * @param [params.networkData] - The network data to use for the public client. If not provided, the active network data will be used.\n * @param client - The Dynamic client instance.\n * @returns The current allowance as a bigint in the token's smallest unit.\n  * @not-instrumented\n */\nexport const getErc20Allowance = async (\n  {\n    networkData,\n    ownerAddress,\n    spenderAddress,\n    tokenAddress,\n    walletAccount,\n  }: GetErc20AllowanceParams,\n  client: DynamicClient\n): Promise<bigint> => {\n  if (!networkData) {\n    const activeNetworkData = await getActiveNetworkData(\n      { walletAccount },\n      client\n    );\n    networkData = activeNetworkData.networkData;\n  }\n\n  assertDefined(\n    networkData,\n    `No network data found for wallet account ${walletAccount.address}`\n  );\n\n  const publicClient = createPublicClientFromNetworkData({ networkData });\n\n  return publicClient.readContract({\n    abi: erc20Abi,\n    address: tokenAddress as `0x${string}`,\n    args: [ownerAddress as `0x${string}`, spenderAddress as `0x${string}`],\n    functionName: 'allowance',\n  });\n};\n","import {\n  type DynamicClient,\n  getActiveNetworkData,\n} from '@dynamic-labs-sdk/client';\nimport { assertDefined } from '@dynamic-labs-sdk/client/core';\nimport type { TransactionReceipt } from 'viem';\n\nimport type { EvmWalletAccount } from '../../EvmWalletAccount.types';\nimport { createPublicClientFromNetworkData } from '../../viem/createPublicClientFromNetworkData';\nimport { approveErc20 } from '../approveErc20';\nimport { getErc20Allowance } from '../getErc20Allowance';\n\ntype ApproveErc20IfRequiredAndWaitReceiptParams = {\n  amount: string;\n  spenderAddress: string;\n  tokenAddress: string;\n  walletAccount: EvmWalletAccount;\n};\n\n/**\n * Approves an ERC-20 token if the current allowance is insufficient and waits for the transaction receipt.\n *\n * @param params.amount - The amount of tokens to approve.\n * @param params.ownerAddress - The address that granted the allowance.\n * @param params.spenderAddress - The address allowed to spend the tokens.\n * @param params.tokenAddress - The ERC-20 token contract address.\n * @param params.walletAccount - The EVM wallet account used to resolve the active network.\n * @param client - The Dynamic client instance.\n * @returns The transaction receipt if an approval was sent, otherwise undefined.\n  * @not-instrumented\n */\nexport const approveErc20IfRequiredAndWaitReceipt = async (\n  {\n    amount,\n    spenderAddress,\n    tokenAddress,\n    walletAccount,\n  }: ApproveErc20IfRequiredAndWaitReceiptParams,\n  client: DynamicClient\n): Promise<{ receipt: TransactionReceipt } | undefined> => {\n  const { networkData } = await getActiveNetworkData({ walletAccount }, client);\n\n  assertDefined(\n    networkData,\n    `No network data found for wallet account ${walletAccount.address}`\n  );\n\n  const currentAllowance = await getErc20Allowance(\n    {\n      networkData,\n      ownerAddress: walletAccount.address,\n      spenderAddress,\n      tokenAddress,\n      walletAccount,\n    },\n    client\n  );\n\n  const approvalAmount = BigInt(amount);\n\n  if (currentAllowance >= approvalAmount) {\n    return undefined;\n  }\n\n  const result = await approveErc20(\n    {\n      amount: approvalAmount,\n      spenderAddress,\n      tokenAddress,\n      walletAccount,\n    },\n    client\n  );\n  const approvalTransactionHash = result.transactionHash;\n\n  const publicClient = createPublicClientFromNetworkData({ networkData });\n\n  const receipt = await publicClient.waitForTransactionReceipt({\n    hash: approvalTransactionHash as `0x${string}`,\n  });\n\n  return { receipt };\n};\n","import {\n  type DynamicClient,\n  InvalidParamError,\n} from '@dynamic-labs-sdk/client';\nimport type {\n  ExecuteSwapTransactionParams,\n  ExecuteSwapTransactionResult,\n} from '@dynamic-labs-sdk/client/core';\n\nimport { createWalletClientForWalletAccount } from '../../viem/createWalletClientForWalletAccount';\nimport { approveErc20IfRequiredAndWaitReceipt } from '../approveErc20IfRequiredAndWaitReceipt';\nimport { isEvmWalletAccount } from '../isEvmWalletAccount';\n\n/**\n * Executes an EVM checkout transaction by handling optional ERC-20 approval\n * and sending the main swap transaction on-chain.\n *\n * 1. Validates that the wallet account is an EVM wallet account\n * 2. If the signing payload includes an `evmApproval`, checks the current\n *    ERC-20 allowance and sends an approve transaction when insufficient\n * 3. Sends the main transaction using the viem wallet client\n *\n * @param params.signingPayload - The chain-aware signing payload containing `evmTransaction` and optional `evmApproval`.\n * @param params.walletAccount - The wallet account used to sign and send transactions.\n * @param params.onStepChange - Optional callback invoked with `'approval'` or `'transaction'` as each step begins.\n * @param client - The Dynamic client instance.\n * @returns The main transaction hash and, if an approval was sent, the approval transaction hash.\n * @not-instrumented\n */\nexport const evmExecuteSwapTransaction = async (\n  { onStepChange, signingPayload, walletAccount }: ExecuteSwapTransactionParams,\n  client: DynamicClient\n): Promise<ExecuteSwapTransactionResult> => {\n  if (!isEvmWalletAccount(walletAccount)) {\n    throw new InvalidParamError('Wallet account is not an EVM wallet account');\n  }\n\n  const { evmTransaction, evmApproval } = signingPayload;\n\n  if (!evmTransaction) {\n    throw new InvalidParamError(\n      'Signing payload is missing EVM transaction data'\n    );\n  }\n\n  if (evmApproval) {\n    onStepChange?.('approval');\n\n    await approveErc20IfRequiredAndWaitReceipt(\n      {\n        amount: evmApproval.amount,\n        spenderAddress: evmApproval.spenderAddress,\n        tokenAddress: evmApproval.tokenAddress,\n        walletAccount,\n      },\n      client\n    );\n  }\n\n  onStepChange?.('transaction');\n\n  const walletClient = await createWalletClientForWalletAccount(\n    { walletAccount },\n    client\n  );\n\n  // sendTransaction expects gasPrice or maxFeePerGas and maxPriorityFeePerGas\n  let gasParams: Record<string, bigint> = {};\n  if (evmTransaction.maxFeePerGas && evmTransaction.maxPriorityFeePerGas) {\n    gasParams = {\n      maxFeePerGas: BigInt(evmTransaction.maxFeePerGas),\n      maxPriorityFeePerGas: BigInt(evmTransaction.maxPriorityFeePerGas),\n    };\n  } else {\n    gasParams = {\n      ...(evmTransaction.gasPrice && {\n        gasPrice: BigInt(evmTransaction.gasPrice),\n      }),\n    };\n  }\n\n  const transactionHash = await walletClient.sendTransaction({\n    data: evmTransaction.data as `0x${string}`,\n    to: evmTransaction.to as `0x${string}`,\n    value: evmTransaction.value ? BigInt(evmTransaction.value) : 0n,\n    ...(evmTransaction.gasLimit && { gas: BigInt(evmTransaction.gasLimit) }),\n    ...gasParams,\n    ...(evmTransaction.nonce && { nonce: evmTransaction.nonce }),\n  });\n\n  return { transactionHash };\n};\n","import {\n  type DynamicClient,\n  InvalidParamError,\n  getActiveNetworkData,\n} from '@dynamic-labs-sdk/client';\nimport { assertDefined } from '@dynamic-labs-sdk/client/core';\nimport type { TransferAmountParams } from '@dynamic-labs-sdk/client/core';\nimport { encodeFunctionData, erc20Abi, parseEther, parseUnits } from 'viem';\n\nimport { createPublicClientFromNetworkData } from '../../viem/createPublicClientFromNetworkData';\nimport { createWalletClientForWalletAccount } from '../../viem/createWalletClientForWalletAccount';\nimport { isEvmWalletAccount } from '../isEvmWalletAccount';\n\nconst DEFAULT_DECIMALS = 18;\n\n/** @not-instrumented */\nexport const evmTransferAmount = async (\n  { amount, recipient, token, walletAccount }: TransferAmountParams,\n  client: DynamicClient\n): Promise<{ transactionHash: string }> => {\n  if (!isEvmWalletAccount(walletAccount)) {\n    throw new InvalidParamError('Wallet account is not an EVM wallet account');\n  }\n\n  const { networkData } = await getActiveNetworkData({ walletAccount }, client);\n\n  assertDefined(\n    networkData,\n    `No network data found for wallet account ${walletAccount.address}`\n  );\n\n  const publicClient = createPublicClientFromNetworkData({ networkData });\n  const nonce = await publicClient.getTransactionCount({\n    address: walletAccount.address as `0x${string}`,\n  });\n\n  const walletClient = await createWalletClientForWalletAccount(\n    { walletAccount },\n    client\n  );\n\n  // non-native token transfers\n  if (token) {\n    const decimals = token.decimals ?? DEFAULT_DECIMALS;\n\n    const data = encodeFunctionData({\n      abi: erc20Abi,\n      args: [recipient as `0x${string}`, parseUnits(amount, decimals)],\n      functionName: 'transfer',\n    });\n\n    const hash = await walletClient.sendTransaction({\n      data,\n      nonce,\n      to: token.address as `0x${string}`,\n    });\n\n    return { transactionHash: hash };\n  }\n\n  // native token transfers\n  const hash = await walletClient.sendTransaction({\n    nonce,\n    to: recipient as `0x${string}`,\n    value: parseEther(amount),\n  });\n\n  return { transactionHash: hash };\n};\n"],"mappings":"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"}