@shieldedtech/moth-wallet 0.2.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 (230) hide show
  1. package/README.md +62 -0
  2. package/dist/contract/args-parser.d.ts +29 -0
  3. package/dist/contract/args-parser.d.ts.map +1 -0
  4. package/dist/contract/args-parser.js +123 -0
  5. package/dist/contract/args-parser.js.map +1 -0
  6. package/dist/contract/artifact-loader.d.ts +26 -0
  7. package/dist/contract/artifact-loader.d.ts.map +1 -0
  8. package/dist/contract/artifact-loader.js +129 -0
  9. package/dist/contract/artifact-loader.js.map +1 -0
  10. package/dist/contract/call.d.ts +32 -0
  11. package/dist/contract/call.d.ts.map +1 -0
  12. package/dist/contract/call.js +245 -0
  13. package/dist/contract/call.js.map +1 -0
  14. package/dist/contract/deploy.d.ts +36 -0
  15. package/dist/contract/deploy.d.ts.map +1 -0
  16. package/dist/contract/deploy.js +388 -0
  17. package/dist/contract/deploy.js.map +1 -0
  18. package/dist/contract/fungible-token.d.ts +40 -0
  19. package/dist/contract/fungible-token.d.ts.map +1 -0
  20. package/dist/contract/fungible-token.js +88 -0
  21. package/dist/contract/fungible-token.js.map +1 -0
  22. package/dist/contract/initial-private-state.d.ts +18 -0
  23. package/dist/contract/initial-private-state.d.ts.map +1 -0
  24. package/dist/contract/initial-private-state.js +44 -0
  25. package/dist/contract/initial-private-state.js.map +1 -0
  26. package/dist/contract/maintenance.d.ts +72 -0
  27. package/dist/contract/maintenance.d.ts.map +1 -0
  28. package/dist/contract/maintenance.js +430 -0
  29. package/dist/contract/maintenance.js.map +1 -0
  30. package/dist/contract/state.d.ts +16 -0
  31. package/dist/contract/state.d.ts.map +1 -0
  32. package/dist/contract/state.js +18 -0
  33. package/dist/contract/state.js.map +1 -0
  34. package/dist/contract/witness-loader.d.ts +3 -0
  35. package/dist/contract/witness-loader.d.ts.map +1 -0
  36. package/dist/contract/witness-loader.js +27 -0
  37. package/dist/contract/witness-loader.js.map +1 -0
  38. package/dist/daemon/api-keys.d.ts +66 -0
  39. package/dist/daemon/api-keys.d.ts.map +1 -0
  40. package/dist/daemon/api-keys.js +222 -0
  41. package/dist/daemon/api-keys.js.map +1 -0
  42. package/dist/daemon/audit-log.d.ts +65 -0
  43. package/dist/daemon/audit-log.d.ts.map +1 -0
  44. package/dist/daemon/audit-log.js +73 -0
  45. package/dist/daemon/audit-log.js.map +1 -0
  46. package/dist/daemon/client.d.ts +63 -0
  47. package/dist/daemon/client.d.ts.map +1 -0
  48. package/dist/daemon/client.js +214 -0
  49. package/dist/daemon/client.js.map +1 -0
  50. package/dist/daemon/confirmation-queue.d.ts +46 -0
  51. package/dist/daemon/confirmation-queue.d.ts.map +1 -0
  52. package/dist/daemon/confirmation-queue.js +92 -0
  53. package/dist/daemon/confirmation-queue.js.map +1 -0
  54. package/dist/daemon/index.d.ts +23 -0
  55. package/dist/daemon/index.d.ts.map +1 -0
  56. package/dist/daemon/index.js +26 -0
  57. package/dist/daemon/index.js.map +1 -0
  58. package/dist/daemon/protocol.d.ts +40 -0
  59. package/dist/daemon/protocol.d.ts.map +1 -0
  60. package/dist/daemon/protocol.js +104 -0
  61. package/dist/daemon/protocol.js.map +1 -0
  62. package/dist/daemon/server.d.ts +158 -0
  63. package/dist/daemon/server.d.ts.map +1 -0
  64. package/dist/daemon/server.js +297 -0
  65. package/dist/daemon/server.js.map +1 -0
  66. package/dist/daemon/wallet-handlers.d.ts +37 -0
  67. package/dist/daemon/wallet-handlers.d.ts.map +1 -0
  68. package/dist/daemon/wallet-handlers.js +533 -0
  69. package/dist/daemon/wallet-handlers.js.map +1 -0
  70. package/dist/daemon/wallet-rpc-parsers.d.ts +14 -0
  71. package/dist/daemon/wallet-rpc-parsers.d.ts.map +1 -0
  72. package/dist/daemon/wallet-rpc-parsers.js +259 -0
  73. package/dist/daemon/wallet-rpc-parsers.js.map +1 -0
  74. package/dist/daemon/wallet-rpc-types.d.ts +138 -0
  75. package/dist/daemon/wallet-rpc-types.d.ts.map +1 -0
  76. package/dist/daemon/wallet-rpc-types.js +11 -0
  77. package/dist/daemon/wallet-rpc-types.js.map +1 -0
  78. package/dist/diagnostics/fs-timing-store.d.ts +29 -0
  79. package/dist/diagnostics/fs-timing-store.d.ts.map +1 -0
  80. package/dist/diagnostics/fs-timing-store.js +81 -0
  81. package/dist/diagnostics/fs-timing-store.js.map +1 -0
  82. package/dist/diagnostics/timings.d.ts +64 -0
  83. package/dist/diagnostics/timings.d.ts.map +1 -0
  84. package/dist/diagnostics/timings.js +100 -0
  85. package/dist/diagnostics/timings.js.map +1 -0
  86. package/dist/index.d.ts +37 -0
  87. package/dist/index.d.ts.map +1 -0
  88. package/dist/index.js +47 -0
  89. package/dist/index.js.map +1 -0
  90. package/dist/network/indexer-client.d.ts +66 -0
  91. package/dist/network/indexer-client.d.ts.map +1 -0
  92. package/dist/network/indexer-client.js +112 -0
  93. package/dist/network/indexer-client.js.map +1 -0
  94. package/dist/network/node-client.d.ts +27 -0
  95. package/dist/network/node-client.d.ts.map +1 -0
  96. package/dist/network/node-client.js +94 -0
  97. package/dist/network/node-client.js.map +1 -0
  98. package/dist/proof/client.d.ts +15 -0
  99. package/dist/proof/client.d.ts.map +1 -0
  100. package/dist/proof/client.js +77 -0
  101. package/dist/proof/client.js.map +1 -0
  102. package/dist/proof/provider.d.ts +12 -0
  103. package/dist/proof/provider.d.ts.map +1 -0
  104. package/dist/proof/provider.js +96 -0
  105. package/dist/proof/provider.js.map +1 -0
  106. package/dist/providers/index.d.ts +2 -0
  107. package/dist/providers/index.d.ts.map +1 -0
  108. package/dist/providers/index.js +2 -0
  109. package/dist/providers/index.js.map +1 -0
  110. package/dist/providers/midnight-provider.d.ts +11 -0
  111. package/dist/providers/midnight-provider.d.ts.map +1 -0
  112. package/dist/providers/midnight-provider.js +30 -0
  113. package/dist/providers/midnight-provider.js.map +1 -0
  114. package/dist/storage/adapter.d.ts +8 -0
  115. package/dist/storage/adapter.d.ts.map +1 -0
  116. package/dist/storage/adapter.js +2 -0
  117. package/dist/storage/adapter.js.map +1 -0
  118. package/dist/storage/fs-adapter.d.ts +14 -0
  119. package/dist/storage/fs-adapter.d.ts.map +1 -0
  120. package/dist/storage/fs-adapter.js +126 -0
  121. package/dist/storage/fs-adapter.js.map +1 -0
  122. package/dist/storage/safe-path.d.ts +13 -0
  123. package/dist/storage/safe-path.d.ts.map +1 -0
  124. package/dist/storage/safe-path.js +35 -0
  125. package/dist/storage/safe-path.js.map +1 -0
  126. package/dist/sync/activity.d.ts +53 -0
  127. package/dist/sync/activity.d.ts.map +1 -0
  128. package/dist/sync/activity.js +92 -0
  129. package/dist/sync/activity.js.map +1 -0
  130. package/dist/sync/dust-registration-estimate.d.ts +54 -0
  131. package/dist/sync/dust-registration-estimate.d.ts.map +1 -0
  132. package/dist/sync/dust-registration-estimate.js +103 -0
  133. package/dist/sync/dust-registration-estimate.js.map +1 -0
  134. package/dist/sync/node-sync-store.d.ts +10 -0
  135. package/dist/sync/node-sync-store.d.ts.map +1 -0
  136. package/dist/sync/node-sync-store.js +42 -0
  137. package/dist/sync/node-sync-store.js.map +1 -0
  138. package/dist/sync/operations.d.ts +138 -0
  139. package/dist/sync/operations.d.ts.map +1 -0
  140. package/dist/sync/operations.js +395 -0
  141. package/dist/sync/operations.js.map +1 -0
  142. package/dist/sync/preseed-parts.d.ts +18 -0
  143. package/dist/sync/preseed-parts.d.ts.map +1 -0
  144. package/dist/sync/preseed-parts.js +33 -0
  145. package/dist/sync/preseed-parts.js.map +1 -0
  146. package/dist/sync/preseed.d.ts +95 -0
  147. package/dist/sync/preseed.d.ts.map +1 -0
  148. package/dist/sync/preseed.js +365 -0
  149. package/dist/sync/preseed.js.map +1 -0
  150. package/dist/sync/progress.d.ts +45 -0
  151. package/dist/sync/progress.d.ts.map +1 -0
  152. package/dist/sync/progress.js +51 -0
  153. package/dist/sync/progress.js.map +1 -0
  154. package/dist/sync/sdk-dedup.d.ts +53 -0
  155. package/dist/sync/sdk-dedup.d.ts.map +1 -0
  156. package/dist/sync/sdk-dedup.js +134 -0
  157. package/dist/sync/sdk-dedup.js.map +1 -0
  158. package/dist/sync/sync-store.d.ts +33 -0
  159. package/dist/sync/sync-store.d.ts.map +1 -0
  160. package/dist/sync/sync-store.js +45 -0
  161. package/dist/sync/sync-store.js.map +1 -0
  162. package/dist/sync/wallet-sync.d.ts +153 -0
  163. package/dist/sync/wallet-sync.d.ts.map +1 -0
  164. package/dist/sync/wallet-sync.js +943 -0
  165. package/dist/sync/wallet-sync.js.map +1 -0
  166. package/dist/types/errors.d.ts +18 -0
  167. package/dist/types/errors.d.ts.map +1 -0
  168. package/dist/types/errors.js +33 -0
  169. package/dist/types/errors.js.map +1 -0
  170. package/dist/types/exit-codes.d.ts +8 -0
  171. package/dist/types/exit-codes.d.ts.map +1 -0
  172. package/dist/types/exit-codes.js +7 -0
  173. package/dist/types/exit-codes.js.map +1 -0
  174. package/dist/types/index.d.ts +6 -0
  175. package/dist/types/index.d.ts.map +1 -0
  176. package/dist/types/index.js +3 -0
  177. package/dist/types/index.js.map +1 -0
  178. package/dist/types/network.d.ts +65 -0
  179. package/dist/types/network.d.ts.map +1 -0
  180. package/dist/types/network.js +108 -0
  181. package/dist/types/network.js.map +1 -0
  182. package/dist/types/tokens.d.ts +3 -0
  183. package/dist/types/tokens.d.ts.map +1 -0
  184. package/dist/types/tokens.js +11 -0
  185. package/dist/types/tokens.js.map +1 -0
  186. package/dist/types/transaction.d.ts +13 -0
  187. package/dist/types/transaction.d.ts.map +1 -0
  188. package/dist/types/transaction.js +2 -0
  189. package/dist/types/transaction.js.map +1 -0
  190. package/dist/types/wallet.d.ts +82 -0
  191. package/dist/types/wallet.d.ts.map +1 -0
  192. package/dist/types/wallet.js +2 -0
  193. package/dist/types/wallet.js.map +1 -0
  194. package/dist/wallet/address-validate.d.ts +7 -0
  195. package/dist/wallet/address-validate.d.ts.map +1 -0
  196. package/dist/wallet/address-validate.js +28 -0
  197. package/dist/wallet/address-validate.js.map +1 -0
  198. package/dist/wallet/address.d.ts +32 -0
  199. package/dist/wallet/address.d.ts.map +1 -0
  200. package/dist/wallet/address.js +107 -0
  201. package/dist/wallet/address.js.map +1 -0
  202. package/dist/wallet/app-secret.d.ts +15 -0
  203. package/dist/wallet/app-secret.d.ts.map +1 -0
  204. package/dist/wallet/app-secret.js +45 -0
  205. package/dist/wallet/app-secret.js.map +1 -0
  206. package/dist/wallet/balance-format.d.ts +12 -0
  207. package/dist/wallet/balance-format.d.ts.map +1 -0
  208. package/dist/wallet/balance-format.js +51 -0
  209. package/dist/wallet/balance-format.js.map +1 -0
  210. package/dist/wallet/batch-transfer.d.ts +36 -0
  211. package/dist/wallet/batch-transfer.d.ts.map +1 -0
  212. package/dist/wallet/batch-transfer.js +93 -0
  213. package/dist/wallet/batch-transfer.js.map +1 -0
  214. package/dist/wallet/keystore.d.ts +16 -0
  215. package/dist/wallet/keystore.d.ts.map +1 -0
  216. package/dist/wallet/keystore.js +76 -0
  217. package/dist/wallet/keystore.js.map +1 -0
  218. package/dist/wallet/manager.d.ts +77 -0
  219. package/dist/wallet/manager.d.ts.map +1 -0
  220. package/dist/wallet/manager.js +474 -0
  221. package/dist/wallet/manager.js.map +1 -0
  222. package/dist/wallet/mnemonic.d.ts +5 -0
  223. package/dist/wallet/mnemonic.d.ts.map +1 -0
  224. package/dist/wallet/mnemonic.js +28 -0
  225. package/dist/wallet/mnemonic.js.map +1 -0
  226. package/dist/wallet/sign-message.d.ts +20 -0
  227. package/dist/wallet/sign-message.d.ts.map +1 -0
  228. package/dist/wallet/sign-message.js +58 -0
  229. package/dist/wallet/sign-message.js.map +1 -0
  230. package/package.json +55 -0
