{"version":3,"sources":["../../src/display/approvals.ts"],"sourcesContent":["import { type Address, formatUnits } from \"viem\";\nimport { getErc20AllowanceWithDecimals } from \"../api/erc20\";\nimport { type ChainId, toChainId } from \"../api/vault-config\";\nimport { ATOMIC_QUEUE_CONTRACT_ADDRESS } from \"../constants\";\nimport { tryCatch } from \"../utils/try-catch\";\nimport { getVaultByKey } from \"../vaults\";\nimport type { VaultKey } from \"../vaults/config\";\n\nconst isDepositSpendApproved = async ({\n  vaultKey,\n  sourceChainId,\n  depositTokenSymbol,\n  userAddress,\n}: {\n  vaultKey: VaultKey;\n  sourceChainId: ChainId;\n  userAddress: Address;\n  depositTokenSymbol: string;\n}) => {\n  const {\n    data: vault,\n    error: vaultError,\n    success: vaultSuccess,\n  } = await tryCatch(getVaultByKey(vaultKey));\n  if (!vaultSuccess) {\n    throw new Error(`Vault not found for ${vaultKey}: ${vaultError.message}`);\n  }\n\n  if (!vault.contracts) {\n    throw new Error(`Contracts not found: ${vaultKey}`);\n  }\n\n  const normalizedSourceChainId = toChainId(sourceChainId);\n  const depositAssetAddress =\n    vault.deposit.sourceChains[normalizedSourceChainId].depositTokens[\n      depositTokenSymbol\n    ].address;\n\n  if (!depositAssetAddress) {\n    throw new Error(`Deposit asset address not found: ${depositTokenSymbol}`);\n  }\n\n  const { deposit } = vault;\n\n  const { sourceChains } = deposit;\n\n  const sourceChain = sourceChains[normalizedSourceChainId];\n  if (!sourceChain) {\n    throw new Error(`Source chain not found: ${normalizedSourceChainId}`);\n  }\n\n  const [allowance, decimals] = await getErc20AllowanceWithDecimals({\n    chainId: normalizedSourceChainId,\n    tokenAddress: depositAssetAddress,\n    userAddress: userAddress,\n    spenderAddress: vault.contracts.boringVault,\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};\n\nconst isWithdrawalSpendApproved = async ({\n  vaultKey,\n  destinationChainId,\n  userAddress,\n}: {\n  vaultKey: VaultKey;\n  destinationChainId: ChainId;\n  userAddress: Address;\n}) => {\n  const {\n    data: vault,\n    error: vaultError,\n    success: vaultSuccess,\n  } = await tryCatch(getVaultByKey(vaultKey));\n  if (!vaultSuccess) {\n    throw new Error(`Vault not found for ${vaultKey}: ${vaultError.message}`);\n  }\n\n  if (!vault.contracts) {\n    throw new Error(`Contracts not found for ${vaultKey}`);\n  }\n\n  const normalizedDestinationChainId = toChainId(destinationChainId);\n\n  const boringVaultAddress = vault.contracts.boringVault;\n\n  const [allowance, decimals] = await getErc20AllowanceWithDecimals({\n    chainId: normalizedDestinationChainId,\n    tokenAddress: boringVaultAddress,\n    userAddress: userAddress,\n    spenderAddress: ATOMIC_QUEUE_CONTRACT_ADDRESS,\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};\n\nexport { isDepositSpendApproved, isWithdrawalSpendApproved };\n"],"mappings":"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","names":[]}