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