@mem-cash/electrum 0.0.1

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 (70) hide show
  1. package/README.md +143 -0
  2. package/dist/address.d.ts +20 -0
  3. package/dist/address.d.ts.map +1 -0
  4. package/dist/address.js +51 -0
  5. package/dist/address.js.map +1 -0
  6. package/dist/dispatch.d.ts +18 -0
  7. package/dist/dispatch.d.ts.map +1 -0
  8. package/dist/dispatch.js +108 -0
  9. package/dist/dispatch.js.map +1 -0
  10. package/dist/headers.d.ts +14 -0
  11. package/dist/headers.d.ts.map +1 -0
  12. package/dist/headers.js +156 -0
  13. package/dist/headers.js.map +1 -0
  14. package/dist/index.d.ts +16 -0
  15. package/dist/index.d.ts.map +1 -0
  16. package/dist/index.js +11 -0
  17. package/dist/index.js.map +1 -0
  18. package/dist/indexer.d.ts +42 -0
  19. package/dist/indexer.d.ts.map +1 -0
  20. package/dist/indexer.js +216 -0
  21. package/dist/indexer.js.map +1 -0
  22. package/dist/memCash.d.ts +40 -0
  23. package/dist/memCash.d.ts.map +1 -0
  24. package/dist/memCash.js +212 -0
  25. package/dist/memCash.js.map +1 -0
  26. package/dist/mempool.d.ts +6 -0
  27. package/dist/mempool.d.ts.map +1 -0
  28. package/dist/mempool.js +46 -0
  29. package/dist/mempool.js.map +1 -0
  30. package/dist/schema.d.ts +638 -0
  31. package/dist/schema.d.ts.map +1 -0
  32. package/dist/schema.js +3 -0
  33. package/dist/schema.js.map +1 -0
  34. package/dist/scripthash.d.ts +18 -0
  35. package/dist/scripthash.d.ts.map +1 -0
  36. package/dist/scripthash.js +164 -0
  37. package/dist/scripthash.js.map +1 -0
  38. package/dist/server.d.ts +20 -0
  39. package/dist/server.d.ts.map +1 -0
  40. package/dist/server.js +120 -0
  41. package/dist/server.js.map +1 -0
  42. package/dist/stubs.d.ts +12 -0
  43. package/dist/stubs.d.ts.map +1 -0
  44. package/dist/stubs.js +16 -0
  45. package/dist/stubs.js.map +1 -0
  46. package/dist/test.d.ts +8 -0
  47. package/dist/test.d.ts.map +1 -0
  48. package/dist/test.js +240 -0
  49. package/dist/test.js.map +1 -0
  50. package/dist/testUtils.d.ts +20 -0
  51. package/dist/testUtils.d.ts.map +1 -0
  52. package/dist/testUtils.js +29 -0
  53. package/dist/testUtils.js.map +1 -0
  54. package/dist/transaction.d.ts +28 -0
  55. package/dist/transaction.d.ts.map +1 -0
  56. package/dist/transaction.js +318 -0
  57. package/dist/transaction.js.map +1 -0
  58. package/dist/transport.d.ts +24 -0
  59. package/dist/transport.d.ts.map +1 -0
  60. package/dist/transport.js +16 -0
  61. package/dist/transport.js.map +1 -0
  62. package/dist/types.d.ts +85 -0
  63. package/dist/types.d.ts.map +1 -0
  64. package/dist/types.js +58 -0
  65. package/dist/types.js.map +1 -0
  66. package/dist/utxo.d.ts +4 -0
  67. package/dist/utxo.d.ts.map +1 -0
  68. package/dist/utxo.js +39 -0
  69. package/dist/utxo.js.map +1 -0
  70. package/package.json +53 -0
