@account-kit/wallet-client 0.1.0-alpha.1 → 0.1.0-alpha.11

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 (258) hide show
  1. package/dist/esm/client/actions/createAccount.d.ts +27 -2
  2. package/dist/esm/client/actions/createAccount.js +25 -0
  3. package/dist/esm/client/actions/createAccount.js.map +1 -1
  4. package/dist/esm/client/actions/formatSign.d.ts +28 -0
  5. package/dist/esm/client/actions/formatSign.js +30 -0
  6. package/dist/esm/client/actions/formatSign.js.map +1 -0
  7. package/dist/esm/client/actions/getCallsStatus.d.ts +22 -4
  8. package/dist/esm/client/actions/getCallsStatus.js +19 -0
  9. package/dist/esm/client/actions/getCallsStatus.js.map +1 -1
  10. package/dist/esm/client/actions/grantPermissions.d.ts +63 -6
  11. package/dist/esm/client/actions/grantPermissions.js +63 -3
  12. package/dist/esm/client/actions/grantPermissions.js.map +1 -1
  13. package/dist/esm/client/actions/listAccounts.d.ts +32 -4
  14. package/dist/esm/client/actions/listAccounts.js +35 -2
  15. package/dist/esm/client/actions/listAccounts.js.map +1 -1
  16. package/dist/esm/client/actions/prepareCalls.d.ts +32 -6
  17. package/dist/esm/client/actions/prepareCalls.js +39 -5
  18. package/dist/esm/client/actions/prepareCalls.js.map +1 -1
  19. package/dist/esm/client/actions/prepareSign.d.ts +25 -0
  20. package/dist/esm/client/actions/prepareSign.js +28 -0
  21. package/dist/esm/client/actions/prepareSign.js.map +1 -0
  22. package/dist/esm/client/actions/requestAccount.d.ts +24 -6
  23. package/dist/esm/client/actions/requestAccount.js +38 -7
  24. package/dist/esm/client/actions/requestAccount.js.map +1 -1
  25. package/dist/esm/client/actions/sendPreparedCalls.d.ts +33 -4
  26. package/dist/esm/client/actions/sendPreparedCalls.js +37 -1
  27. package/dist/esm/client/actions/sendPreparedCalls.js.map +1 -1
  28. package/dist/esm/client/actions/signMessage.d.ts +25 -5
  29. package/dist/esm/client/actions/signMessage.js +22 -2
  30. package/dist/esm/client/actions/signMessage.js.map +1 -1
  31. package/dist/esm/client/actions/signPreparedCalls.d.ts +14 -0
  32. package/dist/esm/client/actions/signPreparedCalls.js +43 -0
  33. package/dist/esm/client/actions/signPreparedCalls.js.map +1 -0
  34. package/dist/esm/client/actions/signSignatureRequest.d.ts +39 -5
  35. package/dist/esm/client/actions/signSignatureRequest.js +69 -11
  36. package/dist/esm/client/actions/signSignatureRequest.js.map +1 -1
  37. package/dist/esm/client/actions/signTypedData.d.ts +37 -4
  38. package/dist/esm/client/actions/signTypedData.js +34 -1
  39. package/dist/esm/client/actions/signTypedData.js.map +1 -1
  40. package/dist/esm/client/client.e2e-test.js +249 -45
  41. package/dist/esm/client/client.e2e-test.js.map +1 -1
  42. package/dist/esm/client/decorator.d.ts +12 -8
  43. package/dist/esm/client/decorator.js +5 -3
  44. package/dist/esm/client/decorator.js.map +1 -1
  45. package/dist/esm/client/index.d.ts +38 -12
  46. package/dist/esm/client/index.js +0 -3
  47. package/dist/esm/client/index.js.map +1 -1
  48. package/dist/esm/exports/index.d.ts +5 -6
  49. package/dist/esm/exports/index.js +4 -6
  50. package/dist/esm/exports/index.js.map +1 -1
  51. package/dist/esm/exports/internal.d.ts +1 -10
  52. package/dist/esm/exports/internal.js +0 -12
  53. package/dist/esm/exports/internal.js.map +1 -1
  54. package/dist/esm/internal/decorator.d.ts +2 -0
  55. package/dist/esm/internal/decorator.js +10 -0
  56. package/dist/esm/internal/decorator.js.map +1 -0
  57. package/dist/esm/isomorphic/actions/createSession.d.ts +1 -2
  58. package/dist/esm/isomorphic/actions/createSession.js +40 -11
  59. package/dist/esm/isomorphic/actions/createSession.js.map +1 -1
  60. package/dist/esm/isomorphic/actions/formatSign.d.ts +8 -0
  61. package/dist/esm/isomorphic/actions/formatSign.js +42 -0
  62. package/dist/esm/isomorphic/actions/formatSign.js.map +1 -0
  63. package/dist/esm/isomorphic/actions/getCallsStatus.d.ts +1 -15
  64. package/dist/esm/isomorphic/actions/getCallsStatus.js +38 -27
  65. package/dist/esm/isomorphic/actions/getCallsStatus.js.map +1 -1
  66. package/dist/esm/isomorphic/actions/prepareCalls.d.ts +1 -2
  67. package/dist/esm/isomorphic/actions/prepareCalls.js +78 -20
  68. package/dist/esm/isomorphic/actions/prepareCalls.js.map +1 -1
  69. package/dist/esm/isomorphic/actions/prepareSign.d.ts +7 -0
  70. package/dist/esm/isomorphic/actions/prepareSign.js +49 -0
  71. package/dist/esm/isomorphic/actions/prepareSign.js.map +1 -0
  72. package/dist/esm/isomorphic/actions/sendPreparedCalls.d.ts +3 -4
  73. package/dist/esm/isomorphic/actions/sendPreparedCalls.js +165 -25
  74. package/dist/esm/isomorphic/actions/sendPreparedCalls.js.map +1 -1
  75. package/dist/esm/isomorphic/client.d.ts +204 -27
  76. package/dist/esm/isomorphic/client.js +6 -2
  77. package/dist/esm/isomorphic/client.js.map +1 -1
  78. package/dist/esm/isomorphic/utils/7702.d.ts +19 -0
  79. package/dist/esm/isomorphic/utils/7702.js +70 -0
  80. package/dist/esm/isomorphic/utils/7702.js.map +1 -0
  81. package/dist/esm/isomorphic/utils/createAccount.d.ts +5 -4
  82. package/dist/esm/isomorphic/utils/createAccount.js +84 -10
  83. package/dist/esm/isomorphic/utils/createAccount.js.map +1 -1
  84. package/dist/esm/isomorphic/utils/createDummySigner.js +3 -3
  85. package/dist/esm/isomorphic/utils/createDummySigner.js.map +1 -1
  86. package/dist/esm/isomorphic/utils/decodeSignature.d.ts +3 -0
  87. package/dist/esm/isomorphic/utils/decodeSignature.js +15 -0
  88. package/dist/esm/isomorphic/utils/decodeSignature.js.map +1 -0
  89. package/dist/esm/isomorphic/utils/parsePermissionsContext.d.ts +6 -5
  90. package/dist/esm/isomorphic/utils/parsePermissionsContext.js +19 -6
  91. package/dist/esm/isomorphic/utils/parsePermissionsContext.js.map +1 -1
  92. package/dist/esm/isomorphic/utils/supportsFeature.d.ts +4 -0
  93. package/dist/esm/isomorphic/utils/supportsFeature.js +21 -0
  94. package/dist/esm/isomorphic/utils/supportsFeature.js.map +1 -0
  95. package/dist/esm/local/client.d.ts +3 -3
  96. package/dist/esm/local/client.js +11 -4
  97. package/dist/esm/local/client.js.map +1 -1
  98. package/dist/esm/remote/client.d.ts +9 -3
  99. package/dist/esm/remote/client.js +10 -11
  100. package/dist/esm/remote/client.js.map +1 -1
  101. package/dist/esm/types.d.ts +27 -13
  102. package/dist/esm/types.js.map +1 -1
  103. package/dist/esm/utils.d.ts +1 -0
  104. package/dist/esm/utils.js.map +1 -1
  105. package/dist/types/client/actions/createAccount.d.ts +27 -2
  106. package/dist/types/client/actions/createAccount.d.ts.map +1 -1
  107. package/dist/types/client/actions/formatSign.d.ts +29 -0
  108. package/dist/types/client/actions/formatSign.d.ts.map +1 -0
  109. package/dist/types/client/actions/getCallsStatus.d.ts +22 -4
  110. package/dist/types/client/actions/getCallsStatus.d.ts.map +1 -1
  111. package/dist/types/client/actions/grantPermissions.d.ts +63 -6
  112. package/dist/types/client/actions/grantPermissions.d.ts.map +1 -1
  113. package/dist/types/client/actions/listAccounts.d.ts +32 -4
  114. package/dist/types/client/actions/listAccounts.d.ts.map +1 -1
  115. package/dist/types/client/actions/prepareCalls.d.ts +32 -6
  116. package/dist/types/client/actions/prepareCalls.d.ts.map +1 -1
  117. package/dist/types/client/actions/prepareSign.d.ts +26 -0
  118. package/dist/types/client/actions/prepareSign.d.ts.map +1 -0
  119. package/dist/types/client/actions/requestAccount.d.ts +24 -6
  120. package/dist/types/client/actions/requestAccount.d.ts.map +1 -1
  121. package/dist/types/client/actions/sendPreparedCalls.d.ts +33 -4
  122. package/dist/types/client/actions/sendPreparedCalls.d.ts.map +1 -1
  123. package/dist/types/client/actions/signMessage.d.ts +25 -5
  124. package/dist/types/client/actions/signMessage.d.ts.map +1 -1
  125. package/dist/types/client/actions/signPreparedCalls.d.ts +15 -0
  126. package/dist/types/client/actions/signPreparedCalls.d.ts.map +1 -0
  127. package/dist/types/client/actions/signSignatureRequest.d.ts +39 -5
  128. package/dist/types/client/actions/signSignatureRequest.d.ts.map +1 -1
  129. package/dist/types/client/actions/signTypedData.d.ts +37 -4
  130. package/dist/types/client/actions/signTypedData.d.ts.map +1 -1
  131. package/dist/types/client/decorator.d.ts +12 -8
  132. package/dist/types/client/decorator.d.ts.map +1 -1
  133. package/dist/types/client/index.d.ts +38 -12
  134. package/dist/types/client/index.d.ts.map +1 -1
  135. package/dist/types/exports/index.d.ts +5 -6
  136. package/dist/types/exports/index.d.ts.map +1 -1
  137. package/dist/types/exports/internal.d.ts +1 -10
  138. package/dist/types/exports/internal.d.ts.map +1 -1
  139. package/dist/types/internal/decorator.d.ts +3 -0
  140. package/dist/types/internal/decorator.d.ts.map +1 -0
  141. package/dist/types/isomorphic/actions/createSession.d.ts +1 -2
  142. package/dist/types/isomorphic/actions/createSession.d.ts.map +1 -1
  143. package/dist/types/isomorphic/actions/formatSign.d.ts +9 -0
  144. package/dist/types/isomorphic/actions/formatSign.d.ts.map +1 -0
  145. package/dist/types/isomorphic/actions/getCallsStatus.d.ts +1 -15
  146. package/dist/types/isomorphic/actions/getCallsStatus.d.ts.map +1 -1
  147. package/dist/types/isomorphic/actions/prepareCalls.d.ts +1 -2
  148. package/dist/types/isomorphic/actions/prepareCalls.d.ts.map +1 -1
  149. package/dist/types/isomorphic/actions/prepareSign.d.ts +8 -0
  150. package/dist/types/isomorphic/actions/prepareSign.d.ts.map +1 -0
  151. package/dist/types/isomorphic/actions/sendPreparedCalls.d.ts +3 -4
  152. package/dist/types/isomorphic/actions/sendPreparedCalls.d.ts.map +1 -1
  153. package/dist/types/isomorphic/client.d.ts +204 -27
  154. package/dist/types/isomorphic/client.d.ts.map +1 -1
  155. package/dist/types/isomorphic/utils/7702.d.ts +20 -0
  156. package/dist/types/isomorphic/utils/7702.d.ts.map +1 -0
  157. package/dist/types/isomorphic/utils/createAccount.d.ts +5 -4
  158. package/dist/types/isomorphic/utils/createAccount.d.ts.map +1 -1
  159. package/dist/types/isomorphic/utils/createDummySigner.d.ts.map +1 -1
  160. package/dist/types/isomorphic/utils/decodeSignature.d.ts +4 -0
  161. package/dist/types/isomorphic/utils/decodeSignature.d.ts.map +1 -0
  162. package/dist/types/isomorphic/utils/parsePermissionsContext.d.ts +6 -5
  163. package/dist/types/isomorphic/utils/parsePermissionsContext.d.ts.map +1 -1
  164. package/dist/types/isomorphic/utils/supportsFeature.d.ts +5 -0
  165. package/dist/types/isomorphic/utils/supportsFeature.d.ts.map +1 -0
  166. package/dist/types/local/client.d.ts +3 -3
  167. package/dist/types/local/client.d.ts.map +1 -1
  168. package/dist/types/remote/client.d.ts +9 -3
  169. package/dist/types/remote/client.d.ts.map +1 -1
  170. package/dist/types/types.d.ts +27 -13
  171. package/dist/types/types.d.ts.map +1 -1
  172. package/dist/types/utils.d.ts +1 -0
  173. package/dist/types/utils.d.ts.map +1 -1
  174. package/package.json +9 -6
  175. package/src/client/actions/createAccount.ts +27 -2
  176. package/src/client/actions/formatSign.ts +53 -0
  177. package/src/client/actions/getCallsStatus.ts +21 -12
  178. package/src/client/actions/grantPermissions.ts +69 -26
  179. package/src/client/actions/listAccounts.ts +44 -6
  180. package/src/client/actions/prepareCalls.ts +46 -26
  181. package/src/client/actions/prepareSign.ts +46 -0
  182. package/src/client/actions/requestAccount.ts +60 -41
  183. package/src/client/actions/sendPreparedCalls.ts +44 -7
  184. package/src/client/actions/signMessage.ts +26 -21
  185. package/src/client/actions/signPreparedCalls.ts +67 -0
  186. package/src/client/actions/signSignatureRequest.ts +84 -20
  187. package/src/client/actions/signTypedData.ts +40 -19
  188. package/src/client/client.e2e-test.ts +408 -127
  189. package/src/client/decorator.ts +28 -26
  190. package/src/client/index.ts +50 -40
  191. package/src/exports/index.ts +5 -13
  192. package/src/exports/internal.ts +2 -10
  193. package/src/internal/decorator.ts +12 -0
  194. package/src/isomorphic/actions/createSession.ts +56 -13
  195. package/src/isomorphic/actions/formatSign.ts +76 -0
  196. package/src/isomorphic/actions/getCallsStatus.ts +47 -33
  197. package/src/isomorphic/actions/prepareCalls.ts +95 -23
  198. package/src/isomorphic/actions/prepareSign.ts +88 -0
  199. package/src/isomorphic/actions/sendPreparedCalls.ts +218 -42
  200. package/src/isomorphic/client.ts +10 -2
  201. package/src/isomorphic/utils/7702.ts +135 -0
  202. package/src/isomorphic/utils/createAccount.ts +101 -13
  203. package/src/isomorphic/utils/createDummySigner.ts +3 -2
  204. package/src/isomorphic/utils/decodeSignature.ts +21 -0
  205. package/src/isomorphic/utils/parsePermissionsContext.ts +29 -11
  206. package/src/isomorphic/utils/supportsFeature.ts +34 -0
  207. package/src/local/client.ts +58 -55
  208. package/src/remote/client.ts +19 -19
  209. package/src/types.ts +29 -23
  210. package/src/utils.ts +2 -0
  211. package/dist/esm/capabilities/index.d.ts +0 -31
  212. package/dist/esm/capabilities/index.js +0 -10
  213. package/dist/esm/capabilities/index.js.map +0 -1
  214. package/dist/esm/capabilities/overrides.d.ts +0 -26
  215. package/dist/esm/capabilities/overrides.js +0 -14
  216. package/dist/esm/capabilities/overrides.js.map +0 -1
  217. package/dist/esm/capabilities/paymaster.d.ts +0 -3
  218. package/dist/esm/capabilities/paymaster.js +0 -5
  219. package/dist/esm/capabilities/paymaster.js.map +0 -1
  220. package/dist/esm/capabilities/permissions/index.d.ts +0 -138
  221. package/dist/esm/capabilities/permissions/index.js +0 -71
  222. package/dist/esm/capabilities/permissions/index.js.map +0 -1
  223. package/dist/esm/capabilities/permissions/mav2.d.ts +0 -36
  224. package/dist/esm/capabilities/permissions/mav2.js +0 -79
  225. package/dist/esm/capabilities/permissions/mav2.js.map +0 -1
  226. package/dist/esm/rpc/request.d.ts +0 -352
  227. package/dist/esm/rpc/request.js +0 -204
  228. package/dist/esm/rpc/request.js.map +0 -1
  229. package/dist/esm/rpc/schema.d.ts +0 -342
  230. package/dist/esm/rpc/schema.js +0 -5
  231. package/dist/esm/rpc/schema.js.map +0 -1
  232. package/dist/esm/schemas.d.ts +0 -216
  233. package/dist/esm/schemas.js +0 -211
  234. package/dist/esm/schemas.js.map +0 -1
  235. package/dist/types/capabilities/index.d.ts +0 -32
  236. package/dist/types/capabilities/index.d.ts.map +0 -1
  237. package/dist/types/capabilities/overrides.d.ts +0 -27
  238. package/dist/types/capabilities/overrides.d.ts.map +0 -1
  239. package/dist/types/capabilities/paymaster.d.ts +0 -4
  240. package/dist/types/capabilities/paymaster.d.ts.map +0 -1
  241. package/dist/types/capabilities/permissions/index.d.ts +0 -139
  242. package/dist/types/capabilities/permissions/index.d.ts.map +0 -1
  243. package/dist/types/capabilities/permissions/mav2.d.ts +0 -37
  244. package/dist/types/capabilities/permissions/mav2.d.ts.map +0 -1
  245. package/dist/types/rpc/request.d.ts +0 -353
  246. package/dist/types/rpc/request.d.ts.map +0 -1
  247. package/dist/types/rpc/schema.d.ts +0 -343
  248. package/dist/types/rpc/schema.d.ts.map +0 -1
  249. package/dist/types/schemas.d.ts +0 -217
  250. package/dist/types/schemas.d.ts.map +0 -1
  251. package/src/capabilities/index.ts +0 -13
  252. package/src/capabilities/overrides.ts +0 -20
  253. package/src/capabilities/paymaster.ts +0 -5
  254. package/src/capabilities/permissions/index.ts +0 -142
  255. package/src/capabilities/permissions/mav2.ts +0 -127
  256. package/src/rpc/request.ts +0 -273
  257. package/src/rpc/schema.ts +0 -40
  258. package/src/schemas.ts +0 -257
