@prism-ing/wallet 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 (113) hide show
  1. package/CHANGELOG.md +21 -0
  2. package/LICENSE +21 -0
  3. package/README.md +596 -0
  4. package/SPEC.md +192 -0
  5. package/dist/backends/squads-recovery-backend.d.ts +59 -0
  6. package/dist/backends/squads-recovery-backend.d.ts.map +1 -0
  7. package/dist/backends/squads-recovery-backend.js +81 -0
  8. package/dist/backends/squads-recovery-backend.js.map +1 -0
  9. package/dist/backends/squads-types.d.ts +74 -0
  10. package/dist/backends/squads-types.d.ts.map +1 -0
  11. package/dist/backends/squads-types.js +22 -0
  12. package/dist/backends/squads-types.js.map +1 -0
  13. package/dist/backends/zerodev-policy-mapper.d.ts +41 -0
  14. package/dist/backends/zerodev-policy-mapper.d.ts.map +1 -0
  15. package/dist/backends/zerodev-policy-mapper.js +127 -0
  16. package/dist/backends/zerodev-policy-mapper.js.map +1 -0
  17. package/dist/backends/zerodev-session-backend.d.ts +43 -0
  18. package/dist/backends/zerodev-session-backend.d.ts.map +1 -0
  19. package/dist/backends/zerodev-session-backend.js +63 -0
  20. package/dist/backends/zerodev-session-backend.js.map +1 -0
  21. package/dist/backends/zerodev-types.d.ts +104 -0
  22. package/dist/backends/zerodev-types.d.ts.map +1 -0
  23. package/dist/backends/zerodev-types.js +13 -0
  24. package/dist/backends/zerodev-types.js.map +1 -0
  25. package/dist/create-wallet.d.ts +89 -0
  26. package/dist/create-wallet.d.ts.map +1 -0
  27. package/dist/create-wallet.js +235 -0
  28. package/dist/create-wallet.js.map +1 -0
  29. package/dist/cross-chain.d.ts +64 -0
  30. package/dist/cross-chain.d.ts.map +1 -0
  31. package/dist/cross-chain.js +200 -0
  32. package/dist/cross-chain.js.map +1 -0
  33. package/dist/errors.d.ts +115 -0
  34. package/dist/errors.d.ts.map +1 -0
  35. package/dist/errors.js +97 -0
  36. package/dist/errors.js.map +1 -0
  37. package/dist/index.d.ts +55 -0
  38. package/dist/index.d.ts.map +1 -0
  39. package/dist/index.js +52 -0
  40. package/dist/index.js.map +1 -0
  41. package/dist/internal/base58.d.ts +8 -0
  42. package/dist/internal/base58.d.ts.map +1 -0
  43. package/dist/internal/base58.js +34 -0
  44. package/dist/internal/base58.js.map +1 -0
  45. package/dist/internal/eip712.d.ts +41 -0
  46. package/dist/internal/eip712.d.ts.map +1 -0
  47. package/dist/internal/eip712.js +182 -0
  48. package/dist/internal/eip712.js.map +1 -0
  49. package/dist/internal/file-spend-persistence.d.ts +9 -0
  50. package/dist/internal/file-spend-persistence.d.ts.map +1 -0
  51. package/dist/internal/file-spend-persistence.js +58 -0
  52. package/dist/internal/file-spend-persistence.js.map +1 -0
  53. package/dist/internal/onebalance-client.d.ts +59 -0
  54. package/dist/internal/onebalance-client.d.ts.map +1 -0
  55. package/dist/internal/onebalance-client.js +2 -0
  56. package/dist/internal/onebalance-client.js.map +1 -0
  57. package/dist/internal/onebalance-http-client.d.ts +25 -0
  58. package/dist/internal/onebalance-http-client.d.ts.map +1 -0
  59. package/dist/internal/onebalance-http-client.js +161 -0
  60. package/dist/internal/onebalance-http-client.js.map +1 -0
  61. package/dist/internal/onebalance-types.d.ts +201 -0
  62. package/dist/internal/onebalance-types.d.ts.map +1 -0
  63. package/dist/internal/onebalance-types.js +39 -0
  64. package/dist/internal/onebalance-types.js.map +1 -0
  65. package/dist/internal/platform.d.ts +14 -0
  66. package/dist/internal/platform.d.ts.map +1 -0
  67. package/dist/internal/platform.js +22 -0
  68. package/dist/internal/platform.js.map +1 -0
  69. package/dist/internal/quote-verifier.d.ts +71 -0
  70. package/dist/internal/quote-verifier.d.ts.map +1 -0
  71. package/dist/internal/quote-verifier.js +172 -0
  72. package/dist/internal/quote-verifier.js.map +1 -0
  73. package/dist/internal/recovery-manager.d.ts +29 -0
  74. package/dist/internal/recovery-manager.d.ts.map +1 -0
  75. package/dist/internal/recovery-manager.js +161 -0
  76. package/dist/internal/recovery-manager.js.map +1 -0
  77. package/dist/result.d.ts +132 -0
  78. package/dist/result.d.ts.map +1 -0
  79. package/dist/result.js +114 -0
  80. package/dist/result.js.map +1 -0
  81. package/dist/schemas.d.ts +184 -0
  82. package/dist/schemas.d.ts.map +1 -0
  83. package/dist/schemas.js +76 -0
  84. package/dist/schemas.js.map +1 -0
  85. package/dist/session-keys.d.ts +53 -0
  86. package/dist/session-keys.d.ts.map +1 -0
  87. package/dist/session-keys.js +345 -0
  88. package/dist/session-keys.js.map +1 -0
  89. package/dist/signers/node-signing-backend.d.ts +11 -0
  90. package/dist/signers/node-signing-backend.d.ts.map +1 -0
  91. package/dist/signers/node-signing-backend.js +120 -0
  92. package/dist/signers/node-signing-backend.js.map +1 -0
  93. package/dist/signers/ows-adapter.d.ts +70 -0
  94. package/dist/signers/ows-adapter.d.ts.map +1 -0
  95. package/dist/signers/ows-adapter.js +53 -0
  96. package/dist/signers/ows-adapter.js.map +1 -0
  97. package/dist/signers/ows-signing-backend.d.ts +25 -0
  98. package/dist/signers/ows-signing-backend.d.ts.map +1 -0
  99. package/dist/signers/ows-signing-backend.js +192 -0
  100. package/dist/signers/ows-signing-backend.js.map +1 -0
  101. package/dist/signers/secure-enclave-backend.d.ts +19 -0
  102. package/dist/signers/secure-enclave-backend.d.ts.map +1 -0
  103. package/dist/signers/secure-enclave-backend.js +201 -0
  104. package/dist/signers/secure-enclave-backend.js.map +1 -0
  105. package/dist/signers/secure-enclave-types.d.ts +98 -0
  106. package/dist/signers/secure-enclave-types.d.ts.map +1 -0
  107. package/dist/signers/secure-enclave-types.js +12 -0
  108. package/dist/signers/secure-enclave-types.js.map +1 -0
  109. package/dist/types.d.ts +371 -0
  110. package/dist/types.d.ts.map +1 -0
  111. package/dist/types.js +2 -0
  112. package/dist/types.js.map +1 -0
  113. package/package.json +85 -0
