{"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 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"],"mappings":"AAMA,SAAS,qBAAqB;AAE9B,SAAS,qBAAqB;AAC9B,SAAuB,iBAAiB;AACxC,SAAS,mCAAmC;AAC5C,SAAS,iBAAiB;AAkB1B,MAAM,2BAA2B,CAAC;AAAA,EAChC;AAAA,EACA;AAAA,EACA,0BAA0B;AAC5B,MAAkD;AAChD,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":[]}