@cogcoin/client 0.5.15 → 1.0.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 (172) hide show
  1. package/README.md +80 -25
  2. package/dist/app-paths.d.ts +5 -6
  3. package/dist/app-paths.js +8 -16
  4. package/dist/art/balance.txt +10 -0
  5. package/dist/art/welcome.txt +16 -0
  6. package/dist/bitcoind/bootstrap/controller.d.ts +1 -0
  7. package/dist/bitcoind/bootstrap/controller.js +53 -1
  8. package/dist/bitcoind/client/follow-block-times.d.ts +1 -0
  9. package/dist/bitcoind/client/follow-block-times.js +1 -1
  10. package/dist/bitcoind/client/internal-types.d.ts +7 -3
  11. package/dist/bitcoind/client/managed-client.d.ts +4 -2
  12. package/dist/bitcoind/client/managed-client.js +14 -0
  13. package/dist/bitcoind/client/sync-engine.js +72 -11
  14. package/dist/bitcoind/hash-order.d.ts +4 -0
  15. package/dist/bitcoind/hash-order.js +13 -0
  16. package/dist/bitcoind/indexer-daemon-main.js +11 -3
  17. package/dist/bitcoind/normalize.js +3 -2
  18. package/dist/bitcoind/processing-start-height.d.ts +5 -0
  19. package/dist/bitcoind/processing-start-height.js +7 -0
  20. package/dist/bitcoind/progress/constants.d.ts +4 -0
  21. package/dist/bitcoind/progress/constants.js +4 -0
  22. package/dist/bitcoind/progress/controller.d.ts +2 -1
  23. package/dist/bitcoind/progress/controller.js +3 -3
  24. package/dist/bitcoind/progress/follow-scene.d.ts +6 -2
  25. package/dist/bitcoind/progress/follow-scene.js +29 -6
  26. package/dist/bitcoind/progress/formatting.d.ts +1 -0
  27. package/dist/bitcoind/progress/formatting.js +6 -0
  28. package/dist/bitcoind/progress/train-scene.js +37 -18
  29. package/dist/bitcoind/progress/tty-renderer.d.ts +6 -1
  30. package/dist/bitcoind/progress/tty-renderer.js +8 -4
  31. package/dist/bitcoind/rpc.d.ts +2 -1
  32. package/dist/bitcoind/rpc.js +3 -0
  33. package/dist/bitcoind/types.d.ts +6 -0
  34. package/dist/bytes.d.ts +1 -0
  35. package/dist/bytes.js +3 -0
  36. package/dist/cli/art.d.ts +2 -0
  37. package/dist/cli/art.js +37 -0
  38. package/dist/cli/commands/client-admin.d.ts +2 -0
  39. package/dist/cli/commands/client-admin.js +91 -0
  40. package/dist/cli/commands/follow.js +0 -2
  41. package/dist/cli/commands/mining-admin.js +6 -47
  42. package/dist/cli/commands/mining-read.js +11 -50
  43. package/dist/cli/commands/mining-runtime.js +38 -3
  44. package/dist/cli/commands/service-runtime.js +0 -2
  45. package/dist/cli/commands/status.js +8 -2
  46. package/dist/cli/commands/sync.js +51 -4
  47. package/dist/cli/commands/wallet-admin.js +142 -136
  48. package/dist/cli/commands/wallet-mutation.js +91 -79
  49. package/dist/cli/commands/wallet-read.js +15 -18
  50. package/dist/cli/context.js +4 -14
  51. package/dist/cli/mining-format.d.ts +0 -1
  52. package/dist/cli/mining-format.js +5 -37
  53. package/dist/cli/mining-json.d.ts +0 -18
  54. package/dist/cli/mining-json.js +0 -35
  55. package/dist/cli/mutation-command-groups.d.ts +1 -2
  56. package/dist/cli/mutation-command-groups.js +0 -5
  57. package/dist/cli/mutation-json.d.ts +24 -145
  58. package/dist/cli/mutation-json.js +30 -136
  59. package/dist/cli/mutation-resolved-json.d.ts +0 -7
  60. package/dist/cli/mutation-resolved-json.js +4 -10
  61. package/dist/cli/mutation-success.d.ts +2 -0
  62. package/dist/cli/mutation-success.js +11 -1
  63. package/dist/cli/mutation-text-format.js +1 -3
  64. package/dist/cli/output.d.ts +1 -1
  65. package/dist/cli/output.js +254 -231
  66. package/dist/cli/parse.d.ts +1 -1
  67. package/dist/cli/parse.js +93 -122
  68. package/dist/cli/preview-json.d.ts +17 -120
  69. package/dist/cli/preview-json.js +14 -97
  70. package/dist/cli/prompt.js +8 -13
  71. package/dist/cli/read-json.d.ts +15 -37
  72. package/dist/cli/read-json.js +44 -140
  73. package/dist/cli/runner.js +10 -13
  74. package/dist/cli/types.d.ts +8 -17
  75. package/dist/cli/types.js +0 -2
  76. package/dist/cli/wallet-format.d.ts +1 -0
  77. package/dist/cli/wallet-format.js +205 -144
  78. package/dist/cli/workflow-hints.d.ts +3 -3
  79. package/dist/cli/workflow-hints.js +11 -8
  80. package/dist/client/default-client.d.ts +3 -1
  81. package/dist/client/default-client.js +45 -2
  82. package/dist/client/factory.js +1 -1
  83. package/dist/client/initialization.js +23 -0
  84. package/dist/client/persistence.js +5 -5
  85. package/dist/client/store-adapter.js +1 -0
  86. package/dist/sqlite/checkpoints.d.ts +1 -0
  87. package/dist/sqlite/checkpoints.js +7 -0
  88. package/dist/sqlite/store.js +14 -1
  89. package/dist/types.d.ts +1 -0
  90. package/dist/wallet/coin-control.d.ts +41 -12
  91. package/dist/wallet/coin-control.js +100 -428
  92. package/dist/wallet/descriptor-normalization.d.ts +1 -3
  93. package/dist/wallet/descriptor-normalization.js +0 -16
  94. package/dist/wallet/lifecycle.d.ts +7 -99
  95. package/dist/wallet/lifecycle.js +513 -968
  96. package/dist/wallet/managed-core-wallet.d.ts +13 -0
  97. package/dist/wallet/managed-core-wallet.js +20 -0
  98. package/dist/wallet/mining/constants.d.ts +5 -12
  99. package/dist/wallet/mining/constants.js +5 -12
  100. package/dist/wallet/mining/control.d.ts +1 -13
  101. package/dist/wallet/mining/control.js +45 -349
  102. package/dist/wallet/mining/index.d.ts +3 -4
  103. package/dist/wallet/mining/index.js +1 -2
  104. package/dist/wallet/mining/runner.d.ts +116 -13
  105. package/dist/wallet/mining/runner.js +885 -501
  106. package/dist/wallet/mining/runtime-artifacts.js +23 -3
  107. package/dist/wallet/mining/sentence-protocol.d.ts +44 -0
  108. package/dist/wallet/mining/sentence-protocol.js +123 -0
  109. package/dist/wallet/mining/sentences.d.ts +4 -8
  110. package/dist/wallet/mining/sentences.js +3 -52
  111. package/dist/wallet/mining/state.d.ts +11 -6
  112. package/dist/wallet/mining/state.js +7 -6
  113. package/dist/wallet/mining/types.d.ts +2 -30
  114. package/dist/wallet/mining/visualizer.d.ts +31 -3
  115. package/dist/wallet/mining/visualizer.js +135 -13
  116. package/dist/wallet/read/context.d.ts +0 -2
  117. package/dist/wallet/read/context.js +119 -140
  118. package/dist/wallet/read/filter.js +2 -11
  119. package/dist/wallet/read/index.d.ts +1 -1
  120. package/dist/wallet/read/project.js +24 -77
  121. package/dist/wallet/read/types.d.ts +10 -25
  122. package/dist/wallet/reset.d.ts +0 -1
  123. package/dist/wallet/reset.js +60 -138
  124. package/dist/wallet/root-resolution.d.ts +1 -5
  125. package/dist/wallet/root-resolution.js +0 -18
  126. package/dist/wallet/runtime.d.ts +0 -6
  127. package/dist/wallet/runtime.js +0 -8
  128. package/dist/wallet/state/client-password-agent.js +208 -0
  129. package/dist/wallet/state/client-password.d.ts +65 -0
  130. package/dist/wallet/state/client-password.js +952 -0
  131. package/dist/wallet/state/crypto.d.ts +1 -20
  132. package/dist/wallet/state/crypto.js +0 -63
  133. package/dist/wallet/state/provider.d.ts +23 -11
  134. package/dist/wallet/state/provider.js +248 -290
  135. package/dist/wallet/state/storage.d.ts +2 -2
  136. package/dist/wallet/state/storage.js +48 -16
  137. package/dist/wallet/tx/anchor.d.ts +3 -28
  138. package/dist/wallet/tx/anchor.js +349 -1250
  139. package/dist/wallet/tx/bitcoin-transfer.d.ts +35 -0
  140. package/dist/wallet/tx/bitcoin-transfer.js +200 -0
  141. package/dist/wallet/tx/cog.d.ts +5 -1
  142. package/dist/wallet/tx/cog.js +149 -185
  143. package/dist/wallet/tx/common.d.ts +61 -8
  144. package/dist/wallet/tx/common.js +266 -146
  145. package/dist/wallet/tx/domain-admin.d.ts +3 -1
  146. package/dist/wallet/tx/domain-admin.js +61 -99
  147. package/dist/wallet/tx/domain-market.d.ts +5 -1
  148. package/dist/wallet/tx/domain-market.js +221 -228
  149. package/dist/wallet/tx/field.d.ts +4 -10
  150. package/dist/wallet/tx/field.js +83 -924
  151. package/dist/wallet/tx/identity-selector.d.ts +9 -3
  152. package/dist/wallet/tx/identity-selector.js +17 -35
  153. package/dist/wallet/tx/index.d.ts +3 -1
  154. package/dist/wallet/tx/index.js +2 -1
  155. package/dist/wallet/tx/register.d.ts +3 -1
  156. package/dist/wallet/tx/register.js +62 -220
  157. package/dist/wallet/tx/reputation.d.ts +3 -1
  158. package/dist/wallet/tx/reputation.js +58 -95
  159. package/dist/wallet/types.d.ts +8 -122
  160. package/package.json +5 -5
  161. package/dist/wallet/archive.d.ts +0 -4
  162. package/dist/wallet/archive.js +0 -41
  163. package/dist/wallet/mining/hook-protocol.d.ts +0 -47
  164. package/dist/wallet/mining/hook-protocol.js +0 -161
  165. package/dist/wallet/mining/hook-runner.js +0 -52
  166. package/dist/wallet/mining/hooks.d.ts +0 -38
  167. package/dist/wallet/mining/hooks.js +0 -520
  168. package/dist/wallet/state/explicit-lock.d.ts +0 -4
  169. package/dist/wallet/state/explicit-lock.js +0 -19
  170. package/dist/wallet/state/session.d.ts +0 -12
  171. package/dist/wallet/state/session.js +0 -23
  172. /package/dist/wallet/{mining/hook-runner.d.ts → state/client-password-agent.d.ts} +0 -0
