@instadapp/avocado-base 0.0.1 → 0.0.3
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/abi/avoFactoryProxy.json +109 -0
- package/abi/balanceResolver.json +110 -0
- package/abi/erc20.json +350 -0
- package/abi/forwarder.json +331 -0
- package/abi/gaslessWallet.json +289 -0
- package/app.vue +20 -0
- package/contracts/AvoFactoryProxy.ts +302 -0
- package/contracts/BalanceResolver.ts +321 -0
- package/contracts/Erc20.ts +526 -0
- package/contracts/Forwarder.ts +790 -0
- package/contracts/GaslessWallet.ts +660 -0
- package/contracts/common.ts +46 -0
- package/contracts/factories/AvoFactoryProxy__factory.ts +181 -0
- package/contracts/factories/BalanceResolver__factory.ts +212 -0
- package/contracts/factories/Erc20__factory.ts +368 -0
- package/contracts/factories/Forwarder__factory.ts +656 -0
- package/contracts/factories/GaslessWallet__factory.ts +499 -0
- package/contracts/factories/index.ts +8 -0
- package/contracts/index.ts +14 -0
- package/nuxt.config.ts +2 -2
- package/package.json +11 -4
- package/utils/bignumber.ts +31 -0
- package/utils/formatter.ts +51 -0
- package/utils/helper.ts +54 -0
- package/utils/metadata.ts +326 -0
- package/utils/network.ts +96 -20
- package/utils/utils.d.ts +72 -1
|
@@ -0,0 +1,326 @@
|
|
|
1
|
+
import { ethers, utils } from "ethers";
|
|
2
|
+
import { Forwarder__factory } from "@/contracts";
|
|
3
|
+
|
|
4
|
+
const multiMetadataTypes = ["bytes[]"];
|
|
5
|
+
|
|
6
|
+
const metadataTypes = ["bytes32 type", "uint8 version", "bytes data"];
|
|
7
|
+
|
|
8
|
+
const actionMetadataTypes = {
|
|
9
|
+
transfer: ["address token", "uint256 amount", "address receiver"],
|
|
10
|
+
bridge: [
|
|
11
|
+
"uint256 amount",
|
|
12
|
+
"address receiver",
|
|
13
|
+
"address fromToken",
|
|
14
|
+
"address toToken",
|
|
15
|
+
"uint256 toChainId",
|
|
16
|
+
"uint256 bridgeFee",
|
|
17
|
+
"address nativeToken",
|
|
18
|
+
],
|
|
19
|
+
swap: [
|
|
20
|
+
"address sellToken",
|
|
21
|
+
"address buyToken",
|
|
22
|
+
"uint256 sellAmount",
|
|
23
|
+
"uint256 buyAmount",
|
|
24
|
+
"address receiver",
|
|
25
|
+
"bytes32 protocol",
|
|
26
|
+
],
|
|
27
|
+
"gas-topup": ["uint256 amount", "address token", "address onBehalf"],
|
|
28
|
+
upgrade: ["bytes32 version", "address walletImpl"],
|
|
29
|
+
dapp: ["string name", "string url"],
|
|
30
|
+
deploy: [],
|
|
31
|
+
permit2: [
|
|
32
|
+
"address token",
|
|
33
|
+
"address spender",
|
|
34
|
+
"uint160 amount",
|
|
35
|
+
"uint48 expiration",
|
|
36
|
+
],
|
|
37
|
+
};
|
|
38
|
+
|
|
39
|
+
const encodeMetadata = (props: MetadataProps) => {
|
|
40
|
+
return ethers.utils.defaultAbiCoder.encode(metadataTypes, [
|
|
41
|
+
ethers.utils.formatBytes32String(props.type),
|
|
42
|
+
props.version || "1",
|
|
43
|
+
props.encodedData,
|
|
44
|
+
]);
|
|
45
|
+
};
|
|
46
|
+
|
|
47
|
+
export const encodeDappMetadata = (
|
|
48
|
+
params: DappMetadataProps,
|
|
49
|
+
single = true
|
|
50
|
+
) => {
|
|
51
|
+
const encodedData = ethers.utils.defaultAbiCoder.encode(
|
|
52
|
+
actionMetadataTypes.dapp,
|
|
53
|
+
[params.name, params.url]
|
|
54
|
+
);
|
|
55
|
+
|
|
56
|
+
const data = encodeMetadata({
|
|
57
|
+
type: "dapp",
|
|
58
|
+
encodedData,
|
|
59
|
+
});
|
|
60
|
+
|
|
61
|
+
return single ? encodeMultipleActions(data) : data;
|
|
62
|
+
};
|
|
63
|
+
|
|
64
|
+
export const encodeTransferMetadata = (
|
|
65
|
+
params: SendMetadataProps,
|
|
66
|
+
single = true
|
|
67
|
+
) => {
|
|
68
|
+
const encodedData = ethers.utils.defaultAbiCoder.encode(
|
|
69
|
+
actionMetadataTypes.transfer,
|
|
70
|
+
[params.token, params.amount, params.receiver]
|
|
71
|
+
);
|
|
72
|
+
|
|
73
|
+
const data = encodeMetadata({
|
|
74
|
+
type: "transfer",
|
|
75
|
+
encodedData,
|
|
76
|
+
});
|
|
77
|
+
|
|
78
|
+
return single ? encodeMultipleActions(data) : data;
|
|
79
|
+
};
|
|
80
|
+
|
|
81
|
+
export const encodeDeployMetadata = (single = true) => {
|
|
82
|
+
const data = encodeMetadata({
|
|
83
|
+
type: "deploy",
|
|
84
|
+
encodedData: "0x",
|
|
85
|
+
});
|
|
86
|
+
|
|
87
|
+
return single ? encodeMultipleActions(data) : data;
|
|
88
|
+
};
|
|
89
|
+
|
|
90
|
+
export const encodeWCSignMetadata = (
|
|
91
|
+
params: SignMetadataProps,
|
|
92
|
+
single = true
|
|
93
|
+
) => {
|
|
94
|
+
const encodedData = ethers.utils.defaultAbiCoder.encode(
|
|
95
|
+
actionMetadataTypes["permit2"],
|
|
96
|
+
[params.token, params.spender, params.amount, params.expiration]
|
|
97
|
+
);
|
|
98
|
+
|
|
99
|
+
const data = encodeMetadata({
|
|
100
|
+
type: "permit2",
|
|
101
|
+
encodedData,
|
|
102
|
+
});
|
|
103
|
+
|
|
104
|
+
return single ? encodeMultipleActions(data) : data;
|
|
105
|
+
};
|
|
106
|
+
|
|
107
|
+
export const encodeUpgradeMetadata = (
|
|
108
|
+
params: UpgradeMetadataProps,
|
|
109
|
+
single = true
|
|
110
|
+
) => {
|
|
111
|
+
const encodedData = ethers.utils.defaultAbiCoder.encode(
|
|
112
|
+
actionMetadataTypes.upgrade,
|
|
113
|
+
[params.version, params.walletImpl]
|
|
114
|
+
);
|
|
115
|
+
|
|
116
|
+
const data = encodeMetadata({
|
|
117
|
+
type: "upgrade",
|
|
118
|
+
encodedData,
|
|
119
|
+
});
|
|
120
|
+
|
|
121
|
+
return single ? encodeMultipleActions(data) : data;
|
|
122
|
+
};
|
|
123
|
+
|
|
124
|
+
export const encodeSwapMetadata = (
|
|
125
|
+
params: SwapMetadataProps,
|
|
126
|
+
single = true
|
|
127
|
+
) => {
|
|
128
|
+
const encodedData = ethers.utils.defaultAbiCoder.encode(
|
|
129
|
+
actionMetadataTypes.swap,
|
|
130
|
+
[
|
|
131
|
+
params.sellToken,
|
|
132
|
+
params.buyToken,
|
|
133
|
+
params.sellAmount,
|
|
134
|
+
params.buyAmount,
|
|
135
|
+
params.receiver,
|
|
136
|
+
params.protocol,
|
|
137
|
+
]
|
|
138
|
+
);
|
|
139
|
+
|
|
140
|
+
const data = encodeMetadata({
|
|
141
|
+
type: "swap",
|
|
142
|
+
encodedData,
|
|
143
|
+
});
|
|
144
|
+
|
|
145
|
+
return single ? encodeMultipleActions(data) : data;
|
|
146
|
+
};
|
|
147
|
+
|
|
148
|
+
export const encodeTopupMetadata = (
|
|
149
|
+
params: TopupMetadataProps,
|
|
150
|
+
single = true
|
|
151
|
+
) => {
|
|
152
|
+
const encodedData = ethers.utils.defaultAbiCoder.encode(
|
|
153
|
+
actionMetadataTypes["gas-topup"],
|
|
154
|
+
[params.amount, params.token, params.onBehalf]
|
|
155
|
+
);
|
|
156
|
+
|
|
157
|
+
console.log(params);
|
|
158
|
+
|
|
159
|
+
const data = encodeMetadata({
|
|
160
|
+
type: "gas-topup",
|
|
161
|
+
encodedData,
|
|
162
|
+
});
|
|
163
|
+
|
|
164
|
+
return single ? encodeMultipleActions(data) : data;
|
|
165
|
+
};
|
|
166
|
+
|
|
167
|
+
export const encodeBridgeMetadata = (
|
|
168
|
+
params: BridgeMetadataProps,
|
|
169
|
+
single = true
|
|
170
|
+
) => {
|
|
171
|
+
const encodedData = ethers.utils.defaultAbiCoder.encode(
|
|
172
|
+
actionMetadataTypes.bridge,
|
|
173
|
+
[
|
|
174
|
+
params.amount,
|
|
175
|
+
params.receiver,
|
|
176
|
+
params.fromToken,
|
|
177
|
+
params.toToken,
|
|
178
|
+
params.toChainId,
|
|
179
|
+
params.bridgeFee,
|
|
180
|
+
params.nativeToken,
|
|
181
|
+
]
|
|
182
|
+
);
|
|
183
|
+
|
|
184
|
+
const data = encodeMetadata({
|
|
185
|
+
type: "bridge",
|
|
186
|
+
encodedData,
|
|
187
|
+
});
|
|
188
|
+
|
|
189
|
+
return single ? encodeMultipleActions(data) : data;
|
|
190
|
+
};
|
|
191
|
+
|
|
192
|
+
export const encodeMultipleActions = (...actionData: string[]) => {
|
|
193
|
+
return ethers.utils.defaultAbiCoder.encode(multiMetadataTypes, [actionData]);
|
|
194
|
+
};
|
|
195
|
+
|
|
196
|
+
export const decodeMetadata = (data: string) => {
|
|
197
|
+
try {
|
|
198
|
+
const iface = Forwarder__factory.createInterface();
|
|
199
|
+
let metadata = "0x";
|
|
200
|
+
let payload = {};
|
|
201
|
+
|
|
202
|
+
if (!data) return payload;
|
|
203
|
+
|
|
204
|
+
if (data.startsWith("0x18e7f485")) {
|
|
205
|
+
const executeData = iface.decodeFunctionData("execute", data);
|
|
206
|
+
if (executeData.metadata_ === "0x" || !executeData.metadata_) {
|
|
207
|
+
return null;
|
|
208
|
+
} else {
|
|
209
|
+
metadata = executeData.metadata_;
|
|
210
|
+
}
|
|
211
|
+
} else {
|
|
212
|
+
const executeDataV2 = iface.decodeFunctionData("executeV2", data);
|
|
213
|
+
if (
|
|
214
|
+
executeDataV2.params_.metadata === "0x" ||
|
|
215
|
+
!executeDataV2.params_.metadata
|
|
216
|
+
) {
|
|
217
|
+
return null;
|
|
218
|
+
} else {
|
|
219
|
+
metadata = executeDataV2.params_.metadata;
|
|
220
|
+
}
|
|
221
|
+
}
|
|
222
|
+
|
|
223
|
+
const metadataArr = [];
|
|
224
|
+
|
|
225
|
+
const [decodedMultiMetadata = []] =
|
|
226
|
+
(ethers.utils.defaultAbiCoder.decode(
|
|
227
|
+
multiMetadataTypes,
|
|
228
|
+
metadata
|
|
229
|
+
) as string[]) || [];
|
|
230
|
+
|
|
231
|
+
for (let metadata of decodedMultiMetadata) {
|
|
232
|
+
const decodedMetadata = ethers.utils.defaultAbiCoder.decode(
|
|
233
|
+
metadataTypes,
|
|
234
|
+
metadata
|
|
235
|
+
);
|
|
236
|
+
|
|
237
|
+
const type = ethers.utils.parseBytes32String(
|
|
238
|
+
decodedMetadata.type
|
|
239
|
+
) as keyof typeof actionMetadataTypes;
|
|
240
|
+
|
|
241
|
+
const decodedData = ethers.utils.defaultAbiCoder.decode(
|
|
242
|
+
actionMetadataTypes[type],
|
|
243
|
+
decodedMetadata.data
|
|
244
|
+
);
|
|
245
|
+
|
|
246
|
+
switch (type) {
|
|
247
|
+
case "transfer":
|
|
248
|
+
payload = {
|
|
249
|
+
type,
|
|
250
|
+
token: decodedData.token,
|
|
251
|
+
amount: toBN(decodedData.amount).toFixed(),
|
|
252
|
+
receiver: decodedData.receiver,
|
|
253
|
+
};
|
|
254
|
+
break;
|
|
255
|
+
case "bridge":
|
|
256
|
+
payload = {
|
|
257
|
+
type,
|
|
258
|
+
amount: toBN(decodedData.amount).toFixed(),
|
|
259
|
+
receiver: decodedData.receiver,
|
|
260
|
+
toToken: decodedData.toToken,
|
|
261
|
+
fromToken: decodedData.fromToken,
|
|
262
|
+
toChainId: decodedData.toChainId
|
|
263
|
+
? decodedData.toChainId.toString()
|
|
264
|
+
: null,
|
|
265
|
+
bridgeFee: toBN(decodedData.bridgeFee).toFixed(),
|
|
266
|
+
};
|
|
267
|
+
break;
|
|
268
|
+
case "swap":
|
|
269
|
+
payload = {
|
|
270
|
+
type,
|
|
271
|
+
buyAmount: toBN(decodedData.buyAmount).toFixed(),
|
|
272
|
+
sellAmount: toBN(decodedData.sellAmount).toFixed(),
|
|
273
|
+
buyToken: decodedData.buyToken,
|
|
274
|
+
sellToken: decodedData.sellToken,
|
|
275
|
+
receiver: decodedData.receiver,
|
|
276
|
+
protocol: utils.parseBytes32String(decodedData?.protocol || ""),
|
|
277
|
+
};
|
|
278
|
+
break;
|
|
279
|
+
case "upgrade":
|
|
280
|
+
payload = {
|
|
281
|
+
type,
|
|
282
|
+
version: utils.parseBytes32String(decodedData?.version || ""),
|
|
283
|
+
walletImpl: decodedData?.walletImpl,
|
|
284
|
+
};
|
|
285
|
+
break;
|
|
286
|
+
case "gas-topup":
|
|
287
|
+
payload = {
|
|
288
|
+
type,
|
|
289
|
+
amount: toBN(decodedData.amount).toFixed(),
|
|
290
|
+
token: decodedData.token,
|
|
291
|
+
onBehalf: decodedData.onBehalf,
|
|
292
|
+
};
|
|
293
|
+
break;
|
|
294
|
+
case "dapp":
|
|
295
|
+
payload = {
|
|
296
|
+
type,
|
|
297
|
+
name: decodedData?.name,
|
|
298
|
+
url: decodedData?.url,
|
|
299
|
+
};
|
|
300
|
+
break;
|
|
301
|
+
case "deploy":
|
|
302
|
+
payload = {
|
|
303
|
+
type,
|
|
304
|
+
};
|
|
305
|
+
|
|
306
|
+
case "permit2":
|
|
307
|
+
payload = {
|
|
308
|
+
type,
|
|
309
|
+
token: decodedData.token,
|
|
310
|
+
spender: decodedData.spender,
|
|
311
|
+
amount: toBN(decodedData.amount).toFixed(),
|
|
312
|
+
expiration: decodedData.expiration,
|
|
313
|
+
};
|
|
314
|
+
|
|
315
|
+
break;
|
|
316
|
+
}
|
|
317
|
+
|
|
318
|
+
metadataArr.push(payload);
|
|
319
|
+
}
|
|
320
|
+
|
|
321
|
+
return metadataArr;
|
|
322
|
+
} catch (e) {
|
|
323
|
+
console.log(e);
|
|
324
|
+
return null;
|
|
325
|
+
}
|
|
326
|
+
};
|
package/utils/network.ts
CHANGED
|
@@ -1,21 +1,21 @@
|
|
|
1
1
|
import { ethers } from "ethers";
|
|
2
|
-
import {
|
|
3
|
-
AVO_PROD_CHAIN_NAME,
|
|
4
|
-
AVO_PROD_CHAIN_ID,
|
|
5
|
-
AVO_STAGING_CHAIN_NAME,
|
|
6
|
-
AVO_STAGING_RPC_URL,
|
|
7
|
-
AVO_PROD_RPC_URL,
|
|
8
|
-
AVO_STAGING_CHAIN_ID,
|
|
9
|
-
} from "./avocado";
|
|
10
2
|
|
|
11
3
|
export const bridgeDisabledNetworks = [1101];
|
|
12
4
|
|
|
13
5
|
export const networks: Network[] = [
|
|
14
6
|
{
|
|
15
7
|
name: "Mainnet",
|
|
8
|
+
debankName: "eth",
|
|
9
|
+
ankrName: "eth",
|
|
16
10
|
chainId: 1,
|
|
17
11
|
params: {
|
|
18
12
|
rpcUrls: ["https://rpc.ankr.com/eth"],
|
|
13
|
+
explorerUrl: "https://etherscan.io",
|
|
14
|
+
get serverRpcUrl() {
|
|
15
|
+
return process.env?.MAINNET_RPC_URL || this.rpcUrls[0];
|
|
16
|
+
},
|
|
17
|
+
balanceResolverAddress: "0x5b7D61b389D12e1f5873d0cCEe7E675915AB5F43",
|
|
18
|
+
usdcAddress: "0xa0b86991c6218b36c1d19d4a2e9eb0ce3606eb48",
|
|
19
19
|
nativeCurrency: {
|
|
20
20
|
name: "Ethereum",
|
|
21
21
|
symbol: "ETH",
|
|
@@ -25,6 +25,8 @@ export const networks: Network[] = [
|
|
|
25
25
|
},
|
|
26
26
|
{
|
|
27
27
|
name: "Polygon",
|
|
28
|
+
debankName: "matic",
|
|
29
|
+
ankrName: "polygon",
|
|
28
30
|
chainId: 137,
|
|
29
31
|
params: {
|
|
30
32
|
chainName: "Matic(Polygon) Mainnet",
|
|
@@ -33,12 +35,19 @@ export const networks: Network[] = [
|
|
|
33
35
|
symbol: "MATIC",
|
|
34
36
|
decimals: 18,
|
|
35
37
|
},
|
|
38
|
+
balanceResolverAddress: "0x58632D23120b20650262b8A629a14e4F4043E0D9",
|
|
39
|
+
usdcAddress: "0x2791Bca1f2de4661ED88A30C99A7a9449Aa84174",
|
|
36
40
|
rpcUrls: ["https://polygon-rpc.com"],
|
|
37
|
-
|
|
41
|
+
get serverRpcUrl() {
|
|
42
|
+
return process.env?.POLYGON_RPC_URL || this.rpcUrls[0];
|
|
43
|
+
},
|
|
44
|
+
explorerUrl: "https://polygonscan.com",
|
|
38
45
|
},
|
|
39
46
|
},
|
|
40
47
|
{
|
|
41
48
|
name: "Arbitrum",
|
|
49
|
+
debankName: "arb",
|
|
50
|
+
ankrName: "arbitrum",
|
|
42
51
|
chainId: 42161,
|
|
43
52
|
params: {
|
|
44
53
|
chainName: "Arbitrum One",
|
|
@@ -47,12 +56,19 @@ export const networks: Network[] = [
|
|
|
47
56
|
symbol: "ETH",
|
|
48
57
|
decimals: 18,
|
|
49
58
|
},
|
|
59
|
+
usdcAddress: "0xff970a61a04b1ca14834a43f5de4533ebddb5cc8",
|
|
60
|
+
balanceResolverAddress: "0xca5f37e6D8bB24c5A7958d5eccE7Bd9Aacc944f2",
|
|
61
|
+
get serverRpcUrl() {
|
|
62
|
+
return process.env?.ARBITRUM_RPC_URL || this.rpcUrls[0];
|
|
63
|
+
},
|
|
50
64
|
rpcUrls: ["https://arb1.arbitrum.io/rpc"],
|
|
51
|
-
|
|
65
|
+
explorerUrl: "https://arbiscan.io",
|
|
52
66
|
},
|
|
53
67
|
},
|
|
54
68
|
{
|
|
55
69
|
name: "Optimism",
|
|
70
|
+
debankName: "op",
|
|
71
|
+
ankrName: "optimism",
|
|
56
72
|
chainId: 10,
|
|
57
73
|
params: {
|
|
58
74
|
chainName: "Optimistic Ethereum",
|
|
@@ -61,30 +77,50 @@ export const networks: Network[] = [
|
|
|
61
77
|
symbol: "ETH",
|
|
62
78
|
decimals: 18,
|
|
63
79
|
},
|
|
80
|
+
usdcAddress: "0x7f5c764cbc14f9669b88837ca1490cca17c31607",
|
|
81
|
+
balanceResolverAddress: "0xca5f37e6D8bB24c5A7958d5eccE7Bd9Aacc944f2",
|
|
82
|
+
get serverRpcUrl() {
|
|
83
|
+
return process.env?.OPTIMISM_RPC_URL || this.rpcUrls[0];
|
|
84
|
+
},
|
|
64
85
|
rpcUrls: ["https://mainnet.optimism.io"],
|
|
65
|
-
|
|
86
|
+
explorerUrl: "https://optimistic.etherscan.io",
|
|
66
87
|
},
|
|
67
88
|
},
|
|
68
89
|
{
|
|
69
90
|
name: "Avalanche",
|
|
91
|
+
debankName: "avax",
|
|
92
|
+
ankrName: "avalanche",
|
|
70
93
|
chainId: 43114,
|
|
71
94
|
params: {
|
|
72
95
|
chainName: "Avalanche Network",
|
|
96
|
+
get serverRpcUrl() {
|
|
97
|
+
return process.env?.AVALANCHE_RPC_URL || this.rpcUrls[0];
|
|
98
|
+
},
|
|
73
99
|
nativeCurrency: {
|
|
74
100
|
name: "Avalanche",
|
|
75
101
|
symbol: "AVAX",
|
|
76
102
|
decimals: 18,
|
|
77
103
|
},
|
|
104
|
+
usdcAddress: "0xb97ef9ef8734c71904d8002f8b6bc66dd9c48a6e",
|
|
105
|
+
balanceResolverAddress: "0x63009f31D054E0ac9F321Cf0D642375236A4Bf1E",
|
|
78
106
|
rpcUrls: ["https://api.avax.network/ext/bc/C/rpc"],
|
|
79
|
-
|
|
107
|
+
explorerUrl: "https://snowtrace.io",
|
|
80
108
|
},
|
|
81
109
|
},
|
|
82
110
|
{
|
|
83
111
|
name: "BSC",
|
|
112
|
+
debankName: "bsc",
|
|
113
|
+
ankrName: "bsc",
|
|
84
114
|
chainId: 56,
|
|
85
115
|
params: {
|
|
86
116
|
chainName: "Binance Smart Chain",
|
|
117
|
+
explorerUrl: "https://bscscan.com",
|
|
87
118
|
rpcUrls: ["https://rpc.ankr.com/bsc"],
|
|
119
|
+
get serverRpcUrl() {
|
|
120
|
+
return process.env?.BSC_RPC_URL || this.rpcUrls[0];
|
|
121
|
+
},
|
|
122
|
+
usdcAddress: "0x8ac76a51cc950d9822d68b83fe1ad97b32cd580d",
|
|
123
|
+
balanceResolverAddress: "0xb808cff38706e267067b0af427726aa099f69f89",
|
|
88
124
|
nativeCurrency: {
|
|
89
125
|
name: "Binance Coin",
|
|
90
126
|
symbol: "BNB",
|
|
@@ -94,10 +130,18 @@ export const networks: Network[] = [
|
|
|
94
130
|
},
|
|
95
131
|
{
|
|
96
132
|
name: "Gnosis",
|
|
133
|
+
debankName: "xdai",
|
|
134
|
+
ankrName: "gnosis",
|
|
97
135
|
chainId: 100,
|
|
98
136
|
params: {
|
|
99
137
|
chainName: "Gnosis Safe",
|
|
138
|
+
explorerUrl: "https://gnosisscan.io",
|
|
100
139
|
rpcUrls: ["https://rpc.ankr.com/gnosis"],
|
|
140
|
+
get serverRpcUrl() {
|
|
141
|
+
return process.env?.GNOSIS_RPC_URL || this.rpcUrls[0];
|
|
142
|
+
},
|
|
143
|
+
balanceResolverAddress: "0xfaa244e276b1597f663975ed007ee4ff70d27849",
|
|
144
|
+
usdcAddress: "0xddafbb505ad214d7b80b1f830fccc89b60fb7a83",
|
|
101
145
|
nativeCurrency: {
|
|
102
146
|
name: "xdaistable",
|
|
103
147
|
symbol: "xDAI",
|
|
@@ -110,7 +154,13 @@ export const networks: Network[] = [
|
|
|
110
154
|
chainId: 1101,
|
|
111
155
|
params: {
|
|
112
156
|
chainName: "polygon zkEVM",
|
|
157
|
+
explorerUrl: "https://zkevm.polygonscan.com",
|
|
113
158
|
rpcUrls: ["https://rpc.ankr.com/polygon_zkevm"],
|
|
159
|
+
get serverRpcUrl() {
|
|
160
|
+
return process.env?.POLYGON_ZKEVM_RPC_URL || this.rpcUrls[0];
|
|
161
|
+
},
|
|
162
|
+
balanceResolverAddress: "0x48D1Fa5Ee6691a1E0B45d2B515650997BEA27a01",
|
|
163
|
+
usdcAddress: "0xa8ce8aee21bc2a48a5ef670afcc9274c7bbbc035",
|
|
114
164
|
nativeCurrency: {
|
|
115
165
|
name: "Ethereum",
|
|
116
166
|
symbol: "ETH",
|
|
@@ -121,6 +171,7 @@ export const networks: Network[] = [
|
|
|
121
171
|
{
|
|
122
172
|
name: AVO_PROD_CHAIN_NAME,
|
|
123
173
|
chainId: AVO_PROD_CHAIN_ID,
|
|
174
|
+
isAvocado: true,
|
|
124
175
|
params: {
|
|
125
176
|
chainName: AVO_PROD_CHAIN_NAME,
|
|
126
177
|
nativeCurrency: {
|
|
@@ -129,13 +180,17 @@ export const networks: Network[] = [
|
|
|
129
180
|
decimals: 18,
|
|
130
181
|
},
|
|
131
182
|
iconUrls: ["https://avocado.instadapp.io/logo.svg"],
|
|
183
|
+
balanceResolverAddress: "",
|
|
184
|
+
usdcAddress: "",
|
|
185
|
+
serverRpcUrl: AVO_PROD_RPC_URL,
|
|
132
186
|
rpcUrls: [AVO_PROD_RPC_URL],
|
|
133
|
-
|
|
187
|
+
explorerUrl: AVO_PROD_EXPLORER_URL,
|
|
134
188
|
},
|
|
135
189
|
},
|
|
136
190
|
{
|
|
137
191
|
name: AVO_STAGING_CHAIN_NAME,
|
|
138
192
|
chainId: AVO_STAGING_CHAIN_ID,
|
|
193
|
+
isAvocado: true,
|
|
139
194
|
params: {
|
|
140
195
|
chainName: AVO_STAGING_CHAIN_NAME,
|
|
141
196
|
nativeCurrency: {
|
|
@@ -143,23 +198,24 @@ export const networks: Network[] = [
|
|
|
143
198
|
symbol: "USDC",
|
|
144
199
|
decimals: 18,
|
|
145
200
|
},
|
|
201
|
+
serverRpcUrl: AVO_STAGING_RPC_URL,
|
|
202
|
+
balanceResolverAddress: "",
|
|
203
|
+
usdcAddress: "",
|
|
146
204
|
iconUrls: ["https://avocado.instadapp.io/logo.svg"],
|
|
147
205
|
rpcUrls: [AVO_STAGING_RPC_URL],
|
|
148
|
-
|
|
206
|
+
explorerUrl: AVO_STAGING_EXPLORER_URL,
|
|
149
207
|
},
|
|
150
208
|
},
|
|
151
209
|
];
|
|
152
210
|
|
|
153
211
|
export const getNetworkByChainId = (
|
|
154
|
-
chainId:
|
|
155
|
-
) => {
|
|
156
|
-
return networks.find((i) => i.chainId
|
|
212
|
+
chainId: ChainId | number | string
|
|
213
|
+
): Network => {
|
|
214
|
+
return networks.find((i) => i.chainId == chainId)!;
|
|
157
215
|
};
|
|
158
216
|
|
|
159
217
|
export const availableNetworks = networks.filter(
|
|
160
|
-
(network) =>
|
|
161
|
-
network.chainId != AVO_STAGING_CHAIN_ID &&
|
|
162
|
-
network.chainId != AVO_PROD_CHAIN_ID
|
|
218
|
+
(network) => !network.isAvocado
|
|
163
219
|
);
|
|
164
220
|
|
|
165
221
|
export const chainIdToName = (chainId: ChainId | number | string) => {
|
|
@@ -180,6 +236,18 @@ export const RPCMap = networks.reduce((acc, network) => {
|
|
|
180
236
|
export const networkIds = networks.map((network) => network.chainId);
|
|
181
237
|
|
|
182
238
|
const rpcInstances: Record<string, ethers.providers.JsonRpcProvider> = {};
|
|
239
|
+
const serverRpcInstances: Record<string, ethers.providers.JsonRpcProvider> = {};
|
|
240
|
+
|
|
241
|
+
export const getServerRpcProvider = (chainId: number | string) => {
|
|
242
|
+
if (!rpcInstances[chainId]) {
|
|
243
|
+
const network = networks.find((n) => n.chainId == chainId);
|
|
244
|
+
serverRpcInstances[chainId] = new ethers.providers.JsonRpcProvider(
|
|
245
|
+
network?.params.serverRpcUrl
|
|
246
|
+
);
|
|
247
|
+
}
|
|
248
|
+
|
|
249
|
+
return serverRpcInstances[chainId];
|
|
250
|
+
};
|
|
183
251
|
|
|
184
252
|
export const getRpcProvider = (chainId: number | string) => {
|
|
185
253
|
if (!rpcInstances[chainId]) {
|
|
@@ -190,3 +258,11 @@ export const getRpcProvider = (chainId: number | string) => {
|
|
|
190
258
|
|
|
191
259
|
return rpcInstances[chainId];
|
|
192
260
|
};
|
|
261
|
+
|
|
262
|
+
export const getExplorerUrl = (
|
|
263
|
+
chainId: ChainId | number | string,
|
|
264
|
+
suffix: `/${string}` = "/"
|
|
265
|
+
) => {
|
|
266
|
+
const network = getNetworkByChainId(chainId);
|
|
267
|
+
return `${network.params.explorerUrl}${suffix}`;
|
|
268
|
+
};
|
package/utils/utils.d.ts
CHANGED
|
@@ -1,12 +1,20 @@
|
|
|
1
1
|
type ChainId = 1 | 137 | 42161 | 10 | 56 | 43114 | 100 | 1101 | 634 | 63400;
|
|
2
2
|
|
|
3
|
+
type ISlackMessageType = "danger" | "error" | "success" | "banner";
|
|
4
|
+
|
|
3
5
|
interface Network {
|
|
4
6
|
name: string;
|
|
7
|
+
debankName?: string;
|
|
8
|
+
ankrName?: string;
|
|
5
9
|
chainId: ChainId;
|
|
10
|
+
isAvocado?: boolean;
|
|
6
11
|
params: {
|
|
7
12
|
chainName?: string;
|
|
8
13
|
rpcUrls: string[];
|
|
9
|
-
|
|
14
|
+
serverRpcUrl: string | undefined;
|
|
15
|
+
balanceResolverAddress?: string;
|
|
16
|
+
usdcAddress: string;
|
|
17
|
+
explorerUrl: string;
|
|
10
18
|
iconUrls?: string[];
|
|
11
19
|
nativeCurrency?: {
|
|
12
20
|
name: string;
|
|
@@ -15,3 +23,66 @@ interface Network {
|
|
|
15
23
|
};
|
|
16
24
|
};
|
|
17
25
|
}
|
|
26
|
+
|
|
27
|
+
type SignMetadataProps = {
|
|
28
|
+
token: string;
|
|
29
|
+
spender: string;
|
|
30
|
+
amount: string;
|
|
31
|
+
expiration: string;
|
|
32
|
+
};
|
|
33
|
+
|
|
34
|
+
type DappMetadataProps = {
|
|
35
|
+
name: string;
|
|
36
|
+
url: string;
|
|
37
|
+
};
|
|
38
|
+
|
|
39
|
+
type SendMetadataProps = {
|
|
40
|
+
token: string;
|
|
41
|
+
amount: string;
|
|
42
|
+
receiver: string;
|
|
43
|
+
};
|
|
44
|
+
|
|
45
|
+
type UpgradeMetadataProps = {
|
|
46
|
+
version: string;
|
|
47
|
+
walletImpl: string;
|
|
48
|
+
};
|
|
49
|
+
|
|
50
|
+
type TopupMetadataProps = {
|
|
51
|
+
amount: string;
|
|
52
|
+
token: string;
|
|
53
|
+
onBehalf: string;
|
|
54
|
+
};
|
|
55
|
+
|
|
56
|
+
type BridgeMetadataProps = {
|
|
57
|
+
amount: string;
|
|
58
|
+
receiver: string;
|
|
59
|
+
fromToken: string;
|
|
60
|
+
toToken: string;
|
|
61
|
+
toChainId: string;
|
|
62
|
+
bridgeFee: string;
|
|
63
|
+
nativeToken: string;
|
|
64
|
+
};
|
|
65
|
+
|
|
66
|
+
type SwapMetadataProps = {
|
|
67
|
+
sellToken: string;
|
|
68
|
+
buyToken: string;
|
|
69
|
+
sellAmount: string;
|
|
70
|
+
buyAmount: string;
|
|
71
|
+
receiver: string;
|
|
72
|
+
protocol?: string;
|
|
73
|
+
};
|
|
74
|
+
|
|
75
|
+
type MetadataProps = {
|
|
76
|
+
type:
|
|
77
|
+
| "transfer"
|
|
78
|
+
| "bridge"
|
|
79
|
+
| "swap"
|
|
80
|
+
| "multi"
|
|
81
|
+
| "gas-topup"
|
|
82
|
+
| "upgrade"
|
|
83
|
+
| "dapp"
|
|
84
|
+
| "deploy"
|
|
85
|
+
| "permit2";
|
|
86
|
+
encodedData: string;
|
|
87
|
+
version?: string;
|
|
88
|
+
};
|