@instadapp/avocado-base 0.0.0-dev.c8c43bc → 0.0.0-dev.ca74133

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.
Files changed (76) hide show
  1. package/abi/forwarder.json +1253 -149
  2. package/app.vue +27 -0
  3. package/assets/images/icons/arrow-left.svg +5 -0
  4. package/assets/images/icons/arrow-right.svg +5 -0
  5. package/assets/images/icons/avocado.svg +4 -0
  6. package/assets/images/icons/bridge-2.svg +3 -0
  7. package/assets/images/icons/bridge.svg +7 -0
  8. package/assets/images/icons/calendar.svg +8 -0
  9. package/assets/images/icons/change-threshold.svg +4 -0
  10. package/assets/images/icons/check-circle.svg +4 -0
  11. package/assets/images/icons/chevron-down.svg +4 -0
  12. package/assets/images/icons/clipboard.svg +7 -0
  13. package/assets/images/icons/clock-circle.svg +5 -0
  14. package/assets/images/icons/copy.svg +5 -0
  15. package/assets/images/icons/cross-transfer.svg +7 -0
  16. package/assets/images/icons/dapp.svg +4 -0
  17. package/assets/images/icons/deploy.svg +12 -0
  18. package/assets/images/icons/error-circle.svg +6 -0
  19. package/assets/images/icons/exclamation-circle.svg +13 -0
  20. package/assets/images/icons/exclamation-octagon.svg +13 -0
  21. package/assets/images/icons/exclamation-triangle.svg +5 -0
  22. package/assets/images/icons/external-link.svg +6 -0
  23. package/assets/images/icons/eye.svg +4 -0
  24. package/assets/images/icons/flowers.svg +8 -0
  25. package/assets/images/icons/gas-emoji.svg +193 -0
  26. package/assets/images/icons/gas.svg +14 -0
  27. package/assets/images/icons/gift.svg +153 -0
  28. package/assets/images/icons/globe.svg +110 -0
  29. package/assets/images/icons/hamburger.svg +6 -0
  30. package/assets/images/icons/instadapp-pro.svg +4 -0
  31. package/assets/images/icons/logout.svg +3 -0
  32. package/assets/images/icons/moon.svg +3 -0
  33. package/assets/images/icons/multi-send.svg +7 -0
  34. package/assets/images/icons/network.svg +13 -0
  35. package/assets/images/icons/options.svg +5 -0
  36. package/assets/images/icons/permit-sign.svg +11 -0
  37. package/assets/images/icons/plus-circle.svg +6 -0
  38. package/assets/images/icons/plus.svg +5 -0
  39. package/assets/images/icons/power-off-bg.svg +24 -0
  40. package/assets/images/icons/power-off.svg +19 -0
  41. package/assets/images/icons/power-on.svg +19 -0
  42. package/assets/images/icons/qr.svg +20 -0
  43. package/assets/images/icons/question-circle.svg +14 -0
  44. package/assets/images/icons/refresh.svg +6 -0
  45. package/assets/images/icons/reject-proposal.svg +6 -0
  46. package/assets/images/icons/search.svg +12 -0
  47. package/assets/images/icons/sun.svg +3 -0
  48. package/assets/images/icons/transfer.svg +5 -0
  49. package/assets/images/icons/trash-2.svg +8 -0
  50. package/assets/images/icons/upgrade.svg +4 -0
  51. package/assets/images/icons/wave.svg +214 -0
  52. package/assets/images/icons/x.svg +5 -0
  53. package/components/ActionLogo.vue +38 -0
  54. package/components/ActionMetadata.vue +73 -0
  55. package/components/ChainLogo.vue +141 -1
  56. package/components/metadata/Bridge.vue +39 -0
  57. package/components/metadata/CrossTransfer.vue +67 -0
  58. package/components/metadata/GasTopup.vue +33 -0
  59. package/components/metadata/Permit2.vue +37 -0
  60. package/components/metadata/Swap.vue +67 -0
  61. package/components/metadata/Transfer.vue +46 -0
  62. package/components.d.ts +13 -0
  63. package/contracts/Forwarder.ts +856 -2
  64. package/contracts/factories/Forwarder__factory.ts +816 -16
  65. package/nuxt.config.ts +18 -2
  66. package/package.json +7 -3
  67. package/server/utils/index.ts +2 -0
  68. package/utils/avocado.ts +2 -0
  69. package/utils/bignumber.ts +51 -0
  70. package/utils/formatter.ts +94 -0
  71. package/utils/helper.ts +33 -0
  72. package/utils/metadata.ts +343 -134
  73. package/utils/network.ts +145 -67
  74. package/utils/services.ts +14 -0
  75. package/utils/utils.d.ts +123 -80
  76. package/utils/index.ts +0 -93
