From 948be5df0b9a29697ff1ab5f59eb88e2f816d6af Mon Sep 17 00:00:00 2001 From: nampc Date: Sat, 7 Sep 2024 18:25:56 +0700 Subject: [PATCH 1/2] fix bug for klaster --- .../helper/tx-encoder.ts | 60 ++++++++++++ .../chain-abstraction-service/klaster.ts | 93 +++++-------------- .../src/services/transaction-service/index.ts | 6 +- 3 files changed, 86 insertions(+), 73 deletions(-) create mode 100644 packages/extension-base/src/services/chain-abstraction-service/helper/tx-encoder.ts diff --git a/packages/extension-base/src/services/chain-abstraction-service/helper/tx-encoder.ts b/packages/extension-base/src/services/chain-abstraction-service/helper/tx-encoder.ts new file mode 100644 index 00000000000..36372b74322 --- /dev/null +++ b/packages/extension-base/src/services/chain-abstraction-service/helper/tx-encoder.ts @@ -0,0 +1,60 @@ +// Copyright 2019-2022 @subwallet/extension-base authors & contributors +// SPDX-License-Identifier: Apache-2.0 + +import { BridgePluginParams } from "klaster-sdk"; +import { AcrossSuggestedFeeResp } from "../klaster"; +import { encodeFunctionData, Hex, parseAbi } from 'viem'; + +export async function getAcrossSuggestedFee (data: BridgePluginParams): Promise { + const url = 'https://testnet.across.to/api/suggested-fees?' + new URLSearchParams({ + originChainId: data.sourceChainId.toString(), + destinationChainId: data.destinationChainId.toString(), + inputToken: data.sourceToken, + outputToken: data.destinationToken, + amount: data.amount.toString() + }).toString(); + + console.log('url', url); + + return await fetch(url, { + method: 'GET' + }) + .then((res) => res.json()) as AcrossSuggestedFeeResp; +} + +export function encodeAcrossCallData (data: BridgePluginParams, fees: AcrossSuggestedFeeResp): Hex { + // @ts-ignore + const abi = parseAbi([ + 'function depositV3(address depositor, address recipient, address inputToken, address outputToken, uint256 inputAmount, uint256 outputAmount, uint256 destinationChainId, address exclusiveRelayer, uint32 quoteTimestamp, uint32 fillDeadline, uint32 exclusivityDeadline, bytes calldata message) external' + ]); + const outputAmount = data.amount - BigInt(fees.totalRelayFee.total); + const fillDeadline = Math.round(Date.now() / 1000) + 900; + + const [srcAddress, destAddress] = data.account.getAddresses([data.sourceChainId, data.destinationChainId]); + + if (!srcAddress || !destAddress) { + throw Error(`Can't fetch address from multichain account for ${data.sourceChainId} or ${data.destinationChainId}`); + } + + // @ts-ignore + // eslint-disable-next-line @typescript-eslint/no-unsafe-return + return encodeFunctionData({ + // eslint-disable-next-line @typescript-eslint/no-unsafe-assignment + abi: abi, + functionName: 'depositV3', + args: [ + srcAddress, + destAddress, + data.sourceToken, + data.destinationToken, + data.amount, + outputAmount, + BigInt(data.destinationChainId), + fees.exclusiveRelayer, + parseInt(fees.timestamp), + fillDeadline, + parseInt(fees.exclusivityDeadline), + '0x' + ] + }); +} diff --git a/packages/extension-base/src/services/chain-abstraction-service/klaster.ts b/packages/extension-base/src/services/chain-abstraction-service/klaster.ts index 96ab24caccc..692fbc4eb39 100644 --- a/packages/extension-base/src/services/chain-abstraction-service/klaster.ts +++ b/packages/extension-base/src/services/chain-abstraction-service/klaster.ts @@ -1,28 +1,29 @@ // Copyright 2019-2022 @subwallet/extension-base authors & contributors // SPDX-License-Identifier: Apache-2.0 +import { _ChainAsset, _ChainInfo } from "@subwallet/chain-list/types"; +import { _getContractAddressOfToken, _getEvmChainId } from "@subwallet/extension-base/services/chain-service/utils"; import { - batchTx, - BiconomyV2AccountInitData, - BridgePlugin, - BridgePluginParams, - buildItx, - buildMultichainReadonlyClient, - buildRpcInfo, - buildTokenMapping, - deployment, - encodeApproveTx, - initKlaster, - klasterNodeHost, - KlasterSDK, - loadBicoV2Account, - MultichainClient, - MultichainTokenMapping, QuoteResponse, - rawTx + batchTx, + BiconomyV2AccountInitData, + BridgePlugin, + BridgePluginParams, + buildItx, + buildMultichainReadonlyClient, + buildRpcInfo, + buildTokenMapping, + deployment, + encodeApproveTx, + initKlaster, + klasterNodeHost, + KlasterSDK, + loadBicoV2Account, + MultichainClient, + MultichainTokenMapping, QuoteResponse, + rawTx } from 'klaster-sdk'; -import { encodeFunctionData, Hex, parseAbi } from 'viem'; -import {_ChainAsset, _ChainInfo} from "@subwallet/chain-list/types"; -import {_getContractAddressOfToken, _getEvmChainId} from "@subwallet/extension-base/services/chain-service/utils"; +import { encodeAcrossCallData, getAcrossSuggestedFee } from './helper/tx-encoder'; +import { log } from "console"; export interface AcrossSuggestedFeeResp { totalRelayFee: { @@ -50,43 +51,6 @@ export interface AcrossSuggestedFeeResp { expectedFillTimeSec: string } -function encodeAcrossCallData (data: BridgePluginParams, fees: AcrossSuggestedFeeResp): Hex { - // @ts-ignore - const abi = parseAbi([ - 'function depositV3(address depositor, address recipient, address inputToken, address outputToken, uint256 inputAmount, uint256 outputAmount, uint256 destinationChainId, address exclusiveRelayer, uint32 quoteTimestamp, uint32 fillDeadline, uint32 exclusivityDeadline, bytes calldata message) external' - ]); - const outputAmount = data.amount - BigInt(fees.totalRelayFee.total); - const fillDeadline = Math.round(Date.now() / 1000) + 300; - - const [srcAddress, destAddress] = data.account.getAddresses([data.sourceChainId, data.destinationChainId]); - - if (!srcAddress || !destAddress) { - throw Error(`Can't fetch address from multichain account for ${data.sourceChainId} or ${data.destinationChainId}`); - } - - // @ts-ignore - // eslint-disable-next-line @typescript-eslint/no-unsafe-return - return encodeFunctionData({ - // eslint-disable-next-line @typescript-eslint/no-unsafe-assignment - abi: abi, - functionName: 'depositV3', - args: [ - srcAddress, - destAddress, - data.sourceToken, - data.destinationToken, - data.amount, - outputAmount, - BigInt(data.destinationChainId), - fees.exclusiveRelayer, - parseInt(fees.timestamp), - fillDeadline, - parseInt(fees.exclusivityDeadline), - '0x' - ] - }); -} - export class KlasterService { public sdk: KlasterSDK; private mcClient: MultichainClient; @@ -116,20 +80,7 @@ export class KlasterService { ]); this.bridgePlugin = async (data: BridgePluginParams) => { - const url = 'https://testnet.across.to/api/suggested-fees?' + new URLSearchParams({ - originChainId: data.sourceChainId.toString(), - destinationChainId: data.destinationChainId.toString(), - inputToken: data.sourceToken, - outputToken: data.destinationToken, - amount: data.amount.toString() - }).toString(); - - console.log('url', url); - - const feeResponse = await fetch(url, { - method: 'GET' - }) - .then((res) => res.json()) as AcrossSuggestedFeeResp; + const feeResponse = await getAcrossSuggestedFee(data); console.log(feeResponse); diff --git a/packages/extension-base/src/services/transaction-service/index.ts b/packages/extension-base/src/services/transaction-service/index.ts index 3f6611348f6..e65eef7fa37 100644 --- a/packages/extension-base/src/services/transaction-service/index.ts +++ b/packages/extension-base/src/services/transaction-service/index.ts @@ -290,7 +290,8 @@ export default class TransactionService { }); emitter.on('send', (data: TransactionEventResponse) => { - this.onSend(data); + console.log('onSend', data); + // this.onSend(data); }); emitter.on('extrinsicHash', (data: TransactionEventResponse) => { @@ -1284,7 +1285,8 @@ export default class TransactionService { id, errors: [], warnings: [], - extrinsicHash: id + extrinsicHash: id, + eventLogs: [] }; this.state.requestService.addConfirmation(id, 'EXTENSION_REQUEST_URL', 'evmSignatureRequest', _payload, {}) From fa256016e2b94b51cccd1206379701da628d7614 Mon Sep 17 00:00:00 2001 From: nampc Date: Sun, 8 Sep 2024 12:01:44 +0700 Subject: [PATCH 2/2] fix bug for klaster --- .../src/koni/api/contract-handler/evm/web3.ts | 8 ++++++++ .../src/services/chain-abstraction-service/klaster.ts | 5 +---- 2 files changed, 9 insertions(+), 4 deletions(-) diff --git a/packages/extension-base/src/koni/api/contract-handler/evm/web3.ts b/packages/extension-base/src/koni/api/contract-handler/evm/web3.ts index 7d8be82fe15..2fcef7e0579 100644 --- a/packages/extension-base/src/koni/api/contract-handler/evm/web3.ts +++ b/packages/extension-base/src/koni/api/contract-handler/evm/web3.ts @@ -49,3 +49,11 @@ export async function getERC20SpendingApprovalTx (spender: _Address, owner: _Add maxPriorityFeePerGas: priority.maxPriorityFeePerGas?.toString() } as TransactionConfig; } + +export function encodeSpendingApproval (spender: _Address, owner: _Address, contractAddress: _Address, evmApi: _EvmApi, amount = '115792089237316195423570985008687907853269984665640564039457584007913129639935'): string { + const tokenContract = getERC20Contract(contractAddress, evmApi); + // eslint-disable-next-line @typescript-eslint/no-unsafe-call,@typescript-eslint/no-unsafe-member-access,@typescript-eslint/no-unsafe-assignment + const approveCall = tokenContract.methods.approve(spender, amount); // TODO: need test + // eslint-disable-next-line @typescript-eslint/no-unsafe-call,@typescript-eslint/no-unsafe-member-access,@typescript-eslint/no-unsafe-assignment + return approveCall.encodeABI() as string; +} diff --git a/packages/extension-base/src/services/chain-abstraction-service/klaster.ts b/packages/extension-base/src/services/chain-abstraction-service/klaster.ts index 692fbc4eb39..5363caf2698 100644 --- a/packages/extension-base/src/services/chain-abstraction-service/klaster.ts +++ b/packages/extension-base/src/services/chain-abstraction-service/klaster.ts @@ -23,7 +23,6 @@ import { rawTx } from 'klaster-sdk'; import { encodeAcrossCallData, getAcrossSuggestedFee } from './helper/tx-encoder'; -import { log } from "console"; export interface AcrossSuggestedFeeResp { totalRelayFee: { @@ -82,12 +81,10 @@ export class KlasterService { this.bridgePlugin = async (data: BridgePluginParams) => { const feeResponse = await getAcrossSuggestedFee(data); - console.log(feeResponse); - const outputAmount = data.amount - BigInt(feeResponse.totalRelayFee.total); const acrossApproveTx = encodeApproveTx({ tokenAddress: data.sourceToken, - amount: outputAmount, + amount: outputAmount * 10n, recipient: feeResponse.spokePoolAddress });