@aastar/core 0.16.7
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/LICENSE +21 -0
- package/dist/abis/BLSAggregator.json +686 -0
- package/dist/abis/BLSValidator.json +42 -0
- package/dist/abis/DVTValidator.json +368 -0
- package/dist/abis/Eip7702Support.json +24 -0
- package/dist/abis/EntryPoint.json +1382 -0
- package/dist/abis/GToken.json +513 -0
- package/dist/abis/GTokenStaking.json +949 -0
- package/dist/abis/LegacyAccount.json +625 -0
- package/dist/abis/MySBT.json +1518 -0
- package/dist/abis/Paymaster.json +1143 -0
- package/dist/abis/PaymasterFactory.json +640 -0
- package/dist/abis/Registry.json +1942 -0
- package/dist/abis/ReputationSystem.json +699 -0
- package/dist/abis/SenderCreator.json +99 -0
- package/dist/abis/Simple7702Account.json +395 -0
- package/dist/abis/SimpleAccount.json +560 -0
- package/dist/abis/SimpleAccountFactory.json +111 -0
- package/dist/abis/SimpleAccountFactoryV08.json +87 -0
- package/dist/abis/SimpleAccountV08.json +557 -0
- package/dist/abis/SuperPaymaster.json +1781 -0
- package/dist/abis/UserOperationLib.json +57 -0
- package/dist/abis/abi.config.json +24 -0
- package/dist/abis/index.d.ts +1126 -0
- package/dist/abis/index.js +91 -0
- package/dist/abis/xPNTsFactory.json +718 -0
- package/dist/abis/xPNTsToken.json +1280 -0
- package/dist/actions/StateValidator.d.ts +68 -0
- package/dist/actions/StateValidator.js +187 -0
- package/dist/actions/StateValidator.test.d.ts +1 -0
- package/dist/actions/StateValidator.test.js +144 -0
- package/dist/actions/account.d.ts +55 -0
- package/dist/actions/account.js +133 -0
- package/dist/actions/account.test.d.ts +1 -0
- package/dist/actions/account.test.js +118 -0
- package/dist/actions/aggregator.d.ts +17 -0
- package/dist/actions/aggregator.js +31 -0
- package/dist/actions/aggregator.test.d.ts +1 -0
- package/dist/actions/aggregator.test.js +67 -0
- package/dist/actions/dvt.d.ts +30 -0
- package/dist/actions/dvt.js +41 -0
- package/dist/actions/dvt.test.d.ts +1 -0
- package/dist/actions/dvt.test.js +98 -0
- package/dist/actions/entryPoint.d.ts +90 -0
- package/dist/actions/entryPoint.js +211 -0
- package/dist/actions/entryPoint.test.d.ts +1 -0
- package/dist/actions/entryPoint.test.js +139 -0
- package/dist/actions/factory.d.ts +215 -0
- package/dist/actions/factory.js +442 -0
- package/dist/actions/factory.test.d.ts +1 -0
- package/dist/actions/factory.test.js +197 -0
- package/dist/actions/faucet.d.ts +48 -0
- package/dist/actions/faucet.js +337 -0
- package/dist/actions/faucet.test.d.ts +1 -0
- package/dist/actions/faucet.test.js +120 -0
- package/dist/actions/gtokenExtended.d.ts +39 -0
- package/dist/actions/gtokenExtended.js +115 -0
- package/dist/actions/gtokenExtended.test.d.ts +1 -0
- package/dist/actions/gtokenExtended.test.js +118 -0
- package/dist/actions/index.d.ts +15 -0
- package/dist/actions/index.js +17 -0
- package/dist/actions/paymasterV4.d.ts +170 -0
- package/dist/actions/paymasterV4.js +334 -0
- package/dist/actions/paymasterV4.test.d.ts +1 -0
- package/dist/actions/paymasterV4.test.js +159 -0
- package/dist/actions/registry.d.ts +246 -0
- package/dist/actions/registry.js +667 -0
- package/dist/actions/registry.test.d.ts +1 -0
- package/dist/actions/registry.test.js +360 -0
- package/dist/actions/reputation.d.ts +129 -0
- package/dist/actions/reputation.js +281 -0
- package/dist/actions/reputation.test.d.ts +1 -0
- package/dist/actions/reputation.test.js +169 -0
- package/dist/actions/sbt.d.ts +191 -0
- package/dist/actions/sbt.js +533 -0
- package/dist/actions/sbt.test.d.ts +1 -0
- package/dist/actions/sbt.test.js +256 -0
- package/dist/actions/staking.d.ts +132 -0
- package/dist/actions/staking.js +330 -0
- package/dist/actions/staking.test.d.ts +1 -0
- package/dist/actions/staking.test.js +223 -0
- package/dist/actions/superPaymaster.d.ts +237 -0
- package/dist/actions/superPaymaster.js +644 -0
- package/dist/actions/superPaymaster.test.d.ts +1 -0
- package/dist/actions/superPaymaster.test.js +287 -0
- package/dist/actions/tokens.d.ts +229 -0
- package/dist/actions/tokens.js +415 -0
- package/dist/actions/tokens.test.d.ts +1 -0
- package/dist/actions/tokens.test.js +53 -0
- package/dist/actions/validators.d.ts +194 -0
- package/dist/actions/validators.js +433 -0
- package/dist/actions/validators.test.d.ts +1 -0
- package/dist/actions/validators.test.js +215 -0
- package/dist/branding.d.ts +30 -0
- package/dist/branding.js +30 -0
- package/dist/clients/BaseClient.d.ts +25 -0
- package/dist/clients/BaseClient.js +66 -0
- package/dist/clients/types.d.ts +60 -0
- package/dist/clients/types.js +1 -0
- package/dist/clients.d.ts +5 -0
- package/dist/clients.js +11 -0
- package/dist/communities.d.ts +52 -0
- package/dist/communities.js +73 -0
- package/dist/config/ContractConfigManager.d.ts +20 -0
- package/dist/config/ContractConfigManager.js +48 -0
- package/dist/constants.d.ts +88 -0
- package/dist/constants.js +125 -0
- package/dist/contract-addresses.d.ts +110 -0
- package/dist/contract-addresses.js +99 -0
- package/dist/contracts.d.ts +424 -0
- package/dist/contracts.js +343 -0
- package/dist/contracts.test.d.ts +1 -0
- package/dist/contracts.test.js +40 -0
- package/dist/crypto/blsSigner.d.ts +64 -0
- package/dist/crypto/blsSigner.js +98 -0
- package/dist/crypto/index.d.ts +1 -0
- package/dist/crypto/index.js +1 -0
- package/dist/index.d.ts +21 -0
- package/dist/index.js +21 -0
- package/dist/networks.d.ts +127 -0
- package/dist/networks.js +118 -0
- package/dist/requirementChecker.d.ts +38 -0
- package/dist/requirementChecker.js +139 -0
- package/dist/requirementChecker.test.d.ts +1 -0
- package/dist/requirementChecker.test.js +60 -0
- package/dist/roles.d.ts +204 -0
- package/dist/roles.js +211 -0
- package/dist/roles.test.d.ts +1 -0
- package/dist/roles.test.js +23 -0
- package/dist/utils/validation.d.ts +24 -0
- package/dist/utils/validation.js +56 -0
- package/dist/utils/validation.test.d.ts +1 -0
- package/dist/utils/validation.test.js +40 -0
- package/dist/utils.d.ts +12 -0
- package/dist/utils.js +14 -0
- package/package.json +33 -0
|
@@ -0,0 +1,118 @@
|
|
|
1
|
+
import { describe, it, expect, vi, beforeEach } from 'vitest';
|
|
2
|
+
import { accountActions, accountFactoryActions } from './account.js';
|
|
3
|
+
describe('Account Actions', () => {
|
|
4
|
+
let mockPublicClient;
|
|
5
|
+
let mockWalletClient;
|
|
6
|
+
let mockAccount;
|
|
7
|
+
const MOCK_ACCOUNT_ADDR = '0x1111111111111111111111111111111111111111';
|
|
8
|
+
const MOCK_DEST = '0x2222222222222222222222222222222222222222';
|
|
9
|
+
const MOCK_FACTORY_ADDR = '0x3333333333333333333333333333333333333333';
|
|
10
|
+
const MOCK_OWNER = '0x4444444444444444444444444444444444444444';
|
|
11
|
+
beforeEach(() => {
|
|
12
|
+
mockAccount = {
|
|
13
|
+
address: MOCK_OWNER,
|
|
14
|
+
type: 'json-rpc'
|
|
15
|
+
};
|
|
16
|
+
mockPublicClient = {
|
|
17
|
+
readContract: vi.fn(),
|
|
18
|
+
};
|
|
19
|
+
mockWalletClient = {
|
|
20
|
+
writeContract: vi.fn(),
|
|
21
|
+
account: mockAccount,
|
|
22
|
+
};
|
|
23
|
+
});
|
|
24
|
+
describe('accountActions', () => {
|
|
25
|
+
it('should execute transaction', async () => {
|
|
26
|
+
const txHash = '0xhash';
|
|
27
|
+
mockWalletClient.writeContract.mockResolvedValue(txHash);
|
|
28
|
+
const actions = accountActions(MOCK_ACCOUNT_ADDR)(mockWalletClient);
|
|
29
|
+
const result = await actions.execute({
|
|
30
|
+
dest: MOCK_DEST,
|
|
31
|
+
value: 100n,
|
|
32
|
+
func: '0x1234',
|
|
33
|
+
account: mockAccount
|
|
34
|
+
});
|
|
35
|
+
expect(result).toBe(txHash);
|
|
36
|
+
expect(mockWalletClient.writeContract).toHaveBeenCalledWith(expect.objectContaining({
|
|
37
|
+
functionName: 'execute',
|
|
38
|
+
args: [MOCK_DEST, 100n, '0x1234'],
|
|
39
|
+
}));
|
|
40
|
+
});
|
|
41
|
+
it('should execute batch transactions', async () => {
|
|
42
|
+
const txHash = '0xhash';
|
|
43
|
+
mockWalletClient.writeContract.mockResolvedValue(txHash);
|
|
44
|
+
const actions = accountActions(MOCK_ACCOUNT_ADDR)(mockWalletClient);
|
|
45
|
+
const result = await actions.executeBatch({
|
|
46
|
+
dest: [MOCK_DEST, MOCK_DEST],
|
|
47
|
+
value: [100n, 200n],
|
|
48
|
+
func: ['0x12', '0x34'],
|
|
49
|
+
account: mockAccount
|
|
50
|
+
});
|
|
51
|
+
expect(result).toBe(txHash);
|
|
52
|
+
expect(mockWalletClient.writeContract).toHaveBeenCalledWith(expect.objectContaining({
|
|
53
|
+
functionName: 'executeBatch',
|
|
54
|
+
args: [[
|
|
55
|
+
{ target: MOCK_DEST, value: 100n, data: '0x12' },
|
|
56
|
+
{ target: MOCK_DEST, value: 200n, data: '0x34' }
|
|
57
|
+
]],
|
|
58
|
+
}));
|
|
59
|
+
});
|
|
60
|
+
it('should get nonce', async () => {
|
|
61
|
+
mockPublicClient.readContract.mockResolvedValue(5n);
|
|
62
|
+
const actions = accountActions(MOCK_ACCOUNT_ADDR)(mockPublicClient);
|
|
63
|
+
const result = await actions.getNonce();
|
|
64
|
+
expect(result).toBe(5n);
|
|
65
|
+
});
|
|
66
|
+
it('should get entry point address', async () => {
|
|
67
|
+
const mockEP = '0xEP';
|
|
68
|
+
mockPublicClient.readContract.mockResolvedValue(mockEP);
|
|
69
|
+
const actions = accountActions(MOCK_ACCOUNT_ADDR)(mockPublicClient);
|
|
70
|
+
const result = await actions.entryPoint();
|
|
71
|
+
expect(result).toBe(mockEP);
|
|
72
|
+
});
|
|
73
|
+
it('should add deposit', async () => {
|
|
74
|
+
const txHash = '0xhash';
|
|
75
|
+
mockWalletClient.writeContract.mockResolvedValue(txHash);
|
|
76
|
+
const actions = accountActions(MOCK_ACCOUNT_ADDR)(mockWalletClient);
|
|
77
|
+
const result = await actions.addDeposit({ account: mockAccount });
|
|
78
|
+
expect(result).toBe(txHash);
|
|
79
|
+
});
|
|
80
|
+
it('should withdraw deposit to address', async () => {
|
|
81
|
+
const txHash = '0xhash';
|
|
82
|
+
mockWalletClient.writeContract.mockResolvedValue(txHash);
|
|
83
|
+
const actions = accountActions(MOCK_ACCOUNT_ADDR)(mockWalletClient);
|
|
84
|
+
const result = await actions.withdrawDepositTo({
|
|
85
|
+
withdrawAddress: MOCK_DEST,
|
|
86
|
+
amount: 100n,
|
|
87
|
+
account: mockAccount
|
|
88
|
+
});
|
|
89
|
+
expect(result).toBe(txHash);
|
|
90
|
+
});
|
|
91
|
+
it('should get owner', async () => {
|
|
92
|
+
mockPublicClient.readContract.mockResolvedValue(MOCK_OWNER);
|
|
93
|
+
const actions = accountActions(MOCK_ACCOUNT_ADDR)(mockPublicClient);
|
|
94
|
+
const result = await actions.owner();
|
|
95
|
+
expect(result).toBe(MOCK_OWNER);
|
|
96
|
+
});
|
|
97
|
+
});
|
|
98
|
+
describe('accountFactoryActions', () => {
|
|
99
|
+
it('should create account', async () => {
|
|
100
|
+
const txHash = '0xhash';
|
|
101
|
+
mockWalletClient.writeContract.mockResolvedValue(txHash);
|
|
102
|
+
const actions = accountFactoryActions(MOCK_FACTORY_ADDR)(mockWalletClient);
|
|
103
|
+
const result = await actions.createAccount({
|
|
104
|
+
owner: MOCK_OWNER,
|
|
105
|
+
salt: 0n,
|
|
106
|
+
account: mockAccount
|
|
107
|
+
});
|
|
108
|
+
expect(result).toBe(txHash);
|
|
109
|
+
});
|
|
110
|
+
it('should predict account address', async () => {
|
|
111
|
+
const mockAddr = '0xPREDICTED';
|
|
112
|
+
mockPublicClient.readContract.mockResolvedValue(mockAddr);
|
|
113
|
+
const actions = accountFactoryActions(MOCK_FACTORY_ADDR)(mockPublicClient);
|
|
114
|
+
const result = await actions.getAddress({ owner: MOCK_OWNER, salt: 0n });
|
|
115
|
+
expect(result).toBe(mockAddr);
|
|
116
|
+
});
|
|
117
|
+
});
|
|
118
|
+
});
|
|
@@ -0,0 +1,17 @@
|
|
|
1
|
+
import { type Address, type PublicClient, type WalletClient, type Hex, type Hash, type Account } from 'viem';
|
|
2
|
+
export type AggregatorActions = {
|
|
3
|
+
registerBLSPublicKey: (args: {
|
|
4
|
+
address: Address;
|
|
5
|
+
publicKey: Hex;
|
|
6
|
+
account?: Account | Address;
|
|
7
|
+
}) => Promise<Hash>;
|
|
8
|
+
setBLSThreshold: (args: {
|
|
9
|
+
address: Address;
|
|
10
|
+
threshold: number;
|
|
11
|
+
account?: Account | Address;
|
|
12
|
+
}) => Promise<Hash>;
|
|
13
|
+
getBLSThreshold: (args: {
|
|
14
|
+
address: Address;
|
|
15
|
+
}) => Promise<bigint>;
|
|
16
|
+
};
|
|
17
|
+
export declare const aggregatorActions: () => (client: PublicClient | WalletClient) => AggregatorActions;
|
|
@@ -0,0 +1,31 @@
|
|
|
1
|
+
import { BLSAggregatorABI } from '../abis/index.js';
|
|
2
|
+
export const aggregatorActions = () => (client) => ({
|
|
3
|
+
async registerBLSPublicKey({ address, publicKey, account }) {
|
|
4
|
+
return client.writeContract({
|
|
5
|
+
address,
|
|
6
|
+
abi: BLSAggregatorABI,
|
|
7
|
+
functionName: 'registerBLSPublicKey',
|
|
8
|
+
args: [publicKey],
|
|
9
|
+
account: account,
|
|
10
|
+
chain: client.chain
|
|
11
|
+
});
|
|
12
|
+
},
|
|
13
|
+
async setBLSThreshold({ address, threshold, account }) {
|
|
14
|
+
return client.writeContract({
|
|
15
|
+
address,
|
|
16
|
+
abi: BLSAggregatorABI,
|
|
17
|
+
functionName: 'setThreshold',
|
|
18
|
+
args: [BigInt(threshold)],
|
|
19
|
+
account: account,
|
|
20
|
+
chain: client.chain
|
|
21
|
+
});
|
|
22
|
+
},
|
|
23
|
+
async getBLSThreshold({ address }) {
|
|
24
|
+
return client.readContract({
|
|
25
|
+
address,
|
|
26
|
+
abi: BLSAggregatorABI,
|
|
27
|
+
functionName: 'threshold',
|
|
28
|
+
args: []
|
|
29
|
+
});
|
|
30
|
+
}
|
|
31
|
+
});
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
export {};
|
|
@@ -0,0 +1,67 @@
|
|
|
1
|
+
import { describe, it, expect, vi, beforeEach } from 'vitest';
|
|
2
|
+
import { aggregatorActions } from './aggregator.js';
|
|
3
|
+
describe('Aggregator Actions', () => {
|
|
4
|
+
const mockAggregatorAddress = '0x1234567890123456789012345678901234567890';
|
|
5
|
+
let mockPublicClient;
|
|
6
|
+
let mockWalletClient;
|
|
7
|
+
let mockAccount;
|
|
8
|
+
const MOCK_PUBLIC_KEY = '0x1234567890abcdef1234567890abcdef1234567890abcdef1234567890abcdef';
|
|
9
|
+
beforeEach(() => {
|
|
10
|
+
mockAccount = {
|
|
11
|
+
address: '0x1111111111111111111111111111111111111111',
|
|
12
|
+
type: 'json-rpc'
|
|
13
|
+
};
|
|
14
|
+
mockPublicClient = {
|
|
15
|
+
readContract: vi.fn(),
|
|
16
|
+
};
|
|
17
|
+
mockWalletClient = {
|
|
18
|
+
writeContract: vi.fn(),
|
|
19
|
+
account: mockAccount,
|
|
20
|
+
};
|
|
21
|
+
});
|
|
22
|
+
describe('BLS Operations', () => {
|
|
23
|
+
it('should register BLS public key', async () => {
|
|
24
|
+
const txHash = '0xabc...';
|
|
25
|
+
mockWalletClient.writeContract.mockResolvedValue(txHash);
|
|
26
|
+
const actions = aggregatorActions()(mockWalletClient);
|
|
27
|
+
const result = await actions.registerBLSPublicKey({
|
|
28
|
+
address: mockAggregatorAddress,
|
|
29
|
+
publicKey: MOCK_PUBLIC_KEY,
|
|
30
|
+
account: mockAccount
|
|
31
|
+
});
|
|
32
|
+
expect(result).toBe(txHash);
|
|
33
|
+
expect(mockWalletClient.writeContract).toHaveBeenCalledWith(expect.objectContaining({
|
|
34
|
+
address: mockAggregatorAddress,
|
|
35
|
+
functionName: 'registerBLSPublicKey',
|
|
36
|
+
args: [MOCK_PUBLIC_KEY],
|
|
37
|
+
}));
|
|
38
|
+
});
|
|
39
|
+
it('should set BLS threshold', async () => {
|
|
40
|
+
const txHash = '0xdef...';
|
|
41
|
+
mockWalletClient.writeContract.mockResolvedValue(txHash);
|
|
42
|
+
const actions = aggregatorActions()(mockWalletClient);
|
|
43
|
+
const result = await actions.setBLSThreshold({
|
|
44
|
+
address: mockAggregatorAddress,
|
|
45
|
+
threshold: 5,
|
|
46
|
+
account: mockAccount
|
|
47
|
+
});
|
|
48
|
+
expect(result).toBe(txHash);
|
|
49
|
+
expect(mockWalletClient.writeContract).toHaveBeenCalledWith(expect.objectContaining({
|
|
50
|
+
functionName: 'setThreshold',
|
|
51
|
+
args: [5n],
|
|
52
|
+
}));
|
|
53
|
+
});
|
|
54
|
+
it('should get BLS threshold', async () => {
|
|
55
|
+
mockPublicClient.readContract.mockResolvedValue(3n);
|
|
56
|
+
const actions = aggregatorActions()(mockPublicClient);
|
|
57
|
+
const result = await actions.getBLSThreshold({
|
|
58
|
+
address: mockAggregatorAddress
|
|
59
|
+
});
|
|
60
|
+
expect(result).toBe(3n);
|
|
61
|
+
expect(mockPublicClient.readContract).toHaveBeenCalledWith(expect.objectContaining({
|
|
62
|
+
address: mockAggregatorAddress,
|
|
63
|
+
functionName: 'threshold',
|
|
64
|
+
}));
|
|
65
|
+
});
|
|
66
|
+
});
|
|
67
|
+
});
|
|
@@ -0,0 +1,30 @@
|
|
|
1
|
+
import { type Address, type PublicClient, type WalletClient, type Hex, type Hash, type Account } from 'viem';
|
|
2
|
+
export type DVTActions = {
|
|
3
|
+
createSlashProposal: (args: {
|
|
4
|
+
address: Address;
|
|
5
|
+
operator: Address;
|
|
6
|
+
level: number;
|
|
7
|
+
reason: string;
|
|
8
|
+
account?: Account | Address;
|
|
9
|
+
}) => Promise<Hash>;
|
|
10
|
+
signSlashProposal: (args: {
|
|
11
|
+
address: Address;
|
|
12
|
+
proposalId: bigint;
|
|
13
|
+
signature: Hex;
|
|
14
|
+
account?: Account | Address;
|
|
15
|
+
}) => Promise<Hash>;
|
|
16
|
+
executeSlashWithProof: (args: {
|
|
17
|
+
address: Address;
|
|
18
|
+
proposalId: bigint;
|
|
19
|
+
repUsers: Address[];
|
|
20
|
+
newScores: bigint[];
|
|
21
|
+
epoch: bigint;
|
|
22
|
+
proof: Hex;
|
|
23
|
+
account?: Account | Address;
|
|
24
|
+
}) => Promise<Hash>;
|
|
25
|
+
isValidator: (args: {
|
|
26
|
+
address: Address;
|
|
27
|
+
user: Address;
|
|
28
|
+
}) => Promise<boolean>;
|
|
29
|
+
};
|
|
30
|
+
export declare const dvtActions: () => (client: PublicClient | WalletClient) => DVTActions;
|
|
@@ -0,0 +1,41 @@
|
|
|
1
|
+
import { DVTValidatorABI } from '../abis/index.js';
|
|
2
|
+
export const dvtActions = () => (client) => ({
|
|
3
|
+
async createSlashProposal({ address, operator, level, reason, account }) {
|
|
4
|
+
return client.writeContract({
|
|
5
|
+
address,
|
|
6
|
+
abi: DVTValidatorABI,
|
|
7
|
+
functionName: 'createProposal',
|
|
8
|
+
args: [operator, level, reason],
|
|
9
|
+
account: account,
|
|
10
|
+
chain: client.chain
|
|
11
|
+
});
|
|
12
|
+
},
|
|
13
|
+
async signSlashProposal({ address, proposalId, signature, account }) {
|
|
14
|
+
return client.writeContract({
|
|
15
|
+
address,
|
|
16
|
+
abi: DVTValidatorABI,
|
|
17
|
+
functionName: 'signProposal',
|
|
18
|
+
args: [proposalId, signature],
|
|
19
|
+
account: account,
|
|
20
|
+
chain: client.chain
|
|
21
|
+
});
|
|
22
|
+
},
|
|
23
|
+
async executeSlashWithProof({ address, proposalId, repUsers, newScores, epoch, proof, account }) {
|
|
24
|
+
return client.writeContract({
|
|
25
|
+
address,
|
|
26
|
+
abi: DVTValidatorABI,
|
|
27
|
+
functionName: 'executeWithProof',
|
|
28
|
+
args: [proposalId, repUsers, newScores, epoch, proof],
|
|
29
|
+
account: account,
|
|
30
|
+
chain: client.chain
|
|
31
|
+
});
|
|
32
|
+
},
|
|
33
|
+
async isValidator({ address, user }) {
|
|
34
|
+
return client.readContract({
|
|
35
|
+
address,
|
|
36
|
+
abi: DVTValidatorABI,
|
|
37
|
+
functionName: 'isValidator',
|
|
38
|
+
args: [user]
|
|
39
|
+
});
|
|
40
|
+
}
|
|
41
|
+
});
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
export {};
|
|
@@ -0,0 +1,98 @@
|
|
|
1
|
+
import { describe, it, expect, vi, beforeEach } from 'vitest';
|
|
2
|
+
import { dvtActions } from './dvt.js';
|
|
3
|
+
describe('DVT Actions', () => {
|
|
4
|
+
const mockDVTAddress = '0x1234567890123456789012345678901234567890';
|
|
5
|
+
let mockPublicClient;
|
|
6
|
+
let mockWalletClient;
|
|
7
|
+
let mockAccount;
|
|
8
|
+
const MOCK_USER = '0x2222222222222222222222222222222222222222';
|
|
9
|
+
const MOCK_OPERATOR = '0x3333333333333333333333333333333333333333';
|
|
10
|
+
beforeEach(() => {
|
|
11
|
+
mockAccount = {
|
|
12
|
+
address: '0x1111111111111111111111111111111111111111',
|
|
13
|
+
type: 'json-rpc'
|
|
14
|
+
};
|
|
15
|
+
mockPublicClient = {
|
|
16
|
+
readContract: vi.fn(),
|
|
17
|
+
};
|
|
18
|
+
mockWalletClient = {
|
|
19
|
+
writeContract: vi.fn(),
|
|
20
|
+
account: mockAccount,
|
|
21
|
+
};
|
|
22
|
+
});
|
|
23
|
+
describe('Proposal Creation', () => {
|
|
24
|
+
it('should create slash proposal', async () => {
|
|
25
|
+
const txHash = '0xabc...';
|
|
26
|
+
mockWalletClient.writeContract.mockResolvedValue(txHash);
|
|
27
|
+
const actions = dvtActions()(mockWalletClient);
|
|
28
|
+
const result = await actions.createSlashProposal({
|
|
29
|
+
address: mockDVTAddress,
|
|
30
|
+
operator: MOCK_OPERATOR,
|
|
31
|
+
level: 1,
|
|
32
|
+
reason: 'Test slash',
|
|
33
|
+
account: mockAccount
|
|
34
|
+
});
|
|
35
|
+
expect(result).toBe(txHash);
|
|
36
|
+
expect(mockWalletClient.writeContract).toHaveBeenCalledWith(expect.objectContaining({
|
|
37
|
+
address: mockDVTAddress,
|
|
38
|
+
functionName: 'createProposal',
|
|
39
|
+
args: [MOCK_OPERATOR, 1, 'Test slash'],
|
|
40
|
+
}));
|
|
41
|
+
});
|
|
42
|
+
});
|
|
43
|
+
describe('Proposal Signing', () => {
|
|
44
|
+
it('should sign slash proposal', async () => {
|
|
45
|
+
const txHash = '0xdef...';
|
|
46
|
+
mockWalletClient.writeContract.mockResolvedValue(txHash);
|
|
47
|
+
const actions = dvtActions()(mockWalletClient);
|
|
48
|
+
const result = await actions.signSlashProposal({
|
|
49
|
+
address: mockDVTAddress,
|
|
50
|
+
proposalId: 1n,
|
|
51
|
+
signature: '0xsignature',
|
|
52
|
+
account: mockAccount
|
|
53
|
+
});
|
|
54
|
+
expect(result).toBe(txHash);
|
|
55
|
+
expect(mockWalletClient.writeContract).toHaveBeenCalledWith(expect.objectContaining({
|
|
56
|
+
functionName: 'signProposal',
|
|
57
|
+
args: [1n, '0xsignature'],
|
|
58
|
+
}));
|
|
59
|
+
});
|
|
60
|
+
});
|
|
61
|
+
describe('Proposal Execution', () => {
|
|
62
|
+
it('should execute slash with proof', async () => {
|
|
63
|
+
const txHash = '0xghi...';
|
|
64
|
+
mockWalletClient.writeContract.mockResolvedValue(txHash);
|
|
65
|
+
const actions = dvtActions()(mockWalletClient);
|
|
66
|
+
const result = await actions.executeSlashWithProof({
|
|
67
|
+
address: mockDVTAddress,
|
|
68
|
+
proposalId: 1n,
|
|
69
|
+
repUsers: [MOCK_USER],
|
|
70
|
+
newScores: [100n],
|
|
71
|
+
epoch: 1n,
|
|
72
|
+
proof: '0xproof',
|
|
73
|
+
account: mockAccount
|
|
74
|
+
});
|
|
75
|
+
expect(result).toBe(txHash);
|
|
76
|
+
expect(mockWalletClient.writeContract).toHaveBeenCalledWith(expect.objectContaining({
|
|
77
|
+
functionName: 'executeWithProof',
|
|
78
|
+
args: [1n, [MOCK_USER], [100n], 1n, '0xproof'],
|
|
79
|
+
}));
|
|
80
|
+
});
|
|
81
|
+
});
|
|
82
|
+
describe('Validator Status', () => {
|
|
83
|
+
it('should check if user is validator', async () => {
|
|
84
|
+
mockPublicClient.readContract.mockResolvedValue(true);
|
|
85
|
+
const actions = dvtActions()(mockPublicClient);
|
|
86
|
+
const result = await actions.isValidator({
|
|
87
|
+
address: mockDVTAddress,
|
|
88
|
+
user: MOCK_USER
|
|
89
|
+
});
|
|
90
|
+
expect(result).toBe(true);
|
|
91
|
+
expect(mockPublicClient.readContract).toHaveBeenCalledWith(expect.objectContaining({
|
|
92
|
+
address: mockDVTAddress,
|
|
93
|
+
functionName: 'isValidator',
|
|
94
|
+
args: [MOCK_USER],
|
|
95
|
+
}));
|
|
96
|
+
});
|
|
97
|
+
});
|
|
98
|
+
});
|
|
@@ -0,0 +1,90 @@
|
|
|
1
|
+
import { type Address, type PublicClient, type WalletClient, type Hex, type Hash, type Account } from 'viem';
|
|
2
|
+
export declare enum EntryPointVersion {
|
|
3
|
+
V06 = "0.6",
|
|
4
|
+
V07 = "0.7"
|
|
5
|
+
}
|
|
6
|
+
export type EntryPointActions = {
|
|
7
|
+
balanceOf: (args: {
|
|
8
|
+
account: Address;
|
|
9
|
+
}) => Promise<bigint>;
|
|
10
|
+
depositTo: (args: {
|
|
11
|
+
account: Address;
|
|
12
|
+
amount: bigint;
|
|
13
|
+
txAccount?: Account | Address;
|
|
14
|
+
}) => Promise<Hash>;
|
|
15
|
+
getNonce: (args: {
|
|
16
|
+
sender: Address;
|
|
17
|
+
key: bigint;
|
|
18
|
+
}) => Promise<bigint>;
|
|
19
|
+
getDepositInfo: (args: {
|
|
20
|
+
account: Address;
|
|
21
|
+
}) => Promise<{
|
|
22
|
+
deposit: bigint;
|
|
23
|
+
staked: boolean;
|
|
24
|
+
stake: bigint;
|
|
25
|
+
unstakeDelaySec: number;
|
|
26
|
+
withdrawTime: number;
|
|
27
|
+
}>;
|
|
28
|
+
addStake: (args: {
|
|
29
|
+
unstakeDelaySec: number;
|
|
30
|
+
amount: bigint;
|
|
31
|
+
account?: Account | Address;
|
|
32
|
+
}) => Promise<Hash>;
|
|
33
|
+
unlockStake: (args: {
|
|
34
|
+
account?: Account | Address;
|
|
35
|
+
}) => Promise<Hash>;
|
|
36
|
+
withdrawStake: (args: {
|
|
37
|
+
withdrawAddress: Address;
|
|
38
|
+
account?: Account | Address;
|
|
39
|
+
}) => Promise<Hash>;
|
|
40
|
+
withdrawTo: (args: {
|
|
41
|
+
withdrawAddress: Address;
|
|
42
|
+
amount: bigint;
|
|
43
|
+
account?: Account | Address;
|
|
44
|
+
}) => Promise<Hash>;
|
|
45
|
+
handleOps: (args: {
|
|
46
|
+
ops: any[];
|
|
47
|
+
beneficiary: Address;
|
|
48
|
+
account?: Account | Address;
|
|
49
|
+
}) => Promise<Hash>;
|
|
50
|
+
handleAggregatedOps: (args: {
|
|
51
|
+
opsPerAggregator: any[];
|
|
52
|
+
beneficiary: Address;
|
|
53
|
+
account?: Account | Address;
|
|
54
|
+
}) => Promise<Hash>;
|
|
55
|
+
innerHandleOp: (args: {
|
|
56
|
+
callData: Hex;
|
|
57
|
+
opInfo: any;
|
|
58
|
+
context: Hex;
|
|
59
|
+
account?: Account | Address;
|
|
60
|
+
}) => Promise<Hash>;
|
|
61
|
+
delegateAndRevert: (args: {
|
|
62
|
+
target: Address;
|
|
63
|
+
data: Hex;
|
|
64
|
+
account?: Account | Address;
|
|
65
|
+
}) => Promise<void>;
|
|
66
|
+
getUserOpHash: (args: {
|
|
67
|
+
op: any;
|
|
68
|
+
}) => Promise<Hash>;
|
|
69
|
+
getSenderAddress: (args: {
|
|
70
|
+
initCode: Hex;
|
|
71
|
+
}) => Promise<Address>;
|
|
72
|
+
senderCreator: () => Promise<Address>;
|
|
73
|
+
incrementNonce: (args: {
|
|
74
|
+
key: bigint;
|
|
75
|
+
account?: Account | Address;
|
|
76
|
+
}) => Promise<Hash>;
|
|
77
|
+
nonceSequenceNumber: (args: {
|
|
78
|
+
sender: Address;
|
|
79
|
+
key: bigint;
|
|
80
|
+
}) => Promise<bigint>;
|
|
81
|
+
supportsInterface: (args: {
|
|
82
|
+
interfaceId: Hex;
|
|
83
|
+
}) => Promise<boolean>;
|
|
84
|
+
eip712Domain: () => Promise<any>;
|
|
85
|
+
getCurrentUserOpHash: () => Promise<Hash>;
|
|
86
|
+
getDomainSeparatorV4: () => Promise<Hex>;
|
|
87
|
+
getPackedUserOpTypeHash: () => Promise<Hex>;
|
|
88
|
+
version: EntryPointVersion;
|
|
89
|
+
};
|
|
90
|
+
export declare const entryPointActions: (address: Address, version?: EntryPointVersion) => (client: PublicClient | WalletClient) => EntryPointActions;
|