@aspect-wallet/sdk 0.1.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 (164) hide show
  1. package/CHANGELOG.md +24 -0
  2. package/LICENSE +21 -0
  3. package/README.md +708 -0
  4. package/dist/audit/history.d.ts +44 -0
  5. package/dist/audit/history.d.ts.map +1 -0
  6. package/dist/audit/history.js +80 -0
  7. package/dist/audit/history.js.map +1 -0
  8. package/dist/auth/email.d.ts +52 -0
  9. package/dist/auth/email.d.ts.map +1 -0
  10. package/dist/auth/email.js +66 -0
  11. package/dist/auth/email.js.map +1 -0
  12. package/dist/auth/oauth.d.ts +47 -0
  13. package/dist/auth/oauth.d.ts.map +1 -0
  14. package/dist/auth/oauth.js +103 -0
  15. package/dist/auth/oauth.js.map +1 -0
  16. package/dist/auth/passkey-auth.d.ts +39 -0
  17. package/dist/auth/passkey-auth.d.ts.map +1 -0
  18. package/dist/auth/passkey-auth.js +108 -0
  19. package/dist/auth/passkey-auth.js.map +1 -0
  20. package/dist/auth/session.d.ts +30 -0
  21. package/dist/auth/session.d.ts.map +1 -0
  22. package/dist/auth/session.js +61 -0
  23. package/dist/auth/session.js.map +1 -0
  24. package/dist/chain/registry.d.ts +25 -0
  25. package/dist/chain/registry.d.ts.map +1 -0
  26. package/dist/chain/registry.js +46 -0
  27. package/dist/chain/registry.js.map +1 -0
  28. package/dist/core/client.d.ts +78 -0
  29. package/dist/core/client.d.ts.map +1 -0
  30. package/dist/core/client.js +129 -0
  31. package/dist/core/client.js.map +1 -0
  32. package/dist/core/config.d.ts +22 -0
  33. package/dist/core/config.d.ts.map +1 -0
  34. package/dist/core/config.js +91 -0
  35. package/dist/core/config.js.map +1 -0
  36. package/dist/core/errors.d.ts +32 -0
  37. package/dist/core/errors.d.ts.map +1 -0
  38. package/dist/core/errors.js +95 -0
  39. package/dist/core/errors.js.map +1 -0
  40. package/dist/index.d.ts +55 -0
  41. package/dist/index.d.ts.map +1 -0
  42. package/dist/index.js +64 -0
  43. package/dist/index.js.map +1 -0
  44. package/dist/mfa/guardian.d.ts +27 -0
  45. package/dist/mfa/guardian.d.ts.map +1 -0
  46. package/dist/mfa/guardian.js +37 -0
  47. package/dist/mfa/guardian.js.map +1 -0
  48. package/dist/mfa/multisig.d.ts +28 -0
  49. package/dist/mfa/multisig.d.ts.map +1 -0
  50. package/dist/mfa/multisig.js +40 -0
  51. package/dist/mfa/multisig.js.map +1 -0
  52. package/dist/mfa/tiers.d.ts +34 -0
  53. package/dist/mfa/tiers.d.ts.map +1 -0
  54. package/dist/mfa/tiers.js +66 -0
  55. package/dist/mfa/tiers.js.map +1 -0
  56. package/dist/mfa/timelock.d.ts +32 -0
  57. package/dist/mfa/timelock.d.ts.map +1 -0
  58. package/dist/mfa/timelock.js +47 -0
  59. package/dist/mfa/timelock.js.map +1 -0
  60. package/dist/recovery/devices.d.ts +31 -0
  61. package/dist/recovery/devices.d.ts.map +1 -0
  62. package/dist/recovery/devices.js +33 -0
  63. package/dist/recovery/devices.js.map +1 -0
  64. package/dist/recovery/export.d.ts +33 -0
  65. package/dist/recovery/export.d.ts.map +1 -0
  66. package/dist/recovery/export.js +44 -0
  67. package/dist/recovery/export.js.map +1 -0
  68. package/dist/recovery/rotation.d.ts +26 -0
  69. package/dist/recovery/rotation.d.ts.map +1 -0
  70. package/dist/recovery/rotation.js +31 -0
  71. package/dist/recovery/rotation.js.map +1 -0
  72. package/dist/recovery/social.d.ts +33 -0
  73. package/dist/recovery/social.d.ts.map +1 -0
  74. package/dist/recovery/social.js +36 -0
  75. package/dist/recovery/social.js.map +1 -0
  76. package/dist/security/freeze.d.ts +34 -0
  77. package/dist/security/freeze.d.ts.map +1 -0
  78. package/dist/security/freeze.js +42 -0
  79. package/dist/security/freeze.js.map +1 -0
  80. package/dist/security/revoke.d.ts +27 -0
  81. package/dist/security/revoke.d.ts.map +1 -0
  82. package/dist/security/revoke.js +27 -0
  83. package/dist/security/revoke.js.map +1 -0
  84. package/dist/security/watchtower.d.ts +34 -0
  85. package/dist/security/watchtower.d.ts.map +1 -0
  86. package/dist/security/watchtower.js +38 -0
  87. package/dist/security/watchtower.js.map +1 -0
  88. package/dist/session-keys/manager.d.ts +40 -0
  89. package/dist/session-keys/manager.d.ts.map +1 -0
  90. package/dist/session-keys/manager.js +65 -0
  91. package/dist/session-keys/manager.js.map +1 -0
  92. package/dist/session-keys/permissions.d.ts +44 -0
  93. package/dist/session-keys/permissions.d.ts.map +1 -0
  94. package/dist/session-keys/permissions.js +63 -0
  95. package/dist/session-keys/permissions.js.map +1 -0
  96. package/dist/session-keys/templates.d.ts +49 -0
  97. package/dist/session-keys/templates.d.ts.map +1 -0
  98. package/dist/session-keys/templates.js +65 -0
  99. package/dist/session-keys/templates.js.map +1 -0
  100. package/dist/signer/eoa.d.ts +24 -0
  101. package/dist/signer/eoa.d.ts.map +1 -0
  102. package/dist/signer/eoa.js +32 -0
  103. package/dist/signer/eoa.js.map +1 -0
  104. package/dist/signer/interface.d.ts +60 -0
  105. package/dist/signer/interface.d.ts.map +1 -0
  106. package/dist/signer/interface.js +47 -0
  107. package/dist/signer/interface.js.map +1 -0
  108. package/dist/signer/multisig.d.ts +38 -0
  109. package/dist/signer/multisig.d.ts.map +1 -0
  110. package/dist/signer/multisig.js +56 -0
  111. package/dist/signer/multisig.js.map +1 -0
  112. package/dist/signer/passkey.d.ts +35 -0
  113. package/dist/signer/passkey.d.ts.map +1 -0
  114. package/dist/signer/passkey.js +112 -0
  115. package/dist/signer/passkey.js.map +1 -0
  116. package/dist/signer/session.d.ts +24 -0
  117. package/dist/signer/session.d.ts.map +1 -0
  118. package/dist/signer/session.js +32 -0
  119. package/dist/signer/session.js.map +1 -0
  120. package/dist/sponsor/paymaster.d.ts +27 -0
  121. package/dist/sponsor/paymaster.d.ts.map +1 -0
  122. package/dist/sponsor/paymaster.js +43 -0
  123. package/dist/sponsor/paymaster.js.map +1 -0
  124. package/dist/transport/api.d.ts +25 -0
  125. package/dist/transport/api.d.ts.map +1 -0
  126. package/dist/transport/api.js +79 -0
  127. package/dist/transport/api.js.map +1 -0
  128. package/dist/transport/bundler.d.ts +52 -0
  129. package/dist/transport/bundler.d.ts.map +1 -0
  130. package/dist/transport/bundler.js +109 -0
  131. package/dist/transport/bundler.js.map +1 -0
  132. package/dist/transport/iframe.d.ts +33 -0
  133. package/dist/transport/iframe.d.ts.map +1 -0
  134. package/dist/transport/iframe.js +131 -0
  135. package/dist/transport/iframe.js.map +1 -0
  136. package/dist/types.d.ts +366 -0
  137. package/dist/types.d.ts.map +1 -0
  138. package/dist/types.js +6 -0
  139. package/dist/types.js.map +1 -0
  140. package/dist/userop/builder.d.ts +75 -0
  141. package/dist/userop/builder.d.ts.map +1 -0
  142. package/dist/userop/builder.js +150 -0
  143. package/dist/userop/builder.js.map +1 -0
  144. package/dist/userop/encoding.d.ts +44 -0
  145. package/dist/userop/encoding.d.ts.map +1 -0
  146. package/dist/userop/encoding.js +99 -0
  147. package/dist/userop/encoding.js.map +1 -0
  148. package/dist/userop/gas.d.ts +35 -0
  149. package/dist/userop/gas.d.ts.map +1 -0
  150. package/dist/userop/gas.js +53 -0
  151. package/dist/userop/gas.js.map +1 -0
  152. package/dist/userop/hash.d.ts +34 -0
  153. package/dist/userop/hash.d.ts.map +1 -0
  154. package/dist/userop/hash.js +55 -0
  155. package/dist/userop/hash.js.map +1 -0
  156. package/dist/userop/nonce.d.ts +53 -0
  157. package/dist/userop/nonce.d.ts.map +1 -0
  158. package/dist/userop/nonce.js +79 -0
  159. package/dist/userop/nonce.js.map +1 -0
  160. package/dist/wallet/factory.d.ts +63 -0
  161. package/dist/wallet/factory.d.ts.map +1 -0
  162. package/dist/wallet/factory.js +63 -0
  163. package/dist/wallet/factory.js.map +1 -0
  164. package/package.json +70 -0
