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