@instadapp/avocado-base 0.0.0-dev.f24809a → 0.0.0-dev.f392746

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