@unlink-xyz/core 0.1.3-canary.fd5dddf → 0.1.4

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 (213) hide show
  1. package/README.md +9 -0
  2. package/dist/account/account.d.ts +31 -2
  3. package/dist/account/account.d.ts.map +1 -1
  4. package/dist/account/accounts.d.ts +42 -0
  5. package/dist/account/accounts.d.ts.map +1 -0
  6. package/dist/account/seed.d.ts +45 -0
  7. package/dist/account/seed.d.ts.map +1 -0
  8. package/dist/account/serialization.d.ts +6 -0
  9. package/dist/account/serialization.d.ts.map +1 -0
  10. package/dist/browser/index.js +34424 -86406
  11. package/dist/browser/index.js.map +1 -1
  12. package/dist/browser/wallet/index.js +55942 -0
  13. package/dist/browser/wallet/index.js.map +1 -0
  14. package/dist/clients/broadcaster.d.ts +1 -0
  15. package/dist/clients/broadcaster.d.ts.map +1 -1
  16. package/dist/clients/indexer.d.ts +5 -0
  17. package/dist/clients/indexer.d.ts.map +1 -1
  18. package/dist/config.d.ts +6 -4
  19. package/dist/config.d.ts.map +1 -1
  20. package/dist/core.d.ts.map +1 -1
  21. package/dist/crypto/adapters/index.d.ts +17 -0
  22. package/dist/crypto/adapters/index.d.ts.map +1 -0
  23. package/dist/crypto/adapters/polyfills.d.ts +5 -0
  24. package/dist/crypto/adapters/polyfills.d.ts.map +1 -0
  25. package/dist/crypto/encrypt.d.ts +33 -0
  26. package/dist/crypto/encrypt.d.ts.map +1 -0
  27. package/dist/crypto/secure-memory.d.ts.map +1 -0
  28. package/dist/errors.d.ts +8 -0
  29. package/dist/errors.d.ts.map +1 -1
  30. package/dist/index.d.ts +6 -2
  31. package/dist/index.d.ts.map +1 -1
  32. package/dist/index.js +6721 -23
  33. package/dist/index.js.map +1 -0
  34. package/dist/keys/derive.d.ts +2 -2
  35. package/dist/keys/derive.d.ts.map +1 -1
  36. package/dist/keys/hex.d.ts +1 -4
  37. package/dist/keys/hex.d.ts.map +1 -1
  38. package/dist/keys/mnemonic.d.ts +0 -2
  39. package/dist/keys/mnemonic.d.ts.map +1 -1
  40. package/dist/keys.d.ts +1 -0
  41. package/dist/keys.d.ts.map +1 -1
  42. package/dist/prover/config.d.ts +54 -9
  43. package/dist/prover/config.d.ts.map +1 -1
  44. package/dist/prover/integrity.d.ts +20 -0
  45. package/dist/prover/integrity.d.ts.map +1 -0
  46. package/dist/prover/prover.d.ts +16 -31
  47. package/dist/prover/prover.d.ts.map +1 -1
  48. package/dist/state/merkle/hydrator.d.ts +21 -19
  49. package/dist/state/merkle/hydrator.d.ts.map +1 -1
  50. package/dist/state/merkle/index.d.ts +1 -1
  51. package/dist/state/merkle/index.d.ts.map +1 -1
  52. package/dist/state/store/ciphertext-store.d.ts +7 -0
  53. package/dist/state/store/ciphertext-store.d.ts.map +1 -1
  54. package/dist/state/store/index.d.ts +1 -1
  55. package/dist/state/store/index.d.ts.map +1 -1
  56. package/dist/state/store/job-store.d.ts.map +1 -1
  57. package/dist/state/store/jobs.d.ts +14 -16
  58. package/dist/state/store/jobs.d.ts.map +1 -1
  59. package/dist/state/store/leaf-store.d.ts +4 -0
  60. package/dist/state/store/leaf-store.d.ts.map +1 -1
  61. package/dist/state/store/nullifier-store.d.ts.map +1 -1
  62. package/dist/state/store/records.d.ts +8 -0
  63. package/dist/state/store/records.d.ts.map +1 -1
  64. package/dist/state/store/store.d.ts +18 -0
  65. package/dist/state/store/store.d.ts.map +1 -1
  66. package/dist/storage/indexeddb.d.ts.map +1 -1
  67. package/dist/storage/memory.d.ts.map +1 -1
  68. package/dist/transactions/adapter.d.ts +31 -0
  69. package/dist/transactions/adapter.d.ts.map +1 -0
  70. package/dist/transactions/deposit.d.ts +1 -1
  71. package/dist/transactions/deposit.d.ts.map +1 -1
  72. package/dist/transactions/index.d.ts +4 -2
  73. package/dist/transactions/index.d.ts.map +1 -1
  74. package/dist/transactions/note-sync.d.ts +3 -3
  75. package/dist/transactions/note-sync.d.ts.map +1 -1
  76. package/dist/transactions/reconcile.d.ts +1 -1
  77. package/dist/transactions/reconcile.d.ts.map +1 -1
  78. package/dist/transactions/transact.d.ts +21 -2
  79. package/dist/transactions/transact.d.ts.map +1 -1
  80. package/dist/transactions/transaction-planner.d.ts +1 -1
  81. package/dist/transactions/transaction-planner.d.ts.map +1 -1
  82. package/dist/transactions/transfer-planner.d.ts +2 -1
  83. package/dist/transactions/transfer-planner.d.ts.map +1 -1
  84. package/dist/transactions/types/deposit.d.ts +3 -3
  85. package/dist/transactions/types/deposit.d.ts.map +1 -1
  86. package/dist/transactions/types/domain.d.ts +3 -0
  87. package/dist/transactions/types/domain.d.ts.map +1 -1
  88. package/dist/transactions/types/options.d.ts +14 -5
  89. package/dist/transactions/types/options.d.ts.map +1 -1
  90. package/dist/transactions/types/planning.d.ts +2 -0
  91. package/dist/transactions/types/planning.d.ts.map +1 -1
  92. package/dist/transactions/types/state-stores.d.ts +53 -5
  93. package/dist/transactions/types/state-stores.d.ts.map +1 -1
  94. package/dist/transactions/types/transact.d.ts +10 -3
  95. package/dist/transactions/types/transact.d.ts.map +1 -1
  96. package/dist/transactions/withdrawal-planner.d.ts +1 -1
  97. package/dist/transactions/withdrawal-planner.d.ts.map +1 -1
  98. package/dist/tsconfig.tsbuildinfo +1 -1
  99. package/dist/tsup.config.d.ts +8 -0
  100. package/dist/tsup.config.d.ts.map +1 -0
  101. package/dist/types.d.ts +1 -0
  102. package/dist/types.d.ts.map +1 -1
  103. package/dist/utils/amounts.d.ts +0 -13
  104. package/dist/utils/amounts.d.ts.map +1 -1
  105. package/dist/utils/async.js +37 -34
  106. package/dist/utils/async.js.map +1 -0
  107. package/dist/utils/bigint.d.ts +0 -2
  108. package/dist/utils/bigint.d.ts.map +1 -1
  109. package/dist/utils/random.d.ts +5 -0
  110. package/dist/utils/random.d.ts.map +1 -1
  111. package/dist/utils/validators.d.ts.map +1 -1
  112. package/dist/vitest.config.d.ts.map +1 -1
  113. package/dist/wallet/adapter.d.ts +21 -0
  114. package/dist/wallet/adapter.d.ts.map +1 -0
  115. package/dist/wallet/burner/service.d.ts +32 -0
  116. package/dist/wallet/burner/service.d.ts.map +1 -0
  117. package/dist/wallet/burner/types.d.ts +47 -0
  118. package/dist/wallet/burner/types.d.ts.map +1 -0
  119. package/dist/wallet/index.d.ts +20 -0
  120. package/dist/wallet/index.d.ts.map +1 -0
  121. package/dist/wallet/index.js +6462 -0
  122. package/dist/wallet/index.js.map +1 -0
  123. package/dist/wallet/sdk.d.ts +48 -0
  124. package/dist/wallet/sdk.d.ts.map +1 -0
  125. package/dist/wallet/types.d.ts +457 -0
  126. package/dist/wallet/types.d.ts.map +1 -0
  127. package/dist/wallet/unlink-wallet.d.ts +187 -0
  128. package/dist/wallet/unlink-wallet.d.ts.map +1 -0
  129. package/package.json +16 -6
  130. package/dist/account/account.js +0 -142
  131. package/dist/circuits.json +0 -74
  132. package/dist/clients/broadcaster.js +0 -30
  133. package/dist/clients/http.js +0 -72
  134. package/dist/clients/indexer.js +0 -94
  135. package/dist/config.js +0 -36
  136. package/dist/constants.js +0 -5
  137. package/dist/core.js +0 -15
  138. package/dist/crypto-adapters/auto-init.d.ts +0 -2
  139. package/dist/crypto-adapters/auto-init.d.ts.map +0 -1
  140. package/dist/crypto-adapters/auto-init.js +0 -7
  141. package/dist/crypto-adapters/index.d.ts +0 -22
  142. package/dist/crypto-adapters/index.d.ts.map +0 -1
  143. package/dist/crypto-adapters/index.js +0 -47
  144. package/dist/crypto-adapters/polyfills.d.ts +0 -5
  145. package/dist/crypto-adapters/polyfills.d.ts.map +0 -1
  146. package/dist/crypto-adapters/polyfills.js +0 -8
  147. package/dist/errors.js +0 -36
  148. package/dist/history/index.js +0 -2
  149. package/dist/history/service.js +0 -354
  150. package/dist/history/types.js +0 -1
  151. package/dist/keys/address.js +0 -55
  152. package/dist/keys/derive.js +0 -112
  153. package/dist/keys/hex.js +0 -66
  154. package/dist/keys/index.js +0 -4
  155. package/dist/keys/mnemonic.js +0 -23
  156. package/dist/keys.js +0 -45
  157. package/dist/prover/config.js +0 -70
  158. package/dist/prover/index.js +0 -1
  159. package/dist/prover/prover.js +0 -291
  160. package/dist/prover/registry.js +0 -18
  161. package/dist/schema.js +0 -14
  162. package/dist/state/index.js +0 -2
  163. package/dist/state/merkle/hydrator.js +0 -37
  164. package/dist/state/merkle/index.js +0 -2
  165. package/dist/state/merkle/merkle-tree.js +0 -113
  166. package/dist/state/store/ciphertext-store.js +0 -37
  167. package/dist/state/store/history-store.js +0 -53
  168. package/dist/state/store/index.js +0 -9
  169. package/dist/state/store/job-store.js +0 -144
  170. package/dist/state/store/jobs.js +0 -1
  171. package/dist/state/store/leaf-store.js +0 -32
  172. package/dist/state/store/note-store.js +0 -146
  173. package/dist/state/store/nullifier-store.js +0 -60
  174. package/dist/state/store/records.js +0 -1
  175. package/dist/state/store/root-store.js +0 -26
  176. package/dist/state/store/store.js +0 -113
  177. package/dist/storage/index.js +0 -2
  178. package/dist/storage/indexeddb.js +0 -205
  179. package/dist/storage/memory.js +0 -91
  180. package/dist/transactions/deposit.js +0 -220
  181. package/dist/transactions/index.js +0 -9
  182. package/dist/transactions/note-selection.js +0 -201
  183. package/dist/transactions/note-sync.js +0 -485
  184. package/dist/transactions/reconcile.js +0 -85
  185. package/dist/transactions/transact.js +0 -450
  186. package/dist/transactions/transaction-planner.js +0 -116
  187. package/dist/transactions/transfer-planner.js +0 -85
  188. package/dist/transactions/types/deposit.js +0 -1
  189. package/dist/transactions/types/domain.js +0 -4
  190. package/dist/transactions/types/index.js +0 -17
  191. package/dist/transactions/types/options.js +0 -1
  192. package/dist/transactions/types/planning.js +0 -1
  193. package/dist/transactions/types/state-stores.js +0 -1
  194. package/dist/transactions/types/transact.js +0 -1
  195. package/dist/transactions/withdrawal-planner.js +0 -128
  196. package/dist/tsup.browser.config.js +0 -34
  197. package/dist/types.js +0 -1
  198. package/dist/utils/amounts.js +0 -89
  199. package/dist/utils/bigint.js +0 -29
  200. package/dist/utils/crypto.d.ts +0 -18
  201. package/dist/utils/crypto.d.ts.map +0 -1
  202. package/dist/utils/crypto.js +0 -45
  203. package/dist/utils/format.js +0 -33
  204. package/dist/utils/json-codec.js +0 -25
  205. package/dist/utils/notes.js +0 -14
  206. package/dist/utils/polling.js +0 -11
  207. package/dist/utils/random.js +0 -27
  208. package/dist/utils/secure-memory.d.ts.map +0 -1
  209. package/dist/utils/secure-memory.js +0 -28
  210. package/dist/utils/signature.js +0 -14
  211. package/dist/utils/validators.js +0 -96
  212. package/dist/vitest.config.js +0 -13
  213. /package/dist/{utils → crypto}/secure-memory.d.ts +0 -0
