@kodiak-finance/orderly-web3-provider-ethers 2.9.4 → 2.9.5

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
package/dist/index.js CHANGED
@@ -94,6 +94,17 @@ function replacePrefix(reason) {
94
94
  }
95
95
 
96
96
  // src/ethersProvider.ts
97
+ function isContractCallFailure(error) {
98
+ var _a;
99
+ if (!import_ethers.ethers.isError(error, "CALL_EXCEPTION")) {
100
+ return false;
101
+ }
102
+ if (error.data !== null || error.reason !== null || error.revert !== null) {
103
+ return true;
104
+ }
105
+ const rpcError = (_a = error.info) == null ? void 0 : _a.error;
106
+ return typeof (rpcError == null ? void 0 : rpcError.message) === "string" && /execution reverted/iu.test(rpcError.message);
107
+ }
97
108
  var EthersProvider = class {
98
109
  constructor() {
99
110
  __publicField(this, "_provider");
@@ -242,6 +253,46 @@ var EthersProvider = class {
242
253
  const userAddress = yield signer.getAddress();
243
254
  const erc20Interface = new import_ethers.ethers.Interface(ERC20_ABI);
244
255
  const multicallInterface = new import_ethers.ethers.Interface(MULTICALL_ABI);
256
+ const multicallCode = yield this.browserProvider.getCode(MULTICALL3_ADDRESS);
257
+ if (multicallCode === "0x") {
258
+ return Promise.all(
259
+ addresses.map((tokenAddr) => __async(this, null, function* () {
260
+ var _a;
261
+ if ((0, import_orderly_types.isNativeTokenChecker)(tokenAddr)) {
262
+ const balance = yield this.browserProvider.getBalance(userAddress);
263
+ return balance.toString();
264
+ }
265
+ let returnData;
266
+ try {
267
+ returnData = yield this.browserProvider.call({
268
+ to: tokenAddr,
269
+ data: erc20Interface.encodeFunctionData("balanceOf", [
270
+ userAddress
271
+ ])
272
+ });
273
+ } catch (error) {
274
+ if (isContractCallFailure(error)) {
275
+ console.warn("Failed to fetch token balance:", error);
276
+ return "0";
277
+ }
278
+ throw error;
279
+ }
280
+ if (returnData === "0x") {
281
+ return "0";
282
+ }
283
+ try {
284
+ const decoded = erc20Interface.decodeFunctionResult(
285
+ "balanceOf",
286
+ returnData
287
+ );
288
+ return ((_a = decoded == null ? void 0 : decoded[0]) == null ? void 0 : _a.toString()) || "0";
289
+ } catch (error) {
290
+ console.warn("Failed to decode balanceOf result:", error);
291
+ return "0";
292
+ }
293
+ }))
294
+ );
295
+ }
245
296
  const multicallContract = new import_ethers.ethers.Contract(
246
297
  MULTICALL3_ADDRESS,
247
298
  MULTICALL_ABI,
package/dist/index.js.map CHANGED
@@ -1 +1 @@
1
- {"version":3,"sources":["../src/index.ts","../src/ethersProvider.ts","../src/parseError.ts"],"sourcesContent":["export { EthersProvider } from \"./ethersProvider\";\n","import { Web3Provider } from \"@kodiak-finance/orderly-default-evm-adapter\";\nimport { API, isNativeTokenChecker } from \"@kodiak-finance/orderly-types\";\nimport { BrowserProvider, Eip1193Provider, ethers } from \"ethers\";\nimport { parseError } from \"./parseError\";\n\nclass EthersProvider implements Web3Provider {\n private _provider!: BrowserProvider;\n private _originalProvider!: Eip1193Provider;\n\n parseUnits(amount: string, decimals?: number): string {\n return ethers.parseUnits(amount, decimals).toString();\n }\n\n formatUnits(amount: string, decimals?: number): string {\n return ethers.formatUnits(amount, decimals);\n }\n\n set provider(provider: Eip1193Provider) {\n this._provider = new BrowserProvider(provider, \"any\");\n this._originalProvider = provider;\n }\n\n get browserProvider(): BrowserProvider {\n if (!this._provider) {\n throw new Error(\"browserProvider is not initialized\");\n }\n return this._provider;\n }\n\n async signTypedData(\n address: string,\n toSignatureMessage: any,\n ): Promise<string> {\n return await this.browserProvider?.send(\"eth_signTypedData_v4\", [\n address,\n toSignatureMessage,\n ]);\n }\n\n async call(\n address: string,\n method: string,\n params: any[],\n options: { abi: any },\n ): Promise<any> {\n const writeMethod: string[] = [\"approve\"];\n // @ts-ignore\n if (this._originalProvider.agwWallet && writeMethod.includes(method)) {\n try {\n // @ts-ignore\n const transactionHash = await this._originalProvider.writeContract({\n abi: options.abi,\n address: address,\n functionName: method,\n args: params,\n });\n\n return {\n hash: transactionHash,\n };\n } catch (error) {\n // const parsedEthersError = getParsedEthersError(error as EthersError);\n // if ((error as any).message.includes(\"rejected\")) {\n // // @ts-ignore\n // throw new Error({ content: \"REJECTED_TRANSACTION\" });\n // }\n const parsedEthersError = await parseError(error);\n throw parsedEthersError;\n }\n }\n const singer = await this.browserProvider.getSigner();\n const contract = new ethers.Contract(address, options.abi, singer);\n\n return contract[method].apply(null, params).catch(async (error) => {\n const parsedEthersError = await parseError(error);\n throw parsedEthersError;\n });\n }\n\n send(method: string, params: Array<any> | Record<string, any>): Promise<any> {\n return this.browserProvider.send(method, params);\n }\n\n async sendTransaction(\n contractAddress: string,\n method: string,\n payload: { from: string; to?: string; data: any[]; value?: bigint },\n options: { abi: any },\n ): Promise<any> {\n const singer = await this.browserProvider?.getSigner();\n if (!singer) {\n throw new Error(\"singer is not exist\");\n }\n\n const contract = new ethers.Contract(\n contractAddress,\n options.abi,\n this.browserProvider,\n );\n\n // contract.interface.getAbiCoder().encode(tx.data);\n const encodeFunctionData = contract.interface.encodeFunctionData(\n method,\n payload.data,\n );\n\n const tx: ethers.TransactionRequest = {\n from: payload.from,\n to: payload.to,\n data: encodeFunctionData,\n value: payload.value,\n };\n\n try {\n // for agw wallet\n if (method === \"depositTo\") {\n // @ts-ignore\n return await this._originalProvider.sendTransaction({\n to: contractAddress,\n data: encodeFunctionData,\n value: payload.value,\n });\n }\n return await singer.sendTransaction(tx);\n } catch (error) {\n const parsedEthersError = await parseError(error);\n throw parsedEthersError;\n }\n }\n\n async pollTransactionReceiptWithBackoff(\n txHash: string,\n baseInterval = 1000,\n maxInterval = 6000,\n maxRetries = 30,\n ) {\n let interval = baseInterval;\n let retries = 0;\n\n while (retries < maxRetries) {\n try {\n const receipt =\n await this.browserProvider!.getTransactionReceipt(txHash);\n if (receipt) {\n // completed, get receipt\n return receipt;\n }\n } catch (error) {\n // waiting\n }\n\n await new Promise((resolve) => setTimeout(resolve, interval));\n\n interval = Math.min(interval * 2, maxInterval);\n retries++;\n }\n\n throw new Error(\"Transaction did not complete after maximum retries.\");\n }\n\n callOnChain(\n chain: API.NetworkInfos,\n address: string,\n method: string,\n params: any[],\n options: { abi: any },\n ): Promise<any> {\n const provider = new ethers.JsonRpcProvider(chain.public_rpc_url);\n\n const contract = new ethers.Contract(address, options.abi, provider);\n\n return contract[method].apply(null, params).catch(async (error) => {\n const parsedEthersError = await parseError(error);\n throw parsedEthersError;\n });\n }\n\n getBalance(userAddress: string): Promise<bigint> {\n return this.browserProvider!.getBalance(userAddress).then((res) => {\n return res;\n });\n }\n\n async getBalances(addresses: string[]): Promise<string[]> {\n // if addresses is empty, return empty array\n if (!addresses || addresses.length === 0) {\n return [];\n }\n\n // Multicall3 contract address, support most EVM chains\n const MULTICALL3_ADDRESS = \"0xcA11bde05977b3631167028862bE2a173976CA11\";\n\n // extended ABI, add getEthBalance\n const MULTICALL_ABI = [\n \"function tryAggregate(bool requireSuccess, tuple(address target, bytes callData)[] calls) public view returns (tuple(bool success, bytes returnData)[] returnData)\",\n \"function getEthBalance(address addr) view returns (uint256 balance)\", // Multicall3 自带的方法\n ];\n\n // simplified ERC20 ABI\n const ERC20_ABI = [\n \"function balanceOf(address account) view returns (uint256)\",\n ];\n\n try {\n // get user address\n const signer = await this.browserProvider.getSigner();\n const userAddress = await signer.getAddress();\n\n // create contract interface instance (for encoding and decoding data)\n const erc20Interface = new ethers.Interface(ERC20_ABI);\n const multicallInterface = new ethers.Interface(MULTICALL_ABI);\n const multicallContract = new ethers.Contract(\n MULTICALL3_ADDRESS,\n MULTICALL_ABI,\n this.browserProvider,\n );\n\n // build Calls array\n // we need to encode the call to balanceOf into a hex string\n const calls = addresses.map((tokenAddr) => {\n if (isNativeTokenChecker(tokenAddr)) {\n // CASE A: if it's a native token\n // target address: Multicall3 contract itself\n // call method: getEthBalance(user)\n return {\n target: MULTICALL3_ADDRESS,\n callData: multicallInterface.encodeFunctionData(\"getEthBalance\", [\n userAddress,\n ]),\n };\n }\n return {\n target: tokenAddr,\n callData: erc20Interface.encodeFunctionData(\"balanceOf\", [\n userAddress,\n ]),\n };\n });\n\n // call Multicall\n // the first parameter of tryAggregate(false, calls) is false, which means:\n // if a token call fails, don't revert the entire transaction, but return false status\n const results = await multicallContract.tryAggregate.staticCall(\n false,\n calls,\n );\n\n // decode results\n const balances = results.map(\n (result: [boolean, string], index: number) => {\n const [success, returnData] = result;\n if (success && returnData !== \"0x\") {\n const tokenAddr = addresses[index];\n const isNative = isNativeTokenChecker(tokenAddr);\n try {\n let decoded;\n if (isNative) {\n // Native Token returns directly as uint256, decode with multicallInterface\n decoded = multicallInterface.decodeFunctionResult(\n \"getEthBalance\",\n returnData,\n );\n } else {\n // ERC20 returns also uint256, decode with erc20Interface\n decoded = erc20Interface.decodeFunctionResult(\n \"balanceOf\",\n returnData,\n );\n }\n // decode returned bytes data\n // const decoded = erc20Interface.decodeFunctionResult(\n // \"balanceOf\",\n // returnData,\n // );\n // decoded[0] is BigInt, need to explicitly convert to string\n return decoded?.[0]?.toString() || \"0\";\n } catch (error) {\n // if decoding fails, return \"0\"\n console.warn(\"Failed to decode balanceOf result:\", error);\n return \"0\";\n }\n } else {\n // if call fails (e.g. target is not a contract, or is an error address), return \"0\"\n return \"0\";\n }\n },\n );\n\n return balances;\n } catch (error) {\n console.error(\"getBalances error\", error);\n const parsedEthersError = await parseError(error);\n throw parsedEthersError;\n }\n }\n\n async estimateGasFee(\n contractAddress: string,\n method: string,\n payload: {\n from: string;\n to?: string;\n data: any[];\n value?: bigint;\n },\n options: {\n abi: any;\n },\n ): Promise<bigint> {\n const contract = new ethers.Contract(\n contractAddress,\n options.abi,\n this.browserProvider,\n );\n const encodeFunctionData = contract.interface.encodeFunctionData(\n method,\n payload.data,\n );\n\n const tx: ethers.TransactionRequest = {\n from: payload.from,\n to: payload.to,\n data: encodeFunctionData,\n value: payload.value,\n };\n\n let gas = BigInt(0);\n const defaultGas = BigInt(800000);\n try {\n gas = await this.browserProvider?.estimateGas(tx);\n } catch (error) {\n gas = defaultGas;\n console.error(\"estimateGasFee error\", error);\n }\n\n // current gas price\n const feeData = await this.browserProvider.getFeeData();\n\n const gasPrice = feeData.gasPrice ?? feeData.maxFeePerGas;\n\n if (!gasPrice) {\n throw new Error(\"gasPrice is not available\");\n }\n\n // transaction cost in wei\n const costInWei = gas * gasPrice;\n\n return costInWei;\n }\n}\n\nexport { EthersProvider };\n","import { DecodedError, ErrorDecoder } from \"ethers-decode-error\";\n\nconst errorDecoder = ErrorDecoder.create();\n\ntype ParsedError = DecodedError & {\n message: string;\n};\n\nexport async function parseError(rawError: any): Promise<ParsedError> {\n const error: DecodedError = await errorDecoder.decode(rawError);\n const reason = error.reason ?? \"\";\n console.error(\"parsedError\", error);\n\n return {\n ...error,\n message: replacePrefix(reason),\n };\n}\n\nfunction replacePrefix(reason: string) {\n const prefixes = [\"ethers-user-denied: \", \"ethers-unsupported: \"];\n\n if (typeof reason !== \"string\") {\n return reason;\n }\n\n for (const prefix of prefixes) {\n if (reason.startsWith(prefix)) {\n return reason.replace(prefix, \"\");\n }\n }\n\n return reason;\n}\n"],"mappings":"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","names":[]}
1
+ {"version":3,"sources":["../src/index.ts","../src/ethersProvider.ts","../src/parseError.ts"],"sourcesContent":["export { EthersProvider } from \"./ethersProvider\";\n","import { Web3Provider } from \"@kodiak-finance/orderly-default-evm-adapter\";\nimport { API, isNativeTokenChecker } from \"@kodiak-finance/orderly-types\";\nimport { BrowserProvider, Eip1193Provider, ethers } from \"ethers\";\nimport { parseError } from \"./parseError\";\n\nfunction isContractCallFailure(error: unknown): boolean {\n if (!ethers.isError(error, \"CALL_EXCEPTION\")) {\n return false;\n }\n\n if (error.data !== null || error.reason !== null || error.revert !== null) {\n return true;\n }\n\n const rpcError = error.info?.error as { message?: unknown } | undefined;\n return (\n typeof rpcError?.message === \"string\" &&\n /execution reverted/iu.test(rpcError.message)\n );\n}\n\nclass EthersProvider implements Web3Provider {\n private _provider!: BrowserProvider;\n private _originalProvider!: Eip1193Provider;\n\n parseUnits(amount: string, decimals?: number): string {\n return ethers.parseUnits(amount, decimals).toString();\n }\n\n formatUnits(amount: string, decimals?: number): string {\n return ethers.formatUnits(amount, decimals);\n }\n\n set provider(provider: Eip1193Provider) {\n this._provider = new BrowserProvider(provider, \"any\");\n this._originalProvider = provider;\n }\n\n get browserProvider(): BrowserProvider {\n if (!this._provider) {\n throw new Error(\"browserProvider is not initialized\");\n }\n return this._provider;\n }\n\n async signTypedData(\n address: string,\n toSignatureMessage: any,\n ): Promise<string> {\n return await this.browserProvider?.send(\"eth_signTypedData_v4\", [\n address,\n toSignatureMessage,\n ]);\n }\n\n async call(\n address: string,\n method: string,\n params: any[],\n options: { abi: any },\n ): Promise<any> {\n const writeMethod: string[] = [\"approve\"];\n // @ts-ignore\n if (this._originalProvider.agwWallet && writeMethod.includes(method)) {\n try {\n // @ts-ignore\n const transactionHash = await this._originalProvider.writeContract({\n abi: options.abi,\n address: address,\n functionName: method,\n args: params,\n });\n\n return {\n hash: transactionHash,\n };\n } catch (error) {\n // const parsedEthersError = getParsedEthersError(error as EthersError);\n // if ((error as any).message.includes(\"rejected\")) {\n // // @ts-ignore\n // throw new Error({ content: \"REJECTED_TRANSACTION\" });\n // }\n const parsedEthersError = await parseError(error);\n throw parsedEthersError;\n }\n }\n const singer = await this.browserProvider.getSigner();\n const contract = new ethers.Contract(address, options.abi, singer);\n\n return contract[method].apply(null, params).catch(async (error) => {\n const parsedEthersError = await parseError(error);\n throw parsedEthersError;\n });\n }\n\n send(method: string, params: Array<any> | Record<string, any>): Promise<any> {\n return this.browserProvider.send(method, params);\n }\n\n async sendTransaction(\n contractAddress: string,\n method: string,\n payload: { from: string; to?: string; data: any[]; value?: bigint },\n options: { abi: any },\n ): Promise<any> {\n const singer = await this.browserProvider?.getSigner();\n if (!singer) {\n throw new Error(\"singer is not exist\");\n }\n\n const contract = new ethers.Contract(\n contractAddress,\n options.abi,\n this.browserProvider,\n );\n\n // contract.interface.getAbiCoder().encode(tx.data);\n const encodeFunctionData = contract.interface.encodeFunctionData(\n method,\n payload.data,\n );\n\n const tx: ethers.TransactionRequest = {\n from: payload.from,\n to: payload.to,\n data: encodeFunctionData,\n value: payload.value,\n };\n\n try {\n // for agw wallet\n if (method === \"depositTo\") {\n // @ts-ignore\n return await this._originalProvider.sendTransaction({\n to: contractAddress,\n data: encodeFunctionData,\n value: payload.value,\n });\n }\n return await singer.sendTransaction(tx);\n } catch (error) {\n const parsedEthersError = await parseError(error);\n throw parsedEthersError;\n }\n }\n\n async pollTransactionReceiptWithBackoff(\n txHash: string,\n baseInterval = 1000,\n maxInterval = 6000,\n maxRetries = 30,\n ) {\n let interval = baseInterval;\n let retries = 0;\n\n while (retries < maxRetries) {\n try {\n const receipt =\n await this.browserProvider!.getTransactionReceipt(txHash);\n if (receipt) {\n // completed, get receipt\n return receipt;\n }\n } catch (error) {\n // waiting\n }\n\n await new Promise((resolve) => setTimeout(resolve, interval));\n\n interval = Math.min(interval * 2, maxInterval);\n retries++;\n }\n\n throw new Error(\"Transaction did not complete after maximum retries.\");\n }\n\n callOnChain(\n chain: API.NetworkInfos,\n address: string,\n method: string,\n params: any[],\n options: { abi: any },\n ): Promise<any> {\n const provider = new ethers.JsonRpcProvider(chain.public_rpc_url);\n\n const contract = new ethers.Contract(address, options.abi, provider);\n\n return contract[method].apply(null, params).catch(async (error) => {\n const parsedEthersError = await parseError(error);\n throw parsedEthersError;\n });\n }\n\n getBalance(userAddress: string): Promise<bigint> {\n return this.browserProvider!.getBalance(userAddress).then((res) => {\n return res;\n });\n }\n\n async getBalances(addresses: string[]): Promise<string[]> {\n // if addresses is empty, return empty array\n if (!addresses || addresses.length === 0) {\n return [];\n }\n\n // Multicall3 contract address, support most EVM chains\n const MULTICALL3_ADDRESS = \"0xcA11bde05977b3631167028862bE2a173976CA11\";\n\n // extended ABI, add getEthBalance\n const MULTICALL_ABI = [\n \"function tryAggregate(bool requireSuccess, tuple(address target, bytes callData)[] calls) public view returns (tuple(bool success, bytes returnData)[] returnData)\",\n \"function getEthBalance(address addr) view returns (uint256 balance)\", // Multicall3 自带的方法\n ];\n\n // simplified ERC20 ABI\n const ERC20_ABI = [\n \"function balanceOf(address account) view returns (uint256)\",\n ];\n\n try {\n // get user address\n const signer = await this.browserProvider.getSigner();\n const userAddress = await signer.getAddress();\n const erc20Interface = new ethers.Interface(ERC20_ABI);\n const multicallInterface = new ethers.Interface(MULTICALL_ABI);\n\n const multicallCode =\n await this.browserProvider.getCode(MULTICALL3_ADDRESS);\n if (multicallCode === \"0x\") {\n return Promise.all(\n addresses.map(async (tokenAddr) => {\n if (isNativeTokenChecker(tokenAddr)) {\n const balance =\n await this.browserProvider.getBalance(userAddress);\n return balance.toString();\n }\n\n let returnData: string;\n try {\n returnData = await this.browserProvider.call({\n to: tokenAddr,\n data: erc20Interface.encodeFunctionData(\"balanceOf\", [\n userAddress,\n ]),\n });\n } catch (error) {\n if (isContractCallFailure(error)) {\n console.warn(\"Failed to fetch token balance:\", error);\n return \"0\";\n }\n throw error;\n }\n\n if (returnData === \"0x\") {\n return \"0\";\n }\n\n try {\n const decoded = erc20Interface.decodeFunctionResult(\n \"balanceOf\",\n returnData,\n );\n return decoded?.[0]?.toString() || \"0\";\n } catch (error) {\n console.warn(\"Failed to decode balanceOf result:\", error);\n return \"0\";\n }\n }),\n );\n }\n\n // create contract interface instance (for encoding and decoding data)\n const multicallContract = new ethers.Contract(\n MULTICALL3_ADDRESS,\n MULTICALL_ABI,\n this.browserProvider,\n );\n\n // build Calls array\n // we need to encode the call to balanceOf into a hex string\n const calls = addresses.map((tokenAddr) => {\n if (isNativeTokenChecker(tokenAddr)) {\n // CASE A: if it's a native token\n // target address: Multicall3 contract itself\n // call method: getEthBalance(user)\n return {\n target: MULTICALL3_ADDRESS,\n callData: multicallInterface.encodeFunctionData(\"getEthBalance\", [\n userAddress,\n ]),\n };\n }\n return {\n target: tokenAddr,\n callData: erc20Interface.encodeFunctionData(\"balanceOf\", [\n userAddress,\n ]),\n };\n });\n\n // call Multicall\n // the first parameter of tryAggregate(false, calls) is false, which means:\n // if a token call fails, don't revert the entire transaction, but return false status\n const results = await multicallContract.tryAggregate.staticCall(\n false,\n calls,\n );\n\n // decode results\n const balances = results.map(\n (result: [boolean, string], index: number) => {\n const [success, returnData] = result;\n if (success && returnData !== \"0x\") {\n const tokenAddr = addresses[index];\n const isNative = isNativeTokenChecker(tokenAddr);\n try {\n let decoded;\n if (isNative) {\n // Native Token returns directly as uint256, decode with multicallInterface\n decoded = multicallInterface.decodeFunctionResult(\n \"getEthBalance\",\n returnData,\n );\n } else {\n // ERC20 returns also uint256, decode with erc20Interface\n decoded = erc20Interface.decodeFunctionResult(\n \"balanceOf\",\n returnData,\n );\n }\n // decode returned bytes data\n // const decoded = erc20Interface.decodeFunctionResult(\n // \"balanceOf\",\n // returnData,\n // );\n // decoded[0] is BigInt, need to explicitly convert to string\n return decoded?.[0]?.toString() || \"0\";\n } catch (error) {\n // if decoding fails, return \"0\"\n console.warn(\"Failed to decode balanceOf result:\", error);\n return \"0\";\n }\n } else {\n // if call fails (e.g. target is not a contract, or is an error address), return \"0\"\n return \"0\";\n }\n },\n );\n\n return balances;\n } catch (error) {\n console.error(\"getBalances error\", error);\n const parsedEthersError = await parseError(error);\n throw parsedEthersError;\n }\n }\n\n async estimateGasFee(\n contractAddress: string,\n method: string,\n payload: {\n from: string;\n to?: string;\n data: any[];\n value?: bigint;\n },\n options: {\n abi: any;\n },\n ): Promise<bigint> {\n const contract = new ethers.Contract(\n contractAddress,\n options.abi,\n this.browserProvider,\n );\n const encodeFunctionData = contract.interface.encodeFunctionData(\n method,\n payload.data,\n );\n\n const tx: ethers.TransactionRequest = {\n from: payload.from,\n to: payload.to,\n data: encodeFunctionData,\n value: payload.value,\n };\n\n let gas = BigInt(0);\n const defaultGas = BigInt(800000);\n try {\n gas = await this.browserProvider?.estimateGas(tx);\n } catch (error) {\n gas = defaultGas;\n console.error(\"estimateGasFee error\", error);\n }\n\n // current gas price\n const feeData = await this.browserProvider.getFeeData();\n\n const gasPrice = feeData.gasPrice ?? feeData.maxFeePerGas;\n\n if (!gasPrice) {\n throw new Error(\"gasPrice is not available\");\n }\n\n // transaction cost in wei\n const costInWei = gas * gasPrice;\n\n return costInWei;\n }\n}\n\nexport { EthersProvider };\n","import { DecodedError, ErrorDecoder } from \"ethers-decode-error\";\n\nconst errorDecoder = ErrorDecoder.create();\n\ntype ParsedError = DecodedError & {\n message: string;\n};\n\nexport async function parseError(rawError: any): Promise<ParsedError> {\n const error: DecodedError = await errorDecoder.decode(rawError);\n const reason = error.reason ?? \"\";\n console.error(\"parsedError\", error);\n\n return {\n ...error,\n message: replacePrefix(reason),\n };\n}\n\nfunction replacePrefix(reason: string) {\n const prefixes = [\"ethers-user-denied: \", \"ethers-unsupported: \"];\n\n if (typeof reason !== \"string\") {\n return reason;\n }\n\n for (const prefix of prefixes) {\n if (reason.startsWith(prefix)) {\n return reason.replace(prefix, \"\");\n }\n }\n\n return reason;\n}\n"],"mappings":"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","names":[]}
package/dist/index.mjs CHANGED
@@ -71,6 +71,17 @@ function replacePrefix(reason) {
71
71
  }
72
72
 
73
73
  // src/ethersProvider.ts
74
+ function isContractCallFailure(error) {
75
+ var _a;
76
+ if (!ethers.isError(error, "CALL_EXCEPTION")) {
77
+ return false;
78
+ }
79
+ if (error.data !== null || error.reason !== null || error.revert !== null) {
80
+ return true;
81
+ }
82
+ const rpcError = (_a = error.info) == null ? void 0 : _a.error;
83
+ return typeof (rpcError == null ? void 0 : rpcError.message) === "string" && /execution reverted/iu.test(rpcError.message);
84
+ }
74
85
  var EthersProvider = class {
75
86
  constructor() {
76
87
  __publicField(this, "_provider");
@@ -219,6 +230,46 @@ var EthersProvider = class {
219
230
  const userAddress = yield signer.getAddress();
220
231
  const erc20Interface = new ethers.Interface(ERC20_ABI);
221
232
  const multicallInterface = new ethers.Interface(MULTICALL_ABI);
233
+ const multicallCode = yield this.browserProvider.getCode(MULTICALL3_ADDRESS);
234
+ if (multicallCode === "0x") {
235
+ return Promise.all(
236
+ addresses.map((tokenAddr) => __async(this, null, function* () {
237
+ var _a;
238
+ if (isNativeTokenChecker(tokenAddr)) {
239
+ const balance = yield this.browserProvider.getBalance(userAddress);
240
+ return balance.toString();
241
+ }
242
+ let returnData;
243
+ try {
244
+ returnData = yield this.browserProvider.call({
245
+ to: tokenAddr,
246
+ data: erc20Interface.encodeFunctionData("balanceOf", [
247
+ userAddress
248
+ ])
249
+ });
250
+ } catch (error) {
251
+ if (isContractCallFailure(error)) {
252
+ console.warn("Failed to fetch token balance:", error);
253
+ return "0";
254
+ }
255
+ throw error;
256
+ }
257
+ if (returnData === "0x") {
258
+ return "0";
259
+ }
260
+ try {
261
+ const decoded = erc20Interface.decodeFunctionResult(
262
+ "balanceOf",
263
+ returnData
264
+ );
265
+ return ((_a = decoded == null ? void 0 : decoded[0]) == null ? void 0 : _a.toString()) || "0";
266
+ } catch (error) {
267
+ console.warn("Failed to decode balanceOf result:", error);
268
+ return "0";
269
+ }
270
+ }))
271
+ );
272
+ }
222
273
  const multicallContract = new ethers.Contract(
223
274
  MULTICALL3_ADDRESS,
224
275
  MULTICALL_ABI,
@@ -1 +1 @@
1
- {"version":3,"sources":["../src/ethersProvider.ts","../src/parseError.ts"],"sourcesContent":["import { Web3Provider } from \"@kodiak-finance/orderly-default-evm-adapter\";\nimport { API, isNativeTokenChecker } from \"@kodiak-finance/orderly-types\";\nimport { BrowserProvider, Eip1193Provider, ethers } from \"ethers\";\nimport { parseError } from \"./parseError\";\n\nclass EthersProvider implements Web3Provider {\n private _provider!: BrowserProvider;\n private _originalProvider!: Eip1193Provider;\n\n parseUnits(amount: string, decimals?: number): string {\n return ethers.parseUnits(amount, decimals).toString();\n }\n\n formatUnits(amount: string, decimals?: number): string {\n return ethers.formatUnits(amount, decimals);\n }\n\n set provider(provider: Eip1193Provider) {\n this._provider = new BrowserProvider(provider, \"any\");\n this._originalProvider = provider;\n }\n\n get browserProvider(): BrowserProvider {\n if (!this._provider) {\n throw new Error(\"browserProvider is not initialized\");\n }\n return this._provider;\n }\n\n async signTypedData(\n address: string,\n toSignatureMessage: any,\n ): Promise<string> {\n return await this.browserProvider?.send(\"eth_signTypedData_v4\", [\n address,\n toSignatureMessage,\n ]);\n }\n\n async call(\n address: string,\n method: string,\n params: any[],\n options: { abi: any },\n ): Promise<any> {\n const writeMethod: string[] = [\"approve\"];\n // @ts-ignore\n if (this._originalProvider.agwWallet && writeMethod.includes(method)) {\n try {\n // @ts-ignore\n const transactionHash = await this._originalProvider.writeContract({\n abi: options.abi,\n address: address,\n functionName: method,\n args: params,\n });\n\n return {\n hash: transactionHash,\n };\n } catch (error) {\n // const parsedEthersError = getParsedEthersError(error as EthersError);\n // if ((error as any).message.includes(\"rejected\")) {\n // // @ts-ignore\n // throw new Error({ content: \"REJECTED_TRANSACTION\" });\n // }\n const parsedEthersError = await parseError(error);\n throw parsedEthersError;\n }\n }\n const singer = await this.browserProvider.getSigner();\n const contract = new ethers.Contract(address, options.abi, singer);\n\n return contract[method].apply(null, params).catch(async (error) => {\n const parsedEthersError = await parseError(error);\n throw parsedEthersError;\n });\n }\n\n send(method: string, params: Array<any> | Record<string, any>): Promise<any> {\n return this.browserProvider.send(method, params);\n }\n\n async sendTransaction(\n contractAddress: string,\n method: string,\n payload: { from: string; to?: string; data: any[]; value?: bigint },\n options: { abi: any },\n ): Promise<any> {\n const singer = await this.browserProvider?.getSigner();\n if (!singer) {\n throw new Error(\"singer is not exist\");\n }\n\n const contract = new ethers.Contract(\n contractAddress,\n options.abi,\n this.browserProvider,\n );\n\n // contract.interface.getAbiCoder().encode(tx.data);\n const encodeFunctionData = contract.interface.encodeFunctionData(\n method,\n payload.data,\n );\n\n const tx: ethers.TransactionRequest = {\n from: payload.from,\n to: payload.to,\n data: encodeFunctionData,\n value: payload.value,\n };\n\n try {\n // for agw wallet\n if (method === \"depositTo\") {\n // @ts-ignore\n return await this._originalProvider.sendTransaction({\n to: contractAddress,\n data: encodeFunctionData,\n value: payload.value,\n });\n }\n return await singer.sendTransaction(tx);\n } catch (error) {\n const parsedEthersError = await parseError(error);\n throw parsedEthersError;\n }\n }\n\n async pollTransactionReceiptWithBackoff(\n txHash: string,\n baseInterval = 1000,\n maxInterval = 6000,\n maxRetries = 30,\n ) {\n let interval = baseInterval;\n let retries = 0;\n\n while (retries < maxRetries) {\n try {\n const receipt =\n await this.browserProvider!.getTransactionReceipt(txHash);\n if (receipt) {\n // completed, get receipt\n return receipt;\n }\n } catch (error) {\n // waiting\n }\n\n await new Promise((resolve) => setTimeout(resolve, interval));\n\n interval = Math.min(interval * 2, maxInterval);\n retries++;\n }\n\n throw new Error(\"Transaction did not complete after maximum retries.\");\n }\n\n callOnChain(\n chain: API.NetworkInfos,\n address: string,\n method: string,\n params: any[],\n options: { abi: any },\n ): Promise<any> {\n const provider = new ethers.JsonRpcProvider(chain.public_rpc_url);\n\n const contract = new ethers.Contract(address, options.abi, provider);\n\n return contract[method].apply(null, params).catch(async (error) => {\n const parsedEthersError = await parseError(error);\n throw parsedEthersError;\n });\n }\n\n getBalance(userAddress: string): Promise<bigint> {\n return this.browserProvider!.getBalance(userAddress).then((res) => {\n return res;\n });\n }\n\n async getBalances(addresses: string[]): Promise<string[]> {\n // if addresses is empty, return empty array\n if (!addresses || addresses.length === 0) {\n return [];\n }\n\n // Multicall3 contract address, support most EVM chains\n const MULTICALL3_ADDRESS = \"0xcA11bde05977b3631167028862bE2a173976CA11\";\n\n // extended ABI, add getEthBalance\n const MULTICALL_ABI = [\n \"function tryAggregate(bool requireSuccess, tuple(address target, bytes callData)[] calls) public view returns (tuple(bool success, bytes returnData)[] returnData)\",\n \"function getEthBalance(address addr) view returns (uint256 balance)\", // Multicall3 自带的方法\n ];\n\n // simplified ERC20 ABI\n const ERC20_ABI = [\n \"function balanceOf(address account) view returns (uint256)\",\n ];\n\n try {\n // get user address\n const signer = await this.browserProvider.getSigner();\n const userAddress = await signer.getAddress();\n\n // create contract interface instance (for encoding and decoding data)\n const erc20Interface = new ethers.Interface(ERC20_ABI);\n const multicallInterface = new ethers.Interface(MULTICALL_ABI);\n const multicallContract = new ethers.Contract(\n MULTICALL3_ADDRESS,\n MULTICALL_ABI,\n this.browserProvider,\n );\n\n // build Calls array\n // we need to encode the call to balanceOf into a hex string\n const calls = addresses.map((tokenAddr) => {\n if (isNativeTokenChecker(tokenAddr)) {\n // CASE A: if it's a native token\n // target address: Multicall3 contract itself\n // call method: getEthBalance(user)\n return {\n target: MULTICALL3_ADDRESS,\n callData: multicallInterface.encodeFunctionData(\"getEthBalance\", [\n userAddress,\n ]),\n };\n }\n return {\n target: tokenAddr,\n callData: erc20Interface.encodeFunctionData(\"balanceOf\", [\n userAddress,\n ]),\n };\n });\n\n // call Multicall\n // the first parameter of tryAggregate(false, calls) is false, which means:\n // if a token call fails, don't revert the entire transaction, but return false status\n const results = await multicallContract.tryAggregate.staticCall(\n false,\n calls,\n );\n\n // decode results\n const balances = results.map(\n (result: [boolean, string], index: number) => {\n const [success, returnData] = result;\n if (success && returnData !== \"0x\") {\n const tokenAddr = addresses[index];\n const isNative = isNativeTokenChecker(tokenAddr);\n try {\n let decoded;\n if (isNative) {\n // Native Token returns directly as uint256, decode with multicallInterface\n decoded = multicallInterface.decodeFunctionResult(\n \"getEthBalance\",\n returnData,\n );\n } else {\n // ERC20 returns also uint256, decode with erc20Interface\n decoded = erc20Interface.decodeFunctionResult(\n \"balanceOf\",\n returnData,\n );\n }\n // decode returned bytes data\n // const decoded = erc20Interface.decodeFunctionResult(\n // \"balanceOf\",\n // returnData,\n // );\n // decoded[0] is BigInt, need to explicitly convert to string\n return decoded?.[0]?.toString() || \"0\";\n } catch (error) {\n // if decoding fails, return \"0\"\n console.warn(\"Failed to decode balanceOf result:\", error);\n return \"0\";\n }\n } else {\n // if call fails (e.g. target is not a contract, or is an error address), return \"0\"\n return \"0\";\n }\n },\n );\n\n return balances;\n } catch (error) {\n console.error(\"getBalances error\", error);\n const parsedEthersError = await parseError(error);\n throw parsedEthersError;\n }\n }\n\n async estimateGasFee(\n contractAddress: string,\n method: string,\n payload: {\n from: string;\n to?: string;\n data: any[];\n value?: bigint;\n },\n options: {\n abi: any;\n },\n ): Promise<bigint> {\n const contract = new ethers.Contract(\n contractAddress,\n options.abi,\n this.browserProvider,\n );\n const encodeFunctionData = contract.interface.encodeFunctionData(\n method,\n payload.data,\n );\n\n const tx: ethers.TransactionRequest = {\n from: payload.from,\n to: payload.to,\n data: encodeFunctionData,\n value: payload.value,\n };\n\n let gas = BigInt(0);\n const defaultGas = BigInt(800000);\n try {\n gas = await this.browserProvider?.estimateGas(tx);\n } catch (error) {\n gas = defaultGas;\n console.error(\"estimateGasFee error\", error);\n }\n\n // current gas price\n const feeData = await this.browserProvider.getFeeData();\n\n const gasPrice = feeData.gasPrice ?? feeData.maxFeePerGas;\n\n if (!gasPrice) {\n throw new Error(\"gasPrice is not available\");\n }\n\n // transaction cost in wei\n const costInWei = gas * gasPrice;\n\n return costInWei;\n }\n}\n\nexport { EthersProvider };\n","import { DecodedError, ErrorDecoder } from \"ethers-decode-error\";\n\nconst errorDecoder = ErrorDecoder.create();\n\ntype ParsedError = DecodedError & {\n message: string;\n};\n\nexport async function parseError(rawError: any): Promise<ParsedError> {\n const error: DecodedError = await errorDecoder.decode(rawError);\n const reason = error.reason ?? \"\";\n console.error(\"parsedError\", error);\n\n return {\n ...error,\n message: replacePrefix(reason),\n };\n}\n\nfunction replacePrefix(reason: string) {\n const prefixes = [\"ethers-user-denied: \", \"ethers-unsupported: \"];\n\n if (typeof reason !== \"string\") {\n return reason;\n }\n\n for (const prefix of prefixes) {\n if (reason.startsWith(prefix)) {\n return reason.replace(prefix, \"\");\n }\n }\n\n return reason;\n}\n"],"mappings":"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","names":[]}
1
+ {"version":3,"sources":["../src/ethersProvider.ts","../src/parseError.ts"],"sourcesContent":["import { Web3Provider } from \"@kodiak-finance/orderly-default-evm-adapter\";\nimport { API, isNativeTokenChecker } from \"@kodiak-finance/orderly-types\";\nimport { BrowserProvider, Eip1193Provider, ethers } from \"ethers\";\nimport { parseError } from \"./parseError\";\n\nfunction isContractCallFailure(error: unknown): boolean {\n if (!ethers.isError(error, \"CALL_EXCEPTION\")) {\n return false;\n }\n\n if (error.data !== null || error.reason !== null || error.revert !== null) {\n return true;\n }\n\n const rpcError = error.info?.error as { message?: unknown } | undefined;\n return (\n typeof rpcError?.message === \"string\" &&\n /execution reverted/iu.test(rpcError.message)\n );\n}\n\nclass EthersProvider implements Web3Provider {\n private _provider!: BrowserProvider;\n private _originalProvider!: Eip1193Provider;\n\n parseUnits(amount: string, decimals?: number): string {\n return ethers.parseUnits(amount, decimals).toString();\n }\n\n formatUnits(amount: string, decimals?: number): string {\n return ethers.formatUnits(amount, decimals);\n }\n\n set provider(provider: Eip1193Provider) {\n this._provider = new BrowserProvider(provider, \"any\");\n this._originalProvider = provider;\n }\n\n get browserProvider(): BrowserProvider {\n if (!this._provider) {\n throw new Error(\"browserProvider is not initialized\");\n }\n return this._provider;\n }\n\n async signTypedData(\n address: string,\n toSignatureMessage: any,\n ): Promise<string> {\n return await this.browserProvider?.send(\"eth_signTypedData_v4\", [\n address,\n toSignatureMessage,\n ]);\n }\n\n async call(\n address: string,\n method: string,\n params: any[],\n options: { abi: any },\n ): Promise<any> {\n const writeMethod: string[] = [\"approve\"];\n // @ts-ignore\n if (this._originalProvider.agwWallet && writeMethod.includes(method)) {\n try {\n // @ts-ignore\n const transactionHash = await this._originalProvider.writeContract({\n abi: options.abi,\n address: address,\n functionName: method,\n args: params,\n });\n\n return {\n hash: transactionHash,\n };\n } catch (error) {\n // const parsedEthersError = getParsedEthersError(error as EthersError);\n // if ((error as any).message.includes(\"rejected\")) {\n // // @ts-ignore\n // throw new Error({ content: \"REJECTED_TRANSACTION\" });\n // }\n const parsedEthersError = await parseError(error);\n throw parsedEthersError;\n }\n }\n const singer = await this.browserProvider.getSigner();\n const contract = new ethers.Contract(address, options.abi, singer);\n\n return contract[method].apply(null, params).catch(async (error) => {\n const parsedEthersError = await parseError(error);\n throw parsedEthersError;\n });\n }\n\n send(method: string, params: Array<any> | Record<string, any>): Promise<any> {\n return this.browserProvider.send(method, params);\n }\n\n async sendTransaction(\n contractAddress: string,\n method: string,\n payload: { from: string; to?: string; data: any[]; value?: bigint },\n options: { abi: any },\n ): Promise<any> {\n const singer = await this.browserProvider?.getSigner();\n if (!singer) {\n throw new Error(\"singer is not exist\");\n }\n\n const contract = new ethers.Contract(\n contractAddress,\n options.abi,\n this.browserProvider,\n );\n\n // contract.interface.getAbiCoder().encode(tx.data);\n const encodeFunctionData = contract.interface.encodeFunctionData(\n method,\n payload.data,\n );\n\n const tx: ethers.TransactionRequest = {\n from: payload.from,\n to: payload.to,\n data: encodeFunctionData,\n value: payload.value,\n };\n\n try {\n // for agw wallet\n if (method === \"depositTo\") {\n // @ts-ignore\n return await this._originalProvider.sendTransaction({\n to: contractAddress,\n data: encodeFunctionData,\n value: payload.value,\n });\n }\n return await singer.sendTransaction(tx);\n } catch (error) {\n const parsedEthersError = await parseError(error);\n throw parsedEthersError;\n }\n }\n\n async pollTransactionReceiptWithBackoff(\n txHash: string,\n baseInterval = 1000,\n maxInterval = 6000,\n maxRetries = 30,\n ) {\n let interval = baseInterval;\n let retries = 0;\n\n while (retries < maxRetries) {\n try {\n const receipt =\n await this.browserProvider!.getTransactionReceipt(txHash);\n if (receipt) {\n // completed, get receipt\n return receipt;\n }\n } catch (error) {\n // waiting\n }\n\n await new Promise((resolve) => setTimeout(resolve, interval));\n\n interval = Math.min(interval * 2, maxInterval);\n retries++;\n }\n\n throw new Error(\"Transaction did not complete after maximum retries.\");\n }\n\n callOnChain(\n chain: API.NetworkInfos,\n address: string,\n method: string,\n params: any[],\n options: { abi: any },\n ): Promise<any> {\n const provider = new ethers.JsonRpcProvider(chain.public_rpc_url);\n\n const contract = new ethers.Contract(address, options.abi, provider);\n\n return contract[method].apply(null, params).catch(async (error) => {\n const parsedEthersError = await parseError(error);\n throw parsedEthersError;\n });\n }\n\n getBalance(userAddress: string): Promise<bigint> {\n return this.browserProvider!.getBalance(userAddress).then((res) => {\n return res;\n });\n }\n\n async getBalances(addresses: string[]): Promise<string[]> {\n // if addresses is empty, return empty array\n if (!addresses || addresses.length === 0) {\n return [];\n }\n\n // Multicall3 contract address, support most EVM chains\n const MULTICALL3_ADDRESS = \"0xcA11bde05977b3631167028862bE2a173976CA11\";\n\n // extended ABI, add getEthBalance\n const MULTICALL_ABI = [\n \"function tryAggregate(bool requireSuccess, tuple(address target, bytes callData)[] calls) public view returns (tuple(bool success, bytes returnData)[] returnData)\",\n \"function getEthBalance(address addr) view returns (uint256 balance)\", // Multicall3 自带的方法\n ];\n\n // simplified ERC20 ABI\n const ERC20_ABI = [\n \"function balanceOf(address account) view returns (uint256)\",\n ];\n\n try {\n // get user address\n const signer = await this.browserProvider.getSigner();\n const userAddress = await signer.getAddress();\n const erc20Interface = new ethers.Interface(ERC20_ABI);\n const multicallInterface = new ethers.Interface(MULTICALL_ABI);\n\n const multicallCode =\n await this.browserProvider.getCode(MULTICALL3_ADDRESS);\n if (multicallCode === \"0x\") {\n return Promise.all(\n addresses.map(async (tokenAddr) => {\n if (isNativeTokenChecker(tokenAddr)) {\n const balance =\n await this.browserProvider.getBalance(userAddress);\n return balance.toString();\n }\n\n let returnData: string;\n try {\n returnData = await this.browserProvider.call({\n to: tokenAddr,\n data: erc20Interface.encodeFunctionData(\"balanceOf\", [\n userAddress,\n ]),\n });\n } catch (error) {\n if (isContractCallFailure(error)) {\n console.warn(\"Failed to fetch token balance:\", error);\n return \"0\";\n }\n throw error;\n }\n\n if (returnData === \"0x\") {\n return \"0\";\n }\n\n try {\n const decoded = erc20Interface.decodeFunctionResult(\n \"balanceOf\",\n returnData,\n );\n return decoded?.[0]?.toString() || \"0\";\n } catch (error) {\n console.warn(\"Failed to decode balanceOf result:\", error);\n return \"0\";\n }\n }),\n );\n }\n\n // create contract interface instance (for encoding and decoding data)\n const multicallContract = new ethers.Contract(\n MULTICALL3_ADDRESS,\n MULTICALL_ABI,\n this.browserProvider,\n );\n\n // build Calls array\n // we need to encode the call to balanceOf into a hex string\n const calls = addresses.map((tokenAddr) => {\n if (isNativeTokenChecker(tokenAddr)) {\n // CASE A: if it's a native token\n // target address: Multicall3 contract itself\n // call method: getEthBalance(user)\n return {\n target: MULTICALL3_ADDRESS,\n callData: multicallInterface.encodeFunctionData(\"getEthBalance\", [\n userAddress,\n ]),\n };\n }\n return {\n target: tokenAddr,\n callData: erc20Interface.encodeFunctionData(\"balanceOf\", [\n userAddress,\n ]),\n };\n });\n\n // call Multicall\n // the first parameter of tryAggregate(false, calls) is false, which means:\n // if a token call fails, don't revert the entire transaction, but return false status\n const results = await multicallContract.tryAggregate.staticCall(\n false,\n calls,\n );\n\n // decode results\n const balances = results.map(\n (result: [boolean, string], index: number) => {\n const [success, returnData] = result;\n if (success && returnData !== \"0x\") {\n const tokenAddr = addresses[index];\n const isNative = isNativeTokenChecker(tokenAddr);\n try {\n let decoded;\n if (isNative) {\n // Native Token returns directly as uint256, decode with multicallInterface\n decoded = multicallInterface.decodeFunctionResult(\n \"getEthBalance\",\n returnData,\n );\n } else {\n // ERC20 returns also uint256, decode with erc20Interface\n decoded = erc20Interface.decodeFunctionResult(\n \"balanceOf\",\n returnData,\n );\n }\n // decode returned bytes data\n // const decoded = erc20Interface.decodeFunctionResult(\n // \"balanceOf\",\n // returnData,\n // );\n // decoded[0] is BigInt, need to explicitly convert to string\n return decoded?.[0]?.toString() || \"0\";\n } catch (error) {\n // if decoding fails, return \"0\"\n console.warn(\"Failed to decode balanceOf result:\", error);\n return \"0\";\n }\n } else {\n // if call fails (e.g. target is not a contract, or is an error address), return \"0\"\n return \"0\";\n }\n },\n );\n\n return balances;\n } catch (error) {\n console.error(\"getBalances error\", error);\n const parsedEthersError = await parseError(error);\n throw parsedEthersError;\n }\n }\n\n async estimateGasFee(\n contractAddress: string,\n method: string,\n payload: {\n from: string;\n to?: string;\n data: any[];\n value?: bigint;\n },\n options: {\n abi: any;\n },\n ): Promise<bigint> {\n const contract = new ethers.Contract(\n contractAddress,\n options.abi,\n this.browserProvider,\n );\n const encodeFunctionData = contract.interface.encodeFunctionData(\n method,\n payload.data,\n );\n\n const tx: ethers.TransactionRequest = {\n from: payload.from,\n to: payload.to,\n data: encodeFunctionData,\n value: payload.value,\n };\n\n let gas = BigInt(0);\n const defaultGas = BigInt(800000);\n try {\n gas = await this.browserProvider?.estimateGas(tx);\n } catch (error) {\n gas = defaultGas;\n console.error(\"estimateGasFee error\", error);\n }\n\n // current gas price\n const feeData = await this.browserProvider.getFeeData();\n\n const gasPrice = feeData.gasPrice ?? feeData.maxFeePerGas;\n\n if (!gasPrice) {\n throw new Error(\"gasPrice is not available\");\n }\n\n // transaction cost in wei\n const costInWei = gas * gasPrice;\n\n return costInWei;\n }\n}\n\nexport { EthersProvider };\n","import { DecodedError, ErrorDecoder } from \"ethers-decode-error\";\n\nconst errorDecoder = ErrorDecoder.create();\n\ntype ParsedError = DecodedError & {\n message: string;\n};\n\nexport async function parseError(rawError: any): Promise<ParsedError> {\n const error: DecodedError = await errorDecoder.decode(rawError);\n const reason = error.reason ?? \"\";\n console.error(\"parsedError\", error);\n\n return {\n ...error,\n message: replacePrefix(reason),\n };\n}\n\nfunction replacePrefix(reason: string) {\n const prefixes = [\"ethers-user-denied: \", \"ethers-unsupported: \"];\n\n if (typeof reason !== \"string\") {\n return reason;\n }\n\n for (const prefix of prefixes) {\n if (reason.startsWith(prefix)) {\n return reason.replace(prefix, \"\");\n }\n }\n\n return reason;\n}\n"],"mappings":"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","names":[]}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@kodiak-finance/orderly-web3-provider-ethers",
3
- "version": "2.9.4",
3
+ "version": "2.9.5",
4
4
  "description": "",
5
5
  "main": "dist/index.js",
6
6
  "module": "dist/index.mjs",
@@ -15,14 +15,14 @@
15
15
  "dependencies": {
16
16
  "ethers": "^6.16.0",
17
17
  "ethers-decode-error": "^2.1.3",
18
- "@kodiak-finance/orderly-default-evm-adapter": "2.9.4",
19
- "@kodiak-finance/orderly-types": "2.9.4"
18
+ "@kodiak-finance/orderly-default-evm-adapter": "2.9.5",
19
+ "@kodiak-finance/orderly-types": "2.9.5"
20
20
  },
21
21
  "devDependencies": {
22
22
  "jest": "^29.7.0",
23
23
  "tsup": "^8.5.1",
24
24
  "typescript": "^5.1.6",
25
- "tsconfig": "0.11.35"
25
+ "tsconfig": "0.11.36"
26
26
  },
27
27
  "scripts": {
28
28
  "build": "tsup",