package/utils/metadata.ts CHANGED
@@ -1,13 +1,37 @@
1
1
  import { ethers, utils } from "ethers";
2
- import { Forwarder__factory } from "@/contracts";
3
- import { toBN } from "./index";
2
+ import { Forwarder__factory } from "../contracts";
3
+
4
+ export const MetadataEnums = {
5
+ "transfer": "transfer",
6
+ "bridge": "bridge",
7
+ "swap": "swap",
8
+ "gas-topup": "gas-topup",
9
+ "upgrade": "upgrade",
10
+ "dapp": "dapp",
11
+ "deploy": "deploy",
12
+ "permit2": "permit2",
13
+ "cross-transfer": "cross-transfer",
14
+ "auth": "auth",
15
+ "rejection": "rejection",
16
+ "instadapp-pro": "instadapp-pro",
17
+ "add-signers": "add-signers",
18
+ "remove-signers": "remove-signers",
19
+ "change-threshold": "change-threshold",
20
+ } as const;
4
21
 
5
22
  const multiMetadataTypes = ["bytes[]"];
6
23
 
7
24
  const metadataTypes = ["bytes32 type", "uint8 version", "bytes data"];
8
25
 
9
- const actionMetadataTypes = {
26
+ const actionMetadataTypes: Record<MetadataTypes, string[]> = {
10
27
  transfer: ["address token", "uint256 amount", "address receiver"],
28
+ "cross-transfer": [
29
+ "address fromToken",
30
+ "address toToken",
31
+ "uint256 toChainId",
32
+ "uint256 amount",
33
+ "address receiver",
34
+ ],
11
35
  bridge: [
12
36
  "uint256 amount",
13
37
  "address receiver",
@@ -28,6 +52,7 @@ const actionMetadataTypes = {
28
52
  "gas-topup": ["uint256 amount", "address token", "address onBehalf"],
29
53
  upgrade: ["bytes32 version", "address walletImpl"],
30
54
  dapp: ["string name", "string url"],
55
+ auth: ["address address", "uint256 chainId", "bool remove"],
31
56
  deploy: [],
32
57
  permit2: [
33
58
  "address token",
@@ -35,6 +60,11 @@ const actionMetadataTypes = {
35
60
  "uint160 amount",
36
61
  "uint48 expiration",
37
62
  ],
63
+ "instadapp-pro": ["string castDetails"],
64
+ 'add-signers': ['address[] signers'],
65
+ 'remove-signers': ['address[] signers'],
66
+ 'change-threshold': ['uint8 count'],
67
+ 'rejection': ['bytes32 id'],
38
68
  };
39
69
 
40
70
  const encodeMetadata = (props: MetadataProps) => {
@@ -55,7 +85,7 @@ export const encodeDappMetadata = (
55
85
  );
56
86
 
57
87
  const data = encodeMetadata({
58
- type: "dapp",
88
+ type: MetadataEnums.dapp,
59
89
  encodedData,
60
90
  });
61
91
 
@@ -72,7 +102,61 @@ export const encodeTransferMetadata = (
72
102
  );
73
103
 
74
104
  const data = encodeMetadata({
75
- type: "transfer",
105
+ type: MetadataEnums.transfer,
106
+ encodedData,
107
+ });
108
+
109
+ return single ? encodeMultipleActions(data) : data;
110
+ };
111
+
112
+ export const encodeRejectionMetadata = (id: string, single = true) => {
113
+ const encodedData = ethers.utils.defaultAbiCoder.encode(
114
+ actionMetadataTypes.rejection,
115
+ [id]
116
+ );
117
+
118
+ const data = encodeMetadata({
119
+ type: MetadataEnums.rejection,
120
+ encodedData,
121
+ });
122
+
123
+ return single ? encodeMultipleActions(data) : data;
124
+ };
125
+
126
+ export const encodeCrossTransferMetadata = (
127
+ params: CrossSendMetadataProps,
128
+ single = true
129
+ ) => {
130
+ const encodedData = ethers.utils.defaultAbiCoder.encode(
131
+ actionMetadataTypes["cross-transfer"],
132
+ [
133
+ params.fromToken,
134
+ params.toToken,
135
+ params.toChainId,
136
+ params.amount,
137
+ params.receiver,
138
+ ]
139
+ );
140
+
141
+ const data = encodeMetadata({
142
+ type: MetadataEnums["cross-transfer"],
143
+ encodedData,
144
+ });
145
+
146
+ return single ? encodeMultipleActions(data) : data;
147
+ };
148
+
149
+ export const encodeAuthMetadata = (
150
+ params: AuthMetadataProps,
151
+ single = true
152
+ ) => {
153
+ const encodedData = ethers.utils.defaultAbiCoder.encode(
154
+ actionMetadataTypes["auth"],
155
+ [params.address, params.chainId, params.remove]
156
+ );
157
+
158
+ const data = encodeMetadata({
159
+ type: MetadataEnums.auth,
76
160
  encodedData,
77
161
  });
78
162
 
@@ -81,7 +165,7 @@ export const encodeTransferMetadata = (
81
165
 
82
166
  export const encodeDeployMetadata = (single = true) => {
83
167
  const data = encodeMetadata({
84
- type: "deploy",
168
+ type: MetadataEnums.deploy,
85
169
  encodedData: "0x",
86
170
  });
87
171
 
@@ -98,7 +182,7 @@ export const encodeWCSignMetadata = (
98
182
  );
99
183
 
100
184
  const data = encodeMetadata({
101
- type: "permit2",
185
+ type: MetadataEnums.permit2,
102
186
  encodedData,
103
187
  });
104
188
 
@@ -115,7 +199,7 @@ export const encodeUpgradeMetadata = (
115
199
  );
116
200
 
117
201
  const data = encodeMetadata({
118
- type: "upgrade",
202
+ type: MetadataEnums.upgrade,
119
203
  encodedData,
120
204
  });
121
205
 
@@ -139,7 +223,7 @@ export const encodeSwapMetadata = (
139
223
  );
140
224
 
141
225
  const data = encodeMetadata({
142
- type: "swap",
226
+ type: MetadataEnums.swap,
143
227
  encodedData,
144
228
  });
145
229
 
@@ -155,10 +239,8 @@ export const encodeTopupMetadata = (
155
239
  [params.amount, params.token, params.onBehalf]
156
240
  );
157
241
 
158
- console.log(params);
159
-
160
242
  const data = encodeMetadata({
161
- type: "gas-topup",
243
+ type: MetadataEnums["gas-topup"],
162
244
  encodedData,
163
245
  });
164
246
 
@@ -183,7 +265,58 @@ export const encodeBridgeMetadata = (
183
265
  );
184
266
 
185
267
  const data = encodeMetadata({
186
- type: "bridge",
268
+ type: MetadataEnums.bridge,
269
+ encodedData,
270
+ });
271
+
272
+ return single ? encodeMultipleActions(data) : data;
273
+ };
274
+
275
+ export const encodeChangeThresholdMetadata = (
276
+ threshold: string | number,
277
+ single = true
278
+ ) => {
279
+ const encodedData = ethers.utils.defaultAbiCoder.encode(
280
+ actionMetadataTypes["change-threshold"],
281
+ [toBN(threshold).toNumber()]
282
+ );
283
+
284
+ const data = encodeMetadata({
285
+ type: MetadataEnums["change-threshold"],
286
+ encodedData,
287
+ });
288
+
289
+ return single ? encodeMultipleActions(data) : data;
290
+ };
291
+
292
+ export const encodeRemoveSignersMetadata = (
293
+ addresses: string[],
294
+ single = true
295
+ ) => {
296
+ const encodedData = ethers.utils.defaultAbiCoder.encode(
297
+ actionMetadataTypes["remove-signers"],
298
+ [addresses]
299
+ );
300
+
301
+ const data = encodeMetadata({
302
+ type: MetadataEnums["remove-signers"],
303
+ encodedData,
304
+ });
305
+
306
+ return single ? encodeMultipleActions(data) : data;
307
+ };
308
+
309
+ export const encodeAddSignersMetadata = (
310
+ addresses: string[],
311
+ single = true
312
+ ) => {
313
+ const encodedData = ethers.utils.defaultAbiCoder.encode(
314
+ actionMetadataTypes["add-signers"],
315
+ [addresses]
316
+ );
317
+
318
+ const data = encodeMetadata({
319
+ type: MetadataEnums["add-signers"],
187
320
  encodedData,
188
321
  });
189
322
 
@@ -194,134 +327,210 @@ export const encodeMultipleActions = (...actionData: string[]) => {
194
327
  return ethers.utils.defaultAbiCoder.encode(multiMetadataTypes, [actionData]);
195
328
  };
196
329
 
197
- export const decodeMetadata = (data: string) => {
330
+ export const decodeData = (data: string) => {
331
+ try {
332
+ const metadata = getMetadataFromData(data) || "0x";
333
+
334
+ return parseMetadata(metadata);
335
+ } catch (e) {
336
+ // console.log(e);
337
+ return null;
338
+ }
339
+ };
340
+
341
+ export const decodeMetadata = (metadata: string) => {
198
342
  try {
199
- const iface = Forwarder__factory.createInterface();
200
- let metadata = "0x";
201
- let payload = {};
202
-
203
- if (!data) return payload;
204
-
205
- if (data.startsWith("0x18e7f485")) {
206
- const executeData = iface.decodeFunctionData("execute", data);
207
- if (executeData.metadata_ === "0x" || !executeData.metadata_) {
208
- return null;
209
- } else {
210
- metadata = executeData.metadata_;
211
- }
343
+ return parseMetadata(metadata);
344
+ } catch (e) {
345
+ return null;
346
+ }
347
+ };
348
+
349
+ const getMetadataFromData = (data: string) => {
350
+ const iface = Forwarder__factory.createInterface();
351
+ let metadata = "0x";
352
+
353
+ if (data.startsWith("0x18e7f485")) {
354
+ const executeData = iface.decodeFunctionData("execute", data);
355
+ if (executeData.metadata_ === "0x" || !executeData.metadata_) {
356
+ return null;
357
+ } else {
358
+ metadata = executeData.metadata_;
359
+ }
360
+ } else if (data.startsWith("0x14f80a8d")) {
361
+ const executeDataV2 = iface.decodeFunctionData("executeV2", data);
362
+ if (
363
+ executeDataV2.params_.metadata === "0x" ||
364
+ !executeDataV2.params_.metadata
365
+ ) {
366
+ return null;
212
367
  } else {
213
- const executeDataV2 = iface.decodeFunctionData("executeV2", data);
214
- if (
215
- executeDataV2.params_.metadata === "0x" ||
216
- !executeDataV2.params_.metadata
217
- ) {
218
- return null;
219
- } else {
220
- metadata = executeDataV2.params_.metadata;
221
- }
368
+ metadata = executeDataV2.params_.metadata;
222
369
  }
370
+ } else if (data.startsWith("0x85114d53")) {
371
+ const executeDataV3 = iface.decodeFunctionData("executeV3", data);
372
+ if (
373
+ executeDataV3.params_.metadata === "0x" ||
374
+ !executeDataV3.params_.metadata
375
+ ) {
376
+ return null;
377
+ } else {
378
+ metadata = executeDataV3.params_.metadata;
379
+ }
380
+ } else {
381
+ const executeDataMultisigV3 = iface.decodeFunctionData(
382
+ "executeMultisigV3",
383
+ data
384
+ );
385
+ if (
386
+ executeDataMultisigV3.params_.metadata === "0x" ||
387
+ !executeDataMultisigV3.params_.metadata
388
+ ) {
389
+ return null;
390
+ } else {
391
+ metadata = executeDataMultisigV3.params_.metadata;
392
+ }
393
+ }
394
+
395
+ return metadata;
396
+ };
223
397
 
224
- const metadataArr = [];
225
-
226
- const [decodedMultiMetadata = []] =
227
- (ethers.utils.defaultAbiCoder.decode(
228
- multiMetadataTypes,
229
- metadata
230
- ) as string[]) || [];
231
-
232
- for (let metadata of decodedMultiMetadata) {
233
- const decodedMetadata = ethers.utils.defaultAbiCoder.decode(
234
- metadataTypes,
235
- metadata
236
- );
237
-
238
- const type = ethers.utils.parseBytes32String(
239
- decodedMetadata.type
240
- ) as keyof typeof actionMetadataTypes;
241
-
242
- const decodedData = ethers.utils.defaultAbiCoder.decode(
243
- actionMetadataTypes[type],
244
- decodedMetadata.data
245
- );
246
-
247
- switch (type) {
248
- case "transfer":
249
- payload = {
250
- type,
251
- token: decodedData.token,
252
- amount: toBN(decodedData.amount).toFixed(),
253
- receiver: decodedData.receiver,
254
- };
255
- break;
256
- case "bridge":
257
- payload = {
258
- type,
259
- amount: toBN(decodedData.amount).toFixed(),
260
- receiver: decodedData.receiver,
261
- toToken: decodedData.toToken,
262
- fromToken: decodedData.fromToken,
263
- toChainId: decodedData.toChainId
264
- ? decodedData.toChainId.toString()
265
- : null,
266
- bridgeFee: toBN(decodedData.bridgeFee).toFixed(),
267
- };
268
- break;
269
- case "swap":
270
- payload = {
271
- type,
272
- buyAmount: toBN(decodedData.buyAmount).toFixed(),
273
- sellAmount: toBN(decodedData.sellAmount).toFixed(),
274
- buyToken: decodedData.buyToken,
275
- sellToken: decodedData.sellToken,
276
- receiver: decodedData.receiver,
277
- protocol: utils.parseBytes32String(decodedData?.protocol || ""),
278
- };
279
- break;
280
- case "upgrade":
281
- payload = {
282
- type,
283
- version: utils.parseBytes32String(decodedData?.version || ""),
284
- walletImpl: decodedData?.walletImpl,
285
- };
286
- break;
287
- case "gas-topup":
288
- payload = {
289
- type,
290
- amount: toBN(decodedData.amount).toFixed(),
291
- token: decodedData.token,
292
- onBehalf: decodedData.onBehalf,
293
- };
294
- break;
295
- case "dapp":
296
- payload = {
297
- type,
298
- name: decodedData?.name,
299
- url: decodedData?.url,
300
- };
301
- break;
302
- case "deploy":
303
- payload = {
304
- type,
305
- };
306
-
307
- case "permit2":
308
- payload = {
309
- type,
310
- token: decodedData.token,
311
- spender: decodedData.spender,
312
- amount: toBN(decodedData.amount).toFixed(),
313
- expiration: decodedData.expiration,
314
- };
315
-
316
- break;
317
- }
318
398
 
399
+ const typesPayload: IPayload = {
400
+ transfer: (data, type) => ({
401
+ type,
402
+ token: data.token,
403
+ amount: toBN(data.amount).toFixed(),
404
+ receiver: data.receiver,
405
+ }),
406
+ bridge: (data, type) => ({
407
+ type,
408
+ amount: toBN(data.amount).toFixed(),
409
+ receiver: data.receiver,
410
+ toToken: data.toToken,
411
+ fromToken: data.fromToken,
412
+ toChainId: data.toChainId ? data.toChainId.toString() : null,
413
+ bridgeFee: toBN(data.bridgeFee).toFixed(),
414
+ }),
415
+ swap: (data, type) => ({
416
+ type,
417
+ buyAmount: toBN(data.buyAmount).toFixed(),
418
+ sellAmount: toBN(data.sellAmount).toFixed(),
419
+ buyToken: data.buyToken,
420
+ sellToken: data.sellToken,
421
+ receiver: data.receiver,
422
+ protocol: utils.parseBytes32String(data.protocol || ""),
423
+ }),
424
+ upgrade: (data, type) => ({
425
+ type,
426
+ version: utils.parseBytes32String(data.version || ""),
427
+ walletImpl: data.walletImpl,
428
+ }),
429
+ "gas-topup": (data, type) => ({
430
+ type,
431
+ amount: toBN(data.amount).toFixed(),
432
+ token: data.token,
433
+ onBehalf: data.onBehalf,
434
+ }),
435
+ "dapp": (data, type) => ({
436
+ type,
437
+ name: data.name,
438
+ url: data.url,
439
+ }),
440
+ "deploy": (data, type) => ({
441
+ type,
442
+ }),
443
+ "permit2": (data, type) => ({
444
+ type,
445
+ token: data.token,
446
+ spender: data.spender,
447
+ amount: toBN(data.amount).toFixed(),
448
+ expiration: data.expiration,
449
+ }),
450
+ "cross-transfer": (data, type) => ({
451
+ type,
452
+ fromToken: data.fromToken,
453
+ toToken: data.toToken,
454
+ toChainId: data.toChainId ? data.toChainId.toString() : null,
455
+ amount: toBN(data.amount).toFixed(),
456
+ receiver: data.receiver,
457
+ }),
458
+ "auth": (data) => ({
459
+ type: data.remove ? "remove-authority" : "add-authority",
460
+ address: data.address,
461
+ chainId: data.chainId ? data.chainId.toString() : null,
462
+ remove: data.remove,
463
+ }),
464
+ "instadapp-pro": (data, type) => ({
465
+ type,
466
+ castDetails: data.castDetails,
467
+ }),
468
+ "rejection": (data, type) => ({
469
+ type,
470
+ id: data.id,
471
+ }),
472
+ "add-signers": (data, type) => ({
473
+ type,
474
+ addresses: data.signers,
475
+ }),
476
+ "remove-signers": (data, type) => ({
477
+ type,
478
+ addresses: data.signers,
479
+ }),
480
+ "change-threshold": (data, type) => ({
481
+ type,
482
+ count: data.count,
483
+ }),
484
+ };
485
+
486
+ const parseMetadata = (metadata: string) => {
487
+ const metadataArr = [];
488
+
489
+ const [decodedMultiMetadata = []] =
490
+ (ethers.utils.defaultAbiCoder.decode(
491
+ multiMetadataTypes,
492
+ metadata
493
+ ) as string[]) || [];
494
+
495
+ for (let metadata of decodedMultiMetadata) {
496
+ const decodedMetadata = ethers.utils.defaultAbiCoder.decode(
497
+ metadataTypes,
498
+ metadata
499
+ );
500
+
501
+ const type = ethers.utils.parseBytes32String(
502
+ decodedMetadata.type
503
+ ) as keyof typeof actionMetadataTypes;
504
+
505
+ const decodedData = ethers.utils.defaultAbiCoder.decode(
506
+ actionMetadataTypes[type],
507
+ decodedMetadata.data
508
+ );
509
+
510
+ const payloadFunc = typesPayload[type]
511
+
512
+ if (payloadFunc) {
513
+ const payload = payloadFunc(decodedData, type)
319
514
  metadataArr.push(payload);
320
515
  }
321
516
 
322
- return metadataArr;
323
- } catch (e) {
324
- console.log(e);
325
- return null;
326
517
  }
518
+
519
+ return metadataArr;
520
+ };
521
+
522
+
523
+
524
+ /**
525
+ * Replaces hyphens with spaces and capitalizes the first letter of each word in a sentence.
526
+ * @param {string} txType - The input sentence to modify
527
+ *
528
+ * @returns {string} - The modified sentence with hyphens replaced with spaces and the first letter of each word capitalized.
529
+ */
530
+ export const formatTxType = (txType: string) => {
531
+ const finalSentence = txType
532
+ .replace("-", " ")
533
+ .replace(/(^\w{1})|(\s+\w{1})/g, (letter) => letter.toUpperCase());
534
+
535
+ return finalSentence;
327
536
  };