@instadapp/avocado-base 0.0.0-dev.02731e3 → 0.0.0-dev.066d667

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 +55 -61
  91. package/utils/helper.ts +39 -28
  92. package/utils/metadata.ts +575 -288
  93. package/utils/network.ts +591 -192
  94. package/utils/services.ts +19 -0
  95. package/utils/utils.d.ts +147 -109
package/utils/metadata.ts CHANGED
@@ -1,160 +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
- deploy: [],
38
- permit2: [
39
- "address token",
40
- "address spender",
41
- "uint160 amount",
42
- "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',
43
68
  ],
44
- };
45
-
46
- 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) {
47
100
  return ethers.utils.defaultAbiCoder.encode(metadataTypes, [
48
101
  ethers.utils.formatBytes32String(props.type),
49
- props.version || "1",
102
+ props.version || '1',
50
103
  props.encodedData,
51
- ]);
52
- };
104
+ ])
105
+ }
53
106
 
54
- export const encodeDappMetadata = (
55
- params: DappMetadataProps,
56
- single = true
57
- ) => {
107
+ export function encodeDappMetadata(params: DappMetadataProps, single = true) {
58
108
  const encodedData = ethers.utils.defaultAbiCoder.encode(
59
109
  actionMetadataTypes.dapp,
60
- [params.name, params.url]
61
- );
110
+ [params.name, params.url],
111
+ )
112
+
113
+ const data = encodeMetadata({
114
+ type: MetadataEnums.dapp,
115
+ encodedData,
116
+ })
117
+
118
+ return single ? encodeMultipleActions(data) : data
119
+ }
120
+
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
+ )
62
126
 
63
127
  const data = encodeMetadata({
64
- type: "dapp",
128
+ type: MetadataEnums['avocado-bridge'],
65
129
  encodedData,
66
- });
130
+ })
67
131
 
68
- return single ? encodeMultipleActions(data) : data;
69
- };
132
+ return single ? encodeMultipleActions(data) : data
133
+ }
70
134
 
71
- export const encodeTransferMetadata = (
72
- params: SendMetadataProps,
73
- single = true
74
- ) => {
135
+ export function encodeTransferMetadata(params: SendMetadataProps, single = true) {
75
136
  const encodedData = ethers.utils.defaultAbiCoder.encode(
76
137
  actionMetadataTypes.transfer,
77
- [params.token, params.amount, params.receiver]
78
- );
138
+ [params.token, params.amount, params.receiver],
139
+ )
79
140
 
80
141
  const data = encodeMetadata({
81
- type: "transfer",
142
+ type: MetadataEnums.transfer,
82
143
  encodedData,
83
- });
144
+ })
84
145
 
85
- return single ? encodeMultipleActions(data) : data;
86
- };
146
+ return single ? encodeMultipleActions(data) : data
147
+ }
87
148
 
88
- export const encodeCrossTransferMetadata = (
89
- params: CrossSendMetadataProps,
90
- single = true
91
- ) => {
149
+ export function encodeRejectionMetadata(id: string, single = true) {
92
150
  const encodedData = ethers.utils.defaultAbiCoder.encode(
93
- actionMetadataTypes["cross-transfer"],
94
- [
95
- params.fromToken,
96
- params.toToken,
97
- params.toChainId,
98
- params.amount,
99
- params.receiver,
100
- ]
101
- );
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
+ )
188
+
189
+ const data = encodeMetadata({
190
+ type: MetadataEnums[type],
191
+ encodedData,
192
+ })
193
+
194
+ return single ? encodeMultipleActions(data) : data
195
+ }
196
+
197
+ export function encodeAuthMetadata(params: AuthMetadataProps, single = true) {
198
+ const encodedData = ethers.utils.defaultAbiCoder.encode(
199
+ actionMetadataTypes.auth,
200
+ [params.address, params.chainId, params.remove],
201
+ )
102
202
 
103
203
  const data = encodeMetadata({
104
- type: "cross-transfer",
204
+ type: MetadataEnums.auth,
105
205
  encodedData,
106
- });
206
+ })
207
+
208
+ return single ? encodeMultipleActions(data) : data
209
+ }
210
+
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
+ }
107
219
 
