@instadapp/avocado-base 0.0.0-dev.883661e → 0.0.0-dev.8c9cf82

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 (90) hide show
  1. package/.github/workflows/npm-publish-dev.yml +2 -5
  2. package/.vscode/settings.json +68 -0
  3. package/abi/multisigAgnosticForwarder.json +938 -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/check.svg +3 -0
  15. package/assets/images/icons/chevron-down.svg +4 -0
  16. package/assets/images/icons/clipboard.svg +7 -0
  17. package/assets/images/icons/clock-circle.svg +5 -0
  18. package/assets/images/icons/copy.svg +12 -0
  19. package/assets/images/icons/cross-transfer.svg +7 -0
  20. package/assets/images/icons/dapp.svg +4 -0
  21. package/assets/images/icons/deploy.svg +12 -0
  22. package/assets/images/icons/error-circle.svg +6 -0
  23. package/assets/images/icons/exclamation-circle.svg +13 -0
  24. package/assets/images/icons/exclamation-octagon.svg +13 -0
  25. package/assets/images/icons/exclamation-triangle.svg +5 -0
  26. package/assets/images/icons/external-link.svg +6 -0
  27. package/assets/images/icons/eye.svg +4 -0
  28. package/assets/images/icons/flowers.svg +8 -0
  29. package/assets/images/icons/gas-emoji.svg +193 -0
  30. package/assets/images/icons/gas.svg +14 -0
  31. package/assets/images/icons/gift.svg +153 -0
  32. package/assets/images/icons/globe.svg +110 -0
  33. package/assets/images/icons/hamburger.svg +6 -0
  34. package/assets/images/icons/hammer.svg +5 -0
  35. package/assets/images/icons/info-2.svg +12 -0
  36. package/assets/images/icons/instadapp-pro.svg +4 -0
  37. package/assets/images/icons/logout.svg +3 -0
  38. package/assets/images/icons/moon.svg +3 -0
  39. package/assets/images/icons/multi-send.svg +7 -0
  40. package/assets/images/icons/network.svg +13 -0
  41. package/assets/images/icons/options.svg +5 -0
  42. package/assets/images/icons/permit-sign.svg +11 -0
  43. package/assets/images/icons/plus-circle.svg +6 -0
  44. package/assets/images/icons/plus.svg +5 -0
  45. package/assets/images/icons/power-off-bg.svg +24 -0
  46. package/assets/images/icons/power-off.svg +19 -0
  47. package/assets/images/icons/power-on.svg +19 -0
  48. package/assets/images/icons/qr.svg +20 -0
  49. package/assets/images/icons/question-circle.svg +14 -0
  50. package/assets/images/icons/refresh.svg +6 -0
  51. package/assets/images/icons/reject-proposal.svg +6 -0
  52. package/assets/images/icons/search.svg +12 -0
  53. package/assets/images/icons/stars.svg +4 -0
  54. package/assets/images/icons/sun.svg +3 -0
  55. package/assets/images/icons/transfer.svg +5 -0
  56. package/assets/images/icons/trash-2.svg +8 -0
  57. package/assets/images/icons/upgrade.svg +4 -0
  58. package/assets/images/icons/wave.svg +214 -0
  59. package/assets/images/icons/x.svg +5 -0
  60. package/components/ActionLogo.vue +42 -0
  61. package/components/ActionMetadata.vue +88 -0
  62. package/components/Address.vue +74 -0
  63. package/components/AuthorityAvatar.vue +37 -0
  64. package/components/ChainLogo.vue +14 -563
  65. package/components/CopyClipboard.vue +42 -0
  66. package/components/metadata/Bridge.vue +59 -0
  67. package/components/metadata/CrossTransfer.vue +76 -0
  68. package/components/metadata/GasTopup.vue +39 -0
  69. package/components/metadata/Permit2.vue +42 -0
  70. package/components/metadata/Signers.vue +19 -0
  71. package/components/metadata/Swap.vue +66 -0
  72. package/components/metadata/Transfer.vue +48 -0
  73. package/components.d.ts +13 -0
  74. package/contracts/MultisigAgnosticForwarder.ts +1423 -0
  75. package/contracts/MultisigForwarder.ts +859 -0
  76. package/contracts/factories/MultisigAgnosticForwarder__factory.ts +2135 -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/eslint.config.mjs +20 -0
  81. package/nuxt.config.ts +23 -2
  82. package/package.json +17 -12
  83. package/utils/avocado.ts +2 -0
  84. package/utils/bignumber.ts +20 -0
  85. package/utils/formatter.ts +2 -2
  86. package/utils/helper.ts +8 -0
  87. package/utils/metadata.ts +457 -190
  88. package/utils/network.ts +514 -184
  89. package/utils/services.ts +21 -0
  90. package/utils/utils.d.ts +145 -116
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,186 +445,250 @@ 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
- }
270
- } else if (data.startsWith("0x85114d53")) {
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
- }
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
+ if(data.startsWith('0xc5e15557')) {
475
+
476
+ const executeData = ifaceAgnostic.decodeFunctionData("executeChainAgnosticV1", data);
477
+
478
+
479
+ const metadata = executeData?.params_?.params?.metadata
480
+
481
+ return metadata === '0x' || !metadata ? null : metadata
482
+ }
483
+
484
+ else if (data.startsWith("0x18e7f485")) {
485
+ const executeData = iface.decodeFunctionData("execute", data);
486
+ if (executeData.metadata_ === "0x" || !executeData.metadata_) {
487
+ return null;
280
488
  } else {
281
- const executeDataMultisigV3 = iface.decodeFunctionData("executeMultisigV3", data);
282
- if (
283
- executeDataMultisigV3.params_.metadata === "0x" ||
284
- !executeDataMultisigV3.params_.metadata
285
- ) {
286
- return null;
287
- } else {
288
- metadata = executeDataMultisigV3.params_.metadata;
289
- }
489
+ metadata = executeData.metadata_;
290
490
  }
491
+ } else if (data.startsWith("0x14f80a8d")) {
492
+ const executeDataV2 = iface.decodeFunctionData("executeV2", data);
493
+ if (
494
+ executeDataV2.params_.metadata === "0x" ||
495
+ !executeDataV2.params_.metadata
496
+ ) {
497
+ return null;
498
+ } else {
499
+ metadata = executeDataV2.params_.metadata;
500
+ }
501
+ } else {
502
+ const executeDataMultisig = ifaceMultisig.decodeFunctionData(
503
+ "executeV1",
504
+ data
505
+ );
506
+ if (
507
+ executeDataMultisig.params_.metadata === "0x" ||
508
+ !executeDataMultisig.params_.metadata
509
+ ) {
510
+ return null;
511
+ } else {
512
+ metadata = executeDataMultisig.params_.metadata;
513
+ }
514
+ }
515
+
516
+ return metadata;
517
+ };
518
+
519
+ const typesPayload: IPayload = {
520
+ import: (data, type) => ({
521
+ type,
522
+ protocol: utils.parseBytes32String(data.protocol || ""),
523
+ valueInUsd: toBN(data.valueInUsd).toFixed(),
524
+ }),
525
+ transfer: (data, type) => ({
526
+ type,
527
+ token: data.token,
528
+ amount: toBN(data.amount).toFixed(),
529
+ receiver: data.receiver,
530
+ }),
531
+ bridge: (data, type) => ({
532
+ type,
533
+ amount: toBN(data.amount).toFixed(),
534
+ receiver: data.receiver,
535
+ toToken: data.toToken,
536
+ fromToken: data.fromToken,
537
+ toChainId: data.toChainId ? data.toChainId.toString() : null,
538
+ bridgeFee: toBN(data.bridgeFee).toFixed(),
539
+ }),
540
+ 'bridge-v2': (data, type) => ({
541
+ type: 'bridge',
542
+ amount: toBN(data.amount).toFixed(),
543
+ receiver: data.receiver,
544
+ toToken: data.toToken,
545
+ fromToken: data.fromToken,
546
+ toChainId: data.toChainId ? data.toChainId.toString() : null,
547
+ bridgeFee: toBN(data.bridgeFee).toFixed(),
548
+ provider: utils.parseBytes32String(data.provider || ""),
549
+ }),
550
+ swap: (data, type) => ({
551
+ type,
552
+ buyAmount: toBN(data.buyAmount).toFixed(),
553
+ sellAmount: toBN(data.sellAmount).toFixed(),
554
+ buyToken: data.buyToken,
555
+ sellToken: data.sellToken,
556
+ receiver: data.receiver,
557
+ protocol: utils.parseBytes32String(data.protocol || ""),
558
+ }),
559
+ upgrade: (data, type) => ({
560
+ type,
561
+ version: utils.parseBytes32String(data.version || ""),
562
+ walletImpl: data.walletImpl,
563
+ }),
564
+ "gas-topup": (data, type) => ({
565
+ type,
566
+ amount: toBN(data.amount).toFixed(),
567
+ token: data.token,
568
+ onBehalf: data.onBehalf,
569
+ }),
570
+ dapp: (data, type) => ({
571
+ type,
572
+ name: data.name,
573
+ url: data.url,
574
+ }),
575
+ deploy: (data, type) => ({
576
+ type,
577
+ }),
578
+ "tx-builder": (data, type) => ({
579
+ type,
580
+ actionCount: utils.parseBytes32String(data.actionCount || ""),
581
+ }),
582
+ permit2: (data, type) => ({
583
+ type,
584
+ token: data.token,
585
+ spender: data.spender,
586
+ amount: toBN(data.amount).toFixed(),
587
+ expiration: data.expiration,
588
+ }),
589
+ "cross-transfer": (data, type) => ({
590
+ type,
591
+ fromToken: data.fromToken,
592
+ toToken: data.toToken,
593
+ toChainId: data.toChainId ? data.toChainId.toString() : null,
594
+ amount: toBN(data.amount).toFixed(),
595
+ receiver: data.receiver,
596
+ }),
597
+ "cross-transfer-v2": (data, type) => ({
598
+ type: 'cross-transfer',
599
+ fromToken: data.fromToken,
600
+ toToken: data.toToken,
601
+ toChainId: data.toChainId ? data.toChainId.toString() : null,
602
+ amount: toBN(data.amount).toFixed(),
603
+ receiver: data.receiver,
604
+ provider: utils.parseBytes32String(data.provider || ""),
605
+ }),
606
+ auth: (data) => ({
607
+ type: data.remove ? "remove-authority" : "add-authority",
608
+ address: data.address,
609
+ chainId: data.chainId ? data.chainId.toString() : null,
610
+ remove: data.remove,
611
+ }),
612
+ "instadapp-pro": (data, type) => ({
613
+ type,
614
+ castDetails: data.castDetails,
615
+ }),
616
+ rejection: (data, type) => ({
617
+ type,
618
+ id: data.id,
619
+ }),
620
+ "add-signers": (data, type) => ({
621
+ type,
622
+ addresses: data.signers,
623
+ }),
624
+ "remove-signers": (data, type) => ({
625
+ type,
626
+ addresses: data.signers,
627
+ }),
628
+ "change-threshold": (data, type) => ({
629
+ type,
630
+ count: data.count,
631
+ }),
632
+ "avocado-bridge": (data, type) => ({
633
+ type,
634
+ id: data.id,
635
+ toChainId: data.toChainId ? data.toChainId.toString() : null,
636
+ }),
637
+ mass: (data, type) => ({
638
+ type,
639
+ data,
640
+ }),
641
+ };
642
+
643
+ const parseMetadata = (metadata: string) => {
644
+ const metadataArr = [];
645
+
646
+ const [decodedMultiMetadata = []] =
647
+ (ethers.utils.defaultAbiCoder.decode(
648
+ multiMetadataTypes,
649
+ metadata
650
+ ) as string[]) || [];
291
651
 
292
- const metadataArr = [];
293
-
294
- const [decodedMultiMetadata = []] =
295
- (ethers.utils.defaultAbiCoder.decode(
296
- multiMetadataTypes,
297
- metadata
298
- ) as string[]) || [];
299
-
300
- for (let metadata of decodedMultiMetadata) {
301
- const decodedMetadata = ethers.utils.defaultAbiCoder.decode(
302
- metadataTypes,
303
- metadata
304
- );
305
-
306
- const type = ethers.utils.parseBytes32String(
307
- decodedMetadata.type
308
- ) as keyof typeof actionMetadataTypes;
309
-
310
- const decodedData = ethers.utils.defaultAbiCoder.decode(
311
- actionMetadataTypes[type],
312
- decodedMetadata.data
313
- );
314
-
315
- switch (type) {
316
- case "transfer":
317
- payload = {
318
- type,
319
- token: decodedData.token,
320
- amount: toBN(decodedData.amount).toFixed(),
321
- receiver: decodedData.receiver,
322
- };
323
- break;
324
- case "bridge":
325
- payload = {
326
- type,
327
- amount: toBN(decodedData.amount).toFixed(),
328
- receiver: decodedData.receiver,
329
- toToken: decodedData.toToken,
330
- fromToken: decodedData.fromToken,
331
- toChainId: decodedData.toChainId
332
- ? decodedData.toChainId.toString()
333
- : null,
334
- bridgeFee: toBN(decodedData.bridgeFee).toFixed(),
335
- };
336
- break;
337
- case "swap":
338
- payload = {
339
- type,
340
- buyAmount: toBN(decodedData.buyAmount).toFixed(),
341
- sellAmount: toBN(decodedData.sellAmount).toFixed(),
342
- buyToken: decodedData.buyToken,
343
- sellToken: decodedData.sellToken,
344
- receiver: decodedData.receiver,
345
- protocol: utils.parseBytes32String(decodedData?.protocol || ""),
346
- };
347
- break;
348
- case "upgrade":
349
- payload = {
350
- type,
351
- version: utils.parseBytes32String(decodedData?.version || ""),
352
- walletImpl: decodedData?.walletImpl,
353
- };
354
- break;
355
- case "gas-topup":
356
- payload = {
357
- type,
358
- amount: toBN(decodedData.amount).toFixed(),
359
- token: decodedData.token,
360
- onBehalf: decodedData.onBehalf,
361
- };
362
- break;
363
- case "dapp":
364
- payload = {
365
- type,
366
- name: decodedData?.name,
367
- url: decodedData?.url,
368
- };
369
- break;
370
- case "deploy":
371
- payload = {
372
- type,
373
- };
374
- break;
375
-
376
- case "permit2":
377
- payload = {
378
- type,
379
- token: decodedData.token,
380
- spender: decodedData.spender,
381
- amount: toBN(decodedData.amount).toFixed(),
382
- expiration: decodedData.expiration,
383
- };
384
- break;
385
-
386
- case "cross-transfer":
387
- payload = {
388
- type,
389
- fromToken: decodedData.fromToken,
390
- toToken: decodedData.toToken,
391
- toChainId: decodedData.toChainId
392
- ? decodedData.toChainId.toString()
393
- : null,
394
- amount: toBN(decodedData.amount).toFixed(),
395
- receiver: decodedData.receiver,
396
- };
397
-
398
- break;
399
- case "auth":
400
- payload = {
401
- type: decodedData.remove ? "remove-authority" : "add-authority",
402
- address: decodedData.address,
403
- chainId: decodedData.chainId
404
- ? decodedData.chainId.toString()
405
- : null,
406
- remove: decodedData.remove,
407
- };
408
-
409
- break;
410
- case "instadapp-pro":
411
- payload = {
412
- type,
413
- castDetails: decodedData.castDetails,
414
- };
415
-
416
- break;
417
- }
652
+ for (let metadata of decodedMultiMetadata) {
653
+ const decodedMetadata = ethers.utils.defaultAbiCoder.decode(
654
+ metadataTypes,
655
+ metadata
656
+ );
418
657
 
658
+ const type = ethers.utils.parseBytes32String(
659
+ decodedMetadata.type
660
+ ) as keyof typeof actionMetadataTypes;
661
+
662
+ const decodedData = decodedMetadata?.data === '0x' ? '' : ethers.utils.defaultAbiCoder.decode(
663
+ actionMetadataTypes[type],
664
+ decodedMetadata.data
665
+ );
666
+
667
+ const payloadFunc = typesPayload[type];
668
+
669
+ if (payloadFunc) {
670
+ const payload = payloadFunc(decodedData, type);
419
671
  metadataArr.push(payload);
420
672
  }
673
+ }
421
674
 
422
- return metadataArr;
423
- } catch (e) {
424
- console.log(e);
425
- return null;
675
+ return metadataArr;
676
+ };
677
+
678
+ /**
679
+ * Replaces hyphens with spaces and capitalizes the first letter of each word in a sentence.
680
+ * @param {string} txType - The input sentence to modify
681
+ *
682
+ * @returns {string} - The modified sentence with hyphens replaced with spaces and the first letter of each word capitalized.
683
+ */
684
+ export const formatTxType = (txType: string) => {
685
+ if(txType === 'mass') {
686
+ return 'Chain Agnostic Payments'
426
687
  }
688
+
689
+ const finalSentence = txType
690
+ .replace("-", " ")
691
+ .replace(/(^\w{1})|(\s+\w{1})/g, (letter) => letter.toUpperCase());
692
+
693
+ return finalSentence;
427
694
  };