@@ -1,9 +1,9 @@
1
1
  import { LocalAccountSigner } from "@aa-sdk/core";
2
2
  import { alchemy, arbitrumSepolia } from "@account-kit/infra";
3
3
  import { describe, expect, it } from "bun:test";
4
- import { createPublicClient, zeroAddress, type Address } from "viem";
5
- import { signSignatureRequest } from "./actions/signSignatureRequest.js";
6
- import { createSmartWalletClient } from "./index.js";
4
+ import { createPublicClient, zeroAddress, type Address, type Hex } from "viem";
5
+ import { createSmartWalletClient, type SmartWalletClient } from "./index.js";
6
+ import { sleep } from "bun";
7
7
 
8
8
  describe("Client E2E Tests", () => {
9
9
  const transport = alchemy(
@@ -17,7 +17,7 @@ describe("Client E2E Tests", () => {
17
17
  );
18
18
  describe("Local Mode Tests", () => {
19
19
  const signer = LocalAccountSigner.privateKeyToAccountSigner(
20
- "0xac0974bec39a17e36ba4a6b4d238ff944bacb478cbed5efcae784d7bf4f2ff81",
20
+ "0xbaca22d9b6846ec09a4da378ffa07e2f14ce7d65675d135911b6fd281416bb03",
21
21
  );
22
22
 
23
23
  const client = createSmartWalletClient({
@@ -35,21 +35,38 @@ describe("Client E2E Tests", () => {
35
35
  it("should successfully get a counterfactual address", async () => {
36
36
  const account = await client.requestAccount();
37
37
  expect(account.address).toMatchInlineSnapshot(
38
- `"0x26809de7733F9CcB5c0c61210a4f78d6F1daFc58"`,
38
+ `"0xa46944b7a39c35d931D514ACAc3ac77c226a81ff"`,
39
39
  );
40
40
  });
41
41
 
42
+ it("should successfully request account with different salt", async () => {
43
+ const account = await client.requestAccount({
44
+ id: "f4c1d956-24ef-4002-a141-2c9d6d92af1a",
45
+ creationHint: { salt: "0x1" },
46
+ });
47
+
48
+ expect(account.address).toMatchInlineSnapshot(
49
+ `"0xA692f0E5AfAD20F771443D89C635146C6A592f06"`,
50
+ );
51
+ });
52
+
53
+ it("should not cache account if different inputs provided", async () => {
54
+ const account = await client.requestAccount();
55
+ const account2 = await client.requestAccount({
56
+ id: "52ab44be-b03e-47ed-ad65-43014ea5fbfc",
57
+ creationHint: { salt: "0x2" },
58
+ });
59
+
60
+ expect(account.address).not.toEqual(account2.address);
61
+ });
62
+
42
63
  it("can correctly sign a message", async () => {
43
64
  const account = await client.requestAccount();
44
65
  const message = "hello world";
45
- const signature = await client.signMessage(message);
46
- const publicClient = createPublicClient({
47
- chain: arbitrumSepolia,
48
- transport,
49
- });
66
+ const signature = await client.signMessage({ message });
50
67
  const isValid = await publicClient.verifyMessage({
51
68
  address: account.address,
52
- message: "hello world",
69
+ message,
53
70
  signature,
54
71
  });
55
72
  expect(isValid).toBeTrue();
@@ -66,83 +83,171 @@ describe("Client E2E Tests", () => {
66
83
  expect(isValid).toBeTrue();
67
84
  });
68
85
 
69
- it("should successfully send a UO with paymaster", async () => {
70
- const account = await client.requestAccount();
71
- const preparedUO = await client.prepareCalls({
72
- calls: [{ to: zeroAddress, value: "0x0" }],
73
- from: account.address,
74
- capabilities: {
75
- paymasterService: {
76
- policyId: process.env.TEST_PAYMASTER_POLICY_ID!,
77
- },
78
- },
86
+ it("can correctly sign a message with a different account", async () => {
87
+ const account = await client.requestAccount({
88
+ id: "f4c1d956-24ef-4002-a141-2c9d6d92af1a",
89
+ creationHint: { salt: "0x1" },
79
90
  });
91
+ const message = "hello world";
80
92
 
81
- if (preparedUO.signatureRequest.type !== "personal_sign") {
82
- throw new Error("Invalid signature request type");
83
- }
84
-
85
- const signature = await signer.signMessage(
86
- preparedUO.signatureRequest.data,
87
- );
93
+ const signature = await client.signMessage({
94
+ message,
95
+ account: account.address,
96
+ });
97
+ const isValid = await publicClient.verifyMessage({
98
+ address: account.address,
99
+ message,
100
+ signature,
101
+ });
102
+ expect(isValid).toBeTrue();
103
+ });
88
104
 
89
- const result = await client.sendPreparedCalls({
90
- ...preparedUO,
91
- signature: {
92
- type: "ecdsa",
93
- signature,
94
- },
105
+ it("can correctly sign typed data with a different account", async () => {
106
+ const account = await client.requestAccount({
107
+ id: "f4c1d956-24ef-4002-a141-2c9d6d92af1a",
108
+ creationHint: { salt: "0x1" },
95
109
  });
96
110
 
97
- expect(result.preparedCallIds).toBeArrayOfSize(1);
111
+ const signature = await client.signTypedData({
112
+ ...givenTypedData,
113
+ account: account.address,
114
+ });
115
+ const isValid = await publicClient.verifyTypedData({
116
+ ...givenTypedData,
117
+ signature,
118
+ address: account.address,
119
+ });
120
+ expect(isValid).toBeTrue();
98
121
  });
99
122
 
100
- it("should successfully create a session with grantPermissions and send a UO", async () => {
101
- const account = await client.requestAccount();
123
+ it(
124
+ "should successfully send a UO with paymaster using 7702",
125
+ async () => {
126
+ const _signer = LocalAccountSigner.privateKeyToAccountSigner(
127
+ "0x49daf21e92c997093e9ffdf7e7ddbf8970e9eadc5d4847d0f690db25d5128e1f",
128
+ );
129
+
130
+ const _client = createSmartWalletClient({
131
+ transport,
132
+ chain: arbitrumSepolia,
133
+ mode: "local",
134
+ signer: _signer,
135
+ });
136
+
137
+ const account = await _client.requestAccount({
138
+ creationHint: {
139
+ accountType: "7702",
140
+ },
141
+ });
142
+
143
+ const preparedCalls = await _client.prepareCalls({
144
+ calls: [{ to: zeroAddress, value: "0x0" }],
145
+ from: account.address,
146
+ capabilities: {
147
+ paymasterService: {
148
+ policyId: process.env.TEST_PAYMASTER_POLICY_ID!,
149
+ },
150
+ },
151
+ });
102
152
 
103
- const sessionKey = LocalAccountSigner.generatePrivateKeySigner();
153
+ const signedCalls = await _client.signPreparedCalls(preparedCalls);
104
154
 
105
- const permissions = await client.grantPermissions({
106
- account: account.address,
107
- expiry: Math.floor(Date.now() / 1000) + 60 * 60,
108
- key: {
109
- publicKey: await sessionKey.getAddress(),
110
- type: "secp256k1",
111
- },
112
- permissions: [{ type: "root" }],
113
- });
155
+ const result = await _client.sendPreparedCalls(signedCalls);
156
+
157
+ expect(result.preparedCallIds).toBeArrayOfSize(1);
114
158
 
115
- const preparedUO = await client.prepareCalls({
116
- calls: [{ to: zeroAddress, value: "0x0" }],
117
- from: account.address,
118
- capabilities: {
119
- paymasterService: {
120
- policyId: process.env.TEST_PAYMASTER_POLICY_ID!,
159
+ await waitForUserOpSuccess(client, result.preparedCallIds[0]);
160
+ },
161
+ {
162
+ timeout: 45_000,
163
+ },
164
+ );
165
+
166
+ it(
167
+ "should successfully send a UO with paymaster",
168
+ async () => {
169
+ const account = await client.requestAccount();
170
+ const preparedCalls = await client.prepareCalls({
171
+ calls: [{ to: zeroAddress, value: "0x0" }],
172
+ from: account.address,
173
+ capabilities: {
174
+ paymasterService: {
175
+ policyId: process.env.TEST_PAYMASTER_POLICY_ID!,
176
+ },
121
177
  },
122
- permissions,
123
- },
124
- });
178
+ });
125
179
 
126
- const signature = await signSignatureRequest(
127
- sessionKey,
128
- preparedUO.signatureRequest,
129
- );
180
+ const signedCalls = await client.signPreparedCalls(preparedCalls);
130
181
 
131
- const result = await client.sendPreparedCalls({
132
- ...preparedUO,
133
- signature,
134
- capabilities: {
135
- permissions,
136
- },
137
- });
182
+ const result = await client.sendPreparedCalls(signedCalls);
138
183
 
139
- expect(result.preparedCallIds).toBeArrayOfSize(1);
140
- });
184
+ expect(result.preparedCallIds).toBeArrayOfSize(1);
185
+
186
+ await waitForUserOpSuccess(client, result.preparedCallIds[0]);
187
+ },
188
+ {
189
+ timeout: 45_000,
190
+ },
191
+ );
192
+
193
+ it(
194
+ "should successfully create a session with grantPermissions and send a UO",
195
+ async () => {
196
+ const account = await client.requestAccount();
197
+
198
+ const sessionKey = LocalAccountSigner.generatePrivateKeySigner();
199
+
200
+ const permissions = await client.grantPermissions({
201
+ account: account.address,
202
+ expirySec: Math.floor(Date.now() / 1000) + 60 * 60,
203
+ key: {
204
+ publicKey: await sessionKey.getAddress(),
205
+ type: "secp256k1",
206
+ },
207
+ permissions: [{ type: "root" }],
208
+ });
209
+
210
+ const sessionKeyClient = createSmartWalletClient({
211
+ transport,
212
+ chain: arbitrumSepolia,
213
+ mode: "local",
214
+ signer: sessionKey,
215
+ });
216
+
217
+ const preparedCalls = await sessionKeyClient.prepareCalls({
218
+ calls: [{ to: zeroAddress, value: "0x0" }],
219
+ from: account.address,
220
+ capabilities: {
221
+ paymasterService: {
222
+ policyId: process.env.TEST_PAYMASTER_POLICY_ID!,
223
+ },
224
+ permissions,
225
+ },
226
+ });
227
+
228
+ const signedCalls =
229
+ await sessionKeyClient.signPreparedCalls(preparedCalls);
230
+
231
+ const result = await sessionKeyClient.sendPreparedCalls({
232
+ ...signedCalls,
233
+ capabilities: {
234
+ permissions,
235
+ },
236
+ });
237
+
238
+ expect(result.preparedCallIds).toBeArrayOfSize(1);
239
+
240
+ await waitForUserOpSuccess(client, result.preparedCallIds[0]);
241
+ },
242
+ {
243
+ timeout: 45_000,
244
+ },
245
+ );
141
246
  });
142
247
 
143
248
  describe("Remote Mode Tests", () => {
144
249
  const signer = LocalAccountSigner.privateKeyToAccountSigner(
145
- "0xac0974bec39a17e36ba4a6b4d238ff944bacb478cbed5efcae784d7bf4f2ff80",
250
+ "0xd7b061ef04d29cf68b3c89356678eccec9988de8d5ed892c19461c4a9d65925d",
146
251
  );
147
252
 
148
253
  const client = createSmartWalletClient({
@@ -160,18 +265,35 @@ describe("Client E2E Tests", () => {
160
265
  it("should successfully get a counterfactual address", async () => {
161
266
  const account = await client.requestAccount();
162
267
  expect(account.address).toMatchInlineSnapshot(
163
- `"0x65b5DE0251f553B2208762a4724303E750294D96"`,
268
+ `"0x76E765e80FFAC96ac10Aa8908a8267A3B80d606D"`,
269
+ );
270
+ });
271
+
272
+ it("should successfully request account with different salt", async () => {
273
+ const account = await client.requestAccount({
274
+ id: "26b375e3-c94a-4e98-b6b7-5a97121aa583",
275
+ creationHint: { salt: "0x1" },
276
+ });
277
+
278
+ expect(account.address).toMatchInlineSnapshot(
279
+ `"0xdfdd407b9569D40BEFa503208753E59cAc9713fA"`,
164
280
  );
165
281
  });
166
282
 
283
+ it("should not cache account if different inputs provided", async () => {
284
+ const account = await client.requestAccount();
285
+ const account2 = await client.requestAccount({
286
+ id: "2a3320b4-6ed2-4833-a488-5188e9bdd9d2",
287
+ creationHint: { salt: "0x2" },
288
+ });
289
+
290
+ expect(account.address).not.toEqual(account2.address);
291
+ });
292
+
167
293
  it("can correctly sign a message", async () => {
168
294
  const account = await client.requestAccount();
169
295
  const message = "hello world";
170
- const signature = await client.signMessage(message);
171
- const publicClient = createPublicClient({
172
- chain: arbitrumSepolia,
173
- transport,
174
- });
296
+ const signature = await client.signMessage({ message });
175
297
  const isValid = await publicClient.verifyMessage({
176
298
  address: account.address,
177
299
  message: "hello world",
@@ -191,71 +313,208 @@ describe("Client E2E Tests", () => {
191
313
  expect(isValid).toBeTrue();
192
314
  });
193
315
 
194
- it("should successfully send a UO with paymaster", async () => {
195
- const account = await client.requestAccount();
196
- const preparedUO = await client.prepareCalls({
197
- calls: [{ to: zeroAddress, value: "0x0" }],
198
- from: account.address,
199
- capabilities: {
200
- paymasterService: {
201
- policyId: process.env.TEST_PAYMASTER_POLICY_ID!,
202
- },
203
- },
316
+ it("can correctly sign a message with a different account", async () => {
317
+ const account = await client.requestAccount({
318
+ id: "26b375e3-c94a-4e98-b6b7-5a97121aa583",
319
+ creationHint: { salt: "0x1" },
204
320
  });
205
321
 
206
- const signature = await client.signSignatureRequest(
207
- preparedUO.signatureRequest,
208
- );
209
-
210
- const result = await client.sendPreparedCalls({
211
- ...preparedUO,
322
+ const message = "hello world";
323
+ const signature = await client.signMessage({
324
+ message,
325
+ account: account.address,
326
+ });
327
+ const isValid = await publicClient.verifyMessage({
328
+ address: account.address,
329
+ message: "hello world",
212
330
  signature,
213
331
  });
214
-
215
- expect(result.preparedCallIds).toBeArrayOfSize(1);
332
+ expect(isValid).toBeTrue();
216
333
  });
217
334
 
218
- it("should successfully create a session with grantPermissions and send a UO", async () => {
219
- const account = await client.requestAccount();
220
-
221
- const sessionKey = LocalAccountSigner.generatePrivateKeySigner();
335
+ it("can correctly sign typed data with a different account", async () => {
336
+ const account = await client.requestAccount({
337
+ id: "26b375e3-c94a-4e98-b6b7-5a97121aa583",
338
+ creationHint: { salt: "0x1" },
339
+ });
222
340
 
223
- const permissions = await client.grantPermissions({
341
+ const signature = await client.signTypedData({
342
+ ...givenTypedData,
224
343
  account: account.address,
225
- expiry: Math.floor(Date.now() / 1000) + 60 * 60,
226
- key: {
227
- publicKey: await sessionKey.getAddress(),
228
- type: "secp256k1",
229
- },
230
- permissions: [{ type: "root" }],
231
344
  });
232
345
 
233
- const preparedUO = await client.prepareCalls({
234
- calls: [{ to: zeroAddress, value: "0x0" }],
235
- from: account.address,
236
- capabilities: {
237
- paymasterService: {
238
- policyId: process.env.TEST_PAYMASTER_POLICY_ID!,
239
- },
240
- permissions,
241
- },
346
+ const isValid = await publicClient.verifyTypedData({
347
+ ...givenTypedData,
348
+ signature,
349
+ address: account.address,
242
350
  });
351
+ expect(isValid).toBeTrue();
352
+ });
243
353
 
244
- const signature = await signSignatureRequest(
245
- sessionKey,
246
- preparedUO.signatureRequest,
247
- );
354
+ it(
355
+ "should successfully send a UO with paymaster",
356
+ async () => {
357
+ const account = await client.requestAccount();
358
+ const preparedCalls = await client.prepareCalls({
359
+ calls: [{ to: zeroAddress, value: "0x0" }],
360
+ from: account.address,
361
+ capabilities: {
362
+ paymasterService: {
363
+ policyId: process.env.TEST_PAYMASTER_POLICY_ID!,
364
+ },
365
+ },
366
+ });
248
367
 
249
- const result = await client.sendPreparedCalls({
250
- ...preparedUO,
251
- signature,
252
- capabilities: {
253
- permissions,
254
- },
255
- });
368
+ const signedCalls = await client.signPreparedCalls(preparedCalls);
256
369
 
257
- expect(result.preparedCallIds).toBeArrayOfSize(1);
258
- });
370
+ const result = await client.sendPreparedCalls(signedCalls);
371
+
372
+ expect(result.preparedCallIds).toBeArrayOfSize(1);
373
+
374
+ await waitForUserOpSuccess(client, result.preparedCallIds[0]);
375
+ },
376
+ {
377
+ timeout: 45_000,
378
+ },
379
+ );
380
+
381
+ it(
382
+ "should successfully drop and replace a UO with repeat calls",
383
+ async () => {
384
+ const account = await client.requestAccount();
385
+ const preparedCalls = await client.prepareCalls({
386
+ calls: [{ to: zeroAddress, value: "0x0" }],
387
+ from: account.address,
388
+ capabilities: {
389
+ paymasterService: {
390
+ policyId: process.env.TEST_PAYMASTER_POLICY_ID!,
391
+ },
392
+ },
393
+ });
394
+
395
+ const signedCalls = await client.signPreparedCalls(preparedCalls);
396
+ const result = await client.sendPreparedCalls(signedCalls);
397
+
398
+ expect(result.preparedCallIds).toBeArrayOfSize(1);
399
+
400
+ await waitForUserOpSuccess(client, result.preparedCallIds[0]);
401
+
402
+ const prepareCalls2 = await client.prepareCalls({
403
+ calls: [{ to: zeroAddress, value: "0x0" }],
404
+ from: account.address,
405
+ capabilities: {
406
+ paymasterService: {
407
+ policyId: process.env.TEST_PAYMASTER_POLICY_ID!,
408
+ },
409
+ },
410
+ });
411
+ const signedCalls2 = await client.signPreparedCalls(prepareCalls2);
412
+ const result2 = await client.sendPreparedCalls(signedCalls2);
413
+
414
+ expect(result2.preparedCallIds).toBeArrayOfSize(1);
415
+
416
+ await waitForUserOpSuccess(client, result2.preparedCallIds[0]);
417
+ },
418
+ {
419
+ timeout: 90_000,
420
+ },
421
+ );
422
+
423
+ it(
424
+ "should successfully send a UO with paymaster using 7702",
425
+ async () => {
426
+ const _signer = LocalAccountSigner.privateKeyToAccountSigner(
427
+ "0x00d35c6d307b5cddeb70aeed96ee27a551fee58bf1a43858477e6c11f9172ba8",
428
+ );
429
+
430
+ const _client = createSmartWalletClient({
431
+ transport,
432
+ chain: arbitrumSepolia,
433
+ mode: "remote",
434
+ signer: _signer,
435
+ });
436
+
437
+ const account = await _client.requestAccount({
438
+ creationHint: {
439
+ accountType: "7702",
440
+ },
441
+ });
442
+ expect(account.address).toBe(await _signer.getAddress());
443
+
444
+ const preparedCalls = await _client.prepareCalls({
445
+ calls: [{ to: zeroAddress, value: "0x0" }],
446
+ from: account.address,
447
+ capabilities: {
448
+ paymasterService: {
449
+ policyId: process.env.TEST_PAYMASTER_POLICY_ID!,
450
+ },
451
+ },
452
+ });
453
+
454
+ const signedCalls = await _client.signPreparedCalls(preparedCalls);
455
+
456
+ const result = await _client.sendPreparedCalls(signedCalls);
457
+
458
+ expect(result.preparedCallIds).toBeArrayOfSize(1);
459
+
460
+ await waitForUserOpSuccess(client, result.preparedCallIds[0]);
461
+ },
462
+ { timeout: 45_000 },
463
+ );
464
+
465
+ it(
466
+ "should successfully create a session with grantPermissions and send a UO",
467
+ async () => {
468
+ const account = await client.requestAccount();
469
+
470
+ const sessionKey = LocalAccountSigner.generatePrivateKeySigner();
471
+
472
+ const permissions = await client.grantPermissions({
473
+ account: account.address,
474
+ expirySec: Math.floor(Date.now() / 1000) + 60 * 60,
475
+ key: {
476
+ publicKey: await sessionKey.getAddress(),
477
+ type: "secp256k1",
478
+ },
479
+ permissions: [{ type: "root" }],
480
+ });
481
+
482
+ const sessionKeyClient = createSmartWalletClient({
483
+ transport,
484
+ chain: arbitrumSepolia,
485
+ mode: "remote",
486
+ signer: sessionKey,
487
+ });
488
+
489
+ const preparedCalls = await sessionKeyClient.prepareCalls({
490
+ calls: [{ to: zeroAddress, value: "0x0" }],
491
+ from: account.address,
492
+ capabilities: {
493
+ paymasterService: {
494
+ policyId: process.env.TEST_PAYMASTER_POLICY_ID!,
495
+ },
496
+ permissions,
497
+ },
498
+ });
499
+
500
+ const signedCalls =
501
+ await sessionKeyClient.signPreparedCalls(preparedCalls);
502
+
503
+ const result = await sessionKeyClient.sendPreparedCalls({
504
+ ...signedCalls,
505
+ capabilities: {
506
+ permissions,
507
+ },
508
+ });
509
+
510
+ expect(result.preparedCallIds).toBeArrayOfSize(1);
511
+
512
+ await waitForUserOpSuccess(client, result.preparedCallIds[0]);
513
+ },
514
+ {
515
+ timeout: 45_000,
516
+ },
517
+ );
259
518
  });
260
519
 
261
520
  const givenTypedData = {
@@ -291,3 +550,25 @@ describe("Client E2E Tests", () => {
291
550
  },
292
551
  } as const;
293
552
  });
553
+
554
+ const waitForUserOpSuccess = async (
555
+ client: SmartWalletClient,
556
+ preparedCallId: Hex,
557
+ ) => {
558
+ const maxTimeoutMs = 1000 * 30;
559
+ const deadline = Date.now() + maxTimeoutMs;
560
+ while (Date.now() < deadline) {
561
+ const status = (await client.getCallsStatus(preparedCallId)).status;
562
+ if (status === 200) {
563
+ // Success.
564
+ return;
565
+ }
566
+ if (status !== 100) {
567
+ // Error.
568
+ throw new Error(`Get call status failed with status ${status}.`);
569
+ }
570
+ // Pending.
571
+ await sleep(5000);
572
+ }
573
+ throw new Error("Timed out waiting for successful call status.");
574
+ };