108
- return single ? encodeMultipleActions(data) : data;
109
- };
220
+ export function encodeTransactionBuilderMetadata(actionCount: string, single = true) {
221
+ const encodedData = ethers.utils.defaultAbiCoder.encode(
222
+ actionMetadataTypes['tx-builder'],
223
+ [actionCount],
224
+ )
110
225
 
111
- export const encodeDeployMetadata = (single = true) => {
112
226
  const data = encodeMetadata({
113
- type: "deploy",
114
- encodedData: "0x",
115
- });
227
+ type: MetadataEnums['tx-builder'],
228
+ encodedData,
229
+ })
116
230
 
117
- return single ? encodeMultipleActions(data) : data;
118
- };
231
+ return single ? encodeMultipleActions(data) : data
232
+ }
119
233
 
120
- export const encodeWCSignMetadata = (
121
- params: SignMetadataProps,
122
- single = true
123
- ) => {
234
+ export function encodeWCSignMetadata(params: SignMetadataProps, single = true) {
124
235
  const encodedData = ethers.utils.defaultAbiCoder.encode(
125
- actionMetadataTypes["permit2"],
126
- [params.token, params.spender, params.amount, params.expiration]
127
- );
236
+ actionMetadataTypes.permit2,
237
+ [params.token, params.spender, params.amount, params.expiration],
238
+ )
128
239
 
129
240
  const data = encodeMetadata({
130
- type: "permit2",
241
+ type: MetadataEnums.permit2,
131
242
  encodedData,
132
- });
243
+ })
133
244
 
134
- return single ? encodeMultipleActions(data) : data;
135
- };
245
+ return single ? encodeMultipleActions(data) : data
246
+ }
136
247
 
137
- export const encodeUpgradeMetadata = (
138
- params: UpgradeMetadataProps,
139
- single = true
140
- ) => {
248
+ export function encodeUpgradeMetadata(params: UpgradeMetadataProps, single = true) {
141
249
  const encodedData = ethers.utils.defaultAbiCoder.encode(
142
250
  actionMetadataTypes.upgrade,
143
- [params.version, params.walletImpl]
144
- );
251
+ [params.version, params.walletImpl],
252
+ )
145
253
 
146
254
  const data = encodeMetadata({
147
- type: "upgrade",
255
+ type: MetadataEnums.upgrade,
148
256
  encodedData,
149
- });
257
+ })
150
258
 
151
- return single ? encodeMultipleActions(data) : data;
152
- };
259
+ return single ? encodeMultipleActions(data) : data
260
+ }
153
261
 
154
- export const encodeSwapMetadata = (
155
- params: SwapMetadataProps,
156
- single = true
157
- ) => {
262
+ export function encodeSwapMetadata(params: SwapMetadataProps, single = true) {
158
263
  const encodedData = ethers.utils.defaultAbiCoder.encode(
159
264
  actionMetadataTypes.swap,
160
265
  [
@@ -164,207 +269,389 @@ export const encodeSwapMetadata = (
164
269
  params.buyAmount,
165
270
  params.receiver,
166
271
  params.protocol,
167
- ]
168
- );
272
+ ],
273
+ )
169
274
 
170
275
  const data = encodeMetadata({
171
- type: "swap",
276
+ type: MetadataEnums.swap,
172
277
  encodedData,
173
- });
278
+ })
174
279
 
175
- return single ? encodeMultipleActions(data) : data;
176
- };
280
+ return single ? encodeMultipleActions(data) : data
281
+ }
177
282
 
178
- export const encodeTopupMetadata = (
179
- params: TopupMetadataProps,
180
- single = true
181
- ) => {
283
+ export function encodeTopupMetadata(params: TopupMetadataProps, single = true) {
182
284
  const encodedData = ethers.utils.defaultAbiCoder.encode(
183
- actionMetadataTypes["gas-topup"],
184
- [params.amount, params.token, params.onBehalf]
185
- );
285
+ actionMetadataTypes['gas-topup'],
286
+ [params.amount, params.token, params.onBehalf],
287
+ )
288
+
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
+ )
326
+
327
+ const data = encodeMetadata({
328
+ type,
329
+ encodedData,
330
+ })
186
331
 
