@orderly.network/web3-provider-ethers 2.9.1 → 2.10.0-alpha.0

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.d.mts CHANGED
@@ -27,6 +27,15 @@ declare class EthersProvider implements Web3Provider {
27
27
  abi: any;
28
28
  }): Promise<any>;
29
29
  getBalance(userAddress: string): Promise<bigint>;
30
+ getBalances(addresses: string[]): Promise<string[]>;
31
+ estimateGasFee(contractAddress: string, method: string, payload: {
32
+ from: string;
33
+ to?: string;
34
+ data: any[];
35
+ value?: bigint;
36
+ }, options: {
37
+ abi: any;
38
+ }): Promise<bigint>;
30
39
  }
31
40
 
32
41
  export { EthersProvider };
package/dist/index.d.ts CHANGED
@@ -27,6 +27,15 @@ declare class EthersProvider implements Web3Provider {
27
27
  abi: any;
28
28
  }): Promise<any>;
29
29
  getBalance(userAddress: string): Promise<bigint>;
30
+ getBalances(addresses: string[]): Promise<string[]>;
31
+ estimateGasFee(contractAddress: string, method: string, payload: {
32
+ from: string;
33
+ to?: string;
34
+ data: any[];
35
+ value?: bigint;
36
+ }, options: {
37
+ abi: any;
38
+ }): Promise<bigint>;
30
39
  }
31
40
 
32
41
  export { EthersProvider };
package/dist/index.js CHANGED
@@ -64,6 +64,7 @@ module.exports = __toCommonJS(index_exports);
64
64
 
65
65
  // src/ethersProvider.ts
66
66
  var import_ethers = require("ethers");
67
+ var import_types = require("@orderly.network/types");
67
68
 
68
69
  // src/parseError.ts
69
70
  var import_ethers_decode_error = require("ethers-decode-error");
@@ -222,6 +223,123 @@ var EthersProvider = class {
222
223
  return res;
223
224
  });
224
225
  }
226
+ getBalances(addresses) {
227
+ return __async(this, null, function* () {
228
+ if (!addresses || addresses.length === 0) {
229
+ return [];
230
+ }
231
+ const MULTICALL3_ADDRESS = "0xcA11bde05977b3631167028862bE2a173976CA11";
232
+ const MULTICALL_ABI = [
233
+ "function tryAggregate(bool requireSuccess, tuple(address target, bytes callData)[] calls) public view returns (tuple(bool success, bytes returnData)[] returnData)",
234
+ "function getEthBalance(address addr) view returns (uint256 balance)"
235
+ // Multicall3 自带的方法
236
+ ];
237
+ const ERC20_ABI = [
238
+ "function balanceOf(address account) view returns (uint256)"
239
+ ];
240
+ try {
241
+ const signer = yield this.browserProvider.getSigner();
242
+ const userAddress = yield signer.getAddress();
243
+ const erc20Interface = new import_ethers.ethers.Interface(ERC20_ABI);
244
+ const multicallInterface = new import_ethers.ethers.Interface(MULTICALL_ABI);
245
+ const multicallContract = new import_ethers.ethers.Contract(
246
+ MULTICALL3_ADDRESS,
247
+ MULTICALL_ABI,
248
+ this.browserProvider
249
+ );
250
+ const calls = addresses.map((tokenAddr) => {
251
+ if ((0, import_types.isNativeTokenChecker)(tokenAddr)) {
252
+ return {
253
+ target: MULTICALL3_ADDRESS,
254
+ callData: multicallInterface.encodeFunctionData("getEthBalance", [
255
+ userAddress
256
+ ])
257
+ };
258
+ }
259
+ return {
260
+ target: tokenAddr,
261
+ callData: erc20Interface.encodeFunctionData("balanceOf", [
262
+ userAddress
263
+ ])
264
+ };
265
+ });
266
+ const results = yield multicallContract.tryAggregate.staticCall(
267
+ false,
268
+ calls
269
+ );
270
+ const balances = results.map(
271
+ (result, index) => {
272
+ var _a;
273
+ const [success, returnData] = result;
274
+ if (success && returnData !== "0x") {
275
+ const tokenAddr = addresses[index];
276
+ const isNative = (0, import_types.isNativeTokenChecker)(tokenAddr);
277
+ try {
278
+ let decoded;
279
+ if (isNative) {
280
+ decoded = multicallInterface.decodeFunctionResult(
281
+ "getEthBalance",
282
+ returnData
283
+ );
284
+ } else {
285
+ decoded = erc20Interface.decodeFunctionResult(
286
+ "balanceOf",
287
+ returnData
288
+ );
289
+ }
290
+ return ((_a = decoded == null ? void 0 : decoded[0]) == null ? void 0 : _a.toString()) || "0";
291
+ } catch (error) {
292
+ console.warn("Failed to decode balanceOf result:", error);
293
+ return "0";
294
+ }
295
+ } else {
296
+ return "0";
297
+ }
298
+ }
299
+ );
300
+ return balances;
301
+ } catch (error) {
302
+ console.error("getBalances error", error);
303
+ const parsedEthersError = yield parseError(error);
304
+ throw parsedEthersError;
305
+ }
306
+ });
307
+ }
308
+ estimateGasFee(contractAddress, method, payload, options) {
309
+ return __async(this, null, function* () {
310
+ var _a, _b;
311
+ const contract = new import_ethers.ethers.Contract(
312
+ contractAddress,
313
+ options.abi,
314
+ this.browserProvider
315
+ );
316
+ const encodeFunctionData = contract.interface.encodeFunctionData(
317
+ method,
318
+ payload.data
319
+ );
320
+ const tx = {
321
+ from: payload.from,
322
+ to: payload.to,
323
+ data: encodeFunctionData,
324
+ value: payload.value
325
+ };
326
+ let gas = BigInt(0);
327
+ const defaultGas = BigInt(8e5);
328
+ try {
329
+ gas = yield (_a = this.browserProvider) == null ? void 0 : _a.estimateGas(tx);
330
+ } catch (error) {
331
+ gas = defaultGas;
332
+ console.error("estimateGasFee error", error);
333
+ }
334
+ const feeData = yield this.browserProvider.getFeeData();
335
+ const gasPrice = (_b = feeData.gasPrice) != null ? _b : feeData.maxFeePerGas;
336
+ if (!gasPrice) {
337
+ throw new Error("gasPrice is not available");
338
+ }
339
+ const costInWei = gas * gasPrice;
340
+ return costInWei;
341
+ });
342
+ }
225
343
  };
