@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,675 @@
1
+ import { findDomainField, findWalletDomain, listDomainFields, listWalletLocks, } from "../wallet/read/index.js";
2
+ import { getAddressNextSteps, getBootstrapSyncNextStep, getFundingQuickstartGuidance, getIdsNextSteps, getLocksNextSteps, } from "./workflow-hints.js";
3
+ import { getMutationRecommendation, getRepairRecommendation } from "./wallet-format.js";
4
+ function decimalOrNull(value) {
5
+ return value === null || value === undefined ? null : value.toString();
6
+ }
7
+ function nonEmptyMessage(value) {
8
+ return value === null || value === undefined || value.length === 0 ? null : value;
9
+ }
10
+ function isBitcoindAvailable(health) {
11
+ return health === "ready" || health === "starting";
12
+ }
13
+ function createBaseMessages(context) {
14
+ const warnings = [];
15
+ const explanations = [];
16
+ const nextSteps = [];
17
+ if (context.localState.availability !== "ready") {
18
+ warnings.push(`Wallet state is ${context.localState.availability}.`);
19
+ }
20
+ if (context.nodeHealth !== "synced") {
21
+ warnings.push(`Bitcoin publishability is ${context.nodeHealth}.`);
22
+ }
23
+ if (context.bitcoind.health !== "ready") {
24
+ warnings.push(`Managed bitcoind is ${context.bitcoind.health}.`);
25
+ }
26
+ if (context.indexer.health !== "synced") {
27
+ warnings.push(`Indexer service is ${context.indexer.health}.`);
28
+ }
29
+ const repairRecommendation = getRepairRecommendation(context);
30
+ if (repairRecommendation !== null) {
31
+ nextSteps.push(repairRecommendation);
32
+ }
33
+ if (repairRecommendation === null) {
34
+ const bootstrapSync = getBootstrapSyncNextStep(context);
35
+ if (bootstrapSync !== null) {
36
+ nextSteps.push(bootstrapSync);
37
+ }
38
+ }
39
+ const mutationRecommendation = getMutationRecommendation(context);
40
+ if (mutationRecommendation !== null) {
41
+ nextSteps.push(mutationRecommendation);
42
+ }
43
+ const localMessage = nonEmptyMessage(context.localState.message);
44
+ if (localMessage !== null) {
45
+ explanations.push(localMessage);
46
+ }
47
+ const nodeMessage = nonEmptyMessage(context.nodeMessage);
48
+ if (nodeMessage !== null) {
49
+ explanations.push(nodeMessage);
50
+ }
51
+ const bitcoindMessage = nonEmptyMessage(context.bitcoind.message);
52
+ if (bitcoindMessage !== null) {
53
+ explanations.push(bitcoindMessage);
54
+ }
55
+ const indexerMessage = nonEmptyMessage(context.indexer.message);
56
+ if (indexerMessage !== null) {
57
+ explanations.push(indexerMessage);
58
+ }
59
+ if (context.mining?.runtime.note !== null && context.mining?.runtime.note !== undefined) {
60
+ explanations.push(context.mining.runtime.note);
61
+ }
62
+ return {
63
+ warnings: dedupeStrings(warnings),
64
+ explanations: dedupeStrings(explanations),
65
+ nextSteps: dedupeStrings(nextSteps),
66
+ };
67
+ }
68
+ function dedupeStrings(values) {
69
+ return [...new Set(values.filter((value) => value.length > 0))];
70
+ }
71
+ export function buildAvailability(context) {
72
+ const availability = {
73
+ wallet: {
74
+ available: context.localState.availability === "ready",
75
+ stale: false,
76
+ reason: context.localState.message,
77
+ state: context.localState.availability,
78
+ },
79
+ bitcoind: {
80
+ available: isBitcoindAvailable(context.bitcoind.health),
81
+ stale: context.bitcoind.health === "starting",
82
+ reason: context.bitcoind.message,
83
+ state: context.bitcoind.health,
84
+ publishState: context.nodeHealth,
85
+ replicaStatus: context.nodeStatus?.walletReplica?.proofStatus ?? context.bitcoind.status?.walletReplica?.proofStatus ?? null,
86
+ serviceApiVersion: context.bitcoind.status?.serviceApiVersion ?? null,
87
+ binaryVersion: context.bitcoind.status?.binaryVersion ?? null,
88
+ buildId: context.bitcoind.status?.buildId ?? null,
89
+ serviceInstanceId: context.bitcoind.status?.serviceInstanceId ?? null,
90
+ processId: context.bitcoind.status?.processId ?? null,
91
+ walletRootId: context.bitcoind.status?.walletRootId ?? context.nodeStatus?.walletRootId ?? null,
92
+ chain: context.bitcoind.status?.chain ?? context.nodeStatus?.chain ?? null,
93
+ dataDir: context.bitcoind.status?.dataDir ?? context.dataDir,
94
+ runtimeRoot: context.bitcoind.status?.runtimeRoot ?? null,
95
+ startedAtUnixMs: context.bitcoind.status?.startedAtUnixMs ?? null,
96
+ heartbeatAtUnixMs: context.bitcoind.status?.heartbeatAtUnixMs ?? null,
97
+ updatedAtUnixMs: context.bitcoind.status?.updatedAtUnixMs ?? null,
98
+ lastError: context.bitcoind.status?.lastError ?? null,
99
+ coreBestHeight: context.nodeStatus?.nodeBestHeight ?? null,
100
+ coreBestHash: context.nodeStatus?.nodeBestHashHex ?? null,
101
+ },
102
+ indexer: {
103
+ available: context.indexer.health !== "unavailable"
104
+ && context.indexer.health !== "failed"
105
+ && context.indexer.health !== "schema-mismatch"
106
+ && context.indexer.health !== "service-version-mismatch"
107
+ && context.indexer.health !== "wallet-root-mismatch",
108
+ stale: context.indexer.health === "stale-heartbeat"
109
+ || context.indexer.health === "catching-up"
110
+ || context.indexer.health === "reorging"
111
+ || context.indexer.health === "starting",
112
+ reason: context.indexer.message,
113
+ state: context.indexer.health,
114
+ source: context.indexer.source ?? (context.indexer.status === null ? "none" : "probe"),
115
+ serviceApiVersion: context.indexer.status?.serviceApiVersion ?? null,
116
+ binaryVersion: context.indexer.status?.binaryVersion ?? null,
117
+ buildId: context.indexer.status?.buildId ?? null,
118
+ schemaVersion: context.indexer.status?.schemaVersion ?? null,
119
+ daemonInstanceId: context.indexer.daemonInstanceId ?? context.indexer.status?.daemonInstanceId ?? null,
120
+ processId: context.indexer.status?.processId ?? null,
121
+ walletRootId: context.indexer.status?.walletRootId ?? null,
122
+ startedAtUnixMs: context.indexer.status?.startedAtUnixMs ?? null,
123
+ updatedAtUnixMs: context.indexer.status?.updatedAtUnixMs ?? null,
124
+ snapshotSeq: context.indexer.snapshotSeq ?? context.indexer.status?.snapshotSeq ?? null,
125
+ openedAtUnixMs: context.indexer.openedAtUnixMs,
126
+ heartbeatAtUnixMs: context.indexer.status?.heartbeatAtUnixMs ?? null,
127
+ activeSnapshotCount: context.indexer.status?.activeSnapshotCount ?? null,
128
+ backlogBlocks: context.indexer.status?.backlogBlocks ?? null,
129
+ reorgDepth: context.indexer.status?.reorgDepth ?? null,
130
+ lastError: context.indexer.status?.lastError ?? null,
131
+ appliedTipHeight: context.indexer.snapshotTip?.height ?? context.indexer.status?.appliedTipHeight ?? null,
132
+ appliedTipHash: context.indexer.snapshotTip?.blockHashHex ?? context.indexer.status?.appliedTipHash ?? null,
133
+ coreBestHeight: context.nodeStatus?.nodeBestHeight ?? context.indexer.status?.coreBestHeight ?? null,
134
+ coreBestHash: context.nodeStatus?.nodeBestHashHex ?? context.indexer.status?.coreBestHash ?? null,
135
+ },
136
+ };
137
+ if (context.mining !== undefined) {
138
+ availability.hooks = {
139
+ available: context.mining.hook.mode !== "unavailable",
140
+ stale: context.mining.hook.operatorValidationState === "stale",
141
+ reason: context.mining.hook.validationError ?? context.mining.hook.trustMessage,
142
+ state: context.mining.hook.validationState,
143
+ operatorValidationState: context.mining.hook.operatorValidationState,
144
+ cooldownActive: context.mining.hook.cooldownActive,
145
+ };
146
+ availability.backgroundWorker = {
147
+ available: context.mining.runtime.backgroundWorkerPid !== null,
148
+ stale: context.mining.runtime.backgroundWorkerHealth === "stale-heartbeat"
149
+ || context.mining.runtime.backgroundWorkerHealth === "stale-pid"
150
+ || context.mining.runtime.backgroundWorkerHealth === "version-mismatch",
151
+ reason: context.mining.runtime.note,
152
+ state: context.mining.runtime.backgroundWorkerHealth,
153
+ };
154
+ }
155
+ return availability;
156
+ }
157
+ function mapIdentity(identity) {
158
+ return {
159
+ index: identity.index,
160
+ scriptPubKeyHex: identity.scriptPubKeyHex,
161
+ address: identity.address,
162
+ selectors: identity.selectors,
163
+ assignedDomainNames: identity.assignedDomainNames,
164
+ ownedDomainNames: identity.ownedDomainNames,
165
+ anchoredOwnedDomainNames: identity.anchoredOwnedDomainNames,
166
+ localStatus: identity.localStatus,
167
+ effectiveStatus: identity.effectiveStatus,
168
+ canonicalDomainId: identity.canonicalDomainId,
169
+ canonicalDomainName: identity.canonicalDomainName,
170
+ observedCogBalance: decimalOrNull(identity.observedCogBalance),
171
+ readOnly: identity.readOnly,
172
+ };
173
+ }
174
+ function mapDomain(domain) {
175
+ return {
176
+ name: domain.name,
177
+ domainId: domain.domainId,
178
+ anchored: domain.anchored,
179
+ ownerScriptPubKeyHex: domain.ownerScriptPubKeyHex,
180
+ ownerLocalIndex: domain.ownerLocalIndex,
181
+ ownerAddress: domain.ownerAddress,
182
+ localRelationship: domain.localRelationship,
183
+ chainStatus: domain.chainStatus,
184
+ localAnchorIntent: domain.localAnchorIntent,
185
+ foundingMessageText: domain.foundingMessageText,
186
+ endpointText: domain.endpointText,
187
+ delegateScriptPubKeyHex: domain.delegateScriptPubKeyHex,
188
+ minerScriptPubKeyHex: domain.minerScriptPubKeyHex,
189
+ fieldCount: domain.fieldCount,
190
+ listingPriceCogtoshi: decimalOrNull(domain.listingPriceCogtoshi),
191
+ activeLockCount: domain.activeLockCount,
192
+ selfStakeCogtoshi: decimalOrNull(domain.selfStakeCogtoshi),
193
+ supportedStakeCogtoshi: decimalOrNull(domain.supportedStakeCogtoshi),
194
+ totalSupportedCogtoshi: decimalOrNull(domain.totalSupportedCogtoshi),
195
+ totalRevokedCogtoshi: decimalOrNull(domain.totalRevokedCogtoshi),
196
+ readOnly: domain.readOnly,
197
+ };
198
+ }
199
+ function mapField(field) {
200
+ return {
201
+ domainName: field.domainName,
202
+ domainId: field.domainId,
203
+ fieldId: field.fieldId,
204
+ name: field.name,
205
+ permanent: field.permanent,
206
+ hasValue: field.hasValue,
207
+ format: field.format,
208
+ preview: field.preview,
209
+ rawValueHex: field.rawValueHex,
210
+ };
211
+ }
212
+ function mapLock(lock) {
213
+ return {
214
+ lockId: lock.lockId,
215
+ status: lock.status,
216
+ amountCogtoshi: lock.amountCogtoshi.toString(),
217
+ timeoutHeight: lock.timeoutHeight,
218
+ lockerScriptPubKeyHex: lock.lockerScriptPubKeyHex,
219
+ lockerLocalIndex: lock.lockerLocalIndex,
220
+ recipientDomainId: lock.recipientDomainId,
221
+ recipientDomainName: lock.recipientDomainName,
222
+ recipientLocal: lock.recipientLocal,
223
+ claimableNow: lock.claimableNow,
224
+ reclaimableNow: lock.reclaimableNow,
225
+ };
226
+ }
227
+ function listPendingMutationsForDomain(context, domainName) {
228
+ return (context.localState.state?.pendingMutations ?? [])
229
+ .filter((mutation) => (mutation.domainName === domainName || mutation.recipientDomainName === domainName)
230
+ && mutation.status !== "confirmed"
231
+ && mutation.status !== "canceled");
232
+ }
233
+ function mapPendingMutation(mutation) {
234
+ return {
235
+ kind: mutation.kind,
236
+ domainName: mutation.domainName,
237
+ recipientDomainName: mutation.recipientDomainName ?? null,
238
+ fieldName: mutation.fieldName ?? null,
239
+ status: mutation.status,
240
+ senderScriptPubKeyHex: mutation.senderScriptPubKeyHex,
241
+ recipientScriptPubKeyHex: mutation.recipientScriptPubKeyHex ?? null,
242
+ amountCogtoshi: decimalOrNull(mutation.amountCogtoshi),
243
+ priceCogtoshi: decimalOrNull(mutation.priceCogtoshi),
244
+ lockId: mutation.lockId ?? null,
245
+ txid: mutation.attemptedTxid ?? null,
246
+ wtxid: mutation.attemptedWtxid ?? null,
247
+ reviewPresent: mutation.reviewPayloadHex !== null && mutation.reviewPayloadHex !== undefined,
248
+ };
249
+ }
250
+ function buildMiningStatusData(mining) {
251
+ return {
252
+ runMode: mining.runtime.runMode,
253
+ state: mining.runtime.miningState,
254
+ bitcoindHealth: mining.runtime.bitcoindHealth,
255
+ bitcoindServiceState: mining.runtime.bitcoindServiceState,
256
+ managedCoreReplicaStatus: mining.runtime.bitcoindReplicaStatus,
257
+ publishHealth: mining.runtime.nodeHealth,
258
+ indexerHealth: mining.runtime.indexerHealth,
259
+ indexerDaemonState: mining.runtime.indexerDaemonState,
260
+ indexerTruthSource: mining.runtime.indexerTruthSource,
261
+ indexerDaemonInstanceId: mining.runtime.indexerDaemonInstanceId,
262
+ indexerSnapshotSeq: mining.runtime.indexerSnapshotSeq,
263
+ indexerSnapshotOpenedAtUnixMs: mining.runtime.indexerSnapshotOpenedAtUnixMs,
264
+ indexerReorgDepth: mining.runtime.indexerReorgDepth,
265
+ tipHeight: mining.runtime.indexerTipHeight ?? mining.runtime.coreBestHeight,
266
+ referencedBlockHashDisplay: mining.runtime.referencedBlockHashDisplay,
267
+ currentDomain: mining.runtime.currentDomainName === null && mining.runtime.currentDomainId === null
268
+ ? null
269
+ : {
270
+ domainId: mining.runtime.currentDomainId,
271
+ name: mining.runtime.currentDomainName,
272
+ },
273
+ liveMiningFamilyInMempool: mining.runtime.liveMiningFamilyInMempool,
274
+ publishDecision: mining.runtime.currentPublishDecision,
275
+ fees: {
276
+ currentFeeRateSatVb: mining.runtime.currentFeeRateSatVb,
277
+ currentAbsoluteFeeSats: mining.runtime.currentAbsoluteFeeSats === null ? null : String(mining.runtime.currentAbsoluteFeeSats),
278
+ currentBlockFeeSpentSats: mining.runtime.currentBlockFeeSpentSats,
279
+ sessionFeeSpentSats: mining.runtime.sessionFeeSpentSats,
280
+ lifetimeFeeSpentSats: mining.runtime.lifetimeFeeSpentSats,
281
+ },
282
+ worker: {
283
+ pid: mining.runtime.backgroundWorkerPid,
284
+ runId: mining.runtime.backgroundWorkerRunId,
285
+ heartbeatAtUnixMs: mining.runtime.backgroundWorkerHeartbeatAtUnixMs,
286
+ health: mining.runtime.backgroundWorkerHealth,
287
+ },
288
+ phase: mining.runtime.currentPhase,
289
+ lastSuspendDetectedAtUnixMs: mining.runtime.lastSuspendDetectedAtUnixMs,
290
+ pauseReason: mining.runtime.pauseReason,
291
+ hookMode: mining.runtime.hookMode,
292
+ hookValidationState: mining.runtime.lastValidationState,
293
+ hookOperatorValidationState: mining.runtime.lastOperatorValidationState,
294
+ hookCooldownActive: mining.hook.cooldownActive,
295
+ providerState: mining.runtime.providerState,
296
+ tipsAligned: mining.runtime.tipsAligned,
297
+ sameDomainCompetitorSuppressed: mining.runtime.sameDomainCompetitorSuppressed,
298
+ higherRankedCompetitorDomainCount: mining.runtime.higherRankedCompetitorDomainCount,
299
+ dedupedCompetitorDomainCount: mining.runtime.dedupedCompetitorDomainCount,
300
+ competitivenessGateIndeterminate: mining.runtime.competitivenessGateIndeterminate,
301
+ mempoolSequenceCacheStatus: mining.runtime.mempoolSequenceCacheStatus,
302
+ note: mining.runtime.note,
303
+ };
304
+ }
305
+ export function buildStatusJson(context) {
306
+ const messages = createBaseMessages(context);
307
+ return {
308
+ ...messages,
309
+ data: {
310
+ wallet: {
311
+ availability: context.localState.availability,
312
+ walletRootId: context.model?.walletRootId ?? context.localState.walletRootId ?? context.nodeStatus?.walletRootId ?? null,
313
+ unlockUntilUnixMs: context.localState.unlockUntilUnixMs,
314
+ managedCoreReplicaStatus: context.nodeStatus?.walletReplica?.proofStatus ?? null,
315
+ },
316
+ btc: {
317
+ serviceHealth: context.nodeHealth,
318
+ managedServiceHealth: context.bitcoind.health,
319
+ managedServiceState: context.bitcoind.status?.state ?? null,
320
+ managedCoreReplicaStatus: context.nodeStatus?.walletReplica?.proofStatus ?? null,
321
+ bestHeight: context.nodeStatus?.nodeBestHeight ?? null,
322
+ bestHashHex: context.nodeStatus?.nodeBestHashHex ?? null,
323
+ headerHeight: context.nodeStatus?.nodeHeaderHeight ?? null,
324
+ },
325
+ cog: {
326
+ indexerHealth: context.indexer.health,
327
+ indexerDaemonState: context.indexer.status?.state ?? null,
328
+ indexerTruthSource: context.indexer.source ?? (context.indexer.status === null ? "none" : "probe"),
329
+ indexerDaemonInstanceId: context.indexer.daemonInstanceId ?? context.indexer.status?.daemonInstanceId ?? null,
330
+ indexerSnapshotSeq: context.indexer.snapshotSeq ?? context.indexer.status?.snapshotSeq ?? null,
331
+ indexerSnapshotOpenedAtUnixMs: context.indexer.openedAtUnixMs,
332
+ reorgDepth: context.indexer.status?.reorgDepth ?? null,
333
+ tipHeight: context.indexer.snapshotTip?.height ?? null,
334
+ tipHashHex: context.indexer.snapshotTip?.blockHashHex ?? null,
335
+ },
336
+ domains: {
337
+ relatedCount: context.model?.domains.length ?? null,
338
+ readOnlyIdentityCount: context.model?.readOnlyIdentityCount ?? null,
339
+ pendingMutationCount: (context.localState.state?.pendingMutations ?? []).filter((mutation) => mutation.status !== "confirmed" && mutation.status !== "canceled").length ?? null,
340
+ pendingFamilyCount: context.localState.state?.proactiveFamilies.filter((family) => family.status !== "confirmed" && family.status !== "canceled").length ?? null,
341
+ },
342
+ mining: context.mining === undefined ? null : buildMiningStatusData(context.mining),
343
+ hooks: context.mining === undefined
344
+ ? null
345
+ : {
346
+ mode: context.mining.hook.mode,
347
+ validationState: context.mining.hook.validationState,
348
+ operatorValidationState: context.mining.hook.operatorValidationState,
349
+ trustStatus: context.mining.hook.trustStatus,
350
+ providerConfigured: context.mining.provider.configured,
351
+ cooldownActive: context.mining.hook.cooldownActive,
352
+ },
353
+ availability: buildAvailability(context),
354
+ },
355
+ };
356
+ }
357
+ export function buildAddressJson(context) {
358
+ const messages = createBaseMessages(context);
359
+ const fundingIdentity = context.model?.fundingIdentity ?? null;
360
+ return {
361
+ ...messages,
362
+ explanations: dedupeStrings([
363
+ ...messages.explanations,
364
+ ...(fundingIdentity?.address == null ? [] : [getFundingQuickstartGuidance()]),
365
+ ]),
366
+ nextSteps: dedupeStrings([
367
+ ...messages.nextSteps,
368
+ ...getAddressNextSteps(context, fundingIdentity?.address),
369
+ ]),
370
+ data: {
371
+ address: fundingIdentity?.address ?? null,
372
+ scriptPubKeyHex: fundingIdentity?.scriptPubKeyHex ?? null,
373
+ network: context.localState.state?.network ?? context.nodeStatus?.chain ?? null,
374
+ availability: buildAvailability(context),
375
+ },
376
+ };
377
+ }
378
+ export function buildIdsJson(context, page, identities) {
379
+ const messages = createBaseMessages(context);
380
+ return {
381
+ ...messages,
382
+ nextSteps: dedupeStrings([
383
+ ...messages.nextSteps,
384
+ ...getIdsNextSteps(context.model === null ? null : identities),
385
+ ]),
386
+ data: {
387
+ identities: context.model === null ? null : identities.map(mapIdentity),
388
+ page,
389
+ availability: buildAvailability(context),
390
+ },
391
+ };
392
+ }
393
+ export function buildWalletStatusJson(context) {
394
+ const messages = createBaseMessages(context);
395
+ const fundingIdentity = context.model?.fundingIdentity ?? null;
396
+ const lockState = context.localState.availability === "ready" && context.localState.unlockUntilUnixMs !== null
397
+ ? "unlocked"
398
+ : context.localState.availability;
399
+ return {
400
+ ...messages,
401
+ data: {
402
+ lockState,
403
+ unlockUntilUnixMs: context.localState.unlockUntilUnixMs,
404
+ fundingAddress: fundingIdentity?.address ?? null,
405
+ fundingScriptPubKeyHex: fundingIdentity?.scriptPubKeyHex ?? null,
406
+ availability: buildAvailability(context),
407
+ },
408
+ };
409
+ }
410
+ export function buildHooksStatusJson(mining) {
411
+ const warnings = [];
412
+ const explanations = [];
413
+ const nextSteps = [];
414
+ if (mining.hook.operatorValidationState === "failed" || mining.hook.operatorValidationState === "stale") {
415
+ warnings.push(`Mining hook validation is ${mining.hook.operatorValidationState}.`);
416
+ }
417
+ if (mining.hook.cooldownActive) {
418
+ warnings.push("Mining hook launch is paused during the cooldown window.");
419
+ }
420
+ if (mining.hook.validationError !== null) {
421
+ explanations.push(mining.hook.validationError);
422
+ }
423
+ if (mining.hook.trustMessage !== null) {
424
+ explanations.push(mining.hook.trustMessage);
425
+ }
426
+ const launchFingerprintState = mining.hook.currentLaunchFingerprint === null
427
+ ? "unavailable"
428
+ : mining.hook.validatedLaunchFingerprint === null
429
+ ? "not-validated"
430
+ : mining.hook.currentLaunchFingerprint === mining.hook.validatedLaunchFingerprint
431
+ ? "matched"
432
+ : "stale";
433
+ const fullFingerprintState = mining.hook.currentFullFingerprint === null
434
+ ? (mining.hook.verifyUsed ? "unavailable" : "not-verified")
435
+ : mining.hook.validatedFullFingerprint === null
436
+ ? "not-validated"
437
+ : mining.hook.currentFullFingerprint === mining.hook.validatedFullFingerprint
438
+ ? "matched"
439
+ : "stale";
440
+ return {
441
+ warnings: dedupeStrings(warnings),
442
+ explanations: dedupeStrings(explanations),
443
+ nextSteps: dedupeStrings(nextSteps),
444
+ data: {
445
+ mode: mining.hook.mode,
446
+ validationState: mining.hook.validationState,
447
+ operatorValidationState: mining.hook.operatorValidationState,
448
+ launchFingerprintState,
449
+ fullFingerprintState,
450
+ lastValidationAtUnixMs: mining.hook.validatedAtUnixMs,
451
+ lastValidationError: mining.hook.validationError,
452
+ trustChecks: {
453
+ trustStatus: mining.hook.trustStatus,
454
+ trustMessage: mining.hook.trustMessage,
455
+ entrypointExists: mining.hook.entrypointExists,
456
+ packageStatus: mining.hook.packageStatus,
457
+ packageMessage: mining.hook.packageMessage,
458
+ cooldownUntilUnixMs: mining.hook.cooldownUntilUnixMs,
459
+ cooldownActive: mining.hook.cooldownActive,
460
+ consecutiveFailureCount: mining.hook.consecutiveFailureCount,
461
+ },
462
+ },
463
+ };
464
+ }
465
+ export function buildMineStatusJson(mining) {
466
+ const warnings = [];
467
+ const explanations = [];
468
+ const nextSteps = [];
469
+ if (mining.runtime.miningState === "repair-required") {
470
+ nextSteps.push("Run `cogcoin repair` before mining again.");
471
+ }
472
+ else if (mining.runtime.pauseReason === "zero-reward") {
473
+ nextSteps.push("Wait for the next positive-reward target height; mining resumes automatically.");
474
+ }
475
+ else if (mining.runtime.currentPhase === "resuming") {
476
+ nextSteps.push("Wait for mining to finish rechecking health after the local runtime resumed.");
477
+ }
478
+ else if (mining.runtime.miningState === "paused-stale" || mining.runtime.miningState === "paused") {
479
+ nextSteps.push("Wait for the live mempool family to settle, or rerun mining when you want replacements to resume.");
480
+ }
481
+ if (mining.runtime.note !== null) {
482
+ explanations.push(mining.runtime.note);
483
+ }
484
+ if (mining.runtime.lastError !== null) {
485
+ warnings.push(mining.runtime.lastError);
486
+ }
487
+ return {
488
+ warnings: dedupeStrings(warnings),
489
+ explanations: dedupeStrings(explanations),
490
+ nextSteps: dedupeStrings(nextSteps),
491
+ data: {
492
+ ...buildMiningStatusData(mining),
493
+ availability: {
494
+ hooks: {
495
+ available: mining.hook.mode !== "unavailable",
496
+ stale: mining.hook.operatorValidationState === "stale",
497
+ reason: mining.hook.validationError,
498
+ state: mining.hook.validationState,
499
+ operatorValidationState: mining.hook.operatorValidationState,
500
+ cooldownActive: mining.hook.cooldownActive,
501
+ },
502
+ bitcoind: {
503
+ available: mining.runtime.bitcoindHealth === "ready" || mining.runtime.bitcoindHealth === "starting",
504
+ stale: mining.runtime.bitcoindHealth === "starting",
505
+ reason: mining.runtime.note,
506
+ state: mining.runtime.bitcoindHealth,
507
+ publishState: mining.runtime.nodeHealth,
508
+ replicaStatus: mining.runtime.bitcoindReplicaStatus,
509
+ coreBestHeight: mining.runtime.coreBestHeight,
510
+ coreBestHash: mining.runtime.coreBestHash,
511
+ },
512
+ indexer: {
513
+ available: mining.runtime.indexerHealth !== "unavailable"
514
+ && mining.runtime.indexerHealth !== "failed"
515
+ && mining.runtime.indexerHealth !== "schema-mismatch"
516
+ && mining.runtime.indexerHealth !== "service-version-mismatch"
517
+ && mining.runtime.indexerHealth !== "wallet-root-mismatch",
518
+ stale: mining.runtime.indexerHealth === "stale-heartbeat"
519
+ || mining.runtime.indexerHealth === "catching-up"
520
+ || mining.runtime.indexerHealth === "reorging"
521
+ || mining.runtime.indexerHealth === "starting",
522
+ reason: mining.runtime.note,
523
+ state: mining.runtime.indexerHealth,
524
+ source: mining.runtime.indexerTruthSource,
525
+ daemonInstanceId: mining.runtime.indexerDaemonInstanceId,
526
+ snapshotSeq: mining.runtime.indexerSnapshotSeq,
527
+ openedAtUnixMs: mining.runtime.indexerSnapshotOpenedAtUnixMs,
528
+ reorgDepth: mining.runtime.indexerReorgDepth,
529
+ appliedTipHeight: mining.runtime.indexerTipHeight,
530
+ appliedTipHash: mining.runtime.indexerTipHash,
531
+ coreBestHeight: mining.runtime.coreBestHeight,
532
+ coreBestHash: mining.runtime.coreBestHash,
533
+ },
534
+ backgroundWorker: {
535
+ available: mining.runtime.backgroundWorkerPid !== null,
536
+ stale: mining.runtime.backgroundWorkerHealth === "stale-heartbeat"
537
+ || mining.runtime.backgroundWorkerHealth === "stale-pid"
538
+ || mining.runtime.backgroundWorkerHealth === "version-mismatch",
539
+ reason: mining.runtime.note,
540
+ state: mining.runtime.backgroundWorkerHealth,
541
+ },
542
+ },
543
+ },
544
+ };
545
+ }
546
+ export function buildMineLogJson(events, page, rotation) {
547
+ return {
548
+ warnings: [],
549
+ explanations: [],
550
+ nextSteps: [],
551
+ data: {
552
+ events,
553
+ truncated: page.truncated,
554
+ rotation,
555
+ page,
556
+ },
557
+ };
558
+ }
559
+ export function buildBalanceJson(context) {
560
+ const messages = createBaseMessages(context);
561
+ const total = context.model === null || context.snapshot === null
562
+ ? null
563
+ : context.model.identities.reduce((sum, identity) => identity.readOnly || identity.observedCogBalance === null ? sum : sum + identity.observedCogBalance, 0n);
564
+ return {
565
+ ...messages,
566
+ data: {
567
+ assetLabel: "COG",
568
+ totalCogtoshi: decimalOrNull(total),
569
+ identities: context.model?.identities.map(mapIdentity) ?? null,
570
+ pending: (context.localState.state?.pendingMutations ?? [])
571
+ .filter((mutation) => (mutation.kind === "send" || mutation.kind === "lock" || mutation.kind === "claim")
572
+ && mutation.status !== "confirmed"
573
+ && mutation.status !== "canceled")
574
+ .map(mapPendingMutation),
575
+ availability: buildAvailability(context),
576
+ },
577
+ };
578
+ }
579
+ export function buildLocksJson(context, locks, page) {
580
+ const messages = createBaseMessages(context);
581
+ return {
582
+ ...messages,
583
+ nextSteps: dedupeStrings([
584
+ ...messages.nextSteps,
585
+ ...getLocksNextSteps(locks),
586
+ ]),
587
+ data: {
588
+ assetLabel: "COG",
589
+ locks: locks?.map(mapLock) ?? null,
590
+ pending: (context.localState.state?.pendingMutations ?? [])
591
+ .filter((mutation) => (mutation.kind === "lock" || mutation.kind === "claim")
592
+ && mutation.status !== "confirmed"
593
+ && mutation.status !== "canceled")
594
+ .map(mapPendingMutation),
595
+ page,
596
+ availability: buildAvailability(context),
597
+ },
598
+ };
599
+ }
600
+ export function buildDomainsJson(context, domains, page) {
601
+ const messages = createBaseMessages(context);
602
+ return {
603
+ ...messages,
604
+ data: {
605
+ domains: domains?.map(mapDomain) ?? null,
606
+ page,
607
+ availability: buildAvailability(context),
608
+ },
609
+ };
610
+ }
611
+ export function buildShowJson(context, domainName) {
612
+ const messages = createBaseMessages(context);
613
+ const found = findWalletDomain(context, domainName);
614
+ return {
615
+ ...messages,
616
+ data: {
617
+ domain: found === null
618
+ ? null
619
+ : {
620
+ ...mapDomain(found.domain),
621
+ pendingMutations: listPendingMutationsForDomain(context, domainName).map(mapPendingMutation),
622
+ pendingFamilies: (context.localState.state?.proactiveFamilies ?? [])
623
+ .filter((family) => family.domainName === domainName
624
+ && family.status !== "confirmed"
625
+ && family.status !== "canceled")
626
+ .map((family) => ({
627
+ type: family.type,
628
+ status: family.status,
629
+ step: family.currentStep ?? null,
630
+ reservedDedicatedIndex: family.reservedDedicatedIndex ?? null,
631
+ fieldName: family.fieldName ?? null,
632
+ })),
633
+ },
634
+ availability: buildAvailability(context),
635
+ },
636
+ };
637
+ }
638
+ export function buildFieldsJson(context, domainName, fields, page) {
639
+ const messages = createBaseMessages(context);
640
+ return {
641
+ ...messages,
642
+ data: {
643
+ fields: fields?.map(mapField) ?? null,
644
+ page,
645
+ availability: buildAvailability(context),
646
+ },
647
+ };
648
+ }
649
+ export function buildFieldJson(context, domainName, fieldName) {
650
+ const messages = createBaseMessages(context);
651
+ const field = findDomainField(context, domainName, fieldName);
652
+ return {
653
+ ...messages,
654
+ data: {
655
+ field: field === null ? null : mapField(field),
656
+ availability: buildAvailability(context),
657
+ },
658
+ };
659
+ }
660
+ export function listLocksForJson(context, options) {
661
+ const locks = listWalletLocks(context);
662
+ if (locks === null) {
663
+ return null;
664
+ }
665
+ if (options.claimableOnly) {
666
+ return locks.filter((lock) => lock.claimableNow);
667
+ }
668
+ if (options.reclaimableOnly) {
669
+ return locks.filter((lock) => lock.reclaimableNow);
670
+ }
671
+ return locks;
672
+ }
673
+ export function listFieldsForJson(context, domainName) {
674
+ return listDomainFields(context, domainName);
675
+ }
@@ -0,0 +1,2 @@
1
+ import type { CliRunnerContext } from "./types.js";
2
+ export declare function runCli(argv: string[], contextOverrides?: CliRunnerContext): Promise<number>;