187
- console.log(params);
332
+ return single ? encodeMultipleActions(data) : data
333
+ }
334
+
335
+ export function encodeChangeThresholdMetadata(threshold: string | number, single = true) {
336
+ const encodedData = ethers.utils.defaultAbiCoder.encode(
337
+ actionMetadataTypes['change-threshold'],
338
+ [toBN(threshold).toNumber()],
339
+ )
188
340
 
189
341
  const data = encodeMetadata({
190
- type: "gas-topup",
342
+ type: MetadataEnums['change-threshold'],
191
343
  encodedData,
192
- });
344
+ })
193
345
 
194
- return single ? encodeMultipleActions(data) : data;
195
- };
346
+ return single ? encodeMultipleActions(data) : data
347
+ }
196
348
 
197
- export const encodeBridgeMetadata = (
198
- params: BridgeMetadataProps,
199
- single = true
200
- ) => {
349
+ export function encodeRemoveSignersMetadata(addresses: string[], single = true) {
201
350
  const encodedData = ethers.utils.defaultAbiCoder.encode(
202
- actionMetadataTypes.bridge,
203
- [
204
- params.amount,
205
- params.receiver,
206
- params.fromToken,
207
- params.toToken,
208
- params.toChainId,
209
- params.bridgeFee,
210
- params.nativeToken,
211
- ]
212
- );
351
+ actionMetadataTypes['remove-signers'],
352
+ [addresses],
353
+ )
213
354
 
214
355
  const data = encodeMetadata({
215
- type: "bridge",
356
+ type: MetadataEnums['remove-signers'],
216
357
  encodedData,
217
- });
358
+ })
218
359
 
219
- return single ? encodeMultipleActions(data) : data;
220
- };
360
+ return single ? encodeMultipleActions(data) : data
361
+ }
221
362
 