226
344
  // Annotate the CommonJS export names for ESM import in node:
227
345
  0 && (module.exports = {
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 { BrowserProvider, Eip1193Provider, ethers } from \"ethers\";\nimport { Web3Provider } from \"@orderly.network/default-evm-adapter\";\nimport { API } from \"@orderly.network/types\";\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\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 { BrowserProvider, Eip1193Provider, ethers } from \"ethers\";\nimport { Web3Provider } from \"@orderly.network/default-evm-adapter\";\nimport { API, isNativeTokenChecker } from \"@orderly.network/types\";\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":[]}
package/dist/index.mjs CHANGED
@@ -41,6 +41,7 @@ var __async = (__this, __arguments, generator) => {
41
41
 
42
42
  // src/ethersProvider.ts
43
43
  import { BrowserProvider, ethers } from "ethers";
44
+ import { isNativeTokenChecker } from "@orderly.network/types";
44
45
 
45
46
  // src/parseError.ts
46
47
  import { ErrorDecoder } from "ethers-decode-error";
@@ -199,6 +200,123 @@ var EthersProvider = class {
199
200
  return res;
200
201
  });
201
202
  }
203
+ getBalances(addresses) {
204
+ return __async(this, null, function* () {
205
+ if (!addresses || addresses.length === 0) {
206
+ return [];
207
+ }
208
+ const MULTICALL3_ADDRESS = "0xcA11bde05977b3631167028862bE2a173976CA11";
209
+ const MULTICALL_ABI = [
210
+ "function tryAggregate(bool requireSuccess, tuple(address target, bytes callData)[] calls) public view returns (tuple(bool success, bytes returnData)[] returnData)",
211
+ "function getEthBalance(address addr) view returns (uint256 balance)"
212
+ // Multicall3 自带的方法
213
+ ];
214
+ const ERC20_ABI = [
215
+ "function balanceOf(address account) view returns (uint256)"
216
+ ];
217
+ try {
218
+ const signer = yield this.browserProvider.getSigner();
219
+ const userAddress = yield signer.getAddress();
220
+ const erc20Interface = new ethers.Interface(ERC20_ABI);
221
+ const multicallInterface = new ethers.Interface(MULTICALL_ABI);
222
+ const multicallContract = new ethers.Contract(
223
+ MULTICALL3_ADDRESS,
224
+ MULTICALL_ABI,
225
+ this.browserProvider
226
+ );
227
+ const calls = addresses.map((tokenAddr) => {
228
+ if (isNativeTokenChecker(tokenAddr)) {
229
+ return {
230
+ target: MULTICALL3_ADDRESS,
231
+ callData: multicallInterface.encodeFunctionData("getEthBalance", [
232
+ userAddress
233
+ ])
234
+ };
235
+ }
236
+ return {
237
+ target: tokenAddr,
238
+ callData: erc20Interface.encodeFunctionData("balanceOf", [
239
+ userAddress
240
+ ])
241
+ };
242
+ });
243
+ const results = yield multicallContract.tryAggregate.staticCall(
244
+ false,
245
+ calls
246
+ );
247
+ const balances = results.map(
248
+ (result, index) => {
249
+ var _a;
250
+ const [success, returnData] = result;
251
+ if (success && returnData !== "0x") {
252
+ const tokenAddr = addresses[index];
253
+ const isNative = isNativeTokenChecker(tokenAddr);
254
+ try {
255
+ let decoded;
256
+ if (isNative) {
257
+ decoded = multicallInterface.decodeFunctionResult(
258
+ "getEthBalance",
259
+ returnData
260
+ );
261
+ } else {
262
+ decoded = erc20Interface.decodeFunctionResult(
263
+ "balanceOf",
264
+ returnData
265
+ );
266
+ }
267
+ return ((_a = decoded == null ? void 0 : decoded[0]) == null ? void 0 : _a.toString()) || "0";
268
+ } catch (error) {
269
+ console.warn("Failed to decode balanceOf result:", error);
270
+ return "0";
271
+ }
272
+ } else {
273
+ return "0";
274
+ }
275
+ }
276
+ );
277
+ return balances;
278
+ } catch (error) {
279
+ console.error("getBalances error", error);
280
+ const parsedEthersError = yield parseError(error);
281
+ throw parsedEthersError;
282
+ }
283
+ });
284
+ }
285
+ estimateGasFee(contractAddress, method, payload, options) {
286
+ return __async(this, null, function* () {
287
+ var _a, _b;
288
+ const contract = new ethers.Contract(
289
+ contractAddress,
290
+ options.abi,
291
+ this.browserProvider
292
+ );
293
+ const encodeFunctionData = contract.interface.encodeFunctionData(
294
+ method,
295
+ payload.data
296
+ );
297
+ const tx = {
298
+ from: payload.from,
299
+ to: payload.to,
300
+ data: encodeFunctionData,
301
+ value: payload.value
302
+ };
303
+ let gas = BigInt(0);
304
+ const defaultGas = BigInt(8e5);
305
+ try {
306
+ gas = yield (_a = this.browserProvider) == null ? void 0 : _a.estimateGas(tx);
307
+ } catch (error) {
308
+ gas = defaultGas;
309
+ console.error("estimateGasFee error", error);
310
+ }
311
+ const feeData = yield this.browserProvider.getFeeData();
312
+ const gasPrice = (_b = feeData.gasPrice) != null ? _b : feeData.maxFeePerGas;
313
+ if (!gasPrice) {
314
+ throw new Error("gasPrice is not available");
315
+ }
316
+ const costInWei = gas * gasPrice;
317
+ return costInWei;
318
+ });
319
+ }
202
320
  };
