@kodiak-finance/orderly-web3-provider-ethers 2.8.18 → 2.8.19
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 +232 -1
- package/dist/index.js.map +1 -1
- package/dist/index.mjs +208 -1
- package/dist/index.mjs.map +1 -1
- package/package.json +4 -4
package/dist/index.js
CHANGED
|
@@ -1,2 +1,233 @@
|
|
|
1
|
-
"use strict";
|
|
1
|
+
"use strict";
|
|
2
|
+
var __defProp = Object.defineProperty;
|
|
3
|
+
var __defProps = Object.defineProperties;
|
|
4
|
+
var __getOwnPropDesc = Object.getOwnPropertyDescriptor;
|
|
5
|
+
var __getOwnPropDescs = Object.getOwnPropertyDescriptors;
|
|
6
|
+
var __getOwnPropNames = Object.getOwnPropertyNames;
|
|
7
|
+
var __getOwnPropSymbols = Object.getOwnPropertySymbols;
|
|
8
|
+
var __hasOwnProp = Object.prototype.hasOwnProperty;
|
|
9
|
+
var __propIsEnum = Object.prototype.propertyIsEnumerable;
|
|
10
|
+
var __defNormalProp = (obj, key, value) => key in obj ? __defProp(obj, key, { enumerable: true, configurable: true, writable: true, value }) : obj[key] = value;
|
|
11
|
+
var __spreadValues = (a, b) => {
|
|
12
|
+
for (var prop in b || (b = {}))
|
|
13
|
+
if (__hasOwnProp.call(b, prop))
|
|
14
|
+
__defNormalProp(a, prop, b[prop]);
|
|
15
|
+
if (__getOwnPropSymbols)
|
|
16
|
+
for (var prop of __getOwnPropSymbols(b)) {
|
|
17
|
+
if (__propIsEnum.call(b, prop))
|
|
18
|
+
__defNormalProp(a, prop, b[prop]);
|
|
19
|
+
}
|
|
20
|
+
return a;
|
|
21
|
+
};
|
|
22
|
+
var __spreadProps = (a, b) => __defProps(a, __getOwnPropDescs(b));
|
|
23
|
+
var __export = (target, all) => {
|
|
24
|
+
for (var name in all)
|
|
25
|
+
__defProp(target, name, { get: all[name], enumerable: true });
|
|
26
|
+
};
|
|
27
|
+
var __copyProps = (to, from, except, desc) => {
|
|
28
|
+
if (from && typeof from === "object" || typeof from === "function") {
|
|
29
|
+
for (let key of __getOwnPropNames(from))
|
|
30
|
+
if (!__hasOwnProp.call(to, key) && key !== except)
|
|
31
|
+
__defProp(to, key, { get: () => from[key], enumerable: !(desc = __getOwnPropDesc(from, key)) || desc.enumerable });
|
|
32
|
+
}
|
|
33
|
+
return to;
|
|
34
|
+
};
|
|
35
|
+
var __toCommonJS = (mod) => __copyProps(__defProp({}, "__esModule", { value: true }), mod);
|
|
36
|
+
var __publicField = (obj, key, value) => {
|
|
37
|
+
__defNormalProp(obj, typeof key !== "symbol" ? key + "" : key, value);
|
|
38
|
+
return value;
|
|
39
|
+
};
|
|
40
|
+
var __async = (__this, __arguments, generator) => {
|
|
41
|
+
return new Promise((resolve, reject) => {
|
|
42
|
+
var fulfilled = (value) => {
|
|
43
|
+
try {
|
|
44
|
+
step(generator.next(value));
|
|
45
|
+
} catch (e) {
|
|
46
|
+
reject(e);
|
|
47
|
+
}
|
|
48
|
+
};
|
|
49
|
+
var rejected = (value) => {
|
|
50
|
+
try {
|
|
51
|
+
step(generator.throw(value));
|
|
52
|
+
} catch (e) {
|
|
53
|
+
reject(e);
|
|
54
|
+
}
|
|
55
|
+
};
|
|
56
|
+
var step = (x) => x.done ? resolve(x.value) : Promise.resolve(x.value).then(fulfilled, rejected);
|
|
57
|
+
step((generator = generator.apply(__this, __arguments)).next());
|
|
58
|
+
});
|
|
59
|
+
};
|
|
60
|
+
|
|
61
|
+
// src/index.ts
|
|
62
|
+
var src_exports = {};
|
|
63
|
+
__export(src_exports, {
|
|
64
|
+
EthersProvider: () => EthersProvider
|
|
65
|
+
});
|
|
66
|
+
module.exports = __toCommonJS(src_exports);
|
|
67
|
+
|
|
68
|
+
// src/ethersProvider.ts
|
|
69
|
+
var import_ethers = require("ethers");
|
|
70
|
+
|
|
71
|
+
// src/parseError.ts
|
|
72
|
+
var import_ethers_decode_error = require("ethers-decode-error");
|
|
73
|
+
var errorDecoder = import_ethers_decode_error.ErrorDecoder.create();
|
|
74
|
+
function parseError(rawError) {
|
|
75
|
+
return __async(this, null, function* () {
|
|
76
|
+
var _a;
|
|
77
|
+
const error = yield errorDecoder.decode(rawError);
|
|
78
|
+
const reason = (_a = error.reason) != null ? _a : "";
|
|
79
|
+
console.error("parsedError", error);
|
|
80
|
+
return __spreadProps(__spreadValues({}, error), {
|
|
81
|
+
message: replacePrefix(reason)
|
|
82
|
+
});
|
|
83
|
+
});
|
|
84
|
+
}
|
|
85
|
+
function replacePrefix(reason) {
|
|
86
|
+
const prefixes = ["ethers-user-denied: ", "ethers-unsupported: "];
|
|
87
|
+
if (typeof reason !== "string") {
|
|
88
|
+
return reason;
|
|
89
|
+
}
|
|
90
|
+
for (const prefix of prefixes) {
|
|
91
|
+
if (reason.startsWith(prefix)) {
|
|
92
|
+
return reason.replace(prefix, "");
|
|
93
|
+
}
|
|
94
|
+
}
|
|
95
|
+
return reason;
|
|
96
|
+
}
|
|
97
|
+
|
|
98
|
+
// src/ethersProvider.ts
|
|
99
|
+
var EthersProvider = class {
|
|
100
|
+
constructor() {
|
|
101
|
+
__publicField(this, "_provider");
|
|
102
|
+
__publicField(this, "_originalProvider");
|
|
103
|
+
}
|
|
104
|
+
parseUnits(amount, decimals) {
|
|
105
|
+
return import_ethers.ethers.parseUnits(amount, decimals).toString();
|
|
106
|
+
}
|
|
107
|
+
formatUnits(amount, decimals) {
|
|
108
|
+
return import_ethers.ethers.formatUnits(amount, decimals);
|
|
109
|
+
}
|
|
110
|
+
set provider(provider) {
|
|
111
|
+
this._provider = new import_ethers.BrowserProvider(provider, "any");
|
|
112
|
+
this._originalProvider = provider;
|
|
113
|
+
}
|
|
114
|
+
get browserProvider() {
|
|
115
|
+
if (!this._provider) {
|
|
116
|
+
throw new Error("browserProvider is not initialized");
|
|
117
|
+
}
|
|
118
|
+
return this._provider;
|
|
119
|
+
}
|
|
120
|
+
signTypedData(address, toSignatureMessage) {
|
|
121
|
+
return __async(this, null, function* () {
|
|
122
|
+
var _a;
|
|
123
|
+
return yield (_a = this.browserProvider) == null ? void 0 : _a.send("eth_signTypedData_v4", [
|
|
124
|
+
address,
|
|
125
|
+
toSignatureMessage
|
|
126
|
+
]);
|
|
127
|
+
});
|
|
128
|
+
}
|
|
129
|
+
call(address, method, params, options) {
|
|
130
|
+
return __async(this, null, function* () {
|
|
131
|
+
const writeMethod = ["approve"];
|
|
132
|
+
if (this._originalProvider.agwWallet && writeMethod.includes(method)) {
|
|
133
|
+
try {
|
|
134
|
+
const transactionHash = yield this._originalProvider.writeContract({
|
|
135
|
+
abi: options.abi,
|
|
136
|
+
address,
|
|
137
|
+
functionName: method,
|
|
138
|
+
args: params
|
|
139
|
+
});
|
|
140
|
+
return {
|
|
141
|
+
hash: transactionHash
|
|
142
|
+
};
|
|
143
|
+
} catch (error) {
|
|
144
|
+
const parsedEthersError = yield parseError(error);
|
|
145
|
+
throw parsedEthersError;
|
|
146
|
+
}
|
|
147
|
+
}
|
|
148
|
+
const singer = yield this.browserProvider.getSigner();
|
|
149
|
+
const contract = new import_ethers.ethers.Contract(address, options.abi, singer);
|
|
150
|
+
return contract[method].apply(null, params).catch((error) => __async(this, null, function* () {
|
|
151
|
+
const parsedEthersError = yield parseError(error);
|
|
152
|
+
throw parsedEthersError;
|
|
153
|
+
}));
|
|
154
|
+
});
|
|
155
|
+
}
|
|
156
|
+
send(method, params) {
|
|
157
|
+
return this.browserProvider.send(method, params);
|
|
158
|
+
}
|
|
159
|
+
sendTransaction(contractAddress, method, payload, options) {
|
|
160
|
+
return __async(this, null, function* () {
|
|
161
|
+
var _a;
|
|
162
|
+
const singer = yield (_a = this.browserProvider) == null ? void 0 : _a.getSigner();
|
|
163
|
+
if (!singer) {
|
|
164
|
+
throw new Error("singer is not exist");
|
|
165
|
+
}
|
|
166
|
+
const contract = new import_ethers.ethers.Contract(
|
|
167
|
+
contractAddress,
|
|
168
|
+
options.abi,
|
|
169
|
+
this.browserProvider
|
|
170
|
+
);
|
|
171
|
+
const encodeFunctionData = contract.interface.encodeFunctionData(
|
|
172
|
+
method,
|
|
173
|
+
payload.data
|
|
174
|
+
);
|
|
175
|
+
const tx = {
|
|
176
|
+
from: payload.from,
|
|
177
|
+
to: payload.to,
|
|
178
|
+
data: encodeFunctionData,
|
|
179
|
+
value: payload.value
|
|
180
|
+
};
|
|
181
|
+
try {
|
|
182
|
+
if (method === "depositTo") {
|
|
183
|
+
return yield this._originalProvider.sendTransaction({
|
|
184
|
+
to: contractAddress,
|
|
185
|
+
data: encodeFunctionData,
|
|
186
|
+
value: payload.value
|
|
187
|
+
});
|
|
188
|
+
}
|
|
189
|
+
return yield singer.sendTransaction(tx);
|
|
190
|
+
} catch (error) {
|
|
191
|
+
const parsedEthersError = yield parseError(error);
|
|
192
|
+
throw parsedEthersError;
|
|
193
|
+
}
|
|
194
|
+
});
|
|
195
|
+
}
|
|
196
|
+
pollTransactionReceiptWithBackoff(txHash, baseInterval = 1e3, maxInterval = 6e3, maxRetries = 30) {
|
|
197
|
+
return __async(this, null, function* () {
|
|
198
|
+
let interval = baseInterval;
|
|
199
|
+
let retries = 0;
|
|
200
|
+
while (retries < maxRetries) {
|
|
201
|
+
try {
|
|
202
|
+
const receipt = yield this.browserProvider.getTransactionReceipt(txHash);
|
|
203
|
+
if (receipt) {
|
|
204
|
+
return receipt;
|
|
205
|
+
}
|
|
206
|
+
} catch (error) {
|
|
207
|
+
}
|
|
208
|
+
yield new Promise((resolve) => setTimeout(resolve, interval));
|
|
209
|
+
interval = Math.min(interval * 2, maxInterval);
|
|
210
|
+
retries++;
|
|
211
|
+
}
|
|
212
|
+
throw new Error("Transaction did not complete after maximum retries.");
|
|
213
|
+
});
|
|
214
|
+
}
|
|
215
|
+
callOnChain(chain, address, method, params, options) {
|
|
216
|
+
const provider = new import_ethers.ethers.JsonRpcProvider(chain.public_rpc_url);
|
|
217
|
+
const contract = new import_ethers.ethers.Contract(address, options.abi, provider);
|
|
218
|
+
return contract[method].apply(null, params).catch((error) => __async(this, null, function* () {
|
|
219
|
+
const parsedEthersError = yield parseError(error);
|
|
220
|
+
throw parsedEthersError;
|
|
221
|
+
}));
|
|
222
|
+
}
|
|
223
|
+
getBalance(userAddress) {
|
|
224
|
+
return this.browserProvider.getBalance(userAddress).then((res) => {
|
|
225
|
+
return res;
|
|
226
|
+
});
|
|
227
|
+
}
|
|
228
|
+
};
|
|
229
|
+
// Annotate the CommonJS export names for ESM import in node:
|
|
230
|
+
0 && (module.exports = {
|
|
231
|
+
EthersProvider
|
|
232
|
+
});
|
|
2
233
|
//# sourceMappingURL=index.js.map
|
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 \"@kodiak-finance/orderly-default-evm-adapter\";\nimport { API } from \"@kodiak-finance/orderly-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":"
|
|
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 \"@kodiak-finance/orderly-default-evm-adapter\";\nimport { API } from \"@kodiak-finance/orderly-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":[]}
|
package/dist/index.mjs
CHANGED
|
@@ -1,2 +1,209 @@
|
|
|
1
|
-
var
|
|
1
|
+
var __defProp = Object.defineProperty;
|
|
2
|
+
var __defProps = Object.defineProperties;
|
|
3
|
+
var __getOwnPropDescs = Object.getOwnPropertyDescriptors;
|
|
4
|
+
var __getOwnPropSymbols = Object.getOwnPropertySymbols;
|
|
5
|
+
var __hasOwnProp = Object.prototype.hasOwnProperty;
|
|
6
|
+
var __propIsEnum = Object.prototype.propertyIsEnumerable;
|
|
7
|
+
var __defNormalProp = (obj, key, value) => key in obj ? __defProp(obj, key, { enumerable: true, configurable: true, writable: true, value }) : obj[key] = value;
|
|
8
|
+
var __spreadValues = (a, b) => {
|
|
9
|
+
for (var prop in b || (b = {}))
|
|
10
|
+
if (__hasOwnProp.call(b, prop))
|
|
11
|
+
__defNormalProp(a, prop, b[prop]);
|
|
12
|
+
if (__getOwnPropSymbols)
|
|
13
|
+
for (var prop of __getOwnPropSymbols(b)) {
|
|
14
|
+
if (__propIsEnum.call(b, prop))
|
|
15
|
+
__defNormalProp(a, prop, b[prop]);
|
|
16
|
+
}
|
|
17
|
+
return a;
|
|
18
|
+
};
|
|
19
|
+
var __spreadProps = (a, b) => __defProps(a, __getOwnPropDescs(b));
|
|
20
|
+
var __publicField = (obj, key, value) => {
|
|
21
|
+
__defNormalProp(obj, typeof key !== "symbol" ? key + "" : key, value);
|
|
22
|
+
return value;
|
|
23
|
+
};
|
|
24
|
+
var __async = (__this, __arguments, generator) => {
|
|
25
|
+
return new Promise((resolve, reject) => {
|
|
26
|
+
var fulfilled = (value) => {
|
|
27
|
+
try {
|
|
28
|
+
step(generator.next(value));
|
|
29
|
+
} catch (e) {
|
|
30
|
+
reject(e);
|
|
31
|
+
}
|
|
32
|
+
};
|
|
33
|
+
var rejected = (value) => {
|
|
34
|
+
try {
|
|
35
|
+
step(generator.throw(value));
|
|
36
|
+
} catch (e) {
|
|
37
|
+
reject(e);
|
|
38
|
+
}
|
|
39
|
+
};
|
|
40
|
+
var step = (x) => x.done ? resolve(x.value) : Promise.resolve(x.value).then(fulfilled, rejected);
|
|
41
|
+
step((generator = generator.apply(__this, __arguments)).next());
|
|
42
|
+
});
|
|
43
|
+
};
|
|
44
|
+
|
|
45
|
+
// src/ethersProvider.ts
|
|
46
|
+
import { BrowserProvider, ethers } from "ethers";
|
|
47
|
+
|
|
48
|
+
// src/parseError.ts
|
|
49
|
+
import { ErrorDecoder } from "ethers-decode-error";
|
|
50
|
+
var errorDecoder = ErrorDecoder.create();
|
|
51
|
+
function parseError(rawError) {
|
|
52
|
+
return __async(this, null, function* () {
|
|
53
|
+
var _a;
|
|
54
|
+
const error = yield errorDecoder.decode(rawError);
|
|
55
|
+
const reason = (_a = error.reason) != null ? _a : "";
|
|
56
|
+
console.error("parsedError", error);
|
|
57
|
+
return __spreadProps(__spreadValues({}, error), {
|
|
58
|
+
message: replacePrefix(reason)
|
|
59
|
+
});
|
|
60
|
+
});
|
|
61
|
+
}
|
|
62
|
+
function replacePrefix(reason) {
|
|
63
|
+
const prefixes = ["ethers-user-denied: ", "ethers-unsupported: "];
|
|
64
|
+
if (typeof reason !== "string") {
|
|
65
|
+
return reason;
|
|
66
|
+
}
|
|
67
|
+
for (const prefix of prefixes) {
|
|
68
|
+
if (reason.startsWith(prefix)) {
|
|
69
|
+
return reason.replace(prefix, "");
|
|
70
|
+
}
|
|
71
|
+
}
|
|
72
|
+
return reason;
|
|
73
|
+
}
|
|
74
|
+
|
|
75
|
+
// src/ethersProvider.ts
|
|
76
|
+
var EthersProvider = class {
|
|
77
|
+
constructor() {
|
|
78
|
+
__publicField(this, "_provider");
|
|
79
|
+
__publicField(this, "_originalProvider");
|
|
80
|
+
}
|
|
81
|
+
parseUnits(amount, decimals) {
|
|
82
|
+
return ethers.parseUnits(amount, decimals).toString();
|
|
83
|
+
}
|
|
84
|
+
formatUnits(amount, decimals) {
|
|
85
|
+
return ethers.formatUnits(amount, decimals);
|
|
86
|
+
}
|
|
87
|
+
set provider(provider) {
|
|
88
|
+
this._provider = new BrowserProvider(provider, "any");
|
|
89
|
+
this._originalProvider = provider;
|
|
90
|
+
}
|
|
91
|
+
get browserProvider() {
|
|
92
|
+
if (!this._provider) {
|
|
93
|
+
throw new Error("browserProvider is not initialized");
|
|
94
|
+
}
|
|
95
|
+
return this._provider;
|
|
96
|
+
}
|
|
97
|
+
signTypedData(address, toSignatureMessage) {
|
|
98
|
+
return __async(this, null, function* () {
|
|
99
|
+
var _a;
|
|
100
|
+
return yield (_a = this.browserProvider) == null ? void 0 : _a.send("eth_signTypedData_v4", [
|
|
101
|
+
address,
|
|
102
|
+
toSignatureMessage
|
|
103
|
+
]);
|
|
104
|
+
});
|
|
105
|
+
}
|
|
106
|
+
call(address, method, params, options) {
|
|
107
|
+
return __async(this, null, function* () {
|
|
108
|
+
const writeMethod = ["approve"];
|
|
109
|
+
if (this._originalProvider.agwWallet && writeMethod.includes(method)) {
|
|
110
|
+
try {
|
|
111
|
+
const transactionHash = yield this._originalProvider.writeContract({
|
|
112
|
+
abi: options.abi,
|
|
113
|
+
address,
|
|
114
|
+
functionName: method,
|
|
115
|
+
args: params
|
|
116
|
+
});
|
|
117
|
+
return {
|
|
118
|
+
hash: transactionHash
|
|
119
|
+
};
|
|
120
|
+
} catch (error) {
|
|
121
|
+
const parsedEthersError = yield parseError(error);
|
|
122
|
+
throw parsedEthersError;
|
|
123
|
+
}
|
|
124
|
+
}
|
|
125
|
+
const singer = yield this.browserProvider.getSigner();
|
|
126
|
+
const contract = new ethers.Contract(address, options.abi, singer);
|
|
127
|
+
return contract[method].apply(null, params).catch((error) => __async(this, null, function* () {
|
|
128
|
+
const parsedEthersError = yield parseError(error);
|
|
129
|
+
throw parsedEthersError;
|
|
130
|
+
}));
|
|
131
|
+
});
|
|
132
|
+
}
|
|
133
|
+
send(method, params) {
|
|
134
|
+
return this.browserProvider.send(method, params);
|
|
135
|
+
}
|
|
136
|
+
sendTransaction(contractAddress, method, payload, options) {
|
|
137
|
+
return __async(this, null, function* () {
|
|
138
|
+
var _a;
|
|
139
|
+
const singer = yield (_a = this.browserProvider) == null ? void 0 : _a.getSigner();
|
|
140
|
+
if (!singer) {
|
|
141
|
+
throw new Error("singer is not exist");
|
|
142
|
+
}
|
|
143
|
+
const contract = new ethers.Contract(
|
|
144
|
+
contractAddress,
|
|
145
|
+
options.abi,
|
|
146
|
+
this.browserProvider
|
|
147
|
+
);
|
|
148
|
+
const encodeFunctionData = contract.interface.encodeFunctionData(
|
|
149
|
+
method,
|
|
150
|
+
payload.data
|
|
151
|
+
);
|
|
152
|
+
const tx = {
|
|
153
|
+
from: payload.from,
|
|
154
|
+
to: payload.to,
|
|
155
|
+
data: encodeFunctionData,
|
|
156
|
+
value: payload.value
|
|
157
|
+
};
|
|
158
|
+
try {
|
|
159
|
+
if (method === "depositTo") {
|
|
160
|
+
return yield this._originalProvider.sendTransaction({
|
|
161
|
+
to: contractAddress,
|
|
162
|
+
data: encodeFunctionData,
|
|
163
|
+
value: payload.value
|
|
164
|
+
});
|
|
165
|
+
}
|
|
166
|
+
return yield singer.sendTransaction(tx);
|
|
167
|
+
} catch (error) {
|
|
168
|
+
const parsedEthersError = yield parseError(error);
|
|
169
|
+
throw parsedEthersError;
|
|
170
|
+
}
|
|
171
|
+
});
|
|
172
|
+
}
|
|
173
|
+
pollTransactionReceiptWithBackoff(txHash, baseInterval = 1e3, maxInterval = 6e3, maxRetries = 30) {
|
|
174
|
+
return __async(this, null, function* () {
|
|
175
|
+
let interval = baseInterval;
|
|
176
|
+
let retries = 0;
|
|
177
|
+
while (retries < maxRetries) {
|
|
178
|
+
try {
|
|
179
|
+
const receipt = yield this.browserProvider.getTransactionReceipt(txHash);
|
|
180
|
+
if (receipt) {
|
|
181
|
+
return receipt;
|
|
182
|
+
}
|
|
183
|
+
} catch (error) {
|
|
184
|
+
}
|
|
185
|
+
yield new Promise((resolve) => setTimeout(resolve, interval));
|
|
186
|
+
interval = Math.min(interval * 2, maxInterval);
|
|
187
|
+
retries++;
|
|
188
|
+
}
|
|
189
|
+
throw new Error("Transaction did not complete after maximum retries.");
|
|
190
|
+
});
|
|
191
|
+
}
|
|
192
|
+
callOnChain(chain, address, method, params, options) {
|
|
193
|
+
const provider = new ethers.JsonRpcProvider(chain.public_rpc_url);
|
|
194
|
+
const contract = new ethers.Contract(address, options.abi, provider);
|
|
195
|
+
return contract[method].apply(null, params).catch((error) => __async(this, null, function* () {
|
|
196
|
+
const parsedEthersError = yield parseError(error);
|
|
197
|
+
throw parsedEthersError;
|
|
198
|
+
}));
|
|
199
|
+
}
|
|
200
|
+
getBalance(userAddress) {
|
|
201
|
+
return this.browserProvider.getBalance(userAddress).then((res) => {
|
|
202
|
+
return res;
|
|
203
|
+
});
|
|
204
|
+
}
|
|
205
|
+
};
|
|
206
|
+
export {
|
|
207
|
+
EthersProvider
|
|
208
|
+
};
|
|
2
209
|
//# sourceMappingURL=index.mjs.map
|
package/dist/index.mjs.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../src/ethersProvider.ts","../src/parseError.ts"],"sourcesContent":["import { BrowserProvider, Eip1193Provider, ethers } from \"ethers\";\nimport { Web3Provider } from \"@kodiak-finance/orderly-default-evm-adapter\";\nimport { API } from \"@kodiak-finance/orderly-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":"
|
|
1
|
+
{"version":3,"sources":["../src/ethersProvider.ts","../src/parseError.ts"],"sourcesContent":["import { BrowserProvider, Eip1193Provider, ethers } from \"ethers\";\nimport { Web3Provider } from \"@kodiak-finance/orderly-default-evm-adapter\";\nimport { API } from \"@kodiak-finance/orderly-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":[]}
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@kodiak-finance/orderly-web3-provider-ethers",
|
|
3
|
-
"version": "2.8.
|
|
3
|
+
"version": "2.8.19",
|
|
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.15.0",
|
|
17
17
|
"ethers-decode-error": "^2.1.3",
|
|
18
|
-
"@kodiak-finance/orderly-
|
|
19
|
-
"@kodiak-finance/orderly-
|
|
18
|
+
"@kodiak-finance/orderly-types": "2.8.19",
|
|
19
|
+
"@kodiak-finance/orderly-default-evm-adapter": "2.8.19"
|
|
20
20
|
},
|
|
21
21
|
"devDependencies": {
|
|
22
22
|
"jest": "^29.7.0",
|
|
23
23
|
"tsup": "^7.1.0",
|
|
24
24
|
"typescript": "^5.1.6",
|
|
25
|
-
"tsconfig": "0.11.
|
|
25
|
+
"tsconfig": "0.11.18"
|
|
26
26
|
},
|
|
27
27
|
"scripts": {
|
|
28
28
|
"build": "tsup",
|