@cogcoin/client 0.5.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 (289) hide show
  1. package/LICENSE +21 -0
  2. package/README.md +136 -0
  3. package/dist/app-paths.d.ts +38 -0
  4. package/dist/app-paths.js +121 -0
  5. package/dist/art/banner.txt +13 -0
  6. package/dist/art/scroll.txt +13 -0
  7. package/dist/art/train-car.txt +6 -0
  8. package/dist/art/train-smoke.txt +6 -0
  9. package/dist/art/train.txt +6 -0
  10. package/dist/bitcoind/bootstrap/chainstate.d.ts +4 -0
  11. package/dist/bitcoind/bootstrap/chainstate.js +13 -0
  12. package/dist/bitcoind/bootstrap/constants.d.ts +7 -0
  13. package/dist/bitcoind/bootstrap/constants.js +12 -0
  14. package/dist/bitcoind/bootstrap/controller.d.ts +29 -0
  15. package/dist/bitcoind/bootstrap/controller.js +101 -0
  16. package/dist/bitcoind/bootstrap/download.d.ts +2 -0
  17. package/dist/bitcoind/bootstrap/download.js +196 -0
  18. package/dist/bitcoind/bootstrap/headers.d.ts +13 -0
  19. package/dist/bitcoind/bootstrap/headers.js +61 -0
  20. package/dist/bitcoind/bootstrap/paths.d.ts +4 -0
  21. package/dist/bitcoind/bootstrap/paths.js +15 -0
  22. package/dist/bitcoind/bootstrap/snapshot-file.d.ts +7 -0
  23. package/dist/bitcoind/bootstrap/snapshot-file.js +42 -0
  24. package/dist/bitcoind/bootstrap/state.d.ts +40 -0
  25. package/dist/bitcoind/bootstrap/state.js +70 -0
  26. package/dist/bitcoind/bootstrap/types.d.ts +28 -0
  27. package/dist/bitcoind/bootstrap/types.js +1 -0
  28. package/dist/bitcoind/bootstrap.d.ts +8 -0
  29. package/dist/bitcoind/bootstrap.js +7 -0
  30. package/dist/bitcoind/client/factory.d.ts +3 -0
  31. package/dist/bitcoind/client/factory.js +57 -0
  32. package/dist/bitcoind/client/follow-block-times.d.ts +8 -0
  33. package/dist/bitcoind/client/follow-block-times.js +25 -0
  34. package/dist/bitcoind/client/follow-loop.d.ts +10 -0
  35. package/dist/bitcoind/client/follow-loop.js +57 -0
  36. package/dist/bitcoind/client/internal-types.d.ts +63 -0
  37. package/dist/bitcoind/client/internal-types.js +18 -0
  38. package/dist/bitcoind/client/managed-client.d.ts +20 -0
  39. package/dist/bitcoind/client/managed-client.js +197 -0
  40. package/dist/bitcoind/client/rate-tracker.d.ts +2 -0
  41. package/dist/bitcoind/client/rate-tracker.js +24 -0
  42. package/dist/bitcoind/client/sync-engine.d.ts +3 -0
  43. package/dist/bitcoind/client/sync-engine.js +143 -0
  44. package/dist/bitcoind/client.d.ts +1 -0
  45. package/dist/bitcoind/client.js +1 -0
  46. package/dist/bitcoind/errors.d.ts +1 -0
  47. package/dist/bitcoind/errors.js +49 -0
  48. package/dist/bitcoind/index.d.ts +2 -0
  49. package/dist/bitcoind/index.js +1 -0
  50. package/dist/bitcoind/indexer-daemon-main.d.ts +1 -0
  51. package/dist/bitcoind/indexer-daemon-main.js +472 -0
  52. package/dist/bitcoind/indexer-daemon.d.ts +107 -0
  53. package/dist/bitcoind/indexer-daemon.js +391 -0
  54. package/dist/bitcoind/node.d.ts +8 -0
  55. package/dist/bitcoind/node.js +219 -0
  56. package/dist/bitcoind/normalize.d.ts +3 -0
  57. package/dist/bitcoind/normalize.js +47 -0
  58. package/dist/bitcoind/progress/assets.d.ts +10 -0
  59. package/dist/bitcoind/progress/assets.js +90 -0
  60. package/dist/bitcoind/progress/constants.d.ts +48 -0
  61. package/dist/bitcoind/progress/constants.js +53 -0
  62. package/dist/bitcoind/progress/controller.d.ts +28 -0
  63. package/dist/bitcoind/progress/controller.js +188 -0
  64. package/dist/bitcoind/progress/follow-scene.d.ts +40 -0
  65. package/dist/bitcoind/progress/follow-scene.js +367 -0
  66. package/dist/bitcoind/progress/formatting.d.ts +23 -0
  67. package/dist/bitcoind/progress/formatting.js +227 -0
  68. package/dist/bitcoind/progress/quote-scene.d.ts +4 -0
  69. package/dist/bitcoind/progress/quote-scene.js +137 -0
  70. package/dist/bitcoind/progress/train-scene.d.ts +9 -0
  71. package/dist/bitcoind/progress/train-scene.js +92 -0
  72. package/dist/bitcoind/progress/tty-renderer.d.ts +18 -0
  73. package/dist/bitcoind/progress/tty-renderer.js +150 -0
  74. package/dist/bitcoind/progress.d.ts +7 -0
  75. package/dist/bitcoind/progress.js +7 -0
  76. package/dist/bitcoind/quotes.d.ts +24 -0
  77. package/dist/bitcoind/quotes.js +195 -0
  78. package/dist/bitcoind/rpc.d.ts +71 -0
  79. package/dist/bitcoind/rpc.js +322 -0
  80. package/dist/bitcoind/service-paths.d.ts +19 -0
  81. package/dist/bitcoind/service-paths.js +49 -0
  82. package/dist/bitcoind/service.d.ts +40 -0
  83. package/dist/bitcoind/service.js +735 -0
  84. package/dist/bitcoind/testing.d.ts +9 -0
  85. package/dist/bitcoind/testing.js +9 -0
  86. package/dist/bitcoind/types.d.ts +396 -0
  87. package/dist/bitcoind/types.js +3 -0
  88. package/dist/bytes.d.ts +9 -0
  89. package/dist/bytes.js +36 -0
  90. package/dist/cli/commands/follow.d.ts +2 -0
  91. package/dist/cli/commands/follow.js +43 -0
  92. package/dist/cli/commands/mining-admin.d.ts +2 -0
  93. package/dist/cli/commands/mining-admin.js +92 -0
  94. package/dist/cli/commands/mining-read.d.ts +2 -0
  95. package/dist/cli/commands/mining-read.js +173 -0
  96. package/dist/cli/commands/mining-runtime.d.ts +2 -0
  97. package/dist/cli/commands/mining-runtime.js +108 -0
  98. package/dist/cli/commands/status.d.ts +2 -0
  99. package/dist/cli/commands/status.js +31 -0
  100. package/dist/cli/commands/sync.d.ts +2 -0
  101. package/dist/cli/commands/sync.js +52 -0
  102. package/dist/cli/commands/wallet-admin.d.ts +2 -0
  103. package/dist/cli/commands/wallet-admin.js +175 -0
  104. package/dist/cli/commands/wallet-mutation.d.ts +2 -0
  105. package/dist/cli/commands/wallet-mutation.js +681 -0
  106. package/dist/cli/commands/wallet-read.d.ts +2 -0
  107. package/dist/cli/commands/wallet-read.js +265 -0
  108. package/dist/cli/context.d.ts +3 -0
  109. package/dist/cli/context.js +75 -0
  110. package/dist/cli/io.d.ts +3 -0
  111. package/dist/cli/io.js +12 -0
  112. package/dist/cli/mining-format.d.ts +5 -0
  113. package/dist/cli/mining-format.js +156 -0
  114. package/dist/cli/mining-json.d.ts +49 -0
  115. package/dist/cli/mining-json.js +89 -0
  116. package/dist/cli/mutation-command-groups.d.ts +15 -0
  117. package/dist/cli/mutation-command-groups.js +71 -0
  118. package/dist/cli/mutation-json.d.ts +430 -0
  119. package/dist/cli/mutation-json.js +311 -0
  120. package/dist/cli/mutation-resolved-json.d.ts +124 -0
  121. package/dist/cli/mutation-resolved-json.js +129 -0
  122. package/dist/cli/mutation-success.d.ts +20 -0
  123. package/dist/cli/mutation-success.js +47 -0
  124. package/dist/cli/mutation-text-format.d.ts +22 -0
  125. package/dist/cli/mutation-text-format.js +171 -0
  126. package/dist/cli/mutation-text-write.d.ts +13 -0
  127. package/dist/cli/mutation-text-write.js +16 -0
  128. package/dist/cli/output.d.ts +185 -0
  129. package/dist/cli/output.js +1085 -0
  130. package/dist/cli/parse.d.ts +3 -0
  131. package/dist/cli/parse.js +971 -0
  132. package/dist/cli/preview-json.d.ts +416 -0
  133. package/dist/cli/preview-json.js +293 -0
  134. package/dist/cli/prompt.d.ts +3 -0
  135. package/dist/cli/prompt.js +33 -0
  136. package/dist/cli/read-json.d.ts +187 -0
  137. package/dist/cli/read-json.js +675 -0
  138. package/dist/cli/runner.d.ts +2 -0
  139. package/dist/cli/runner.js +129 -0
  140. package/dist/cli/signals.d.ts +3 -0
  141. package/dist/cli/signals.js +63 -0
  142. package/dist/cli/status-format.d.ts +2 -0
  143. package/dist/cli/status-format.js +48 -0
  144. package/dist/cli/types.d.ts +148 -0
  145. package/dist/cli/types.js +2 -0
  146. package/dist/cli/wallet-format.d.ts +29 -0
  147. package/dist/cli/wallet-format.js +637 -0
  148. package/dist/cli/workflow-hints.d.ts +13 -0
  149. package/dist/cli/workflow-hints.js +94 -0
  150. package/dist/cli-runner.d.ts +3 -0
  151. package/dist/cli-runner.js +3 -0
  152. package/dist/cli.d.ts +2 -0
  153. package/dist/cli.js +6 -0
  154. package/dist/client/default-client.d.ts +11 -0
  155. package/dist/client/default-client.js +118 -0
  156. package/dist/client/factory.d.ts +2 -0
  157. package/dist/client/factory.js +15 -0
  158. package/dist/client/initialization.d.ts +6 -0
  159. package/dist/client/initialization.js +30 -0
  160. package/dist/client/persistence.d.ts +5 -0
  161. package/dist/client/persistence.js +28 -0
  162. package/dist/client/store-adapter.d.ts +3 -0
  163. package/dist/client/store-adapter.js +20 -0
  164. package/dist/client.d.ts +2 -0
  165. package/dist/client.js +2 -0
  166. package/dist/index.d.ts +2 -0
  167. package/dist/index.js +1 -0
  168. package/dist/passive-status.d.ts +36 -0
  169. package/dist/passive-status.js +100 -0
  170. package/dist/sqlite/better-sqlite3.d.ts +26 -0
  171. package/dist/sqlite/better-sqlite3.js +4 -0
  172. package/dist/sqlite/checkpoints.d.ts +11 -0
  173. package/dist/sqlite/checkpoints.js +27 -0
  174. package/dist/sqlite/driver.d.ts +17 -0
  175. package/dist/sqlite/driver.js +98 -0
  176. package/dist/sqlite/index.d.ts +4 -0
  177. package/dist/sqlite/index.js +9 -0
  178. package/dist/sqlite/migrate.d.ts +2 -0
  179. package/dist/sqlite/migrate.js +37 -0
  180. package/dist/sqlite/store.d.ts +3 -0
  181. package/dist/sqlite/store.js +122 -0
  182. package/dist/sqlite/tip-meta.d.ts +26 -0
  183. package/dist/sqlite/tip-meta.js +97 -0
  184. package/dist/sqlite/types.d.ts +10 -0
  185. package/dist/sqlite/types.js +1 -0
  186. package/dist/types.d.ts +55 -0
  187. package/dist/types.js +1 -0
  188. package/dist/wallet/archive.d.ts +4 -0
  189. package/dist/wallet/archive.js +39 -0
  190. package/dist/wallet/cogop/constants.d.ts +32 -0
  191. package/dist/wallet/cogop/constants.js +32 -0
  192. package/dist/wallet/cogop/index.d.ts +32 -0
  193. package/dist/wallet/cogop/index.js +213 -0
  194. package/dist/wallet/cogop/numeric.d.ts +3 -0
  195. package/dist/wallet/cogop/numeric.js +24 -0
  196. package/dist/wallet/cogop/scriptpubkey.d.ts +2 -0
  197. package/dist/wallet/cogop/scriptpubkey.js +13 -0
  198. package/dist/wallet/cogop/validate-name.d.ts +2 -0
  199. package/dist/wallet/cogop/validate-name.js +18 -0
  200. package/dist/wallet/fs/atomic.d.ts +6 -0
  201. package/dist/wallet/fs/atomic.js +46 -0
  202. package/dist/wallet/fs/lock.d.ts +19 -0
  203. package/dist/wallet/fs/lock.js +61 -0
  204. package/dist/wallet/fs/status-file.d.ts +1 -0
  205. package/dist/wallet/fs/status-file.js +4 -0
  206. package/dist/wallet/lifecycle.d.ts +193 -0
  207. package/dist/wallet/lifecycle.js +1475 -0
  208. package/dist/wallet/material.d.ts +45 -0
  209. package/dist/wallet/material.js +118 -0
  210. package/dist/wallet/mining/config.d.ts +18 -0
  211. package/dist/wallet/mining/config.js +44 -0
  212. package/dist/wallet/mining/constants.d.ts +24 -0
  213. package/dist/wallet/mining/constants.js +24 -0
  214. package/dist/wallet/mining/control.d.ts +53 -0
  215. package/dist/wallet/mining/control.js +758 -0
  216. package/dist/wallet/mining/coordination.d.ts +40 -0
  217. package/dist/wallet/mining/coordination.js +121 -0
  218. package/dist/wallet/mining/hook-protocol.d.ts +47 -0
  219. package/dist/wallet/mining/hook-protocol.js +161 -0
  220. package/dist/wallet/mining/hook-runner.d.ts +1 -0
  221. package/dist/wallet/mining/hook-runner.js +52 -0
  222. package/dist/wallet/mining/hooks.d.ts +38 -0
  223. package/dist/wallet/mining/hooks.js +520 -0
  224. package/dist/wallet/mining/index.d.ts +8 -0
  225. package/dist/wallet/mining/index.js +6 -0
  226. package/dist/wallet/mining/runner.d.ts +155 -0
  227. package/dist/wallet/mining/runner.js +2574 -0
  228. package/dist/wallet/mining/runtime-artifacts.d.ts +17 -0
  229. package/dist/wallet/mining/runtime-artifacts.js +166 -0
  230. package/dist/wallet/mining/sentences.d.ts +23 -0
  231. package/dist/wallet/mining/sentences.js +281 -0
  232. package/dist/wallet/mining/state.d.ts +9 -0
  233. package/dist/wallet/mining/state.js +75 -0
  234. package/dist/wallet/mining/types.d.ts +141 -0
  235. package/dist/wallet/mining/types.js +1 -0
  236. package/dist/wallet/mining/visualizer.d.ts +19 -0
  237. package/dist/wallet/mining/visualizer.js +134 -0
  238. package/dist/wallet/mining/worker-main.d.ts +1 -0
  239. package/dist/wallet/mining/worker-main.js +17 -0
  240. package/dist/wallet/read/context.d.ts +20 -0
  241. package/dist/wallet/read/context.js +532 -0
  242. package/dist/wallet/read/filter.d.ts +9 -0
  243. package/dist/wallet/read/filter.js +42 -0
  244. package/dist/wallet/read/index.d.ts +4 -0
  245. package/dist/wallet/read/index.js +3 -0
  246. package/dist/wallet/read/project.d.ts +11 -0
  247. package/dist/wallet/read/project.js +300 -0
  248. package/dist/wallet/read/types.d.ts +144 -0
  249. package/dist/wallet/read/types.js +1 -0
  250. package/dist/wallet/runtime.d.ts +26 -0
  251. package/dist/wallet/runtime.js +28 -0
  252. package/dist/wallet/state/crypto.d.ts +31 -0
  253. package/dist/wallet/state/crypto.js +127 -0
  254. package/dist/wallet/state/provider.d.ts +37 -0
  255. package/dist/wallet/state/provider.js +312 -0
  256. package/dist/wallet/state/session.d.ts +12 -0
  257. package/dist/wallet/state/session.js +23 -0
  258. package/dist/wallet/state/storage.d.ts +19 -0
  259. package/dist/wallet/state/storage.js +55 -0
  260. package/dist/wallet/tx/anchor.d.ts +40 -0
  261. package/dist/wallet/tx/anchor.js +1210 -0
  262. package/dist/wallet/tx/cog.d.ts +92 -0
  263. package/dist/wallet/tx/cog.js +1055 -0
  264. package/dist/wallet/tx/common.d.ts +89 -0
  265. package/dist/wallet/tx/common.js +156 -0
  266. package/dist/wallet/tx/confirm.d.ts +15 -0
  267. package/dist/wallet/tx/confirm.js +24 -0
  268. package/dist/wallet/tx/domain-admin.d.ts +105 -0
  269. package/dist/wallet/tx/domain-admin.js +869 -0
  270. package/dist/wallet/tx/domain-market.d.ts +112 -0
  271. package/dist/wallet/tx/domain-market.js +1365 -0
  272. package/dist/wallet/tx/field.d.ts +101 -0
  273. package/dist/wallet/tx/field.js +1853 -0
  274. package/dist/wallet/tx/identity-selector.d.ts +12 -0
  275. package/dist/wallet/tx/identity-selector.js +52 -0
  276. package/dist/wallet/tx/index.d.ts +7 -0
  277. package/dist/wallet/tx/index.js +7 -0
  278. package/dist/wallet/tx/journal.d.ts +5 -0
  279. package/dist/wallet/tx/journal.js +31 -0
  280. package/dist/wallet/tx/register.d.ts +68 -0
  281. package/dist/wallet/tx/register.js +952 -0
  282. package/dist/wallet/tx/reputation.d.ts +72 -0
  283. package/dist/wallet/tx/reputation.js +693 -0
  284. package/dist/wallet/tx/targets.d.ts +7 -0
  285. package/dist/wallet/tx/targets.js +122 -0
  286. package/dist/wallet/types.d.ts +249 -0
  287. package/dist/wallet/types.js +1 -0
  288. package/dist/writing_quotes.json +1654 -0
  289. package/package.json +78 -0