203
321
  export {
204
322
  EthersProvider
@@ -1 +1 @@
1
- {"version":3,"sources":["../src/ethersProvider.ts","../src/parseError.ts"],"sourcesContent":["import { BrowserProvider, Eip1193Provider, ethers } from \"ethers\";\nimport { Web3Provider } from \"@orderly.network/default-evm-adapter\";\nimport { API } from \"@orderly.network/types\";\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\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 { BrowserProvider, Eip1193Provider, ethers } from \"ethers\";\nimport { Web3Provider } from \"@orderly.network/default-evm-adapter\";\nimport { API, isNativeTokenChecker } from \"@orderly.network/types\";\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":[]}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@orderly.network/web3-provider-ethers",
3
- "version": "2.9.1",
3
+ "version": "2.10.0-alpha.0",
4
4
  "description": "",
5
5
  "main": "dist/index.js",
6
6
  "module": "dist/index.mjs",
@@ -13,16 +13,16 @@
13
13
  "access": "public"
14
14
  },
15
15
  "dependencies": {
16
- "ethers": "^6.15.0",
16
+ "ethers": "^6.16.0",
17
17
  "ethers-decode-error": "^2.1.3",
18
- "@orderly.network/default-evm-adapter": "2.9.1",
19
- "@orderly.network/types": "2.9.1"
18
+ "@orderly.network/types": "2.10.0-alpha.0",
19
+ "@orderly.network/default-evm-adapter": "2.10.0-alpha.0"
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.12.1"
25
+ "tsconfig": "0.13.0-alpha.0"
26
26
  },
27
27
  "scripts": {
28
28
  "build": "tsup",