@@ -0,0 +1,27 @@
1
+ /**
2
+ * Paymaster approval client for gas sponsorship.
3
+ * Corresponds to SPEC-013 Section 6.
4
+ */
5
+ import type { UserOperation, PaymasterApproval, SponsorshipBudget, SponsorshipPolicy } from '../types.js';
6
+ import { ApiClient } from '../transport/api.js';
7
+ /**
8
+ * Client for requesting gas sponsorship from the managed paymaster service.
9
+ * Handles approval requests, budget queries, and policy checks.
10
+ */
11
+ export declare class PaymasterClient {
12
+ private readonly api;
13
+ constructor(api: ApiClient);
14
+ /**
15
+ * Request paymaster approval for a UserOperation.
16
+ * The paymaster service validates the operation against policies,
17
+ * signs it, and returns paymasterAndData (97 bytes).
18
+ *
19
+ * paymasterAndData format: address(20) + validUntil(6) + validAfter(6) + signature(65)
20
+ */
21
+ approve(userOp: UserOperation): Promise<PaymasterApproval>;
22
+ /** Get the active sponsorship policy for this API key */
23
+ getPolicy(): Promise<SponsorshipPolicy>;
24
+ /** Get remaining sponsorship budget */
25
+ getBudget(): Promise<SponsorshipBudget>;
26
+ }
27
+ //# sourceMappingURL=paymaster.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"paymaster.d.ts","sourceRoot":"","sources":["../../src/sponsor/paymaster.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAEH,OAAO,KAAK,EAAE,aAAa,EAAE,iBAAiB,EAAE,iBAAiB,EAAE,iBAAiB,EAAE,MAAM,aAAa,CAAC;AAC1G,OAAO,EAAE,SAAS,EAAE,MAAM,qBAAqB,CAAC;AAEhD;;;GAGG;AACH,qBAAa,eAAe;IACd,OAAO,CAAC,QAAQ,CAAC,GAAG;gBAAH,GAAG,EAAE,SAAS;IAE3C;;;;;;OAMG;IACG,OAAO,CAAC,MAAM,EAAE,aAAa,GAAG,OAAO,CAAC,iBAAiB,CAAC;IAchE,yDAAyD;IACnD,SAAS,IAAI,OAAO,CAAC,iBAAiB,CAAC;IAI7C,uCAAuC;IACjC,SAAS,IAAI,OAAO,CAAC,iBAAiB,CAAC;CAG9C"}
@@ -0,0 +1,43 @@
1
+ /**
2
+ * Paymaster approval client for gas sponsorship.
3
+ * Corresponds to SPEC-013 Section 6.
4
+ */
5
+ /**
6
+ * Client for requesting gas sponsorship from the managed paymaster service.
7
+ * Handles approval requests, budget queries, and policy checks.
8
+ */
9
+ export class PaymasterClient {
10
+ api;
11
+ constructor(api) {
12
+ this.api = api;
13
+ }
14
+ /**
15
+ * Request paymaster approval for a UserOperation.
16
+ * The paymaster service validates the operation against policies,
17
+ * signs it, and returns paymasterAndData (97 bytes).
18
+ *
19
+ * paymasterAndData format: address(20) + validUntil(6) + validAfter(6) + signature(65)
20
+ */
21
+ async approve(userOp) {
22
+ return this.api.post('/sponsor/approve', {
23
+ sender: userOp.sender,
24
+ nonce: userOp.nonce.toString(),
25
+ initCode: userOp.initCode,
26
+ callData: userOp.callData,
27
+ callGasLimit: userOp.callGasLimit.toString(),
28
+ verificationGasLimit: userOp.verificationGasLimit.toString(),
29
+ preVerificationGas: userOp.preVerificationGas.toString(),
30
+ maxFeePerGas: userOp.maxFeePerGas.toString(),
31
+ maxPriorityFeePerGas: userOp.maxPriorityFeePerGas.toString(),
32
+ });
33
+ }
34
+ /** Get the active sponsorship policy for this API key */
35
+ async getPolicy() {
36
+ return this.api.get('/sponsor/policy');
37
+ }
38
+ /** Get remaining sponsorship budget */
39
+ async getBudget() {
40
+ return this.api.get('/sponsor/budget');
41
+ }
42
+ }
43
+ //# sourceMappingURL=paymaster.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"paymaster.js","sourceRoot":"","sources":["../../src/sponsor/paymaster.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAKH;;;GAGG;AACH,MAAM,OAAO,eAAe;IACG;IAA7B,YAA6B,GAAc;QAAd,QAAG,GAAH,GAAG,CAAW;IAAG,CAAC;IAE/C;;;;;;OAMG;IACH,KAAK,CAAC,OAAO,CAAC,MAAqB;QACjC,OAAO,IAAI,CAAC,GAAG,CAAC,IAAI,CAAoB,kBAAkB,EAAE;YAC1D,MAAM,EAAE,MAAM,CAAC,MAAM;YACrB,KAAK,EAAE,MAAM,CAAC,KAAK,CAAC,QAAQ,EAAE;YAC9B,QAAQ,EAAE,MAAM,CAAC,QAAQ;YACzB,QAAQ,EAAE,MAAM,CAAC,QAAQ;YACzB,YAAY,EAAE,MAAM,CAAC,YAAY,CAAC,QAAQ,EAAE;YAC5C,oBAAoB,EAAE,MAAM,CAAC,oBAAoB,CAAC,QAAQ,EAAE;YAC5D,kBAAkB,EAAE,MAAM,CAAC,kBAAkB,CAAC,QAAQ,EAAE;YACxD,YAAY,EAAE,MAAM,CAAC,YAAY,CAAC,QAAQ,EAAE;YAC5C,oBAAoB,EAAE,MAAM,CAAC,oBAAoB,CAAC,QAAQ,EAAE;SAC7D,CAAC,CAAC;IACL,CAAC;IAED,yDAAyD;IACzD,KAAK,CAAC,SAAS;QACb,OAAO,IAAI,CAAC,GAAG,CAAC,GAAG,CAAoB,iBAAiB,CAAC,CAAC;IAC5D,CAAC;IAED,uCAAuC;IACvC,KAAK,CAAC,SAAS;QACb,OAAO,IAAI,CAAC,GAAG,CAAC,GAAG,CAAoB,iBAAiB,CAAC,CAAC;IAC5D,CAAC;CACF"}
@@ -0,0 +1,25 @@
1
+ /**
2
+ * Platform API HTTP client.
3
+ * Handles all REST calls to the FcxWallet platform backend.
4
+ * Corresponds to SPEC-013 Section 3.4.
5
+ */
6
+ /**
7
+ * HTTP client for the FcxWallet Platform API.
8
+ * Automatically includes API key in headers and handles error responses.
9
+ */
10
+ export declare class ApiClient {
11
+ private readonly baseUrl;
12
+ private readonly apiKey;
13
+ private sessionJwt;
14
+ constructor(baseUrl: string, apiKey: string);
15
+ /** Set the session JWT for authenticated requests */
16
+ setSessionJwt(jwt: string | null): void;
17
+ /** GET request */
18
+ get<T>(path: string, params?: Record<string, string>): Promise<T>;
19
+ /** POST request */
20
+ post<T>(path: string, body?: unknown): Promise<T>;
21
+ /** DELETE request */
22
+ delete<T>(path: string): Promise<T>;
23
+ private request;
24
+ }
25
+ //# sourceMappingURL=api.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"api.d.ts","sourceRoot":"","sources":["../../src/transport/api.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AAIH;;;GAGG;AACH,qBAAa,SAAS;IACpB,OAAO,CAAC,QAAQ,CAAC,OAAO,CAAS;IACjC,OAAO,CAAC,QAAQ,CAAC,MAAM,CAAS;IAChC,OAAO,CAAC,UAAU,CAAuB;gBAE7B,OAAO,EAAE,MAAM,EAAE,MAAM,EAAE,MAAM;IAK3C,qDAAqD;IACrD,aAAa,CAAC,GAAG,EAAE,MAAM,GAAG,IAAI,GAAG,IAAI;IAIvC,kBAAkB;IACZ,GAAG,CAAC,CAAC,EAAE,IAAI,EAAE,MAAM,EAAE,MAAM,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,GAAG,OAAO,CAAC,CAAC,CAAC;IAUvE,mBAAmB;IACb,IAAI,CAAC,CAAC,EAAE,IAAI,EAAE,MAAM,EAAE,IAAI,CAAC,EAAE,OAAO,GAAG,OAAO,CAAC,CAAC,CAAC;IAIvD,qBAAqB;IACf,MAAM,CAAC,CAAC,EAAE,IAAI,EAAE,MAAM,GAAG,OAAO,CAAC,CAAC,CAAC;YAI3B,OAAO;CAwCtB"}
@@ -0,0 +1,79 @@
1
+ /**
2
+ * Platform API HTTP client.
3
+ * Handles all REST calls to the FcxWallet platform backend.
4
+ * Corresponds to SPEC-013 Section 3.4.
5
+ */
6
+ import { FcxError } from '../core/errors.js';
7
+ /**
8
+ * HTTP client for the FcxWallet Platform API.
9
+ * Automatically includes API key in headers and handles error responses.
10
+ */
11
+ export class ApiClient {
12
+ baseUrl;
13
+ apiKey;
14
+ sessionJwt = null;
15
+ constructor(baseUrl, apiKey) {
16
+ this.baseUrl = baseUrl.replace(/\/$/, '');
17
+ this.apiKey = apiKey;
18
+ }
19
+ /** Set the session JWT for authenticated requests */
20
+ setSessionJwt(jwt) {
21
+ this.sessionJwt = jwt;
22
+ }
23
+ /** GET request */
24
+ async get(path, params) {
25
+ const url = new URL(`${this.baseUrl}${path}`);
26
+ if (params) {
27
+ for (const [key, value] of Object.entries(params)) {
28
+ url.searchParams.set(key, value);
29
+ }
30
+ }
31
+ return this.request('GET', url.toString());
32
+ }
33
+ /** POST request */
34
+ async post(path, body) {
35
+ return this.request('POST', `${this.baseUrl}${path}`, body);
36
+ }
37
+ /** DELETE request */
38
+ async delete(path) {
39
+ return this.request('DELETE', `${this.baseUrl}${path}`);
40
+ }
41
+ async request(method, url, body) {
42
+ const headers = {
43
+ 'X-API-Key': this.apiKey,
44
+ 'Content-Type': 'application/json',
45
+ };
46
+ if (this.sessionJwt) {
47
+ headers['Authorization'] = `Bearer ${this.sessionJwt}`;
48
+ }
49
+ let response;
50
+ try {
51
+ response = await fetch(url, {
52
+ method,
53
+ headers,
54
+ body: body != null ? JSON.stringify(body) : undefined,
55
+ });
56
+ }
57
+ catch (error) {
58
+ throw new FcxError('NETWORK_ERROR', `API unreachable: ${url}`, {
59
+ cause: error instanceof Error ? error : undefined,
60
+ });
61
+ }
62
+ if (!response.ok) {
63
+ let errorBody;
64
+ try {
65
+ errorBody = (await response.json());
66
+ }
67
+ catch {
68
+ errorBody = { message: response.statusText };
69
+ }
70
+ throw FcxError.fromHttpError(response.status, errorBody);
71
+ }
72
+ // Handle empty responses (204 No Content)
73
+ if (response.status === 204) {
74
+ return undefined;
75
+ }
76
+ return (await response.json());
77
+ }
78
+ }
79
+ //# sourceMappingURL=api.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"api.js","sourceRoot":"","sources":["../../src/transport/api.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,52 @@
1
+ /**
2
+ * Bundler JSON-RPC client for ERC-4337 operations.
3
+ * Corresponds to SPEC-013 Section 14.
4
+ */
5
+ import type { Address, Hex, UserOperation } from '../types.js';
6
+ interface UserOperationReceipt {
7
+ userOpHash: Hex;
8
+ sender: Address;
9
+ nonce: Hex;
10
+ actualGasCost: Hex;
11
+ actualGasUsed: Hex;
12
+ success: boolean;
13
+ receipt: {
14
+ transactionHash: Hex;
15
+ blockNumber: Hex;
16
+ };
17
+ }
18
+ interface GasEstimate {
19
+ preVerificationGas: Hex;
20
+ verificationGasLimit: Hex;
21
+ callGasLimit: Hex;
22
+ }
23
+ /**
24
+ * JSON-RPC client for communicating with an ERC-4337 bundler.
25
+ * Supports eth_sendUserOperation, eth_estimateUserOperationGas,
26
+ * eth_getUserOperationReceipt, and eth_supportedEntryPoints.
27
+ */
28
+ export declare class BundlerClient {
29
+ private readonly url;
30
+ private readonly entryPoint;
31
+ private nextId;
32
+ constructor(url: string, entryPoint: Address);
33
+ /** Send a signed UserOperation to the bundler mempool */
34
+ sendUserOperation(userOp: UserOperation): Promise<Hex>;
35
+ /** Estimate gas limits for a UserOperation */
36
+ estimateUserOperationGas(userOp: UserOperation): Promise<GasEstimate>;
37
+ /** Get the receipt for a mined UserOperation */
38
+ getUserOperationReceipt(userOpHash: Hex): Promise<UserOperationReceipt | null>;
39
+ /** Get the list of EntryPoints supported by this bundler */
40
+ getSupportedEntryPoints(): Promise<Address[]>;
41
+ /**
42
+ * Wait for a UserOperation to be mined.
43
+ * Polls getUserOperationReceipt until a receipt is found or timeout.
44
+ */
45
+ waitForReceipt(userOpHash: Hex, options?: {
46
+ timeout?: number;
47
+ pollingInterval?: number;
48
+ }): Promise<UserOperationReceipt>;
49
+ private call;
50
+ }
51
+ export {};
52
+ //# sourceMappingURL=bundler.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"bundler.d.ts","sourceRoot":"","sources":["../../src/transport/bundler.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAGH,OAAO,KAAK,EAAE,OAAO,EAAE,GAAG,EAAE,aAAa,EAAE,MAAM,aAAa,CAAC;AAgB/D,UAAU,oBAAoB;IAC5B,UAAU,EAAE,GAAG,CAAC;IAChB,MAAM,EAAE,OAAO,CAAC;IAChB,KAAK,EAAE,GAAG,CAAC;IACX,aAAa,EAAE,GAAG,CAAC;IACnB,aAAa,EAAE,GAAG,CAAC;IACnB,OAAO,EAAE,OAAO,CAAC;IACjB,OAAO,EAAE;QACP,eAAe,EAAE,GAAG,CAAC;QACrB,WAAW,EAAE,GAAG,CAAC;KAClB,CAAC;CACH;AAED,UAAU,WAAW;IACnB,kBAAkB,EAAE,GAAG,CAAC;IACxB,oBAAoB,EAAE,GAAG,CAAC;IAC1B,YAAY,EAAE,GAAG,CAAC;CACnB;AAuBD;;;;GAIG;AACH,qBAAa,aAAa;IAItB,OAAO,CAAC,QAAQ,CAAC,GAAG;IACpB,OAAO,CAAC,QAAQ,CAAC,UAAU;IAJ7B,OAAO,CAAC,MAAM,CAAK;gBAGA,GAAG,EAAE,MAAM,EACX,UAAU,EAAE,OAAO;IAGtC,yDAAyD;IACnD,iBAAiB,CAAC,MAAM,EAAE,aAAa,GAAG,OAAO,CAAC,GAAG,CAAC;IAQ5D,8CAA8C;IACxC,wBAAwB,CAAC,MAAM,EAAE,aAAa,GAAG,OAAO,CAAC,WAAW,CAAC;IAO3E,gDAAgD;IAC1C,uBAAuB,CAAC,UAAU,EAAE,GAAG,GAAG,OAAO,CAAC,oBAAoB,GAAG,IAAI,CAAC;IAIpF,4DAA4D;IACtD,uBAAuB,IAAI,OAAO,CAAC,OAAO,EAAE,CAAC;IAInD;;;OAGG;IACG,cAAc,CAClB,UAAU,EAAE,GAAG,EACf,OAAO,CAAC,EAAE;QAAE,OAAO,CAAC,EAAE,MAAM,CAAC;QAAC,eAAe,CAAC,EAAE,MAAM,CAAA;KAAE,GACvD,OAAO,CAAC,oBAAoB,CAAC;YAgBlB,IAAI;CAiCnB"}
@@ -0,0 +1,109 @@
1
+ /**
2
+ * Bundler JSON-RPC client for ERC-4337 operations.
3
+ * Corresponds to SPEC-013 Section 14.
4
+ */
5
+ import { FcxError } from '../core/errors.js';
6
+ /** Serialise a UserOperation for JSON-RPC (bigint -> hex) */
7
+ function serialiseUserOp(userOp) {
8
+ return {
9
+ sender: userOp.sender,
10
+ nonce: toHex(userOp.nonce),
11
+ initCode: userOp.initCode,
12
+ callData: userOp.callData,
13
+ callGasLimit: toHex(userOp.callGasLimit),
14
+ verificationGasLimit: toHex(userOp.verificationGasLimit),
15
+ preVerificationGas: toHex(userOp.preVerificationGas),
16
+ maxFeePerGas: toHex(userOp.maxFeePerGas),
17
+ maxPriorityFeePerGas: toHex(userOp.maxPriorityFeePerGas),
18
+ paymasterAndData: userOp.paymasterAndData,
19
+ signature: userOp.signature,
20
+ };
21
+ }
22
+ function toHex(value) {
23
+ return `0x${value.toString(16)}`;
24
+ }
25
+ /**
26
+ * JSON-RPC client for communicating with an ERC-4337 bundler.
27
+ * Supports eth_sendUserOperation, eth_estimateUserOperationGas,
28
+ * eth_getUserOperationReceipt, and eth_supportedEntryPoints.
29
+ */
30
+ export class BundlerClient {
31
+ url;
32
+ entryPoint;
33
+ nextId = 1;
34
+ constructor(url, entryPoint) {
35
+ this.url = url;
36
+ this.entryPoint = entryPoint;
37
+ }
38
+ /** Send a signed UserOperation to the bundler mempool */
39
+ async sendUserOperation(userOp) {
40
+ const result = await this.call('eth_sendUserOperation', [
41
+ serialiseUserOp(userOp),
42
+ this.entryPoint,
43
+ ]);
44
+ return result;
45
+ }
46
+ /** Estimate gas limits for a UserOperation */
47
+ async estimateUserOperationGas(userOp) {
48
+ return this.call('eth_estimateUserOperationGas', [
49
+ serialiseUserOp(userOp),
50
+ this.entryPoint,
51
+ ]);
52
+ }
53
+ /** Get the receipt for a mined UserOperation */
54
+ async getUserOperationReceipt(userOpHash) {
55
+ return this.call('eth_getUserOperationReceipt', [userOpHash]);
56
+ }
57
+ /** Get the list of EntryPoints supported by this bundler */
58
+ async getSupportedEntryPoints() {
59
+ return this.call('eth_supportedEntryPoints', []);
60
+ }
61
+ /**
62
+ * Wait for a UserOperation to be mined.
63
+ * Polls getUserOperationReceipt until a receipt is found or timeout.
64
+ */
65
+ async waitForReceipt(userOpHash, options) {
66
+ const timeout = options?.timeout ?? 60_000;
67
+ const interval = options?.pollingInterval ?? 2_000;
68
+ const deadline = Date.now() + timeout;
69
+ while (Date.now() < deadline) {
70
+ const receipt = await this.getUserOperationReceipt(userOpHash);
71
+ if (receipt)
72
+ return receipt;
73
+ await new Promise((resolve) => setTimeout(resolve, interval));
74
+ }
75
+ throw new FcxError('NETWORK_ERROR', `Timed out waiting for UserOp receipt: ${userOpHash}`, {
76
+ details: { userOpHash, timeout },
77
+ });
78
+ }
79
+ async call(method, params) {
80
+ const request = {
81
+ jsonrpc: '2.0',
82
+ id: this.nextId++,
83
+ method,
84
+ params,
85
+ };
86
+ let response;
87
+ try {
88
+ response = await fetch(this.url, {
89
+ method: 'POST',
90
+ headers: { 'Content-Type': 'application/json' },
91
+ body: JSON.stringify(request),
92
+ });
93
+ }
94
+ catch (error) {
95
+ throw new FcxError('NETWORK_ERROR', `Bundler unreachable: ${this.url}`, {
96
+ cause: error instanceof Error ? error : undefined,
97
+ });
98
+ }
99
+ if (!response.ok) {
100
+ throw new FcxError('NETWORK_ERROR', `Bundler HTTP ${response.status}: ${response.statusText}`);
101
+ }
102
+ const json = (await response.json());
103
+ if (json.error) {
104
+ throw FcxError.fromRpcError(json.error.code, json.error.message, json.error.data);
105
+ }
106
+ return json.result;
107
+ }
108
+ }
109
+ //# sourceMappingURL=bundler.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"bundler.js","sourceRoot":"","sources":["../../src/transport/bundler.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,33 @@
1
+ /**
2
+ * Cross-origin signer iframe PostMessage bridge.
3
+ * Corresponds to SPEC-013 Section 14.
4
+ */
5
+ import type { Hex, SessionInfo } from '../types.js';
6
+ /**
7
+ * Manages communication with the cross-origin signer iframe.
8
+ * The iframe isolates signing credentials from the dApp context to prevent XSS.
9
+ */
10
+ export declare class IframeBridge {
11
+ private readonly iframeUrl;
12
+ private readonly allowedOrigin;
13
+ private iframe;
14
+ private ready;
15
+ private pendingRequests;
16
+ private messageHandler;
17
+ constructor(iframeUrl: string, allowedOrigin: string);
18
+ /** Initialise the iframe and wait for READY signal */
19
+ init(): Promise<void>;
20
+ /** Request authentication via the iframe */
21
+ authenticate(method: 'email' | 'google' | 'apple' | 'facebook' | 'passkey', params: Record<string, unknown>): Promise<SessionInfo>;
22
+ /** Request a UserOp signature from the iframe */
23
+ sign(userOpHash: Hex, moduleId: number): Promise<Hex>;
24
+ /** Request key export from the iframe */
25
+ exportKey(): Promise<Hex>;
26
+ /** Logout and clear iframe state */
27
+ logout(): Promise<void>;
28
+ /** Destroy the iframe and clean up */
29
+ destroy(): void;
30
+ private sendRequest;
31
+ private postMessage;
32
+ }
33
+ //# sourceMappingURL=iframe.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"iframe.d.ts","sourceRoot":"","sources":["../../src/transport/iframe.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAGH,OAAO,KAAK,EAAE,GAAG,EAAiC,WAAW,EAAE,MAAM,aAAa,CAAC;AAInF;;;GAGG;AACH,qBAAa,YAAY;IAUrB,OAAO,CAAC,QAAQ,CAAC,SAAS;IAC1B,OAAO,CAAC,QAAQ,CAAC,aAAa;IAVhC,OAAO,CAAC,MAAM,CAAkC;IAChD,OAAO,CAAC,KAAK,CAAS;IACtB,OAAO,CAAC,eAAe,CAGnB;IACJ,OAAO,CAAC,cAAc,CAAgD;gBAGnD,SAAS,EAAE,MAAM,EACjB,aAAa,EAAE,MAAM;IAGxC,sDAAsD;IAChD,IAAI,IAAI,OAAO,CAAC,IAAI,CAAC;IA4C3B,4CAA4C;IACtC,YAAY,CAChB,MAAM,EAAE,OAAO,GAAG,QAAQ,GAAG,OAAO,GAAG,UAAU,GAAG,SAAS,EAC7D,MAAM,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,GAC9B,OAAO,CAAC,WAAW,CAAC;IAavB,iDAAiD;IAC3C,IAAI,CAAC,UAAU,EAAE,GAAG,EAAE,QAAQ,EAAE,MAAM,GAAG,OAAO,CAAC,GAAG,CAAC;IAa3D,yCAAyC;IACnC,SAAS,IAAI,OAAO,CAAC,GAAG,CAAC;IAa/B,oCAAoC;IAC9B,MAAM,IAAI,OAAO,CAAC,IAAI,CAAC;IAI7B,sCAAsC;IACtC,OAAO,IAAI,IAAI;IAgBf,OAAO,CAAC,WAAW;IA6BnB,OAAO,CAAC,WAAW;CAIpB"}
@@ -0,0 +1,131 @@
1
+ /**
2
+ * Cross-origin signer iframe PostMessage bridge.
3
+ * Corresponds to SPEC-013 Section 14.
4
+ */
5
+ import { FcxError } from '../core/errors.js';
6
+ const IFRAME_TIMEOUT_MS = 30_000;
7
+ /**
8
+ * Manages communication with the cross-origin signer iframe.
9
+ * The iframe isolates signing credentials from the dApp context to prevent XSS.
10
+ */
11
+ export class IframeBridge {
12
+ iframeUrl;
13
+ allowedOrigin;
14
+ iframe = null;
15
+ ready = false;
16
+ pendingRequests = new Map();
17
+ messageHandler = null;
18
+ constructor(iframeUrl, allowedOrigin) {
19
+ this.iframeUrl = iframeUrl;
20
+ this.allowedOrigin = allowedOrigin;
21
+ }
22
+ /** Initialise the iframe and wait for READY signal */
23
+ async init() {
24
+ if (typeof document === 'undefined') {
25
+ throw new FcxError('IFRAME_TIMEOUT', 'Iframe bridge requires a browser environment');
26
+ }
27
+ return new Promise((resolve, reject) => {
28
+ const timeout = setTimeout(() => {
29
+ reject(new FcxError('IFRAME_TIMEOUT', 'Signer iframe did not respond'));
30
+ }, IFRAME_TIMEOUT_MS);
31
+ this.messageHandler = (event) => {
32
+ if (event.origin !== new URL(this.iframeUrl).origin)
33
+ return;
34
+ const data = event.data;
35
+ if (data.type === 'READY') {
36
+ this.ready = true;
37
+ clearTimeout(timeout);
38
+ resolve();
39
+ return;
40
+ }
41
+ // Route response to pending request
42
+ const pending = this.pendingRequests.get(data.type);
43
+ if (pending) {
44
+ this.pendingRequests.delete(data.type);
45
+ pending.resolve(data);
46
+ }
47
+ };
48
+ window.addEventListener('message', this.messageHandler);
49
+ this.iframe = document.createElement('iframe');
50
+ this.iframe.src = this.iframeUrl;
51
+ this.iframe.style.display = 'none';
52
+ this.iframe.setAttribute('sandbox', 'allow-scripts allow-same-origin');
53
+ document.body.appendChild(this.iframe);
54
+ // Send INIT once iframe loads
55
+ this.iframe.addEventListener('load', () => {
56
+ this.postMessage({ type: 'INIT', origin: this.allowedOrigin });
57
+ });
58
+ });
59
+ }
60
+ /** Request authentication via the iframe */
61
+ async authenticate(method, params) {
62
+ const response = await this.sendRequest({ type: 'AUTH_REQUEST', method, params }, 'AUTH_RESPONSE');
63
+ if (!response.success || !response.session) {
64
+ throw new FcxError('AUTH_OAUTH_FAILED', response.error ?? 'Authentication failed');
65
+ }
66
+ return response.session;
67
+ }
68
+ /** Request a UserOp signature from the iframe */
69
+ async sign(userOpHash, moduleId) {
70
+ const response = await this.sendRequest({ type: 'SIGN_REQUEST', userOpHash, moduleId }, 'SIGN_RESPONSE');
71
+ if (!response.success || !response.signature) {
72
+ throw new FcxError('USEROP_SIGNATURE_INVALID', response.error ?? 'Signing failed');
73
+ }
74
+ return response.signature;
75
+ }
76
+ /** Request key export from the iframe */
77
+ async exportKey() {
78
+ const response = await this.sendRequest({ type: 'EXPORT_REQUEST' }, 'EXPORT_RESPONSE');
79
+ if (!response.success || !response.privateKey) {
80
+ throw new FcxError('NETWORK_ERROR', response.error ?? 'Key export failed');
81
+ }
82
+ return response.privateKey;
83
+ }
84
+ /** Logout and clear iframe state */
85
+ async logout() {
86
+ this.postMessage({ type: 'LOGOUT' });
87
+ }
88
+ /** Destroy the iframe and clean up */
89
+ destroy() {
90
+ if (this.messageHandler) {
91
+ window.removeEventListener('message', this.messageHandler);
92
+ this.messageHandler = null;
93
+ }
94
+ if (this.iframe) {
95
+ this.iframe.remove();
96
+ this.iframe = null;
97
+ }
98
+ this.ready = false;
99
+ for (const pending of this.pendingRequests.values()) {
100
+ pending.reject(new FcxError('IFRAME_TIMEOUT', 'Iframe bridge destroyed'));
101
+ }
102
+ this.pendingRequests.clear();
103
+ }
104
+ sendRequest(request, expectedResponseType) {
105
+ if (!this.ready) {
106
+ throw new FcxError('IFRAME_TIMEOUT', 'Signer iframe not initialized');
107
+ }
108
+ return new Promise((resolve, reject) => {
109
+ const timeout = setTimeout(() => {
110
+ this.pendingRequests.delete(expectedResponseType);
111
+ reject(new FcxError('IFRAME_TIMEOUT', `Iframe did not respond to ${request.type}`));
112
+ }, IFRAME_TIMEOUT_MS);
113
+ this.pendingRequests.set(expectedResponseType, {
114
+ resolve: (value) => {
115
+ clearTimeout(timeout);
116
+ resolve(value);
117
+ },
118
+ reject: (error) => {
119
+ clearTimeout(timeout);
120
+ reject(error);
121
+ },
122
+ });
123
+ this.postMessage(request);
124
+ });
125
+ }
126
+ postMessage(message) {
127
+ const iframeOrigin = new URL(this.iframeUrl).origin;
128
+ this.iframe?.contentWindow?.postMessage(message, iframeOrigin);
129
+ }
130
+ }
131
+ //# sourceMappingURL=iframe.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"iframe.js","sourceRoot":"","sources":["../../src/transport/iframe.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAEH,OAAO,EAAE,QAAQ,EAAE,MAAM,mBAAmB,CAAC;AAG7C,MAAM,iBAAiB,GAAG,MAAM,CAAC;AAEjC;;;GAGG;AACH,MAAM,OAAO,YAAY;IAUJ;IACA;IAVX,MAAM,GAA6B,IAAI,CAAC;IACxC,KAAK,GAAG,KAAK,CAAC;IACd,eAAe,GAAG,IAAI,GAAG,EAG9B,CAAC;IACI,cAAc,GAA2C,IAAI,CAAC;IAEtE,YACmB,SAAiB,EACjB,aAAqB;QADrB,cAAS,GAAT,SAAS,CAAQ;QACjB,kBAAa,GAAb,aAAa,CAAQ;IACrC,CAAC;IAEJ,sDAAsD;IACtD,KAAK,CAAC,IAAI;QACR,IAAI,OAAO,QAAQ,KAAK,WAAW,EAAE,CAAC;YACpC,MAAM,IAAI,QAAQ,CAAC,gBAAgB,EAAE,8CAA8C,CAAC,CAAC;QACvF,CAAC;QAED,OAAO,IAAI,OAAO,CAAC,CAAC,OAAO,EAAE,MAAM,EAAE,EAAE;YACrC,MAAM,OAAO,GAAG,UAAU,CAAC,GAAG,EAAE;gBAC9B,MAAM,CAAC,IAAI,QAAQ,CAAC,gBAAgB,EAAE,+BAA+B,CAAC,CAAC,CAAC;YAC1E,CAAC,EAAE,iBAAiB,CAAC,CAAC;YAEtB,IAAI,CAAC,cAAc,GAAG,CAAC,KAAmB,EAAE,EAAE;gBAC5C,IAAI,KAAK,CAAC,MAAM,KAAK,IAAI,GAAG,CAAC,IAAI,CAAC,SAAS,CAAC,CAAC,MAAM;oBAAE,OAAO;gBAC5D,MAAM,IAAI,GAAG,KAAK,CAAC,IAAsB,CAAC;gBAE1C,IAAI,IAAI,CAAC,IAAI,KAAK,OAAO,EAAE,CAAC;oBAC1B,IAAI,CAAC,KAAK,GAAG,IAAI,CAAC;oBAClB,YAAY,CAAC,OAAO,CAAC,CAAC;oBACtB,OAAO,EAAE,CAAC;oBACV,OAAO;gBACT,CAAC;gBAED,oCAAoC;gBACpC,MAAM,OAAO,GAAG,IAAI,CAAC,eAAe,CAAC,GAAG,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;gBACpD,IAAI,OAAO,EAAE,CAAC;oBACZ,IAAI,CAAC,eAAe,CAAC,MAAM,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;oBACvC,OAAO,CAAC,OAAO,CAAC,IAAI,CAAC,CAAC;gBACxB,CAAC;YACH,CAAC,CAAC;YAEF,MAAM,CAAC,gBAAgB,CAAC,SAAS,EAAE,IAAI,CAAC,cAAc,CAAC,CAAC;YAExD,IAAI,CAAC,MAAM,GAAG,QAAQ,CAAC,aAAa,CAAC,QAAQ,CAAC,CAAC;YAC/C,IAAI,CAAC,MAAM,CAAC,GAAG,GAAG,IAAI,CAAC,SAAS,CAAC;YACjC,IAAI,CAAC,MAAM,CAAC,KAAK,CAAC,OAAO,GAAG,MAAM,CAAC;YACnC,IAAI,CAAC,MAAM,CAAC,YAAY,CAAC,SAAS,EAAE,iCAAiC,CAAC,CAAC;YACvE,QAAQ,CAAC,IAAI,CAAC,WAAW,CAAC,IAAI,CAAC,MAAM,CAAC,CAAC;YAEvC,8BAA8B;YAC9B,IAAI,CAAC,MAAM,CAAC,gBAAgB,CAAC,MAAM,EAAE,GAAG,EAAE;gBACxC,IAAI,CAAC,WAAW,CAAC,EAAE,IAAI,EAAE,MAAM,EAAE,MAAM,EAAE,IAAI,CAAC,aAAa,EAAE,CAAC,CAAC;YACjE,CAAC,CAAC,CAAC;QACL,CAAC,CAAC,CAAC;IACL,CAAC;IAED,4CAA4C;IAC5C,KAAK,CAAC,YAAY,CAChB,MAA6D,EAC7D,MAA+B;QAE/B,MAAM,QAAQ,GAAG,MAAM,IAAI,CAAC,WAAW,CACrC,EAAE,IAAI,EAAE,cAAc,EAAE,MAAM,EAAE,MAAM,EAAE,EACxC,eAAe,CAChB,CAAC;QAEF,IAAI,CAAC,QAAQ,CAAC,OAAO,IAAI,CAAC,QAAQ,CAAC,OAAO,EAAE,CAAC;YAC3C,MAAM,IAAI,QAAQ,CAAC,mBAAmB,EAAE,QAAQ,CAAC,KAAK,IAAI,uBAAuB,CAAC,CAAC;QACrF,CAAC;QAED,OAAO,QAAQ,CAAC,OAAO,CAAC;IAC1B,CAAC;IAED,iDAAiD;IACjD,KAAK,CAAC,IAAI,CAAC,UAAe,EAAE,QAAgB;QAC1C,MAAM,QAAQ,GAAG,MAAM,IAAI,CAAC,WAAW,CACrC,EAAE,IAAI,EAAE,cAAc,EAAE,UAAU,EAAE,QAAQ,EAAE,EAC9C,eAAe,CAChB,CAAC;QAEF,IAAI,CAAC,QAAQ,CAAC,OAAO,IAAI,CAAC,QAAQ,CAAC,SAAS,EAAE,CAAC;YAC7C,MAAM,IAAI,QAAQ,CAAC,0BAA0B,EAAE,QAAQ,CAAC,KAAK,IAAI,gBAAgB,CAAC,CAAC;QACrF,CAAC;QAED,OAAO,QAAQ,CAAC,SAAS,CAAC;IAC5B,CAAC;IAED,yCAAyC;IACzC,KAAK,CAAC,SAAS;QACb,MAAM,QAAQ,GAAG,MAAM,IAAI,CAAC,WAAW,CACrC,EAAE,IAAI,EAAE,gBAAgB,EAAE,EAC1B,iBAAiB,CAClB,CAAC;QAEF,IAAI,CAAC,QAAQ,CAAC,OAAO,IAAI,CAAC,QAAQ,CAAC,UAAU,EAAE,CAAC;YAC9C,MAAM,IAAI,QAAQ,CAAC,eAAe,EAAE,QAAQ,CAAC,KAAK,IAAI,mBAAmB,CAAC,CAAC;QAC7E,CAAC;QAED,OAAO,QAAQ,CAAC,UAAU,CAAC;IAC7B,CAAC;IAED,oCAAoC;IACpC,KAAK,CAAC,MAAM;QACV,IAAI,CAAC,WAAW,CAAC,EAAE,IAAI,EAAE,QAAQ,EAAE,CAAC,CAAC;IACvC,CAAC;IAED,sCAAsC;IACtC,OAAO;QACL,IAAI,IAAI,CAAC,cAAc,EAAE,CAAC;YACxB,MAAM,CAAC,mBAAmB,CAAC,SAAS,EAAE,IAAI,CAAC,cAAc,CAAC,CAAC;YAC3D,IAAI,CAAC,cAAc,GAAG,IAAI,CAAC;QAC7B,CAAC;QACD,IAAI,IAAI,CAAC,MAAM,EAAE,CAAC;YAChB,IAAI,CAAC,MAAM,CAAC,MAAM,EAAE,CAAC;YACrB,IAAI,CAAC,MAAM,GAAG,IAAI,CAAC;QACrB,CAAC;QACD,IAAI,CAAC,KAAK,GAAG,KAAK,CAAC;QACnB,KAAK,MAAM,OAAO,IAAI,IAAI,CAAC,eAAe,CAAC,MAAM,EAAE,EAAE,CAAC;YACpD,OAAO,CAAC,MAAM,CAAC,IAAI,QAAQ,CAAC,gBAAgB,EAAE,yBAAyB,CAAC,CAAC,CAAC;QAC5E,CAAC;QACD,IAAI,CAAC,eAAe,CAAC,KAAK,EAAE,CAAC;IAC/B,CAAC;IAEO,WAAW,CACjB,OAAsB,EACtB,oBAA4B;QAE5B,IAAI,CAAC,IAAI,CAAC,KAAK,EAAE,CAAC;YAChB,MAAM,IAAI,QAAQ,CAAC,gBAAgB,EAAE,+BAA+B,CAAC,CAAC;QACxE,CAAC;QAED,OAAO,IAAI,OAAO,CAAI,CAAC,OAAO,EAAE,MAAM,EAAE,EAAE;YACxC,MAAM,OAAO,GAAG,UAAU,CAAC,GAAG,EAAE;gBAC9B,IAAI,CAAC,eAAe,CAAC,MAAM,CAAC,oBAAoB,CAAC,CAAC;gBAClD,MAAM,CAAC,IAAI,QAAQ,CAAC,gBAAgB,EAAE,6BAA6B,OAAO,CAAC,IAAI,EAAE,CAAC,CAAC,CAAC;YACtF,CAAC,EAAE,iBAAiB,CAAC,CAAC;YAEtB,IAAI,CAAC,eAAe,CAAC,GAAG,CAAC,oBAAoB,EAAE;gBAC7C,OAAO,EAAE,CAAC,KAAK,EAAE,EAAE;oBACjB,YAAY,CAAC,OAAO,CAAC,CAAC;oBACtB,OAAO,CAAC,KAAU,CAAC,CAAC;gBACtB,CAAC;gBACD,MAAM,EAAE,CAAC,KAAK,EAAE,EAAE;oBAChB,YAAY,CAAC,OAAO,CAAC,CAAC;oBACtB,MAAM,CAAC,KAAK,CAAC,CAAC;gBAChB,CAAC;aACF,CAAC,CAAC;YAEH,IAAI,CAAC,WAAW,CAAC,OAAO,CAAC,CAAC;QAC5B,CAAC,CAAC,CAAC;IACL,CAAC;IAEO,WAAW,CAAC,OAAsB;QACxC,MAAM,YAAY,GAAG,IAAI,GAAG,CAAC,IAAI,CAAC,SAAS,CAAC,CAAC,MAAM,CAAC;QACpD,IAAI,CAAC,MAAM,EAAE,aAAa,EAAE,WAAW,CAAC,OAAO,EAAE,YAAY,CAAC,CAAC;IACjE,CAAC;CACF"}