@instadapp/avocado-base 0.0.0-dev.9853aa2 → 0.0.0-dev.9c7000a

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