@@ -0,0 +1,200 @@
1
+ import { Ok, Err, fromPromise } from './result.js';
2
+ import { walletErrors } from './errors.js';
3
+ import { verifyQuoteIntegrity } from './internal/quote-verifier.js';
4
+ import { base58Encode } from './internal/base58.js';
5
+ // ---------------------------------------------------------------------------
6
+ // Quote + Sign + Execute
7
+ // ---------------------------------------------------------------------------
8
+ /**
9
+ * Execute a cross-chain swap or transfer via OneBalance.
10
+ *
11
+ * @remarks
12
+ * Flow:
13
+ * 1. Get a quote from OneBalance (includes typed data to sign per chain operation)
14
+ * 2. Sign each operation — EVM via signTypedData, Solana via signTransaction
15
+ * 3. Submit the signed quote to OneBalance for execution via Resource Locks
16
+ *
17
+ * @param client - The OneBalance API client.
18
+ * @param signer - The PrismSigner for this wallet.
19
+ * @param params - Quote parameters (assets, amount, slippage).
20
+ * @param accounts - The MultiAccount array for this wallet.
21
+ * @returns A Result with the execution status or a WalletError.
22
+ */
23
+ export async function executeCrossChain(client, signer, params, accounts, options) {
24
+ // 1. Get quote
25
+ const quoteRequest = {
26
+ from: {
27
+ accounts,
28
+ asset: { assetId: params.fromAsset },
29
+ amount: params.amount,
30
+ },
31
+ to: {
32
+ asset: { assetId: params.toAsset },
33
+ ...(params.recipient && { account: params.recipient }),
34
+ },
35
+ ...(params.slippageTolerance !== undefined && {
36
+ slippageTolerance: params.slippageTolerance,
37
+ }),
38
+ };
39
+ const quoteResult = await fromPromise(client.getQuote(quoteRequest), (e) => toWalletError(e, 'getQuote'));
40
+ if (!quoteResult.ok)
41
+ return quoteResult;
42
+ const quote = quoteResult.value;
43
+ // 2. Verify quote integrity before signing
44
+ if (params.skipVerification !== true) {
45
+ const verificationParams = {
46
+ fromAsset: params.fromAsset,
47
+ toAsset: params.toAsset,
48
+ amount: params.amount,
49
+ ...(params.accountAddress !== undefined && { accountAddress: params.accountAddress }),
50
+ };
51
+ const verificationError = verifyQuoteIntegrity(quote, verificationParams);
52
+ if (verificationError !== undefined)
53
+ return Err(verificationError);
54
+ }
55
+ // 3. Sign all operations
56
+ const signResult = await signQuoteOperations(signer, quote, options?.backend);
57
+ if (!signResult.ok)
58
+ return signResult;
59
+ const signedQuote = signResult.value;
60
+ // 4. Execute
61
+ const execResult = await fromPromise(client.executeQuote(signedQuote), (e) => toWalletError(e, 'executeQuote'));
62
+ if (!execResult.ok)
63
+ return execResult;
64
+ return Ok({
65
+ quoteId: signedQuote.id,
66
+ status: 'PENDING',
67
+ });
68
+ }
69
+ // ---------------------------------------------------------------------------
70
+ // Signing Orchestration
71
+ // ---------------------------------------------------------------------------
72
+ /**
73
+ * Sign all operations in a quote.
74
+ *
75
+ * @remarks
76
+ * Creates a shallow clone of the quote with cloned operations to avoid
77
+ * mutating the original. EVM operations: signs via signTypedData (EIP-712).
78
+ * Solana operations: signs via signTransaction.
79
+ */
80
+ async function signQuoteOperations(signer, quote, backend) {
81
+ // Shallow clone — only operations are mutated (signature fields)
82
+ const clonedOps = quote.originChainsOperations.map((op) => ({ ...op }));
83
+ const signed = { ...quote, originChainsOperations: clonedOps };
84
+ const doSign = async () => {
85
+ for (const operation of signed.originChainsOperations) {
86
+ if (isSolanaOperation(operation)) {
87
+ const result = await signSolanaOperation(signer, operation);
88
+ if (!result.ok)
89
+ return result;
90
+ }
91
+ else {
92
+ const result = await signEvmOperation(signer, operation);
93
+ if (!result.ok)
94
+ return result;
95
+ }
96
+ }
97
+ return Ok(signed);
98
+ };
99
+ // Batch under single auth context if backend supports it
100
+ if (backend?.withAuthContext !== undefined) {
101
+ const ctxResult = await backend.withAuthContext('Authorize transaction', async () => {
102
+ const inner = await doSign();
103
+ if (!inner.ok) {
104
+ // Propagate the WalletError through the auth context boundary
105
+ const err = new Error(inner.error.code);
106
+ err.walletError = inner.error;
107
+ throw err;
108
+ }
109
+ return inner.value;
110
+ });
111
+ if (!ctxResult.ok)
112
+ return ctxResult;
113
+ return Ok(ctxResult.value);
114
+ }
115
+ return doSign();
116
+ }
117
+ /**
118
+ * Sign an EVM chain operation via EIP-712 typed data.
119
+ *
120
+ * @remarks
121
+ * For Kernel v3.1 accounts, OneBalance provides the typed data to sign
122
+ * in the operation's `typedDataToSign` field. The resulting signature is
123
+ * placed in `userOp.signature`.
124
+ */
125
+ async function signEvmOperation(signer, operation) {
126
+ try {
127
+ const signature = await signer.signTypedData({
128
+ domain: operation.typedDataToSign.domain,
129
+ types: operation.typedDataToSign.types,
130
+ primaryType: operation.typedDataToSign.primaryType,
131
+ message: operation.typedDataToSign.message,
132
+ });
133
+ operation.userOp.signature = signature;
134
+ return Ok(undefined);
135
+ }
136
+ catch (e) {
137
+ return Err(walletErrors.signingRejected(`EVM operation signing failed: ${String(e)}`));
138
+ }
139
+ }
140
+ /**
141
+ * Sign a Solana chain operation.
142
+ *
143
+ * @remarks
144
+ * OneBalance provides `dataToSign` as base64-encoded serialized transaction.
145
+ * We sign via PrismSigner.signTransaction and extract the signature.
146
+ */
147
+ async function signSolanaOperation(signer, operation) {
148
+ try {
149
+ // The PrismSigner.signTransaction expects a transaction-like object.
150
+ // For Solana OneBalance operations, we create a minimal signable wrapper
151
+ // around the base64 dataToSign.
152
+ const dataBytes = base64ToBytes(operation.dataToSign);
153
+ const txLike = {
154
+ message: {
155
+ serialize() {
156
+ return dataBytes;
157
+ },
158
+ },
159
+ signatures: [new Uint8Array(64)],
160
+ };
161
+ const signed = await signer.signTransaction(txLike);
162
+ const sigBytes = signed.signatures[0];
163
+ if (sigBytes) {
164
+ operation.signature = base58Encode(sigBytes);
165
+ }
166
+ return Ok(undefined);
167
+ }
168
+ catch (e) {
169
+ return Err(walletErrors.signingRejected(`Solana operation signing failed: ${String(e)}`));
170
+ }
171
+ }
172
+ // ---------------------------------------------------------------------------
173
+ // Type Guards
174
+ // ---------------------------------------------------------------------------
175
+ function isSolanaOperation(op) {
176
+ return 'type' in op && op.type === 'solana';
177
+ }
178
+ // ---------------------------------------------------------------------------
179
+ // Helpers
180
+ // ---------------------------------------------------------------------------
181
+ function toWalletError(e, operation) {
182
+ if (e instanceof Error && e.name === 'AbortError') {
183
+ return walletErrors.oneBalanceTimeout(30_000);
184
+ }
185
+ if (e instanceof Error &&
186
+ 'statusCode' in e &&
187
+ typeof e.statusCode === 'number') {
188
+ return walletErrors.oneBalanceApi(e.statusCode, String(e));
189
+ }
190
+ return walletErrors.oneBalanceApi(0, `${operation}: ${String(e)}`);
191
+ }
192
+ function base64ToBytes(b64) {
193
+ const binary = atob(b64);
194
+ const bytes = new Uint8Array(binary.length);
195
+ for (let i = 0; i < binary.length; i++) {
196
+ bytes[i] = binary.charCodeAt(i);
197
+ }
198
+ return bytes;
199
+ }
200
+ //# sourceMappingURL=cross-chain.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"cross-chain.js","sourceRoot":"","sources":["../src/cross-chain.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,115 @@
1
+ /**
2
+ * Error types for @prism-ing/wallet.
3
+ *
4
+ * @remarks
5
+ * All errors are discriminated unions keyed by `code`.
6
+ * No `new Error('...')` — every failure is typed and matchable.
7
+ *
8
+ * @packageDocumentation
9
+ */
10
+ /**
11
+ * All possible errors from @prism-ing/wallet operations.
12
+ *
13
+ * @remarks
14
+ * Use the `code` field to match on specific error types.
15
+ * Each variant carries the minimum context needed for debugging.
16
+ */
17
+ export type WalletError = EnclaveUnavailableError | OneBalanceTimeoutError | OneBalanceApiError | RecoveryGuardianInvalidError | SigningRejectedError | AccountNotInitializedError | InsufficientBalanceError | KeyNotFoundError | ValidationError | SessionKeyExpiredError | SessionKeyPolicyViolationError | QuoteVerificationFailedError | SpendCapNotEnforceableError | RecoveryNotConfiguredError;
18
+ /** Secure Enclave is not available on this platform. */
19
+ export interface EnclaveUnavailableError {
20
+ readonly code: 'ENCLAVE_UNAVAILABLE';
21
+ readonly platform: string;
22
+ }
23
+ /** OneBalance API did not respond within the timeout. */
24
+ export interface OneBalanceTimeoutError {
25
+ readonly code: 'ONEBALANCE_TIMEOUT';
26
+ readonly durationMs: number;
27
+ }
28
+ /** OneBalance API returned an error response. */
29
+ export interface OneBalanceApiError {
30
+ readonly code: 'ONEBALANCE_API_ERROR';
31
+ readonly statusCode: number;
32
+ readonly body: string;
33
+ }
34
+ /** The provided guardian address is not a valid recovery guardian. */
35
+ export interface RecoveryGuardianInvalidError {
36
+ readonly code: 'RECOVERY_GUARDIAN_INVALID';
37
+ readonly address: string;
38
+ readonly reason: string;
39
+ }
40
+ /** The user rejected the signing request (biometric failure, cancellation). */
41
+ export interface SigningRejectedError {
42
+ readonly code: 'SIGNING_REJECTED';
43
+ readonly reason: string;
44
+ }
45
+ /** Attempted an operation on an account that has not been initialized. */
46
+ export interface AccountNotInitializedError {
47
+ readonly code: 'ACCOUNT_NOT_INITIALIZED';
48
+ readonly evmAddress: string;
49
+ }
50
+ /** The account does not have sufficient balance for this operation. */
51
+ export interface InsufficientBalanceError {
52
+ readonly code: 'INSUFFICIENT_BALANCE';
53
+ readonly required: string;
54
+ readonly available: string;
55
+ readonly token: string;
56
+ }
57
+ /** The requested key pair was not found in this signing backend. */
58
+ export interface KeyNotFoundError {
59
+ readonly code: 'KEY_NOT_FOUND';
60
+ readonly evmAddress: string;
61
+ }
62
+ /** Input validation failed (Zod parse error). */
63
+ export interface ValidationError {
64
+ readonly code: 'VALIDATION_ERROR';
65
+ readonly field: string;
66
+ readonly message: string;
67
+ }
68
+ /** Session key has expired. */
69
+ export interface SessionKeyExpiredError {
70
+ readonly code: 'SESSION_KEY_EXPIRED';
71
+ readonly sessionId: string;
72
+ readonly expiredAt: number;
73
+ }
74
+ /** Operation violates session key policy constraints. */
75
+ export interface SessionKeyPolicyViolationError {
76
+ readonly code: 'SESSION_KEY_POLICY_VIOLATION';
77
+ readonly sessionId: string;
78
+ readonly violation: string;
79
+ }
80
+ /** OneBalance quote failed client-side integrity verification. */
81
+ export interface QuoteVerificationFailedError {
82
+ readonly code: 'QUOTE_VERIFICATION_FAILED';
83
+ readonly reason: string;
84
+ }
85
+ /** maxTotalAmount was set but no persistence or on-chain backend was provided. */
86
+ export interface SpendCapNotEnforceableError {
87
+ readonly code: 'SPEND_CAP_NOT_ENFORCEABLE';
88
+ readonly sessionId: string;
89
+ }
90
+ /** Wallet cannot be activated because no recovery guardian has been configured. */
91
+ export interface RecoveryNotConfiguredError {
92
+ readonly code: 'RECOVERY_NOT_CONFIGURED';
93
+ readonly platform: string;
94
+ }
95
+ export declare const walletErrors: {
96
+ readonly enclaveUnavailable: (platform: string) => EnclaveUnavailableError;
97
+ readonly oneBalanceTimeout: (durationMs: number) => OneBalanceTimeoutError;
98
+ readonly oneBalanceApi: (statusCode: number, body: string) => OneBalanceApiError;
99
+ readonly recoveryGuardianInvalid: (address: string, reason: string) => RecoveryGuardianInvalidError;
100
+ readonly signingRejected: (reason: string) => SigningRejectedError;
101
+ readonly accountNotInitialized: (evmAddress: string) => AccountNotInitializedError;
102
+ readonly insufficientBalance: (required: string, available: string, token: string) => InsufficientBalanceError;
103
+ readonly keyNotFound: (evmAddress: string) => KeyNotFoundError;
104
+ readonly validation: (field: string, message: string) => ValidationError;
105
+ readonly sessionKeyExpired: (sessionId: string, expiredAt: number) => SessionKeyExpiredError;
106
+ readonly sessionKeyPolicyViolation: (sessionId: string, violation: string) => SessionKeyPolicyViolationError;
107
+ readonly quoteVerificationFailed: (reason: string) => QuoteVerificationFailedError;
108
+ readonly spendCapNotEnforceable: (sessionId: string) => SpendCapNotEnforceableError;
109
+ readonly recoveryNotConfigured: (platform: string) => RecoveryNotConfiguredError;
110
+ };
111
+ /** Type guard: is this error retryable? */
112
+ export declare const isRetryableError: (error: WalletError) => boolean;
113
+ /** Type guard: is this a user-facing error that should be shown as-is? */
114
+ export declare const isUserFacingError: (error: WalletError) => boolean;
115
+ //# sourceMappingURL=errors.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"errors.d.ts","sourceRoot":"","sources":["../src/errors.ts"],"names":[],"mappings":"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"}
package/dist/errors.js ADDED
@@ -0,0 +1,97 @@
1
+ /**
2
+ * Error types for @prism-ing/wallet.
3
+ *
4
+ * @remarks
5
+ * All errors are discriminated unions keyed by `code`.
6
+ * No `new Error('...')` — every failure is typed and matchable.
7
+ *
8
+ * @packageDocumentation
9
+ */
10
+ // ---------------------------------------------------------------------------
11
+ // Error Constructors — prefer these over raw object literals
12
+ // ---------------------------------------------------------------------------
13
+ export const walletErrors = {
14
+ enclaveUnavailable: (platform) => ({
15
+ code: 'ENCLAVE_UNAVAILABLE',
16
+ platform,
17
+ }),
18
+ oneBalanceTimeout: (durationMs) => ({
19
+ code: 'ONEBALANCE_TIMEOUT',
20
+ durationMs,
21
+ }),
22
+ oneBalanceApi: (statusCode, body) => ({
23
+ code: 'ONEBALANCE_API_ERROR',
24
+ statusCode,
25
+ body,
26
+ }),
27
+ recoveryGuardianInvalid: (address, reason) => ({
28
+ code: 'RECOVERY_GUARDIAN_INVALID',
29
+ address,
30
+ reason,
31
+ }),
32
+ signingRejected: (reason) => ({
33
+ code: 'SIGNING_REJECTED',
34
+ reason,
35
+ }),
36
+ accountNotInitialized: (evmAddress) => ({
37
+ code: 'ACCOUNT_NOT_INITIALIZED',
38
+ evmAddress,
39
+ }),
40
+ insufficientBalance: (required, available, token) => ({
41
+ code: 'INSUFFICIENT_BALANCE',
42
+ required,
43
+ available,
44
+ token,
45
+ }),
46
+ keyNotFound: (evmAddress) => ({
47
+ code: 'KEY_NOT_FOUND',
48
+ evmAddress,
49
+ }),
50
+ validation: (field, message) => ({
51
+ code: 'VALIDATION_ERROR',
52
+ field,
53
+ message,
54
+ }),
55
+ sessionKeyExpired: (sessionId, expiredAt) => ({
56
+ code: 'SESSION_KEY_EXPIRED',
57
+ sessionId,
58
+ expiredAt,
59
+ }),
60
+ sessionKeyPolicyViolation: (sessionId, violation) => ({
61
+ code: 'SESSION_KEY_POLICY_VIOLATION',
62
+ sessionId,
63
+ violation,
64
+ }),
65
+ quoteVerificationFailed: (reason) => ({
66
+ code: 'QUOTE_VERIFICATION_FAILED',
67
+ reason,
68
+ }),
69
+ spendCapNotEnforceable: (sessionId) => ({
70
+ code: 'SPEND_CAP_NOT_ENFORCEABLE',
71
+ sessionId,
72
+ }),
73
+ recoveryNotConfigured: (platform) => ({
74
+ code: 'RECOVERY_NOT_CONFIGURED',
75
+ platform,
76
+ }),
77
+ };
78
+ // ---------------------------------------------------------------------------
79
+ // Error Matching Utilities
80
+ // ---------------------------------------------------------------------------
81
+ /** Type guard: is this error retryable? */
82
+ export const isRetryableError = (error) => {
83
+ const retryableCodes = new Set([
84
+ 'ONEBALANCE_TIMEOUT',
85
+ 'ONEBALANCE_API_ERROR',
86
+ ]);
87
+ return retryableCodes.has(error.code);
88
+ };
89
+ /** Type guard: is this a user-facing error that should be shown as-is? */
90
+ export const isUserFacingError = (error) => {
91
+ const userFacingCodes = new Set([
92
+ 'SIGNING_REJECTED',
93
+ 'INSUFFICIENT_BALANCE',
94
+ ]);
95
+ return userFacingCodes.has(error.code);
96
+ };
97
+ //# sourceMappingURL=errors.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"errors.js","sourceRoot":"","sources":["../src/errors.ts"],"names":[],"mappings":"AAAA;;;;;;;;GAQG;AAoHH,8EAA8E;AAC9E,6DAA6D;AAC7D,8EAA8E;AAE9E,MAAM,CAAC,MAAM,YAAY,GAAG;IAC1B,kBAAkB,EAAE,CAAC,QAAgB,EAA2B,EAAE,CAAC,CAAC;QAClE,IAAI,EAAE,qBAAqB;QAC3B,QAAQ;KACT,CAAC;IAEF,iBAAiB,EAAE,CAAC,UAAkB,EAA0B,EAAE,CAAC,CAAC;QAClE,IAAI,EAAE,oBAAoB;QAC1B,UAAU;KACX,CAAC;IAEF,aAAa,EAAE,CAAC,UAAkB,EAAE,IAAY,EAAsB,EAAE,CAAC,CAAC;QACxE,IAAI,EAAE,sBAAsB;QAC5B,UAAU;QACV,IAAI;KACL,CAAC;IAEF,uBAAuB,EAAE,CAAC,OAAe,EAAE,MAAc,EAAgC,EAAE,CAAC,CAAC;QAC3F,IAAI,EAAE,2BAA2B;QACjC,OAAO;QACP,MAAM;KACP,CAAC;IAEF,eAAe,EAAE,CAAC,MAAc,EAAwB,EAAE,CAAC,CAAC;QAC1D,IAAI,EAAE,kBAAkB;QACxB,MAAM;KACP,CAAC;IAEF,qBAAqB,EAAE,CAAC,UAAkB,EAA8B,EAAE,CAAC,CAAC;QAC1E,IAAI,EAAE,yBAAyB;QAC/B,UAAU;KACX,CAAC;IAEF,mBAAmB,EAAE,CAAC,QAAgB,EAAE,SAAiB,EAAE,KAAa,EAA4B,EAAE,CAAC,CAAC;QACtG,IAAI,EAAE,sBAAsB;QAC5B,QAAQ;QACR,SAAS;QACT,KAAK;KACN,CAAC;IAEF,WAAW,EAAE,CAAC,UAAkB,EAAoB,EAAE,CAAC,CAAC;QACtD,IAAI,EAAE,eAAe;QACrB,UAAU;KACX,CAAC;IAEF,UAAU,EAAE,CAAC,KAAa,EAAE,OAAe,EAAmB,EAAE,CAAC,CAAC;QAChE,IAAI,EAAE,kBAAkB;QACxB,KAAK;QACL,OAAO;KACR,CAAC;IAEF,iBAAiB,EAAE,CAAC,SAAiB,EAAE,SAAiB,EAA0B,EAAE,CAAC,CAAC;QACpF,IAAI,EAAE,qBAAqB;QAC3B,SAAS;QACT,SAAS;KACV,CAAC;IAEF,yBAAyB,EAAE,CAAC,SAAiB,EAAE,SAAiB,EAAkC,EAAE,CAAC,CAAC;QACpG,IAAI,EAAE,8BAA8B;QACpC,SAAS;QACT,SAAS;KACV,CAAC;IAEF,uBAAuB,EAAE,CAAC,MAAc,EAAgC,EAAE,CAAC,CAAC;QAC1E,IAAI,EAAE,2BAA2B;QACjC,MAAM;KACP,CAAC;IAEF,sBAAsB,EAAE,CAAC,SAAiB,EAA+B,EAAE,CAAC,CAAC;QAC3E,IAAI,EAAE,2BAA2B;QACjC,SAAS;KACV,CAAC;IAEF,qBAAqB,EAAE,CAAC,QAAgB,EAA8B,EAAE,CAAC,CAAC;QACxE,IAAI,EAAE,yBAAyB;QAC/B,QAAQ;KACT,CAAC;CACM,CAAC;AAEX,8EAA8E;AAC9E,2BAA2B;AAC3B,8EAA8E;AAE9E,2CAA2C;AAC3C,MAAM,CAAC,MAAM,gBAAgB,GAAG,CAAC,KAAkB,EAAW,EAAE;IAC9D,MAAM,cAAc,GAAqC,IAAI,GAAG,CAAC;QAC/D,oBAAoB;QACpB,sBAAsB;KACvB,CAAC,CAAC;IACH,OAAO,cAAc,CAAC,GAAG,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC;AACxC,CAAC,CAAC;AAEF,0EAA0E;AAC1E,MAAM,CAAC,MAAM,iBAAiB,GAAG,CAAC,KAAkB,EAAW,EAAE;IAC/D,MAAM,eAAe,GAAqC,IAAI,GAAG,CAAC;QAChE,kBAAkB;QAClB,sBAAsB;KACvB,CAAC,CAAC;IACH,OAAO,eAAe,CAAC,GAAG,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC;AACzC,CAAC,CAAC"}
@@ -0,0 +1,55 @@
1
+ /**
2
+ * @prism-ing/wallet — Production-grade, framework-agnostic wallet SDK.
3
+ *
4
+ * @remarks
5
+ * Wraps OWS (Secure Enclave signing), OneBalance (account abstraction),
6
+ * ZeroDev Social Recovery (EVM), and Squads V4 (Solana) into a single
7
+ * coherent API.
8
+ *
9
+ * @example
10
+ * ```ts
11
+ * import { createWallet, type WalletAccount } from '@prism-ing/wallet';
12
+ *
13
+ * const result = await createWallet(config, deps);
14
+ * if (!result.ok) {
15
+ * console.error(result.error.code);
16
+ * return;
17
+ * }
18
+ *
19
+ * const wallet: WalletAccount = result.value;
20
+ * const balance = await wallet.getBalance();
21
+ * ```
22
+ *
23
+ * @packageDocumentation
24
+ */
25
+ export { createWallet, createProductionWallet, isPendingRecovery } from './create-wallet.js';
26
+ export type { WalletDeps, ProductionWalletOptions } from './create-wallet.js';
27
+ export type { Result, PrismError, BrandError, Address, Hex, SolanaPublicKey, Bps, Lamports, } from './result.js';
28
+ export { Ok, Err, mapResult, flatMapResult, unwrapResult, fromPromise, toAddress, toHex, toSolanaPublicKey, toBps, toLamports, assertNever, } from './result.js';
29
+ export type { PrismSigner, TypedDataPayload, TypedDataField, WalletAccount, WalletPendingRecovery, UnifiedBalance, ChainBalance, TokenBalance, DepositParams, TxResult, TxStatus, CrossChainSwapParams, SwapResult, RecoveryManager, PasskeyGuardian, RecoveryTx, WalletConfig, SignerConfig, RecoveryConfig, AccountType, Platform, SessionKeyPolicy, SessionKeyHandle, SessionKeyManager, SessionKeyBackend, SpendPersistence, } from './types.js';
30
+ export type { WalletError, EnclaveUnavailableError, OneBalanceTimeoutError, OneBalanceApiError, RecoveryGuardianInvalidError, SigningRejectedError, AccountNotInitializedError, InsufficientBalanceError, KeyNotFoundError, ValidationError, SessionKeyExpiredError, SessionKeyPolicyViolationError, QuoteVerificationFailedError, SpendCapNotEnforceableError, RecoveryNotConfiguredError, } from './errors.js';
31
+ export { walletErrors, isRetryableError, isUserFacingError } from './errors.js';
32
+ export { WalletConfigSchema, SignerConfigSchema, AccountTypeSchema, DepositParamsSchema, CrossChainSwapParamsSchema, AddressSchema, SolanaPublicKeySchema, } from './schemas.js';
33
+ export { executeCrossChain } from './cross-chain.js';
34
+ export type { CrossChainQuoteParams, CrossChainResult } from './cross-chain.js';
35
+ export type { OWSAdapter, OWSKeyPair, SigningBackend } from './signers/ows-adapter.js';
36
+ export { createOWSAdapter } from './signers/ows-adapter.js';
37
+ export { createOWSSigningBackend } from './signers/ows-signing-backend.js';
38
+ export type { OWSBackendConfig } from './signers/ows-signing-backend.js';
39
+ export { createNodeSigningBackend } from './signers/node-signing-backend.js';
40
+ export { createSecureEnclaveBackend } from './signers/secure-enclave-backend.js';
41
+ export type { SecureEnclaveConfig, SecureEnclaveNativeBridge, } from './signers/secure-enclave-types.js';
42
+ export { createSessionKeyManager, validateSessionOperation, recordSessionSpend } from './session-keys.js';
43
+ export { createFileSpendPersistence } from './internal/file-spend-persistence.js';
44
+ export { verifyQuoteIntegrity, verifyEvmOperation } from './internal/quote-verifier.js';
45
+ export type { QuoteVerificationParams } from './internal/quote-verifier.js';
46
+ export { buildRecoveryChallenge } from './internal/recovery-manager.js';
47
+ export { createZeroDevSessionBackend } from './backends/zerodev-session-backend.js';
48
+ export { mapSessionPolicyToZeroDev, resolveAssetToContract } from './backends/zerodev-policy-mapper.js';
49
+ export type { ZeroDevSessionBackendConfig, ZeroDevPolicy, ZeroDevTimestampPolicy, ZeroDevCallPolicy, ZeroDevCallPermission, ZeroDevParamRule, ZeroDevGasPolicy, ZeroDevRateLimitPolicy, ZeroDevSudoPolicy, CallPolicyVersion, ParamCondition, } from './backends/zerodev-types.js';
50
+ export { RECOMMENDED_CALL_POLICY_VERSION, PARAM_CONDITION_VALUES } from './backends/zerodev-types.js';
51
+ export type { RecoveryBackends, EvmRecoveryBackend, SolanaRecoveryBackend, PasskeyBackend, } from './types.js';
52
+ export { createSquadsRecoveryBackend } from './backends/squads-recovery-backend.js';
53
+ export type { SquadsRecoveryBackendConfig, SquadsNativeBridge, SquadsConfigAction, SquadsMemberPermissions, } from './backends/squads-types.js';
54
+ export { FULL_PERMISSIONS, VOTER_PERMISSIONS } from './backends/squads-types.js';
55
+ //# sourceMappingURL=index.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"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"}
package/dist/index.js ADDED
@@ -0,0 +1,52 @@
1
+ /**
2
+ * @prism-ing/wallet — Production-grade, framework-agnostic wallet SDK.
3
+ *
4
+ * @remarks
5
+ * Wraps OWS (Secure Enclave signing), OneBalance (account abstraction),
6
+ * ZeroDev Social Recovery (EVM), and Squads V4 (Solana) into a single
7
+ * coherent API.
8
+ *
9
+ * @example
10
+ * ```ts
11
+ * import { createWallet, type WalletAccount } from '@prism-ing/wallet';
12
+ *
13
+ * const result = await createWallet(config, deps);
14
+ * if (!result.ok) {
15
+ * console.error(result.error.code);
16
+ * return;
17
+ * }
18
+ *
19
+ * const wallet: WalletAccount = result.value;
20
+ * const balance = await wallet.getBalance();
21
+ * ```
22
+ *
23
+ * @packageDocumentation
24
+ */
25
+ // Public API
26
+ export { createWallet, createProductionWallet, isPendingRecovery } from './create-wallet.js';
27
+ export { Ok, Err, mapResult, flatMapResult, unwrapResult, fromPromise, toAddress, toHex, toSolanaPublicKey, toBps, toLamports, assertNever, } from './result.js';
28
+ export { walletErrors, isRetryableError, isUserFacingError } from './errors.js';
29
+ // Schemas (for consumers who want to validate inputs themselves)
30
+ export { WalletConfigSchema, SignerConfigSchema, AccountTypeSchema, DepositParamsSchema, CrossChainSwapParamsSchema, AddressSchema, SolanaPublicKeySchema, } from './schemas.js';
31
+ // Cross-chain execution
32
+ export { executeCrossChain } from './cross-chain.js';
33
+ export { createOWSAdapter } from './signers/ows-adapter.js';
34
+ export { createOWSSigningBackend } from './signers/ows-signing-backend.js';
35
+ export { createNodeSigningBackend } from './signers/node-signing-backend.js';
36
+ export { createSecureEnclaveBackend } from './signers/secure-enclave-backend.js';
37
+ // Session keys
38
+ export { createSessionKeyManager, validateSessionOperation, recordSessionSpend } from './session-keys.js';
39
+ // Spend persistence
40
+ export { createFileSpendPersistence } from './internal/file-spend-persistence.js';
41
+ // Quote verification
42
+ export { verifyQuoteIntegrity, verifyEvmOperation } from './internal/quote-verifier.js';
43
+ // Recovery (internal export for advanced usage)
44
+ export { buildRecoveryChallenge } from './internal/recovery-manager.js';
45
+ // ZeroDev on-chain session key backend
46
+ export { createZeroDevSessionBackend } from './backends/zerodev-session-backend.js';
47
+ export { mapSessionPolicyToZeroDev, resolveAssetToContract } from './backends/zerodev-policy-mapper.js';
48
+ export { RECOMMENDED_CALL_POLICY_VERSION, PARAM_CONDITION_VALUES } from './backends/zerodev-types.js';
49
+ // Squads V4 Solana recovery backend
50
+ export { createSquadsRecoveryBackend } from './backends/squads-recovery-backend.js';
51
+ export { FULL_PERMISSIONS, VOTER_PERMISSIONS } from './backends/squads-types.js';
52
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;;;;GAuBG;AAEH,aAAa;AACb,OAAO,EAAE,YAAY,EAAE,sBAAsB,EAAE,iBAAiB,EAAE,MAAM,oBAAoB,CAAC;AAc7F,OAAO,EACL,EAAE,EACF,GAAG,EACH,SAAS,EACT,aAAa,EACb,YAAY,EACZ,WAAW,EACX,SAAS,EACT,KAAK,EACL,iBAAiB,EACjB,KAAK,EACL,UAAU,EACV,WAAW,GACZ,MAAM,aAAa,CAAC;AAkDrB,OAAO,EAAE,YAAY,EAAE,gBAAgB,EAAE,iBAAiB,EAAE,MAAM,aAAa,CAAC;AAEhF,iEAAiE;AACjE,OAAO,EACL,kBAAkB,EAClB,kBAAkB,EAClB,iBAAiB,EACjB,mBAAmB,EACnB,0BAA0B,EAC1B,aAAa,EACb,qBAAqB,GACtB,MAAM,cAAc,CAAC;AAEtB,wBAAwB;AACxB,OAAO,EAAE,iBAAiB,EAAE,MAAM,kBAAkB,CAAC;AAKrD,OAAO,EAAE,gBAAgB,EAAE,MAAM,0BAA0B,CAAC;AAC5D,OAAO,EAAE,uBAAuB,EAAE,MAAM,kCAAkC,CAAC;AAE3E,OAAO,EAAE,wBAAwB,EAAE,MAAM,mCAAmC,CAAC;AAC7E,OAAO,EAAE,0BAA0B,EAAE,MAAM,qCAAqC,CAAC;AAMjF,eAAe;AACf,OAAO,EAAE,uBAAuB,EAAE,wBAAwB,EAAE,kBAAkB,EAAE,MAAM,mBAAmB,CAAC;AAE1G,oBAAoB;AACpB,OAAO,EAAE,0BAA0B,EAAE,MAAM,sCAAsC,CAAC;AAElF,qBAAqB;AACrB,OAAO,EAAE,oBAAoB,EAAE,kBAAkB,EAAE,MAAM,8BAA8B,CAAC;AAGxF,gDAAgD;AAChD,OAAO,EAAE,sBAAsB,EAAE,MAAM,gCAAgC,CAAC;AAExE,uCAAuC;AACvC,OAAO,EAAE,2BAA2B,EAAE,MAAM,uCAAuC,CAAC;AACpF,OAAO,EAAE,yBAAyB,EAAE,sBAAsB,EAAE,MAAM,qCAAqC,CAAC;AAcxG,OAAO,EAAE,+BAA+B,EAAE,sBAAsB,EAAE,MAAM,6BAA6B,CAAC;AAUtG,oCAAoC;AACpC,OAAO,EAAE,2BAA2B,EAAE,MAAM,uCAAuC,CAAC;AAOpF,OAAO,EAAE,gBAAgB,EAAE,iBAAiB,EAAE,MAAM,4BAA4B,CAAC"}
@@ -0,0 +1,8 @@
1
+ /**
2
+ * Base58 encoding (Bitcoin alphabet).
3
+ *
4
+ * @internal
5
+ */
6
+ /** Encode a Uint8Array as a Base58 string. */
7
+ export declare function base58Encode(bytes: Uint8Array): string;
8
+ //# sourceMappingURL=base58.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"base58.d.ts","sourceRoot":"","sources":["../../src/internal/base58.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AAIH,8CAA8C;AAC9C,wBAAgB,YAAY,CAAC,KAAK,EAAE,UAAU,GAAG,MAAM,CAwBtD"}
@@ -0,0 +1,34 @@
1
+ /**
2
+ * Base58 encoding (Bitcoin alphabet).
3
+ *
4
+ * @internal
5
+ */
6
+ const BASE58_ALPHABET = '123456789ABCDEFGHJKLMNPQRSTUVWXYZabcdefghijkmnopqrstuvwxyz';
7
+ /** Encode a Uint8Array as a Base58 string. */
8
+ export function base58Encode(bytes) {
9
+ const digits = [0];
10
+ for (const byte of bytes) {
11
+ let carry = byte;
12
+ for (let j = 0; j < digits.length; j++) {
13
+ carry += digits[j] << 8;
14
+ digits[j] = carry % 58;
15
+ carry = (carry / 58) | 0;
16
+ }
17
+ while (carry > 0) {
18
+ digits.push(carry % 58);
19
+ carry = (carry / 58) | 0;
20
+ }
21
+ }
22
+ // Leading zeros
23
+ let result = '';
24
+ for (const byte of bytes) {
25
+ if (byte !== 0)
26
+ break;
27
+ result += BASE58_ALPHABET[0];
28
+ }
29
+ for (let i = digits.length - 1; i >= 0; i--) {
30
+ result += BASE58_ALPHABET[digits[i]];
31
+ }
32
+ return result;
33
+ }
34
+ //# sourceMappingURL=base58.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"base58.js","sourceRoot":"","sources":["../../src/internal/base58.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AAEH,MAAM,eAAe,GAAG,4DAA4D,CAAC;AAErF,8CAA8C;AAC9C,MAAM,UAAU,YAAY,CAAC,KAAiB;IAC5C,MAAM,MAAM,GAAa,CAAC,CAAC,CAAC,CAAC;IAC7B,KAAK,MAAM,IAAI,IAAI,KAAK,EAAE,CAAC;QACzB,IAAI,KAAK,GAAG,IAAI,CAAC;QACjB,KAAK,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,MAAM,CAAC,MAAM,EAAE,CAAC,EAAE,EAAE,CAAC;YACvC,KAAK,IAAK,MAAM,CAAC,CAAC,CAAY,IAAI,CAAC,CAAC;YACpC,MAAM,CAAC,CAAC,CAAC,GAAG,KAAK,GAAG,EAAE,CAAC;YACvB,KAAK,GAAG,CAAC,KAAK,GAAG,EAAE,CAAC,GAAG,CAAC,CAAC;QAC3B,CAAC;QACD,OAAO,KAAK,GAAG,CAAC,EAAE,CAAC;YACjB,MAAM,CAAC,IAAI,CAAC,KAAK,GAAG,EAAE,CAAC,CAAC;YACxB,KAAK,GAAG,CAAC,KAAK,GAAG,EAAE,CAAC,GAAG,CAAC,CAAC;QAC3B,CAAC;IACH,CAAC;IACD,gBAAgB;IAChB,IAAI,MAAM,GAAG,EAAE,CAAC;IAChB,KAAK,MAAM,IAAI,IAAI,KAAK,EAAE,CAAC;QACzB,IAAI,IAAI,KAAK,CAAC;YAAE,MAAM;QACtB,MAAM,IAAI,eAAe,CAAC,CAAC,CAAC,CAAC;IAC/B,CAAC;IACD,KAAK,IAAI,CAAC,GAAG,MAAM,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC,IAAI,CAAC,EAAE,CAAC,EAAE,EAAE,CAAC;QAC5C,MAAM,IAAI,eAAe,CAAC,MAAM,CAAC,CAAC,CAAW,CAAC,CAAC;IACjD,CAAC;IACD,OAAO,MAAM,CAAC;AAChB,CAAC"}
@@ -0,0 +1,41 @@
1
+ import type { TypedDataPayload } from '../types.js';
2
+ /** Strip `0x` prefix and convert hex string to bytes. */
3
+ export declare function hexToBytes(hex: string): Uint8Array;
4
+ export declare function encodeType(primaryType: string, types: Record<string, readonly {
5
+ name: string;
6
+ type: string;
7
+ }[]>): string;
8
+ export declare function typeHash(primaryType: string, types: Record<string, readonly {
9
+ name: string;
10
+ type: string;
11
+ }[]>): Uint8Array;
12
+ export declare function encodeValue(type: string, value: unknown, types: Record<string, readonly {
13
+ name: string;
14
+ type: string;
15
+ }[]>): Uint8Array;
16
+ export declare function encodeData(primaryType: string, data: Record<string, unknown>, types: Record<string, readonly {
17
+ name: string;
18
+ type: string;
19
+ }[]>): Uint8Array;
20
+ export declare function hashStruct(primaryType: string, data: Record<string, unknown>, types: Record<string, readonly {
21
+ name: string;
22
+ type: string;
23
+ }[]>): Uint8Array;
24
+ export declare function abiEncodeAtomic(type: string, value: unknown): Uint8Array;
25
+ /** Infer the EIP712Domain type from the domain object's keys. */
26
+ export declare function inferDomainType(domain: Record<string, unknown>): readonly {
27
+ name: string;
28
+ type: string;
29
+ }[];
30
+ /** Hash a complete EIP-712 typed data payload. */
31
+ export declare function hashTypedData(payload: TypedDataPayload): Uint8Array;
32
+ /** Hash a message per EIP-191 personal sign standard. */
33
+ export declare function personalSignHash(message: string): Uint8Array;
34
+ export interface SolanaLikeTransaction {
35
+ message: {
36
+ serialize(): Uint8Array;
37
+ };
38
+ signatures: Uint8Array[];
39
+ }
40
+ export declare function isSolanaTransaction(tx: unknown): tx is SolanaLikeTransaction;
41
+ //# sourceMappingURL=eip712.d.ts.map