@@ -1,11 +1,46 @@
1
1
  import { readFile } from "node:fs/promises";
2
2
  import { writeJsonFileAtomic } from "../fs/atomic.js";
3
3
  import { normalizeWalletStateRecord } from "../coin-control.js";
4
- import { decryptJsonWithPassphrase, decryptJsonWithSecretProvider, encryptJsonWithPassphrase, encryptJsonWithSecretProvider, } from "./crypto.js";
4
+ import { decryptJsonWithSecretProvider, encryptJsonWithSecretProvider, } from "./crypto.js";
5
5
  async function readEnvelope(path) {
6
6
  const raw = await readFile(path, "utf8");
7
7
  return JSON.parse(raw);
8
8
  }
9
+ function serializeWalletState(state) {
10
+ return {
11
+ schemaVersion: 5,
12
+ stateRevision: state.stateRevision,
13
+ lastWrittenAtUnixMs: state.lastWrittenAtUnixMs,
14
+ walletRootId: state.walletRootId,
15
+ network: state.network,
16
+ localScriptPubKeyHexes: state.localScriptPubKeyHexes,
17
+ mnemonic: state.mnemonic,
18
+ keys: state.keys,
19
+ descriptor: state.descriptor,
20
+ funding: state.funding,
21
+ walletBirthTime: state.walletBirthTime,
22
+ managedCoreWallet: {
23
+ walletName: state.managedCoreWallet.walletName,
24
+ internalPassphrase: state.managedCoreWallet.internalPassphrase,
25
+ descriptorChecksum: state.managedCoreWallet.descriptorChecksum,
26
+ walletAddress: state.managedCoreWallet.walletAddress,
27
+ walletScriptPubKeyHex: state.managedCoreWallet.walletScriptPubKeyHex,
28
+ proofStatus: state.managedCoreWallet.proofStatus,
29
+ lastImportedAtUnixMs: state.managedCoreWallet.lastImportedAtUnixMs,
30
+ lastVerifiedAtUnixMs: state.managedCoreWallet.lastVerifiedAtUnixMs,
31
+ },
32
+ domains: state.domains.map((domain) => ({
33
+ name: domain.name,
34
+ domainId: domain.domainId,
35
+ currentOwnerScriptPubKeyHex: domain.currentOwnerScriptPubKeyHex,
36
+ canonicalChainStatus: domain.canonicalChainStatus,
37
+ foundingMessageText: domain.foundingMessageText,
38
+ birthTime: domain.birthTime,
39
+ })),
40
+ miningState: state.miningState,
41
+ pendingMutations: state.pendingMutations,
42
+ };
43
+ }
9
44
  export async function loadRawWalletStateEnvelope(paths) {
10
45
  try {
11
46
  return {
@@ -43,6 +78,12 @@ export function extractWalletRootIdHintFromWalletStateEnvelope(envelope) {
43
78
  }
44
79
  return keyId.slice(prefix.length);
45
80
  }
81
+ async function loadWalletStateEnvelope(envelope, access) {
82
+ if (envelope.secretProvider == null) {
83
+ throw new Error("wallet_state_legacy_envelope_unsupported");
84
+ }
85
+ return normalizeWalletStateRecord(await decryptJsonWithSecretProvider(envelope, access.provider));
86
+ }
46
87
  export async function saveWalletState(paths, state, access) {
47
88
  let previousPrimary = null;
48
89
  try {
@@ -56,15 +97,10 @@ export async function saveWalletState(paths, state, access) {
56
97
  throw error;
57
98
  }
58
99
  }
59
- const envelope = typeof access === "string" || access instanceof Uint8Array
60
- ? await encryptJsonWithPassphrase(state, access, {
61
- format: "cogcoin-local-wallet-state",
62
- walletRootIdHint: state.walletRootId,
63
- })
64
- : await encryptJsonWithSecretProvider(state, access.provider, access.secretReference, {
65
- format: "cogcoin-local-wallet-state",
66
- walletRootIdHint: state.walletRootId,
67
- });
100
+ const envelope = await encryptJsonWithSecretProvider(serializeWalletState(state), access.provider, access.secretReference, {
101
+ format: "cogcoin-local-wallet-state",
102
+ walletRootIdHint: state.walletRootId,
103
+ });
68
104
  await writeJsonFileAtomic(paths.primaryPath, envelope, { mode: 0o600 });
69
105
  if (previousPrimary !== null) {
70
106
  await writeJsonFileAtomic(paths.backupPath, previousPrimary, { mode: 0o600 });
@@ -74,18 +110,14 @@ export async function loadWalletState(paths, access) {
74
110
  try {
75
111
  return {
76
112
  source: "primary",
77
- state: normalizeWalletStateRecord(typeof access === "string" || access instanceof Uint8Array
78
- ? await decryptJsonWithPassphrase(await readEnvelope(paths.primaryPath), access)
79
- : await decryptJsonWithSecretProvider(await readEnvelope(paths.primaryPath), access.provider)),
113
+ state: await loadWalletStateEnvelope(await readEnvelope(paths.primaryPath), access),
80
114
  };
81
115
  }
82
116
  catch (primaryError) {
83
117
  try {
84
118
  return {
85
119
  source: "backup",
86
- state: normalizeWalletStateRecord(typeof access === "string" || access instanceof Uint8Array
87
- ? await decryptJsonWithPassphrase(await readEnvelope(paths.backupPath), access)
88
- : await decryptJsonWithSecretProvider(await readEnvelope(paths.backupPath), access.provider)),
120
+ state: await loadWalletStateEnvelope(await readEnvelope(paths.backupPath), access),
89
121
  };
90
122
  }
91
123
  catch {
@@ -1,24 +1,22 @@
1
1
  import { attachOrStartManagedBitcoindService } from "../../bitcoind/service.js";
2
2
  import { createRpcClient } from "../../bitcoind/node.js";
3
- import type { RpcTransaction } from "../../bitcoind/types.js";
4
3
  import type { WalletPrompter } from "../lifecycle.js";
5
4
  import { type WalletRuntimePaths } from "../runtime.js";
6
5
  import { type WalletSecretProvider } from "../state/provider.js";
7
- import type { ProactiveFamilyStateRecord } from "../types.js";
8
6
  import { openWalletReadContext } from "../read/index.js";
9
- import { type WalletMutationRpcClient } from "./common.js";
7
+ import { type WalletMutationFeeSummary, type WalletMutationRpcClient } from "./common.js";
10
8
  interface WalletAnchorRpcClient extends WalletMutationRpcClient {
11
9
  getBlockchainInfo(): Promise<{
12
10
  blocks: number;
13
11
  }>;
14
12
  sendRawTransaction(hex: string): Promise<string>;
15
13
  getRawMempool(): Promise<string[]>;
16
- getRawTransaction(txid: string, verbose?: boolean): Promise<RpcTransaction>;
17
14
  }
18
15
  export interface AnchorDomainOptions {
19
16
  domainName: string;
20
17
  foundingMessageText?: string | null;
21
18
  promptForFoundingMessageWhenMissing?: boolean;
19
+ feeRateSatVb?: number | null;
22
20
  dataDir: string;
23
21
  databasePath: string;
24
22
  provider?: WalletSecretProvider;
@@ -32,33 +30,10 @@ export interface AnchorDomainOptions {
32
30
  export interface AnchorDomainResult {
33
31
  domainName: string;
34
32
  txid: string;
35
- tx1Txid: string;
36
- tx2Txid: string;
37
- dedicatedIndex: number;
38
33
  status: "live" | "confirmed";
39
34
  reusedExisting: boolean;
40
35
  foundingMessageText?: string | null;
41
- }
42
- export interface ClearPendingAnchorOptions {
43
- domainName: string;
44
- dataDir: string;
45
- databasePath: string;
46
- provider?: WalletSecretProvider;
47
- prompter: WalletPrompter;
48
- assumeYes?: boolean;
49
- nowUnixMs?: number;
50
- paths?: WalletRuntimePaths;
51
- openReadContext?: typeof openWalletReadContext;
52
- attachService?: typeof attachOrStartManagedBitcoindService;
53
- rpcFactory?: (config: Parameters<typeof createRpcClient>[0]) => WalletAnchorRpcClient;
54
- }
55
- export interface ClearPendingAnchorResult {
56
- domainName: string;
57
- cleared: boolean;
58
- previousFamilyStatus: ProactiveFamilyStateRecord["status"] | null;
59
- previousFamilyStep: ProactiveFamilyStateRecord["currentStep"] | null;
60
- releasedDedicatedIndex: number | null;
36
+ fees: WalletMutationFeeSummary;
61
37
  }
62
38
  export declare function anchorDomain(options: AnchorDomainOptions): Promise<AnchorDomainResult>;
63
- export declare function clearPendingAnchor(options: ClearPendingAnchorOptions): Promise<ClearPendingAnchorResult>;
64
39
  export {};