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

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 (95) 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 +1252 -148
  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/arrow-left.svg +5 -0
  9. package/assets/images/icons/arrow-right.svg +5 -0
  10. package/assets/images/icons/avocado.svg +4 -0
  11. package/assets/images/icons/bridge-2.svg +3 -0
  12. package/assets/images/icons/bridge.svg +7 -0
  13. package/assets/images/icons/calendar.svg +8 -0
  14. package/assets/images/icons/change-threshold.svg +4 -0
  15. package/assets/images/icons/check-circle.svg +4 -0
  16. package/assets/images/icons/check.svg +3 -0
  17. package/assets/images/icons/chevron-down.svg +4 -0
  18. package/assets/images/icons/clipboard.svg +7 -0
  19. package/assets/images/icons/clock-circle.svg +5 -0
  20. package/assets/images/icons/copy.svg +12 -0
  21. package/assets/images/icons/cross-transfer.svg +7 -0
  22. package/assets/images/icons/dapp.svg +4 -0
  23. package/assets/images/icons/deploy.svg +12 -0
  24. package/assets/images/icons/error-circle.svg +6 -0
  25. package/assets/images/icons/exclamation-circle.svg +13 -0
  26. package/assets/images/icons/exclamation-octagon.svg +13 -0
  27. package/assets/images/icons/exclamation-triangle.svg +5 -0
  28. package/assets/images/icons/external-link.svg +6 -0
  29. package/assets/images/icons/eye.svg +4 -0
  30. package/assets/images/icons/flowers.svg +8 -0
  31. package/assets/images/icons/gas-emoji.svg +193 -0
  32. package/assets/images/icons/gas.svg +14 -0
  33. package/assets/images/icons/gift.svg +153 -0
  34. package/assets/images/icons/globe.svg +110 -0
  35. package/assets/images/icons/hamburger.svg +6 -0
  36. package/assets/images/icons/hammer.svg +5 -0
  37. package/assets/images/icons/info-2.svg +12 -0
  38. package/assets/images/icons/instadapp-pro.svg +4 -0
  39. package/assets/images/icons/logout.svg +3 -0
  40. package/assets/images/icons/moon.svg +3 -0
  41. package/assets/images/icons/multi-send.svg +7 -0
  42. package/assets/images/icons/network.svg +13 -0
  43. package/assets/images/icons/options.svg +5 -0
  44. package/assets/images/icons/permit-sign.svg +11 -0
  45. package/assets/images/icons/plus-circle.svg +6 -0
  46. package/assets/images/icons/plus.svg +5 -0
  47. package/assets/images/icons/power-off-bg.svg +24 -0
  48. package/assets/images/icons/power-off.svg +19 -0
  49. package/assets/images/icons/power-on.svg +19 -0
  50. package/assets/images/icons/qr.svg +20 -0
  51. package/assets/images/icons/question-circle.svg +14 -0
  52. package/assets/images/icons/refresh.svg +6 -0
  53. package/assets/images/icons/reject-proposal.svg +6 -0
  54. package/assets/images/icons/search.svg +12 -0
  55. package/assets/images/icons/stars.svg +4 -0
  56. package/assets/images/icons/sun.svg +3 -0
  57. package/assets/images/icons/transfer.svg +5 -0
  58. package/assets/images/icons/trash-2.svg +8 -0
  59. package/assets/images/icons/upgrade.svg +4 -0
  60. package/assets/images/icons/wave.svg +214 -0
  61. package/assets/images/icons/x.svg +5 -0
  62. package/components/ActionLogo.vue +42 -0
  63. package/components/ActionMetadata.vue +88 -0
  64. package/components/Address.vue +74 -0
  65. package/components/AuthorityAvatar.vue +39 -0
  66. package/components/ChainLogo.vue +18 -563
  67. package/components/CopyClipboard.vue +42 -0
  68. package/components/metadata/Bridge.vue +58 -0
  69. package/components/metadata/CrossTransfer.vue +76 -0
  70. package/components/metadata/GasTopup.vue +38 -0
  71. package/components/metadata/Permit2.vue +41 -0
  72. package/components/metadata/Signers.vue +19 -0
  73. package/components/metadata/Swap.vue +66 -0
  74. package/components/metadata/Transfer.vue +49 -0
  75. package/components.d.ts +13 -0
  76. package/contracts/Forwarder.ts +856 -2
  77. package/contracts/MultisigAgnosticForwarder.ts +1423 -0
  78. package/contracts/MultisigForwarder.ts +859 -0
  79. package/contracts/factories/Forwarder__factory.ts +816 -16
  80. package/contracts/factories/MultisigAgnosticForwarder__factory.ts +2135 -0
  81. package/contracts/factories/MultisigForwarder__factory.ts +721 -0
  82. package/contracts/factories/index.ts +2 -0
  83. package/contracts/index.ts +4 -0
  84. package/eslint.config.mjs +34 -0
  85. package/nuxt.config.ts +27 -2
  86. package/package.json +17 -12
  87. package/server/utils/index.ts +4 -4
  88. package/utils/avocado.ts +18 -16
  89. package/utils/bignumber.ts +60 -29
  90. package/utils/formatter.ts +63 -26
  91. package/utils/helper.ts +39 -28
  92. package/utils/metadata.ts +582 -251
  93. package/utils/network.ts +591 -173
  94. package/utils/services.ts +19 -0
  95. package/utils/utils.d.ts +147 -98
