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