@aastar/sdk 0.16.22 → 0.17.0

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 (60) hide show
  1. package/README.md +1 -0
  2. package/dist/index.d.ts +1 -0
  3. package/dist/index.js +2 -0
  4. package/dist/utils/userOp.d.ts +11 -0
  5. package/dist/utils/userOp.js +43 -2
  6. package/package.json +11 -10
  7. package/dist/clients/ExperimentClient.test.d.ts +0 -1
  8. package/dist/clients/ExperimentClient.test.js +0 -53
  9. package/dist/clients/admin.test.d.ts +0 -1
  10. package/dist/clients/admin.test.js +0 -79
  11. package/dist/clients/clients.test.d.ts +0 -1
  12. package/dist/clients/clients.test.js +0 -91
  13. package/dist/clients/community.test.d.ts +0 -1
  14. package/dist/clients/community.test.js +0 -99
  15. package/dist/clients/endUser.test.d.ts +0 -1
  16. package/dist/clients/endUser.test.js +0 -188
  17. package/dist/clients/operator.test.d.ts +0 -1
  18. package/dist/clients/operator.test.js +0 -139
  19. package/dist/core/src/abis/BLSAggregator.json +0 -686
  20. package/dist/core/src/abis/BLSValidator.json +0 -42
  21. package/dist/core/src/abis/DVTValidator.json +0 -368
  22. package/dist/core/src/abis/EntryPoint.json +0 -1382
  23. package/dist/core/src/abis/GToken.json +0 -513
  24. package/dist/core/src/abis/GTokenStaking.json +0 -949
  25. package/dist/core/src/abis/MySBT.json +0 -1518
  26. package/dist/core/src/abis/Paymaster.json +0 -1143
  27. package/dist/core/src/abis/PaymasterFactory.json +0 -640
  28. package/dist/core/src/abis/Registry.json +0 -1942
  29. package/dist/core/src/abis/ReputationSystem.json +0 -699
  30. package/dist/core/src/abis/SimpleAccount.json +0 -560
  31. package/dist/core/src/abis/SimpleAccountFactory.json +0 -111
  32. package/dist/core/src/abis/SuperPaymaster.json +0 -1781
  33. package/dist/core/src/abis/xPNTsFactory.json +0 -718
  34. package/dist/core/src/abis/xPNTsToken.json +0 -1280
  35. package/dist/errors/AAStarError.d.ts +0 -26
  36. package/dist/errors/AAStarError.js +0 -32
  37. package/dist/errors/AAStarError.test.d.ts +0 -1
  38. package/dist/errors/AAStarError.test.js +0 -74
  39. package/dist/errors/decoder.test.d.ts +0 -1
  40. package/dist/errors/decoder.test.js +0 -90
  41. package/dist/node/index.d.ts +0 -7
  42. package/dist/node/index.js +0 -7
  43. package/dist/types/result.d.ts +0 -15
  44. package/dist/types/result.js +0 -23
  45. package/dist/utils/errorHandler.test.d.ts +0 -1
  46. package/dist/utils/errorHandler.test.js +0 -89
  47. package/dist/utils/eventDecoder.d.ts +0 -7
  48. package/dist/utils/eventDecoder.js +0 -54
  49. package/dist/utils/eventDecoder.test.d.ts +0 -1
  50. package/dist/utils/eventDecoder.test.js +0 -48
  51. package/dist/utils/funding.test.d.ts +0 -1
  52. package/dist/utils/funding.test.js +0 -105
  53. package/dist/utils/keys.test.d.ts +0 -1
  54. package/dist/utils/keys.test.js +0 -81
  55. package/dist/utils/roleData.test.d.ts +0 -1
  56. package/dist/utils/roleData.test.js +0 -74
  57. package/dist/utils/testScenarios.test.d.ts +0 -1
  58. package/dist/utils/testScenarios.test.js +0 -68
  59. package/dist/utils/userOp.test.d.ts +0 -1
  60. package/dist/utils/userOp.test.js +0 -152