package/utils/metadata.ts CHANGED
@@ -1,130 +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
- bridge: [
11
- "uint256 amount",
12
- "address receiver",
13
- "address fromToken",
14
- "address toToken",
15
- "uint256 toChainId",
16
- "uint256 bridgeFee",
17
- "address nativeToken",
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',
18
41
  ],
19
- swap: [
20
- "address sellToken",
21
- "address buyToken",
22
- "uint256 sellAmount",
23
- "uint256 buyAmount",
24
- "address receiver",
25
- "bytes32 protocol",
42
+ 'cross-transfer-v2': [
43
+ 'address fromToken',
44
+ 'address toToken',
45
+ 'uint256 toChainId',
46
+ 'uint256 amount',
47
+ 'address receiver',
48
+ 'bytes32 provider',
26
49
  ],
27
- "gas-topup": ["uint256 amount", "address token", "address onBehalf"],
28
- upgrade: ["bytes32 version", "address walletImpl"],
29
- dapp: ["string name", "string url"],
30
- deploy: [],
31
- permit2: [
32
- "address token",
33
- "address spender",
34
- "uint160 amount",
35
- "uint48 expiration",
50
+ 'bridge': [
51
+ 'uint256 amount',
52
+ 'address receiver',
53
+ 'address fromToken',
54
+ 'address toToken',
55
+ 'uint256 toChainId',
56
+ 'uint256 bridgeFee',
57
+ 'address nativeToken',
36
58
  ],
37
- };
38
-
39
- const encodeMetadata = (props: MetadataProps) => {
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
+ ],
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) {
40
100
  return ethers.utils.defaultAbiCoder.encode(metadataTypes, [
41
101
  ethers.utils.formatBytes32String(props.type),
42
- props.version || "1",
102
+ props.version || '1',
43
103
  props.encodedData,
44
- ]);
45
- };
104
+ ])
105
+ }
46
106
 
47
- export const encodeDappMetadata = (
48
- params: DappMetadataProps,
49
- single = true
50
- ) => {
107
+ export function encodeDappMetadata(params: DappMetadataProps, single = true) {
51
108
  const encodedData = ethers.utils.defaultAbiCoder.encode(
52
109
  actionMetadataTypes.dapp,
53
- [params.name, params.url]
54
- );
110
+ [params.name, params.url],
111
+ )
55
112
 
56
113
  const data = encodeMetadata({
57
- type: "dapp",
114
+ type: MetadataEnums.dapp,
58
115
  encodedData,
59
- });
116
+ })
60
117
 
61
- return single ? encodeMultipleActions(data) : data;
62
- };
118
+ return single ? encodeMultipleActions(data) : data
119
+ }
63
120
 
