@aastar/sdk 0.16.23 → 0.17.1
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/dist/index.d.ts +1 -0
- package/dist/index.js +2 -0
- package/package.json +11 -10
- package/dist/clients/ExperimentClient.test.d.ts +0 -1
- package/dist/clients/ExperimentClient.test.js +0 -53
- package/dist/clients/admin.test.d.ts +0 -1
- package/dist/clients/admin.test.js +0 -79
- package/dist/clients/clients.test.d.ts +0 -1
- package/dist/clients/clients.test.js +0 -91
- package/dist/clients/community.test.d.ts +0 -1
- package/dist/clients/community.test.js +0 -99
- package/dist/clients/endUser.test.d.ts +0 -1
- package/dist/clients/endUser.test.js +0 -188
- package/dist/clients/operator.test.d.ts +0 -1
- package/dist/clients/operator.test.js +0 -139
- package/dist/core/src/abis/BLSAggregator.json +0 -686
- package/dist/core/src/abis/BLSValidator.json +0 -42
- package/dist/core/src/abis/DVTValidator.json +0 -368
- package/dist/core/src/abis/EntryPoint.json +0 -1382
- package/dist/core/src/abis/GToken.json +0 -513
- package/dist/core/src/abis/GTokenStaking.json +0 -949
- package/dist/core/src/abis/MySBT.json +0 -1518
- package/dist/core/src/abis/Paymaster.json +0 -1143
- package/dist/core/src/abis/PaymasterFactory.json +0 -640
- package/dist/core/src/abis/Registry.json +0 -1942
- package/dist/core/src/abis/ReputationSystem.json +0 -699
- package/dist/core/src/abis/SimpleAccount.json +0 -560
- package/dist/core/src/abis/SimpleAccountFactory.json +0 -111
- package/dist/core/src/abis/SuperPaymaster.json +0 -1781
- package/dist/core/src/abis/xPNTsFactory.json +0 -718
- package/dist/core/src/abis/xPNTsToken.json +0 -1280
- package/dist/errors/AAStarError.d.ts +0 -26
- package/dist/errors/AAStarError.js +0 -32
- package/dist/errors/AAStarError.test.d.ts +0 -1
- package/dist/errors/AAStarError.test.js +0 -74
- package/dist/errors/decoder.test.d.ts +0 -1
- package/dist/errors/decoder.test.js +0 -90
- package/dist/node/index.d.ts +0 -7
- package/dist/node/index.js +0 -7
- package/dist/types/result.d.ts +0 -15
- package/dist/types/result.js +0 -23
- package/dist/utils/errorHandler.test.d.ts +0 -1
- package/dist/utils/errorHandler.test.js +0 -89
- package/dist/utils/eventDecoder.d.ts +0 -7
- package/dist/utils/eventDecoder.js +0 -54
- package/dist/utils/eventDecoder.test.d.ts +0 -1
- package/dist/utils/eventDecoder.test.js +0 -48
- package/dist/utils/funding.test.d.ts +0 -1
- package/dist/utils/funding.test.js +0 -105
- package/dist/utils/keys.test.d.ts +0 -1
- package/dist/utils/keys.test.js +0 -81
- package/dist/utils/roleData.test.d.ts +0 -1
- package/dist/utils/roleData.test.js +0 -74
- package/dist/utils/testScenarios.test.d.ts +0 -1
- package/dist/utils/testScenarios.test.js +0 -68
- package/dist/utils/userOp.test.d.ts +0 -1
- package/dist/utils/userOp.test.js +0 -152
package/dist/index.d.ts
CHANGED
|
@@ -12,6 +12,7 @@ export * from './clients/ExperimentClient.js';
|
|
|
12
12
|
export * from '@aastar/enduser';
|
|
13
13
|
export * from '@aastar/operator';
|
|
14
14
|
export * from '@aastar/admin';
|
|
15
|
+
export * as AirAccount from '@aastar/airaccount';
|
|
15
16
|
export * from './utils/roleData.js';
|
|
16
17
|
export * from './utils/keys.js';
|
|
17
18
|
export * from './utils/funding.js';
|
package/dist/index.js
CHANGED
|
@@ -15,6 +15,8 @@ export * from './clients/ExperimentClient.js';
|
|
|
15
15
|
export * from '@aastar/enduser';
|
|
16
16
|
export * from '@aastar/operator';
|
|
17
17
|
export * from '@aastar/admin';
|
|
18
|
+
// Export AirAccount SDK (ERC-4337 + KMS + BLS)
|
|
19
|
+
export * as AirAccount from '@aastar/airaccount';
|
|
18
20
|
// Export Utils & Errors
|
|
19
21
|
export * from './utils/roleData.js';
|
|
20
22
|
export * from './utils/keys.js';
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@aastar/sdk",
|
|
3
|
-
"version": "0.
|
|
3
|
+
"version": "0.17.1",
|
|
4
4
|
"description": "AAStar SDK - The all-in-one package for Mycelium Network",
|
|
5
5
|
"type": "module",
|
|
6
6
|
"publishConfig": {
|
|
@@ -14,15 +14,16 @@
|
|
|
14
14
|
],
|
|
15
15
|
"dependencies": {
|
|
16
16
|
"viem": "2.43.3",
|
|
17
|
-
"@aastar/
|
|
18
|
-
"@aastar/
|
|
19
|
-
"@aastar/
|
|
20
|
-
"@aastar/
|
|
21
|
-
"@aastar/identity": "0.
|
|
22
|
-
"@aastar/
|
|
23
|
-
"@aastar/tokens": "0.
|
|
24
|
-
"@aastar/
|
|
25
|
-
"@aastar/
|
|
17
|
+
"@aastar/account": "0.17.1",
|
|
18
|
+
"@aastar/enduser": "0.17.1",
|
|
19
|
+
"@aastar/core": "0.17.1",
|
|
20
|
+
"@aastar/dapp": "0.17.1",
|
|
21
|
+
"@aastar/identity": "0.17.1",
|
|
22
|
+
"@aastar/airaccount": "0.17.1",
|
|
23
|
+
"@aastar/tokens": "0.17.1",
|
|
24
|
+
"@aastar/admin": "0.17.1",
|
|
25
|
+
"@aastar/paymaster": "0.17.1",
|
|
26
|
+
"@aastar/operator": "0.17.1"
|
|
26
27
|
},
|
|
27
28
|
"devDependencies": {
|
|
28
29
|
"typescript": "5.7.2"
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
export {};
|
|
@@ -1,53 +0,0 @@
|
|
|
1
|
-
import { describe, it, expect, vi } from 'vitest';
|
|
2
|
-
import { ExperimentClient } from './ExperimentClient.js';
|
|
3
|
-
describe('ExperimentClient', () => {
|
|
4
|
-
it('should record transaction result', () => {
|
|
5
|
-
const client = new ExperimentClient('test-scenario', 'AA');
|
|
6
|
-
const receipt = { gasUsed: 21000n, effectiveGasPrice: 1000000000n };
|
|
7
|
-
const record = client.recordTx('0xhash', receipt, 'Success');
|
|
8
|
-
expect(record.txHash).toBe('0xhash');
|
|
9
|
-
expect(record.group).toBe('AA');
|
|
10
|
-
expect(record.status).toBe('Success');
|
|
11
|
-
expect(record.costETH).toBe('0.000021');
|
|
12
|
-
expect(client.getRecords()).toHaveLength(1);
|
|
13
|
-
});
|
|
14
|
-
it('should measure transaction automatically', async () => {
|
|
15
|
-
const client = new ExperimentClient('test-scenario', 'SuperPaymaster');
|
|
16
|
-
const mockPublicClient = {
|
|
17
|
-
waitForTransactionReceipt: vi.fn().mockResolvedValue({
|
|
18
|
-
gasUsed: 50000n,
|
|
19
|
-
effectiveGasPrice: 2000000000n
|
|
20
|
-
})
|
|
21
|
-
};
|
|
22
|
-
const txPromise = Promise.resolve('0xhash');
|
|
23
|
-
const hash = await client.measureTx('test-task', txPromise, mockPublicClient);
|
|
24
|
-
expect(hash).toBe('0xhash');
|
|
25
|
-
expect(client.getRecords()).toHaveLength(1);
|
|
26
|
-
expect(client.getRecords()[0].status).toBe('Success');
|
|
27
|
-
});
|
|
28
|
-
it('should handle failed measureTx', async () => {
|
|
29
|
-
const client = new ExperimentClient('test-scenario', 'EOA');
|
|
30
|
-
const txPromise = Promise.reject(new Error('tx failed'));
|
|
31
|
-
await expect(client.measureTx('test-task', txPromise, {})).rejects.toThrow('tx failed');
|
|
32
|
-
});
|
|
33
|
-
it('should handle missing gas fields in receipt', () => {
|
|
34
|
-
const client = new ExperimentClient('test-scenario', 'AA');
|
|
35
|
-
const record = client.recordTx('0xhash', {}, 'Success');
|
|
36
|
-
expect(record.gasUsed).toBe(0n);
|
|
37
|
-
expect(record.gasPrice).toBe(0n);
|
|
38
|
-
expect(record.costETH).toBe('0');
|
|
39
|
-
});
|
|
40
|
-
it('should record latency in measureTx', async () => {
|
|
41
|
-
const client = new ExperimentClient('test-scenario', 'AA');
|
|
42
|
-
const mockPublicClient = {
|
|
43
|
-
waitForTransactionReceipt: vi.fn().mockResolvedValue({
|
|
44
|
-
gasUsed: 21000n,
|
|
45
|
-
effectiveGasPrice: 1000000000n
|
|
46
|
-
})
|
|
47
|
-
};
|
|
48
|
-
await client.measureTx('test', Promise.resolve('0xhash'), mockPublicClient);
|
|
49
|
-
const record = client.getRecords()[0];
|
|
50
|
-
expect(record.meta?.latency).toBeDefined();
|
|
51
|
-
expect(typeof record.meta.latency).toBe('number');
|
|
52
|
-
});
|
|
53
|
-
});
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
export {};
|
|
@@ -1,79 +0,0 @@
|
|
|
1
|
-
import { describe, it, expect, vi } from 'vitest';
|
|
2
|
-
import { createAdminClient } from './admin.js';
|
|
3
|
-
import { mainnet } from 'viem/chains';
|
|
4
|
-
import { http } from 'viem';
|
|
5
|
-
describe('AdminClient', () => {
|
|
6
|
-
const MOCK_ADDR = '0xf39Fd6e51aad88F6F4ce6aB8827279cffFb92266';
|
|
7
|
-
it('should create admin client and access modules', () => {
|
|
8
|
-
const client = createAdminClient({ chain: mainnet, transport: http() });
|
|
9
|
-
expect(client.system).toBeDefined();
|
|
10
|
-
expect(client.finance).toBeDefined();
|
|
11
|
-
expect(client.operators).toBeDefined();
|
|
12
|
-
});
|
|
13
|
-
describe('SystemModule', () => {
|
|
14
|
-
it('should grant role', async () => {
|
|
15
|
-
const client = createAdminClient({ chain: mainnet, transport: http() });
|
|
16
|
-
const spy = vi.fn().mockResolvedValue('0xhash');
|
|
17
|
-
client.registryRegisterRole = spy;
|
|
18
|
-
const hash = await client.system.grantRole({ roleId: '0x1', user: MOCK_ADDR, data: '0x' });
|
|
19
|
-
expect(hash).toBe('0xhash');
|
|
20
|
-
expect(spy).toHaveBeenCalled();
|
|
21
|
-
});
|
|
22
|
-
it('should revoke role', async () => {
|
|
23
|
-
const client = createAdminClient({ chain: mainnet, transport: http() });
|
|
24
|
-
const spy = vi.fn().mockResolvedValue('0xhash');
|
|
25
|
-
client.registryUnRegisterRole = spy;
|
|
26
|
-
const hash = await client.system.revokeRole({ roleId: '0x1', user: MOCK_ADDR });
|
|
27
|
-
expect(hash).toBe('0xhash');
|
|
28
|
-
expect(spy).toHaveBeenCalled();
|
|
29
|
-
});
|
|
30
|
-
it('should set super paymaster', async () => {
|
|
31
|
-
const client = createAdminClient({ chain: mainnet, transport: http() });
|
|
32
|
-
const spy = vi.fn().mockResolvedValue('0xhash');
|
|
33
|
-
client.registrySetSuperPaymaster = spy;
|
|
34
|
-
const hash = await client.system.setSuperPaymaster(MOCK_ADDR);
|
|
35
|
-
expect(hash).toBe('0xhash');
|
|
36
|
-
});
|
|
37
|
-
});
|
|
38
|
-
describe('FinanceModule', () => {
|
|
39
|
-
it('should deposit', async () => {
|
|
40
|
-
const client = createAdminClient({ chain: mainnet, transport: http() });
|
|
41
|
-
const spy = vi.fn().mockResolvedValue('0xhash');
|
|
42
|
-
client.superPaymasterDeposit = spy;
|
|
43
|
-
const hash = await client.finance.deposit({ amount: 100n });
|
|
44
|
-
expect(hash).toBe('0xhash');
|
|
45
|
-
});
|
|
46
|
-
it('should depositForOperator', async () => {
|
|
47
|
-
const client = createAdminClient({ chain: mainnet, transport: http() });
|
|
48
|
-
const spy = vi.fn().mockResolvedValue('0xhash');
|
|
49
|
-
client.superPaymasterDepositFor = spy;
|
|
50
|
-
const hash = await client.finance.depositForOperator({ operator: MOCK_ADDR, amount: 100n });
|
|
51
|
-
expect(hash).toBe('0xhash');
|
|
52
|
-
});
|
|
53
|
-
it('should withdrawTo', async () => {
|
|
54
|
-
const client = createAdminClient({ chain: mainnet, transport: http() });
|
|
55
|
-
const spy = vi.fn().mockResolvedValue('0xhash');
|
|
56
|
-
client.superPaymasterWithdrawTo = spy;
|
|
57
|
-
const hash = await client.finance.withdrawTo({ to: MOCK_ADDR, amount: 100n });
|
|
58
|
-
expect(hash).toBe('0xhash');
|
|
59
|
-
});
|
|
60
|
-
});
|
|
61
|
-
describe('OperatorsModule', () => {
|
|
62
|
-
it('should ban/unban operator', async () => {
|
|
63
|
-
const client = createAdminClient({ chain: mainnet, transport: http() });
|
|
64
|
-
const spy = vi.fn().mockResolvedValue('0xhash');
|
|
65
|
-
client.registryUpdateOperatorBlacklist = spy;
|
|
66
|
-
await client.operators.ban(MOCK_ADDR);
|
|
67
|
-
expect(spy).toHaveBeenCalledWith(expect.objectContaining({ statuses: [true] }));
|
|
68
|
-
await client.operators.unban(MOCK_ADDR);
|
|
69
|
-
expect(spy).toHaveBeenCalledWith(expect.objectContaining({ statuses: [false] }));
|
|
70
|
-
});
|
|
71
|
-
it('should setPaused', async () => {
|
|
72
|
-
const client = createAdminClient({ chain: mainnet, transport: http() });
|
|
73
|
-
const spy = vi.fn().mockResolvedValue('0xhash');
|
|
74
|
-
client.superPaymasterSetOperatorPaused = spy;
|
|
75
|
-
await client.operators.setPaused(MOCK_ADDR, true);
|
|
76
|
-
expect(spy).toHaveBeenCalledWith(expect.objectContaining({ paused: true }));
|
|
77
|
-
});
|
|
78
|
-
});
|
|
79
|
-
});
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
export {};
|
|
@@ -1,91 +0,0 @@
|
|
|
1
|
-
import { describe, it, expect, vi, beforeEach } from 'vitest';
|
|
2
|
-
import { createEndUserClient } from './endUser.js';
|
|
3
|
-
import { createCommunityClient } from './community.js';
|
|
4
|
-
import { createOperatorClient } from './operator.js';
|
|
5
|
-
import { createAdminClient } from './admin.js';
|
|
6
|
-
import { http } from 'viem';
|
|
7
|
-
import { mainnet } from 'viem/chains';
|
|
8
|
-
describe('SDK L2 Clients', () => {
|
|
9
|
-
let mockTransport;
|
|
10
|
-
let mockChain;
|
|
11
|
-
let mockAccount;
|
|
12
|
-
const MOCK_ADDR = '0x1111111111111111111111111111111111111111';
|
|
13
|
-
beforeEach(() => {
|
|
14
|
-
mockTransport = http('http://localhost:8545');
|
|
15
|
-
mockChain = mainnet;
|
|
16
|
-
mockAccount = {
|
|
17
|
-
address: MOCK_ADDR,
|
|
18
|
-
type: 'json-rpc',
|
|
19
|
-
signMessage: vi.fn().mockResolvedValue('0xsignature')
|
|
20
|
-
};
|
|
21
|
-
});
|
|
22
|
-
describe('EndUserClient', () => {
|
|
23
|
-
let client;
|
|
24
|
-
beforeEach(() => {
|
|
25
|
-
client = createEndUserClient({ chain: mockChain, transport: mockTransport, account: mockAccount });
|
|
26
|
-
client.readContract = vi.fn();
|
|
27
|
-
client.writeContract = vi.fn().mockResolvedValue('0xhash');
|
|
28
|
-
client.waitForTransactionReceipt = vi.fn().mockResolvedValue({ logs: [] });
|
|
29
|
-
client.getBytecode = vi.fn().mockResolvedValue('0x123');
|
|
30
|
-
});
|
|
31
|
-
it('should create EndUserClient', () => {
|
|
32
|
-
expect(client.onboard).toBeDefined();
|
|
33
|
-
});
|
|
34
|
-
it('should create smart account', async () => {
|
|
35
|
-
client.readContract.mockResolvedValue(MOCK_ADDR);
|
|
36
|
-
const result = await client.createSmartAccount({ owner: MOCK_ADDR });
|
|
37
|
-
expect(result.accountAddress).toBe(MOCK_ADDR);
|
|
38
|
-
expect(result.initCode).toBeDefined();
|
|
39
|
-
});
|
|
40
|
-
it('should execute gasless transaction', async () => {
|
|
41
|
-
client.readContract.mockResolvedValue(0n); // nonce
|
|
42
|
-
client.readContract.mockResolvedValueOnce(0n).mockResolvedValueOnce('0xhash'); // nonce, userOpHash
|
|
43
|
-
client.createSmartAccount = vi.fn().mockResolvedValue({ accountAddress: MOCK_ADDR, initCode: '0x' });
|
|
44
|
-
const result = await client.executeGasless({
|
|
45
|
-
target: MOCK_ADDR,
|
|
46
|
-
data: '0x',
|
|
47
|
-
operator: MOCK_ADDR
|
|
48
|
-
});
|
|
49
|
-
expect(result.hash).toBe('0xhash');
|
|
50
|
-
});
|
|
51
|
-
});
|
|
52
|
-
describe('CommunityClient', () => {
|
|
53
|
-
it('should launch community', async () => {
|
|
54
|
-
const client = createCommunityClient({ chain: mockChain, transport: mockTransport, account: mockAccount });
|
|
55
|
-
client.writeContract = vi.fn().mockResolvedValue('0xhash');
|
|
56
|
-
client.simulateContract = vi.fn().mockResolvedValue({ request: {} });
|
|
57
|
-
client.waitForTransactionReceipt = vi.fn().mockResolvedValue({ logs: [] });
|
|
58
|
-
client.readContract = vi.fn().mockResolvedValue(MOCK_ADDR);
|
|
59
|
-
const result = await client.launch({
|
|
60
|
-
name: 'Test',
|
|
61
|
-
tokenName: 'TT',
|
|
62
|
-
tokenSymbol: 'TT'
|
|
63
|
-
});
|
|
64
|
-
expect(result.tokenAddress).toBe(MOCK_ADDR);
|
|
65
|
-
expect(result.results.length).toBeGreaterThan(0);
|
|
66
|
-
});
|
|
67
|
-
});
|
|
68
|
-
describe('OperatorClient', () => {
|
|
69
|
-
it('should setup operator', async () => {
|
|
70
|
-
const client = createOperatorClient({ chain: mockChain, transport: mockTransport, account: mockAccount });
|
|
71
|
-
client.readContract = vi.fn().mockResolvedValue(['', 0n]); // roleConfig
|
|
72
|
-
client.writeContract = vi.fn().mockResolvedValue('0xhash');
|
|
73
|
-
client.waitForTransactionReceipt = vi.fn().mockResolvedValue({ logs: [] });
|
|
74
|
-
client.registryHasRole = vi.fn().mockResolvedValue(false);
|
|
75
|
-
const result = await client.setup({
|
|
76
|
-
stakeAmount: 100n,
|
|
77
|
-
depositAmount: 100n,
|
|
78
|
-
roleId: '0x1'
|
|
79
|
-
});
|
|
80
|
-
expect(result.txs.length).toBeGreaterThan(0);
|
|
81
|
-
});
|
|
82
|
-
});
|
|
83
|
-
describe('AdminClient', () => {
|
|
84
|
-
it('should have namespaces', () => {
|
|
85
|
-
const client = createAdminClient({ chain: mockChain, transport: mockTransport, account: mockAccount });
|
|
86
|
-
expect(client.system).toBeDefined();
|
|
87
|
-
expect(client.finance).toBeDefined();
|
|
88
|
-
expect(client.operators).toBeDefined();
|
|
89
|
-
});
|
|
90
|
-
});
|
|
91
|
-
});
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
export {};
|
|
@@ -1,99 +0,0 @@
|
|
|
1
|
-
import { describe, it, expect, vi } from 'vitest';
|
|
2
|
-
import { createCommunityClient } from './community.js';
|
|
3
|
-
import { mainnet } from 'viem/chains';
|
|
4
|
-
import { http } from 'viem';
|
|
5
|
-
vi.mock('@aastar/core', async () => {
|
|
6
|
-
const actual = await vi.importActual('@aastar/core');
|
|
7
|
-
return {
|
|
8
|
-
...actual,
|
|
9
|
-
registryActions: vi.fn(() => vi.fn(() => ({
|
|
10
|
-
registerRoleSelf: vi.fn().mockResolvedValue('0xhash'),
|
|
11
|
-
hasRole: vi.fn(),
|
|
12
|
-
roleMetadata: vi.fn()
|
|
13
|
-
}))),
|
|
14
|
-
sbtActions: vi.fn(() => vi.fn(() => ({
|
|
15
|
-
getUserSBT: vi.fn().mockResolvedValue(123n)
|
|
16
|
-
}))),
|
|
17
|
-
reputationActions: vi.fn(() => vi.fn(() => ({
|
|
18
|
-
setReputationRule: vi.fn().mockResolvedValue('0xhash')
|
|
19
|
-
}))),
|
|
20
|
-
};
|
|
21
|
-
});
|
|
22
|
-
describe('CommunityClient', () => {
|
|
23
|
-
const MOCK_ADDR = '0xf39Fd6e51aad88F6F4ce6aB8827279cffFb92266';
|
|
24
|
-
it('should create community client', () => {
|
|
25
|
-
const client = createCommunityClient({ chain: mainnet, transport: http() });
|
|
26
|
-
expect(client.launch).toBeDefined();
|
|
27
|
-
});
|
|
28
|
-
describe('launch', () => {
|
|
29
|
-
it('should launch community with token and governance', async () => {
|
|
30
|
-
const client = createCommunityClient({
|
|
31
|
-
chain: mainnet,
|
|
32
|
-
transport: http(),
|
|
33
|
-
account: { address: MOCK_ADDR }
|
|
34
|
-
});
|
|
35
|
-
// Mock base client methods
|
|
36
|
-
client.readContract = vi.fn().mockResolvedValue('0x0000000000000000000000000000000000000000');
|
|
37
|
-
client.simulateContract = vi.fn().mockResolvedValue({ request: {} });
|
|
38
|
-
client.writeContract = vi.fn().mockResolvedValue('0xhash');
|
|
39
|
-
client.waitForTransactionReceipt = vi.fn().mockResolvedValue({ logs: [] });
|
|
40
|
-
const result = await client.launch({
|
|
41
|
-
name: 'Test',
|
|
42
|
-
tokenName: 'T',
|
|
43
|
-
tokenSymbol: 'T',
|
|
44
|
-
governance: { initialReputationRule: true }
|
|
45
|
-
});
|
|
46
|
-
expect(result.results.length).toBeGreaterThanOrEqual(2);
|
|
47
|
-
expect(client.writeContract).toHaveBeenCalled();
|
|
48
|
-
});
|
|
49
|
-
});
|
|
50
|
-
describe('getCommunityInfo', () => {
|
|
51
|
-
it('should return info for registered community', async () => {
|
|
52
|
-
const client = createCommunityClient({ chain: mainnet, transport: http() });
|
|
53
|
-
client.readContract = vi.fn()
|
|
54
|
-
.mockResolvedValueOnce(true) // hasRole
|
|
55
|
-
.mockResolvedValueOnce('0xtoken') // getTokenAddress
|
|
56
|
-
.mockResolvedValueOnce('0x'); // roleMetadata
|
|
57
|
-
const info = await client.getCommunityInfo(MOCK_ADDR);
|
|
58
|
-
expect(info.hasRole).toBe(true);
|
|
59
|
-
expect(info.tokenAddress).toBe('0xtoken');
|
|
60
|
-
});
|
|
61
|
-
});
|
|
62
|
-
describe('Launch', () => {
|
|
63
|
-
it('should validate launch inputs', async () => {
|
|
64
|
-
const communityClient = createCommunityClient({ chain: mainnet, transport: http(), account: { address: MOCK_ADDR } });
|
|
65
|
-
await expect(communityClient.launch({
|
|
66
|
-
name: '',
|
|
67
|
-
tokenName: 'T',
|
|
68
|
-
tokenSymbol: 'T'
|
|
69
|
-
})).rejects.toThrow('Community Name is required');
|
|
70
|
-
await expect(communityClient.launch({
|
|
71
|
-
name: 'Test',
|
|
72
|
-
tokenName: '',
|
|
73
|
-
tokenSymbol: 'T'
|
|
74
|
-
})).rejects.toThrow('Token Name is required');
|
|
75
|
-
await expect(communityClient.launch({
|
|
76
|
-
name: 'Test',
|
|
77
|
-
tokenName: 'Test',
|
|
78
|
-
tokenSymbol: ''
|
|
79
|
-
})).rejects.toThrow('Token Symbol is required');
|
|
80
|
-
});
|
|
81
|
-
it('should handle registration failure gracefully in launch', async () => {
|
|
82
|
-
const communityClient = createCommunityClient({ chain: mainnet, transport: http(), account: { address: MOCK_ADDR } });
|
|
83
|
-
// Mock writeContract failure (Already registered)
|
|
84
|
-
communityClient.writeContract = vi.fn().mockRejectedValueOnce(new Error('Already registered'));
|
|
85
|
-
// Mock deployToken to succeed
|
|
86
|
-
communityClient.readContract = vi.fn().mockResolvedValue('0x0000000000000000000000000000000000000000');
|
|
87
|
-
communityClient.deployToken = vi.fn().mockResolvedValue('0xtoken');
|
|
88
|
-
// Mock setGovernance
|
|
89
|
-
communityClient.setReputationRule = vi.fn().mockResolvedValue('0xrule');
|
|
90
|
-
communityClient.waitForTransactionReceipt = vi.fn().mockResolvedValue({ logs: [] });
|
|
91
|
-
await communityClient.launch({
|
|
92
|
-
name: 'Test',
|
|
93
|
-
tokenName: 'Test',
|
|
94
|
-
tokenSymbol: 'TST'
|
|
95
|
-
});
|
|
96
|
-
expect(true).toBe(true);
|
|
97
|
-
});
|
|
98
|
-
});
|
|
99
|
-
});
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
export {};
|
|
@@ -1,188 +0,0 @@
|
|
|
1
|
-
import { describe, it, expect, vi } from 'vitest';
|
|
2
|
-
import { createEndUserClient } from './endUser.js';
|
|
3
|
-
import { mainnet } from 'viem/chains';
|
|
4
|
-
import { http, parseEther } from 'viem';
|
|
5
|
-
vi.mock('@aastar/core', async () => {
|
|
6
|
-
const actual = await vi.importActual('@aastar/core');
|
|
7
|
-
return {
|
|
8
|
-
...actual,
|
|
9
|
-
registryActions: vi.fn(() => vi.fn(() => ({
|
|
10
|
-
registryRegisterRoleSelf: vi.fn().mockResolvedValue('0xhash')
|
|
11
|
-
}))),
|
|
12
|
-
sbtActions: vi.fn(() => vi.fn(() => ({
|
|
13
|
-
sbtGetUserSBT: vi.fn().mockResolvedValue(123n)
|
|
14
|
-
}))),
|
|
15
|
-
superPaymasterActions: vi.fn(() => vi.fn(() => ({
|
|
16
|
-
superPaymasterGetAvailableCredit: vi.fn().mockResolvedValue(100n)
|
|
17
|
-
}))),
|
|
18
|
-
paymasterV4Actions: vi.fn(() => vi.fn(() => ({
|
|
19
|
-
// pmv4
|
|
20
|
-
}))),
|
|
21
|
-
};
|
|
22
|
-
});
|
|
23
|
-
describe('EndUserClient', () => {
|
|
24
|
-
const MOCK_ADDR = '0xf39Fd6e51aad88F6F4ce6aB8827279cffFb92266';
|
|
25
|
-
const MOCK_COMMUNITY = '0x1111111111111111111111111111111111111111';
|
|
26
|
-
it('should create end user client', () => {
|
|
27
|
-
const client = createEndUserClient({ chain: mainnet, transport: http() });
|
|
28
|
-
expect(client.joinAndActivate).toBeDefined();
|
|
29
|
-
});
|
|
30
|
-
describe('joinAndActivate', () => {
|
|
31
|
-
it('should join community and fetch SBT', async () => {
|
|
32
|
-
const client = createEndUserClient({
|
|
33
|
-
chain: mainnet,
|
|
34
|
-
transport: http(),
|
|
35
|
-
account: { address: MOCK_ADDR }
|
|
36
|
-
});
|
|
37
|
-
client.readContract = vi.fn().mockResolvedValue('0x0000000000000000000000000000000000000000');
|
|
38
|
-
client.writeContract = vi.fn().mockResolvedValue('0xhash');
|
|
39
|
-
client.waitForTransactionReceipt = vi.fn().mockResolvedValue({ logs: [] });
|
|
40
|
-
const result = await client.joinAndActivate({ community: MOCK_COMMUNITY, roleId: '0x1' });
|
|
41
|
-
expect(result.sbtId).toBe(123n);
|
|
42
|
-
});
|
|
43
|
-
});
|
|
44
|
-
describe('executeGasless', () => {
|
|
45
|
-
it('should execute gasless transaction', async () => {
|
|
46
|
-
const client = createEndUserClient({
|
|
47
|
-
chain: mainnet,
|
|
48
|
-
transport: http(),
|
|
49
|
-
account: { address: MOCK_ADDR, signMessage: vi.fn().mockResolvedValue('0xsignature') }
|
|
50
|
-
});
|
|
51
|
-
client.createSmartAccount = vi.fn().mockResolvedValue({ accountAddress: '0xaa', isDeployed: true });
|
|
52
|
-
client.readContract = vi.fn().mockResolvedValue(0n); // nonce or userOpHash
|
|
53
|
-
client.getBytecode = vi.fn().mockResolvedValue('0x123');
|
|
54
|
-
client.writeContract = vi.fn().mockResolvedValue('0xhash');
|
|
55
|
-
client.waitForTransactionReceipt = vi.fn().mockResolvedValue({ logs: [] });
|
|
56
|
-
const result = await client.executeGasless({
|
|
57
|
-
target: MOCK_COMMUNITY,
|
|
58
|
-
data: '0x',
|
|
59
|
-
operator: MOCK_COMMUNITY
|
|
60
|
-
});
|
|
61
|
-
expect(result.hash).toBe('0xhash');
|
|
62
|
-
});
|
|
63
|
-
});
|
|
64
|
-
describe('executeGaslessBatch', () => {
|
|
65
|
-
it('should execute gasless batch', async () => {
|
|
66
|
-
const client = createEndUserClient({
|
|
67
|
-
chain: mainnet,
|
|
68
|
-
transport: http(),
|
|
69
|
-
account: { address: MOCK_ADDR, signMessage: vi.fn().mockResolvedValue('0xsignature') }
|
|
70
|
-
});
|
|
71
|
-
client.createSmartAccount = vi.fn().mockResolvedValue({ accountAddress: '0xaa', isDeployed: true });
|
|
72
|
-
client.readContract = vi.fn().mockResolvedValue(0n);
|
|
73
|
-
client.getBytecode = vi.fn().mockResolvedValue('0x123');
|
|
74
|
-
client.writeContract = vi.fn().mockResolvedValue('0xhash');
|
|
75
|
-
client.waitForTransactionReceipt = vi.fn().mockResolvedValue({ logs: [] });
|
|
76
|
-
const result = await client.executeGaslessBatch({
|
|
77
|
-
targets: [MOCK_COMMUNITY],
|
|
78
|
-
datas: ['0x'],
|
|
79
|
-
operator: MOCK_COMMUNITY
|
|
80
|
-
});
|
|
81
|
-
expect(result.hash).toBe('0xhash');
|
|
82
|
-
});
|
|
83
|
-
});
|
|
84
|
-
describe('Requirements and Credits', () => {
|
|
85
|
-
it('should call onboard (alias for joinAndActivate)', async () => {
|
|
86
|
-
const client = createEndUserClient({
|
|
87
|
-
chain: mainnet,
|
|
88
|
-
transport: http(),
|
|
89
|
-
account: { address: MOCK_ADDR }
|
|
90
|
-
});
|
|
91
|
-
client.joinAndActivate = vi.fn().mockResolvedValue({ hash: '0xhash', events: [], sbtId: 1n });
|
|
92
|
-
const result = await client.onboard({ community: MOCK_COMMUNITY, roleId: '0x1', roleData: '0x' });
|
|
93
|
-
expect(result.sbtId).toBe(1n);
|
|
94
|
-
});
|
|
95
|
-
it('should check join requirements', async () => {
|
|
96
|
-
const client = createEndUserClient({ chain: mainnet, transport: http() });
|
|
97
|
-
// Mock balance return for GToken balance check >= 0.44 GT
|
|
98
|
-
client.readContract = vi.fn().mockResolvedValue(1000000000000000000n);
|
|
99
|
-
const result = await client.checkJoinRequirements(MOCK_ADDR);
|
|
100
|
-
expect(result.hasEnoughGToken).toBe(true);
|
|
101
|
-
});
|
|
102
|
-
it('should get available credit', async () => {
|
|
103
|
-
const client = createEndUserClient({ chain: mainnet, transport: http() });
|
|
104
|
-
// getAvailableCredit is part of SuperPaymasterActions which is extended in client
|
|
105
|
-
const credit = await client.superPaymasterGetAvailableCredit({ operator: MOCK_COMMUNITY, user: MOCK_ADDR });
|
|
106
|
-
expect(credit).toBe(100n);
|
|
107
|
-
});
|
|
108
|
-
});
|
|
109
|
-
describe('Smart Account Management', () => {
|
|
110
|
-
it('should create smart account with prediction', async () => {
|
|
111
|
-
const client = createEndUserClient({ chain: mainnet, transport: http() });
|
|
112
|
-
client.readContract = vi.fn().mockResolvedValue('0xAccountAddress');
|
|
113
|
-
client.getBytecode = vi.fn().mockResolvedValue(undefined);
|
|
114
|
-
const result = await client.createSmartAccount({ owner: MOCK_ADDR, salt: 123n });
|
|
115
|
-
expect(result.accountAddress).toBe('0xAccountAddress');
|
|
116
|
-
expect(result.isDeployed).toBe(false);
|
|
117
|
-
expect(result.initCode).toBeDefined();
|
|
118
|
-
});
|
|
119
|
-
it('should detect already deployed smart account', async () => {
|
|
120
|
-
const client = createEndUserClient({ chain: mainnet, transport: http() });
|
|
121
|
-
client.readContract = vi.fn().mockResolvedValue('0xDeployedAccount');
|
|
122
|
-
client.getBytecode = vi.fn().mockResolvedValue('0x123456');
|
|
123
|
-
const result = await client.createSmartAccount({ owner: MOCK_ADDR });
|
|
124
|
-
expect(result.isDeployed).toBe(true);
|
|
125
|
-
});
|
|
126
|
-
it('should throw error if factory not configured', async () => {
|
|
127
|
-
const client = createEndUserClient({ chain: mainnet, transport: http(), addresses: { simpleAccountFactory: '0x0000000000000000000000000000000000000000' } });
|
|
128
|
-
await expect(client.createSmartAccount({ owner: MOCK_ADDR }))
|
|
129
|
-
.rejects.toThrow('SimpleAccountFactory not found');
|
|
130
|
-
});
|
|
131
|
-
it('should deploy new smart account', async () => {
|
|
132
|
-
const client = createEndUserClient({
|
|
133
|
-
chain: mainnet,
|
|
134
|
-
transport: http(),
|
|
135
|
-
account: { address: MOCK_ADDR }
|
|
136
|
-
});
|
|
137
|
-
client.createSmartAccount = vi.fn().mockResolvedValue({ accountAddress: '0xNewAccount', isDeployed: false });
|
|
138
|
-
client.writeContract = vi.fn().mockResolvedValue('0xdeployhash');
|
|
139
|
-
client.waitForTransactionReceipt = vi.fn().mockResolvedValue({ logs: [] });
|
|
140
|
-
client.getBalance = vi.fn().mockResolvedValue(0n);
|
|
141
|
-
client.sendTransaction = vi.fn().mockResolvedValue('0xfundhash');
|
|
142
|
-
const result = await client.deploySmartAccount({ owner: MOCK_ADDR, fundWithETH: parseEther('0.1') });
|
|
143
|
-
expect(result.accountAddress).toBe('0xNewAccount');
|
|
144
|
-
expect(result.deployTxHash).toBe('0xdeployhash');
|
|
145
|
-
});
|
|
146
|
-
it('should skip deploy if already deployed', async () => {
|
|
147
|
-
const client = createEndUserClient({
|
|
148
|
-
chain: mainnet,
|
|
149
|
-
transport: http(),
|
|
150
|
-
account: { address: MOCK_ADDR }
|
|
151
|
-
});
|
|
152
|
-
client.createSmartAccount = vi.fn().mockResolvedValue({ accountAddress: '0xExisting', isDeployed: true });
|
|
153
|
-
client.getBalance = vi.fn().mockResolvedValue(parseEther('1'));
|
|
154
|
-
const result = await client.deploySmartAccount({ owner: MOCK_ADDR });
|
|
155
|
-
expect(result.accountAddress).toBe('0xExisting');
|
|
156
|
-
expect(result.deployTxHash).toBe('0x0');
|
|
157
|
-
});
|
|
158
|
-
it('should handle logic when smart account not deployed during batch', async () => {
|
|
159
|
-
const mockAccount = { address: MOCK_ADDR, signMessage: vi.fn().mockResolvedValue('0xsig') };
|
|
160
|
-
const client = createEndUserClient({ chain: mainnet, transport: http(), account: mockAccount });
|
|
161
|
-
// Mock getBytecode to return undefined/0x
|
|
162
|
-
client.getBytecode = vi.fn().mockResolvedValue('0x'); // Not deployed
|
|
163
|
-
client.createSmartAccount = vi.fn().mockResolvedValue({ initCode: '0x123' });
|
|
164
|
-
client.readContract = vi.fn().mockResolvedValue('0xhash');
|
|
165
|
-
client.writeContract = vi.fn().mockResolvedValue('0xhash');
|
|
166
|
-
client.waitForTransactionReceipt = vi.fn().mockResolvedValue({ logs: [] });
|
|
167
|
-
const results = await client.executeGaslessBatch({
|
|
168
|
-
targets: [MOCK_ADDR],
|
|
169
|
-
datas: ['0x'],
|
|
170
|
-
operator: MOCK_ADDR
|
|
171
|
-
});
|
|
172
|
-
expect(client.createSmartAccount).toHaveBeenCalled();
|
|
173
|
-
expect(results.hash).toBe('0xhash');
|
|
174
|
-
});
|
|
175
|
-
it('should handle execution errors in gasless batch', async () => {
|
|
176
|
-
const mockAccount = { address: MOCK_ADDR, signMessage: vi.fn().mockResolvedValue('0xsig') };
|
|
177
|
-
const client = createEndUserClient({ chain: mainnet, transport: http(), account: mockAccount });
|
|
178
|
-
client.getBytecode = vi.fn().mockResolvedValue('0xcode'); // deployed
|
|
179
|
-
client.readContract = vi.fn().mockResolvedValue('0xhash');
|
|
180
|
-
client.writeContract = vi.fn().mockRejectedValue(new Error('Contract Reverted'));
|
|
181
|
-
await expect(client.executeGaslessBatch({
|
|
182
|
-
targets: [MOCK_ADDR],
|
|
183
|
-
datas: ['0x'],
|
|
184
|
-
operator: MOCK_ADDR
|
|
185
|
-
})).rejects.toThrow('Contract Reverted');
|
|
186
|
-
});
|
|
187
|
-
});
|
|
188
|
-
});
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
export {};
|