@instadapp/avocado-base 0.0.0-dev.39149d7 → 0.0.0-dev.3a0edf4

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