64
- export const encodeTransferMetadata = (
65
- params: SendMetadataProps,
66
- single = true
67
- ) => {
121
+ export function encodeAvocadoBridgeMetadata(id: string, toChainId: string | number, single = true) {
122
+ const encodedData = ethers.utils.defaultAbiCoder.encode(
123
+ actionMetadataTypes['avocado-bridge'],
124
+ [id, toChainId],
125
+ )
126
+
127
+ const data = encodeMetadata({
128
+ type: MetadataEnums['avocado-bridge'],
129
+ encodedData,
130
+ })
131
+
132
+ return single ? encodeMultipleActions(data) : data
133
+ }
134
+
135
+ export function encodeTransferMetadata(params: SendMetadataProps, single = true) {
68
136
  const encodedData = ethers.utils.defaultAbiCoder.encode(
69
137
  actionMetadataTypes.transfer,
70
- [params.token, params.amount, params.receiver]
71
- );
138
+ [params.token, params.amount, params.receiver],
139
+ )
72
140
 
73
141
  const data = encodeMetadata({
74
- type: "transfer",
142
+ type: MetadataEnums.transfer,
75
143
  encodedData,
76
- });
144
+ })
77
145
 
78
- return single ? encodeMultipleActions(data) : data;
79
- };
146
+ return single ? encodeMultipleActions(data) : data
147
+ }
148
+
149
+ export function encodeRejectionMetadata(id: string, single = true) {
150
+ const encodedData = ethers.utils.defaultAbiCoder.encode(
151
+ actionMetadataTypes.rejection,
152
+ [id],
153
+ )
80
154
 
81
- export const encodeDeployMetadata = (single = true) => {
82
155
  const data = encodeMetadata({
83
- type: "deploy",
84
- encodedData: "0x",
85
- });
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
+ )
188
+
189
+ const data = encodeMetadata({
190
+ type: MetadataEnums[type],
191
+ encodedData,
192
+ })
86
193
 
87
- return single ? encodeMultipleActions(data) : data;
88
- };
194
+ return single ? encodeMultipleActions(data) : data
195
+ }
89
196
 
90
- export const encodeWCSignMetadata = (
91
- params: SignMetadataProps,
92
- single = true
93
- ) => {
197
+ export function encodeAuthMetadata(params: AuthMetadataProps, single = true) {
94
198
  const encodedData = ethers.utils.defaultAbiCoder.encode(
95
- actionMetadataTypes["permit2"],
96
- [params.token, params.spender, params.amount, params.expiration]
97
- );
199
+ actionMetadataTypes.auth,
200
+ [params.address, params.chainId, params.remove],
201
+ )
98
202
 
99
203
  const data = encodeMetadata({
100
- type: "permit2",
204
+ type: MetadataEnums.auth,
101
205
  encodedData,
102
- });
206
+ })
103
207
 
104
- return single ? encodeMultipleActions(data) : data;
105
- };
208
+ return single ? encodeMultipleActions(data) : data
209
+ }
106
210
 
107
- export const encodeUpgradeMetadata = (
108
- params: UpgradeMetadataProps,
109
- single = true
110
- ) => {
211
+ export function encodeDeployMetadata(single = true) {
212
+ const data = encodeMetadata({
213
+ type: MetadataEnums.deploy,
214
+ encodedData: '0x',
215
+ })
216
+
217
+ return single ? encodeMultipleActions(data) : data
218
+ }
219
+
220
+ export function encodeTransactionBuilderMetadata(actionCount: string, single = true) {
221
+ const encodedData = ethers.utils.defaultAbiCoder.encode(
222
+ actionMetadataTypes['tx-builder'],
223
+ [actionCount],
224
+ )
225
+
226
+ const data = encodeMetadata({
227
+ type: MetadataEnums['tx-builder'],
228
+ encodedData,
229
+ })
230
+
231
+ return single ? encodeMultipleActions(data) : data
232
+ }
233
+
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) {
111
249
  const encodedData = ethers.utils.defaultAbiCoder.encode(
112
250
  actionMetadataTypes.upgrade,
113
- [params.version, params.walletImpl]
114
- );
251
+ [params.version, params.walletImpl],
252
+ )
115
253
 
116
254
  const data = encodeMetadata({
117
- type: "upgrade",
255
+ type: MetadataEnums.upgrade,
118
256
  encodedData,
119
- });
257
+ })
120
258
 
121
- return single ? encodeMultipleActions(data) : data;
122
- };
259
+ return single ? encodeMultipleActions(data) : data
260
+ }
123
261
 
