@atxp/base 0.2.17 → 0.2.18
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/README.md +6 -0
- package/dist/baseAppAccount.d.ts +3 -1
- package/dist/baseAppAccount.d.ts.map +1 -1
- package/dist/baseAppAccount.ephemeral.test.d.ts +2 -0
- package/dist/baseAppAccount.ephemeral.test.d.ts.map +1 -0
- package/dist/baseAppAccount.ephemeral.test.js +420 -0
- package/dist/baseAppAccount.ephemeral.test.js.map +1 -0
- package/dist/baseAppAccount.js +43 -16
- package/dist/baseAppAccount.js.map +1 -1
- package/dist/baseAppAccount.mainWallet.test.d.ts +2 -0
- package/dist/baseAppAccount.mainWallet.test.d.ts.map +1 -0
- package/dist/baseAppAccount.mainWallet.test.js +259 -0
- package/dist/baseAppAccount.mainWallet.test.js.map +1 -0
- package/dist/baseAppPaymentMaker.d.ts.map +1 -1
- package/dist/baseAppPaymentMaker.js +4 -3
- package/dist/baseAppPaymentMaker.js.map +1 -1
- package/dist/baseAppPaymentMaker.test.js +81 -69
- package/dist/baseAppPaymentMaker.test.js.map +1 -1
- package/dist/index.d.ts +1 -0
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +1 -0
- package/dist/index.js.map +1 -1
- package/dist/mainWalletPaymentMaker.d.ts +22 -0
- package/dist/mainWalletPaymentMaker.d.ts.map +1 -0
- package/dist/mainWalletPaymentMaker.js +141 -0
- package/dist/mainWalletPaymentMaker.js.map +1 -0
- package/dist/mainWalletPaymentMaker.test.d.ts +2 -0
- package/dist/mainWalletPaymentMaker.test.d.ts.map +1 -0
- package/dist/mainWalletPaymentMaker.test.js +310 -0
- package/dist/mainWalletPaymentMaker.test.js.map +1 -0
- package/dist/storage.d.ts +1 -0
- package/dist/storage.d.ts.map +1 -1
- package/dist/storage.js +9 -0
- package/dist/storage.js.map +1 -1
- package/dist/testHelpers.d.ts +88 -0
- package/dist/testHelpers.d.ts.map +1 -0
- package/dist/testHelpers.js +202 -0
- package/dist/testHelpers.js.map +1 -0
- package/package.json +3 -3
package/README.md
CHANGED
|
@@ -21,6 +21,7 @@ const account = await BaseAppAccount.initialize({
|
|
|
21
21
|
walletAddress: address,
|
|
22
22
|
apiKey,
|
|
23
23
|
appName: 'Mini App ATXP',
|
|
24
|
+
useEphemeralWallet: false, // Temporary - see Non ephemeral wallet mode below
|
|
24
25
|
// Parameters for the spend permission (see How it works below)
|
|
25
26
|
allowance: BigInt('10000000'), // 10 USDC
|
|
26
27
|
periodInDays: 30,
|
|
@@ -38,6 +39,11 @@ const res = await client.callTool({
|
|
|
38
39
|
);
|
|
39
40
|
```
|
|
40
41
|
|
|
42
|
+
## Non ephemeral wallet mode
|
|
43
|
+
You can disabled ephemeral wallets and use the user's main wallet for all actions by passing the parameter `useEphemeralWallet: false` to the `BaseAppAccount.initialize` call. If not provided, it defaults to `true`.
|
|
44
|
+
|
|
45
|
+
Note that the UX is degraded in this mode - users are prompted to verify every transaction, and every signature. So that's 1 verification on accessing the MCP server at all, and 2 more (transaction plus sign JWT) for each transaction. This mode is intended as an short-term unblock for dev shops building mini-apps while we sort out a longer-term strategy.
|
|
46
|
+
|
|
41
47
|
|
|
42
48
|
## Clearing state
|
|
43
49
|
You can reset the BaseAppAccount state for a user by:
|
package/dist/baseAppAccount.d.ts
CHANGED
|
@@ -1,4 +1,5 @@
|
|
|
1
1
|
import type { Account, PaymentMaker } from '@atxp/client';
|
|
2
|
+
import { type MainWalletProvider } from './mainWalletPaymentMaker.js';
|
|
2
3
|
import { SpendPermission } from './types.js';
|
|
3
4
|
import { IStorage } from './storage.js';
|
|
4
5
|
import { type EphemeralSmartWallet } from './smartWalletHelpers.js';
|
|
@@ -13,6 +14,7 @@ export declare class BaseAppAccount implements Account {
|
|
|
13
14
|
walletAddress: string;
|
|
14
15
|
apiKey: string;
|
|
15
16
|
appName: string;
|
|
17
|
+
useEphemeralWallet?: boolean;
|
|
16
18
|
allowance?: bigint;
|
|
17
19
|
periodInDays?: number;
|
|
18
20
|
storage?: IStorage<string>;
|
|
@@ -20,7 +22,7 @@ export declare class BaseAppAccount implements Account {
|
|
|
20
22
|
}): Promise<BaseAppAccount>;
|
|
21
23
|
private static loadSavedWalletAndPermission;
|
|
22
24
|
private static deploySmartWallet;
|
|
23
|
-
constructor(spendPermission: SpendPermission, ephemeralSmartWallet: EphemeralSmartWallet, logger?: Logger);
|
|
25
|
+
constructor(spendPermission: SpendPermission | null, ephemeralSmartWallet: EphemeralSmartWallet | null, logger?: Logger, mainWalletAddress?: string, provider?: MainWalletProvider);
|
|
24
26
|
static clearAllStoredData(userWalletAddress: string, storage?: IStorage<string>): void;
|
|
25
27
|
}
|
|
26
28
|
//# sourceMappingURL=baseAppAccount.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"baseAppAccount.d.ts","sourceRoot":"","sources":["../src/baseAppAccount.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,OAAO,EAAE,YAAY,EAAE,MAAM,cAAc,CAAC;
|
|
1
|
+
{"version":3,"file":"baseAppAccount.d.ts","sourceRoot":"","sources":["../src/baseAppAccount.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,OAAO,EAAE,YAAY,EAAE,MAAM,cAAc,CAAC;AAG1D,OAAO,EAA0B,KAAK,kBAAkB,EAAE,MAAM,6BAA6B,CAAC;AAI9F,OAAO,EAAE,eAAe,EAAE,MAAM,YAAY,CAAC;AAC7C,OAAO,EAAE,QAAQ,EAA0D,MAAM,cAAc,CAAC;AAChG,OAAO,EAA0B,KAAK,oBAAoB,EAAE,MAAM,yBAAyB,CAAC;AAC5F,OAAO,EAAiB,MAAM,EAAE,MAAM,cAAc,CAAC;AAQrD,qBAAa,cAAe,YAAW,OAAO;IAC5C,SAAS,EAAE,MAAM,CAAC;IAClB,aAAa,EAAE;QAAE,CAAC,GAAG,EAAE,MAAM,GAAG,YAAY,CAAA;KAAE,CAAC;IAE/C,OAAO,CAAC,MAAM,CAAC,YAAY;WAId,UAAU,CAAC,MAAM,EAAE;QAC5B,aAAa,EAAE,MAAM,CAAC;QACtB,MAAM,EAAE,MAAM,CAAC;QACf,OAAO,EAAE,MAAM,CAAC;QAChB,kBAAkB,CAAC,EAAE,OAAO,CAAC;QAC7B,SAAS,CAAC,EAAE,MAAM,CAAC;QACnB,YAAY,CAAC,EAAE,MAAM,CAAC;QACtB,OAAO,CAAC,EAAE,QAAQ,CAAC,MAAM,CAAC,CAAC;QAC3B,MAAM,CAAC,EAAE,MAAM,CAAA;KAChB,GACA,OAAO,CAAC,cAAc,CAAC;IA6E1B,OAAO,CAAC,MAAM,CAAC,4BAA4B;mBAkBtB,iBAAiB;gBAsBpC,eAAe,EAAE,eAAe,GAAG,IAAI,EACvC,oBAAoB,EAAE,oBAAoB,GAAG,IAAI,EACjD,MAAM,CAAC,EAAE,MAAM,EACf,iBAAiB,CAAC,EAAE,MAAM,EAC1B,QAAQ,CAAC,EAAE,kBAAkB;IAuB/B,MAAM,CAAC,kBAAkB,CAAC,iBAAiB,EAAE,MAAM,EAAE,OAAO,CAAC,EAAE,QAAQ,CAAC,MAAM,CAAC,GAAG,IAAI;CAavF"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"baseAppAccount.ephemeral.test.d.ts","sourceRoot":"","sources":["../src/baseAppAccount.ephemeral.test.ts"],"names":[],"mappings":""}
|
|
@@ -0,0 +1,420 @@
|
|
|
1
|
+
import { describe, it, expect, vi, beforeEach, afterEach } from 'vitest';
|
|
2
|
+
// Mock all external modules before imports
|
|
3
|
+
vi.mock('@base-org/account', () => ({
|
|
4
|
+
createBaseAccountSDK: vi.fn(() => ({
|
|
5
|
+
getProvider: vi.fn(() => ({
|
|
6
|
+
request: vi.fn()
|
|
7
|
+
}))
|
|
8
|
+
}))
|
|
9
|
+
}));
|
|
10
|
+
vi.mock('@base-org/account/spend-permission', () => ({
|
|
11
|
+
requestSpendPermission: vi.fn(),
|
|
12
|
+
prepareSpendCallData: vi.fn()
|
|
13
|
+
}));
|
|
14
|
+
vi.mock('viem/account-abstraction', () => ({
|
|
15
|
+
toCoinbaseSmartAccount: vi.fn(),
|
|
16
|
+
createBundlerClient: vi.fn()
|
|
17
|
+
}));
|
|
18
|
+
vi.mock('viem', async () => {
|
|
19
|
+
const actual = await vi.importActual('viem');
|
|
20
|
+
return {
|
|
21
|
+
...actual,
|
|
22
|
+
http: vi.fn(() => 'mock-transport'),
|
|
23
|
+
createPublicClient: vi.fn(() => ({})),
|
|
24
|
+
encodeFunctionData: vi.fn(() => '0xmockencodeddata')
|
|
25
|
+
};
|
|
26
|
+
});
|
|
27
|
+
import { BaseAppAccount } from './baseAppAccount.js';
|
|
28
|
+
import { MemoryStorage } from './storage.js';
|
|
29
|
+
import { base } from 'viem/chains';
|
|
30
|
+
import { USDC_CONTRACT_ADDRESS_BASE } from '@atxp/client';
|
|
31
|
+
import BigNumber from 'bignumber.js';
|
|
32
|
+
import { TEST_API_KEY, TEST_WALLET_ADDRESS, TEST_SMART_WALLET_ADDRESS, TEST_RECEIVER_ADDRESS, TEST_PRIVATE_KEY, TEST_PAYMASTER_URL, TEST_BUNDLER_URL, setupInitializationMocks, setupPaymentMocks, mockSpendPermission, mockExpiredSpendPermission, mockSmartAccount, mockBundlerClient, mockFailedBundlerClient, mockProvider, mockSpendCalls, getStorageKey, removeTimestamps, expectTimestampAround } from './testHelpers.js';
|
|
33
|
+
describe('BaseAppAccount', () => {
|
|
34
|
+
let mockStorage;
|
|
35
|
+
beforeEach(() => {
|
|
36
|
+
mockStorage = new MemoryStorage();
|
|
37
|
+
vi.clearAllMocks();
|
|
38
|
+
});
|
|
39
|
+
afterEach(() => {
|
|
40
|
+
vi.restoreAllMocks();
|
|
41
|
+
});
|
|
42
|
+
describe('initialize', () => {
|
|
43
|
+
it('should create a new account when no stored data exists', async () => {
|
|
44
|
+
const bundlerClient = mockBundlerClient();
|
|
45
|
+
const mocks = await setupInitializationMocks({ bundlerClient });
|
|
46
|
+
// Initialize account
|
|
47
|
+
const account = await BaseAppAccount.initialize({
|
|
48
|
+
walletAddress: TEST_WALLET_ADDRESS,
|
|
49
|
+
apiKey: TEST_API_KEY,
|
|
50
|
+
appName: 'Test App',
|
|
51
|
+
storage: mockStorage
|
|
52
|
+
});
|
|
53
|
+
// Verify account creation
|
|
54
|
+
expect(account).toBeDefined();
|
|
55
|
+
expect(account.accountId).toBe(TEST_SMART_WALLET_ADDRESS);
|
|
56
|
+
expect(account.paymentMakers).toBeDefined();
|
|
57
|
+
expect(account.paymentMakers.base).toBeDefined();
|
|
58
|
+
// Verify smart wallet was deployed
|
|
59
|
+
expect(bundlerClient.sendUserOperation).toHaveBeenCalledWith({
|
|
60
|
+
calls: [{
|
|
61
|
+
to: TEST_SMART_WALLET_ADDRESS,
|
|
62
|
+
value: 0n,
|
|
63
|
+
data: '0x'
|
|
64
|
+
}],
|
|
65
|
+
paymaster: true
|
|
66
|
+
});
|
|
67
|
+
// Verify spend permission was requested
|
|
68
|
+
expect(mocks.requestSpendPermission).toHaveBeenCalledWith({
|
|
69
|
+
account: TEST_WALLET_ADDRESS,
|
|
70
|
+
spender: TEST_SMART_WALLET_ADDRESS,
|
|
71
|
+
token: USDC_CONTRACT_ADDRESS_BASE,
|
|
72
|
+
chainId: base.id,
|
|
73
|
+
allowance: 10n,
|
|
74
|
+
periodInDays: 7,
|
|
75
|
+
provider: expect.any(Object)
|
|
76
|
+
});
|
|
77
|
+
// Verify data was stored
|
|
78
|
+
const storageKey = getStorageKey(TEST_WALLET_ADDRESS);
|
|
79
|
+
const storedData = mockStorage.get(storageKey);
|
|
80
|
+
expect(storedData).toBeTruthy();
|
|
81
|
+
const parsedData = JSON.parse(storedData);
|
|
82
|
+
expect(parsedData.privateKey).toBeDefined();
|
|
83
|
+
// Compare permission structure (toMatchObject ignores extra properties in received)
|
|
84
|
+
expect(parsedData.permission).toMatchObject(removeTimestamps(mockSpendPermission()));
|
|
85
|
+
// Verify timestamps are reasonable
|
|
86
|
+
expectTimestampAround(parsedData.permission.permission.start, 0); // Should be around now
|
|
87
|
+
expectTimestampAround(parsedData.permission.permission.end, 604800); // Should be ~7 days from now
|
|
88
|
+
});
|
|
89
|
+
it('should reuse existing account when valid stored data exists', async () => {
|
|
90
|
+
// Pre-store valid permission
|
|
91
|
+
const permission = mockSpendPermission();
|
|
92
|
+
const storageKey = getStorageKey(TEST_WALLET_ADDRESS);
|
|
93
|
+
mockStorage.set(storageKey, JSON.stringify({
|
|
94
|
+
privateKey: TEST_PRIVATE_KEY,
|
|
95
|
+
permission
|
|
96
|
+
}));
|
|
97
|
+
const bundlerClient = mockBundlerClient();
|
|
98
|
+
const mocks = await setupInitializationMocks({ bundlerClient });
|
|
99
|
+
// Initialize account
|
|
100
|
+
const account = await BaseAppAccount.initialize({
|
|
101
|
+
walletAddress: TEST_WALLET_ADDRESS,
|
|
102
|
+
apiKey: TEST_API_KEY,
|
|
103
|
+
appName: 'Test App',
|
|
104
|
+
storage: mockStorage
|
|
105
|
+
});
|
|
106
|
+
// Verify account was loaded from storage
|
|
107
|
+
expect(account).toBeDefined();
|
|
108
|
+
expect(account.accountId).toBe(TEST_SMART_WALLET_ADDRESS);
|
|
109
|
+
// Verify smart wallet was NOT deployed (reusing existing)
|
|
110
|
+
expect(bundlerClient.sendUserOperation).not.toHaveBeenCalled();
|
|
111
|
+
expect(mocks.requestSpendPermission).not.toHaveBeenCalled();
|
|
112
|
+
});
|
|
113
|
+
it('should create new account when stored permission is expired', async () => {
|
|
114
|
+
// Pre-store expired permission
|
|
115
|
+
const expiredPermission = mockExpiredSpendPermission();
|
|
116
|
+
const storageKey = getStorageKey(TEST_WALLET_ADDRESS);
|
|
117
|
+
mockStorage.set(storageKey, JSON.stringify({
|
|
118
|
+
privateKey: TEST_PRIVATE_KEY,
|
|
119
|
+
permission: expiredPermission
|
|
120
|
+
}));
|
|
121
|
+
const newPermission = mockSpendPermission({ salt: '2', signature: '0xnewsignature' });
|
|
122
|
+
const bundlerClient = mockBundlerClient();
|
|
123
|
+
const mocks = await setupInitializationMocks({
|
|
124
|
+
bundlerClient,
|
|
125
|
+
spendPermission: newPermission
|
|
126
|
+
});
|
|
127
|
+
// Initialize account
|
|
128
|
+
const account = await BaseAppAccount.initialize({
|
|
129
|
+
walletAddress: TEST_WALLET_ADDRESS,
|
|
130
|
+
apiKey: TEST_API_KEY,
|
|
131
|
+
appName: 'Test App',
|
|
132
|
+
storage: mockStorage
|
|
133
|
+
});
|
|
134
|
+
// Verify new account was created
|
|
135
|
+
expect(account).toBeDefined();
|
|
136
|
+
expect(bundlerClient.sendUserOperation).toHaveBeenCalled();
|
|
137
|
+
expect(mocks.requestSpendPermission).toHaveBeenCalled();
|
|
138
|
+
// Verify old data was removed and new data stored
|
|
139
|
+
const storedData = mockStorage.get(storageKey);
|
|
140
|
+
expect(storedData).toBeTruthy();
|
|
141
|
+
const parsedData = JSON.parse(storedData);
|
|
142
|
+
expect(parsedData.permission).toMatchObject(removeTimestamps(newPermission));
|
|
143
|
+
// Verify timestamps are reasonable
|
|
144
|
+
expectTimestampAround(parsedData.permission.permission.start, 0);
|
|
145
|
+
expectTimestampAround(parsedData.permission.permission.end, 604800);
|
|
146
|
+
});
|
|
147
|
+
it('should use custom allowance and period when provided', async () => {
|
|
148
|
+
const mocks = await setupInitializationMocks();
|
|
149
|
+
// Initialize with custom values
|
|
150
|
+
const customAllowance = 100n;
|
|
151
|
+
const customPeriod = 30;
|
|
152
|
+
await BaseAppAccount.initialize({
|
|
153
|
+
walletAddress: TEST_WALLET_ADDRESS,
|
|
154
|
+
apiKey: TEST_API_KEY,
|
|
155
|
+
appName: 'Test App',
|
|
156
|
+
allowance: customAllowance,
|
|
157
|
+
periodInDays: customPeriod,
|
|
158
|
+
storage: mockStorage
|
|
159
|
+
});
|
|
160
|
+
// Verify custom values were used
|
|
161
|
+
expect(mocks.requestSpendPermission).toHaveBeenCalledWith(expect.objectContaining({
|
|
162
|
+
allowance: customAllowance,
|
|
163
|
+
periodInDays: customPeriod
|
|
164
|
+
}));
|
|
165
|
+
});
|
|
166
|
+
it('should throw error when API key is not provided', async () => {
|
|
167
|
+
await expect(BaseAppAccount.initialize({
|
|
168
|
+
walletAddress: TEST_WALLET_ADDRESS,
|
|
169
|
+
apiKey: '',
|
|
170
|
+
appName: 'Test App',
|
|
171
|
+
storage: mockStorage
|
|
172
|
+
})).rejects.toThrow('Smart wallet API key is required');
|
|
173
|
+
});
|
|
174
|
+
it('should make all required blockchain calls when creating new account', async () => {
|
|
175
|
+
const provider = mockProvider();
|
|
176
|
+
const bundlerClient = mockBundlerClient();
|
|
177
|
+
const smartAccount = mockSmartAccount();
|
|
178
|
+
const permission = mockSpendPermission();
|
|
179
|
+
const mocks = await setupInitializationMocks({
|
|
180
|
+
provider,
|
|
181
|
+
bundlerClient,
|
|
182
|
+
smartAccount,
|
|
183
|
+
spendPermission: permission
|
|
184
|
+
});
|
|
185
|
+
const { http } = await import('viem');
|
|
186
|
+
// Initialize account
|
|
187
|
+
await BaseAppAccount.initialize({
|
|
188
|
+
walletAddress: TEST_WALLET_ADDRESS,
|
|
189
|
+
apiKey: TEST_API_KEY,
|
|
190
|
+
appName: 'Test App',
|
|
191
|
+
storage: mockStorage
|
|
192
|
+
});
|
|
193
|
+
// Verify SDK initialization
|
|
194
|
+
expect(mocks.createBaseAccountSDK).toHaveBeenCalledTimes(1);
|
|
195
|
+
expect(mocks.createBaseAccountSDK).toHaveBeenCalledWith({
|
|
196
|
+
appName: 'Test App',
|
|
197
|
+
appChainIds: [base.id],
|
|
198
|
+
paymasterUrls: {
|
|
199
|
+
[base.id]: TEST_PAYMASTER_URL
|
|
200
|
+
}
|
|
201
|
+
});
|
|
202
|
+
// Verify wallet_connect attempt
|
|
203
|
+
expect(provider.request).toHaveBeenCalledWith({ method: 'wallet_connect' });
|
|
204
|
+
// Verify public client creation
|
|
205
|
+
expect(mocks.createPublicClient).toHaveBeenCalledWith({
|
|
206
|
+
chain: base,
|
|
207
|
+
transport: expect.anything()
|
|
208
|
+
});
|
|
209
|
+
expect(http).toHaveBeenCalledWith(`${TEST_BUNDLER_URL}/${TEST_API_KEY}`);
|
|
210
|
+
// Verify smart account creation
|
|
211
|
+
expect(mocks.toCoinbaseSmartAccount).toHaveBeenCalledWith({
|
|
212
|
+
client: expect.anything(),
|
|
213
|
+
owners: [expect.objectContaining({
|
|
214
|
+
address: expect.any(String)
|
|
215
|
+
})],
|
|
216
|
+
version: '1'
|
|
217
|
+
});
|
|
218
|
+
// Verify bundler client creation
|
|
219
|
+
expect(mocks.createBundlerClient).toHaveBeenCalledWith({
|
|
220
|
+
account: smartAccount,
|
|
221
|
+
client: expect.anything(),
|
|
222
|
+
transport: expect.anything(),
|
|
223
|
+
chain: base,
|
|
224
|
+
paymaster: true,
|
|
225
|
+
paymasterContext: {
|
|
226
|
+
transport: expect.anything()
|
|
227
|
+
}
|
|
228
|
+
});
|
|
229
|
+
// Verify smart wallet deployment
|
|
230
|
+
expect(bundlerClient.sendUserOperation).toHaveBeenCalledTimes(1);
|
|
231
|
+
expect(bundlerClient.sendUserOperation).toHaveBeenCalledWith({
|
|
232
|
+
calls: [{
|
|
233
|
+
to: TEST_SMART_WALLET_ADDRESS,
|
|
234
|
+
value: 0n,
|
|
235
|
+
data: '0x'
|
|
236
|
+
}],
|
|
237
|
+
paymaster: true
|
|
238
|
+
});
|
|
239
|
+
expect(bundlerClient.waitForUserOperationReceipt).toHaveBeenCalledWith({
|
|
240
|
+
hash: '0xoperationhash'
|
|
241
|
+
});
|
|
242
|
+
// Verify spend permission request
|
|
243
|
+
expect(mocks.requestSpendPermission).toHaveBeenCalledTimes(1);
|
|
244
|
+
expect(mocks.requestSpendPermission).toHaveBeenCalledWith({
|
|
245
|
+
account: TEST_WALLET_ADDRESS,
|
|
246
|
+
spender: TEST_SMART_WALLET_ADDRESS,
|
|
247
|
+
token: USDC_CONTRACT_ADDRESS_BASE,
|
|
248
|
+
chainId: base.id,
|
|
249
|
+
allowance: 10n,
|
|
250
|
+
periodInDays: 7,
|
|
251
|
+
provider: provider
|
|
252
|
+
});
|
|
253
|
+
});
|
|
254
|
+
it('should skip deployment and permission when reusing stored account', async () => {
|
|
255
|
+
// Pre-store valid permission
|
|
256
|
+
const permission = mockSpendPermission();
|
|
257
|
+
const storageKey = getStorageKey(TEST_WALLET_ADDRESS);
|
|
258
|
+
mockStorage.set(storageKey, JSON.stringify({
|
|
259
|
+
privateKey: TEST_PRIVATE_KEY,
|
|
260
|
+
permission
|
|
261
|
+
}));
|
|
262
|
+
const provider = mockProvider();
|
|
263
|
+
const bundlerClient = mockBundlerClient();
|
|
264
|
+
const smartAccount = mockSmartAccount();
|
|
265
|
+
const mocks = await setupInitializationMocks({
|
|
266
|
+
provider,
|
|
267
|
+
bundlerClient,
|
|
268
|
+
smartAccount
|
|
269
|
+
});
|
|
270
|
+
const { http } = await import('viem');
|
|
271
|
+
// Initialize account
|
|
272
|
+
await BaseAppAccount.initialize({
|
|
273
|
+
walletAddress: TEST_WALLET_ADDRESS,
|
|
274
|
+
apiKey: TEST_API_KEY,
|
|
275
|
+
appName: 'Test App',
|
|
276
|
+
storage: mockStorage
|
|
277
|
+
});
|
|
278
|
+
// Verify SDK initialization still happens
|
|
279
|
+
expect(mocks.createBaseAccountSDK).toHaveBeenCalledTimes(1);
|
|
280
|
+
expect(mocks.createBaseAccountSDK).toHaveBeenCalledWith({
|
|
281
|
+
appName: 'Test App',
|
|
282
|
+
appChainIds: [base.id],
|
|
283
|
+
paymasterUrls: {
|
|
284
|
+
[base.id]: TEST_PAYMASTER_URL
|
|
285
|
+
}
|
|
286
|
+
});
|
|
287
|
+
// Verify wallet_connect attempt still happens
|
|
288
|
+
expect(provider.request).toHaveBeenCalledWith({ method: 'wallet_connect' });
|
|
289
|
+
// Verify public client creation
|
|
290
|
+
expect(mocks.createPublicClient).toHaveBeenCalledWith({
|
|
291
|
+
chain: base,
|
|
292
|
+
transport: expect.anything()
|
|
293
|
+
});
|
|
294
|
+
expect(http).toHaveBeenCalledWith(`${TEST_BUNDLER_URL}/${TEST_API_KEY}`);
|
|
295
|
+
// Verify smart account creation with stored private key
|
|
296
|
+
expect(mocks.toCoinbaseSmartAccount).toHaveBeenCalledWith({
|
|
297
|
+
client: expect.anything(),
|
|
298
|
+
owners: [expect.objectContaining({
|
|
299
|
+
address: expect.any(String)
|
|
300
|
+
})],
|
|
301
|
+
version: '1'
|
|
302
|
+
});
|
|
303
|
+
// Verify bundler client creation
|
|
304
|
+
expect(mocks.createBundlerClient).toHaveBeenCalledWith({
|
|
305
|
+
account: smartAccount,
|
|
306
|
+
client: expect.anything(),
|
|
307
|
+
transport: expect.anything(),
|
|
308
|
+
chain: base,
|
|
309
|
+
paymaster: true,
|
|
310
|
+
paymasterContext: {
|
|
311
|
+
transport: expect.anything()
|
|
312
|
+
}
|
|
313
|
+
});
|
|
314
|
+
// Verify NO smart wallet deployment
|
|
315
|
+
expect(bundlerClient.sendUserOperation).not.toHaveBeenCalled();
|
|
316
|
+
expect(bundlerClient.waitForUserOperationReceipt).not.toHaveBeenCalled();
|
|
317
|
+
// Verify NO new spend permission request
|
|
318
|
+
expect(mocks.requestSpendPermission).not.toHaveBeenCalled();
|
|
319
|
+
});
|
|
320
|
+
it('should handle wallet_connect failure gracefully', async () => {
|
|
321
|
+
// Mock provider that fails wallet_connect
|
|
322
|
+
const provider = mockProvider({
|
|
323
|
+
request: vi.fn().mockRejectedValue(new Error('Wallet does not support wallet_connect'))
|
|
324
|
+
});
|
|
325
|
+
const bundlerClient = mockBundlerClient();
|
|
326
|
+
const mocks = await setupInitializationMocks({ provider, bundlerClient });
|
|
327
|
+
// Initialize account - should not throw despite wallet_connect failure
|
|
328
|
+
const account = await BaseAppAccount.initialize({
|
|
329
|
+
walletAddress: TEST_WALLET_ADDRESS,
|
|
330
|
+
apiKey: TEST_API_KEY,
|
|
331
|
+
appName: 'Test App',
|
|
332
|
+
storage: mockStorage
|
|
333
|
+
});
|
|
334
|
+
// Verify initialization continued despite wallet_connect failure
|
|
335
|
+
expect(account).toBeDefined();
|
|
336
|
+
expect(provider.request).toHaveBeenCalledWith({ method: 'wallet_connect' });
|
|
337
|
+
expect(bundlerClient.sendUserOperation).toHaveBeenCalled();
|
|
338
|
+
expect(mocks.requestSpendPermission).toHaveBeenCalled();
|
|
339
|
+
});
|
|
340
|
+
it('should throw when smart wallet deployment fails', async () => {
|
|
341
|
+
const bundlerClient = mockFailedBundlerClient({ failureType: 'deployment' });
|
|
342
|
+
await setupInitializationMocks({ bundlerClient });
|
|
343
|
+
// Initialize should throw
|
|
344
|
+
await expect(BaseAppAccount.initialize({
|
|
345
|
+
walletAddress: TEST_WALLET_ADDRESS,
|
|
346
|
+
apiKey: TEST_API_KEY,
|
|
347
|
+
appName: 'Test App',
|
|
348
|
+
storage: mockStorage
|
|
349
|
+
})).rejects.toThrow('Smart wallet deployment failed');
|
|
350
|
+
});
|
|
351
|
+
});
|
|
352
|
+
describe('clearAllStoredData', () => {
|
|
353
|
+
it('should remove stored data for the given wallet address', () => {
|
|
354
|
+
const storageKey = getStorageKey(TEST_WALLET_ADDRESS);
|
|
355
|
+
// Store some data
|
|
356
|
+
mockStorage.set(storageKey, 'test-data');
|
|
357
|
+
expect(mockStorage.get(storageKey)).toBe('test-data');
|
|
358
|
+
// Clear the data
|
|
359
|
+
BaseAppAccount.clearAllStoredData(TEST_WALLET_ADDRESS, mockStorage);
|
|
360
|
+
// Verify data was removed
|
|
361
|
+
expect(mockStorage.get(storageKey)).toBeNull();
|
|
362
|
+
});
|
|
363
|
+
it('should throw error when called outside browser without storage', () => {
|
|
364
|
+
// Mock window as undefined (non-browser environment)
|
|
365
|
+
const originalWindow = global.window;
|
|
366
|
+
global.window = undefined;
|
|
367
|
+
expect(() => {
|
|
368
|
+
BaseAppAccount.clearAllStoredData(TEST_WALLET_ADDRESS);
|
|
369
|
+
}).toThrow('clearAllStoredData requires a storage to be provided outside of browser environments');
|
|
370
|
+
// Restore window
|
|
371
|
+
global.window = originalWindow;
|
|
372
|
+
});
|
|
373
|
+
});
|
|
374
|
+
describe('payment functionality', () => {
|
|
375
|
+
it('should make payment using the ephemeral wallet', async () => {
|
|
376
|
+
// Pre-store valid data
|
|
377
|
+
const permission = mockSpendPermission();
|
|
378
|
+
const storageKey = getStorageKey(TEST_WALLET_ADDRESS);
|
|
379
|
+
mockStorage.set(storageKey, JSON.stringify({
|
|
380
|
+
privateKey: TEST_PRIVATE_KEY,
|
|
381
|
+
permission
|
|
382
|
+
}));
|
|
383
|
+
const bundlerClient = mockBundlerClient();
|
|
384
|
+
const smartAccount = mockSmartAccount();
|
|
385
|
+
const spendCalls = mockSpendCalls();
|
|
386
|
+
await setupInitializationMocks({ bundlerClient, smartAccount });
|
|
387
|
+
const { prepareSpendCallData } = await setupPaymentMocks({ spendCalls });
|
|
388
|
+
// Initialize account
|
|
389
|
+
const account = await BaseAppAccount.initialize({
|
|
390
|
+
walletAddress: TEST_WALLET_ADDRESS,
|
|
391
|
+
apiKey: TEST_API_KEY,
|
|
392
|
+
appName: 'Test App',
|
|
393
|
+
storage: mockStorage
|
|
394
|
+
});
|
|
395
|
+
// Make a payment
|
|
396
|
+
const paymentMaker = account.paymentMakers.base;
|
|
397
|
+
const amount = new BigNumber(1.5); // 1.5 USDC
|
|
398
|
+
const txHash = await paymentMaker.makePayment(amount, 'USDC', TEST_RECEIVER_ADDRESS, 'test payment');
|
|
399
|
+
// Verify payment was made
|
|
400
|
+
expect(txHash).toBe('0xtxhash');
|
|
401
|
+
expect(prepareSpendCallData).toHaveBeenCalledWith(permission, 1500000n); // 1.5 USDC in smallest units
|
|
402
|
+
expect(bundlerClient.sendUserOperation).toHaveBeenCalledWith({
|
|
403
|
+
account: smartAccount,
|
|
404
|
+
calls: [
|
|
405
|
+
// Spend permission calls
|
|
406
|
+
{ to: '0xcontract1', data: '0xdata1', value: 0n },
|
|
407
|
+
{ to: '0xcontract2', data: '0xdata2', value: 0n },
|
|
408
|
+
// Transfer call
|
|
409
|
+
{
|
|
410
|
+
to: USDC_CONTRACT_ADDRESS_BASE,
|
|
411
|
+
data: expect.any(String), // Encoded transfer function
|
|
412
|
+
value: 0n
|
|
413
|
+
}
|
|
414
|
+
],
|
|
415
|
+
maxPriorityFeePerGas: expect.any(BigInt)
|
|
416
|
+
});
|
|
417
|
+
});
|
|
418
|
+
});
|
|
419
|
+
});
|
|
420
|
+
//# sourceMappingURL=baseAppAccount.ephemeral.test.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"baseAppAccount.ephemeral.test.js","sourceRoot":"","sources":["../src/baseAppAccount.ephemeral.test.ts"],"names":[],"mappings":"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"}
|
package/dist/baseAppAccount.js
CHANGED
|
@@ -1,5 +1,6 @@
|
|
|
1
1
|
import { USDC_CONTRACT_ADDRESS_BASE } from '@atxp/client';
|
|
2
2
|
import { BaseAppPaymentMaker } from './baseAppPaymentMaker.js';
|
|
3
|
+
import { MainWalletPaymentMaker } from './mainWalletPaymentMaker.js';
|
|
3
4
|
import { generatePrivateKey } from 'viem/accounts';
|
|
4
5
|
import { base } from 'viem/chains';
|
|
5
6
|
import { BrowserStorage, IntermediaryStorage } from './storage.js';
|
|
@@ -16,12 +17,8 @@ export class BaseAppAccount {
|
|
|
16
17
|
}
|
|
17
18
|
static async initialize(config) {
|
|
18
19
|
const logger = config.logger || new ConsoleLogger();
|
|
19
|
-
//
|
|
20
|
-
|
|
21
|
-
throw new Error('Smart wallet API key is required. ' +
|
|
22
|
-
'Get your API key from https://portal.cdp.coinbase.com/');
|
|
23
|
-
}
|
|
24
|
-
// Initialize Base SDK - this must happen before any spend permission operations
|
|
20
|
+
const useEphemeralWallet = config.useEphemeralWallet ?? true; // Default to true for backward compatibility
|
|
21
|
+
// Initialize Base SDK
|
|
25
22
|
const sdk = createBaseAccountSDK({
|
|
26
23
|
appName: config?.appName,
|
|
27
24
|
appChainIds: [base.id],
|
|
@@ -39,6 +36,18 @@ export class BaseAppAccount {
|
|
|
39
36
|
// Continue if wallet_connect is not supported
|
|
40
37
|
logger.warn(`wallet_connect not supported, continuing with initialization. ${error}`);
|
|
41
38
|
}
|
|
39
|
+
// If using main wallet mode, return early with main wallet payment maker
|
|
40
|
+
if (!useEphemeralWallet) {
|
|
41
|
+
logger.info(`Using main wallet mode for address: ${config.walletAddress}`);
|
|
42
|
+
return new BaseAppAccount(null, // No spend permission in main wallet mode
|
|
43
|
+
null, // No ephemeral wallet in main wallet mode
|
|
44
|
+
logger, config.walletAddress, provider);
|
|
45
|
+
}
|
|
46
|
+
// Validate smart wallet configuration for ephemeral mode
|
|
47
|
+
if (!config.apiKey) {
|
|
48
|
+
throw new Error('Smart wallet API key is required for ephemeral wallet mode. ' +
|
|
49
|
+
'Get your API key from https://portal.cdp.coinbase.com/');
|
|
50
|
+
}
|
|
42
51
|
// Initialize storage
|
|
43
52
|
const baseStorage = config?.storage || new BrowserStorage();
|
|
44
53
|
const storage = new IntermediaryStorage(baseStorage);
|
|
@@ -96,20 +105,38 @@ export class BaseAppAccount {
|
|
|
96
105
|
throw new Error(`Smart wallet deployment failed. Receipt: ${JSON.stringify(receipt)}`);
|
|
97
106
|
}
|
|
98
107
|
}
|
|
99
|
-
constructor(spendPermission, ephemeralSmartWallet, logger) {
|
|
100
|
-
if (
|
|
101
|
-
|
|
108
|
+
constructor(spendPermission, ephemeralSmartWallet, logger, mainWalletAddress, provider) {
|
|
109
|
+
if (ephemeralSmartWallet) {
|
|
110
|
+
// Ephemeral wallet mode
|
|
111
|
+
if (!spendPermission) {
|
|
112
|
+
throw new Error('Spend permission is required for ephemeral wallet mode');
|
|
113
|
+
}
|
|
114
|
+
this.accountId = ephemeralSmartWallet.address;
|
|
115
|
+
this.paymentMakers = {
|
|
116
|
+
'base': new BaseAppPaymentMaker(spendPermission, ephemeralSmartWallet, logger),
|
|
117
|
+
};
|
|
118
|
+
}
|
|
119
|
+
else {
|
|
120
|
+
// Main wallet mode
|
|
121
|
+
if (!mainWalletAddress || !provider) {
|
|
122
|
+
throw new Error('Main wallet address and provider are required for main wallet mode');
|
|
123
|
+
}
|
|
124
|
+
this.accountId = mainWalletAddress;
|
|
125
|
+
this.paymentMakers = {
|
|
126
|
+
'base': new MainWalletPaymentMaker(mainWalletAddress, provider, logger),
|
|
127
|
+
};
|
|
102
128
|
}
|
|
103
|
-
this.accountId = ephemeralSmartWallet.address;
|
|
104
|
-
this.paymentMakers = {
|
|
105
|
-
'base': new BaseAppPaymentMaker(spendPermission, ephemeralSmartWallet, logger),
|
|
106
|
-
};
|
|
107
129
|
}
|
|
108
130
|
static clearAllStoredData(userWalletAddress, storage) {
|
|
109
|
-
|
|
110
|
-
|
|
131
|
+
// In non-browser environments, require an explicit storage parameter
|
|
132
|
+
if (!storage) {
|
|
133
|
+
const browserStorage = new BrowserStorage();
|
|
134
|
+
// Check if BrowserStorage would work (i.e., we're in a browser)
|
|
135
|
+
if (typeof window === 'undefined') {
|
|
136
|
+
throw new Error('clearAllStoredData requires a storage to be provided outside of browser environments');
|
|
137
|
+
}
|
|
138
|
+
storage = browserStorage;
|
|
111
139
|
}
|
|
112
|
-
storage = storage || new BrowserStorage();
|
|
113
140
|
storage.delete(this.toStorageKey(userWalletAddress));
|
|
114
141
|
}
|
|
115
142
|
}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"baseAppAccount.js","sourceRoot":"","sources":["../src/baseAppAccount.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,0BAA0B,EAAE,MAAM,cAAc,CAAC;AAC1D,OAAO,EAAE,mBAAmB,EAAE,MAAM,0BAA0B,CAAC;AAC/D,OAAO,EAAE,kBAAkB,EAAE,MAAM,eAAe,CAAC;AACnD,OAAO,EAAE,IAAI,EAAE,MAAM,aAAa,CAAC;AAGnC,OAAO,EAAY,cAAc,EAAE,mBAAmB,EAAqB,MAAM,cAAc,CAAC;AAChG,OAAO,EAAE,sBAAsB,EAA6B,MAAM,yBAAyB,CAAC;AAC5F,OAAO,EAAE,aAAa,EAAU,MAAM,cAAc,CAAC;AACrD,OAAO,EAAE,oBAAoB,EAAE,MAAM,mBAAmB,CAAC;AACzD,OAAO,EAAE,sBAAsB,EAAE,MAAM,oCAAoC,CAAC;AAE5E,MAAM,iBAAiB,GAAG,GAAG,CAAC;AAC9B,MAAM,sBAAsB,GAAG,CAAC,CAAC;AACjC,MAAM,aAAa,GAAG,iFAAiF,CAAC;AAExG,MAAM,OAAO,cAAc;IAIjB,MAAM,CAAC,YAAY,CAAC,iBAAyB;QACnD,OAAO,wBAAwB,iBAAiB,EAAE,CAAC;IACrD,CAAC;IAED,MAAM,CAAC,KAAK,CAAC,UAAU,CAAC,
|
|
1
|
+
{"version":3,"file":"baseAppAccount.js","sourceRoot":"","sources":["../src/baseAppAccount.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"baseAppAccount.mainWallet.test.d.ts","sourceRoot":"","sources":["../src/baseAppAccount.mainWallet.test.ts"],"names":[],"mappings":""}
|