@molecularlabs/nucleus-frontend
Version:
Nucleus BoringVault Frontend SDK
1 lines • 7.83 kB
Source Map (JSON)
{"version":3,"sources":["../../src/vaults/bridge.ts"],"sourcesContent":["/**\n * @file Bridge functionality for cross-chain operations\n * @module vaults/bridge\n */\n\nimport type { Address } from \"viem\";\nimport { getVaultByKey } from \".\";\nimport { getPreviewFee } from \"../api/teller\";\nimport { type ChainId, toChainId } from \"../api/vault-config\";\nimport { NATIVE_TOKEN_FOR_BRIDGE_FEE } from \"../constants\";\nimport { CrossChainTellerBaseAbi } from \"../contracts/cross-chain-teller-base-abi\";\nimport type { VaultKey } from \"./config\";\n\n/**\n * Arguments required by the bridge contract for cross-chain transfers\n * @interface BridgeContractArg\n * @property {number} chainSelector - Unique identifier for the destination chain\n * @property {Address} destinationChainReceiver - Address that will receive the bridged tokens\n * @property {Address} bridgeFeeToken - Token used to pay the bridge fee\n * @property {bigint} messageGas - Amount of gas allocated for the cross-chain message\n * @property {`0x${string}`} data - Additional data required for the bridge operation (hex encoded)\n */\ninterface BridgeContractArg {\n chainSelector: number;\n destinationChainReceiver: Address;\n bridgeFeeToken: Address;\n messageGas: bigint;\n data: `0x${string}`;\n}\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): BridgeContractArg => {\n return {\n chainSelector: bridgeChainIdentifier,\n destinationChainReceiver: userAddress,\n bridgeFeeToken: nativeTokenForBridgeFee,\n messageGas: BigInt(100000),\n data: \"0x\",\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 CrossChainTellerBaseAbi} 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, BridgeContractArg]} 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 CrossChainTellerBaseAbi;\n address: Address;\n functionName: string;\n args: [bigint, BridgeContractArg];\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: CrossChainTellerBaseAbi,\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"],"mappings":"AAMA,SAAS,qBAAqB;AAC9B,SAAS,qBAAqB;AAC9B,SAAuB,iBAAiB;AACxC,SAAS,mCAAmC;AAC5C,SAAS,+BAA+B;AAmCxC,MAAM,2BAA2B,CAAC;AAAA,EAChC;AAAA,EACA;AAAA,EACA,0BAA0B;AAC5B,MAAyD;AACvD,SAAO;AAAA,IACL,eAAe;AAAA,IACf,0BAA0B;AAAA,IAC1B,gBAAgB;AAAA,IAChB,YAAY,OAAO,GAAM;AAAA,IACzB,MAAM;AAAA,EACR;AACF;AA8CA,MAAM,+BAA+B,OAAO;AAAA,EAC1C;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AACF,MAAsE;AACpE,QAAM,0BAA0B;AAChC,QAAM,QAAQ,MAAM,cAAc,QAAQ;AAC1C,MAAI,CAAC,OAAO;AACV,UAAM,IAAI,MAAM,sBAAsB,QAAQ,EAAE;AAAA,EAClD;AAEA,MAAI,CAAC,MAAM,WAAW;AACpB,UAAM,IAAI,MAAM,sCAAsC,QAAQ,EAAE;AAAA,EAClE;AAEA,MAAI,CAAC,MAAM,UAAU,aAAa;AAChC,UAAM,IAAI;AAAA,MACR,iDAAiD,QAAQ;AAAA,IAC3D;AAAA,EACF;AAEA,MAAI,CAAC,MAAM,UAAU,YAAY;AAC/B,UAAM,IAAI,MAAM,gDAAgD,QAAQ,EAAE;AAAA,EAC5E;AAEA,MAAI,CAAC,MAAM,UAAU,QAAQ;AAC3B,UAAM,IAAI,MAAM,4CAA4C,QAAQ,EAAE;AAAA,EACxE;AAEA,QAAM,0BAA0B,UAAU,aAAa;AACvD,QAAM,cAAc,MAAM,SAAS,aAAa,uBAAuB;AACvE,MAAI,CAAC,aAAa;AAChB,UAAM,IAAI,MAAM,yCAAyC,QAAQ,EAAE;AAAA,EACrE;AAEA,QAAM,+BAA+B,UAAU,kBAAkB;AACjE,QAAM,mBACJ,YAAY,kBAAkB,4BAA4B;AAC5D,MAAI,CAAC,kBAAkB;AACrB,UAAM,IAAI,MAAM,8CAA8C,QAAQ,EAAE;AAAA,EAC1E;AAEA,QAAM,wBAAwB,iBAAiB,OAAO;AAEtD,QAAM,oBAAoB,yBAAyB;AAAA,IACjD;AAAA,IACA;AAAA,IACA;AAAA,EACF,CAAC;AAED,QAAM,aAAa,MAAM,cAAc;AAAA,IACrC,aAAa;AAAA,IACb,YAAY;AAAA,IACZ,iBAAiB,MAAM,UAAU;AAAA,IACjC,SAAS;AAAA,EACX,CAAC;AAED,SAAO;AAAA,IACL,KAAK;AAAA,IACL,SAAS,MAAM,UAAU;AAAA,IACzB,cAAc;AAAA,IACd,MAAM,CAAC,cAAc,iBAAiB;AAAA,IACtC,SAAS;AAAA,IACT,OAAO;AAAA,EACT;AACF;","names":[]}