124
- export const encodeSwapMetadata = (
125
- params: SwapMetadataProps,
126
- single = true
127
- ) => {
262
+ export function encodeSwapMetadata(params: SwapMetadataProps, single = true) {
128
263
  const encodedData = ethers.utils.defaultAbiCoder.encode(
129
264
  actionMetadataTypes.swap,
130
265
  [
@@ -134,193 +269,389 @@ export const encodeSwapMetadata = (
134
269
  params.buyAmount,
135
270
  params.receiver,
136
271
  params.protocol,
137
- ]
138
- );
272
+ ],
273
+ )
139
274
 
140
275
  const data = encodeMetadata({
141
- type: "swap",
276
+ type: MetadataEnums.swap,
142
277
  encodedData,
143
- });
278
+ })
144
279
 
145
- return single ? encodeMultipleActions(data) : data;
146
- };
280
+ return single ? encodeMultipleActions(data) : data
281
+ }
147
282
 
148
- export const encodeTopupMetadata = (
149
- params: TopupMetadataProps,
150
- single = true
151
- ) => {
283
+ export function encodeTopupMetadata(params: TopupMetadataProps, single = true) {
152
284
  const encodedData = ethers.utils.defaultAbiCoder.encode(
153
- actionMetadataTypes["gas-topup"],
154
- [params.amount, params.token, params.onBehalf]
155
- );
285
+ actionMetadataTypes['gas-topup'],
286
+ [params.amount, params.token, params.onBehalf],
287
+ )
156
288
 
157
- 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
+ )
158
326
 
159
327
  const data = encodeMetadata({
160
- type: "gas-topup",
328
+ type,
161
329
  encodedData,
162
- });
330
+ })
163
331
 
164
- return single ? encodeMultipleActions(data) : data;
165
- };
332
+ return single ? encodeMultipleActions(data) : data
333
+ }
166
334
 
167
- export const encodeBridgeMetadata = (
168
- params: BridgeMetadataProps,
169
- single = true
170
- ) => {
335
+ export function encodeChangeThresholdMetadata(threshold: string | number, single = true) {
171
336
  const encodedData = ethers.utils.defaultAbiCoder.encode(
172
- actionMetadataTypes.bridge,
173
- [
174
- params.amount,
175
- params.receiver,
176
- params.fromToken,
177
- params.toToken,
178
- params.toChainId,
179
- params.bridgeFee,
180
- params.nativeToken,
181
- ]
182
- );
337
+ actionMetadataTypes['change-threshold'],
338
+ [toBN(threshold).toNumber()],
339
+ )
183
340
 
184
341
  const data = encodeMetadata({
185
- type: "bridge",
342
+ type: MetadataEnums['change-threshold'],
186
343
  encodedData,
187
- });
344
+ })
345
+
346
+ return single ? encodeMultipleActions(data) : data
347
+ }
188
348
 
