@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.
Files changed (57) hide show
  1. package/dist/index.d.ts +1 -0
  2. package/dist/index.js +2 -0
  3. package/package.json +11 -10
  4. package/dist/clients/ExperimentClient.test.d.ts +0 -1
  5. package/dist/clients/ExperimentClient.test.js +0 -53
  6. package/dist/clients/admin.test.d.ts +0 -1
  7. package/dist/clients/admin.test.js +0 -79
  8. package/dist/clients/clients.test.d.ts +0 -1
  9. package/dist/clients/clients.test.js +0 -91
  10. package/dist/clients/community.test.d.ts +0 -1
  11. package/dist/clients/community.test.js +0 -99
  12. package/dist/clients/endUser.test.d.ts +0 -1
  13. package/dist/clients/endUser.test.js +0 -188
  14. package/dist/clients/operator.test.d.ts +0 -1
  15. package/dist/clients/operator.test.js +0 -139
  16. package/dist/core/src/abis/BLSAggregator.json +0 -686
  17. package/dist/core/src/abis/BLSValidator.json +0 -42
  18. package/dist/core/src/abis/DVTValidator.json +0 -368
  19. package/dist/core/src/abis/EntryPoint.json +0 -1382
  20. package/dist/core/src/abis/GToken.json +0 -513
  21. package/dist/core/src/abis/GTokenStaking.json +0 -949
  22. package/dist/core/src/abis/MySBT.json +0 -1518
  23. package/dist/core/src/abis/Paymaster.json +0 -1143
  24. package/dist/core/src/abis/PaymasterFactory.json +0 -640
  25. package/dist/core/src/abis/Registry.json +0 -1942
  26. package/dist/core/src/abis/ReputationSystem.json +0 -699
  27. package/dist/core/src/abis/SimpleAccount.json +0 -560
  28. package/dist/core/src/abis/SimpleAccountFactory.json +0 -111
  29. package/dist/core/src/abis/SuperPaymaster.json +0 -1781
  30. package/dist/core/src/abis/xPNTsFactory.json +0 -718
  31. package/dist/core/src/abis/xPNTsToken.json +0 -1280
  32. package/dist/errors/AAStarError.d.ts +0 -26
  33. package/dist/errors/AAStarError.js +0 -32
  34. package/dist/errors/AAStarError.test.d.ts +0 -1
  35. package/dist/errors/AAStarError.test.js +0 -74
  36. package/dist/errors/decoder.test.d.ts +0 -1
  37. package/dist/errors/decoder.test.js +0 -90
  38. package/dist/node/index.d.ts +0 -7
  39. package/dist/node/index.js +0 -7
  40. package/dist/types/result.d.ts +0 -15
  41. package/dist/types/result.js +0 -23
  42. package/dist/utils/errorHandler.test.d.ts +0 -1
  43. package/dist/utils/errorHandler.test.js +0 -89
  44. package/dist/utils/eventDecoder.d.ts +0 -7
  45. package/dist/utils/eventDecoder.js +0 -54
  46. package/dist/utils/eventDecoder.test.d.ts +0 -1
  47. package/dist/utils/eventDecoder.test.js +0 -48
  48. package/dist/utils/funding.test.d.ts +0 -1
  49. package/dist/utils/funding.test.js +0 -105
  50. package/dist/utils/keys.test.d.ts +0 -1
  51. package/dist/utils/keys.test.js +0 -81
  52. package/dist/utils/roleData.test.d.ts +0 -1
  53. package/dist/utils/roleData.test.js +0 -74
  54. package/dist/utils/testScenarios.test.d.ts +0 -1
  55. package/dist/utils/testScenarios.test.js +0 -68
  56. package/dist/utils/userOp.test.d.ts +0 -1
  57. 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.16.23",
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/core": "0.16.23",
18
- "@aastar/dapp": "0.16.23",
19
- "@aastar/enduser": "0.16.23",
20
- "@aastar/paymaster": "0.16.23",
21
- "@aastar/identity": "0.16.23",
22
- "@aastar/operator": "0.16.23",
23
- "@aastar/tokens": "0.16.23",
24
- "@aastar/account": "0.16.23",
25
- "@aastar/admin": "0.16.23"
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 {};