diff --git a/.release/.changeset/modern-months-smoke.md b/.release/.changeset/modern-months-smoke.md new file mode 100644 index 00000000..af161050 --- /dev/null +++ b/.release/.changeset/modern-months-smoke.md @@ -0,0 +1,6 @@ +--- +"@bnb-chain/canonical-bridge-widget": patch +"@bnb-chain/canonical-bridge-sdk": patch +--- + +Check Layerzero destination gas limit diff --git a/packages/canonical-bridge-sdk/src/layerZero/index.ts b/packages/canonical-bridge-sdk/src/layerZero/index.ts index b0e5eff1..e250cbbd 100644 --- a/packages/canonical-bridge-sdk/src/layerZero/index.ts +++ b/packages/canonical-bridge-sdk/src/layerZero/index.ts @@ -38,16 +38,25 @@ export class LayerZero { }: ISendCakeTokenInput): Promise { try { const address32Bytes = pad(userAddress, { size: 32 }); + // check destination chain gas limit + const dstGasLimit = await publicClient.readContract({ + address: bridgeAddress, + abi: CAKE_PROXY_OFT_ABI, + functionName: 'minDstGasLookup', + args: [dstEndpoint, 0], + }); + const gasLimit = + dstGasLimit !== 0n && !!dstGasLimit ? dstGasLimit : gasAmount; /* version 1 - send token * version 2 - send token and air drop native gas on destination chain * https://docs.layerzero.network/v1/developers/evm/evm-guides/advanced/relayer-adapter-parameters#airdrop */ const adapterParams = version === 1 - ? encodePacked(['uint16', 'uint256'], [version, gasAmount]) + ? encodePacked(['uint16', 'uint256'], [version, gasLimit]) : encodePacked( ['uint16', 'uint', 'uint', 'address'], - [2, gasAmount, airDropGas, dstAddress] + [2, gasLimit, airDropGas, dstAddress] ); const fees = await publicClient.readContract({ address: bridgeAddress, @@ -122,13 +131,22 @@ export class LayerZero { dstAddress = '0x', }: IGetEstimateFeeInput) { try { + // check destination chain gas limit + const dstGasLimit = await publicClient.readContract({ + address: bridgeAddress, + abi: CAKE_PROXY_OFT_ABI, + functionName: 'minDstGasLookup', + args: [dstEndpoint, 0], + }); + const gasLimit = + dstGasLimit !== 0n && !!dstGasLimit ? dstGasLimit : gasAmount; const address32Bytes = pad(userAddress, { size: 32 }); const adapterParams = version === 1 - ? encodePacked(['uint16', 'uint256'], [version, gasAmount]) + ? encodePacked(['uint16', 'uint256'], [version, gasLimit]) : encodePacked( ['uint16', 'uint', 'uint', 'address'], - [2, gasAmount, airDropGas, dstAddress] + [2, gasLimit, airDropGas, dstAddress] ); const fees = await publicClient.readContract({ address: bridgeAddress, diff --git a/packages/canonical-bridge-widget/src/modules/aggregator/adapters/layerZero/hooks/useGetLayerZeroFees.ts b/packages/canonical-bridge-widget/src/modules/aggregator/adapters/layerZero/hooks/useGetLayerZeroFees.ts index d149e52e..37a5462c 100644 --- a/packages/canonical-bridge-widget/src/modules/aggregator/adapters/layerZero/hooks/useGetLayerZeroFees.ts +++ b/packages/canonical-bridge-widget/src/modules/aggregator/adapters/layerZero/hooks/useGetLayerZeroFees.ts @@ -52,7 +52,14 @@ export const useGetLayerZeroFees = () => { ); const address32Bytes = pad(address || DEFAULT_ADDRESS, { size: 32 }); - const adapterParams = encodePacked(['uint16', 'uint256'], [1, 200000n]); + const dstGasLimit = await publicClient.readContract({ + address: bridgeAddress, + abi: CAKE_PROXY_OFT_ABI, + functionName: 'minDstGasLookup', + args: [toTokenInfo?.layerZero?.raw?.endpointID, 0], + }); + const gasLimit = dstGasLimit !== 0n && !!dstGasLimit ? dstGasLimit : 200000n; + const adapterParams = encodePacked(['uint16', 'uint256'], [1, gasLimit]); const callParams = [ address, '0x0000000000000000000000000000000000000000', // zroPaymentAddress