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