@instadapp/avocado-base 0.0.0-dev.d695dce → 0.0.0-dev.d723a21

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