@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,213 @@
1
+ import { COG_OPCODES, COG_PREFIX, FIELD_FORMAT_BYTES, MAX_OP_RETURN_BYTES, MIN_OP_RETURN_BYTES, } from "./constants.js";
2
+ import { writeU8, writeU32BE, writeU64BE } from "./numeric.js";
3
+ import { validateExternalScriptPubKey, writeLenPrefixedSpk } from "./scriptpubkey.js";
4
+ import { validateDomainName, validateFieldName } from "./validate-name.js";
5
+ function concatParts(parts) {
6
+ const total = parts.reduce((sum, part) => sum + part.length, 0);
7
+ const out = new Uint8Array(total);
8
+ let offset = 0;
9
+ for (const part of parts) {
10
+ out.set(part, offset);
11
+ offset += part.length;
12
+ }
13
+ return out;
14
+ }
15
+ function ensureIdentifier(value, errorCode) {
16
+ if (!Number.isInteger(value) || value <= 0 || value > 0xffffffff) {
17
+ throw new Error(errorCode);
18
+ }
19
+ }
20
+ function ensureBytes32(value, errorCode) {
21
+ if (value.length !== 32) {
22
+ throw new Error(errorCode);
23
+ }
24
+ }
25
+ function ensureSentence60(value, errorCode) {
26
+ if (value.length !== 60) {
27
+ throw new Error(errorCode);
28
+ }
29
+ }
30
+ function ensurePayloadLength(payload) {
31
+ if (payload.length < MIN_OP_RETURN_BYTES || payload.length > MAX_OP_RETURN_BYTES) {
32
+ throw new Error("wallet_cogop_payload_out_of_range");
33
+ }
34
+ return payload;
35
+ }
36
+ function writeAsciiName(name, validator) {
37
+ validator(name);
38
+ return new TextEncoder().encode(name);
39
+ }
40
+ function createPayload(opcode, ...parts) {
41
+ return ensurePayloadLength(concatParts([COG_PREFIX, writeU8(opcode), ...parts]));
42
+ }
43
+ export function computeRootRegistrationPriceSats(rootName) {
44
+ validateDomainName(rootName);
45
+ switch (rootName.length) {
46
+ case 1:
47
+ return 10000000000n;
48
+ case 2:
49
+ return 1000000000n;
50
+ case 3:
51
+ return 100000000n;
52
+ case 4:
53
+ return 10000000n;
54
+ case 5:
55
+ return 1000000n;
56
+ default:
57
+ return 100000n;
58
+ }
59
+ }
60
+ export function serializeMine(domainId, referencedBlockHashInternal, sentence60, minerData) {
61
+ ensureIdentifier(domainId, "wallet_cogop_invalid_domain_id");
62
+ ensureBytes32(referencedBlockHashInternal, "wallet_cogop_invalid_block_hash");
63
+ ensureSentence60(sentence60, "wallet_cogop_invalid_sentence");
64
+ if (minerData !== undefined && minerData.length > 8) {
65
+ throw new Error("wallet_cogop_invalid_miner_data_length");
66
+ }
67
+ return {
68
+ opReturnData: createPayload(COG_OPCODES.MINE, writeU32BE(domainId), referencedBlockHashInternal.slice(0, 4), sentence60, minerData ?? new Uint8Array()),
69
+ };
70
+ }
71
+ export function serializeCogTransfer(amount, recipientSpk) {
72
+ if (amount <= 0n) {
73
+ throw new Error("wallet_cogop_invalid_amount");
74
+ }
75
+ return {
76
+ opReturnData: createPayload(COG_OPCODES.COG_TRANSFER, writeU64BE(amount), writeLenPrefixedSpk(recipientSpk)),
77
+ };
78
+ }
79
+ export function serializeCogLock(amount, timeoutHeight, recipientDomainId, condition32) {
80
+ if (amount <= 0n) {
81
+ throw new Error("wallet_cogop_invalid_amount");
82
+ }
83
+ ensureIdentifier(recipientDomainId, "wallet_cogop_invalid_domain_id");
84
+ ensureBytes32(condition32, "wallet_cogop_invalid_condition");
85
+ return {
86
+ opReturnData: createPayload(COG_OPCODES.COG_LOCK, writeU64BE(amount), writeU32BE(timeoutHeight), writeU32BE(recipientDomainId), condition32),
87
+ };
88
+ }
89
+ export function serializeCogClaim(lockId, preimage32) {
90
+ ensureIdentifier(lockId, "wallet_cogop_invalid_lock_id");
91
+ ensureBytes32(preimage32, "wallet_cogop_invalid_preimage");
92
+ return {
93
+ opReturnData: createPayload(COG_OPCODES.COG_CLAIM, writeU32BE(lockId), preimage32),
94
+ };
95
+ }
96
+ export function serializeDomainReg(name) {
97
+ const asciiName = writeAsciiName(name, validateDomainName);
98
+ return {
99
+ opReturnData: createPayload(COG_OPCODES.DOMAIN_REG, writeU8(asciiName.length), asciiName),
100
+ };
101
+ }
102
+ export function serializeDomainTransfer(domainId, recipientSpk) {
103
+ ensureIdentifier(domainId, "wallet_cogop_invalid_domain_id");
104
+ return {
105
+ opReturnData: createPayload(COG_OPCODES.DOMAIN_TRANSFER, writeU32BE(domainId), writeLenPrefixedSpk(recipientSpk)),
106
+ };
107
+ }
108
+ export function serializeDomainSell(domainId, listedPrice) {
109
+ ensureIdentifier(domainId, "wallet_cogop_invalid_domain_id");
110
+ if (listedPrice < 0n) {
111
+ throw new Error("wallet_cogop_invalid_amount");
112
+ }
113
+ return {
114
+ opReturnData: createPayload(COG_OPCODES.DOMAIN_SELL, writeU32BE(domainId), writeU64BE(listedPrice)),
115
+ };
116
+ }
117
+ export function serializeDomainBuy(domainId, expectedPrice) {
118
+ ensureIdentifier(domainId, "wallet_cogop_invalid_domain_id");
119
+ if (expectedPrice <= 0n) {
120
+ throw new Error("wallet_cogop_invalid_amount");
121
+ }
122
+ return {
123
+ opReturnData: createPayload(COG_OPCODES.DOMAIN_BUY, writeU32BE(domainId), writeU64BE(expectedPrice)),
124
+ };
125
+ }
126
+ export function serializeFieldReg(parentDomainId, permanent, fieldName) {
127
+ ensureIdentifier(parentDomainId, "wallet_cogop_invalid_domain_id");
128
+ const asciiName = writeAsciiName(fieldName, validateFieldName);
129
+ return {
130
+ opReturnData: createPayload(COG_OPCODES.FIELD_REG, writeU32BE(parentDomainId), writeU8(permanent ? 0x01 : 0x00), writeU8(asciiName.length), asciiName),
131
+ };
132
+ }
133
+ export function serializeDataUpdate(domainId, fieldId, format, value) {
134
+ ensureIdentifier(domainId, "wallet_cogop_invalid_domain_id");
135
+ ensureIdentifier(fieldId, "wallet_cogop_invalid_field_id");
136
+ if (!Number.isInteger(format) || format < 0 || format > 0xff) {
137
+ throw new Error("wallet_cogop_invalid_format");
138
+ }
139
+ if (format === FIELD_FORMAT_BYTES.clear) {
140
+ return {
141
+ opReturnData: createPayload(COG_OPCODES.DATA_UPDATE, writeU32BE(domainId), writeU32BE(fieldId), writeU8(format)),
142
+ };
143
+ }
144
+ if (value === undefined || value.length === 0) {
145
+ throw new Error("wallet_cogop_missing_value");
146
+ }
147
+ return {
148
+ opReturnData: createPayload(COG_OPCODES.DATA_UPDATE, writeU32BE(domainId), writeU32BE(fieldId), writeU8(format), value),
149
+ };
150
+ }
151
+ export function serializeSetEndpoint(domainId, endpoint) {
152
+ ensureIdentifier(domainId, "wallet_cogop_invalid_domain_id");
153
+ return {
154
+ opReturnData: createPayload(COG_OPCODES.SET_ENDPOINT, writeU32BE(domainId), endpoint ?? new Uint8Array()),
155
+ };
156
+ }
157
+ export function serializeRepCommit(sourceDomainId, targetDomainId, amount, review60) {
158
+ ensureIdentifier(sourceDomainId, "wallet_cogop_invalid_domain_id");
159
+ ensureIdentifier(targetDomainId, "wallet_cogop_invalid_domain_id");
160
+ if (amount <= 0n) {
161
+ throw new Error("wallet_cogop_invalid_amount");
162
+ }
163
+ if (review60 !== undefined) {
164
+ ensureSentence60(review60, "wallet_cogop_invalid_review");
165
+ }
166
+ return {
167
+ opReturnData: createPayload(COG_OPCODES.REP_COMMIT, writeU32BE(sourceDomainId), writeU32BE(targetDomainId), writeU64BE(amount), review60 ?? new Uint8Array()),
168
+ };
169
+ }
170
+ export function serializeRepRevoke(sourceDomainId, targetDomainId, amount, review60) {
171
+ ensureIdentifier(sourceDomainId, "wallet_cogop_invalid_domain_id");
172
+ ensureIdentifier(targetDomainId, "wallet_cogop_invalid_domain_id");
173
+ if (amount <= 0n) {
174
+ throw new Error("wallet_cogop_invalid_amount");
175
+ }
176
+ if (review60 !== undefined) {
177
+ ensureSentence60(review60, "wallet_cogop_invalid_review");
178
+ }
179
+ return {
180
+ opReturnData: createPayload(COG_OPCODES.REP_REVOKE, writeU32BE(sourceDomainId), writeU32BE(targetDomainId), writeU64BE(amount), review60 ?? new Uint8Array()),
181
+ };
182
+ }
183
+ export function serializeSetCanonical(domainId) {
184
+ ensureIdentifier(domainId, "wallet_cogop_invalid_domain_id");
185
+ return {
186
+ opReturnData: createPayload(COG_OPCODES.SET_CANONICAL, writeU32BE(domainId)),
187
+ };
188
+ }
189
+ export function serializeDomainAnchor(domainId, foundingMessage60) {
190
+ ensureIdentifier(domainId, "wallet_cogop_invalid_domain_id");
191
+ if (foundingMessage60 === undefined) {
192
+ return {
193
+ opReturnData: createPayload(COG_OPCODES.DOMAIN_ANCHOR, writeU32BE(domainId)),
194
+ };
195
+ }
196
+ ensureSentence60(foundingMessage60, "wallet_cogop_invalid_founding_message");
197
+ return {
198
+ opReturnData: createPayload(COG_OPCODES.DOMAIN_ANCHOR, writeU32BE(domainId), foundingMessage60, new Uint8Array(12)),
199
+ };
200
+ }
201
+ export function serializeSetDelegate(domainId, delegateSpk) {
202
+ ensureIdentifier(domainId, "wallet_cogop_invalid_domain_id");
203
+ return {
204
+ opReturnData: createPayload(COG_OPCODES.SET_DELEGATE, writeU32BE(domainId), delegateSpk === undefined ? new Uint8Array() : writeLenPrefixedSpk(delegateSpk)),
205
+ };
206
+ }
207
+ export function serializeSetMiner(domainId, minerSpk) {
208
+ ensureIdentifier(domainId, "wallet_cogop_invalid_domain_id");
209
+ return {
210
+ opReturnData: createPayload(COG_OPCODES.SET_MINER, writeU32BE(domainId), minerSpk === undefined ? new Uint8Array() : writeLenPrefixedSpk(minerSpk)),
211
+ };
212
+ }
213
+ export { concatParts, FIELD_FORMAT_BYTES, validateDomainName, validateExternalScriptPubKey, validateFieldName, writeAsciiName, writeLenPrefixedSpk, writeU8, writeU32BE, writeU64BE, };
@@ -0,0 +1,3 @@
1
+ export declare function writeU8(value: number): Uint8Array;
2
+ export declare function writeU32BE(value: number): Uint8Array;
3
+ export declare function writeU64BE(value: bigint): Uint8Array;
@@ -0,0 +1,24 @@
1
+ export function writeU8(value) {
2
+ if (!Number.isInteger(value) || value < 0 || value > 0xff) {
3
+ throw new Error("wallet_cogop_invalid_u8");
4
+ }
5
+ return Uint8Array.of(value);
6
+ }
7
+ export function writeU32BE(value) {
8
+ if (!Number.isInteger(value) || value < 0 || value > 0xffffffff) {
9
+ throw new Error("wallet_cogop_invalid_u32");
10
+ }
11
+ const bytes = new Uint8Array(4);
12
+ const view = new DataView(bytes.buffer, bytes.byteOffset, bytes.byteLength);
13
+ view.setUint32(0, value, false);
14
+ return bytes;
15
+ }
16
+ export function writeU64BE(value) {
17
+ if (value < 0n || value > 0xffffffffffffffffn) {
18
+ throw new Error("wallet_cogop_invalid_u64");
19
+ }
20
+ const bytes = new Uint8Array(8);
21
+ const view = new DataView(bytes.buffer, bytes.byteOffset, bytes.byteLength);
22
+ view.setBigUint64(0, value, false);
23
+ return bytes;
24
+ }
@@ -0,0 +1,2 @@
1
+ export declare function validateExternalScriptPubKey(spk: Uint8Array): void;
2
+ export declare function writeLenPrefixedSpk(spk: Uint8Array): Uint8Array;
@@ -0,0 +1,13 @@
1
+ import { MAX_SCRIPT_PUBKEY_BYTES, MIN_SCRIPT_PUBKEY_BYTES } from "./constants.js";
2
+ export function validateExternalScriptPubKey(spk) {
3
+ if (spk.length < MIN_SCRIPT_PUBKEY_BYTES || spk.length > MAX_SCRIPT_PUBKEY_BYTES) {
4
+ throw new Error("wallet_cogop_invalid_scriptpubkey_length");
5
+ }
6
+ }
7
+ export function writeLenPrefixedSpk(spk) {
8
+ validateExternalScriptPubKey(spk);
9
+ const out = new Uint8Array(1 + spk.length);
10
+ out[0] = spk.length;
11
+ out.set(spk, 1);
12
+ return out;
13
+ }
@@ -0,0 +1,2 @@
1
+ export declare function validateDomainName(name: string): void;
2
+ export declare function validateFieldName(name: string): void;
@@ -0,0 +1,18 @@
1
+ import { MAX_NAME_BYTES, MIN_NAME_BYTES } from "./constants.js";
2
+ function validateNameCommon(name, errorCode) {
3
+ if (name.length < MIN_NAME_BYTES || name.length > MAX_NAME_BYTES) {
4
+ throw new Error(errorCode);
5
+ }
6
+ if (name.startsWith("-") || name.endsWith("-") || name.includes("--")) {
7
+ throw new Error(errorCode);
8
+ }
9
+ if (!/^[a-z0-9-]+$/.test(name)) {
10
+ throw new Error(errorCode);
11
+ }
12
+ }
13
+ export function validateDomainName(name) {
14
+ validateNameCommon(name, "wallet_cogop_invalid_domain_name");
15
+ }
16
+ export function validateFieldName(name) {
17
+ validateNameCommon(name, "wallet_cogop_invalid_field_name");
18
+ }
@@ -0,0 +1,6 @@
1
+ export interface AtomicWriteOptions {
2
+ mode?: number;
3
+ encoding?: BufferEncoding;
4
+ }
5
+ export declare function writeFileAtomic(filePath: string, data: string | Uint8Array, options?: AtomicWriteOptions): Promise<void>;
6
+ export declare function writeJsonFileAtomic(filePath: string, value: unknown, options?: AtomicWriteOptions): Promise<void>;
@@ -0,0 +1,46 @@
1
+ import { randomUUID } from "node:crypto";
2
+ import { mkdir, open, rename } from "node:fs/promises";
3
+ import { basename, dirname, join } from "node:path";
4
+ async function fsyncDirectory(directoryPath) {
5
+ try {
6
+ const directoryHandle = await open(directoryPath, "r");
7
+ try {
8
+ await directoryHandle.sync();
9
+ }
10
+ finally {
11
+ await directoryHandle.close();
12
+ }
13
+ }
14
+ catch (error) {
15
+ if (error instanceof Error && "code" in error) {
16
+ const code = error.code;
17
+ if (code === "EINVAL" || code === "EPERM" || code === "EISDIR" || code === "ENOTSUP") {
18
+ return;
19
+ }
20
+ }
21
+ throw error;
22
+ }
23
+ }
24
+ export async function writeFileAtomic(filePath, data, options = {}) {
25
+ const directoryPath = dirname(filePath);
26
+ const tempPath = join(directoryPath, `${basename(filePath)}.tmp-${randomUUID()}`);
27
+ await mkdir(directoryPath, { recursive: true });
28
+ const handle = await open(tempPath, "wx", options.mode ?? 0o600);
29
+ try {
30
+ if (typeof data === "string") {
31
+ await handle.writeFile(data, { encoding: options.encoding ?? "utf8" });
32
+ }
33
+ else {
34
+ await handle.writeFile(data);
35
+ }
36
+ await handle.sync();
37
+ }
38
+ finally {
39
+ await handle.close();
40
+ }
41
+ await rename(tempPath, filePath);
42
+ await fsyncDirectory(directoryPath);
43
+ }
44
+ export async function writeJsonFileAtomic(filePath, value, options = {}) {
45
+ await writeFileAtomic(filePath, `${JSON.stringify(value, null, 2)}\n`, options);
46
+ }
@@ -0,0 +1,19 @@
1
+ export interface FileLockMetadata {
2
+ processId: number | null;
3
+ acquiredAtUnixMs: number;
4
+ purpose: string | null;
5
+ walletRootId: string | null;
6
+ [key: string]: unknown;
7
+ }
8
+ export interface FileLockHandle {
9
+ readonly path: string;
10
+ readonly metadata: FileLockMetadata;
11
+ release(): Promise<void>;
12
+ }
13
+ export declare class FileLockBusyError extends Error {
14
+ readonly lockPath: string;
15
+ readonly existingMetadata: FileLockMetadata | null;
16
+ constructor(lockPath: string, existingMetadata: FileLockMetadata | null);
17
+ }
18
+ export declare function readLockMetadata(lockPath: string): Promise<FileLockMetadata | null>;
19
+ export declare function acquireFileLock(lockPath: string, metadata?: Partial<FileLockMetadata>): Promise<FileLockHandle>;
@@ -0,0 +1,61 @@
1
+ import { mkdir, open, readFile, rm } from "node:fs/promises";
2
+ import { dirname } from "node:path";
3
+ export class FileLockBusyError extends Error {
4
+ lockPath;
5
+ existingMetadata;
6
+ constructor(lockPath, existingMetadata) {
7
+ super(`file_lock_busy_${lockPath}`);
8
+ this.name = "FileLockBusyError";
9
+ this.lockPath = lockPath;
10
+ this.existingMetadata = existingMetadata;
11
+ }
12
+ }
13
+ export async function readLockMetadata(lockPath) {
14
+ try {
15
+ const raw = await readFile(lockPath, "utf8");
16
+ return JSON.parse(raw);
17
+ }
18
+ catch (error) {
19
+ if (error instanceof Error && "code" in error && error.code === "ENOENT") {
20
+ return null;
21
+ }
22
+ throw error;
23
+ }
24
+ }
25
+ export async function acquireFileLock(lockPath, metadata = {}) {
26
+ await mkdir(dirname(lockPath), { recursive: true });
27
+ const fullMetadata = {
28
+ processId: process.pid ?? null,
29
+ acquiredAtUnixMs: Date.now(),
30
+ purpose: metadata.purpose ?? null,
31
+ walletRootId: metadata.walletRootId ?? null,
32
+ ...metadata,
33
+ };
34
+ let handle;
35
+ try {
36
+ handle = await open(lockPath, "wx", 0o600);
37
+ }
38
+ catch (error) {
39
+ if (error instanceof Error && "code" in error && error.code === "EEXIST") {
40
+ throw new FileLockBusyError(lockPath, await readLockMetadata(lockPath));
41
+ }
42
+ throw error;
43
+ }
44
+ try {
45
+ await handle.writeFile(`${JSON.stringify(fullMetadata, null, 2)}\n`);
46
+ await handle.sync();
47
+ }
48
+ catch (error) {
49
+ await handle.close().catch(() => undefined);
50
+ await rm(lockPath, { force: true }).catch(() => undefined);
51
+ throw error;
52
+ }
53
+ await handle.close();
54
+ return {
55
+ path: lockPath,
56
+ metadata: fullMetadata,
57
+ async release() {
58
+ await rm(lockPath, { force: true });
59
+ },
60
+ };
61
+ }
@@ -0,0 +1 @@
1
+ export declare function writeRuntimeStatusFile(statusPath: string, snapshot: unknown): Promise<void>;
@@ -0,0 +1,4 @@
1
+ import { writeJsonFileAtomic } from "./atomic.js";
2
+ export async function writeRuntimeStatusFile(statusPath, snapshot) {
3
+ await writeJsonFileAtomic(statusPath, snapshot, { mode: 0o600 });
4
+ }
@@ -0,0 +1,193 @@
1
+ import { attachOrStartIndexerDaemon, probeIndexerDaemon } from "../bitcoind/indexer-daemon.js";
2
+ import { attachOrStartManagedBitcoindService, probeManagedBitcoindService } from "../bitcoind/service.js";
3
+ import { createRpcClient } from "../bitcoind/node.js";
4
+ import type { ManagedCoreWalletReplicaStatus } from "../bitcoind/types.js";
5
+ import { type WalletRuntimePaths } from "./runtime.js";
6
+ import { requestMiningGenerationPreemption } from "./mining/coordination.js";
7
+ import { type WalletSecretProvider } from "./state/provider.js";
8
+ import type { UnlockSessionStateV1, WalletStateV1 } from "./types.js";
9
+ export declare const DEFAULT_UNLOCK_DURATION_MS: number;
10
+ export interface WalletPrompter {
11
+ readonly isInteractive: boolean;
12
+ writeLine(message: string): void;
13
+ prompt(message: string): Promise<string>;
14
+ clearSensitiveDisplay?(scope: "mnemonic-reveal"): void | Promise<void>;
15
+ }
16
+ export interface WalletInitializationResult {
17
+ walletRootId: string;
18
+ fundingAddress: string;
19
+ unlockUntilUnixMs: number;
20
+ state: WalletStateV1;
21
+ }
22
+ export interface WalletUnlockResult {
23
+ unlockUntilUnixMs: number;
24
+ state: WalletStateV1;
25
+ source: "primary" | "backup";
26
+ }
27
+ export interface LoadedUnlockedWalletState {
28
+ session: UnlockSessionStateV1;
29
+ state: WalletStateV1;
30
+ source: "primary" | "backup";
31
+ }
32
+ export interface WalletExportResult {
33
+ archivePath: string;
34
+ walletRootId: string;
35
+ }
36
+ export interface WalletImportResult {
37
+ archivePath: string;
38
+ walletRootId: string;
39
+ fundingAddress: string;
40
+ unlockUntilUnixMs: number;
41
+ state: WalletStateV1;
42
+ }
43
+ export interface WalletRepairResult {
44
+ walletRootId: string;
45
+ recoveredFromBackup: boolean;
46
+ recreatedManagedCoreWallet: boolean;
47
+ resetIndexerDatabase: boolean;
48
+ bitcoindServiceAction: "none" | "cleared-stale-artifacts" | "stopped-incompatible-service" | "restarted-compatible-service";
49
+ bitcoindCompatibilityIssue: "none" | "service-version-mismatch" | "wallet-root-mismatch" | "runtime-mismatch";
50
+ managedCoreReplicaAction: "none" | "recreated";
51
+ bitcoindPostRepairHealth: "ready" | "catching-up" | "starting" | "failed" | "unavailable";
52
+ indexerDaemonAction: "none" | "cleared-stale-artifacts" | "stopped-incompatible-daemon" | "restarted-compatible-daemon";
53
+ indexerCompatibilityIssue: "none" | "service-version-mismatch" | "wallet-root-mismatch" | "schema-mismatch";
54
+ indexerPostRepairHealth: "starting" | "catching-up" | "synced" | "failed";
55
+ miningPreRepairRunMode: "stopped" | "foreground" | "background";
56
+ miningResumeAction: "none" | "skipped-not-resumable" | "skipped-post-repair-blocked" | "resumed-background" | "resume-failed";
57
+ miningPostRepairRunMode: "stopped" | "background";
58
+ miningResumeError: string | null;
59
+ note: string | null;
60
+ }
61
+ interface WalletLifecycleRpcClient {
62
+ getDescriptorInfo(descriptor: string): Promise<{
63
+ descriptor: string;
64
+ checksum: string;
65
+ }>;
66
+ createWallet(walletName: string, options: {
67
+ blank: boolean;
68
+ descriptors: boolean;
69
+ disablePrivateKeys: boolean;
70
+ loadOnStartup: boolean;
71
+ passphrase: string;
72
+ }): Promise<unknown>;
73
+ walletPassphrase(walletName: string, passphrase: string, timeoutSeconds: number): Promise<null>;
74
+ importDescriptors(walletName: string, requests: Array<{
75
+ desc: string;
76
+ timestamp: string | number;
77
+ active?: boolean;
78
+ internal?: boolean;
79
+ range?: number | [number, number];
80
+ }>): Promise<Array<{
81
+ success: boolean;
82
+ }>>;
83
+ walletLock(walletName: string): Promise<null>;
84
+ deriveAddresses(descriptor: string, range?: number | [number, number]): Promise<string[]>;
85
+ listDescriptors(walletName: string, privateOnly?: boolean): Promise<{
86
+ descriptors: Array<{
87
+ desc: string;
88
+ }>;
89
+ }>;
90
+ getWalletInfo(walletName: string): Promise<{
91
+ walletname: string;
92
+ private_keys_enabled: boolean;
93
+ descriptors: boolean;
94
+ }>;
95
+ loadWallet(walletName: string, loadOnStartup?: boolean): Promise<{
96
+ name: string;
97
+ warning: string;
98
+ }>;
99
+ unloadWallet?(walletName: string, loadOnStartup?: boolean): Promise<null>;
100
+ listWallets(): Promise<string[]>;
101
+ getBlockchainInfo(): Promise<{
102
+ blocks: number;
103
+ headers: number;
104
+ }>;
105
+ }
106
+ declare function readManagedSnapshotTip(options: {
107
+ dataDir: string;
108
+ databasePath: string;
109
+ walletRootId: string;
110
+ }): Promise<{
111
+ nodeBestHeight: number | null;
112
+ snapshotHeight: number | null;
113
+ }>;
114
+ export declare function parseUnlockDurationToMs(raw: string | null | undefined): number;
115
+ export declare function verifyManagedCoreWalletReplica(state: WalletStateV1, dataDir: string, dependencies?: {
116
+ nodeHandle?: {
117
+ rpc: Parameters<typeof createRpcClient>[0];
118
+ };
119
+ attachService?: typeof attachOrStartManagedBitcoindService;
120
+ rpcFactory?: (config: Parameters<typeof createRpcClient>[0]) => WalletLifecycleRpcClient;
121
+ }): Promise<ManagedCoreWalletReplicaStatus>;
122
+ export declare function loadUnlockedWalletState(options?: {
123
+ provider?: WalletSecretProvider;
124
+ nowUnixMs?: number;
125
+ paths?: WalletRuntimePaths;
126
+ }): Promise<LoadedUnlockedWalletState | null>;
127
+ export declare function initializeWallet(options: {
128
+ dataDir: string;
129
+ provider?: WalletSecretProvider;
130
+ prompter: WalletPrompter;
131
+ nowUnixMs?: number;
132
+ unlockDurationMs?: number;
133
+ paths?: WalletRuntimePaths;
134
+ attachService?: typeof attachOrStartManagedBitcoindService;
135
+ rpcFactory?: (config: Parameters<typeof createRpcClient>[0]) => WalletLifecycleRpcClient;
136
+ }): Promise<WalletInitializationResult>;
137
+ export declare function unlockWallet(options?: {
138
+ provider?: WalletSecretProvider;
139
+ nowUnixMs?: number;
140
+ unlockDurationMs?: number;
141
+ paths?: WalletRuntimePaths;
142
+ }): Promise<WalletUnlockResult>;
143
+ export declare function lockWallet(options: {
144
+ dataDir: string;
145
+ provider?: WalletSecretProvider;
146
+ paths?: WalletRuntimePaths;
147
+ attachService?: typeof attachOrStartManagedBitcoindService;
148
+ rpcFactory?: (config: Parameters<typeof createRpcClient>[0]) => WalletLifecycleRpcClient;
149
+ }): Promise<{
150
+ walletRootId: string | null;
151
+ coreLocked: boolean;
152
+ }>;
153
+ export declare function exportWallet(options: {
154
+ archivePath: string;
155
+ dataDir: string;
156
+ databasePath: string;
157
+ provider?: WalletSecretProvider;
158
+ prompter: WalletPrompter;
159
+ nowUnixMs?: number;
160
+ paths?: WalletRuntimePaths;
161
+ attachService?: typeof attachOrStartManagedBitcoindService;
162
+ rpcFactory?: (config: Parameters<typeof createRpcClient>[0]) => WalletLifecycleRpcClient;
163
+ readSnapshotTip?: typeof readManagedSnapshotTip;
164
+ }): Promise<WalletExportResult>;
165
+ export declare function importWallet(options: {
166
+ archivePath: string;
167
+ dataDir: string;
168
+ databasePath: string;
169
+ provider?: WalletSecretProvider;
170
+ prompter: WalletPrompter;
171
+ nowUnixMs?: number;
172
+ unlockDurationMs?: number;
173
+ paths?: WalletRuntimePaths;
174
+ attachService?: typeof attachOrStartManagedBitcoindService;
175
+ attachIndexerDaemon?: typeof attachOrStartIndexerDaemon;
176
+ rpcFactory?: (config: Parameters<typeof createRpcClient>[0]) => WalletLifecycleRpcClient;
177
+ }): Promise<WalletImportResult>;
178
+ export declare function repairWallet(options: {
179
+ dataDir: string;
180
+ databasePath: string;
181
+ provider?: WalletSecretProvider;
182
+ assumeYes?: boolean;
183
+ nowUnixMs?: number;
184
+ paths?: WalletRuntimePaths;
185
+ attachService?: typeof attachOrStartManagedBitcoindService;
186
+ probeBitcoindService?: typeof probeManagedBitcoindService;
187
+ rpcFactory?: (config: Parameters<typeof createRpcClient>[0]) => WalletLifecycleRpcClient;
188
+ attachIndexerDaemon?: typeof attachOrStartIndexerDaemon;
189
+ probeIndexerDaemon?: typeof probeIndexerDaemon;
190
+ requestMiningPreemption?: typeof requestMiningGenerationPreemption;
191
+ startBackgroundMining?: typeof import("./mining/runner.js").startBackgroundMining;
192
+ }): Promise<WalletRepairResult>;
193
+ export {};