@@ -0,0 +1 @@
1
+ {"version":3,"file":"scripthash.d.ts","sourceRoot":"","sources":["../src/scripthash.ts"],"names":[],"mappings":"AACA,OAAO,EAGN,KAAK,aAAa,EAGlB,KAAK,eAAe,EAGpB,MAAM,YAAY,CAAC;AAEpB,wCAAwC;AACxC,wBAAgB,UAAU,CAAC,GAAG,EAAE,eAAe,EAAE,MAAM,EAAE,OAAO,EAAE,GAAG,aAAa,CASjF;AAED,wCAAwC;AACxC,wBAAgB,UAAU,CAAC,GAAG,EAAE,eAAe,EAAE,MAAM,EAAE,OAAO,EAAE,GAAG,aAAa,CAsCjF;AAED,wCAAwC;AACxC,wBAAgB,UAAU,CAAC,GAAG,EAAE,eAAe,EAAE,MAAM,EAAE,OAAO,EAAE,GAAG,aAAa,CAmBjF;AAyBD,wCAAwC;AACxC,wBAAgB,WAAW,CAAC,GAAG,EAAE,eAAe,EAAE,MAAM,EAAE,OAAO,EAAE,GAAG,aAAa,CA+BlF;AAED,sCAAsC;AACtC,wBAAgB,SAAS,CAAC,GAAG,EAAE,eAAe,EAAE,MAAM,EAAE,OAAO,EAAE,GAAG,aAAa,CAWhF;AAED,wCAAwC;AACxC,wBAAgB,WAAW,CAAC,GAAG,EAAE,eAAe,EAAE,MAAM,EAAE,OAAO,EAAE,GAAG,aAAa,CAUlF;AAED,+FAA+F;AAC/F,wBAAgB,WAAW,CAAC,GAAG,EAAE,eAAe,EAAE,MAAM,EAAE,OAAO,EAAE,GAAG,aAAa,CA4BlF;AAED,gGAAgG;AAChG,wBAAgB,SAAS,CAAC,GAAG,EAAE,eAAe,EAAE,MAAM,EAAE,OAAO,EAAE,GAAG,aAAa,CAMhF"}
@@ -0,0 +1,164 @@
1
+ import { ERR_BAD_REQUEST, err, invalidParams, ok, validateNonNegativeInt, validateScriptHash, } from "./types.js";
2
+ /** blockchain.scripthash.get_balance */
3
+ export function getBalance(ctx, params) {
4
+ const scriptHash = validateScriptHash(params[0]);
5
+ if (scriptHash === null)
6
+ return invalidParams("Invalid scripthash");
7
+ const balance = ctx.node.getBalance(scriptHash);
8
+ return ok({
9
+ confirmed: Number(balance.confirmed),
10
+ unconfirmed: Number(balance.unconfirmed),
11
+ });
12
+ }
13
+ /** blockchain.scripthash.get_history */
14
+ export function getHistory(ctx, params) {
15
+ const scriptHash = validateScriptHash(params[0]);
16
+ if (scriptHash === null)
17
+ return invalidParams("Invalid scripthash");
18
+ let fromHeight;
19
+ if (params[1] !== undefined && params[1] !== null) {
20
+ const h = validateNonNegativeInt(params[1]);
21
+ if (h === null)
22
+ return invalidParams("Invalid from_height");
23
+ fromHeight = h;
24
+ }
25
+ let toHeight;
26
+ if (params[2] !== undefined && params[2] !== null) {
27
+ if (typeof params[2] !== "number")
28
+ return invalidParams("Invalid to_height");
29
+ // Negative values (e.g. -1) mean "no upper bound"
30
+ if (params[2] >= 0)
31
+ toHeight = params[2];
32
+ }
33
+ const confirmed = ctx.node.getHistory(scriptHash, fromHeight, toHeight);
34
+ // Include mempool only when no upper height bound is specified
35
+ const mempool = toHeight === undefined ? ctx.node.getMempoolHistory(scriptHash) : [];
36
+ const result = [];
37
+ for (const entry of confirmed) {
38
+ result.push({ tx_hash: entry.txHash, height: entry.height });
39
+ }
40
+ for (const entry of mempool) {
41
+ const item = {
42
+ tx_hash: entry.txHash,
43
+ height: entry.height,
44
+ };
45
+ if (entry.fee !== undefined) {
46
+ item.fee = Number(entry.fee);
47
+ }
48
+ result.push(item);
49
+ }
50
+ return ok(result);
51
+ }
52
+ /** blockchain.scripthash.get_mempool */
53
+ export function getMempool(ctx, params) {
54
+ const scriptHash = validateScriptHash(params[0]);
55
+ if (scriptHash === null)
56
+ return invalidParams("Invalid scripthash");
57
+ const mempool = ctx.node.getMempoolHistory(scriptHash);
58
+ const result = [];
59
+ for (const entry of mempool) {
60
+ const item = {
61
+ tx_hash: entry.txHash,
62
+ height: entry.height,
63
+ };
64
+ if (entry.fee !== undefined) {
65
+ item.fee = Number(entry.fee);
66
+ }
67
+ result.push(item);
68
+ }
69
+ return ok(result);
70
+ }
71
+ /** Format token data for the protocol response. */
72
+ function formatTokenData(td) {
73
+ const result = {
74
+ category: td.category,
75
+ amount: td.amount.toString(),
76
+ };
77
+ if (td.nft) {
78
+ result.nft = {
79
+ capability: td.nft.capability,
80
+ commitment: td.nft.commitment,
81
+ };
82
+ }
83
+ return result;
84
+ }
85
+ /** blockchain.scripthash.listunspent */
86
+ export function listUnspent(ctx, params) {
87
+ const scriptHash = validateScriptHash(params[0]);
88
+ if (scriptHash === null)
89
+ return invalidParams("Invalid scripthash");
90
+ const utxos = ctx.node.getUtxos(scriptHash);
91
+ const result = [];
92
+ for (const utxo of utxos) {
93
+ const item = {
94
+ tx_hash: utxo.outpoint.txid,
95
+ tx_pos: utxo.outpoint.vout,
96
+ height: utxo.height,
97
+ value: Number(utxo.satoshis),
98
+ };
99
+ if (utxo.tokenData) {
100
+ item.token_data = formatTokenData(utxo.tokenData);
101
+ }
102
+ result.push(item);
103
+ }
104
+ return ok(result);
105
+ }
106
+ /** blockchain.scripthash.subscribe */
107
+ export function subscribe(ctx, params) {
108
+ const scriptHash = validateScriptHash(params[0]);
109
+ if (scriptHash === null)
110
+ return invalidParams("Invalid scripthash");
111
+ const status = ctx.node.getScriptHashStatus(scriptHash);
112
+ if (ctx.subscribeScriptHash) {
113
+ ctx.subscribeScriptHash(scriptHash);
114
+ }
115
+ return ok(status);
116
+ }
117
+ /** blockchain.scripthash.unsubscribe */
118
+ export function unsubscribe(ctx, params) {
119
+ const scriptHash = validateScriptHash(params[0]);
120
+ if (scriptHash === null)
121
+ return invalidParams("Invalid scripthash");
122
+ if (!ctx.unsubscribeScriptHash) {
123
+ return err(ERR_BAD_REQUEST, "Subscriptions not supported");
124
+ }
125
+ const wasSubscribed = ctx.unsubscribeScriptHash(scriptHash);
126
+ return ok(wasSubscribed);
127
+ }
128
+ /** blockchain.scripthash.get_first_use — first confirmed or mempool tx for this scripthash. */
129
+ export function getFirstUse(ctx, params) {
130
+ const scriptHash = validateScriptHash(params[0]);
131
+ if (scriptHash === null)
132
+ return invalidParams("Invalid scripthash");
133
+ // Confirmed history is sorted by height ascending — first entry is first use
134
+ const confirmed = ctx.node.getHistory(scriptHash);
135
+ const firstConfirmed = confirmed[0];
136
+ if (firstConfirmed) {
137
+ const header = ctx.node.getHeader(firstConfirmed.height);
138
+ return ok({
139
+ block_hash: header?.hash ?? "0".repeat(64),
140
+ height: firstConfirmed.height,
141
+ tx_hash: firstConfirmed.txHash,
142
+ });
143
+ }
144
+ // Fall back to mempool
145
+ const mempool = ctx.node.getMempoolHistory(scriptHash);
146
+ const firstMempool = mempool[0];
147
+ if (firstMempool) {
148
+ return ok({
149
+ block_hash: "0".repeat(64),
150
+ height: 0,
151
+ tx_hash: firstMempool.txHash,
152
+ });
153
+ }
154
+ return ok(null);
155
+ }
156
+ /** blockchain.scripthash.get_status (Fulcrum extension — like subscribe without registering) */
157
+ export function getStatus(ctx, params) {
158
+ const scriptHash = validateScriptHash(params[0]);
159
+ if (scriptHash === null)
160
+ return invalidParams("Invalid scripthash");
161
+ const status = ctx.node.getScriptHashStatus(scriptHash);
162
+ return ok(status);
163
+ }
164
+ //# sourceMappingURL=scripthash.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"scripthash.js","sourceRoot":"","sources":["../src/scripthash.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,20 @@
1
+ import { type HandlerResult, type ProtocolContext } from "./types.js";
2
+ /** server.version */
3
+ export declare function version(ctx: ProtocolContext, params: unknown[]): HandlerResult;
4
+ /** server.ping */
5
+ export declare function ping(_ctx: ProtocolContext, _params: unknown[]): HandlerResult;
6
+ /** server.features */
7
+ export declare function features(ctx: ProtocolContext, _params: unknown[]): HandlerResult;
8
+ /** blockchain.estimatefee */
9
+ export declare function estimateFee(ctx: ProtocolContext, params: unknown[]): Promise<HandlerResult>;
10
+ /** server.banner */
11
+ export declare function banner(ctx: ProtocolContext, _params: unknown[]): HandlerResult;
12
+ /** server.donation_address */
13
+ export declare function donationAddress(ctx: ProtocolContext, _params: unknown[]): HandlerResult;
14
+ /** server.add_peer — stub (P2P not implemented). */
15
+ export declare function addPeer(_ctx: ProtocolContext, _params: unknown[]): HandlerResult;
16
+ /** server.peers.subscribe — stub (P2P not implemented). */
17
+ export declare function peersSubscribe(_ctx: ProtocolContext, _params: unknown[]): HandlerResult;
18
+ /** blockchain.relayfee */
19
+ export declare function relayFee(ctx: ProtocolContext, _params: unknown[]): HandlerResult;
20
+ //# sourceMappingURL=server.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"server.d.ts","sourceRoot":"","sources":["../src/server.ts"],"names":[],"mappings":"AAAA,OAAO,EAGN,KAAK,aAAa,EAGlB,KAAK,eAAe,EACpB,MAAM,YAAY,CAAC;AAsBpB,qBAAqB;AACrB,wBAAgB,OAAO,CAAC,GAAG,EAAE,eAAe,EAAE,MAAM,EAAE,OAAO,EAAE,GAAG,aAAa,CA6C9E;AAED,kBAAkB;AAClB,wBAAgB,IAAI,CAAC,IAAI,EAAE,eAAe,EAAE,OAAO,EAAE,OAAO,EAAE,GAAG,aAAa,CAE7E;AAED,sBAAsB;AACtB,wBAAgB,QAAQ,CAAC,GAAG,EAAE,eAAe,EAAE,OAAO,EAAE,OAAO,EAAE,GAAG,aAAa,CAShF;AAED,6BAA6B;AAC7B,wBAAsB,WAAW,CAAC,GAAG,EAAE,eAAe,EAAE,MAAM,EAAE,OAAO,EAAE,GAAG,OAAO,CAAC,aAAa,CAAC,CAgBjG;AAED,oBAAoB;AACpB,wBAAgB,MAAM,CAAC,GAAG,EAAE,eAAe,EAAE,OAAO,EAAE,OAAO,EAAE,GAAG,aAAa,CAE9E;AAED,8BAA8B;AAC9B,wBAAgB,eAAe,CAAC,GAAG,EAAE,eAAe,EAAE,OAAO,EAAE,OAAO,EAAE,GAAG,aAAa,CAEvF;AAED,oDAAoD;AACpD,wBAAgB,OAAO,CAAC,IAAI,EAAE,eAAe,EAAE,OAAO,EAAE,OAAO,EAAE,GAAG,aAAa,CAEhF;AAED,2DAA2D;AAC3D,wBAAgB,cAAc,CAAC,IAAI,EAAE,eAAe,EAAE,OAAO,EAAE,OAAO,EAAE,GAAG,aAAa,CAEvF;AAED,0BAA0B;AAC1B,wBAAgB,QAAQ,CAAC,GAAG,EAAE,eAAe,EAAE,OAAO,EAAE,OAAO,EAAE,GAAG,aAAa,CAOhF"}
package/dist/server.js ADDED
@@ -0,0 +1,120 @@
1
+ import { ERR_BAD_REQUEST, err, invalidParams, ok, } from "./types.js";
2
+ /**
3
+ * Parse a version string like "1.4" into [major, minor].
4
+ * Returns null if invalid.
5
+ */
6
+ function parseVersion(v) {
7
+ const parts = v.split(".");
8
+ if (parts.length !== 2)
9
+ return null;
10
+ const major = Number(parts[0]);
11
+ const minor = Number(parts[1]);
12
+ if (!Number.isInteger(major) || !Number.isInteger(minor))
13
+ return null;
14
+ return [major, minor];
15
+ }
16
+ /** Compare two version tuples. Returns -1, 0, or 1. */
17
+ function compareVersions(a, b) {
18
+ if (a[0] !== b[0])
19
+ return a[0] < b[0] ? -1 : 1;
20
+ if (a[1] !== b[1])
21
+ return a[1] < b[1] ? -1 : 1;
22
+ return 0;
23
+ }
24
+ /** server.version */
25
+ export function version(ctx, params) {
26
+ if (params.length < 2)
27
+ return invalidParams("Expected [client_name, protocol_version]");
28
+ // params[0] is client name (informational)
29
+ // params[1] is either a version string or [min, max] array
30
+ const clientVersionParam = params[1];
31
+ let clientMin;
32
+ let clientMax;
33
+ if (typeof clientVersionParam === "string") {
34
+ clientMin = clientVersionParam;
35
+ clientMax = clientVersionParam;
36
+ }
37
+ else if (Array.isArray(clientVersionParam) &&
38
+ clientVersionParam.length === 2 &&
39
+ typeof clientVersionParam[0] === "string" &&
40
+ typeof clientVersionParam[1] === "string") {
41
+ clientMin = clientVersionParam[0];
42
+ clientMax = clientVersionParam[1];
43
+ }
44
+ else {
45
+ return invalidParams("Invalid protocol version parameter");
46
+ }
47
+ const serverMin = parseVersion(ctx.protocolMin);
48
+ const serverMax = parseVersion(ctx.protocolMax);
49
+ const cMin = parseVersion(clientMin);
50
+ const cMax = parseVersion(clientMax);
51
+ if (!serverMin || !serverMax || !cMin || !cMax) {
52
+ return err(ERR_BAD_REQUEST, "Version negotiation failed");
53
+ }
54
+ // Negotiate: find the highest version supported by both sides
55
+ // Overlap exists if cMax >= serverMin && serverMax >= cMin
56
+ if (compareVersions(cMax, serverMin) < 0 || compareVersions(serverMax, cMin) < 0) {
57
+ return err(ERR_BAD_REQUEST, "Version negotiation failed — no compatible protocol version");
58
+ }
59
+ // Negotiated version = min(cMax, serverMax)
60
+ const negotiated = compareVersions(cMax, serverMax) <= 0 ? cMax : serverMax;
61
+ const negotiatedStr = `${negotiated[0]}.${negotiated[1]}`;
62
+ return ok([ctx.serverVersion, negotiatedStr]);
63
+ }
64
+ /** server.ping */
65
+ export function ping(_ctx, _params) {
66
+ return ok(null);
67
+ }
68
+ /** server.features */
69
+ export function features(ctx, _params) {
70
+ return ok({
71
+ genesis_hash: ctx.genesisHash,
72
+ server_version: ctx.serverVersion,
73
+ protocol_min: ctx.protocolMin,
74
+ protocol_max: ctx.protocolMax,
75
+ hash_function: ctx.hashFunction,
76
+ pruning: null,
77
+ });
78
+ }
79
+ /** blockchain.estimatefee */
80
+ export async function estimateFee(ctx, params) {
81
+ const blocks = params[0];
82
+ if (typeof blocks !== "number" || !Number.isInteger(blocks) || blocks < 1) {
83
+ return invalidParams("Invalid number of blocks");
84
+ }
85
+ if (!ctx.estimateFee) {
86
+ return ok(-1);
87
+ }
88
+ try {
89
+ const fee = await ctx.estimateFee(blocks);
90
+ return ok(fee);
91
+ }
92
+ catch {
93
+ return ok(-1);
94
+ }
95
+ }
96
+ /** server.banner */
97
+ export function banner(ctx, _params) {
98
+ return ok(ctx.banner ?? "");
99
+ }
100
+ /** server.donation_address */
101
+ export function donationAddress(ctx, _params) {
102
+ return ok(ctx.donationAddress ?? "");
103
+ }
104
+ /** server.add_peer — stub (P2P not implemented). */
105
+ export function addPeer(_ctx, _params) {
106
+ return ok(false);
107
+ }
108
+ /** server.peers.subscribe — stub (P2P not implemented). */
109
+ export function peersSubscribe(_ctx, _params) {
110
+ return ok([]);
111
+ }
112
+ /** blockchain.relayfee */
113
+ export function relayFee(ctx, _params) {
114
+ if (!ctx.getRelayFee) {
115
+ // Default BCH relay fee: 1000 sat/kB = 0.00001 BCH/kB
116
+ return ok(0.00001);
117
+ }
118
+ return ok(ctx.getRelayFee());
119
+ }
120
+ //# sourceMappingURL=server.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"server.js","sourceRoot":"","sources":["../src/server.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,12 @@
1
+ import { type HandlerResult, type ProtocolContext } from "./types.js";
2
+ /** blockchain.rpa.get_history — not supported (Reusable Payment Address protocol). */
3
+ export declare const rpaGetHistory: (_ctx: ProtocolContext, _params: unknown[]) => HandlerResult;
4
+ /** blockchain.rpa.get_mempool — not supported. */
5
+ export declare const rpaGetMempool: (_ctx: ProtocolContext, _params: unknown[]) => HandlerResult;
6
+ /** blockchain.reusable.get_history — not supported (legacy RPA alias). */
7
+ export declare const reusableGetHistory: (_ctx: ProtocolContext, _params: unknown[]) => HandlerResult;
8
+ /** blockchain.reusable.get_mempool — not supported (legacy RPA alias). */
9
+ export declare const reusableGetMempool: (_ctx: ProtocolContext, _params: unknown[]) => HandlerResult;
10
+ /** daemon.passthrough — not supported (requires bitcoind connection). */
11
+ export declare const daemonPassthrough: (_ctx: ProtocolContext, _params: unknown[]) => HandlerResult;
12
+ //# sourceMappingURL=stubs.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"stubs.d.ts","sourceRoot":"","sources":["../src/stubs.ts"],"names":[],"mappings":"AAAA,OAAO,EAAwB,KAAK,aAAa,EAAE,KAAK,eAAe,EAAE,MAAM,YAAY,CAAC;AAS5F,sFAAsF;AACtF,eAAO,MAAM,aAAa,SALhB,eAAe,WAAW,OAAO,EAAE,KAAK,aAKqB,CAAC;AAExE,kDAAkD;AAClD,eAAO,MAAM,aAAa,SARhB,eAAe,WAAW,OAAO,EAAE,KAAK,aAQqB,CAAC;AAExE,0EAA0E;AAC1E,eAAO,MAAM,kBAAkB,SAXrB,eAAe,WAAW,OAAO,EAAE,KAAK,aAW+B,CAAC;AAElF,0EAA0E;AAC1E,eAAO,MAAM,kBAAkB,SAdrB,eAAe,WAAW,OAAO,EAAE,KAAK,aAc+B,CAAC;AAElF,yEAAyE;AACzE,eAAO,MAAM,iBAAiB,SAjBpB,eAAe,WAAW,OAAO,EAAE,KAAK,aAiBiB,CAAC"}
package/dist/stubs.js ADDED
@@ -0,0 +1,16 @@
1
+ import { ERR_BAD_REQUEST, err } from "./types.js";
2
+ /** Stub handler for methods that are not supported in Phase 1. */
3
+ function notSupported(method) {
4
+ return () => err(ERR_BAD_REQUEST, `${method} is not supported`);
5
+ }
6
+ /** blockchain.rpa.get_history — not supported (Reusable Payment Address protocol). */
7
+ export const rpaGetHistory = notSupported("blockchain.rpa.get_history");
8
+ /** blockchain.rpa.get_mempool — not supported. */
9
+ export const rpaGetMempool = notSupported("blockchain.rpa.get_mempool");
10
+ /** blockchain.reusable.get_history — not supported (legacy RPA alias). */
11
+ export const reusableGetHistory = notSupported("blockchain.reusable.get_history");
12
+ /** blockchain.reusable.get_mempool — not supported (legacy RPA alias). */
13
+ export const reusableGetMempool = notSupported("blockchain.reusable.get_mempool");
14
+ /** daemon.passthrough — not supported (requires bitcoind connection). */
15
+ export const daemonPassthrough = notSupported("daemon.passthrough");
16
+ //# sourceMappingURL=stubs.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"stubs.js","sourceRoot":"","sources":["../src/stubs.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,eAAe,EAAE,GAAG,EAA4C,MAAM,YAAY,CAAC;AAE5F,kEAAkE;AAClE,SAAS,YAAY,CACpB,MAAc;IAEd,OAAO,GAAG,EAAE,CAAC,GAAG,CAAC,eAAe,EAAE,GAAG,MAAM,mBAAmB,CAAC,CAAC;AACjE,CAAC;AAED,sFAAsF;AACtF,MAAM,CAAC,MAAM,aAAa,GAAG,YAAY,CAAC,4BAA4B,CAAC,CAAC;AAExE,kDAAkD;AAClD,MAAM,CAAC,MAAM,aAAa,GAAG,YAAY,CAAC,4BAA4B,CAAC,CAAC;AAExE,0EAA0E;AAC1E,MAAM,CAAC,MAAM,kBAAkB,GAAG,YAAY,CAAC,iCAAiC,CAAC,CAAC;AAElF,0EAA0E;AAC1E,MAAM,CAAC,MAAM,kBAAkB,GAAG,YAAY,CAAC,iCAAiC,CAAC,CAAC;AAElF,yEAAyE;AACzE,MAAM,CAAC,MAAM,iBAAiB,GAAG,YAAY,CAAC,oBAAoB,CAAC,CAAC"}
package/dist/test.d.ts ADDED
@@ -0,0 +1,8 @@
1
+ import type { TestableStorage } from "@mem-cash/storage";
2
+ import type { Handler } from "./types.js";
3
+ /**
4
+ * Create test.* protocol handlers for development and testing.
5
+ * These handlers provide direct manipulation of chain state via RPC.
6
+ */
7
+ export declare function createTestHandlers(storage: TestableStorage): ReadonlyMap<string, Handler>;
8
+ //# sourceMappingURL=test.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"test.d.ts","sourceRoot":"","sources":["../src/test.ts"],"names":[],"mappings":"AAQA,OAAO,KAAK,EAAE,eAAe,EAAE,MAAM,mBAAmB,CAAC;AAEzD,OAAO,KAAK,EAAE,OAAO,EAAiB,MAAM,YAAY,CAAC;AAGzD;;;GAGG;AACH,wBAAgB,kBAAkB,CAAC,OAAO,EAAE,eAAe,GAAG,WAAW,CAAC,MAAM,EAAE,OAAO,CAAC,CAgPzF"}
package/dist/test.js ADDED
@@ -0,0 +1,240 @@
1
+ import { binToHex, cashAddressToLockingBytecode, encodeTransactionBch, hexToBin, sha256, utf8ToBin, } from "@bitauth/libauth";
2
+ import { invalidParams, ok } from "./types.js";
3
+ /**
4
+ * Create test.* protocol handlers for development and testing.
5
+ * These handlers provide direct manipulation of chain state via RPC.
6
+ */
7
+ export function createTestHandlers(storage) {
8
+ const handlers = new Map();
9
+ // Counter for synthetic coinbase transactions (ensures unique txids).
10
+ let syntheticCounter = 0;
11
+ // test.set_chain_tip [height, timestamp]
12
+ // Adds 11 headers with the given timestamp to set both tip and MTP.
13
+ handlers.set("test.set_chain_tip", (_ctx, params) => {
14
+ if (params.length < 2)
15
+ return invalidParams("Expected [height, timestamp]");
16
+ const height = params[0];
17
+ const timestamp = params[1];
18
+ if (typeof height !== "number" || !Number.isInteger(height) || height < 0) {
19
+ return invalidParams("height must be a non-negative integer");
20
+ }
21
+ if (typeof timestamp !== "number" || !Number.isInteger(timestamp) || timestamp < 0) {
22
+ return invalidParams("timestamp must be a non-negative integer");
23
+ }
24
+ const startHeight = Math.max(0, height - 10);
25
+ for (let h = startHeight; h <= height; h++) {
26
+ const hash = h.toString(16).padStart(64, "0");
27
+ storage._test.header.add({
28
+ hash,
29
+ height: h,
30
+ timestamp,
31
+ });
32
+ }
33
+ return ok(true);
34
+ });
35
+ // test.add_utxo [address, utxo]
36
+ // Builds a synthetic transaction, derives the real txid, and stores the
37
+ // UTXO together with its history entry and raw transaction record.
38
+ // Returns { txid } — the derived txid backed by the synthetic raw tx.
39
+ handlers.set("test.add_utxo", (ctx, params) => {
40
+ if (params.length < 2) {
41
+ return invalidParams("Expected [address, utxo]");
42
+ }
43
+ const address = params[0];
44
+ const utxoParam = params[1];
45
+ if (typeof address !== "string") {
46
+ return invalidParams("address must be a string");
47
+ }
48
+ if (typeof utxoParam !== "object" || utxoParam === null) {
49
+ return invalidParams("utxo must be an object");
50
+ }
51
+ const utxo = utxoParam;
52
+ const vout = utxo.vout ?? 0;
53
+ const satoshis = BigInt(utxo.satoshis);
54
+ const height = utxo.height ?? 100;
55
+ // Decode address → locking bytecode + scripthash
56
+ const decoded = cashAddressToLockingBytecode(address);
57
+ if (typeof decoded === "string") {
58
+ return invalidParams(`Invalid address: ${decoded}`);
59
+ }
60
+ const { bytecode } = decoded;
61
+ const scriptHash = binToHex(sha256.hash(bytecode));
62
+ // Parse token data
63
+ let tokenData;
64
+ let libTokenData;
65
+ if (utxo.token) {
66
+ const result = {
67
+ category: utxo.token.category,
68
+ amount: BigInt(utxo.token.amount),
69
+ };
70
+ if (utxo.token.nft) {
71
+ result.nft = {
72
+ commitment: utxo.token.nft.commitment,
73
+ capability: utxo.token.nft.capability,
74
+ };
75
+ }
76
+ tokenData = result;
77
+ libTokenData = {
78
+ category: hexToBin(utxo.token.category),
79
+ amount: BigInt(utxo.token.amount),
80
+ };
81
+ if (utxo.token.nft) {
82
+ libTokenData.nft = {
83
+ capability: utxo.token.nft.capability,
84
+ commitment: hexToBin(utxo.token.nft.commitment),
85
+ };
86
+ }
87
+ }
88
+ // Build synthetic transaction and derive txid
89
+ const rawHex = buildSyntheticUtxoTx(bytecode, satoshis, vout, syntheticCounter++, libTokenData);
90
+ const txid = deriveTxid(rawHex);
91
+ // Store UTXO
92
+ storage._test.utxo.add(Object.assign({ txid, vout, satoshis, scriptHash, height, lockingBytecode: bytecode }, tokenData !== undefined ? { tokenData } : {}));
93
+ // Add history entry and transaction record
94
+ storage._test.history.add({ scriptHash, entries: [{ txHash: txid, height }] });
95
+ storage._test.tx.add({ txid, height, rawHex });
96
+ // Notify subscribers
97
+ ctx.node.subscriptions.notifyChanges(new Set([scriptHash]));
98
+ return ok({ txid });
99
+ });
100
+ // test.remove_utxo [txid, vout]
101
+ handlers.set("test.remove_utxo", (_ctx, params) => {
102
+ if (params.length < 2)
103
+ return invalidParams("Expected [txid, vout]");
104
+ const txid = params[0];
105
+ const vout = params[1];
106
+ if (typeof txid !== "string" || txid.length !== 64) {
107
+ return invalidParams("txid must be 64-char hex");
108
+ }
109
+ if (typeof vout !== "number" || !Number.isInteger(vout) || vout < 0) {
110
+ return invalidParams("vout must be a non-negative integer");
111
+ }
112
+ storage._test.utxo.remove({ txid, vout });
113
+ return ok(true);
114
+ });
115
+ // test.add_header [hash, height, timestamp, version?, prevHash?, merkleRoot?, bits?, nonce?]
116
+ handlers.set("test.add_header", (_ctx, params) => {
117
+ if (params.length < 3) {
118
+ return invalidParams("Expected [hash, height, timestamp, ...]");
119
+ }
120
+ const hash = params[0];
121
+ const height = params[1];
122
+ const timestamp = params[2];
123
+ if (typeof hash !== "string" || hash.length !== 64) {
124
+ return invalidParams("hash must be 64-char hex");
125
+ }
126
+ if (typeof height !== "number" || !Number.isInteger(height) || height < 0) {
127
+ return invalidParams("height must be a non-negative integer");
128
+ }
129
+ if (typeof timestamp !== "number" || !Number.isInteger(timestamp) || timestamp < 0) {
130
+ return invalidParams("timestamp must be a non-negative integer");
131
+ }
132
+ storage._test.header.add({
133
+ hash,
134
+ height,
135
+ timestamp,
136
+ });
137
+ return ok(true);
138
+ });
139
+ // test.mine [address, blocks?]
140
+ // Mines block(s) with a coinbase reward locked to the given address.
141
+ // Returns { height, coinbaseTxids }.
142
+ handlers.set("test.mine", (ctx, params) => {
143
+ if (params.length < 1)
144
+ return invalidParams("Expected [address, blocks?]");
145
+ const address = params[0];
146
+ const blocks = params[1] ?? 1;
147
+ if (typeof address !== "string") {
148
+ return invalidParams("address must be a string");
149
+ }
150
+ if (typeof blocks !== "number" || !Number.isInteger(blocks) || blocks < 1) {
151
+ return invalidParams("blocks must be a positive integer");
152
+ }
153
+ if (blocks > 1000) {
154
+ return invalidParams("blocks must not exceed 1000");
155
+ }
156
+ const decoded = cashAddressToLockingBytecode(address);
157
+ if (typeof decoded === "string") {
158
+ return invalidParams(`Invalid address: ${decoded}`);
159
+ }
160
+ const { bytecode } = decoded;
161
+ const scriptHash = binToHex(sha256.hash(bytecode));
162
+ const COINBASE_REWARD = 5000000000n; // 50 BCH
163
+ const coinbaseTxids = [];
164
+ let height = 0;
165
+ for (let i = 0; i < blocks; i++) {
166
+ const result = ctx.node.mine();
167
+ height = result.height;
168
+ // Build a synthetic coinbase transaction
169
+ const rawHex = buildSyntheticUtxoTx(bytecode, COINBASE_REWARD, 0, syntheticCounter++);
170
+ const txid = deriveTxid(rawHex);
171
+ coinbaseTxids.push(txid);
172
+ // Store UTXO, history, and transaction record
173
+ storage._test.utxo.add({
174
+ txid,
175
+ vout: 0,
176
+ satoshis: COINBASE_REWARD,
177
+ scriptHash,
178
+ height,
179
+ lockingBytecode: bytecode,
180
+ isCoinbase: true,
181
+ });
182
+ storage._test.history.add({
183
+ scriptHash,
184
+ entries: [{ txHash: txid, height }],
185
+ });
186
+ storage._test.tx.add({ txid, height, rawHex });
187
+ // Notify subscribers
188
+ ctx.node.subscriptions.notifyChanges(new Set([scriptHash]));
189
+ }
190
+ return ok({ height, coinbaseTxids });
191
+ });
192
+ // test.debugTransaction [rawHex]
193
+ // Runs full validation with per-input debug traces, without accepting to mempool.
194
+ // Returns the DebugResult (success with inputResults, or failure with error + partial traces).
195
+ handlers.set("test.debugTransaction", (ctx, params) => {
196
+ if (params.length < 1 || typeof params[0] !== "string") {
197
+ return invalidParams("Expected [rawHex]");
198
+ }
199
+ const rawHex = params[0];
200
+ const result = ctx.node.debugTransaction(rawHex);
201
+ return ok(result);
202
+ });
203
+ // test.reset []
204
+ handlers.set("test.reset", (_ctx, _params) => {
205
+ storage._test.reset();
206
+ return ok(true);
207
+ });
208
+ return handlers;
209
+ }
210
+ /** Build a synthetic coinbase-style transaction with padding outputs up to vout. */
211
+ function buildSyntheticUtxoTx(lockingBytecode, satoshis, vout, counter, tokenData) {
212
+ const outputs = [];
213
+ for (let i = 0; i < vout; i++) {
214
+ outputs.push({ lockingBytecode: new Uint8Array(0), valueSatoshis: 0n });
215
+ }
216
+ const output = { lockingBytecode, valueSatoshis: satoshis };
217
+ if (tokenData) {
218
+ output.token = tokenData;
219
+ }
220
+ outputs.push(output);
221
+ const coinbaseScript = utf8ToBin(`mock-${counter}`);
222
+ return binToHex(encodeTransactionBch({
223
+ version: 2,
224
+ inputs: [
225
+ {
226
+ outpointTransactionHash: new Uint8Array(32),
227
+ outpointIndex: 0xffffffff,
228
+ unlockingBytecode: coinbaseScript,
229
+ sequenceNumber: 0xffffffff,
230
+ },
231
+ ],
232
+ outputs,
233
+ locktime: 0,
234
+ }));
235
+ }
236
+ /** Derive a txid from raw transaction hex (double SHA-256, reversed). */
237
+ function deriveTxid(rawHex) {
238
+ return binToHex(sha256.hash(sha256.hash(hexToBin(rawHex))).reverse());
239
+ }
240
+ //# sourceMappingURL=test.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"test.js","sourceRoot":"","sources":["../src/test.ts"],"names":[],"mappings":"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"}