222
- export const encodeMultipleActions = (...actionData: string[]) => {
223
- return ethers.utils.defaultAbiCoder.encode(multiMetadataTypes, [actionData]);
224
- };
363
+ export function encodeImportMetadata(protocol: string, valueInUsd: string, single = true) {
364
+ const encodedData = ethers.utils.defaultAbiCoder.encode(
365
+ actionMetadataTypes.import,
366
+ [protocol, valueInUsd],
367
+ )
225
368
 
226
- export const decodeMetadata = (data: string) => {
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) {
227
405
  try {
228
- const iface = Forwarder__factory.createInterface();
229
- let metadata = "0x";
230
- let payload = {};
231
-
232
- if (!data) return payload;
233
-
234
- if (data.startsWith("0x18e7f485")) {
235
- const executeData = iface.decodeFunctionData("execute", data);
236
- if (executeData.metadata_ === "0x" || !executeData.metadata_) {
237
- return null;
238
- } else {
239
- metadata = executeData.metadata_;
240
- }
241
- } else {
242
- const executeDataV2 = iface.decodeFunctionData("executeV2", data);
243
- if (
244
- executeDataV2.params_.metadata === "0x" ||
245
- !executeDataV2.params_.metadata
246
- ) {
247
- return null;
248
- } else {
249
- metadata = executeDataV2.params_.metadata;
250
- }
251
- }
406
+ const metadata = getMetadataFromData(data) || '0x'
252
407
 
253
- const metadataArr = [];
408
+ return parseMetadata(metadata)
409
+ }
410
+ catch {
411
+ // console.log(e);
412
+ return null
413
+ }
414
+ }
254
415
 
255
- const [decodedMultiMetadata = []] =
256
- (ethers.utils.defaultAbiCoder.decode(
257
- multiMetadataTypes,
258
- metadata
259
- ) as string[]) || [];
416
+ export function decodeMetadata(metadata: string) {
417
+ try {
418
+ return parseMetadata(metadata)
419
+ }
420
+ catch {
421
+ return null
422
+ }
423
+ }
260
424
 
261
- for (let metadata of decodedMultiMetadata) {
262
- const decodedMetadata = ethers.utils.defaultAbiCoder.decode(
263
- metadataTypes,
264
- metadata
265
- );
425
+ const iface = Forwarder__factory.createInterface()
426
+ const ifaceMultisig = MultisigForwarder__factory.createInterface()
427
+ const ifaceAgnostic = MultisigAgnosticForwarder__factory.createInterface()
266
428
 
267
- const type = ethers.utils.parseBytes32String(
268
- decodedMetadata.type
269
- ) as keyof typeof actionMetadataTypes;
429
+ function getMetadataFromData(data: string) {
430
+ let metadata = '0x'
270
431
 
271
- const decodedData = ethers.utils.defaultAbiCoder.decode(
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
438
+ }
439
+
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
+ }
476
+
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(
272
626
  actionMetadataTypes[type],
273
- decodedMetadata.data
274
- );
275
-
276
- switch (type) {
277
- case "transfer":
278
- payload = {
279
- type,
280
- token: decodedData.token,
281
- amount: toBN(decodedData.amount).toFixed(),
282
- receiver: decodedData.receiver,
283
- };
284
- break;
285
- case "bridge":
286
- payload = {
287
- type,
288
- amount: toBN(decodedData.amount).toFixed(),
289
- receiver: decodedData.receiver,
290
- toToken: decodedData.toToken,
291
- fromToken: decodedData.fromToken,
292
- toChainId: decodedData.toChainId
293
- ? decodedData.toChainId.toString()
294
- : null,
295
- bridgeFee: toBN(decodedData.bridgeFee).toFixed(),
296
- };
297
- break;
298
- case "swap":
299
- payload = {
300
- type,
301
- buyAmount: toBN(decodedData.buyAmount).toFixed(),
302
- sellAmount: toBN(decodedData.sellAmount).toFixed(),
303
- buyToken: decodedData.buyToken,
304
- sellToken: decodedData.sellToken,
305
- receiver: decodedData.receiver,
306
- protocol: utils.parseBytes32String(decodedData?.protocol || ""),
307
- };
308
- break;
309
- case "upgrade":
310
- payload = {
311
- type,
312
- version: utils.parseBytes32String(decodedData?.version || ""),
313
- walletImpl: decodedData?.walletImpl,
314
- };
315
- break;
316
- case "gas-topup":
317
- payload = {
318
- type,
319
- amount: toBN(decodedData.amount).toFixed(),
320
- token: decodedData.token,
321
- onBehalf: decodedData.onBehalf,
322
- };
323
- break;
324
- case "dapp":
325
- payload = {
326
- type,
327
- name: decodedData?.name,
328
- url: decodedData?.url,
329
- };
330
- break;
331
- case "deploy":
332
- payload = {
333
- type,
334
- };
335
- break;
336
-
337
- case "permit2":
338
- payload = {
339
- type,
340
- token: decodedData.token,
341
- spender: decodedData.spender,
342
- amount: toBN(decodedData.amount).toFixed(),
343
- expiration: decodedData.expiration,
344
- };
345
- break;
346
-
347
- case "cross-transfer":
348
- payload = {
349
- type,
350
- fromToken: decodedData.fromToken,
351
- toToken: decodedData.toToken,
352
- toChainId: decodedData.toChainId
353
- ? decodedData.toChainId.toString()
354
- : null,
355
- amount: toBN(decodedData.amount).toFixed(),
356
- receiver: decodedData.receiver,
357
- };
358
-
359
- break;
360
- }
361
-
362
- 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)
363
635
  }
636
+ }
364
637
 
365
- return metadataArr;
366
- } catch (e) {
367
- console.log(e);
368
- 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'
369
650
  }
370
- };
651
+
652
+ const finalSentence = txType
653
+ .replace('-', ' ')
654
+ .replace(/(^\w)|(\s+\w)/g, letter => letter.toUpperCase())
655
+
656
+ return finalSentence
657
+ }