@@ -0,0 +1,45 @@
1
+ import type { WalletMnemonicLanguage } from "./types.js";
2
+ export declare const WALLET_ACCOUNT_PATH = "m/84'/0'/0'";
3
+ export declare const DEFAULT_DESCRIPTOR_RANGE_END = 4095;
4
+ export declare const DEFAULT_DESCRIPTOR_SAFETY_MARGIN = 128;
5
+ export interface WalletMaterial {
6
+ mnemonic: {
7
+ phrase: string;
8
+ words: string[];
9
+ language: WalletMnemonicLanguage;
10
+ };
11
+ keys: {
12
+ masterFingerprintHex: string;
13
+ accountPath: string;
14
+ accountXprv: string;
15
+ accountXpub: string;
16
+ };
17
+ descriptor: {
18
+ privateExternal: string;
19
+ publicExternal: string;
20
+ checksum: string | null;
21
+ rangeEnd: number;
22
+ safetyMargin: number;
23
+ };
24
+ funding: {
25
+ index: 0;
26
+ address: string;
27
+ scriptPubKeyHex: string;
28
+ };
29
+ }
30
+ export interface WalletDerivedIdentity {
31
+ index: number;
32
+ address: string;
33
+ scriptPubKeyHex: string;
34
+ ethereumAddress: string;
35
+ nostrPublicKeyHex: string;
36
+ nostrNpub: string;
37
+ }
38
+ export declare function generateWalletMaterial(): WalletMaterial;
39
+ export declare function deriveWalletMaterialFromMnemonic(phrase: string): WalletMaterial;
40
+ export declare function deriveWalletIdentityMaterial(accountKey: string, index: number): WalletDerivedIdentity;
41
+ export declare function createInternalCoreWalletPassphrase(): string;
42
+ export declare function createMnemonicConfirmationChallenge(words: string[], count?: number): Array<{
43
+ index: number;
44
+ word: string;
45
+ }>;
@@ -0,0 +1,118 @@
1
+ import { createHash, randomBytes } from "node:crypto";
2
+ import { bech32 } from "@scure/base";
3
+ import { HDKey } from "@scure/bip32";
4
+ import { generateMnemonic, mnemonicToSeedSync } from "@scure/bip39";
5
+ import { wordlist as englishWordlist } from "@scure/bip39/wordlists/english.js";
6
+ import { secp256k1 } from "@noble/curves/secp256k1.js";
7
+ import { keccak_256 } from "@noble/hashes/sha3.js";
8
+ export const WALLET_ACCOUNT_PATH = "m/84'/0'/0'";
9
+ export const DEFAULT_DESCRIPTOR_RANGE_END = 4095;
10
+ export const DEFAULT_DESCRIPTOR_SAFETY_MARGIN = 128;
11
+ function hash160(value) {
12
+ const sha256 = createHash("sha256").update(value).digest();
13
+ return createHash("ripemd160").update(sha256).digest();
14
+ }
15
+ function formatFingerprint(fingerprint) {
16
+ return fingerprint.toString(16).padStart(8, "0");
17
+ }
18
+ function encodeSegwitV0Address(program) {
19
+ return bech32.encode("bc", [0, ...bech32.toWords(program)]);
20
+ }
21
+ function encodeNostrNpub(xOnlyPublicKey) {
22
+ return bech32.encode("npub", bech32.toWords(xOnlyPublicKey));
23
+ }
24
+ function buildExternalDescriptor(fingerprintHex, accountKey) {
25
+ return `wpkh([${fingerprintHex}/84h/0h/0h]${accountKey}/0/*)`;
26
+ }
27
+ function deriveFundingAddress(root) {
28
+ const fundingNode = root.derive("m/84'/0'/0'/0/0");
29
+ if (fundingNode.publicKey == null) {
30
+ throw new Error("wallet_material_missing_funding_public_key");
31
+ }
32
+ const pubkeyHash = hash160(fundingNode.publicKey);
33
+ return {
34
+ address: encodeSegwitV0Address(pubkeyHash),
35
+ scriptPubKeyHex: `0014${Buffer.from(pubkeyHash).toString("hex")}`,
36
+ };
37
+ }
38
+ function deriveIdentityFromNode(index, node) {
39
+ if (node.publicKey == null || node.privateKey == null) {
40
+ throw new Error("wallet_material_missing_identity_key");
41
+ }
42
+ const compressedPublicKey = secp256k1.getPublicKey(node.privateKey, true);
43
+ const uncompressedPublicKey = secp256k1.getPublicKey(node.privateKey, false);
44
+ const pubkeyHash = hash160(compressedPublicKey);
45
+ const ethereumAddress = `0x${Buffer.from(keccak_256(uncompressedPublicKey.subarray(1)).subarray(-20)).toString("hex")}`;
46
+ const nostrPublicKey = compressedPublicKey.subarray(1, 33);
47
+ return {
48
+ index,
49
+ address: encodeSegwitV0Address(pubkeyHash),
50
+ scriptPubKeyHex: `0014${Buffer.from(pubkeyHash).toString("hex")}`,
51
+ ethereumAddress,
52
+ nostrPublicKeyHex: Buffer.from(nostrPublicKey).toString("hex"),
53
+ nostrNpub: encodeNostrNpub(nostrPublicKey),
54
+ };
55
+ }
56
+ export function generateWalletMaterial() {
57
+ const phrase = generateMnemonic(englishWordlist, 256);
58
+ return deriveWalletMaterialFromMnemonic(phrase);
59
+ }
60
+ export function deriveWalletMaterialFromMnemonic(phrase) {
61
+ const words = phrase.trim().split(/\s+/);
62
+ const seed = mnemonicToSeedSync(phrase);
63
+ const root = HDKey.fromMasterSeed(seed);
64
+ const accountNode = root.derive(WALLET_ACCOUNT_PATH);
65
+ if (accountNode.privateExtendedKey == null || accountNode.publicExtendedKey == null) {
66
+ throw new Error("wallet_material_missing_account_keys");
67
+ }
68
+ const masterFingerprintHex = formatFingerprint(root.fingerprint);
69
+ const funding = deriveFundingAddress(root);
70
+ return {
71
+ mnemonic: {
72
+ phrase,
73
+ words,
74
+ language: "english",
75
+ },
76
+ keys: {
77
+ masterFingerprintHex,
78
+ accountPath: WALLET_ACCOUNT_PATH,
79
+ accountXprv: accountNode.privateExtendedKey,
80
+ accountXpub: accountNode.publicExtendedKey,
81
+ },
82
+ descriptor: {
83
+ privateExternal: buildExternalDescriptor(masterFingerprintHex, accountNode.privateExtendedKey),
84
+ publicExternal: buildExternalDescriptor(masterFingerprintHex, accountNode.publicExtendedKey),
85
+ checksum: null,
86
+ rangeEnd: DEFAULT_DESCRIPTOR_RANGE_END,
87
+ safetyMargin: DEFAULT_DESCRIPTOR_SAFETY_MARGIN,
88
+ },
89
+ funding: {
90
+ index: 0,
91
+ address: funding.address,
92
+ scriptPubKeyHex: funding.scriptPubKeyHex,
93
+ },
94
+ };
95
+ }
96
+ export function deriveWalletIdentityMaterial(accountKey, index) {
97
+ if (!Number.isInteger(index) || index < 0) {
98
+ throw new Error("wallet_material_invalid_identity_index");
99
+ }
100
+ const accountNode = HDKey.fromExtendedKey(accountKey);
101
+ const identityNode = accountNode.deriveChild(0).deriveChild(index);
102
+ return deriveIdentityFromNode(index, identityNode);
103
+ }
104
+ export function createInternalCoreWalletPassphrase() {
105
+ return randomBytes(32).toString("hex");
106
+ }
107
+ export function createMnemonicConfirmationChallenge(words, count = 4) {
108
+ const selected = new Set();
109
+ while (selected.size < Math.min(count, words.length)) {
110
+ selected.add(randomBytes(1)[0] % words.length);
111
+ }
112
+ return [...selected]
113
+ .sort((left, right) => left - right)
114
+ .map((index) => ({
115
+ index,
116
+ word: words[index],
117
+ }));
118
+ }
@@ -0,0 +1,18 @@
1
+ import type { WalletSecretProvider, WalletSecretReference } from "../state/provider.js";
2
+ import type { ClientConfigV1, MiningProviderConfigRecord } from "./types.js";
3
+ export declare function loadClientConfig(options: {
4
+ path: string;
5
+ provider: WalletSecretProvider;
6
+ }): Promise<ClientConfigV1 | null>;
7
+ export declare function saveClientConfig(options: {
8
+ path: string;
9
+ provider: WalletSecretProvider;
10
+ secretReference: WalletSecretReference;
11
+ config: ClientConfigV1;
12
+ }): Promise<void>;
13
+ export declare function saveBuiltInMiningProviderConfig(options: {
14
+ path: string;
15
+ provider: WalletSecretProvider;
16
+ secretReference: WalletSecretReference;
17
+ config: MiningProviderConfigRecord;
18
+ }): Promise<ClientConfigV1>;
@@ -0,0 +1,44 @@
1
+ import { readFile } from "node:fs/promises";
2
+ import { writeJsonFileAtomic } from "../fs/atomic.js";
3
+ import { decryptJsonWithSecretProvider, encryptJsonWithSecretProvider } from "../state/crypto.js";
4
+ function createEmptyClientConfig() {
5
+ return {
6
+ schemaVersion: 1,
7
+ mining: {
8
+ builtIn: null,
9
+ },
10
+ };
11
+ }
12
+ export async function loadClientConfig(options) {
13
+ try {
14
+ const raw = await readFile(options.path, "utf8");
15
+ return await decryptJsonWithSecretProvider(JSON.parse(raw), options.provider);
16
+ }
17
+ catch (error) {
18
+ if (error instanceof Error && "code" in error && error.code === "ENOENT") {
19
+ return null;
20
+ }
21
+ throw error;
22
+ }
23
+ }
24
+ export async function saveClientConfig(options) {
25
+ const envelope = await encryptJsonWithSecretProvider(options.config, options.provider, options.secretReference, {
26
+ format: "cogcoin-client-config",
27
+ });
28
+ await writeJsonFileAtomic(options.path, envelope, { mode: 0o600 });
29
+ }
30
+ export async function saveBuiltInMiningProviderConfig(options) {
31
+ const existing = await loadClientConfig({
32
+ path: options.path,
33
+ provider: options.provider,
34
+ }).catch(() => null);
35
+ const nextConfig = existing ?? createEmptyClientConfig();
36
+ nextConfig.mining.builtIn = options.config;
37
+ await saveClientConfig({
38
+ path: options.path,
39
+ provider: options.provider,
40
+ secretReference: options.secretReference,
41
+ config: nextConfig,
42
+ });
43
+ return nextConfig;
44
+ }
@@ -0,0 +1,24 @@
1
+ export declare const MINING_WORKER_API_VERSION: "cogcoin/mining-worker/v1";
2
+ export declare const MINING_STATUS_HEARTBEAT_INTERVAL_MS = 5000;
3
+ export declare const MINING_WORKER_HEARTBEAT_STALE_MS = 15000;
4
+ export declare const MINING_SUSPEND_GAP_THRESHOLD_MS = 15000;
5
+ export declare const MINING_NETWORK_SETTLE_WINDOW_MS = 5000;
6
+ export declare const MINING_TIP_SETTLE_WINDOW_MS = 2000;
7
+ export declare const MINING_PROVIDER_BACKOFF_BASE_MS = 30000;
8
+ export declare const MINING_PROVIDER_BACKOFF_MAX_MS = 900000;
9
+ export declare const MINING_LOOP_INTERVAL_MS = 2000;
10
+ export declare const MINING_BUILTIN_TIMEOUT_MS = 30000;
11
+ export declare const MINING_HOOK_SCHEMA_VERSION: 1;
12
+ export declare const MINING_HOOK_MAX_CANDIDATE_SENTENCE_UTF8_BYTES = 512;
13
+ export declare const MINING_HOOK_MAX_CANDIDATES_PER_ROOT_DOMAIN = 8;
14
+ export declare const MINING_HOOK_MAX_CANDIDATES_TOTAL = 64;
15
+ export declare const MINING_HOOK_TIMEOUT_MS = 30000;
16
+ export declare const MINING_CUSTOM_HOOK_TIMEOUT_MS = 30000;
17
+ export declare const MINING_HOOK_STDOUT_MAX_BYTES = 262144;
18
+ export declare const MINING_HOOK_STDERR_MAX_BYTES = 65536;
19
+ export declare const MINING_HOOK_VALIDATION_TIMEOUT_MS = 10000;
20
+ export declare const MINING_HOOK_TERMINATE_GRACE_MS = 2000;
21
+ export declare const MINING_HOOK_FAILURE_THRESHOLD = 3;
22
+ export declare const MINING_HOOK_COOLDOWN_MS = 300000;
23
+ export declare const MINING_SHUTDOWN_GRACE_MS = 15000;
24
+ export declare const MINING_SETTLEMENT_DUMMY_REWARD = 100n;
@@ -0,0 +1,24 @@
1
+ export const MINING_WORKER_API_VERSION = "cogcoin/mining-worker/v1";
2
+ export const MINING_STATUS_HEARTBEAT_INTERVAL_MS = 5_000;
3
+ export const MINING_WORKER_HEARTBEAT_STALE_MS = 15_000;
4
+ export const MINING_SUSPEND_GAP_THRESHOLD_MS = 15_000;
5
+ export const MINING_NETWORK_SETTLE_WINDOW_MS = 5_000;
6
+ export const MINING_TIP_SETTLE_WINDOW_MS = 2_000;
7
+ export const MINING_PROVIDER_BACKOFF_BASE_MS = 30_000;
8
+ export const MINING_PROVIDER_BACKOFF_MAX_MS = 900_000;
9
+ export const MINING_LOOP_INTERVAL_MS = 2_000;
10
+ export const MINING_BUILTIN_TIMEOUT_MS = 30_000;
11
+ export const MINING_HOOK_SCHEMA_VERSION = 1;
12
+ export const MINING_HOOK_MAX_CANDIDATE_SENTENCE_UTF8_BYTES = 512;
13
+ export const MINING_HOOK_MAX_CANDIDATES_PER_ROOT_DOMAIN = 8;
14
+ export const MINING_HOOK_MAX_CANDIDATES_TOTAL = 64;
15
+ export const MINING_HOOK_TIMEOUT_MS = 30_000;
16
+ export const MINING_CUSTOM_HOOK_TIMEOUT_MS = MINING_HOOK_TIMEOUT_MS;
17
+ export const MINING_HOOK_STDOUT_MAX_BYTES = 262_144;
18
+ export const MINING_HOOK_STDERR_MAX_BYTES = 65_536;
19
+ export const MINING_HOOK_VALIDATION_TIMEOUT_MS = 10_000;
20
+ export const MINING_HOOK_TERMINATE_GRACE_MS = 2_000;
21
+ export const MINING_HOOK_FAILURE_THRESHOLD = 3;
22
+ export const MINING_HOOK_COOLDOWN_MS = 300_000;
23
+ export const MINING_SHUTDOWN_GRACE_MS = 15_000;
24
+ export const MINING_SETTLEMENT_DUMMY_REWARD = 100n;
@@ -0,0 +1,53 @@
1
+ import { type WalletPrompter } from "../lifecycle.js";
2
+ import { type WalletRuntimePaths } from "../runtime.js";
3
+ import { type WalletSecretProvider } from "../state/provider.js";
4
+ import type { WalletBitcoindStatus, WalletIndexerStatus, WalletLocalStateStatus, WalletNodeStatus } from "../read/types.js";
5
+ import type { MiningControlPlaneView, MiningEventRecord, MiningRuntimeStatusV1 } from "./types.js";
6
+ export declare function inspectMiningControlPlane(options: {
7
+ provider?: WalletSecretProvider;
8
+ localState: WalletLocalStateStatus;
9
+ bitcoind: WalletBitcoindStatus;
10
+ nodeStatus: WalletNodeStatus | null;
11
+ nodeHealth: MiningRuntimeStatusV1["nodeHealth"];
12
+ indexer: WalletIndexerStatus;
13
+ verify?: boolean;
14
+ nowUnixMs?: number;
15
+ paths?: WalletRuntimePaths;
16
+ }): Promise<MiningControlPlaneView>;
17
+ export declare function refreshMiningRuntimeStatus(options: {
18
+ provider?: WalletSecretProvider;
19
+ localState: WalletLocalStateStatus;
20
+ bitcoind: WalletBitcoindStatus;
21
+ nodeStatus: WalletNodeStatus | null;
22
+ nodeHealth: MiningRuntimeStatusV1["nodeHealth"];
23
+ indexer: WalletIndexerStatus;
24
+ nowUnixMs?: number;
25
+ paths?: WalletRuntimePaths;
26
+ }): Promise<MiningControlPlaneView>;
27
+ export declare function enableMiningHooks(options: {
28
+ provider?: WalletSecretProvider;
29
+ prompter: WalletPrompter;
30
+ nowUnixMs?: number;
31
+ paths?: WalletRuntimePaths;
32
+ }): Promise<MiningControlPlaneView>;
33
+ export declare function disableMiningHooks(options: {
34
+ provider?: WalletSecretProvider;
35
+ nowUnixMs?: number;
36
+ paths?: WalletRuntimePaths;
37
+ }): Promise<MiningControlPlaneView>;
38
+ export declare function setupBuiltInMining(options: {
39
+ provider?: WalletSecretProvider;
40
+ prompter: WalletPrompter;
41
+ nowUnixMs?: number;
42
+ paths?: WalletRuntimePaths;
43
+ }): Promise<MiningControlPlaneView>;
44
+ export declare function readMiningLog(options: {
45
+ paths?: WalletRuntimePaths;
46
+ limit?: number | null;
47
+ all?: boolean;
48
+ }): Promise<MiningEventRecord[]>;
49
+ export declare function followMiningLog(options: {
50
+ paths?: WalletRuntimePaths;
51
+ signal?: AbortSignal;
52
+ onEvent: (event: MiningEventRecord) => void;
53
+ }): Promise<void>;