UNPKG

@molecularlabs/nucleus-frontend

Version:
103 lines 3.27 kB
import { formatUnits } from "viem"; import { getErc20AllowanceWithDecimals } from "../api/erc20"; import { toChainId } from "../api/vault-config"; import { ATOMIC_QUEUE_CONTRACT_ADDRESS } from "../constants"; import { tryCatch } from "../utils/try-catch"; import { getVaultByKey } from "../vaults"; const isDepositSpendApproved = async ({ vaultKey, sourceChainId, depositTokenSymbol, userAddress }) => { const { data: vault, error: vaultError, success: vaultSuccess } = await tryCatch(getVaultByKey(vaultKey)); if (!vaultSuccess) { throw new Error(`Vault not found for ${vaultKey}: ${vaultError.message}`); } if (!vault.contracts) { throw new Error(`Contracts not found: ${vaultKey}`); } const normalizedSourceChainId = toChainId(sourceChainId); const depositAssetAddress = vault.deposit.sourceChains[normalizedSourceChainId].depositTokens[depositTokenSymbol].address; if (!depositAssetAddress) { throw new Error(`Deposit asset address not found: ${depositTokenSymbol}`); } const { deposit } = vault; const { sourceChains } = deposit; const sourceChain = sourceChains[normalizedSourceChainId]; if (!sourceChain) { throw new Error(`Source chain not found: ${normalizedSourceChainId}`); } const [allowance, decimals] = await getErc20AllowanceWithDecimals({ chainId: normalizedSourceChainId, tokenAddress: depositAssetAddress, userAddress, spenderAddress: vault.contracts.boringVault }); if (allowance.status === "failure" || decimals.status === "failure") { return { isApproved: false, allowance: "0", allowanceAsBigInt: "0", decimals: "0", error: allowance.error || decimals.error }; } return { isApproved: allowance.result > 0n, allowance: formatUnits(allowance.result, decimals.result), allowanceAsBigInt: allowance.result.toString(), decimals: decimals.result, error: null }; }; const isWithdrawalSpendApproved = async ({ vaultKey, destinationChainId, userAddress }) => { const { data: vault, error: vaultError, success: vaultSuccess } = await tryCatch(getVaultByKey(vaultKey)); if (!vaultSuccess) { throw new Error(`Vault not found for ${vaultKey}: ${vaultError.message}`); } if (!vault.contracts) { throw new Error(`Contracts not found for ${vaultKey}`); } const normalizedDestinationChainId = toChainId(destinationChainId); const boringVaultAddress = vault.contracts.boringVault; const [allowance, decimals] = await getErc20AllowanceWithDecimals({ chainId: normalizedDestinationChainId, tokenAddress: boringVaultAddress, userAddress, spenderAddress: ATOMIC_QUEUE_CONTRACT_ADDRESS }); if (allowance.status === "failure" || decimals.status === "failure") { return { isApproved: false, allowance: "0", allowanceAsBigInt: "0", decimals: "0", error: allowance.error || decimals.error }; } return { isApproved: allowance.result > 0n, allowance: formatUnits(allowance.result, decimals.result), allowanceAsBigInt: allowance.result.toString(), decimals: decimals.result, error: null }; }; export { isDepositSpendApproved, isWithdrawalSpendApproved }; //# sourceMappingURL=approvals.mjs.map