@@ -0,0 +1,187 @@
1
+ import type { AccountView } from "../account/account.js";
2
+ import type { RelayStatusResponse } from "../clients/broadcaster.js";
3
+ import type { HistoryEntry } from "../history/types.js";
4
+ import type { NoteRecord } from "../state/store/records.js";
5
+ import type { DepositRelayResult, DepositSyncResult, TransactRelayResult, TransactSyncResult } from "../transactions/types/index.js";
6
+ import type { BurnerAccount, BurnerSendParams } from "./burner/types.js";
7
+ import type { AdapterExecuteResult, SignerOverride, SimpleAdapterExecuteParams, SimpleBurnerFundParams, SimpleBurnerSweepToPoolParams, SimpleDepositParams, SimpleTransactParams, SimpleTransferParams, SimpleWithdrawParams, TransferPlanResult, TransferResult, UnlinkWalletConfig, WalletAccountAPI, WalletSDK, WalletSDKEvent, WithdrawPlanResult, WithdrawResult } from "./types.js";
8
+ /**
9
+ * High-level wallet API that bakes `chainId` and `poolAddress` at construction time.
10
+ *
11
+ * Replaces `createWalletSDK` / `createBrowserWalletSDK` with a single entry point
12
+ * that absorbs initialization (storage, rng, core migration, environment resolution).
13
+ *
14
+ * @example
15
+ * ```ts
16
+ * // Browser (auto-detects IndexedDB + crypto.getRandomValues):
17
+ * const wallet = await UnlinkWallet.create({
18
+ * chainId: 11155111,
19
+ * environment: "testnet",
20
+ * });
21
+ *
22
+ * // Node (explicit storage):
23
+ * const wallet = await UnlinkWallet.create({
24
+ * chainId: 1,
25
+ * poolAddress: "0x...",
26
+ * gatewayUrl: "https://...",
27
+ * storage: createSqliteStorage({ path: "wallet.db" }),
28
+ * });
29
+ *
30
+ * // Operations — no chainId/poolAddress needed:
31
+ * await wallet.seed.create();
32
+ * await wallet.accounts.create();
33
+ * await wallet.deposit({ depositor: "0x...", deposits: [{ token, amount }] });
34
+ * await wallet.transfer({ transfers: [{ token, recipient, amount }] });
35
+ * await wallet.getBalances();
36
+ * await wallet.sync();
37
+ * ```
38
+ */
39
+ export declare class UnlinkWallet {
40
+ /** @internal */
41
+ private readonly sdk;
42
+ /** Chain ID this wallet operates on. */
43
+ readonly chainId: number;
44
+ /** Pool contract address this wallet transacts with. */
45
+ readonly poolAddress: string;
46
+ private constructor();
47
+ /**
48
+ * Create a new UnlinkWallet instance.
49
+ *
50
+ * Handles all initialization internally:
51
+ * - Resolves environment config (if using `environment` instead of explicit URLs)
52
+ * - Auto-detects storage (IndexedDB in browser) and rng (crypto.getRandomValues)
53
+ * - Runs schema migration via `initCore()`
54
+ * - Creates the internal SDK
55
+ */
56
+ static create(config: UnlinkWalletConfig): Promise<UnlinkWallet>;
57
+ /** Seed management (create, import, export, delete mnemonic). */
58
+ get seed(): WalletSDK["seed"];
59
+ /** Account management (create, list, switch accounts). */
60
+ get accounts(): WalletAccountAPI;
61
+ /**
62
+ * Request a deposit (1 or more tokens).
63
+ * Returns calldata the depositor must submit on-chain via their EOA.
64
+ */
65
+ deposit(params: SimpleDepositParams): Promise<DepositRelayResult>;
66
+ /** Wait for a deposit to be confirmed on-chain. */
67
+ confirmDeposit(relayId: string): Promise<DepositSyncResult>;
68
+ /**
69
+ * Execute a private transfer (1 or more recipients).
70
+ * Handles note selection, circuit selection, and proof generation automatically.
71
+ */
72
+ transfer(params: SimpleTransferParams, overrides?: SignerOverride): Promise<TransferResult>;
73
+ /**
74
+ * Get a transfer plan without executing (for preview/confirmation UIs).
75
+ */
76
+ planTransfer(params: SimpleTransferParams, account?: AccountView): Promise<TransferPlanResult>;
77
+ /** Execute a pre-built transfer plan. */
78
+ executeTransfer(plans: TransferPlanResult, overrides?: SignerOverride): Promise<TransferResult>;
79
+ /**
80
+ * Execute a withdrawal (1 or more recipients).
81
+ * Handles note selection, circuit selection, and proof generation automatically.
82
+ */
83
+ withdraw(params: SimpleWithdrawParams, overrides?: SignerOverride): Promise<WithdrawResult>;
84
+ /**
85
+ * Get a withdrawal plan without executing (for preview/confirmation UIs).
86
+ */
87
+ planWithdraw(params: SimpleWithdrawParams, account?: AccountView): Promise<WithdrawPlanResult>;
88
+ /** Execute a pre-built withdrawal plan. */
89
+ executeWithdraw(plans: WithdrawPlanResult, overrides?: SignerOverride): Promise<WithdrawResult>;
90
+ /** Wait for a transfer or withdrawal to be confirmed on-chain. */
91
+ confirmTransaction(relayId: string): Promise<TransactSyncResult>;
92
+ /**
93
+ * Get balance for a specific token (defaults to all tokens if no token specified).
94
+ * @param token Token address. If omitted, returns balance for all tokens via getBalances().
95
+ */
96
+ getBalance(token: string, overrides?: {
97
+ account: AccountView;
98
+ }): Promise<bigint>;
99
+ /** Get balances for all tokens. */
100
+ getBalances(overrides?: {
101
+ account: AccountView;
102
+ }): Promise<Record<string, bigint>>;
103
+ /** Get transaction history. */
104
+ getHistory(options?: {
105
+ includeSelfSends?: boolean;
106
+ }, overrides?: {
107
+ account: AccountView;
108
+ }): Promise<HistoryEntry[]>;
109
+ /** Get UTXO notes for the active account (or override account). */
110
+ getNotes(overrides?: {
111
+ account: AccountView;
112
+ }): Promise<NoteRecord[]>;
113
+ /**
114
+ * Sync notes from the blockchain.
115
+ * Automatically resolves the active account (no need to pass it).
116
+ */
117
+ sync(options?: {
118
+ forceFullResync?: boolean;
119
+ }, overrides?: {
120
+ account: AccountView;
121
+ }): Promise<void>;
122
+ /** Start auto-sync at the given interval (default: 5000ms). */
123
+ startAutoSync(intervalMs?: number): void;
124
+ /** Stop auto-sync. */
125
+ stopAutoSync(): void;
126
+ /** Get the current status of a transaction. */
127
+ getTxStatus(txId: string): Promise<RelayStatusResponse>;
128
+ /** Start tracking a transaction for status-changed events. */
129
+ trackTx(txId: string): void;
130
+ /** Stop tracking a transaction. */
131
+ untrackTx(txId: string): void;
132
+ /**
133
+ * Subscribe to wallet events (notes-updated, sync-error, tx-status-changed, etc.).
134
+ * @returns Unsubscribe function.
135
+ */
136
+ on(listener: (event: WalletSDKEvent) => void): () => void;
137
+ /**
138
+ * Burner account operations (BIP-44 derived EOAs for DeFi interactions).
139
+ * chainId/poolAddress are injected automatically for fund/sweepToPool.
140
+ */
141
+ readonly burner: {
142
+ /** Derive burner address for a given index. */
143
+ addressOf: (index: number) => Promise<BurnerAccount>;
144
+ /** Send a transaction from burner at index. */
145
+ send: (index: number, tx: BurnerSendParams) => Promise<{
146
+ txHash: string;
147
+ }>;
148
+ /** Export the raw private key (0x-prefixed hex) for wallet import. */
149
+ exportKey: (index: number) => Promise<string>;
150
+ /** Withdraw from shielded pool to fund this burner. */
151
+ fund: (index: number, params: SimpleBurnerFundParams) => Promise<WithdrawResult>;
152
+ /** Approve + deposit tokens from burner back into shielded pool. */
153
+ sweepToPool: (index: number, params: SimpleBurnerSweepToPoolParams) => Promise<{
154
+ txHash: string;
155
+ }>;
156
+ /** Get ERC-20 token balance of any address. */
157
+ getTokenBalance: (address: string, token: string) => Promise<bigint>;
158
+ /** Get native ETH balance of any address. */
159
+ getBalance: (address: string) => Promise<bigint>;
160
+ };
161
+ /**
162
+ * Private DeFi adapter operations.
163
+ * chainId/poolAddress are injected automatically.
164
+ */
165
+ readonly adapter: {
166
+ /**
167
+ * Execute an atomic unshield -> call(s) -> reshield flow through an adapter.
168
+ */
169
+ execute: (params: SimpleAdapterExecuteParams, opts?: {
170
+ skipBroadcast?: boolean;
171
+ }, overrides?: SignerOverride) => Promise<AdapterExecuteResult>;
172
+ };
173
+ /**
174
+ * Advanced escape hatch for raw JoinSplit transaction building.
175
+ * Use this for custom transaction construction (e.g. swap adapters).
176
+ */
177
+ readonly advanced: {
178
+ /** Build and submit raw JoinSplit transactions. */
179
+ transact: (params: SimpleTransactParams, opts?: {
180
+ skipBroadcast?: boolean;
181
+ }) => Promise<TransactRelayResult>;
182
+ /** Wait for a raw transaction to be confirmed on-chain. */
183
+ reconcile: (relayId: string) => Promise<TransactSyncResult>;
184
+ };
185
+ private requireActiveAccount;
186
+ }
187
+ //# sourceMappingURL=unlink-wallet.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"unlink-wallet.d.ts","sourceRoot":"","sources":["../../wallet/unlink-wallet.ts"],"names":[],"mappings":"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"}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@unlink-xyz/core",
3
- "version": "0.1.3-canary.fd5dddf",
3
+ "version": "0.1.4",
4
4
  "type": "module",