189
- return single ? encodeMultipleActions(data) : data;
190
- };
349
+ export function encodeRemoveSignersMetadata(addresses: string[], single = true) {
350
+ const encodedData = ethers.utils.defaultAbiCoder.encode(
351
+ actionMetadataTypes['remove-signers'],
352
+ [addresses],
353
+ )
191
354
 
192
- export const encodeMultipleActions = (...actionData: string[]) => {
193
- return ethers.utils.defaultAbiCoder.encode(multiMetadataTypes, [actionData]);
194
- };
355
+ const data = encodeMetadata({
356
+ type: MetadataEnums['remove-signers'],
357
+ encodedData,
358
+ })
195
359
 
196
- export const decodeMetadata = (data: string) => {
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
+ )
391
+
392
+ const data = encodeMetadata({
393
+ type: MetadataEnums['add-signers'],
394
+ encodedData,
395
+ })
396
+
397
+ return single ? encodeMultipleActions(data) : data
398
+ }
399
+
400
+ export function encodeMultipleActions(...actionData: string[]) {
401
+ return ethers.utils.defaultAbiCoder.encode(multiMetadataTypes, [actionData])
402
+ }
403
+
404
+ export function decodeData(data: string) {
197
405
  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
- }
211
- } 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
- }
221
- }
406
+ const metadata = getMetadataFromData(data) || '0x'
407
+
408
+ return parseMetadata(metadata)
409
+ }
410
+ catch {
411
+ // console.log(e);
412
+ return null
413
+ }
414
+ }
415
+
416
+ export function decodeMetadata(metadata: string) {
417
+ try {
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'
222
431
 
223
- const metadataArr = [];
432
+ if (data.startsWith('0xc5e15557')) {
433
+ const executeData = ifaceAgnostic.decodeFunctionData('executeChainAgnosticV1', data)
224
434
 
225
- const [decodedMultiMetadata = []] =
226
- (ethers.utils.defaultAbiCoder.decode(
227
- multiMetadataTypes,
228
- metadata
229
- ) as string[]) || [];
435
+ const metadata = executeData?.params_?.params?.metadata
230
436
 
231
- for (let metadata of decodedMultiMetadata) {
232
- const decodedMetadata = ethers.utils.defaultAbiCoder.decode(
233
- metadataTypes,
234
- metadata
235
- );
437
+ return metadata === '0x' || !metadata ? null : metadata
438
+ }
236
439
 
237
- const type = ethers.utils.parseBytes32String(
238
- decodedMetadata.type
239
- ) as keyof typeof actionMetadataTypes;
440
+ else if (data.startsWith('0x18e7f485')) {
441
+ const executeData = iface.decodeFunctionData('execute', data)
442
+ if (executeData.metadata_ === '0x' || !executeData.metadata_) {
443
+ return null
444
+ }
445
+ else {
446
+ metadata = executeData.metadata_
447
+ }
448
+ }
449
+ else if (data.startsWith('0x14f80a8d')) {
450
+ const executeDataV2 = iface.decodeFunctionData('executeV2', data)
451
+ if (
452
+ executeDataV2.params_.metadata === '0x'
453
+ || !executeDataV2.params_.metadata
454
+ ) {
455
+ return null
456
+ }
457
+ else {
458
+ metadata = executeDataV2.params_.metadata
459
+ }
460
+ }
461
+ else {
462
+ const executeDataMultisig = ifaceMultisig.decodeFunctionData(
463
+ 'executeV1',
464
+ data,
465
+ )
466
+ if (
467
+ executeDataMultisig.params_.metadata === '0x'
468
+ || !executeDataMultisig.params_.metadata
469
+ ) {
470
+ return null
471
+ }
472
+ else {
473
+ metadata = executeDataMultisig.params_.metadata
474
+ }
475
+ }
240
476
 
241
- const decodedData = 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(
609
+ multiMetadataTypes,
610
+ metadata,
611
+ ) as string[]) || []
612
+
613
+ for (const metadata of decodedMultiMetadata) {
614
+ const decodedMetadata = ethers.utils.defaultAbiCoder.decode(
615
+ metadataTypes,
616
+ metadata,
617
+ )
618
+
619
+ const type = ethers.utils.parseBytes32String(
620
+ decodedMetadata.type,
621
+ ) as keyof typeof actionMetadataTypes
622
+
623
+ const decodedData = decodedMetadata?.data === '0x'
624
+ ? ''
625
+ : ethers.utils.defaultAbiCoder.decode(
242
626
  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
- }
317
-
318
- metadataArr.push(payload);
627
+ decodedMetadata.data,
628
+ )
629
+
630
+ const payloadFunc = typesPayload[type]
631
+
632
+ if (payloadFunc) {
633
+ const payload = payloadFunc(decodedData, type)
634
+ metadataArr.push(payload)
319
635
  }
636
+ }
320
637
 
321
- return metadataArr;
322
- } catch (e) {
323
- console.log(e);
324
- return null;
638
+ return metadataArr
639
+ }
640
+
641
+ /**
642
+ * Replaces hyphens with spaces and capitalizes the first letter of each word in a sentence.
643
+ * @param {string} txType - The input sentence to modify
644
+ *
645
+ * @returns {string} - The modified sentence with hyphens replaced with spaces and the first letter of each word capitalized.
646
+ */
647
+ export function formatTxType(txType: string) {
648
+ if (txType === 'mass') {
649
+ return 'Chain Agnostic Payments'
325
650
  }
326
- };
651
+
652
+ const finalSentence = txType
653
+ .replace('-', ' ')
654
+ .replace(/(^\w)|(\s+\w)/g, letter => letter.toUpperCase())
655
+
656
+ return finalSentence
657
+ }