@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,61 @@
1
+ /**
2
+ * JWT session management.
3
+ * Corresponds to SPEC-013 Section 7.4.
4
+ */
5
+ import { FcxError } from '../core/errors.js';
6
+ /**
7
+ * Manages authentication sessions (JWT lifecycle).
8
+ * Sessions are short-lived (1-24h), RS256 signed, and revocable.
9
+ */
10
+ export class SessionManager {
11
+ api;
12
+ currentSession = null;
13
+ constructor(api) {
14
+ this.api = api;
15
+ }
16
+ /** Get the current session */
17
+ getSession() {
18
+ if (this.currentSession && this.currentSession.expiresAt < Date.now() / 1000) {
19
+ this.currentSession = null;
20
+ }
21
+ return this.currentSession;
22
+ }
23
+ /** Check if the user is authenticated with a valid session */
24
+ isAuthenticated() {
25
+ return this.getSession() !== null;
26
+ }
27
+ /** Set the session (called internally by auth flows) */
28
+ setSession(session) {
29
+ this.currentSession = session;
30
+ this.api.setSessionJwt(session.jwt);
31
+ }
32
+ /** Refresh the current session */
33
+ async refreshSession() {
34
+ if (!this.currentSession) {
35
+ throw new FcxError('AUTH_SESSION_EXPIRED', 'No active session to refresh');
36
+ }
37
+ const session = await this.api.post('/auth/session/refresh', {
38
+ jwt: this.currentSession.jwt,
39
+ });
40
+ this.setSession(session);
41
+ return session;
42
+ }
43
+ /** Get session info from the server */
44
+ async getServerSession() {
45
+ return this.api.get('/auth/session');
46
+ }
47
+ /** Logout and revoke the current session */
48
+ async logout() {
49
+ if (this.currentSession) {
50
+ await this.api.post('/auth/logout', {});
51
+ }
52
+ this.currentSession = null;
53
+ this.api.setSessionJwt(null);
54
+ }
55
+ /** Clear the local session without server-side revocation */
56
+ clearLocal() {
57
+ this.currentSession = null;
58
+ this.api.setSessionJwt(null);
59
+ }
60
+ }
61
+ //# sourceMappingURL=session.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"session.js","sourceRoot":"","sources":["../../src/auth/session.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAEH,OAAO,EAAE,QAAQ,EAAE,MAAM,mBAAmB,CAAC;AAI7C;;;GAGG;AACH,MAAM,OAAO,cAAc;IAGI;IAFrB,cAAc,GAAuB,IAAI,CAAC;IAElD,YAA6B,GAAc;QAAd,QAAG,GAAH,GAAG,CAAW;IAAG,CAAC;IAE/C,8BAA8B;IAC9B,UAAU;QACR,IAAI,IAAI,CAAC,cAAc,IAAI,IAAI,CAAC,cAAc,CAAC,SAAS,GAAG,IAAI,CAAC,GAAG,EAAE,GAAG,IAAI,EAAE,CAAC;YAC7E,IAAI,CAAC,cAAc,GAAG,IAAI,CAAC;QAC7B,CAAC;QACD,OAAO,IAAI,CAAC,cAAc,CAAC;IAC7B,CAAC;IAED,8DAA8D;IAC9D,eAAe;QACb,OAAO,IAAI,CAAC,UAAU,EAAE,KAAK,IAAI,CAAC;IACpC,CAAC;IAED,wDAAwD;IACxD,UAAU,CAAC,OAAoB;QAC7B,IAAI,CAAC,cAAc,GAAG,OAAO,CAAC;QAC9B,IAAI,CAAC,GAAG,CAAC,aAAa,CAAC,OAAO,CAAC,GAAG,CAAC,CAAC;IACtC,CAAC;IAED,kCAAkC;IAClC,KAAK,CAAC,cAAc;QAClB,IAAI,CAAC,IAAI,CAAC,cAAc,EAAE,CAAC;YACzB,MAAM,IAAI,QAAQ,CAAC,sBAAsB,EAAE,8BAA8B,CAAC,CAAC;QAC7E,CAAC;QAED,MAAM,OAAO,GAAG,MAAM,IAAI,CAAC,GAAG,CAAC,IAAI,CAAc,uBAAuB,EAAE;YACxE,GAAG,EAAE,IAAI,CAAC,cAAc,CAAC,GAAG;SAC7B,CAAC,CAAC;QAEH,IAAI,CAAC,UAAU,CAAC,OAAO,CAAC,CAAC;QACzB,OAAO,OAAO,CAAC;IACjB,CAAC;IAED,uCAAuC;IACvC,KAAK,CAAC,gBAAgB;QACpB,OAAO,IAAI,CAAC,GAAG,CAAC,GAAG,CAAc,eAAe,CAAC,CAAC;IACpD,CAAC;IAED,4CAA4C;IAC5C,KAAK,CAAC,MAAM;QACV,IAAI,IAAI,CAAC,cAAc,EAAE,CAAC;YACxB,MAAM,IAAI,CAAC,GAAG,CAAC,IAAI,CAAC,cAAc,EAAE,EAAE,CAAC,CAAC;QAC1C,CAAC;QACD,IAAI,CAAC,cAAc,GAAG,IAAI,CAAC;QAC3B,IAAI,CAAC,GAAG,CAAC,aAAa,CAAC,IAAI,CAAC,CAAC;IAC/B,CAAC;IAED,6DAA6D;IAC7D,UAAU;QACR,IAAI,CAAC,cAAc,GAAG,IAAI,CAAC;QAC3B,IAAI,CAAC,GAAG,CAAC,aAAa,CAAC,IAAI,CAAC,CAAC;IAC/B,CAAC;CACF"}
@@ -0,0 +1,25 @@
1
+ /**
2
+ * Chain configuration registry.
3
+ * Corresponds to SPEC-013 Section 13.
4
+ */
5
+ import { ApiClient } from '../transport/api.js';
6
+ import type { ChainId, ChainInfo, ChainConfig } from '../types.js';
7
+ /**
8
+ * Manages chain configurations and supports runtime chain switching.
9
+ */
10
+ export declare class ChainRegistry {
11
+ private readonly api;
12
+ private cache;
13
+ constructor(api: ApiClient);
14
+ /** List all chains supported by the platform */
15
+ list(): Promise<ChainInfo[]>;
16
+ /** Get full configuration for a specific chain */
17
+ getConfig(chainId: ChainId): Promise<ChainConfig>;
18
+ /** Get the numeric chain ID for a chain identifier */
19
+ getNumericChainId(chainId: ChainId): number;
20
+ /** Get default config (local, no API call) */
21
+ getDefaultConfig(chainId: ChainId): Partial<ChainConfig> | undefined;
22
+ /** Clear the config cache */
23
+ clearCache(): void;
24
+ }
25
+ //# sourceMappingURL=registry.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"registry.d.ts","sourceRoot":"","sources":["../../src/chain/registry.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAIH,OAAO,EAAE,SAAS,EAAE,MAAM,qBAAqB,CAAC;AAChD,OAAO,KAAK,EAAE,OAAO,EAAE,SAAS,EAAE,WAAW,EAAE,MAAM,aAAa,CAAC;AAEnE;;GAEG;AACH,qBAAa,aAAa;IAGZ,OAAO,CAAC,QAAQ,CAAC,GAAG;IAFhC,OAAO,CAAC,KAAK,CAAmC;gBAEnB,GAAG,EAAE,SAAS;IAE3C,gDAAgD;IAC1C,IAAI,IAAI,OAAO,CAAC,SAAS,EAAE,CAAC;IAIlC,kDAAkD;IAC5C,SAAS,CAAC,OAAO,EAAE,OAAO,GAAG,OAAO,CAAC,WAAW,CAAC;IASvD,sDAAsD;IACtD,iBAAiB,CAAC,OAAO,EAAE,OAAO,GAAG,MAAM;IAQ3C,8CAA8C;IAC9C,gBAAgB,CAAC,OAAO,EAAE,OAAO,GAAG,OAAO,CAAC,WAAW,CAAC,GAAG,SAAS;IAIpE,6BAA6B;IAC7B,UAAU,IAAI,IAAI;CAGnB"}
@@ -0,0 +1,46 @@
1
+ /**
2
+ * Chain configuration registry.
3
+ * Corresponds to SPEC-013 Section 13.
4
+ */
5
+ import { FcxError } from '../core/errors.js';
6
+ import { CHAIN_IDS, DEFAULT_CHAIN_CONFIGS } from '../core/config.js';
7
+ /**
8
+ * Manages chain configurations and supports runtime chain switching.
9
+ */
10
+ export class ChainRegistry {
11
+ api;
12
+ cache = new Map();
13
+ constructor(api) {
14
+ this.api = api;
15
+ }
16
+ /** List all chains supported by the platform */
17
+ async list() {
18
+ return this.api.get('/chains');
19
+ }
20
+ /** Get full configuration for a specific chain */
21
+ async getConfig(chainId) {
22
+ const cached = this.cache.get(chainId);
23
+ if (cached)
24
+ return cached;
25
+ const config = await this.api.get(`/chains/${chainId}/config`);
26
+ this.cache.set(chainId, config);
27
+ return config;
28
+ }
29
+ /** Get the numeric chain ID for a chain identifier */
30
+ getNumericChainId(chainId) {
31
+ const id = CHAIN_IDS[chainId];
32
+ if (id === undefined) {
33
+ throw new FcxError('CHAIN_UNSUPPORTED', `Unsupported chain: ${chainId}`);
34
+ }
35
+ return id;
36
+ }
37
+ /** Get default config (local, no API call) */
38
+ getDefaultConfig(chainId) {
39
+ return DEFAULT_CHAIN_CONFIGS[chainId];
40
+ }
41
+ /** Clear the config cache */
42
+ clearCache() {
43
+ this.cache.clear();
44
+ }
45
+ }
46
+ //# sourceMappingURL=registry.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"registry.js","sourceRoot":"","sources":["../../src/chain/registry.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAEH,OAAO,EAAE,QAAQ,EAAE,MAAM,mBAAmB,CAAC;AAC7C,OAAO,EAAE,SAAS,EAAE,qBAAqB,EAAE,MAAM,mBAAmB,CAAC;AAIrE;;GAEG;AACH,MAAM,OAAO,aAAa;IAGK;IAFrB,KAAK,GAAG,IAAI,GAAG,EAAwB,CAAC;IAEhD,YAA6B,GAAc;QAAd,QAAG,GAAH,GAAG,CAAW;IAAG,CAAC;IAE/C,gDAAgD;IAChD,KAAK,CAAC,IAAI;QACR,OAAO,IAAI,CAAC,GAAG,CAAC,GAAG,CAAc,SAAS,CAAC,CAAC;IAC9C,CAAC;IAED,kDAAkD;IAClD,KAAK,CAAC,SAAS,CAAC,OAAgB;QAC9B,MAAM,MAAM,GAAG,IAAI,CAAC,KAAK,CAAC,GAAG,CAAC,OAAO,CAAC,CAAC;QACvC,IAAI,MAAM;YAAE,OAAO,MAAM,CAAC;QAE1B,MAAM,MAAM,GAAG,MAAM,IAAI,CAAC,GAAG,CAAC,GAAG,CAAc,WAAW,OAAO,SAAS,CAAC,CAAC;QAC5E,IAAI,CAAC,KAAK,CAAC,GAAG,CAAC,OAAO,EAAE,MAAM,CAAC,CAAC;QAChC,OAAO,MAAM,CAAC;IAChB,CAAC;IAED,sDAAsD;IACtD,iBAAiB,CAAC,OAAgB;QAChC,MAAM,EAAE,GAAG,SAAS,CAAC,OAAO,CAAC,CAAC;QAC9B,IAAI,EAAE,KAAK,SAAS,EAAE,CAAC;YACrB,MAAM,IAAI,QAAQ,CAAC,mBAAmB,EAAE,sBAAsB,OAAO,EAAE,CAAC,CAAC;QAC3E,CAAC;QACD,OAAO,EAAE,CAAC;IACZ,CAAC;IAED,8CAA8C;IAC9C,gBAAgB,CAAC,OAAgB;QAC/B,OAAO,qBAAqB,CAAC,OAAO,CAAC,CAAC;IACxC,CAAC;IAED,6BAA6B;IAC7B,UAAU;QACR,IAAI,CAAC,KAAK,CAAC,KAAK,EAAE,CAAC;IACrB,CAAC;CACF"}
@@ -0,0 +1,78 @@
1
+ /**
2
+ * FcxWalletClient -- main entry point for the SDK.
3
+ * Corresponds to SPEC-013 Section 2.3.
4
+ */
5
+ import { ApiClient } from '../transport/api.js';
6
+ import { BundlerClient } from '../transport/bundler.js';
7
+ import { IframeBridge } from '../transport/iframe.js';
8
+ import { WalletFactory } from '../wallet/factory.js';
9
+ import { ChainRegistry } from '../chain/registry.js';
10
+ import { PaymasterClient } from '../sponsor/paymaster.js';
11
+ import { AuditClient } from '../audit/history.js';
12
+ import type { Address, ChainId, FcxWalletClientConfig, SecurityEvent, SecurityEventType } from '../types.js';
13
+ type SecurityEventHandler = (event: SecurityEvent) => void;
14
+ /**
15
+ * Main SDK client. All wallet operations flow through this class.
16
+ *
17
+ * @example
18
+ * ```ts
19
+ * const client = new FcxWalletClient({
20
+ * apiKey: 'fcx_live_abc123...',
21
+ * chain: 'arbitrum-one',
22
+ * bundlerUrl: 'https://bundler.yourapp.com/rpc',
23
+ * });
24
+ * ```
25
+ */
26
+ export declare class FcxWalletClient {
27
+ /** Current chain identifier */
28
+ chain: ChainId;
29
+ /** Numeric chain ID */
30
+ readonly chainId: number;
31
+ /** EntryPoint contract address */
32
+ readonly entryPoint: Address;
33
+ /** Wallet lifecycle operations */
34
+ readonly wallet: WalletFactory;
35
+ /** Chain configuration registry */
36
+ readonly chains: ChainRegistry;
37
+ /** Gas sponsorship / paymaster */
38
+ readonly sponsor: PaymasterClient;
39
+ /** Bundler JSON-RPC client */
40
+ readonly bundler: BundlerClient;
41
+ /** Audit and logging */
42
+ readonly audit: AuditClient;
43
+ /** Platform API client (internal) */
44
+ readonly api: ApiClient;
45
+ /** Iframe bridge for cross-origin signing (internal) */
46
+ readonly iframe: IframeBridge | null;
47
+ private eventHandlers;
48
+ constructor(config: FcxWalletClientConfig);
49
+ /**
50
+ * Switch the active chain at runtime.
51
+ * Clears cached chain configurations.
52
+ */
53
+ switchChain(chain: ChainId): void;
54
+ /**
55
+ * Create a new client instance configured for a different chain.
56
+ * Useful for cross-chain operations while keeping the original client intact.
57
+ */
58
+ forChain(chain: ChainId): FcxWalletClient;
59
+ /**
60
+ * Subscribe to security events.
61
+ *
62
+ * @example
63
+ * ```ts
64
+ * client.on('security:suspicious', (event) => {
65
+ * console.log(event.type, event.recommendation);
66
+ * });
67
+ * ```
68
+ */
69
+ on(event: 'security:suspicious', handler: SecurityEventHandler): void;
70
+ /** Unsubscribe from security events */
71
+ off(event: 'security:suspicious', handler: SecurityEventHandler): void;
72
+ /** Emit a security event (internal use) */
73
+ emitSecurityEvent(type: SecurityEventType, details: Record<string, unknown>, recommendation: SecurityEvent['recommendation']): void;
74
+ /** Clean up resources (iframe, event listeners) */
75
+ destroy(): void;
76
+ }
77
+ export {};
78
+ //# sourceMappingURL=client.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"client.d.ts","sourceRoot":"","sources":["../../src/core/client.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAIH,OAAO,EAAE,SAAS,EAAE,MAAM,qBAAqB,CAAC;AAChD,OAAO,EAAE,aAAa,EAAE,MAAM,yBAAyB,CAAC;AACxD,OAAO,EAAE,YAAY,EAAE,MAAM,wBAAwB,CAAC;AACtD,OAAO,EAAE,aAAa,EAAE,MAAM,sBAAsB,CAAC;AACrD,OAAO,EAAE,aAAa,EAAE,MAAM,sBAAsB,CAAC;AACrD,OAAO,EAAE,eAAe,EAAE,MAAM,yBAAyB,CAAC;AAC1D,OAAO,EAAE,WAAW,EAAE,MAAM,qBAAqB,CAAC;AAClD,OAAO,KAAK,EACV,OAAO,EACP,OAAO,EACP,qBAAqB,EACrB,aAAa,EACb,iBAAiB,EAClB,MAAM,aAAa,CAAC;AAErB,KAAK,oBAAoB,GAAG,CAAC,KAAK,EAAE,aAAa,KAAK,IAAI,CAAC;AAE3D;;;;;;;;;;;GAWG;AACH,qBAAa,eAAe;IAC1B,+BAA+B;IAC/B,KAAK,EAAE,OAAO,CAAC;IAEf,uBAAuB;IACvB,QAAQ,CAAC,OAAO,EAAE,MAAM,CAAC;IAEzB,kCAAkC;IAClC,QAAQ,CAAC,UAAU,EAAE,OAAO,CAAC;IAE7B,kCAAkC;IAClC,QAAQ,CAAC,MAAM,EAAE,aAAa,CAAC;IAE/B,mCAAmC;IACnC,QAAQ,CAAC,MAAM,EAAE,aAAa,CAAC;IAE/B,kCAAkC;IAClC,QAAQ,CAAC,OAAO,EAAE,eAAe,CAAC;IAElC,8BAA8B;IAC9B,QAAQ,CAAC,OAAO,EAAE,aAAa,CAAC;IAEhC,wBAAwB;IACxB,QAAQ,CAAC,KAAK,EAAE,WAAW,CAAC;IAE5B,qCAAqC;IACrC,QAAQ,CAAC,GAAG,EAAE,SAAS,CAAC;IAExB,wDAAwD;IACxD,QAAQ,CAAC,MAAM,EAAE,YAAY,GAAG,IAAI,CAAC;IAErC,OAAO,CAAC,aAAa,CAAgD;gBAEzD,MAAM,EAAE,qBAAqB;IA2BzC;;;OAGG;IACH,WAAW,CAAC,KAAK,EAAE,OAAO,GAAG,IAAI;IAUjC;;;OAGG;IACH,QAAQ,CAAC,KAAK,EAAE,OAAO,GAAG,eAAe;IAQzC;;;;;;;;;OASG;IACH,EAAE,CAAC,KAAK,EAAE,qBAAqB,EAAE,OAAO,EAAE,oBAAoB,GAAG,IAAI;IASrE,uCAAuC;IACvC,GAAG,CAAC,KAAK,EAAE,qBAAqB,EAAE,OAAO,EAAE,oBAAoB,GAAG,IAAI;IAItE,2CAA2C;IAC3C,iBAAiB,CAAC,IAAI,EAAE,iBAAiB,EAAE,OAAO,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,EAAE,cAAc,EAAE,aAAa,CAAC,gBAAgB,CAAC,GAAG,IAAI;IAUnI,mDAAmD;IACnD,OAAO,IAAI,IAAI;CAIhB"}
@@ -0,0 +1,129 @@
1
+ /**
2
+ * FcxWalletClient -- main entry point for the SDK.
3
+ * Corresponds to SPEC-013 Section 2.3.
4
+ */
5
+ import { FcxError } from './errors.js';
6
+ import { ENTRYPOINT_V06, CHAIN_IDS } from './config.js';
7
+ import { ApiClient } from '../transport/api.js';
8
+ import { BundlerClient } from '../transport/bundler.js';
9
+ import { IframeBridge } from '../transport/iframe.js';
10
+ import { WalletFactory } from '../wallet/factory.js';
11
+ import { ChainRegistry } from '../chain/registry.js';
12
+ import { PaymasterClient } from '../sponsor/paymaster.js';
13
+ import { AuditClient } from '../audit/history.js';
14
+ /**
15
+ * Main SDK client. All wallet operations flow through this class.
16
+ *
17
+ * @example
18
+ * ```ts
19
+ * const client = new FcxWalletClient({
20
+ * apiKey: 'fcx_live_abc123...',
21
+ * chain: 'arbitrum-one',
22
+ * bundlerUrl: 'https://bundler.yourapp.com/rpc',
23
+ * });
24
+ * ```
25
+ */
26
+ export class FcxWalletClient {
27
+ /** Current chain identifier */
28
+ chain;
29
+ /** Numeric chain ID */
30
+ chainId;
31
+ /** EntryPoint contract address */
32
+ entryPoint;
33
+ /** Wallet lifecycle operations */
34
+ wallet;
35
+ /** Chain configuration registry */
36
+ chains;
37
+ /** Gas sponsorship / paymaster */
38
+ sponsor;
39
+ /** Bundler JSON-RPC client */
40
+ bundler;
41
+ /** Audit and logging */
42
+ audit;
43
+ /** Platform API client (internal) */
44
+ api;
45
+ /** Iframe bridge for cross-origin signing (internal) */
46
+ iframe;
47
+ eventHandlers = new Map();
48
+ constructor(config) {
49
+ this.chain = config.chain;
50
+ this.chainId = CHAIN_IDS[config.chain] ?? (() => {
51
+ throw new FcxError('CHAIN_UNSUPPORTED', `Unsupported chain: ${config.chain}`);
52
+ })();
53
+ this.entryPoint = config.entryPoint ?? ENTRYPOINT_V06;
54
+ // Initialise transport clients
55
+ const apiBaseUrl = config.paymasterUrl ?? config.authUrl ?? 'https://api.fcxwallet.com/v1';
56
+ this.api = new ApiClient(apiBaseUrl, config.apiKey);
57
+ this.bundler = new BundlerClient(config.bundlerUrl ?? `https://bundler.fcxwallet.com/${config.chain}`, this.entryPoint);
58
+ this.iframe = config.signerIframeUrl
59
+ ? new IframeBridge(config.signerIframeUrl, typeof window !== 'undefined' ? window.location.origin : '')
60
+ : null;
61
+ // Initialise modules
62
+ this.wallet = new WalletFactory(this.api, this.chain);
63
+ this.chains = new ChainRegistry(this.api);
64
+ this.sponsor = new PaymasterClient(this.api);
65
+ this.audit = new AuditClient(this.api);
66
+ }
67
+ /**
68
+ * Switch the active chain at runtime.
69
+ * Clears cached chain configurations.
70
+ */
71
+ switchChain(chain) {
72
+ const newChainId = CHAIN_IDS[chain];
73
+ if (newChainId === undefined) {
74
+ throw new FcxError('CHAIN_UNSUPPORTED', `Unsupported chain: ${chain}`);
75
+ }
76
+ this.chain = chain;
77
+ this.chainId = newChainId;
78
+ this.chains.clearCache();
79
+ }
80
+ /**
81
+ * Create a new client instance configured for a different chain.
82
+ * Useful for cross-chain operations while keeping the original client intact.
83
+ */
84
+ forChain(chain) {
85
+ return new FcxWalletClient({
86
+ apiKey: this.api.apiKey,
87
+ chain,
88
+ entryPoint: this.entryPoint,
89
+ });
90
+ }
91
+ /**
92
+ * Subscribe to security events.
93
+ *
94
+ * @example
95
+ * ```ts
96
+ * client.on('security:suspicious', (event) => {
97
+ * console.log(event.type, event.recommendation);
98
+ * });
99
+ * ```
100
+ */
101
+ on(event, handler) {
102
+ let handlers = this.eventHandlers.get(event);
103
+ if (!handlers) {
104
+ handlers = new Set();
105
+ this.eventHandlers.set(event, handlers);
106
+ }
107
+ handlers.add(handler);
108
+ }
109
+ /** Unsubscribe from security events */
110
+ off(event, handler) {
111
+ this.eventHandlers.get(event)?.delete(handler);
112
+ }
113
+ /** Emit a security event (internal use) */
114
+ emitSecurityEvent(type, details, recommendation) {
115
+ const handlers = this.eventHandlers.get('security:suspicious');
116
+ if (handlers) {
117
+ const event = { type, details, recommendation };
118
+ for (const handler of handlers) {
119
+ handler(event);
120
+ }
121
+ }
122
+ }
123
+ /** Clean up resources (iframe, event listeners) */
124
+ destroy() {
125
+ this.iframe?.destroy();
126
+ this.eventHandlers.clear();
127
+ }
128
+ }
129
+ //# sourceMappingURL=client.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"client.js","sourceRoot":"","sources":["../../src/core/client.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,22 @@
1
+ /**
2
+ * Chain configuration and constants.
3
+ * Corresponds to SPEC-013 Sections 2.3 and 13.
4
+ */
5
+ import type { Address, ChainId, ChainConfig } from '../types.js';
6
+ /** Canonical EntryPoint v0.6 address -- NEVER deploy custom (CLAUDE.md) */
7
+ export declare const ENTRYPOINT_V06: Address;
8
+ /** RIP-7212 P256 precompile address */
9
+ export declare const RIP7212_PRECOMPILE: Address;
10
+ /** ERC-1967 implementation slot */
11
+ export declare const ERC1967_IMPLEMENTATION_SLOT: "0x360894a13ba1a3210667c828492db98dca3e2076cc3735a920a3ca505d382bbc";
12
+ /** P256 curve order N */
13
+ export declare const P256_N = 115792089210356248762697446949407573529996955224135760342422259061068512044369n;
14
+ /** Gas estimation safety margin: 130% */
15
+ export declare const GAS_SAFETY_MARGIN = 1.3;
16
+ /** Fee estimation safety margin: 120% */
17
+ export declare const FEE_SAFETY_MARGIN = 1.2;
18
+ /** Numeric chain IDs */
19
+ export declare const CHAIN_IDS: Record<ChainId, number>;
20
+ /** Default chain configurations */
21
+ export declare const DEFAULT_CHAIN_CONFIGS: Partial<Record<ChainId, Partial<ChainConfig>>>;
22
+ //# sourceMappingURL=config.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"config.d.ts","sourceRoot":"","sources":["../../src/core/config.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAEH,OAAO,KAAK,EAAE,OAAO,EAAE,OAAO,EAAE,WAAW,EAAE,MAAM,aAAa,CAAC;AAEjE,2EAA2E;AAC3E,eAAO,MAAM,cAAc,EAAE,OAAsD,CAAC;AAEpF,uCAAuC;AACvC,eAAO,MAAM,kBAAkB,EAAE,OAAsD,CAAC;AAExF,mCAAmC;AACnC,eAAO,MAAM,2BAA2B,EACtC,oEAA6E,CAAC;AAEhF,yBAAyB;AACzB,eAAO,MAAM,MAAM,kFAAsE,CAAC;AAE1F,yCAAyC;AACzC,eAAO,MAAM,iBAAiB,MAAM,CAAC;AAErC,yCAAyC;AACzC,eAAO,MAAM,iBAAiB,MAAM,CAAC;AAErC,wBAAwB;AACxB,eAAO,MAAM,SAAS,EAAE,MAAM,CAAC,OAAO,EAAE,MAAM,CAS7C,CAAC;AAEF,mCAAmC;AACnC,eAAO,MAAM,qBAAqB,EAAE,OAAO,CAAC,MAAM,CAAC,OAAO,EAAE,OAAO,CAAC,WAAW,CAAC,CAAC,CA6DhF,CAAC"}
@@ -0,0 +1,91 @@
1
+ /**
2
+ * Chain configuration and constants.
3
+ * Corresponds to SPEC-013 Sections 2.3 and 13.
4
+ */
5
+ /** Canonical EntryPoint v0.6 address -- NEVER deploy custom (CLAUDE.md) */
6
+ export const ENTRYPOINT_V06 = '0x5FF137D4b0FDCD49DcA30c7CF57E578a026d2789';
7
+ /** RIP-7212 P256 precompile address */
8
+ export const RIP7212_PRECOMPILE = '0x0000000000000000000000000000000000000100';
9
+ /** ERC-1967 implementation slot */
10
+ export const ERC1967_IMPLEMENTATION_SLOT = '0x360894a13ba1a3210667c828492db98dca3e2076cc3735a920a3ca505d382bbc';
11
+ /** P256 curve order N */
12
+ export const P256_N = 0xffffffff00000000ffffffffffffffffbce6faada7179e84f3b9cac2fc632551n;
13
+ /** Gas estimation safety margin: 130% */
14
+ export const GAS_SAFETY_MARGIN = 1.3;
15
+ /** Fee estimation safety margin: 120% */
16
+ export const FEE_SAFETY_MARGIN = 1.2;
17
+ /** Numeric chain IDs */
18
+ export const CHAIN_IDS = {
19
+ 'arbitrum-one': 42161,
20
+ 'arbitrum-sepolia': 421614,
21
+ 'base': 8453,
22
+ 'base-sepolia': 84532,
23
+ 'polygon': 137,
24
+ 'polygon-amoy': 80002,
25
+ 'ethereum': 1,
26
+ 'sepolia': 11155111,
27
+ };
28
+ /** Default chain configurations */
29
+ export const DEFAULT_CHAIN_CONFIGS = {
30
+ 'arbitrum-one': {
31
+ chainId: 42161,
32
+ entryPoint: ENTRYPOINT_V06,
33
+ gas: {
34
+ safetyMargin: GAS_SAFETY_MARGIN,
35
+ minPriorityFee: 100000000n,
36
+ estimationMethod: 'bundler',
37
+ },
38
+ features: { rip7212: true, erc6900: true, sponsorship: true },
39
+ },
40
+ 'arbitrum-sepolia': {
41
+ chainId: 421614,
42
+ entryPoint: ENTRYPOINT_V06,
43
+ gas: {
44
+ safetyMargin: GAS_SAFETY_MARGIN,
45
+ minPriorityFee: 100000000n,
46
+ estimationMethod: 'bundler',
47
+ },
48
+ features: { rip7212: true, erc6900: true, sponsorship: true },
49
+ },
50
+ 'base': {
51
+ chainId: 8453,
52
+ entryPoint: ENTRYPOINT_V06,
53
+ gas: {
54
+ safetyMargin: GAS_SAFETY_MARGIN,
55
+ minPriorityFee: 100000000n,
56
+ estimationMethod: 'bundler',
57
+ },
58
+ features: { rip7212: true, erc6900: true, sponsorship: true },
59
+ },
60
+ 'base-sepolia': {
61
+ chainId: 84532,
62
+ entryPoint: ENTRYPOINT_V06,
63
+ gas: {
64
+ safetyMargin: GAS_SAFETY_MARGIN,
65
+ minPriorityFee: 100000000n,
66
+ estimationMethod: 'bundler',
67
+ },
68
+ features: { rip7212: true, erc6900: true, sponsorship: true },
69
+ },
70
+ 'polygon': {
71
+ chainId: 137,
72
+ entryPoint: ENTRYPOINT_V06,
73
+ gas: {
74
+ safetyMargin: GAS_SAFETY_MARGIN,
75
+ minPriorityFee: 30000000000n,
76
+ estimationMethod: 'bundler',
77
+ },
78
+ features: { rip7212: false, erc6900: true, sponsorship: true },
79
+ },
80
+ 'sepolia': {
81
+ chainId: 11155111,
82
+ entryPoint: ENTRYPOINT_V06,
83
+ gas: {
84
+ safetyMargin: GAS_SAFETY_MARGIN,
85
+ minPriorityFee: 100000000n,
86
+ estimationMethod: 'bundler',
87
+ },
88
+ features: { rip7212: true, erc6900: true, sponsorship: true },
89
+ },
90
+ };
91
+ //# sourceMappingURL=config.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"config.js","sourceRoot":"","sources":["../../src/core/config.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,32 @@
1
+ /**
2
+ * Error taxonomy for the FcxWallet SDK.
3
+ * Corresponds to SPEC-013 Section 15.
4
+ */
5
+ import type { Hex } from '../types.js';
6
+ /** All error codes defined in SPEC-013 Section 15.2 */
7
+ export type FcxErrorCode = 'API_KEY_INVALID' | 'API_KEY_CHAIN_MISMATCH' | 'API_KEY_QUOTA_EXCEEDED' | 'API_KEY_PERMISSION_DENIED' | 'AUTH_OTP_INVALID' | 'AUTH_OTP_EXPIRED' | 'AUTH_OTP_RATE_LIMITED' | 'AUTH_SESSION_EXPIRED' | 'AUTH_SESSION_REVOKED' | 'AUTH_OAUTH_FAILED' | 'WALLET_NOT_DEPLOYED' | 'WALLET_FROZEN' | 'USEROP_SIGNATURE_INVALID' | 'USEROP_SIMULATION_FAILED' | 'USEROP_PAYMASTER_REJECTED' | 'USEROP_OPCODE_BANNED' | 'USEROP_EXPIRED' | 'USEROP_PAYMASTER_THROTTLED' | 'USEROP_STAKE_TOO_LOW' | 'USEROP_GAS_TOO_LOW' | 'USEROP_NONCE_INVALID' | 'SPONSOR_BUDGET_EXHAUSTED' | 'SPONSOR_POLICY_REJECTED' | 'SPONSOR_SIGNER_ERROR' | 'SESSION_KEY_EXPIRED' | 'SESSION_KEY_SPEND_EXCEEDED' | 'SESSION_KEY_NOT_ALLOWED' | 'SESSION_KEY_PAYMASTER_WRONG' | 'MFA_THRESHOLD_NOT_MET' | 'MFA_TIMELOCK_PENDING' | 'RECOVERY_NOT_AUTHORIZED' | 'RECOVERY_TIMELOCK_PENDING' | 'RECOVERY_ALREADY_PENDING' | 'CHAIN_UNSUPPORTED' | 'NETWORK_ERROR' | 'IFRAME_TIMEOUT';
8
+ /**
9
+ * Structured error class for all SDK operations.
10
+ * Every error has a typed code, optional details, and retryability flag.
11
+ */
12
+ export declare class FcxError extends Error {
13
+ readonly code: FcxErrorCode;
14
+ readonly details?: Record<string, unknown>;
15
+ readonly userOpHash?: Hex;
16
+ readonly httpStatus?: number;
17
+ readonly rpcCode?: number;
18
+ readonly retryable: boolean;
19
+ constructor(code: FcxErrorCode, message: string, options?: {
20
+ details?: Record<string, unknown>;
21
+ userOpHash?: Hex;
22
+ cause?: Error;
23
+ });
24
+ /** Create FcxError from a bundler JSON-RPC error response */
25
+ static fromRpcError(rpcCode: number, message: string, data?: Record<string, unknown>): FcxError;
26
+ /** Create FcxError from an HTTP error response */
27
+ static fromHttpError(status: number, body: {
28
+ code?: string;
29
+ message?: string;
30
+ }): FcxError;
31
+ }
32
+ //# sourceMappingURL=errors.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"errors.d.ts","sourceRoot":"","sources":["../../src/core/errors.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAEH,OAAO,KAAK,EAAE,GAAG,EAAE,MAAM,aAAa,CAAC;AAEvC,uDAAuD;AACvD,MAAM,MAAM,YAAY,GAEpB,iBAAiB,GACjB,wBAAwB,GACxB,wBAAwB,GACxB,2BAA2B,GAE3B,kBAAkB,GAClB,kBAAkB,GAClB,uBAAuB,GACvB,sBAAsB,GACtB,sBAAsB,GACtB,mBAAmB,GAEnB,qBAAqB,GACrB,eAAe,GAEf,0BAA0B,GAC1B,0BAA0B,GAC1B,2BAA2B,GAC3B,sBAAsB,GACtB,gBAAgB,GAChB,4BAA4B,GAC5B,sBAAsB,GACtB,oBAAoB,GACpB,sBAAsB,GAEtB,0BAA0B,GAC1B,yBAAyB,GACzB,sBAAsB,GAEtB,qBAAqB,GACrB,4BAA4B,GAC5B,yBAAyB,GACzB,6BAA6B,GAE7B,uBAAuB,GACvB,sBAAsB,GAEtB,yBAAyB,GACzB,2BAA2B,GAC3B,0BAA0B,GAE1B,mBAAmB,GAEnB,eAAe,GACf,gBAAgB,CAAC;AA6DrB;;;GAGG;AACH,qBAAa,QAAS,SAAQ,KAAK;IACjC,QAAQ,CAAC,IAAI,EAAE,YAAY,CAAC;IAC5B,QAAQ,CAAC,OAAO,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC;IAC3C,QAAQ,CAAC,UAAU,CAAC,EAAE,GAAG,CAAC;IAC1B,QAAQ,CAAC,UAAU,CAAC,EAAE,MAAM,CAAC;IAC7B,QAAQ,CAAC,OAAO,CAAC,EAAE,MAAM,CAAC;IAC1B,QAAQ,CAAC,SAAS,EAAE,OAAO,CAAC;gBAG1B,IAAI,EAAE,YAAY,EAClB,OAAO,EAAE,MAAM,EACf,OAAO,CAAC,EAAE;QACR,OAAO,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC;QAClC,UAAU,CAAC,EAAE,GAAG,CAAC;QACjB,KAAK,CAAC,EAAE,KAAK,CAAC;KACf;IAYH,6DAA6D;IAC7D,MAAM,CAAC,YAAY,CAAC,OAAO,EAAE,MAAM,EAAE,OAAO,EAAE,MAAM,EAAE,IAAI,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,GAAG,QAAQ;IAO/F,kDAAkD;IAClD,MAAM,CAAC,aAAa,CAAC,MAAM,EAAE,MAAM,EAAE,IAAI,EAAE;QAAE,IAAI,CAAC,EAAE,MAAM,CAAC;QAAC,OAAO,CAAC,EAAE,MAAM,CAAA;KAAE,GAAG,QAAQ;CAM1F"}
@@ -0,0 +1,95 @@
1
+ /**
2
+ * Error taxonomy for the FcxWallet SDK.
3
+ * Corresponds to SPEC-013 Section 15.
4
+ */
5
+ /** HTTP status codes mapped to error codes */
6
+ const ERROR_HTTP_STATUS = {
7
+ API_KEY_INVALID: 401,
8
+ API_KEY_CHAIN_MISMATCH: 403,
9
+ API_KEY_QUOTA_EXCEEDED: 429,
10
+ API_KEY_PERMISSION_DENIED: 403,
11
+ AUTH_OTP_INVALID: 401,
12
+ AUTH_OTP_EXPIRED: 401,
13
+ AUTH_OTP_RATE_LIMITED: 429,
14
+ AUTH_SESSION_EXPIRED: 401,
15
+ AUTH_SESSION_REVOKED: 401,
16
+ AUTH_OAUTH_FAILED: 401,
17
+ WALLET_NOT_DEPLOYED: 400,
18
+ WALLET_FROZEN: 403,
19
+ USEROP_SIGNATURE_INVALID: undefined,
20
+ USEROP_SIMULATION_FAILED: undefined,
21
+ USEROP_PAYMASTER_REJECTED: undefined,
22
+ USEROP_OPCODE_BANNED: undefined,
23
+ USEROP_EXPIRED: undefined,
24
+ USEROP_PAYMASTER_THROTTLED: undefined,
25
+ USEROP_STAKE_TOO_LOW: undefined,
26
+ USEROP_GAS_TOO_LOW: 400,
27
+ USEROP_NONCE_INVALID: 400,
28
+ SPONSOR_BUDGET_EXHAUSTED: 402,
29
+ SPONSOR_POLICY_REJECTED: 403,
30
+ SPONSOR_SIGNER_ERROR: 500,
31
+ SESSION_KEY_EXPIRED: 403,
32
+ SESSION_KEY_SPEND_EXCEEDED: 403,
33
+ SESSION_KEY_NOT_ALLOWED: 403,
34
+ SESSION_KEY_PAYMASTER_WRONG: 403,
35
+ MFA_THRESHOLD_NOT_MET: 403,
36
+ MFA_TIMELOCK_PENDING: 403,
37
+ RECOVERY_NOT_AUTHORIZED: 403,
38
+ RECOVERY_TIMELOCK_PENDING: 403,
39
+ RECOVERY_ALREADY_PENDING: 409,
40
+ CHAIN_UNSUPPORTED: 400,
41
+ NETWORK_ERROR: 503,
42
+ IFRAME_TIMEOUT: 408,
43
+ };
44
+ /** JSON-RPC error codes for bundler errors */
45
+ const ERROR_RPC_CODES = {
46
+ USEROP_SIGNATURE_INVALID: -32507,
47
+ USEROP_SIMULATION_FAILED: -32500,
48
+ USEROP_PAYMASTER_REJECTED: -32501,
49
+ USEROP_OPCODE_BANNED: -32502,
50
+ USEROP_EXPIRED: -32503,
51
+ USEROP_PAYMASTER_THROTTLED: -32504,
52
+ USEROP_STAKE_TOO_LOW: -32505,
53
+ };
54
+ /** Whether an error code is retryable */
55
+ const RETRYABLE_CODES = new Set([
56
+ 'NETWORK_ERROR',
57
+ 'IFRAME_TIMEOUT',
58
+ 'USEROP_GAS_TOO_LOW',
59
+ 'SPONSOR_SIGNER_ERROR',
60
+ ]);
61
+ /**
62
+ * Structured error class for all SDK operations.
63
+ * Every error has a typed code, optional details, and retryability flag.
64
+ */
65
+ export class FcxError extends Error {
66
+ code;
67
+ details;
68
+ userOpHash;
69
+ httpStatus;
70
+ rpcCode;
71
+ retryable;
72
+ constructor(code, message, options) {
73
+ super(message, { cause: options?.cause });
74
+ this.name = 'FcxError';
75
+ this.code = code;
76
+ this.details = options?.details;
77
+ this.userOpHash = options?.userOpHash;
78
+ this.httpStatus = ERROR_HTTP_STATUS[code];
79
+ this.rpcCode = ERROR_RPC_CODES[code];
80
+ this.retryable = RETRYABLE_CODES.has(code);
81
+ }
82
+ /** Create FcxError from a bundler JSON-RPC error response */
83
+ static fromRpcError(rpcCode, message, data) {
84
+ const code = Object.entries(ERROR_RPC_CODES).find(([, v]) => v === rpcCode)?.[0];
85
+ return new FcxError(code ?? 'USEROP_SIMULATION_FAILED', message, { details: data });
86
+ }
87
+ /** Create FcxError from an HTTP error response */
88
+ static fromHttpError(status, body) {
89
+ const code = body.code ?? 'NETWORK_ERROR';
90
+ return new FcxError(code, body.message ?? `HTTP ${status}`, {
91
+ details: { httpStatus: status },
92
+ });
93
+ }
94
+ }
95
+ //# sourceMappingURL=errors.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"errors.js","sourceRoot":"","sources":["../../src/core/errors.ts"],"names":[],"mappings":"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"}