@@ -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 {};
@@ -1,139 +0,0 @@
1
- import { describe, it, expect, vi } from 'vitest';
2
- import { createOperatorClient } from './operator.js';
3
- import { mainnet } from 'viem/chains';
4
- import { http, keccak256, stringToBytes } 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
- registryHasRole: vi.fn().mockResolvedValue(false),
11
- registryRegisterRoleSelf: vi.fn().mockResolvedValue('0xhash')
12
- }))),
13
- stakingActions: vi.fn(() => vi.fn(() => ({
14
- // any staking methods if needed
15
- }))),
16
- superPaymasterActions: vi.fn(() => vi.fn(() => ({
17
- superPaymasterDepositFor: vi.fn().mockResolvedValue('0xhash'),
18
- superPaymasterOperators: vi.fn().mockResolvedValue([1000n, 1000n, true, false]),
19
- superPaymasterGetDeposit: vi.fn().mockResolvedValue(555n)
20
- }))),
21
- paymasterV4Actions: vi.fn(() => vi.fn(() => ({
22
- // pmv4 methods
23
- }))),
24
- tokenActions: vi.fn(() => vi.fn(() => ({
25
- tokenApprove: vi.fn().mockResolvedValue('0xhash')
26
- }))),
27
- };
28
- });
29
- describe('OperatorClient', () => {
30
- const MOCK_ADDR = '0xf39Fd6e51aad88F6F4ce6aB8827279cffFb92266';
31
- it('should create operator client', () => {
32
- const client = createOperatorClient({ chain: mainnet, transport: http() });
33
- expect(client.setup).toBeDefined();
34
- });
35
- describe('onboardFully', () => {
36
- it('should complete onboarding flow', async () => {
37
- const client = createOperatorClient({
38
- chain: mainnet,
39
- transport: http(),
40
- account: { address: MOCK_ADDR }
41
- });
42
- // Mock base client methods
43
- client.readContract = vi.fn().mockResolvedValue([0n, 0n, 0n]);
44
- client.waitForTransactionReceipt = vi.fn().mockResolvedValue({ logs: [] });
45
- const results = await client.onboardFully({
46
- stakeAmount: 100n,
47
- depositAmount: 200n,
48
- roleId: keccak256(stringToBytes('PAYMASTER_SUPER'))
49
- });
50
- expect(results).toHaveLength(3);
51
- expect(client.tokenApprove).toHaveBeenCalled();
52
- expect(client.registryRegisterRoleSelf).toHaveBeenCalled();
53
- expect(client.superPaymasterDepositFor).toHaveBeenCalled();
54
- });
55
- });
56
- describe('Advanced Setup', () => {
57
- it('should call configureOperator', async () => {
58
- const client = createOperatorClient({ chain: mainnet, transport: http() });
59
- client.configureOperator = vi.fn().mockResolvedValue('0xhash');
60
- const hash = await client.configureOperator({
61
- xPNTsToken: MOCK_ADDR,
62
- treasury: MOCK_ADDR,
63
- exchangeRate: 100n
64
- });
65
- expect(hash).toBe('0xhash');
66
- });
67
- it('should onboard to Super Paymaster', async () => {
68
- const client = createOperatorClient({
69
- chain: mainnet,
70
- transport: http(),
71
- account: { address: MOCK_ADDR }
72
- });
73
- client.onboardFully = vi.fn().mockResolvedValue([]);
74
- // onboardToSuperPaymaster is an internal action alias in OperatorClient
75
- await client.onboardToSuperPaymaster({ stakeAmount: 100n, depositAmount: 200n, roleId: '0x1' });
76
- expect(client.onboardFully).toHaveBeenCalled();
77
- });
78
- it('should deploy PaymasterV4', async () => {
79
- const client = createOperatorClient({ chain: mainnet, transport: http(), account: { address: MOCK_ADDR } });
80
- client.writeContract = vi.fn().mockResolvedValue('0xdeployhash');
81
- client.waitForTransactionReceipt = vi.fn().mockResolvedValue({});
82
- const hash = await client.deployPaymasterV4({ version: 'v4.2' });
83
- expect(hash).toBe('0xdeployhash');
84
- });
85
- it('should validate inputs in configureOperator', async () => {
86
- const opClient = createOperatorClient({
87
- account: { address: MOCK_ADDR },
88
- chain: mainnet,
89
- transport: http()
90
- });
91
- // No need to mock internal configureOperator for validation testing
92
- // as validation happens before internal call.
93
- await expect(opClient.configureOperator({
94
- xPNTsToken: '0xInvalid',
95
- treasury: '0x123',
96
- exchangeRate: 100n
97
- })).rejects.toThrow('xPNTs Token must be a valid Ethereum address');
98
- await expect(opClient.configureOperator({
99
- xPNTsToken: MOCK_ADDR,
100
- treasury: '0xInvalid',
101
- exchangeRate: 100n
102
- })).rejects.toThrow('Treasury must be a valid Ethereum address');
103
- });
104
- it('should check readiness', async () => {
105
- const opClient = createOperatorClient({
106
- account: { address: MOCK_ADDR },
107
- chain: mainnet,
108
- transport: http()
109
- });
110
- // Global mock for registryActions.hasRole returns false
111
- // Global mock for superPaymasterActions.operators returns [1000n, 1000n, true, false]
112
- const status = await opClient.checkReadiness();
113
- expect(status.isRegistered).toBe(false); // mocked val
114
- expect(status.isConfigured).toBe(true); // mocked val (index 2)
115
- expect(status.collateralBalance).toBe(1000n); // mocked val (index 0)
116
- });
117
- });
118
- describe('Operator Status and Queries', () => {
119
- it('should get operator status', async () => {
120
- const client = createOperatorClient({ chain: mainnet, transport: http() });
121
- client.readContract = vi.fn()
122
- .mockResolvedValueOnce(true) // hasRole
123
- .mockResolvedValueOnce([1000n, 100n, true, false, 0n, 0n, MOCK_ADDR]); // operator data
124
- const status = await client.getOperatorStatus(MOCK_ADDR);
125
- expect(status.type).toBe('super');
126
- expect(status.superPaymaster?.isConfigured).toBe(true);
127
- });
128
- it('should check if address is operator', async () => {
129
- const client = createOperatorClient({ chain: mainnet, transport: http() });
130
- const result = await client.isOperator(MOCK_ADDR);
131
- expect(result).toBe(true); // from mocked operators
132
- });
133
- it('should get deposit details', async () => {
134
- const client = createOperatorClient({ chain: mainnet, transport: http() });
135
- const details = await client.getDepositDetails();
136
- expect(details.deposit).toBe(555n); // from mocked getDeposit
137
- });
138
- });
139
- });