@instadapp/avocado-base 0.0.0-dev.39c2fcc → 0.0.0-dev.3aec0c2

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 (89) hide show
  1. package/.github/workflows/npm-publish-dev.yml +2 -5
  2. package/abi/forwarder.json +8 -8
  3. package/abi/multisigAgnosticForwarder.json +1 -0
  4. package/abi/multisigForwarder.json +697 -0
  5. package/app.vue +7 -0
  6. package/assets/images/icons/arrow-left.svg +5 -0
  7. package/assets/images/icons/arrow-right.svg +5 -0
  8. package/assets/images/icons/avocado.svg +4 -0
  9. package/assets/images/icons/bridge-2.svg +3 -0
  10. package/assets/images/icons/bridge.svg +7 -0
  11. package/assets/images/icons/calendar.svg +8 -0
  12. package/assets/images/icons/change-threshold.svg +4 -0
  13. package/assets/images/icons/check-circle.svg +4 -0
  14. package/assets/images/icons/chevron-down.svg +4 -0
  15. package/assets/images/icons/clipboard.svg +7 -0
  16. package/assets/images/icons/clock-circle.svg +5 -0
  17. package/assets/images/icons/copy.svg +5 -0
  18. package/assets/images/icons/cross-transfer.svg +7 -0
  19. package/assets/images/icons/dapp.svg +4 -0
  20. package/assets/images/icons/deploy.svg +12 -0
  21. package/assets/images/icons/error-circle.svg +6 -0
  22. package/assets/images/icons/exclamation-circle.svg +13 -0
  23. package/assets/images/icons/exclamation-octagon.svg +13 -0
  24. package/assets/images/icons/exclamation-triangle.svg +5 -0
  25. package/assets/images/icons/external-link.svg +6 -0
  26. package/assets/images/icons/eye.svg +4 -0
  27. package/assets/images/icons/flowers.svg +8 -0
  28. package/assets/images/icons/gas-emoji.svg +193 -0
  29. package/assets/images/icons/gas.svg +14 -0
  30. package/assets/images/icons/gift.svg +153 -0
  31. package/assets/images/icons/globe.svg +110 -0
  32. package/assets/images/icons/hamburger.svg +6 -0
  33. package/assets/images/icons/hammer.svg +5 -0
  34. package/assets/images/icons/info-2.svg +12 -0
  35. package/assets/images/icons/instadapp-pro.svg +4 -0
  36. package/assets/images/icons/logout.svg +3 -0
  37. package/assets/images/icons/moon.svg +3 -0
  38. package/assets/images/icons/multi-send.svg +7 -0
  39. package/assets/images/icons/network.svg +13 -0
  40. package/assets/images/icons/options.svg +5 -0
  41. package/assets/images/icons/permit-sign.svg +11 -0
  42. package/assets/images/icons/plus-circle.svg +6 -0
  43. package/assets/images/icons/plus.svg +5 -0
  44. package/assets/images/icons/power-off-bg.svg +24 -0
  45. package/assets/images/icons/power-off.svg +19 -0
  46. package/assets/images/icons/power-on.svg +19 -0
  47. package/assets/images/icons/qr.svg +20 -0
  48. package/assets/images/icons/question-circle.svg +14 -0
  49. package/assets/images/icons/refresh.svg +6 -0
  50. package/assets/images/icons/reject-proposal.svg +6 -0
  51. package/assets/images/icons/search.svg +12 -0
  52. package/assets/images/icons/stars.svg +4 -0
  53. package/assets/images/icons/sun.svg +3 -0
  54. package/assets/images/icons/transfer.svg +5 -0
  55. package/assets/images/icons/trash-2.svg +8 -0
  56. package/assets/images/icons/upgrade.svg +4 -0
  57. package/assets/images/icons/wave.svg +214 -0
  58. package/assets/images/icons/x.svg +5 -0
  59. package/components/ActionLogo.vue +42 -0
  60. package/components/ActionMetadata.vue +82 -0
  61. package/components/AuthorityAvatar.vue +37 -0
  62. package/components/ChainLogo.vue +14 -563
  63. package/components/CopyClipboard.vue +58 -0
  64. package/components/metadata/Bridge.vue +59 -0
  65. package/components/metadata/CrossTransfer.vue +79 -0
  66. package/components/metadata/GasTopup.vue +39 -0
  67. package/components/metadata/Permit2.vue +42 -0
  68. package/components/metadata/Signers.vue +66 -0
  69. package/components/metadata/Swap.vue +67 -0
  70. package/components/metadata/Transfer.vue +50 -0
  71. package/components.d.ts +13 -0
  72. package/contracts/Forwarder.ts +4 -4
  73. package/contracts/MultisigAgnosticForwarder.ts +1413 -0
  74. package/contracts/MultisigForwarder.ts +859 -0
  75. package/contracts/factories/Forwarder__factory.ts +8 -8
  76. package/contracts/factories/MultisigAgnosticForwarder__factory.ts +2051 -0
  77. package/contracts/factories/MultisigForwarder__factory.ts +721 -0
  78. package/contracts/factories/index.ts +2 -0
  79. package/contracts/index.ts +4 -0
  80. package/nuxt.config.ts +17 -1
  81. package/package.json +16 -8
  82. package/utils/avocado.ts +2 -0
  83. package/utils/bignumber.ts +20 -0
  84. package/utils/formatter.ts +2 -2
  85. package/utils/helper.ts +8 -0
  86. package/utils/metadata.ts +456 -180
  87. package/utils/network.ts +365 -74
  88. package/utils/services.ts +21 -0
  89. package/utils/utils.d.ts +142 -114