5
5
  "main": "dist/index.js",
6
6
  "types": "dist/index.d.ts",
@@ -15,6 +15,16 @@
15
15
  "types": "./dist/index.d.ts"
16
16
  }
17
17
  },
18
+ "./wallet": {
19
+ "browser": {
20
+ "import": "./dist/browser/wallet/index.js",
21
+ "types": "./dist/wallet/index.d.ts"
22
+ },
23
+ "default": {
24
+ "import": "./dist/wallet/index.js",
25
+ "types": "./dist/wallet/index.d.ts"
26
+ }
27
+ },
18
28
  "./utils/async.js": {
19
29
  "import": "./dist/utils/async.js",
20
30
  "types": "./dist/utils/async.d.ts"
@@ -24,21 +34,21 @@
24
34
  "dist"
25
35
  ],
26
36
  "publishConfig": {
27
- "access": "restricted"
37
+ "access": "public"
28
38
  },
29
39
  "scripts": {
30
- "build": "tsc -p tsconfig.json && tsup --config tsup.browser.config.ts",
40
+ "build": "tsc -p tsconfig.json --emitDeclarationOnly && tsup && tsup --config tsup.browser.config.ts",
31
41
  "lint": "eslint .",
32
42
  "lint:fix": "eslint . --fix",
33
43
  "format": "prettier . --write",
34
44
  "format:check": "prettier . --check",
35
- "test": "tsc -p tsconfig.json && vitest run --test-timeout 0",
45
+ "test": "tsc --noEmit && vitest run --test-timeout 0",
36
46
  "setup:artifacts": "bash ./scripts/setup-artifacts.sh",
37
47
  "clean": "rm -rf dist *.tsbuildinfo",
38
48
  "typecheck": "tsc --noEmit"
39
49
  },
