@instadapp/avocado-base 0.0.0-dev.424dd71 → 0.0.0-dev.4546ed9
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 +68 -0
- package/abi/multisigAgnosticForwarder.json +938 -0
- package/assets/images/icons/check.svg +3 -0
- package/assets/images/icons/copy.svg +9 -2
- package/assets/images/icons/stars.svg +4 -0
- package/components/ActionLogo.vue +32 -30
- package/components/ActionMetadata.vue +30 -20
- package/components/Address.vue +74 -0
- package/components/AuthorityAvatar.vue +4 -5
- package/components/ChainLogo.vue +10 -17
- package/components/CopyClipboard.vue +16 -38
- package/components/metadata/CrossTransfer.vue +29 -32
- package/components/metadata/Signers.vue +11 -55
- package/components/metadata/Swap.vue +29 -30
- package/components/metadata/Transfer.vue +25 -27
- package/contracts/MultisigAgnosticForwarder.ts +1423 -0
- package/contracts/factories/MultisigAgnosticForwarder__factory.ts +2135 -0
- package/contracts/factories/index.ts +1 -0
- package/contracts/index.ts +2 -0
- package/eslint.config.mjs +19 -0
- package/nuxt.config.ts +7 -2
- package/package.json +18 -13
- package/utils/formatter.ts +1 -1
- package/utils/metadata.ts +104 -8
- package/utils/network.ts +421 -265
- package/utils/utils.d.ts +14 -2
|
@@ -6,4 +6,5 @@ export { BalanceResolver__factory } from "./BalanceResolver__factory";
|
|
|
6
6
|
export { Erc20__factory } from "./Erc20__factory";
|
|
7
7
|
export { Forwarder__factory } from "./Forwarder__factory";
|
|
8
8
|
export { GaslessWallet__factory } from "./GaslessWallet__factory";
|
|
9
|
+
export { MultisigAgnosticForwarder__factory } from "./MultisigAgnosticForwarder__factory";
|
|
9
10
|
export { MultisigForwarder__factory } from "./MultisigForwarder__factory";
|
package/contracts/index.ts
CHANGED
|
@@ -6,6 +6,7 @@ export type { BalanceResolver } from "./BalanceResolver";
|
|
|
6
6
|
export type { Erc20 } from "./Erc20";
|
|
7
7
|
export type { Forwarder } from "./Forwarder";
|
|
8
8
|
export type { GaslessWallet } from "./GaslessWallet";
|
|
9
|
+
export type { MultisigAgnosticForwarder } from "./MultisigAgnosticForwarder";
|
|
9
10
|
export type { MultisigForwarder } from "./MultisigForwarder";
|
|
10
11
|
export * as factories from "./factories";
|
|
11
12
|
export { AvoFactoryProxy__factory } from "./factories/AvoFactoryProxy__factory";
|
|
@@ -13,4 +14,5 @@ export { BalanceResolver__factory } from "./factories/BalanceResolver__factory";
|
|
|
13
14
|
export { Erc20__factory } from "./factories/Erc20__factory";
|
|
14
15
|
export { Forwarder__factory } from "./factories/Forwarder__factory";
|
|
15
16
|
export { GaslessWallet__factory } from "./factories/GaslessWallet__factory";
|
|
17
|
+
export { MultisigAgnosticForwarder__factory } from "./factories/MultisigAgnosticForwarder__factory";
|
|
16
18
|
export { MultisigForwarder__factory } from "./factories/MultisigForwarder__factory";
|
|
@@ -0,0 +1,19 @@
|
|
|
1
|
+
// @ts-check
|
|
2
|
+
import antfu from '@antfu/eslint-config'
|
|
3
|
+
import withNuxt from './.nuxt/eslint.config.mjs'
|
|
4
|
+
|
|
5
|
+
export default withNuxt(
|
|
6
|
+
antfu({
|
|
7
|
+
yaml: false,
|
|
8
|
+
rules: {
|
|
9
|
+
'style/max-statements-per-line': 'off',
|
|
10
|
+
'max-statements-per-line': 'off',
|
|
11
|
+
'@stylistic/max-statements-per-line': 'off',
|
|
12
|
+
'vue/return-in-computed-property': 'off',
|
|
13
|
+
'no-console': 'off',
|
|
14
|
+
'ts/ban-ts-comment': 'off',
|
|
15
|
+
'vue/prop-name-casing': 'off',
|
|
16
|
+
'node/prefer-global/process': 'off',
|
|
17
|
+
},
|
|
18
|
+
}),
|
|
19
|
+
)
|
package/nuxt.config.ts
CHANGED
|
@@ -2,7 +2,7 @@
|
|
|
2
2
|
import ViteComponents from "unplugin-vue-components/vite";
|
|
3
3
|
|
|
4
4
|
export default defineNuxtConfig({
|
|
5
|
-
modules: ["@nuxtjs/tailwindcss", "nuxt-svgo", "@vueuse/nuxt"],
|
|
5
|
+
modules: ["@nuxtjs/tailwindcss", "nuxt-svgo", "@vueuse/nuxt", "@nuxt/eslint"],
|
|
6
6
|
svgo: {
|
|
7
7
|
defaultImport: "component",
|
|
8
8
|
autoImportPath: "./assets/images/icons",
|
|
@@ -17,4 +17,9 @@ export default defineNuxtConfig({
|
|
|
17
17
|
}),
|
|
18
18
|
],
|
|
19
19
|
},
|
|
20
|
-
|
|
20
|
+
eslint: {
|
|
21
|
+
config: {
|
|
22
|
+
standalone: false,
|
|
23
|
+
},
|
|
24
|
+
},
|
|
25
|
+
});
|
package/package.json
CHANGED
|
@@ -1,32 +1,37 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@instadapp/avocado-base",
|
|
3
|
-
"version": "0.0.0-dev.424dd71",
|
|
4
3
|
"type": "module",
|
|
4
|
+
"version": "0.0.0-dev.4546ed9",
|
|
5
5
|
"main": "./nuxt.config.ts",
|
|
6
6
|
"types": "global.d.ts",
|
|
7
|
+
"engines": {
|
|
8
|
+
"node": ">=v18.18.0"
|
|
9
|
+
},
|
|
7
10
|
"scripts": {
|
|
8
11
|
"build": "nuxt build",
|
|
9
12
|
"dev": "nuxt dev",
|
|
10
13
|
"generate": "nuxt generate",
|
|
11
14
|
"preview": "nuxt preview",
|
|
12
|
-
"generate:contracts": "rimraf contracts && typechain --target=ethers-v5 'abi/*.json' --out-dir 'contracts'"
|
|
15
|
+
"generate:contracts": "rimraf contracts && typechain --target=ethers-v5 'abi/*.json' --out-dir 'contracts'",
|
|
16
|
+
"typecheck": "nuxi typecheck"
|
|
17
|
+
},
|
|
18
|
+
"dependencies": {
|
|
19
|
+
"@antfu/eslint-config": "^2.21.1",
|
|
20
|
+
"@vueuse/nuxt": "^10.2.0",
|
|
21
|
+
"bignumber.js": "^9.1.1",
|
|
22
|
+
"ethers": "^5.7.2",
|
|
23
|
+
"viem": "^2.10.5",
|
|
24
|
+
"xxhashjs": "^0.2.2"
|
|
13
25
|
},
|
|
14
26
|
"devDependencies": {
|
|
15
|
-
"@
|
|
16
|
-
"@
|
|
17
|
-
"@nuxtjs/tailwindcss": "^6.6.5",
|
|
27
|
+
"@nuxt/eslint": "^0.3.13",
|
|
28
|
+
"@nuxtjs/tailwindcss": "^6.11.3",
|
|
18
29
|
"@typechain/ethers-v5": "^10.2.0",
|
|
19
|
-
"nuxt": "
|
|
20
|
-
"nuxt-svgo": "^
|
|
30
|
+
"nuxt": "3.10.1",
|
|
31
|
+
"nuxt-svgo": "^4.0.0",
|
|
21
32
|
"rimraf": "^3.0.2",
|
|
22
33
|
"typechain": "^8.1.1",
|
|
23
34
|
"unplugin-vue-components": "^0.25.1",
|
|
24
35
|
"vue-tippy": "^6.0.0"
|
|
25
|
-
},
|
|
26
|
-
"dependencies": {
|
|
27
|
-
"@vueuse/nuxt": "^10.2.0",
|
|
28
|
-
"bignumber.js": "^9.1.1",
|
|
29
|
-
"ethers": "^5.7.2",
|
|
30
|
-
"xxhashjs": "^0.2.2"
|
|
31
36
|
}
|
|
32
37
|
}
|
package/utils/formatter.ts
CHANGED
|
@@ -19,7 +19,7 @@ export function formatPercent(
|
|
|
19
19
|
return formatter.format(valueAsNumber);
|
|
20
20
|
}
|
|
21
21
|
|
|
22
|
-
export function shortenHash(hash: string
|
|
22
|
+
export function shortenHash(hash: string | `0x${string}`, length: number = 4) {
|
|
23
23
|
if (!hash) return;
|
|
24
24
|
if (hash.length < 12) return hash;
|
|
25
25
|
const beginningChars = hash.startsWith("0x") ? length + 2 : length;
|
package/utils/metadata.ts
CHANGED
|
@@ -1,10 +1,11 @@
|
|
|
1
1
|
import { ethers, utils } from "ethers";
|
|
2
|
-
import { Forwarder__factory, MultisigForwarder__factory } from "../contracts";
|
|
2
|
+
import { Forwarder__factory, MultisigForwarder__factory, MultisigAgnosticForwarder__factory } from "../contracts";
|
|
3
3
|
import { toBN } from "./bignumber";
|
|
4
4
|
|
|
5
5
|
export const MetadataEnums = {
|
|
6
6
|
transfer: "transfer",
|
|
7
7
|
bridge: "bridge",
|
|
8
|
+
'bridge-v2': 'bridge-v2',
|
|
8
9
|
swap: "swap",
|
|
9
10
|
"gas-topup": "gas-topup",
|
|
10
11
|
upgrade: "upgrade",
|
|
@@ -12,6 +13,7 @@ export const MetadataEnums = {
|
|
|
12
13
|
deploy: "deploy",
|
|
13
14
|
permit2: "permit2",
|
|
14
15
|
"cross-transfer": "cross-transfer",
|
|
16
|
+
'cross-transfer-v2': 'cross-transfer-v2',
|
|
15
17
|
auth: "auth",
|
|
16
18
|
rejection: "rejection",
|
|
17
19
|
"instadapp-pro": "instadapp-pro",
|
|
@@ -19,6 +21,7 @@ export const MetadataEnums = {
|
|
|
19
21
|
"remove-signers": "remove-signers",
|
|
20
22
|
"change-threshold": "change-threshold",
|
|
21
23
|
import: "import",
|
|
24
|
+
mass: "mass",
|
|
22
25
|
"tx-builder": "tx-builder",
|
|
23
26
|
"avocado-bridge": "avocado-bridge",
|
|
24
27
|
} as const;
|
|
@@ -36,6 +39,14 @@ const actionMetadataTypes: Record<MetadataTypes, string[]> = {
|
|
|
36
39
|
"uint256 amount",
|
|
37
40
|
"address receiver",
|
|
38
41
|
],
|
|
42
|
+
"cross-transfer-v2": [
|
|
43
|
+
"address fromToken",
|
|
44
|
+
"address toToken",
|
|
45
|
+
"uint256 toChainId",
|
|
46
|
+
"uint256 amount",
|
|
47
|
+
"address receiver",
|
|
48
|
+
"bytes32 provider",
|
|
49
|
+
],
|
|
39
50
|
bridge: [
|
|
40
51
|
"uint256 amount",
|
|
41
52
|
"address receiver",
|
|
@@ -45,6 +56,16 @@ const actionMetadataTypes: Record<MetadataTypes, string[]> = {
|
|
|
45
56
|
"uint256 bridgeFee",
|
|
46
57
|
"address nativeToken",
|
|
47
58
|
],
|
|
59
|
+
'bridge-v2': [
|
|
60
|
+
"uint256 amount",
|
|
61
|
+
"address receiver",
|
|
62
|
+
"address fromToken",
|
|
63
|
+
"address toToken",
|
|
64
|
+
"uint256 toChainId",
|
|
65
|
+
"uint256 bridgeFee",
|
|
66
|
+
"address nativeToken",
|
|
67
|
+
"bytes32 provider",
|
|
68
|
+
],
|
|
48
69
|
swap: [
|
|
49
70
|
"address sellToken",
|
|
50
71
|
"address buyToken",
|
|
@@ -72,6 +93,7 @@ const actionMetadataTypes: Record<MetadataTypes, string[]> = {
|
|
|
72
93
|
"change-threshold": ["uint8 count"],
|
|
73
94
|
rejection: ["bytes32 id"],
|
|
74
95
|
"avocado-bridge": ["bytes32 id", "uint256 toChainId"],
|
|
96
|
+
mass: ["bool isMass"],
|
|
75
97
|
};
|
|
76
98
|
|
|
77
99
|
const encodeMetadata = (props: MetadataProps) => {
|
|
@@ -152,8 +174,21 @@ export const encodeCrossTransferMetadata = (
|
|
|
152
174
|
params: CrossSendMetadataProps,
|
|
153
175
|
single = true
|
|
154
176
|
) => {
|
|
155
|
-
|
|
156
|
-
|
|
177
|
+
|
|
178
|
+
const type = params.provider ? MetadataEnums["cross-transfer-v2"] : MetadataEnums["cross-transfer"]
|
|
179
|
+
|
|
180
|
+
const encodedData = params.provider ? ethers.utils.defaultAbiCoder.encode(
|
|
181
|
+
actionMetadataTypes[type],
|
|
182
|
+
[
|
|
183
|
+
params.fromToken,
|
|
184
|
+
params.toToken,
|
|
185
|
+
params.toChainId,
|
|
186
|
+
params.amount,
|
|
187
|
+
params.receiver,
|
|
188
|
+
params.provider
|
|
189
|
+
]
|
|
190
|
+
) : ethers.utils.defaultAbiCoder.encode(
|
|
191
|
+
actionMetadataTypes[type],
|
|
157
192
|
[
|
|
158
193
|
params.fromToken,
|
|
159
194
|
params.toToken,
|
|
@@ -164,7 +199,7 @@ export const encodeCrossTransferMetadata = (
|
|
|
164
199
|
);
|
|
165
200
|
|
|
166
201
|
const data = encodeMetadata({
|
|
167
|
-
type: MetadataEnums[
|
|
202
|
+
type: MetadataEnums[type],
|
|
168
203
|
encodedData,
|
|
169
204
|
});
|
|
170
205
|
|
|
@@ -293,7 +328,21 @@ export const encodeBridgeMetadata = (
|
|
|
293
328
|
params: BridgeMetadataProps,
|
|
294
329
|
single = true
|
|
295
330
|
) => {
|
|
296
|
-
const
|
|
331
|
+
const type = params.version === '2' ? MetadataEnums["bridge-v2"] : MetadataEnums.bridge
|
|
332
|
+
|
|
333
|
+
const encodedData = params.version === '2' ? ethers.utils.defaultAbiCoder.encode(
|
|
334
|
+
actionMetadataTypes["bridge-v2"],
|
|
335
|
+
[
|
|
336
|
+
params.amount,
|
|
337
|
+
params.receiver,
|
|
338
|
+
params.fromToken,
|
|
339
|
+
params.toToken,
|
|
340
|
+
params.toChainId,
|
|
341
|
+
params.bridgeFee,
|
|
342
|
+
params.nativeToken,
|
|
343
|
+
params.provider
|
|
344
|
+
]
|
|
345
|
+
): ethers.utils.defaultAbiCoder.encode(
|
|
297
346
|
actionMetadataTypes.bridge,
|
|
298
347
|
[
|
|
299
348
|
params.amount,
|
|
@@ -307,7 +356,7 @@ export const encodeBridgeMetadata = (
|
|
|
307
356
|
);
|
|
308
357
|
|
|
309
358
|
const data = encodeMetadata({
|
|
310
|
-
type
|
|
359
|
+
type,
|
|
311
360
|
encodedData,
|
|
312
361
|
});
|
|
313
362
|
|
|
@@ -366,6 +415,15 @@ export const encodeImportMetadata = (
|
|
|
366
415
|
return single ? encodeMultipleActions(data) : data;
|
|
367
416
|
};
|
|
368
417
|
|
|
418
|
+
export const encodeMassMetadata = (single = true) => {
|
|
419
|
+
const data = encodeMetadata({
|
|
420
|
+
type: MetadataEnums.mass,
|
|
421
|
+
encodedData: '0x',
|
|
422
|
+
});
|
|
423
|
+
|
|
424
|
+
return single ? encodeMultipleActions(data) : data;
|
|
425
|
+
}
|
|
426
|
+
|
|
369
427
|
export const encodeAddSignersMetadata = (
|
|
370
428
|
addresses: string[],
|
|
371
429
|
single = true
|
|
@@ -408,11 +466,22 @@ export const decodeMetadata = (metadata: string) => {
|
|
|
408
466
|
|
|
409
467
|
const iface = Forwarder__factory.createInterface();
|
|
410
468
|
const ifaceMultisig = MultisigForwarder__factory.createInterface();
|
|
469
|
+
const ifaceAgnostic = MultisigAgnosticForwarder__factory.createInterface();
|
|
411
470
|
|
|
412
471
|
const getMetadataFromData = (data: string) => {
|
|
413
472
|
let metadata = "0x";
|
|
414
473
|
|
|
415
|
-
if
|
|
474
|
+
if(data.startsWith('0xc5e15557')) {
|
|
475
|
+
|
|
476
|
+
const executeData = ifaceAgnostic.decodeFunctionData("executeChainAgnosticV1", data);
|
|
477
|
+
|
|
478
|
+
|
|
479
|
+
const metadata = executeData?.params_?.params?.metadata
|
|
480
|
+
|
|
481
|
+
return metadata === '0x' || !metadata ? null : metadata
|
|
482
|
+
}
|
|
483
|
+
|
|
484
|
+
else if (data.startsWith("0x18e7f485")) {
|
|
416
485
|
const executeData = iface.decodeFunctionData("execute", data);
|
|
417
486
|
if (executeData.metadata_ === "0x" || !executeData.metadata_) {
|
|
418
487
|
return null;
|
|
@@ -468,6 +537,16 @@ const typesPayload: IPayload = {
|
|
|
468
537
|
toChainId: data.toChainId ? data.toChainId.toString() : null,
|
|
469
538
|
bridgeFee: toBN(data.bridgeFee).toFixed(),
|
|
470
539
|
}),
|
|
540
|
+
'bridge-v2': (data, type) => ({
|
|
541
|
+
type: 'bridge',
|
|
542
|
+
amount: toBN(data.amount).toFixed(),
|
|
543
|
+
receiver: data.receiver,
|
|
544
|
+
toToken: data.toToken,
|
|
545
|
+
fromToken: data.fromToken,
|
|
546
|
+
toChainId: data.toChainId ? data.toChainId.toString() : null,
|
|
547
|
+
bridgeFee: toBN(data.bridgeFee).toFixed(),
|
|
548
|
+
provider: utils.parseBytes32String(data.provider || ""),
|
|
549
|
+
}),
|
|
471
550
|
swap: (data, type) => ({
|
|
472
551
|
type,
|
|
473
552
|
buyAmount: toBN(data.buyAmount).toFixed(),
|
|
@@ -515,6 +594,15 @@ const typesPayload: IPayload = {
|
|
|
515
594
|
amount: toBN(data.amount).toFixed(),
|
|
516
595
|
receiver: data.receiver,
|
|
517
596
|
}),
|
|
597
|
+
"cross-transfer-v2": (data, type) => ({
|
|
598
|
+
type: 'cross-transfer',
|
|
599
|
+
fromToken: data.fromToken,
|
|
600
|
+
toToken: data.toToken,
|
|
601
|
+
toChainId: data.toChainId ? data.toChainId.toString() : null,
|
|
602
|
+
amount: toBN(data.amount).toFixed(),
|
|
603
|
+
receiver: data.receiver,
|
|
604
|
+
provider: utils.parseBytes32String(data.provider || ""),
|
|
605
|
+
}),
|
|
518
606
|
auth: (data) => ({
|
|
519
607
|
type: data.remove ? "remove-authority" : "add-authority",
|
|
520
608
|
address: data.address,
|
|
@@ -546,6 +634,10 @@ const typesPayload: IPayload = {
|
|
|
546
634
|
id: data.id,
|
|
547
635
|
toChainId: data.toChainId ? data.toChainId.toString() : null,
|
|
548
636
|
}),
|
|
637
|
+
mass: (data, type) => ({
|
|
638
|
+
type,
|
|
639
|
+
data,
|
|
640
|
+
}),
|
|
549
641
|
};
|
|
550
642
|
|
|
551
643
|
const parseMetadata = (metadata: string) => {
|
|
@@ -567,7 +659,7 @@ const parseMetadata = (metadata: string) => {
|
|
|
567
659
|
decodedMetadata.type
|
|
568
660
|
) as keyof typeof actionMetadataTypes;
|
|
569
661
|
|
|
570
|
-
const decodedData = ethers.utils.defaultAbiCoder.decode(
|
|
662
|
+
const decodedData = decodedMetadata?.data === '0x' ? '' : ethers.utils.defaultAbiCoder.decode(
|
|
571
663
|
actionMetadataTypes[type],
|
|
572
664
|
decodedMetadata.data
|
|
573
665
|
);
|
|
@@ -590,6 +682,10 @@ const parseMetadata = (metadata: string) => {
|
|
|
590
682
|
* @returns {string} - The modified sentence with hyphens replaced with spaces and the first letter of each word capitalized.
|
|
591
683
|
*/
|
|
592
684
|
export const formatTxType = (txType: string) => {
|
|
685
|
+
if(txType === 'mass') {
|
|
686
|
+
return 'Chain Agnostic Payments'
|
|
687
|
+
}
|
|
688
|
+
|
|
593
689
|
const finalSentence = txType
|
|
594
690
|
.replace("-", " ")
|
|
595
691
|
.replace(/(^\w{1})|(\s+\w{1})/g, (letter) => letter.toUpperCase());
|