package/utils/metadata.ts CHANGED
@@ -1,11 +1,36 @@
1
1
  import { ethers, utils } from "ethers";
2
- import { Forwarder__factory } from "../contracts";
2
+ import { Forwarder__factory, MultisigForwarder__factory, MultisigAgnosticForwarder__factory } from "../contracts";
3
+ import { toBN } from "./bignumber";
4
+
5
+ export const MetadataEnums = {
6
+ transfer: "transfer",
7
+ bridge: "bridge",
8
+ 'bridge-v2': 'bridge-v2',
9
+ swap: "swap",
10
+ "gas-topup": "gas-topup",
11
+ upgrade: "upgrade",
12
+ dapp: "dapp",
13
+ deploy: "deploy",
14
+ permit2: "permit2",
15
+ "cross-transfer": "cross-transfer",
16
+ 'cross-transfer-v2': 'cross-transfer-v2',
17
+ auth: "auth",
18
+ rejection: "rejection",
19
+ "instadapp-pro": "instadapp-pro",
20
+ "add-signers": "add-signers",
21
+ "remove-signers": "remove-signers",
22
+ "change-threshold": "change-threshold",
23
+ import: "import",
24
+ mass: "mass",
25
+ "tx-builder": "tx-builder",
26
+ "avocado-bridge": "avocado-bridge",
27
+ } as const;
3
28
 
4
29
  const multiMetadataTypes = ["bytes[]"];
5
30
 
6
31
  const metadataTypes = ["bytes32 type", "uint8 version", "bytes data"];
7
32
 