40
50
  "dependencies": {
41
- "@noble/ed25519": "3.0.0",
51
+ "@noble/curves": "^2.0.1",
42
52
  "@noble/hashes": "2.0.0",
43
53
  "@scure/base": "2.0.0",
44
54
  "@scure/bip39": "2.0.1",
@@ -46,7 +56,7 @@
46
56
  "@zk-kit/eddsa-poseidon": "^1.1.0",
47
57
  "@zk-kit/imt": "2.0.0-beta.8",
48
58
  "buffer": "^6.0.3",
49
- "circomlibjs": "^0.1.7",
59
+ "poseidon-lite": "^0.3.0",
50
60
  "ethereum-cryptography": "3.2.0",
51
61
  "ethers": "6.15.0",
52
62
  "ky": "^1.14.0",
@@ -1,142 +0,0 @@
1
- import { ValidationError } from "../errors.js";
2
- import { encodeAddress } from "../keys/address.js";
3
- import { deriveAccountKeys, } from "../keys/derive.js";
4
- import { Hex } from "../keys/hex.js";
5
- import { Mnemonic } from "../keys/mnemonic.js";
6
- import { zeroize } from "../utils/secure-memory.js";
7
- export const MASTER_SEED_LENGTH = 64;
8
- export const MASTER_SEED_KEY = "cfg:wallet:master_seed/v1";
9
- export const MASTER_MNEMONIC_KEY = "cfg:wallet:master_mnemonic/v1";
10
- const MNEMONIC_ENTROPY_BYTES = 32;
11
- const textEncoder = new TextEncoder();
12
- const textDecoder = new TextDecoder();
13
- export async function deriveAccount(masterSeed, accountIndex = 0) {
14
- const seed = normalizeMasterSeed(masterSeed);
15
- if (!Number.isInteger(accountIndex) || accountIndex < 0) {
16
- throw new ValidationError("accountIndex must be a non-negative integer");
17
- }
18
- const keys = await deriveAccountKeys(seed, accountIndex);
19
- const address = encodeAddress({
20
- masterPublicKey: keys.masterPublicKey,
21
- viewingPublicKey: keys.viewing.pubkey,
22
- });
23
- return {
24
- spendingKeyPair: keys.spending,
25
- viewingKeyPair: keys.viewing,
26
- nullifyingKey: keys.nullifyingKey,
27
- masterPublicKey: keys.masterPublicKey,
28
- address,
29
- };
30
- }
31
- export async function deriveAccountFromMnemonic(mnemonic, accountIndex = 0, password = "") {
32
- const normalized = normalizeMnemonic(mnemonic);
33
- const seed = mnemonicToSeed(normalized, password);
34
- try {
35
- return await deriveAccount(seed, accountIndex);
36
- }
37
- finally {
38
- zeroize(seed);
39
- }
40
- }
41
- /** Passthrough crypto, storage handles buffer isolation */
42
- const identityMasterSeedCrypto = {
43
- encrypt: (seed) => seed,
44
- decrypt: (payload) => payload,
45
- };
46
- export async function generateMasterSeed({ storage, rng, crypto = identityMasterSeedCrypto, overwrite = false, mnemonicPassphrase, }) {
47
- if (!overwrite) {
48
- const existingSeed = await loadMasterSeed(storage, crypto);
49
- if (existingSeed)
50
- return existingSeed;
51
- const existingMnemonic = await loadMasterMnemonic(storage, crypto);
52
- if (existingMnemonic) {
53
- const seedFromMnemonic = mnemonicToSeed(existingMnemonic, mnemonicPassphrase);
54
- await storeMasterSeed(storage, seedFromMnemonic, crypto);
55
- return seedFromMnemonic;
56
- }
57
- }
58
- const entropy = rng(MNEMONIC_ENTROPY_BYTES);
59
- if (entropy.length !== MNEMONIC_ENTROPY_BYTES) {
60
- throw new ValidationError(`mnemonic entropy must be ${MNEMONIC_ENTROPY_BYTES} bytes`);
61
- }
62
- try {
63
- const mnemonic = Mnemonic.fromEntropy(Hex.fromBytes(entropy));
64
- await storeMasterMnemonic(storage, mnemonic, crypto);
65
- const seed = mnemonicToSeed(mnemonic, mnemonicPassphrase);
66
- await storeMasterSeed(storage, seed, crypto);
67
- return seed;
68
- }
69
- finally {
70
- zeroize(entropy);
71
- }
72
- }
73
- export async function loadMasterSeed(storage, crypto = identityMasterSeedCrypto) {
74
- const stored = await storage.get(MASTER_SEED_KEY);
75
- if (!stored)
76
- return null;
77
- const plaintext = await crypto.decrypt(stored);
78
- return normalizeMasterSeed(plaintext);
79
- }
80
- export async function storeMasterSeed(storage, seed, crypto = identityMasterSeedCrypto) {
81
- const normalized = normalizeMasterSeed(seed);
82
- const encrypted = await crypto.encrypt(normalized);
83
- if (!(encrypted instanceof Uint8Array)) {
84
- throw new ValidationError("master seed encryptor must return Uint8Array");
85
- }
86
- await storage.put(MASTER_SEED_KEY, encrypted);
87
- }
88
- export async function loadMasterMnemonic(storage, crypto = identityMasterSeedCrypto) {
89
- const stored = await storage.get(MASTER_MNEMONIC_KEY);
90
- if (!stored)
91
- return null;
92
- const plaintext = await crypto.decrypt(stored);
93
- try {
94
- const mnemonic = textDecoder.decode(plaintext);
95
- return normalizeMnemonic(mnemonic);
96
- }
97
- finally {
98
- zeroize(plaintext);
99
- }
100
- }
101
- export async function importMasterMnemonic({ storage, mnemonic, crypto = identityMasterSeedCrypto, overwrite = false, password = "", }) {
102
- if (!overwrite) {
103
- const existing = await loadMasterMnemonic(storage, crypto);
104
- if (existing) {
105
- throw new ValidationError("master mnemonic already exists; set overwrite to true to replace it");
106
- }
107
- }
108
- const normalized = normalizeMnemonic(mnemonic);
109
- const seed = mnemonicToSeed(normalized, password);
110
- await storeMasterMnemonic(storage, normalized, crypto);
111
- await storeMasterSeed(storage, seed, crypto);
112
- return seed;
113
- }
114
- export async function storeMasterMnemonic(storage, mnemonic, crypto = identityMasterSeedCrypto) {
115
- const normalized = normalizeMnemonic(mnemonic);
116
- const encrypted = await crypto.encrypt(textEncoder.encode(normalized));
117
- if (!(encrypted instanceof Uint8Array)) {
118
- throw new ValidationError("master mnemonic encryptor must return Uint8Array");
119
- }
120
- await storage.put(MASTER_MNEMONIC_KEY, encrypted);
121
- }
122
- /** Validates seed format. Storage handles buffer isolation on put/get. */
123
- function normalizeMasterSeed(seed) {
124
- if (!(seed instanceof Uint8Array)) {
125
- throw new ValidationError("master seed must be a Uint8Array");
126
- }
127
- if (seed.length !== MASTER_SEED_LENGTH) {
128
- throw new ValidationError(`master seed must be ${MASTER_SEED_LENGTH} bytes`);
129
- }
130
- return seed;
131
- }
132
- function normalizeMnemonic(mnemonic) {
133
- const formatted = mnemonic.trim().replace(/\s+/g, " ");
134
- if (!Mnemonic.validate(formatted)) {
135
- throw new ValidationError("invalid BIP-39 mnemonic phrase");
136
- }
137
- return formatted;
138
- }
139
- function mnemonicToSeed(mnemonic, password = "") {
140
- const seedHex = Mnemonic.toSeed(mnemonic, password);
141
- return Hex.toBytes(seedHex);
142
- }
@@ -1,74 +0,0 @@
1
- {
2
- "joinsplit_1x1_16": {
3
- "file": "joinsplit",
4
- "template": "JoinSplit",
5
- "pubs": ["merkleRoot", "boundParamsHash", "nullifiers", "commitmentsOut"],
6
- "params": [1, 1, 16]
7
- },
8
- "joinsplit_1x2_16": {
9
- "file": "joinsplit",
10
- "template": "JoinSplit",
11
- "pubs": ["merkleRoot", "boundParamsHash", "nullifiers", "commitmentsOut"],
12
- "params": [1, 2, 16]
13
- },
14
- "joinsplit_2x1_16": {
15
- "file": "joinsplit",
16
- "template": "JoinSplit",
17
- "pubs": ["merkleRoot", "boundParamsHash", "nullifiers", "commitmentsOut"],
18
- "params": [2, 1, 16]
19
- },
20
- "joinsplit_2x2_16": {
21
- "file": "joinsplit",
22
- "template": "JoinSplit",
23
- "pubs": ["merkleRoot", "boundParamsHash", "nullifiers", "commitmentsOut"],
24
- "params": [2, 2, 16]
25
- },
26
- "joinsplit_2x3_16": {
27
- "file": "joinsplit",
28
- "template": "JoinSplit",
29
- "pubs": ["merkleRoot", "boundParamsHash", "nullifiers", "commitmentsOut"],
30
- "params": [2, 3, 16]
31
- },
32
- "joinsplit_3x1_16": {
33
- "file": "joinsplit",
34
- "template": "JoinSplit",
35
- "pubs": ["merkleRoot", "boundParamsHash", "nullifiers", "commitmentsOut"],
36
- "params": [3, 1, 16]
37
- },
38
- "joinsplit_3x2_16": {
39
- "file": "joinsplit",
40
- "template": "JoinSplit",
41
- "pubs": ["merkleRoot", "boundParamsHash", "nullifiers", "commitmentsOut"],
42
- "params": [3, 2, 16]
43
- },
44
- "joinsplit_3x3_16": {
45
- "file": "joinsplit",
46
- "template": "JoinSplit",
47
- "pubs": ["merkleRoot", "boundParamsHash", "nullifiers", "commitmentsOut"],
48
- "params": [3, 3, 16]
49
- },
50
- "joinsplit_4x1_16": {
51
- "file": "joinsplit",
52
- "template": "JoinSplit",
53
- "pubs": ["merkleRoot", "boundParamsHash", "nullifiers", "commitmentsOut"],
54
- "params": [4, 1, 16]
55
- },
56
- "joinsplit_4x2_16": {
57
- "file": "joinsplit",
58
- "template": "JoinSplit",
59
- "pubs": ["merkleRoot", "boundParamsHash", "nullifiers", "commitmentsOut"],
60
- "params": [4, 2, 16]
61
- },
62
- "joinsplit_5x1_16": {
63
- "file": "joinsplit",
64
- "template": "JoinSplit",
65
- "pubs": ["merkleRoot", "boundParamsHash", "nullifiers", "commitmentsOut"],
66
- "params": [5, 1, 16]
67
- },
68
- "joinsplit_5x2_16": {
69
- "file": "joinsplit",
70
- "template": "JoinSplit",
71
- "pubs": ["merkleRoot", "boundParamsHash", "nullifiers", "commitmentsOut"],
72
- "params": [5, 2, 16]
73
- }
74
- }
@@ -1,30 +0,0 @@
1
- import { createJsonHttpClient } from "./http.js";
2
- export function createBroadcasterClient(baseUrl, deps) {
3
- const http = createJsonHttpClient(baseUrl, deps);
4
- return {
5
- async submitRelay(params) {
6
- return http.request({
7
- method: "POST",
8
- path: "/relays",
9
- json: {
10
- client_tx_id: params.clientTxId,
11
- chain_id: params.chainId,
12
- ...params.payload,
13
- },
14
- });
15
- },
16
- async getRelayStatus(relayId) {
17
- const raw = await http.request({
18
- method: "GET",
19
- path: `/relays/${relayId}`,
20
- });
21
- return {
22
- id: raw.id,
23
- state: raw.state,
24
- txHash: raw.tx_hash,
25
- receipt: raw.receipt,
26
- error: raw.error,
27
- };
28
- },
29
- };
30
- }
@@ -1,72 +0,0 @@
1
- import ky, { TimeoutError } from "ky";
2
- import { InitializationError } from "../errors.js";
3
- /**
4
- * Resolve fetch implementation from options or global.
5
- * @param providedFetch - Optional fetch implementation
6
- * @returns Fetch function or undefined if not available
7
- */
8
- export function resolveFetch(providedFetch) {
9
- return providedFetch ?? (typeof fetch === "function" ? fetch : undefined);
10
- }
11
- export class HttpError extends Error {
12
- status;
13
- body;
14
- constructor(message, status, body) {
15
- super(message);
16
- this.status = status;
17
- this.body = body;
18
- }
19
- }
20
- async function readErrorBodySafe(res) {
21
- try {
22
- return await res.clone().json();
23
- }
24
- catch {
25
- const text = await res.text();
26
- return text || null;
27
- }
28
- }
29
- export function createJsonHttpClient(baseUrl, deps) {
30
- if (!baseUrl)
31
- throw new InitializationError("baseUrl is required");
32
- if (!deps?.fetch)
33
- throw new InitializationError("deps.fetch is required");
34
- // Ensure `fetch` is invoked with a global `this` to avoid "Illegal invocation"
35
- // errors in some browser environments when the function is extracted. // TODO: can we fix this in another way?
36
- const fetchImpl = (...args) => deps.fetch.apply(globalThis, args);
37
- const api = ky.create({
38
- prefixUrl: baseUrl.replace(/\/+$/, ""),
39
- fetch: fetchImpl,
40
- // Disable ky's automatic error throwing to prevent browser DevTools
41
- // from logging expected 404s as network errors
42
- throwHttpErrors: false,
43
- });
44
- return {
45
- async request(opts) {
46
- let res;
47
- try {
48
- res = await api(opts.path.replace(/^\//, ""), {
49
- method: opts.method,
50
- searchParams: opts.query,
51
- json: opts.json,
52
- body: opts.body,
53
- headers: opts.headers,
54
- signal: opts.signal,
55
- });
56
- }
57
- catch (err) {
58
- // Only network-level errors reach here (timeout, connection refused, etc.)
59
- if (err instanceof TimeoutError) {
60
- throw new HttpError("HTTP timeout", 408, null);
61
- }
62
- throw new HttpError(err instanceof Error ? err.message : "Network error", 0, null);
63
- }
64
- // HTTP status errors handled outside try-catch - no redundant catch/rethrow
65
- if (!res.ok) {
66
- const body = await readErrorBodySafe(res);
67
- throw new HttpError(`HTTP ${res.status} ${res.statusText}`.trim(), res.status, body);
68
- }
69
- return (await res.json());
70
- },
71
- };
72
- }
@@ -1,94 +0,0 @@
1
- import { createJsonHttpClient, HttpError } from "./http.js";
2
- export function createIndexerClient(baseUrl, deps) {
3
- const http = createJsonHttpClient(baseUrl, deps);
4
- const normalizeRecord = (record) => ({
5
- index: record.leaf_index,
6
- commitment: record.commitment,
7
- ciphertext: [...record.ciphertext],
8
- root: record.root,
9
- txHash: record.tx_hash,
10
- insertedAt: record.inserted_at,
11
- eventType: record.event_type ?? "unknown",
12
- });
13
- const normalizeNullifierRecord = (record) => ({
14
- nullifier: record.nullifier,
15
- txHash: record.tx_hash,
16
- spentAt: record.spent_at,
17
- chainId: record.chain_id,
18
- });
19
- return {
20
- async fetchCommitmentBatch(params) {
21
- const raw = await http.request({
22
- method: "GET",
23
- path: `/chains/${params.chainId}/commitments`,
24
- query: {
25
- start: params.start,
26
- limit: params.limit,
27
- },
28
- });
29
- return {
30
- chainId: raw.chain_id,
31
- commitments: raw.commitments.map(normalizeRecord),
32
- latestRoot: raw.latest_root,
33
- };
34
- },
35
- async getCommitment(params) {
36
- const raw = await http.request({
37
- method: "GET",
38
- path: `/chains/${params.chainId}/commitments/${params.commitment}`,
39
- });
40
- if (!raw) {
41
- throw new HttpError("commitment not found", 404, null);
42
- }
43
- return normalizeRecord(raw);
44
- },
45
- /**
46
- * Like getCommitment but returns null when the commitment doesn't exist.
47
- * Used for polling pending deposits without generating console errors.
48
- */
49
- async tryGetCommitment(params) {
50
- const raw = await http.request({
51
- method: "GET",
52
- path: `/chains/${params.chainId}/commitments/${params.commitment}`,
53
- });
54
- return raw ? normalizeRecord(raw) : null;
55
- },
56
- async getNullifier(params) {
57
- const raw = await http.request({
58
- method: "GET",
59
- path: `/chains/${params.chainId}/nullifiers/${params.nullifier}`,
60
- });
61
- return raw ? normalizeNullifierRecord(raw) : null;
62
- },
63
- async checkNullifiers(params) {
64
- const CHUNK_SIZE = 1000;
65
- if (params.nullifiers.length <= CHUNK_SIZE) {
66
- const raw = await http.request({
67
- method: "POST",
68
- path: `/chains/${params.chainId}/nullifiers/check`,
69
- json: { nullifiers: params.nullifiers },
70
- });
71
- return raw.found.map(normalizeNullifierRecord);
72
- }
73
- // Chunk into batches of 1000, run sequentially to avoid overwhelming server
74
- const results = [];
75
- for (let i = 0; i < params.nullifiers.length; i += CHUNK_SIZE) {
76
- const chunk = params.nullifiers.slice(i, i + CHUNK_SIZE);
77
- const raw = await http.request({
78
- method: "POST",
79
- path: `/chains/${params.chainId}/nullifiers/check`,
80
- json: { nullifiers: chunk },
81
- });
82
- results.push(...raw.found.map(normalizeNullifierRecord));
83
- }
84
- return results;
85
- },
86
- async getNullifierCount(chainId) {
87
- const raw = await http.request({
88
- method: "GET",
89
- path: `/chains/${chainId}/nullifiers/count`,
90
- });
91
- return raw.count;
92
- },
93
- };
94
- }