@paxoslabs/earn-sdk
Version:
Paxos Labs Earn SDK
1 lines • 25.4 kB
Source Map (JSON)
{"version":3,"sources":["../src/display/approvals.ts","../src/vaults/bridge.ts","../src/display/bridge-fees.ts","../src/display/exchange-rate.ts"],"names":[],"mappings":"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","file":"chunk-EYR4YMSX.mjs","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","/**\n * @file Bridge functionality for cross-chain operations\n * @module vaults/bridge\n */\n\nimport type { Address } from \"viem\";\nimport { getVaultByKey } from \".\";\nimport type { BridgeData } from \"../api/teller\";\nimport { getPreviewFee } from \"../api/teller\";\nimport { type ChainId, toChainId } from \"../api/vault-config\";\nimport { NATIVE_TOKEN_FOR_BRIDGE_FEE } from \"../constants\";\nimport { TellerAbi } from \"../contracts/teller-abi\";\nimport type { VaultKey } from \"./config\";\n\n/**\n * Parameters for preparing bridge contract arguments\n * @interface PrepareBridgeContractArgParams\n * @property {number} bridgeChainIdentifier - Chain identifier for the bridge protocol\n * @property {Address} userAddress - Ethereum address of the user initiating the bridge\n * @property {Address} [nativeTokenForBridgeFee] - Optional address of the native token used for bridge fees\n */\ninterface PrepareBridgeContractArgParams {\n bridgeChainIdentifier: number;\n userAddress: Address;\n nativeTokenForBridgeFee?: Address;\n}\n\n// Creates a standardized bridge data object for cross-chain transactions\n// with default values for gas limits and other bridge protocol parameters\nconst prepareBridgeContractArg = ({\n bridgeChainIdentifier,\n userAddress,\n nativeTokenForBridgeFee = NATIVE_TOKEN_FOR_BRIDGE_FEE,\n}: PrepareBridgeContractArgParams): BridgeData => {\n return {\n chainSelector: bridgeChainIdentifier,\n destinationChainReceiver: userAddress,\n bridgeFeeToken: nativeTokenForBridgeFee,\n messageGas: BigInt(100000),\n data: \"0x\" as never,\n };\n};\n\n/**\n * Parameters for preparing a cross-chain bridge transaction\n * @interface PrepareBridgeTransactionParams\n * @property {VaultKey} vaultKey - Unique identifier for the vault\n * @property {bigint} bridgeAmount - Amount of shares to bridge (in base units)\n * @property {ChainId} sourceChainId - Chain ID where shares currently exist\n * @property {ChainId} destinationChainId - Chain ID where shares will be bridged to\n * @property {Address} userAddress - Ethereum address of the user initiating the bridge\n */\ninterface PrepareBridgeTransactionParams {\n vaultKey: VaultKey;\n bridgeAmount: bigint;\n sourceChainId: ChainId;\n destinationChainId: ChainId;\n userAddress: Address;\n}\n\n/**\n * Transaction data for executing a cross-chain bridge operation\n * @interface BridgeTransactionData\n * @property {typeof TellerAbi} abi - ABI for the CrossChainTeller contract\n * @property {Address} address - Address of the CrossChainTeller contract\n * @property {string} functionName - Name of the function to call on the contract\n * @property {[bigint, BridgeData]} args - Arguments for the bridge function:\n * [amount, bridgeArgs]\n * @property {number} chainId - ID of the chain where the transaction should be executed\n * @property {bigint} value - Amount of native token to send with the transaction\n */\ninterface BridgeTransactionData {\n abi: typeof TellerAbi;\n address: Address;\n functionName: \"bridge\";\n args: [bigint, BridgeData];\n chainId: number;\n value: bigint;\n}\n\n// Example usage:\n// const bridgeData = await prepareBridgeData({\n// vaultKey: 'bobaeth',\n// bridgeAmount: BigInt('1000000000000000000'), // 1 token\n// sourceChainId: 288, // Boba network\n// userAddress: '0x1234...',\n// });\nconst prepareBridgeTransactionData = async ({\n vaultKey,\n bridgeAmount,\n sourceChainId,\n destinationChainId,\n userAddress,\n}: PrepareBridgeTransactionParams): Promise<BridgeTransactionData> => {\n const nativeTokenForBridgeFee = NATIVE_TOKEN_FOR_BRIDGE_FEE;\n const vault = await getVaultByKey(vaultKey);\n if (!vault) {\n throw new Error(`Invalid vault key: ${vaultKey}`);\n }\n\n if (!vault.contracts) {\n throw new Error(`Contracts not configured for vault ${vaultKey}`);\n }\n\n if (!vault.contracts.boringVault) {\n throw new Error(\n `BoringVault contract not configured for vault ${vaultKey}`\n );\n }\n\n if (!vault.contracts.accountant) {\n throw new Error(`Accountant contract not configured for vault ${vaultKey}`);\n }\n\n if (!vault.contracts.teller) {\n throw new Error(`Teller contract not configured for vault ${vaultKey}`);\n }\n\n const normalizedSourceChainId = toChainId(sourceChainId);\n const sourceChain = vault.withdraw.sourceChains[normalizedSourceChainId];\n if (!sourceChain) {\n throw new Error(`Source chain not configured for vault ${vaultKey}`);\n }\n\n const normalizedDestinationChainId = toChainId(destinationChainId);\n const destinationChain =\n sourceChain.destinationChains[normalizedDestinationChainId];\n if (!destinationChain) {\n throw new Error(`Destination chain not configured for vault ${vaultKey}`);\n }\n\n const bridgeChainIdentifier = destinationChain.bridge.chainIdentifier;\n\n const bridgeContractArg = prepareBridgeContractArg({\n bridgeChainIdentifier,\n userAddress,\n nativeTokenForBridgeFee,\n });\n\n const previewFee = await getPreviewFee({\n shareAmount: bridgeAmount,\n bridgeData: bridgeContractArg,\n contractAddress: vault.contracts.teller,\n chainId: normalizedSourceChainId,\n });\n\n return {\n abi: TellerAbi,\n address: vault.contracts.teller,\n functionName: \"bridge\",\n args: [bridgeAmount, bridgeContractArg],\n chainId: normalizedSourceChainId,\n value: previewFee,\n };\n};\n\nexport { prepareBridgeContractArg, prepareBridgeTransactionData };\nexport type { BridgeTransactionData };\n","import type { Address } from \"viem\";\nimport { getPreviewFee } from \"../api/teller\";\nimport type { ChainId } from \"../api/vault-config\";\nimport { NATIVE_TOKEN_FOR_BRIDGE_FEE } from \"../constants\";\nimport { getVaultByKey } from \"../vaults\";\nimport { prepareBridgeContractArg } from \"../vaults/bridge\";\nimport type { VaultKey } from \"../vaults/config\";\n\ninterface GetPreviewFeeParams {\n vaultKey: VaultKey;\n bridgeAmount: bigint;\n sourceChainId: ChainId;\n destinationChainId: ChainId;\n userAddress: Address;\n nativeTokenForBridgeFee?: Address;\n}\n\nconst getBridgeFee = async ({\n vaultKey,\n bridgeAmount,\n sourceChainId,\n destinationChainId,\n userAddress,\n nativeTokenForBridgeFee = NATIVE_TOKEN_FOR_BRIDGE_FEE,\n}: GetPreviewFeeParams) => {\n const vault = await getVaultByKey(vaultKey);\n if (!vault) {\n throw new Error(`Invalid vault key: ${vaultKey}`);\n }\n\n if (!vault.contracts) {\n throw new Error(`Contracts not configured for vault ${vaultKey}`);\n }\n\n if (!vault.contracts.boringVault) {\n throw new Error(\n `BoringVault contract not configured for vault ${vaultKey}`\n );\n }\n\n if (!vault.contracts.accountant) {\n throw new Error(`Accountant contract not configured for vault ${vaultKey}`);\n }\n\n if (!vault.contracts.teller) {\n throw new Error(`Teller contract not configured for vault ${vaultKey}`);\n }\n\n const sourceChain = vault.withdraw.sourceChains[sourceChainId];\n if (!sourceChain) {\n throw new Error(`Source chain not configured for vault ${vaultKey}`);\n }\n\n const destinationChain = sourceChain.destinationChains[destinationChainId];\n if (!destinationChain) {\n throw new Error(`Destination chain not configured for vault ${vaultKey}`);\n }\n\n const bridgeChainIdentifier = destinationChain.bridge.chainIdentifier;\n\n const bridgeContractArg = prepareBridgeContractArg({\n bridgeChainIdentifier,\n userAddress,\n nativeTokenForBridgeFee,\n });\n\n const previewFee = await getPreviewFee({\n shareAmount: bridgeAmount,\n bridgeData: bridgeContractArg,\n contractAddress: vault.contracts.teller,\n chainId: sourceChainId,\n });\n\n // TODO: use native currency from chains object returned from API\n return previewFee;\n};\n\nexport { getBridgeFee };\n","import { getRateInQuoteWithAssetDecimals } from \"../api/accountant\";\nimport type { ChainId } from \"../api/vault-config\";\nimport { bigIntToNumberAsString } from \"../utils/bigint\";\nimport { getVaultByKey } from \"../vaults\";\nimport type { VaultKey } from \"../vaults/config\";\n\ninterface GetDepositExchangeRateParams {\n vaultKey: VaultKey;\n sourceChainId: ChainId;\n depositTokenSymbol: string;\n minimumFractionDigits?: number;\n maximumFractionDigits?: number;\n}\n\n/**\n * Gets the deposit exchange rate for a vault (tokens per share)\n * @throws {Error} If the token address is not found or if there's an error fetching the rate\n * @returns Promise<string> The exchange rate as a formatted string representing how many deposit tokens are worth 1 share\n */\nconst getDepositExchangeRate = async ({\n vaultKey,\n sourceChainId,\n depositTokenSymbol,\n minimumFractionDigits,\n maximumFractionDigits = 3,\n}: GetDepositExchangeRateParams) => {\n const vault = await getVaultByKey(vaultKey);\n\n const sourceChain = vault.deposit.sourceChains[sourceChainId];\n if (!sourceChain) {\n throw new Error(\n `Source chain ${sourceChainId} not found for vault ${vaultKey}`\n );\n }\n\n const depositToken = sourceChain.depositTokens?.[depositTokenSymbol];\n if (!depositToken) {\n throw new Error(\n `Deposit token ${depositTokenSymbol} not found for chain ${sourceChainId}`\n );\n }\n\n const tokenAddress = depositToken.address;\n if (!tokenAddress) {\n throw new Error(`Token address not found for ${depositTokenSymbol}`);\n }\n\n const [decimals, rate] = await getRateInQuoteWithAssetDecimals({\n assetAddress: tokenAddress,\n accountantAddress: vault.contracts.accountant,\n chainId: sourceChainId,\n });\n\n if (rate.status === \"failure\") {\n throw new Error(`Failed to get rate: ${rate.error.message}`);\n }\n if (decimals.status === \"failure\") {\n throw new Error(`Failed to get decimals: ${decimals.error.message}`);\n }\n\n return bigIntToNumberAsString(rate.result, {\n decimals: decimals.result,\n minimumFractionDigits,\n maximumFractionDigits,\n });\n};\n\ninterface GetWithdrawExchangeRateParams {\n vaultKey: VaultKey;\n sourceChainId: ChainId;\n destinationChainId: ChainId;\n wantTokenSymbol: string;\n minimumFractionDigits?: number;\n maximumFractionDigits?: number;\n}\n\n/**\n * Gets the withdraw exchange rate for a vault (tokens per share)\n * @throws {Error} If the token address is not found or if there's an error fetching the rate\n * @returns Promise<string> The exchange rate as a formatted string representing how many want tokens are worth 1 share\n */\nconst getWithdrawExchangeRate = async ({\n vaultKey,\n sourceChainId,\n destinationChainId,\n wantTokenSymbol,\n minimumFractionDigits,\n maximumFractionDigits = 3,\n}: GetWithdrawExchangeRateParams) => {\n const vault = await getVaultByKey(vaultKey);\n\n const sourceChain = vault.withdraw.sourceChains[sourceChainId];\n if (!sourceChain) {\n throw new Error(\n `Source chain ${sourceChainId} not found for vault ${vaultKey}`\n );\n }\n\n const destinationChain = sourceChain.destinationChains[destinationChainId];\n if (!destinationChain) {\n throw new Error(\n `Destination chain ${destinationChainId} not found for source chain ${sourceChainId}`\n );\n }\n\n const wantToken = destinationChain.wantTokens?.[wantTokenSymbol];\n if (!wantToken) {\n throw new Error(\n `Want token ${wantTokenSymbol} not found for chain ${destinationChainId}`\n );\n }\n\n const tokenAddress = wantToken.address;\n if (!tokenAddress) {\n throw new Error(`Token address not found for ${wantTokenSymbol}`);\n }\n\n const [decimals, rate] = await getRateInQuoteWithAssetDecimals({\n assetAddress: tokenAddress,\n accountantAddress: vault.contracts.accountant,\n chainId: sourceChainId,\n });\n\n if (rate.status === \"failure\") {\n throw new Error(`Failed to get rate: ${rate.error.message}`);\n }\n if (decimals.status === \"failure\") {\n throw new Error(`Failed to get decimals: ${decimals.error.message}`);\n }\n\n return bigIntToNumberAsString(rate.result, {\n decimals: decimals.result,\n minimumFractionDigits,\n maximumFractionDigits,\n });\n};\n\nexport { getDepositExchangeRate, getWithdrawExchangeRate };\n"]}