8
- const actionMetadataTypes = {
33
+ const actionMetadataTypes: Record<MetadataTypes, string[]> = {
9
34
  transfer: ["address token", "uint256 amount", "address receiver"],
10
35
  "cross-transfer": [
11
36
  "address fromToken",
@@ -14,6 +39,14 @@ const actionMetadataTypes = {
14
39
  "uint256 amount",
15
40
  "address receiver",
16
41
  ],
42
+ "cross-transfer-v2": [
43
+ "address fromToken",
44
+ "address toToken",
45
+ "uint256 toChainId",
46
+ "uint256 amount",
47
+ "address receiver",
48
+ "bytes32 provider",
49
+ ],
17
50
  bridge: [
18
51
  "uint256 amount",
19
52
  "address receiver",
@@ -23,6 +56,16 @@ const actionMetadataTypes = {
23
56
  "uint256 bridgeFee",
24
57
  "address nativeToken",
25
58
  ],
59
+ 'bridge-v2': [
60
+ "uint256 amount",
61
+ "address receiver",
62
+ "address fromToken",
63
+ "address toToken",
64
+ "uint256 toChainId",
65
+ "uint256 bridgeFee",
66
+ "address nativeToken",
67
+ "bytes32 provider",
68
+ ],
26
69
  swap: [
27
70
  "address sellToken",
28
71
  "address buyToken",
@@ -34,8 +77,10 @@ const actionMetadataTypes = {
34
77
  "gas-topup": ["uint256 amount", "address token", "address onBehalf"],
35
78
  upgrade: ["bytes32 version", "address walletImpl"],
36
79
  dapp: ["string name", "string url"],
80
+ import: ["bytes32 protocol", "uint256 valueInUsd"],
37
81
  auth: ["address address", "uint256 chainId", "bool remove"],
38
82
  deploy: [],
83
+ "tx-builder": ["bytes32 actionCount"],
39
84
  permit2: [
40
85
  "address token",
41
86
  "address spender",
@@ -43,6 +88,12 @@ const actionMetadataTypes = {
43
88
  "uint48 expiration",
44
89
  ],
45
90
  "instadapp-pro": ["string castDetails"],
91
+ "add-signers": ["address[] signers"],
92
+ "remove-signers": ["address[] signers"],
93
+ "change-threshold": ["uint8 count"],
94
+ rejection: ["bytes32 id"],
95
+ "avocado-bridge": ["bytes32 id", "uint256 toChainId"],
96
+ mass: ["bool isMass"],
46
97
  };
47
98
 
48
99
  const encodeMetadata = (props: MetadataProps) => {
@@ -63,7 +114,25 @@ export const encodeDappMetadata = (
63
114
  );
64
115
 
65
116
  const data = encodeMetadata({
66
- type: "dapp",
117
+ type: MetadataEnums.dapp,
118
+ encodedData,
119
+ });
120
+
121
+ return single ? encodeMultipleActions(data) : data;
122
+ };
123
+
124
+ export const encodeAvocadoBridgeMetadata = (
125
+ id: string,
126
+ toChainId: string | number,
127
+ single = true
128
+ ) => {
129
+ const encodedData = ethers.utils.defaultAbiCoder.encode(
130
+ actionMetadataTypes["avocado-bridge"],
131
+ [id, toChainId]
132
+ );
133
+
134
+ const data = encodeMetadata({
135
+ type: MetadataEnums["avocado-bridge"],
67
136
  encodedData,
68
137
  });
69
138
 
@@ -80,7 +149,21 @@ export const encodeTransferMetadata = (
80
149
  );
81
150
 
82
151
  const data = encodeMetadata({
83
- type: "transfer",
152
+ type: MetadataEnums.transfer,
153
+ encodedData,
154
+ });
155
+
156
+ return single ? encodeMultipleActions(data) : data;
157
+ };
158
+
159
+ export const encodeRejectionMetadata = (id: string, single = true) => {
160
+ const encodedData = ethers.utils.defaultAbiCoder.encode(
161
+ actionMetadataTypes.rejection,
162
+ [id]
163
+ );
164
+
165
+ const data = encodeMetadata({
166
+ type: MetadataEnums.rejection,
84
167
  encodedData,
85
168
  });
86
169
 
@@ -91,8 +174,21 @@ export const encodeCrossTransferMetadata = (
91
174
  params: CrossSendMetadataProps,
92
175
  single = true
93
176
  ) => {
94
- const encodedData = ethers.utils.defaultAbiCoder.encode(
95
- actionMetadataTypes["cross-transfer"],
177
+
178
+ const type = params.provider ? MetadataEnums["cross-transfer-v2"] : MetadataEnums["cross-transfer"]
179
+
180
+ const encodedData = params.provider ? ethers.utils.defaultAbiCoder.encode(
181
+ actionMetadataTypes[type],
182
+ [
183
+ params.fromToken,
184
+ params.toToken,
185
+ params.toChainId,
186
+ params.amount,
187
+ params.receiver,
188
+ params.provider
189
+ ]
190
+ ) : ethers.utils.defaultAbiCoder.encode(
191
+ actionMetadataTypes[type],
96
192
  [
97
193
  params.fromToken,
98
194
  params.toToken,
@@ -103,7 +199,7 @@ export const encodeCrossTransferMetadata = (
103
199
  );
104
200
 
105
201
  const data = encodeMetadata({
106
- type: "cross-transfer",
202
+ type: MetadataEnums[type],
107
203
  encodedData,
108
204
  });
109
205
 
@@ -120,7 +216,7 @@ export const encodeAuthMetadata = (
120
216
  );
121
217
 
122
218
  const data = encodeMetadata({
123
- type: "auth",
219
+ type: MetadataEnums.auth,
124
220
  encodedData,
125
221
  });
126
222
 
@@ -129,13 +225,30 @@ export const encodeAuthMetadata = (
129
225
 
130
226
  export const encodeDeployMetadata = (single = true) => {
131
227
  const data = encodeMetadata({
132
- type: "deploy",
228
+ type: MetadataEnums.deploy,
133
229
  encodedData: "0x",
134
230
  });
135
231
 
136
232
  return single ? encodeMultipleActions(data) : data;
137
233
  };
138
234
 
235
+ export const encodeTransactionBuilderMetadata = (
236
+ actionCount: string,
237
+ single = true
238
+ ) => {
239
+ const encodedData = ethers.utils.defaultAbiCoder.encode(
240
+ actionMetadataTypes["tx-builder"],
241
+ [actionCount]
242
+ );
243
+
244
+ const data = encodeMetadata({
245
+ type: MetadataEnums["tx-builder"],
246
+ encodedData,
247
+ });
248
+
249
+ return single ? encodeMultipleActions(data) : data;
250
+ };
251
+
139
252
  export const encodeWCSignMetadata = (
140
253
  params: SignMetadataProps,
141
254
  single = true
@@ -146,7 +259,7 @@ export const encodeWCSignMetadata = (
146
259
  );
147
260
 
148
261
  const data = encodeMetadata({
149
- type: "permit2",
262
+ type: MetadataEnums.permit2,
150
263
  encodedData,
151
264
  });
152
265
 
@@ -163,7 +276,7 @@ export const encodeUpgradeMetadata = (
163
276
  );
164
277
 
165
278
  const data = encodeMetadata({
166
- type: "upgrade",
279
+ type: MetadataEnums.upgrade,
167
280
  encodedData,
168
281
  });
169
282
 
@@ -187,7 +300,7 @@ export const encodeSwapMetadata = (
187
300
  );
188
301
 
189
302
  const data = encodeMetadata({
190
- type: "swap",
303
+ type: MetadataEnums.swap,
191
304
  encodedData,
192
305
  });
193
306
 
@@ -203,10 +316,8 @@ export const encodeTopupMetadata = (
203
316
  [params.amount, params.token, params.onBehalf]
204
317
  );
205
318
 
206
- console.log(params);
207
-
208
319
  const data = encodeMetadata({
209
- type: "gas-topup",
320
+ type: MetadataEnums["gas-topup"],
210
321
  encodedData,
211
322
  });
212
323
 
@@ -217,7 +328,21 @@ export const encodeBridgeMetadata = (
217
328
  params: BridgeMetadataProps,
218
329
  single = true
219
330
  ) => {
220
- const encodedData = ethers.utils.defaultAbiCoder.encode(
331
+ const type = params.version === '2' ? MetadataEnums["bridge-v2"] : MetadataEnums.bridge
332
+
333
+ const encodedData = params.version === '2' ? ethers.utils.defaultAbiCoder.encode(
334
+ actionMetadataTypes["bridge-v2"],
335
+ [
336
+ params.amount,
337
+ params.receiver,
338
+ params.fromToken,
339
+ params.toToken,
340
+ params.toChainId,
341
+ params.bridgeFee,
342
+ params.nativeToken,
343
+ params.provider
344
+ ]
345
+ ): ethers.utils.defaultAbiCoder.encode(
221
346
  actionMetadataTypes.bridge,
222
347
  [
223
348
  params.amount,
@@ -231,7 +356,85 @@ export const encodeBridgeMetadata = (
231
356
  );
232
357
 
233
358
  const data = encodeMetadata({
234
- type: "bridge",
359
+ type,
360
+ encodedData,
361
+ });
362
+
363
+ return single ? encodeMultipleActions(data) : data;
364
+ };
365
+
366
+ export const encodeChangeThresholdMetadata = (
367
+ threshold: string | number,
368
+ single = true
369
+ ) => {
370
+ const encodedData = ethers.utils.defaultAbiCoder.encode(
371
+ actionMetadataTypes["change-threshold"],
372
+ [toBN(threshold).toNumber()]
373
+ );
374
+
375
+ const data = encodeMetadata({
376
+ type: MetadataEnums["change-threshold"],
377
+ encodedData,
378
+ });
379
+
380
+ return single ? encodeMultipleActions(data) : data;
381
+ };
382
+
383
+ export const encodeRemoveSignersMetadata = (
384
+ addresses: string[],
385
+ single = true
386
+ ) => {
387
+ const encodedData = ethers.utils.defaultAbiCoder.encode(
388
+ actionMetadataTypes["remove-signers"],
389
+ [addresses]
390
+ );
391
+
392
+ const data = encodeMetadata({
393
+ type: MetadataEnums["remove-signers"],
394
+ encodedData,
395
+ });
396
+
397
+ return single ? encodeMultipleActions(data) : data;
398
+ };
399
+
400
+ export const encodeImportMetadata = (
401
+ protocol: string,
402
+ valueInUsd: string,
403
+ single = true
404
+ ) => {
405
+ const encodedData = ethers.utils.defaultAbiCoder.encode(
406
+ actionMetadataTypes["import"],
407
+ [protocol, valueInUsd]
408
+ );
409
+
410
+ const data = encodeMetadata({
411
+ type: MetadataEnums["import"],
412
+ encodedData,
413
+ });
414
+
415
+ return single ? encodeMultipleActions(data) : data;
416
+ };
417
+
418
+ export const encodeMassMetadata = (single = true) => {
419
+ const data = encodeMetadata({
420
+ type: MetadataEnums.mass,
421
+ encodedData: '0x',
422
+ });
423
+
424
+ return single ? encodeMultipleActions(data) : data;
425
+ }
426
+
427
+ export const encodeAddSignersMetadata = (
428
+ addresses: string[],
429
+ single = true
430
+ ) => {
431
+ const encodedData = ethers.utils.defaultAbiCoder.encode(
432
+ actionMetadataTypes["add-signers"],
433
+ [addresses]
434
+ );
435
+
436
+ const data = encodeMetadata({
437
+ type: MetadataEnums["add-signers"],
235
438
  encodedData,
236
439
  });
237
440
 
@@ -242,176 +445,249 @@ export const encodeMultipleActions = (...actionData: string[]) => {
242
445
  return ethers.utils.defaultAbiCoder.encode(multiMetadataTypes, [actionData]);
243
446
  };
244
447
 
245
- export const decodeMetadata = (data: string) => {
448
+ export const decodeData = (data: string) => {
246
449
  try {
247
- const iface = Forwarder__factory.createInterface();
248
- let metadata = "0x";
249
- let payload = {};
250
-
251
- if (!data) return payload;
252
-
253
- if (data.startsWith("0x18e7f485")) {
254
- const executeData = iface.decodeFunctionData("execute", data);
255
- if (executeData.metadata_ === "0x" || !executeData.metadata_) {
256
- return null;
257
- } else {
258
- metadata = executeData.metadata_;
259
- }
260
- } else if (data.startsWith("0x14f80a8d")) {
261
- const executeDataV2 = iface.decodeFunctionData("executeV2", data);
262
- if (
263
- executeDataV2.params_.metadata === "0x" ||
264
- !executeDataV2.params_.metadata
265
- ) {
266
- return null;
267
- } else {
268
- metadata = executeDataV2.params_.metadata;
269
- }
450
+ const metadata = getMetadataFromData(data) || "0x";
451
+
452
+ return parseMetadata(metadata);
453
+ } catch (e) {
454
+ // console.log(e);
455
+ return null;
456
+ }
457
+ };
458
+
459
+ export const decodeMetadata = (metadata: string) => {
460
+ try {
461
+ return parseMetadata(metadata);
462
+ } catch (e) {
463
+ return null;
464
+ }
465
+ };
466
+
467
+ const iface = Forwarder__factory.createInterface();
468
+ const ifaceMultisig = MultisigForwarder__factory.createInterface();
469
+ const ifaceAgnostic = MultisigAgnosticForwarder__factory.createInterface();
470
+
471
+ const getMetadataFromData = (data: string) => {
472
+ let metadata = "0x";
473
+
474
+
475
+ if(data.startsWith('0x320036b4')) {
476
+ const executeData = ifaceAgnostic.decodeFunctionData("executeChainAgnosticV1", data);
477
+
478
+ const metadata = executeData?.params_?.params?.metadata
479
+
480
+ return metadata === '0x' || !metadata ? null : metadata
481
+ }
482
+
483
+ else if (data.startsWith("0x18e7f485")) {
484
+ const executeData = iface.decodeFunctionData("execute", data);
485
+ if (executeData.metadata_ === "0x" || !executeData.metadata_) {
486
+ return null;
487
+ } else {
488
+ metadata = executeData.metadata_;
489
+ }
490
+ } else if (data.startsWith("0x14f80a8d")) {
491
+ const executeDataV2 = iface.decodeFunctionData("executeV2", data);
492
+ if (
493
+ executeDataV2.params_.metadata === "0x" ||
494
+ !executeDataV2.params_.metadata
495
+ ) {
496
+ return null;
497
+ } else {
498
+ metadata = executeDataV2.params_.metadata;
499
+ }
500
+ } else {
501
+ const executeDataMultisig = ifaceMultisig.decodeFunctionData(
502
+ "executeV1",
503
+ data
504
+ );
505
+ if (
506
+ executeDataMultisig.params_.metadata === "0x" ||
507
+ !executeDataMultisig.params_.metadata
508
+ ) {
509
+ return null;
270
510
  } else {
271
- const executeDataV3 = iface.decodeFunctionData("executeV3", data);
272
- if (
273
- executeDataV3.params_.metadata === "0x" ||
274
- !executeDataV3.params_.metadata
275
- ) {
276
- return null;
277
- } else {
278
- metadata = executeDataV3.params_.metadata;
279
- }
511
+ metadata = executeDataMultisig.params_.metadata;
280
512
  }
513
+ }
514
+
515
+ return metadata;
516
+ };
517
+
518
+ const typesPayload: IPayload = {
519
+ import: (data, type) => ({
520
+ type,
521
+ protocol: utils.parseBytes32String(data.protocol || ""),
522
+ valueInUsd: toBN(data.valueInUsd).toFixed(),
523
+ }),
524
+ transfer: (data, type) => ({
525
+ type,
526
+ token: data.token,
527
+ amount: toBN(data.amount).toFixed(),
528
+ receiver: data.receiver,
529
+ }),
530
+ bridge: (data, type) => ({
531
+ type,
532
+ amount: toBN(data.amount).toFixed(),
533
+ receiver: data.receiver,
534
+ toToken: data.toToken,
535
+ fromToken: data.fromToken,
536
+ toChainId: data.toChainId ? data.toChainId.toString() : null,
537
+ bridgeFee: toBN(data.bridgeFee).toFixed(),
538
+ }),
539
+ 'bridge-v2': (data, type) => ({
540
+ type: 'bridge',
541
+ amount: toBN(data.amount).toFixed(),
542
+ receiver: data.receiver,
543
+ toToken: data.toToken,
544
+ fromToken: data.fromToken,
545
+ toChainId: data.toChainId ? data.toChainId.toString() : null,
546
+ bridgeFee: toBN(data.bridgeFee).toFixed(),
547
+ provider: utils.parseBytes32String(data.provider || ""),
548
+ }),
549
+ swap: (data, type) => ({
550
+ type,
551
+ buyAmount: toBN(data.buyAmount).toFixed(),
552
+ sellAmount: toBN(data.sellAmount).toFixed(),
553
+ buyToken: data.buyToken,
554
+ sellToken: data.sellToken,
555
+ receiver: data.receiver,
556
+ protocol: utils.parseBytes32String(data.protocol || ""),
557
+ }),
558
+ upgrade: (data, type) => ({
559
+ type,
560
+ version: utils.parseBytes32String(data.version || ""),
561
+ walletImpl: data.walletImpl,
562
+ }),
563
+ "gas-topup": (data, type) => ({
564
+ type,
565
+ amount: toBN(data.amount).toFixed(),
566
+ token: data.token,
567
+ onBehalf: data.onBehalf,
568
+ }),
569
+ dapp: (data, type) => ({
570
+ type,
571
+ name: data.name,
572
+ url: data.url,
573
+ }),
574
+ deploy: (data, type) => ({
575
+ type,
576
+ }),
577
+ "tx-builder": (data, type) => ({
578
+ type,
579
+ actionCount: utils.parseBytes32String(data.actionCount || ""),
580
+ }),
581
+ permit2: (data, type) => ({
582
+ type,
583
+ token: data.token,
584
+ spender: data.spender,
585
+ amount: toBN(data.amount).toFixed(),
586
+ expiration: data.expiration,
587
+ }),
588
+ "cross-transfer": (data, type) => ({
589
+ type,
590
+ fromToken: data.fromToken,
591
+ toToken: data.toToken,
592
+ toChainId: data.toChainId ? data.toChainId.toString() : null,
593
+ amount: toBN(data.amount).toFixed(),
594
+ receiver: data.receiver,
595
+ }),
596
+ "cross-transfer-v2": (data, type) => ({
597
+ type: 'cross-transfer',
598
+ fromToken: data.fromToken,
599
+ toToken: data.toToken,
600
+ toChainId: data.toChainId ? data.toChainId.toString() : null,
601
+ amount: toBN(data.amount).toFixed(),
602
+ receiver: data.receiver,
603
+ provider: utils.parseBytes32String(data.provider || ""),
604
+ }),
605
+ auth: (data) => ({
606
+ type: data.remove ? "remove-authority" : "add-authority",
607
+ address: data.address,
608
+ chainId: data.chainId ? data.chainId.toString() : null,
609
+ remove: data.remove,
610
+ }),
611
+ "instadapp-pro": (data, type) => ({
612
+ type,
613
+ castDetails: data.castDetails,
614
+ }),
615
+ rejection: (data, type) => ({
616
+ type,
617
+ id: data.id,
618
+ }),
619
+ "add-signers": (data, type) => ({
620
+ type,
621
+ addresses: data.signers,
622
+ }),
623
+ "remove-signers": (data, type) => ({
624
+ type,
625
+ addresses: data.signers,
626
+ }),
627
+ "change-threshold": (data, type) => ({
628
+ type,
629
+ count: data.count,
630
+ }),
631
+ "avocado-bridge": (data, type) => ({
632
+ type,
633
+ id: data.id,
634
+ toChainId: data.toChainId ? data.toChainId.toString() : null,
635
+ }),
636
+ mass: (data, type) => ({
637
+ type,
638
+ data,
639
+ }),
640
+ };
641
+
642
+ const parseMetadata = (metadata: string) => {
643
+ const metadataArr = [];
644
+
645
+ const [decodedMultiMetadata = []] =
646
+ (ethers.utils.defaultAbiCoder.decode(
647
+ multiMetadataTypes,
648
+ metadata
649
+ ) as string[]) || [];
281
650
 
282
- const metadataArr = [];
283
-
284
- const [decodedMultiMetadata = []] =
285
- (ethers.utils.defaultAbiCoder.decode(
286
- multiMetadataTypes,
287
- metadata
288
- ) as string[]) || [];
289
-
290
- for (let metadata of decodedMultiMetadata) {
291
- const decodedMetadata = ethers.utils.defaultAbiCoder.decode(
292
- metadataTypes,
293
- metadata
294
- );
295
-
296
- const type = ethers.utils.parseBytes32String(
297
- decodedMetadata.type
298
- ) as keyof typeof actionMetadataTypes;
299
-
300
- const decodedData = ethers.utils.defaultAbiCoder.decode(
301
- actionMetadataTypes[type],
302
- decodedMetadata.data
303
- );
304
-
305
- switch (type) {
306
- case "transfer":
307
- payload = {
308
- type,
309
- token: decodedData.token,
310
- amount: toBN(decodedData.amount).toFixed(),
311
- receiver: decodedData.receiver,
312
- };
313
- break;
314
- case "bridge":
315
- payload = {
316
- type,
317
- amount: toBN(decodedData.amount).toFixed(),
318
- receiver: decodedData.receiver,
319
- toToken: decodedData.toToken,
320
- fromToken: decodedData.fromToken,
321
- toChainId: decodedData.toChainId
322
- ? decodedData.toChainId.toString()
323
- : null,
324
- bridgeFee: toBN(decodedData.bridgeFee).toFixed(),
325
- };
326
- break;
327
- case "swap":
328
- payload = {
329
- type,
330
- buyAmount: toBN(decodedData.buyAmount).toFixed(),
331
- sellAmount: toBN(decodedData.sellAmount).toFixed(),
332
- buyToken: decodedData.buyToken,
333
- sellToken: decodedData.sellToken,
334
- receiver: decodedData.receiver,
335
- protocol: utils.parseBytes32String(decodedData?.protocol || ""),
336
- };
337
- break;
338
- case "upgrade":
339
- payload = {
340
- type,
341
- version: utils.parseBytes32String(decodedData?.version || ""),
342
- walletImpl: decodedData?.walletImpl,
343
- };
344
- break;
345
- case "gas-topup":
346
- payload = {
347
- type,
348
- amount: toBN(decodedData.amount).toFixed(),
349
- token: decodedData.token,
350
- onBehalf: decodedData.onBehalf,
351
- };
352
- break;
353
- case "dapp":
354
- payload = {
355
- type,
356
- name: decodedData?.name,
357
- url: decodedData?.url,
358
- };
359
- break;
360
- case "deploy":
361
- payload = {
362
- type,
363
- };
364
- break;
365
-
366
- case "permit2":
367
- payload = {
368
- type,
369
- token: decodedData.token,
370
- spender: decodedData.spender,
371
- amount: toBN(decodedData.amount).toFixed(),
372
- expiration: decodedData.expiration,
373
- };
374
- break;
375
-
376
- case "cross-transfer":
377
- payload = {
378
- type,
379
- fromToken: decodedData.fromToken,
380
- toToken: decodedData.toToken,
381
- toChainId: decodedData.toChainId
382
- ? decodedData.toChainId.toString()
383
- : null,
384
- amount: toBN(decodedData.amount).toFixed(),
385
- receiver: decodedData.receiver,
386
- };
387
-
388
- break;
389
- case "auth":
390
- payload = {
391
- type: decodedData.remove ? "remove-authority" : "add-authority",
392
- address: decodedData.address,
393
- chainId: decodedData.chainId
394
- ? decodedData.chainId.toString()
395
- : null,
396
- remove: decodedData.remove,
397
- };
398
-
399
- break;
400
- case "instadapp-pro":
401
- payload = {
402
- type,
403
- castDetails: decodedData.castDetails,
404
- };
405
-
406
- break;
407
- }
651
+ for (let metadata of decodedMultiMetadata) {
652
+ const decodedMetadata = ethers.utils.defaultAbiCoder.decode(
653
+ metadataTypes,
654
+ metadata
655
+ );
408
656
 
657
+ const type = ethers.utils.parseBytes32String(
658
+ decodedMetadata.type
659
+ ) as keyof typeof actionMetadataTypes;
660
+
661
+ const decodedData = decodedMetadata?.data === '0x' ? '' : ethers.utils.defaultAbiCoder.decode(
662
+ actionMetadataTypes[type],
663
+ decodedMetadata.data
664
+ );
665
+
666
+ const payloadFunc = typesPayload[type];
667
+
668
+ if (payloadFunc) {
669
+ const payload = payloadFunc(decodedData, type);
409
670
  metadataArr.push(payload);
410
671
  }
672
+ }
411
673
 
412
- return metadataArr;
413
- } catch (e) {
414
- console.log(e);
415
- return null;
674
+ return metadataArr;
675
+ };
676
+
677
+ /**
678
+ * Replaces hyphens with spaces and capitalizes the first letter of each word in a sentence.
679
+ * @param {string} txType - The input sentence to modify
680
+ *
681
+ * @returns {string} - The modified sentence with hyphens replaced with spaces and the first letter of each word capitalized.
682
+ */
683
+ export const formatTxType = (txType: string) => {
684
+ if(txType === 'mass') {
685
+ return 'Chain Agnostic Payments'
416
686
  }
687
+
688
+ const finalSentence = txType
689
+ .replace("-", " ")
690
+ .replace(/(^\w{1})|(\s+\w{1})/g, (letter) => letter.toUpperCase());
691
+
692
+ return finalSentence;
417
693
  };