@@ -0,0 +1 @@
1
+ {"version":3,"file":"client.js","sourceRoot":"","sources":["../../src/proof/client.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,12 @@
1
+ import * as ledger from '@midnight-ntwrk/ledger-v8';
2
+ import { type KeyMaterialProvider } from '@midnight-ntwrk/midnight-js/types';
3
+ import type { ProverConfig } from '../types/network.js';
4
+ /** Build the low-level provider used by contracts and the dApp connector. */
5
+ export declare function createProvingProvider(config: ProverConfig, keyMaterialProvider: KeyMaterialProvider): ledger.ProvingProvider;
6
+ /** Build the transaction-level Midnight.js proof provider. */
7
+ export declare function createProofProvider(config: ProverConfig, keyMaterialProvider: KeyMaterialProvider): import("@midnight-ntwrk/midnight-js-types").ProofProvider;
8
+ /** Build the wallet facade service. WASM follows the SDK's documented setup. */
9
+ export declare function createWalletProvingService(config: ProverConfig): import("@midnightntwrk/wallet-sdk-capabilities").ProvingService<import("@midnightntwrk/wallet-sdk-capabilities").UnboundTransaction>;
10
+ /** Proof servers need a preflight; local WASM proving has no remote health check. */
11
+ export declare function ensureProverReady(config: ProverConfig): Promise<void>;
12
+ //# sourceMappingURL=provider.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"provider.d.ts","sourceRoot":"","sources":["../../src/proof/provider.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,MAAM,MAAM,2BAA2B,CAAC;AAEpD,OAAO,EAAmB,KAAK,mBAAmB,EAAC,MAAM,mCAAmC,CAAC;AAW7F,OAAO,KAAK,EAAC,YAAY,EAAC,MAAM,qBAAqB,CAAC;AA8CtD,6EAA6E;AAC7E,wBAAgB,qBAAqB,CACnC,MAAM,EAAE,YAAY,EACpB,mBAAmB,EAAE,mBAAmB,GACvC,MAAM,CAAC,eAAe,CAKxB;AAED,8DAA8D;AAC9D,wBAAgB,mBAAmB,CACjC,MAAM,EAAE,YAAY,EACpB,mBAAmB,EAAE,mBAAmB,6DAiBzC;AAED,gFAAgF;AAChF,wBAAgB,0BAA0B,CAAC,MAAM,EAAE,YAAY,wIAoB9D;AAED,qFAAqF;AACrF,wBAAsB,iBAAiB,CAAC,MAAM,EAAE,YAAY,GAAG,OAAO,CAAC,IAAI,CAAC,CAE3E"}
@@ -0,0 +1,96 @@
1
+ import * as ledger from '@midnight-ntwrk/ledger-v8';
2
+ import { httpClientProvingProvider, httpClientProofProvider } from '@midnight-ntwrk/midnight-js-http-client-proof-provider';
3
+ import { ZKConfigProvider } from '@midnight-ntwrk/midnight-js/types';
4
+ import { provingProvider as wasmProvingProvider, } from '@midnight-ntwrk/zkir-v2';
5
+ import { makeServerProvingService, makeWasmProvingService, } from '@midnightntwrk/wallet-sdk/capabilities/proving';
6
+ import { WasmProver } from '@midnightntwrk/wallet-sdk/prover-client/effect';
7
+ import { ProofClient } from './client.js';
8
+ /** Adapter from the connector/Midnight.js key interface to ZKConfigProvider. */
9
+ class KeyMaterialZkConfigProvider extends ZKConfigProvider {
10
+ source;
11
+ constructor(source) {
12
+ super();
13
+ this.source = source;
14
+ }
15
+ getZKIR(circuitId) {
16
+ return this.source.getZKIR(circuitId);
17
+ }
18
+ getProverKey(circuitId) {
19
+ return this.source.getProverKey(circuitId);
20
+ }
21
+ getVerifierKey(circuitId) {
22
+ return this.source.getVerifierKey(circuitId);
23
+ }
24
+ }
25
+ let defaultWasmKeys;
26
+ function defaultWasmKeyMaterialProvider() {
27
+ return (defaultWasmKeys ??= WasmProver.makeDefaultKeyMaterialProvider());
28
+ }
29
+ function wasmKeyMaterialProvider(source) {
30
+ const defaults = defaultWasmKeyMaterialProvider();
31
+ return {
32
+ async lookupKey(keyLocation) {
33
+ // Native wallet circuits come from the SDK-maintained key source. Contract
34
+ // circuits fall through to the dApp/artifact provider supplied by callers.
35
+ const builtIn = await defaults.lookupKey(keyLocation);
36
+ if (builtIn)
37
+ return builtIn;
38
+ const [ir, proverKey, verifierKey] = await Promise.all([
39
+ source.getZKIR(keyLocation),
40
+ source.getProverKey(keyLocation),
41
+ source.getVerifierKey(keyLocation),
42
+ ]);
43
+ return { ir, proverKey, verifierKey };
44
+ },
45
+ getParams: (k) => defaults.getParams(k),
46
+ };
47
+ }
48
+ /** Build the low-level provider used by contracts and the dApp connector. */
49
+ export function createProvingProvider(config, keyMaterialProvider) {
50
+ if (config.type === 'server') {
51
+ return httpClientProvingProvider(config.url, new KeyMaterialZkConfigProvider(keyMaterialProvider));
52
+ }
53
+ return wasmProvingProvider(wasmKeyMaterialProvider(keyMaterialProvider));
54
+ }
55
+ /** Build the transaction-level Midnight.js proof provider. */
56
+ export function createProofProvider(config, keyMaterialProvider) {
57
+ if (config.type === 'server') {
58
+ // Delegate to the SDK's proof provider rather than re-implementing
59
+ // proveTx. This keeps payload versioning (ledger-v8 8.1.0 rejects
60
+ // unversioned circuit-call proofs) and any future proveTx behavior —
61
+ // e.g. partialProveTxConfig — tracking the SDK instead of drifting from
62
+ // a hand-rolled copy of the same call.
63
+ return httpClientProofProvider(config.url, new KeyMaterialZkConfigProvider(keyMaterialProvider));
64
+ }
65
+ // WASM path: no SDK proof-provider equivalent, so drive prove() directly
66
+ // over the local zkir provider.
67
+ const provingProvider = createProvingProvider(config, keyMaterialProvider);
68
+ return {
69
+ proveTx: (transaction) => transaction.prove(provingProvider, ledger.CostModel.initialCostModel()),
70
+ };
71
+ }
72
+ /** Build the wallet facade service. WASM follows the SDK's documented setup. */
73
+ export function createWalletProvingService(config) {
74
+ if (config.type === 'server') {
75
+ return makeServerProvingService({ provingServerUrl: new URL(config.url) });
76
+ }
77
+ // This is the SDK-documented path and works in Node, where the package's
78
+ // proof-worker.js is addressable from node_modules.
79
+ if (typeof process !== 'undefined' && process.versions?.node) {
80
+ return makeWasmProvingService();
81
+ }
82
+ // Browser bundles do not emit the SDK's dependency-internal proof-worker.js.
83
+ // Moth already runs the wallet host in its own dedicated Worker, so execute
84
+ // the same ZKIR WASM provider there directly instead of nesting a missing
85
+ // worker asset.
86
+ const provider = wasmProvingProvider(defaultWasmKeyMaterialProvider());
87
+ return {
88
+ prove: (transaction) => transaction.prove(provider, ledger.CostModel.initialCostModel()),
89
+ };
90
+ }
91
+ /** Proof servers need a preflight; local WASM proving has no remote health check. */
92
+ export async function ensureProverReady(config) {
93
+ if (config.type === 'server')
94
+ await new ProofClient(config.url).ensureReady();
95
+ }
96
+ //# sourceMappingURL=provider.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"provider.js","sourceRoot":"","sources":["../../src/proof/provider.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,2 @@
1
+ export { createMidnightProvider } from './midnight-provider.js';
2
+ //# sourceMappingURL=index.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/providers/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,sBAAsB,EAAE,MAAM,wBAAwB,CAAC"}
@@ -0,0 +1,2 @@
1
+ export { createMidnightProvider } from './midnight-provider.js';
2
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/providers/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,sBAAsB,EAAE,MAAM,wBAAwB,CAAC"}
@@ -0,0 +1,11 @@
1
+ import type { NetworkConfig } from '../types/network.js';
2
+ /**
3
+ * MidnightProvider that submits finalized transactions to the node
4
+ * via the SDK's PolkadotNodeClient (which uses @polkadot/api internally).
5
+ */
6
+ export declare function createMidnightProvider(network: NetworkConfig): {
7
+ submitTx(finalizedTx: {
8
+ serialize(): Uint8Array;
9
+ }): Promise<string>;
10
+ };
11
+ //# sourceMappingURL=midnight-provider.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"midnight-provider.d.ts","sourceRoot":"","sources":["../../src/providers/midnight-provider.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAC,aAAa,EAAC,MAAM,qBAAqB,CAAC;AAQvD;;;GAGG;AACH,wBAAgB,sBAAsB,CAAC,OAAO,EAAE,aAAa;0BAe7B;QAAC,SAAS,IAAI,UAAU,CAAA;KAAC,GAAG,OAAO,CAAC,MAAM,CAAC;EAQ1E"}
@@ -0,0 +1,30 @@
1
+ import { PolkadotNodeClient, makeConfig } from '@midnightntwrk/wallet-sdk/node-client';
2
+ import { SerializedTransaction } from '@midnightntwrk/wallet-sdk';
3
+ function toWsUrl(url) {
4
+ return url.replace(/^https:/, 'wss:').replace(/^http:/, 'ws:');
5
+ }
6
+ /**
7
+ * MidnightProvider that submits finalized transactions to the node
8
+ * via the SDK's PolkadotNodeClient (which uses @polkadot/api internally).
9
+ */
10
+ export function createMidnightProvider(network) {
11
+ let clientPromise = null;
12
+ function getClient() {
13
+ if (!clientPromise) {
14
+ clientPromise = PolkadotNodeClient.init(makeConfig({
15
+ nodeURL: new URL(toWsUrl(network.nodeUrl)),
16
+ }));
17
+ }
18
+ return clientPromise;
19
+ }
20
+ return {
21
+ async submitTx(finalizedTx) {
22
+ const client = await getClient();
23
+ const serialized = SerializedTransaction.from(finalizedTx);
24
+ // Wait only for Submitted — finalization is tracked separately by publicDataProvider.
25
+ const event = await client.sendMidnightTransactionAndWait(serialized, 'Submitted');
26
+ return event.txHash;
27
+ },
28
+ };
29
+ }
30
+ //# sourceMappingURL=midnight-provider.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"midnight-provider.js","sourceRoot":"","sources":["../../src/providers/midnight-provider.ts"],"names":[],"mappings":"AACA,OAAO,EAAC,kBAAkB,EAAE,UAAU,EAAC,MAAM,uCAAuC,CAAC;AACrF,OAAO,EAAC,qBAAqB,EAAC,MAAM,2BAA2B,CAAC;AAEhE,SAAS,OAAO,CAAC,GAAW;IAC1B,OAAO,GAAG,CAAC,OAAO,CAAC,SAAS,EAAE,MAAM,CAAC,CAAC,OAAO,CAAC,QAAQ,EAAE,KAAK,CAAC,CAAC;AACjE,CAAC;AAED;;;GAGG;AACH,MAAM,UAAU,sBAAsB,CAAC,OAAsB;IAC3D,IAAI,aAAa,GAAuC,IAAI,CAAC;IAE7D,SAAS,SAAS;QAChB,IAAI,CAAC,aAAa,EAAE,CAAC;YACnB,aAAa,GAAG,kBAAkB,CAAC,IAAI,CACrC,UAAU,CAAC;gBACT,OAAO,EAAE,IAAI,GAAG,CAAC,OAAO,CAAC,OAAO,CAAC,OAAO,CAAC,CAAC;aAC3C,CAAC,CACH,CAAC;QACJ,CAAC;QACD,OAAO,aAAa,CAAC;IACvB,CAAC;IAED,OAAO;QACL,KAAK,CAAC,QAAQ,CAAC,WAAsC;YACnD,MAAM,MAAM,GAAG,MAAM,SAAS,EAAE,CAAC;YACjC,MAAM,UAAU,GAAG,qBAAqB,CAAC,IAAI,CAAC,WAAW,CAAC,CAAC;YAC3D,sFAAsF;YACtF,MAAM,KAAK,GAAG,MAAM,MAAM,CAAC,8BAA8B,CAAC,UAAU,EAAE,WAAW,CAAC,CAAC;YACnF,OAAO,KAAK,CAAC,MAAM,CAAC;QACtB,CAAC;KACF,CAAC;AACJ,CAAC"}
@@ -0,0 +1,8 @@
1
+ export interface StorageAdapter {
2
+ read(key: string): Promise<Uint8Array | null>;
3
+ write(key: string, data: Uint8Array): Promise<void>;
4
+ delete(key: string): Promise<void>;
5
+ list(prefix: string): Promise<string[]>;
6
+ exists(key: string): Promise<boolean>;
7
+ }
8
+ //# sourceMappingURL=adapter.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"adapter.d.ts","sourceRoot":"","sources":["../../src/storage/adapter.ts"],"names":[],"mappings":"AAAA,MAAM,WAAW,cAAc;IAC7B,IAAI,CAAC,GAAG,EAAE,MAAM,GAAG,OAAO,CAAC,UAAU,GAAG,IAAI,CAAC,CAAC;IAC9C,KAAK,CAAC,GAAG,EAAE,MAAM,EAAE,IAAI,EAAE,UAAU,GAAG,OAAO,CAAC,IAAI,CAAC,CAAC;IACpD,MAAM,CAAC,GAAG,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC,CAAC;IACnC,IAAI,CAAC,MAAM,EAAE,MAAM,GAAG,OAAO,CAAC,MAAM,EAAE,CAAC,CAAC;IACxC,MAAM,CAAC,GAAG,EAAE,MAAM,GAAG,OAAO,CAAC,OAAO,CAAC,CAAC;CACvC"}
@@ -0,0 +1,2 @@
1
+ export {};
2
+ //# sourceMappingURL=adapter.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"adapter.js","sourceRoot":"","sources":["../../src/storage/adapter.ts"],"names":[],"mappings":""}
@@ -0,0 +1,14 @@
1
+ import type { StorageAdapter } from './adapter.js';
2
+ export declare class FilesystemStorageAdapter implements StorageAdapter {
3
+ private readonly baseDir;
4
+ constructor(baseDir?: string);
5
+ private resolvePath;
6
+ read(key: string): Promise<Uint8Array | null>;
7
+ write(key: string, data: Uint8Array): Promise<void>;
8
+ private acquireLock;
9
+ private releaseLock;
10
+ delete(key: string): Promise<void>;
11
+ list(prefix: string): Promise<string[]>;
12
+ exists(key: string): Promise<boolean>;
13
+ }
14
+ //# sourceMappingURL=fs-adapter.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"fs-adapter.d.ts","sourceRoot":"","sources":["../../src/storage/fs-adapter.ts"],"names":[],"mappings":"AAGA,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,cAAc,CAAC;AAOnD,qBAAa,wBAAyB,YAAW,cAAc;IAC7D,OAAO,CAAC,QAAQ,CAAC,OAAO,CAAS;gBAErB,OAAO,SAAc;IAIjC,OAAO,CAAC,WAAW;IAIb,IAAI,CAAC,GAAG,EAAE,MAAM,GAAG,OAAO,CAAC,UAAU,GAAG,IAAI,CAAC;IAU7C,KAAK,CAAC,GAAG,EAAE,MAAM,EAAE,IAAI,EAAE,UAAU,GAAG,OAAO,CAAC,IAAI,CAAC;YA2B3C,WAAW;YA8BX,WAAW;IAQnB,MAAM,CAAC,GAAG,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC;IASlC,IAAI,CAAC,MAAM,EAAE,MAAM,GAAG,OAAO,CAAC,MAAM,EAAE,CAAC;IAYvC,MAAM,CAAC,GAAG,EAAE,MAAM,GAAG,OAAO,CAAC,OAAO,CAAC;CAQ5C"}
@@ -0,0 +1,126 @@
1
+ import { readFile, writeFile, unlink, readdir, stat, mkdir, chmod, open, rename } from 'node:fs/promises';
2
+ import { join, dirname } from 'node:path';
3
+ import { homedir } from 'node:os';
4
+ import { safePath } from './safe-path.js';
5
+ const DEFAULT_DIR = join(homedir(), '.moth');
6
+ const LOCK_SUFFIX = '.lock';
7
+ const LOCK_STALE_MS = 30_000; // Consider lock stale after 30s
8
+ export class FilesystemStorageAdapter {
9
+ baseDir;
10
+ constructor(baseDir = DEFAULT_DIR) {
11
+ this.baseDir = baseDir;
12
+ }
13
+ resolvePath(key) {
14
+ return safePath(this.baseDir, key);
15
+ }
16
+ async read(key) {
17
+ try {
18
+ const data = await readFile(this.resolvePath(key));
19
+ return new Uint8Array(data);
20
+ }
21
+ catch (err) {
22
+ if (err.code === 'ENOENT')
23
+ return null;
24
+ throw err;
25
+ }
26
+ }
27
+ async write(key, data) {
28
+ const path = this.resolvePath(key);
29
+ await mkdir(dirname(path), { recursive: true });
30
+ // Advisory file locking for concurrent access (T087)
31
+ const lockPath = path + LOCK_SUFFIX;
32
+ await this.acquireLock(lockPath);
33
+ try {
34
+ // Atomic write: stage into a temp file in the same directory, then
35
+ // rename over the target. rename(2) is atomic on POSIX, so a crash or
36
+ // full disk mid-write leaves either the old file intact or the new one
37
+ // complete — never a half-written keystore that can't be opened.
38
+ const tmpPath = `${path}.tmp.${process.pid}.${Date.now()}`;
39
+ try {
40
+ await writeFile(tmpPath, data, { mode: 0o600 });
41
+ // Ensure owner-only perms (FR-005) before the file becomes visible.
42
+ await chmod(tmpPath, 0o600);
43
+ await rename(tmpPath, path);
44
+ }
45
+ catch (err) {
46
+ await unlink(tmpPath).catch(() => { });
47
+ throw err;
48
+ }
49
+ }
50
+ finally {
51
+ await this.releaseLock(lockPath);
52
+ }
53
+ }
54
+ async acquireLock(lockPath) {
55
+ const maxRetries = 10;
56
+ for (let i = 0; i < maxRetries; i++) {
57
+ try {
58
+ // O_CREAT | O_EXCL — fails if file exists (atomic lock)
59
+ const handle = await open(lockPath, 'wx');
60
+ await handle.writeFile(String(process.pid));
61
+ await handle.close();
62
+ return;
63
+ }
64
+ catch (err) {
65
+ if (err.code === 'EEXIST') {
66
+ // Check if lock is stale
67
+ try {
68
+ const lockStat = await stat(lockPath);
69
+ if (Date.now() - lockStat.mtimeMs > LOCK_STALE_MS) {
70
+ await unlink(lockPath);
71
+ continue; // Retry after removing stale lock
72
+ }
73
+ }
74
+ catch {
75
+ continue; // Lock disappeared, retry
76
+ }
77
+ await new Promise(resolve => setTimeout(resolve, 100));
78
+ continue;
79
+ }
80
+ throw err;
81
+ }
82
+ }
83
+ throw new Error(`Could not acquire lock on ${lockPath} — another process may be using this wallet`);
84
+ }
85
+ async releaseLock(lockPath) {
86
+ try {
87
+ await unlink(lockPath);
88
+ }
89
+ catch {
90
+ // Lock already released — not an error
91
+ }
92
+ }
93
+ async delete(key) {
94
+ try {
95
+ await unlink(this.resolvePath(key));
96
+ }
97
+ catch (err) {
98
+ if (err.code === 'ENOENT')
99
+ return;
100
+ throw err;
101
+ }
102
+ }
103
+ async list(prefix) {
104
+ // Use safePath to prevent path traversal outside baseDir (CWE-22)
105
+ const dir = safePath(this.baseDir, prefix);
106
+ try {
107
+ const entries = await readdir(dir);
108
+ return entries.map(e => `${prefix}/${e}`);
109
+ }
110
+ catch (err) {
111
+ if (err.code === 'ENOENT')
112
+ return [];
113
+ throw err;
114
+ }
115
+ }
116
+ async exists(key) {
117
+ try {
118
+ await stat(this.resolvePath(key));
119
+ return true;
120
+ }
121
+ catch {
122
+ return false;
123
+ }
124
+ }
125
+ }
126
+ //# sourceMappingURL=fs-adapter.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"fs-adapter.js","sourceRoot":"","sources":["../../src/storage/fs-adapter.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,13 @@
1
+ /**
2
+ * Validate that a path segment is safe to join with a base directory.
3
+ * Rejects: absolute paths, .., empty segments, path separators.
4
+ * CWE-22 / CWE-73 mitigation.
5
+ */
6
+ export declare function validatePathSegment(segment: string): void;
7
+ /**
8
+ * Resolve a path relative to a base directory and verify containment.
9
+ * Returns the resolved absolute path.
10
+ * Throws if the resolved path escapes the base directory.
11
+ */
12
+ export declare function safePath(baseDir: string, key: string): string;
13
+ //# sourceMappingURL=safe-path.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"safe-path.d.ts","sourceRoot":"","sources":["../../src/storage/safe-path.ts"],"names":[],"mappings":"AAEA;;;;GAIG;AACH,wBAAgB,mBAAmB,CAAC,OAAO,EAAE,MAAM,GAAG,IAAI,CAazD;AAED;;;;GAIG;AACH,wBAAgB,QAAQ,CAAC,OAAO,EAAE,MAAM,EAAE,GAAG,EAAE,MAAM,GAAG,MAAM,CAU7D"}
@@ -0,0 +1,35 @@
1
+ import { resolve, relative, normalize } from 'node:path';
2
+ /**
3
+ * Validate that a path segment is safe to join with a base directory.
4
+ * Rejects: absolute paths, .., empty segments, path separators.
5
+ * CWE-22 / CWE-73 mitigation.
6
+ */
7
+ export function validatePathSegment(segment) {
8
+ if (!segment || segment.trim() === '') {
9
+ throw new Error('Path segment cannot be empty');
10
+ }
11
+ if (segment.includes('..')) {
12
+ throw new Error(`Path segment contains traversal: ${segment}`);
13
+ }
14
+ if (segment.startsWith('/') || segment.startsWith('\\')) {
15
+ throw new Error(`Path segment is absolute: ${segment}`);
16
+ }
17
+ if (/[/\\]/.test(segment) && segment.includes('..')) {
18
+ throw new Error(`Path segment contains traversal: ${segment}`);
19
+ }
20
+ }
21
+ /**
22
+ * Resolve a path relative to a base directory and verify containment.
23
+ * Returns the resolved absolute path.
24
+ * Throws if the resolved path escapes the base directory.
25
+ */
26
+ export function safePath(baseDir, key) {
27
+ const absBase = resolve(baseDir);
28
+ const absPath = resolve(absBase, normalize(key));
29
+ const rel = relative(absBase, absPath);
30
+ if (rel.startsWith('..') || resolve(absPath) !== absPath) {
31
+ throw new Error(`Path escapes base directory: ${key}`);
32
+ }
33
+ return absPath;
34
+ }
35
+ //# sourceMappingURL=safe-path.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"safe-path.js","sourceRoot":"","sources":["../../src/storage/safe-path.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,OAAO,EAAE,QAAQ,EAAE,SAAS,EAAE,MAAM,WAAW,CAAC;AAEzD;;;;GAIG;AACH,MAAM,UAAU,mBAAmB,CAAC,OAAe;IACjD,IAAI,CAAC,OAAO,IAAI,OAAO,CAAC,IAAI,EAAE,KAAK,EAAE,EAAE,CAAC;QACtC,MAAM,IAAI,KAAK,CAAC,8BAA8B,CAAC,CAAC;IAClD,CAAC;IACD,IAAI,OAAO,CAAC,QAAQ,CAAC,IAAI,CAAC,EAAE,CAAC;QAC3B,MAAM,IAAI,KAAK,CAAC,oCAAoC,OAAO,EAAE,CAAC,CAAC;IACjE,CAAC;IACD,IAAI,OAAO,CAAC,UAAU,CAAC,GAAG,CAAC,IAAI,OAAO,CAAC,UAAU,CAAC,IAAI,CAAC,EAAE,CAAC;QACxD,MAAM,IAAI,KAAK,CAAC,6BAA6B,OAAO,EAAE,CAAC,CAAC;IAC1D,CAAC;IACD,IAAI,OAAO,CAAC,IAAI,CAAC,OAAO,CAAC,IAAI,OAAO,CAAC,QAAQ,CAAC,IAAI,CAAC,EAAE,CAAC;QACpD,MAAM,IAAI,KAAK,CAAC,oCAAoC,OAAO,EAAE,CAAC,CAAC;IACjE,CAAC;AACH,CAAC;AAED;;;;GAIG;AACH,MAAM,UAAU,QAAQ,CAAC,OAAe,EAAE,GAAW;IACnD,MAAM,OAAO,GAAG,OAAO,CAAC,OAAO,CAAC,CAAC;IACjC,MAAM,OAAO,GAAG,OAAO,CAAC,OAAO,EAAE,SAAS,CAAC,GAAG,CAAC,CAAC,CAAC;IACjD,MAAM,GAAG,GAAG,QAAQ,CAAC,OAAO,EAAE,OAAO,CAAC,CAAC;IAEvC,IAAI,GAAG,CAAC,UAAU,CAAC,IAAI,CAAC,IAAI,OAAO,CAAC,OAAO,CAAC,KAAK,OAAO,EAAE,CAAC;QACzD,MAAM,IAAI,KAAK,CAAC,gCAAgC,GAAG,EAAE,CAAC,CAAC;IACzD,CAAC;IAED,OAAO,OAAO,CAAC;AACjB,CAAC"}
@@ -0,0 +1,53 @@
1
+ import type { WalletEntry } from '@midnightntwrk/wallet-sdk/facade';
2
+ export type ActivityKind = 'sent' | 'received' | 'swap' | 'dust';
3
+ export type ActivityStatus = 'SUCCESS' | 'FAILURE' | 'PARTIAL_SUCCESS';
4
+ /** Net movement of one token for the wallet; negative = left the wallet. */
5
+ export interface ActivityDelta {
6
+ tokenType: string;
7
+ kind: 'shielded' | 'unshielded';
8
+ amount: bigint;
9
+ }
10
+ export interface ActivityEntry {
11
+ hash: string;
12
+ /** Stable logical identifiers for this transaction, when history exposes them. */
13
+ identifiers?: string[];
14
+ kind: ActivityKind;
15
+ status: ActivityStatus;
16
+ /** Block timestamp; null for older/partial records. */
17
+ timestamp: Date | null;
18
+ /** Net per-token movements, largest magnitude first. Excludes DUST. */
19
+ deltas: ActivityDelta[];
20
+ /** Net DUST movement (initial values of received minus spent DUST UTXOs). */
21
+ dustDelta: bigint;
22
+ /** The other side's unshielded address, when the entry reveals it. */
23
+ counterparty: string | null;
24
+ /** DUST paid in fees, when the indexer reported it. */
25
+ fees: bigint | null;
26
+ /** True for a locally-submitted transaction not yet seen on chain. */
27
+ pending: boolean;
28
+ /** Number of outgoing destination outputs the wallet can see — how many
29
+ * transfers a single (possibly batched) transaction carried. Counts
30
+ * external unshielded created UTxOs; shielded recipients are unknowable
31
+ * (their notes can't be decrypted), so a shielded-only batch reads 0. */
32
+ outputs?: number;
33
+ }
34
+ /**
35
+ * Derive one activity entry from a stored history entry.
36
+ *
37
+ * Unshielded UTXOs carry an owner address: the wallet's own movements are the
38
+ * UTXOs it owns, and any foreign owner is the counterparty (recipient on a
39
+ * created UTXO, sender on a spent one). Some indexers only report the wallet's
40
+ * own UTXOs — then no foreign owner appears and the counterparty stays null.
41
+ * If NO owner matches `ownAddress`, the address comparison itself is broken
42
+ * (unexpected encoding); every UTXO is then counted as the wallet's own, which
43
+ * matches the wallet-relevant-only reporting model, instead of derailing every
44
+ * entry to zero movement. Shielded coins never carry owners: only the wallet
45
+ * can decrypt its own notes, so they are all wallet movements by construction.
46
+ */
47
+ export declare function deriveActivityEntry(entry: WalletEntry, ownAddress: string): ActivityEntry;
48
+ /** Newest first; entries without a timestamp keep their relative order at the end. */
49
+ export declare function sortActivity<T extends {
50
+ timestamp: Date | null;
51
+ }>(entries: T[]): T[];
52
+ export declare function deriveActivity(entries: readonly WalletEntry[], ownAddress: string): ActivityEntry[];
53
+ //# sourceMappingURL=activity.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"activity.d.ts","sourceRoot":"","sources":["../../src/sync/activity.ts"],"names":[],"mappings":"AAQA,OAAO,KAAK,EAAC,WAAW,EAAC,MAAM,kCAAkC,CAAC;AAElE,MAAM,MAAM,YAAY,GAAG,MAAM,GAAG,UAAU,GAAG,MAAM,GAAG,MAAM,CAAC;AACjE,MAAM,MAAM,cAAc,GAAG,SAAS,GAAG,SAAS,GAAG,iBAAiB,CAAC;AAEvE,4EAA4E;AAC5E,MAAM,WAAW,aAAa;IAC5B,SAAS,EAAE,MAAM,CAAC;IAClB,IAAI,EAAE,UAAU,GAAG,YAAY,CAAC;IAChC,MAAM,EAAE,MAAM,CAAC;CAChB;AAED,MAAM,WAAW,aAAa;IAC5B,IAAI,EAAE,MAAM,CAAC;IACb,kFAAkF;IAClF,WAAW,CAAC,EAAE,MAAM,EAAE,CAAC;IACvB,IAAI,EAAE,YAAY,CAAC;IACnB,MAAM,EAAE,cAAc,CAAC;IACvB,uDAAuD;IACvD,SAAS,EAAE,IAAI,GAAG,IAAI,CAAC;IACvB,uEAAuE;IACvE,MAAM,EAAE,aAAa,EAAE,CAAC;IACxB,6EAA6E;IAC7E,SAAS,EAAE,MAAM,CAAC;IAClB,sEAAsE;IACtE,YAAY,EAAE,MAAM,GAAG,IAAI,CAAC;IAC5B,uDAAuD;IACvD,IAAI,EAAE,MAAM,GAAG,IAAI,CAAC;IACpB,sEAAsE;IACtE,OAAO,EAAE,OAAO,CAAC;IACjB;;;8EAG0E;IAC1E,OAAO,CAAC,EAAE,MAAM,CAAC;CAClB;AAcD;;;;;;;;;;;;GAYG;AACH,wBAAgB,mBAAmB,CAAC,KAAK,EAAE,WAAW,EAAE,UAAU,EAAE,MAAM,GAAG,aAAa,CAuDzF;AAMD,sFAAsF;AACtF,wBAAgB,YAAY,CAAC,CAAC,SAAS;IAAC,SAAS,EAAE,IAAI,GAAG,IAAI,CAAA;CAAC,EAAE,OAAO,EAAE,CAAC,EAAE,GAAG,CAAC,EAAE,CAElF;AAED,wBAAgB,cAAc,CAAC,OAAO,EAAE,SAAS,WAAW,EAAE,EAAE,UAAU,EAAE,MAAM,GAAG,aAAa,EAAE,CAEnG"}
@@ -0,0 +1,92 @@
1
+ // Activity feed derivation: turns the SDK's stored transaction-history entries
2
+ // (WalletEntry — per-tx shielded/unshielded/dust sections) into display-ready
3
+ // entries with a direction, net per-token movements and, when the entry reveals
4
+ // it, the counterparty address.
5
+ //
6
+ // IMPORTANT: this module must stay WASM-free (type-only SDK imports) — UI
7
+ // bundles import it for the types and pure helpers.
8
+ function addDelta(deltas, kind, tokenType, amount) {
9
+ const key = `${kind}:${tokenType}`;
10
+ const existing = deltas.get(key);
11
+ if (existing)
12
+ existing.amount += amount;
13
+ else
14
+ deltas.set(key, { tokenType, kind, amount });
15
+ }
16
+ /**
17
+ * Derive one activity entry from a stored history entry.
18
+ *
19
+ * Unshielded UTXOs carry an owner address: the wallet's own movements are the
20
+ * UTXOs it owns, and any foreign owner is the counterparty (recipient on a
21
+ * created UTXO, sender on a spent one). Some indexers only report the wallet's
22
+ * own UTXOs — then no foreign owner appears and the counterparty stays null.
23
+ * If NO owner matches `ownAddress`, the address comparison itself is broken
24
+ * (unexpected encoding); every UTXO is then counted as the wallet's own, which
25
+ * matches the wallet-relevant-only reporting model, instead of derailing every
26
+ * entry to zero movement. Shielded coins never carry owners: only the wallet
27
+ * can decrypt its own notes, so they are all wallet movements by construction.
28
+ */
29
+ export function deriveActivityEntry(entry, ownAddress) {
30
+ const deltas = new Map();
31
+ let recipient = null;
32
+ let sender = null;
33
+ const created = entry.unshielded?.createdUtxos ?? [];
34
+ const spent = entry.unshielded?.spentUtxos ?? [];
35
+ const anyOwn = [...created, ...spent].some((utxo) => utxo.owner === ownAddress);
36
+ const isOwn = (owner) => !anyOwn || owner === ownAddress;
37
+ let outputs = 0;
38
+ for (const utxo of created) {
39
+ if (isOwn(utxo.owner))
40
+ addDelta(deltas, 'unshielded', utxo.tokenType, utxo.value);
41
+ else {
42
+ recipient ??= utxo.owner;
43
+ outputs += 1; // each external created UTxO is one outgoing transfer
44
+ }
45
+ }
46
+ for (const utxo of spent) {
47
+ if (isOwn(utxo.owner))
48
+ addDelta(deltas, 'unshielded', utxo.tokenType, -utxo.value);
49
+ else
50
+ sender ??= utxo.owner;
51
+ }
52
+ for (const coin of entry.shielded?.receivedCoins ?? []) {
53
+ addDelta(deltas, 'shielded', coin.type, coin.value);
54
+ }
55
+ for (const coin of entry.shielded?.spentCoins ?? []) {
56
+ addDelta(deltas, 'shielded', coin.type, -coin.value);
57
+ }
58
+ let dustDelta = 0n;
59
+ for (const utxo of entry.dust?.receivedUtxos ?? [])
60
+ dustDelta += utxo.initialValue;
61
+ for (const utxo of entry.dust?.spentUtxos ?? [])
62
+ dustDelta -= utxo.initialValue;
63
+ const net = [...deltas.values()].filter((delta) => delta.amount !== 0n);
64
+ net.sort((a, b) => (abs(b.amount) > abs(a.amount) ? 1 : abs(b.amount) < abs(a.amount) ? -1 : 0));
65
+ const hasNegative = net.some((delta) => delta.amount < 0n);
66
+ const hasPositive = net.some((delta) => delta.amount > 0n);
67
+ const kind = hasNegative && hasPositive ? 'swap' : hasNegative ? 'sent' : hasPositive ? 'received' : 'dust';
68
+ return {
69
+ hash: entry.hash,
70
+ identifiers: entry.identifiers ? [...entry.identifiers] : undefined,
71
+ kind,
72
+ status: entry.status,
73
+ timestamp: entry.timestamp ?? null,
74
+ deltas: net,
75
+ dustDelta,
76
+ counterparty: kind === 'sent' || kind === 'swap' ? recipient : kind === 'received' ? sender : null,
77
+ fees: entry.fees ?? null,
78
+ pending: false,
79
+ outputs,
80
+ };
81
+ }
82
+ function abs(value) {
83
+ return value < 0n ? -value : value;
84
+ }
85
+ /** Newest first; entries without a timestamp keep their relative order at the end. */
86
+ export function sortActivity(entries) {
87
+ return [...entries].sort((a, b) => (b.timestamp?.getTime() ?? 0) - (a.timestamp?.getTime() ?? 0));
88
+ }
89
+ export function deriveActivity(entries, ownAddress) {
90
+ return sortActivity(entries.map((entry) => deriveActivityEntry(entry, ownAddress)));
91
+ }
92
+ //# sourceMappingURL=activity.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"activity.js","sourceRoot":"","sources":["../../src/sync/activity.ts"],"names":[],"mappings":"AAAA,+EAA+E;AAC/E,8EAA8E;AAC9E,gFAAgF;AAChF,gCAAgC;AAChC,EAAE;AACF,0EAA0E;AAC1E,oDAAoD;AAuCpD,SAAS,QAAQ,CACf,MAAkC,EAClC,IAA+B,EAC/B,SAAiB,EACjB,MAAc;IAEd,MAAM,GAAG,GAAG,GAAG,IAAI,IAAI,SAAS,EAAE,CAAC;IACnC,MAAM,QAAQ,GAAG,MAAM,CAAC,GAAG,CAAC,GAAG,CAAC,CAAC;IACjC,IAAI,QAAQ;QAAE,QAAQ,CAAC,MAAM,IAAI,MAAM,CAAC;;QACnC,MAAM,CAAC,GAAG,CAAC,GAAG,EAAE,EAAC,SAAS,EAAE,IAAI,EAAE,MAAM,EAAC,CAAC,CAAC;AAClD,CAAC;AAED;;;;;;;;;;;;GAYG;AACH,MAAM,UAAU,mBAAmB,CAAC,KAAkB,EAAE,UAAkB;IACxE,MAAM,MAAM,GAAG,IAAI,GAAG,EAAyB,CAAC;IAChD,IAAI,SAAS,GAAkB,IAAI,CAAC;IACpC,IAAI,MAAM,GAAkB,IAAI,CAAC;IAEjC,MAAM,OAAO,GAAG,KAAK,CAAC,UAAU,EAAE,YAAY,IAAI,EAAE,CAAC;IACrD,MAAM,KAAK,GAAG,KAAK,CAAC,UAAU,EAAE,UAAU,IAAI,EAAE,CAAC;IACjD,MAAM,MAAM,GAAG,CAAC,GAAG,OAAO,EAAE,GAAG,KAAK,CAAC,CAAC,IAAI,CAAC,CAAC,IAAI,EAAE,EAAE,CAAC,IAAI,CAAC,KAAK,KAAK,UAAU,CAAC,CAAC;IAChF,MAAM,KAAK,GAAG,CAAC,KAAa,EAAE,EAAE,CAAC,CAAC,MAAM,IAAI,KAAK,KAAK,UAAU,CAAC;IAEjE,IAAI,OAAO,GAAG,CAAC,CAAC;IAChB,KAAK,MAAM,IAAI,IAAI,OAAO,EAAE,CAAC;QAC3B,IAAI,KAAK,CAAC,IAAI,CAAC,KAAK,CAAC;YAAE,QAAQ,CAAC,MAAM,EAAE,YAAY,EAAE,IAAI,CAAC,SAAS,EAAE,IAAI,CAAC,KAAK,CAAC,CAAC;aAC7E,CAAC;YACJ,SAAS,KAAK,IAAI,CAAC,KAAK,CAAC;YACzB,OAAO,IAAI,CAAC,CAAC,CAAC,sDAAsD;QACtE,CAAC;IACH,CAAC;IACD,KAAK,MAAM,IAAI,IAAI,KAAK,EAAE,CAAC;QACzB,IAAI,KAAK,CAAC,IAAI,CAAC,KAAK,CAAC;YAAE,QAAQ,CAAC,MAAM,EAAE,YAAY,EAAE,IAAI,CAAC,SAAS,EAAE,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC;;YAC9E,MAAM,KAAK,IAAI,CAAC,KAAK,CAAC;IAC7B,CAAC;IAED,KAAK,MAAM,IAAI,IAAI,KAAK,CAAC,QAAQ,EAAE,aAAa,IAAI,EAAE,EAAE,CAAC;QACvD,QAAQ,CAAC,MAAM,EAAE,UAAU,EAAE,IAAI,CAAC,IAAI,EAAE,IAAI,CAAC,KAAK,CAAC,CAAC;IACtD,CAAC;IACD,KAAK,MAAM,IAAI,IAAI,KAAK,CAAC,QAAQ,EAAE,UAAU,IAAI,EAAE,EAAE,CAAC;QACpD,QAAQ,CAAC,MAAM,EAAE,UAAU,EAAE,IAAI,CAAC,IAAI,EAAE,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC;IACvD,CAAC;IAED,IAAI,SAAS,GAAG,EAAE,CAAC;IACnB,KAAK,MAAM,IAAI,IAAI,KAAK,CAAC,IAAI,EAAE,aAAa,IAAI,EAAE;QAAE,SAAS,IAAI,IAAI,CAAC,YAAY,CAAC;IACnF,KAAK,MAAM,IAAI,IAAI,KAAK,CAAC,IAAI,EAAE,UAAU,IAAI,EAAE;QAAE,SAAS,IAAI,IAAI,CAAC,YAAY,CAAC;IAEhF,MAAM,GAAG,GAAG,CAAC,GAAG,MAAM,CAAC,MAAM,EAAE,CAAC,CAAC,MAAM,CAAC,CAAC,KAAK,EAAE,EAAE,CAAC,KAAK,CAAC,MAAM,KAAK,EAAE,CAAC,CAAC;IACxE,GAAG,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,CAAC,EAAE,EAAE,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,MAAM,CAAC,GAAG,GAAG,CAAC,CAAC,CAAC,MAAM,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,MAAM,CAAC,GAAG,GAAG,CAAC,CAAC,CAAC,MAAM,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC;IAEjG,MAAM,WAAW,GAAG,GAAG,CAAC,IAAI,CAAC,CAAC,KAAK,EAAE,EAAE,CAAC,KAAK,CAAC,MAAM,GAAG,EAAE,CAAC,CAAC;IAC3D,MAAM,WAAW,GAAG,GAAG,CAAC,IAAI,CAAC,CAAC,KAAK,EAAE,EAAE,CAAC,KAAK,CAAC,MAAM,GAAG,EAAE,CAAC,CAAC;IAC3D,MAAM,IAAI,GACR,WAAW,IAAI,WAAW,CAAC,CAAC,CAAC,MAAM,CAAC,CAAC,CAAC,WAAW,CAAC,CAAC,CAAC,MAAM,CAAC,CAAC,CAAC,WAAW,CAAC,CAAC,CAAC,UAAU,CAAC,CAAC,CAAC,MAAM,CAAC;IAEjG,OAAO;QACL,IAAI,EAAE,KAAK,CAAC,IAAI;QAChB,WAAW,EAAE,KAAK,CAAC,WAAW,CAAC,CAAC,CAAC,CAAC,GAAG,KAAK,CAAC,WAAW,CAAC,CAAC,CAAC,CAAC,SAAS;QACnE,IAAI;QACJ,MAAM,EAAE,KAAK,CAAC,MAAM;QACpB,SAAS,EAAE,KAAK,CAAC,SAAS,IAAI,IAAI;QAClC,MAAM,EAAE,GAAG;QACX,SAAS;QACT,YAAY,EAAE,IAAI,KAAK,MAAM,IAAI,IAAI,KAAK,MAAM,CAAC,CAAC,CAAC,SAAS,CAAC,CAAC,CAAC,IAAI,KAAK,UAAU,CAAC,CAAC,CAAC,MAAM,CAAC,CAAC,CAAC,IAAI;QAClG,IAAI,EAAE,KAAK,CAAC,IAAI,IAAI,IAAI;QACxB,OAAO,EAAE,KAAK;QACd,OAAO;KACR,CAAC;AACJ,CAAC;AAED,SAAS,GAAG,CAAC,KAAa;IACxB,OAAO,KAAK,GAAG,EAAE,CAAC,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC,KAAK,CAAC;AACrC,CAAC;AAED,sFAAsF;AACtF,MAAM,UAAU,YAAY,CAAqC,OAAY;IAC3E,OAAO,CAAC,GAAG,OAAO,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,CAAC,SAAS,EAAE,OAAO,EAAE,IAAI,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,SAAS,EAAE,OAAO,EAAE,IAAI,CAAC,CAAC,CAAC,CAAC;AACpG,CAAC;AAED,MAAM,UAAU,cAAc,CAAC,OAA+B,EAAE,UAAkB;IAChF,OAAO,YAAY,CAAC,OAAO,CAAC,GAAG,CAAC,CAAC,KAAK,EAAE,EAAE,CAAC,mBAAmB,CAAC,KAAK,EAAE,UAAU,CAAC,CAAC,CAAC,CAAC;AACtF,CAAC"}