@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.
- package/README.md +143 -0
- package/dist/address.d.ts +20 -0
- package/dist/address.d.ts.map +1 -0
- package/dist/address.js +51 -0
- package/dist/address.js.map +1 -0
- package/dist/dispatch.d.ts +18 -0
- package/dist/dispatch.d.ts.map +1 -0
- package/dist/dispatch.js +108 -0
- package/dist/dispatch.js.map +1 -0
- package/dist/headers.d.ts +14 -0
- package/dist/headers.d.ts.map +1 -0
- package/dist/headers.js +156 -0
- package/dist/headers.js.map +1 -0
- package/dist/index.d.ts +16 -0
- package/dist/index.d.ts.map +1 -0
- package/dist/index.js +11 -0
- package/dist/index.js.map +1 -0
- package/dist/indexer.d.ts +42 -0
- package/dist/indexer.d.ts.map +1 -0
- package/dist/indexer.js +216 -0
- package/dist/indexer.js.map +1 -0
- package/dist/memCash.d.ts +40 -0
- package/dist/memCash.d.ts.map +1 -0
- package/dist/memCash.js +212 -0
- package/dist/memCash.js.map +1 -0
- package/dist/mempool.d.ts +6 -0
- package/dist/mempool.d.ts.map +1 -0
- package/dist/mempool.js +46 -0
- package/dist/mempool.js.map +1 -0
- package/dist/schema.d.ts +638 -0
- package/dist/schema.d.ts.map +1 -0
- package/dist/schema.js +3 -0
- package/dist/schema.js.map +1 -0
- package/dist/scripthash.d.ts +18 -0
- package/dist/scripthash.d.ts.map +1 -0
- package/dist/scripthash.js +164 -0
- package/dist/scripthash.js.map +1 -0
- package/dist/server.d.ts +20 -0
- package/dist/server.d.ts.map +1 -0
- package/dist/server.js +120 -0
- package/dist/server.js.map +1 -0
- package/dist/stubs.d.ts +12 -0
- package/dist/stubs.d.ts.map +1 -0
- package/dist/stubs.js +16 -0
- package/dist/stubs.js.map +1 -0
- package/dist/test.d.ts +8 -0
- package/dist/test.d.ts.map +1 -0
- package/dist/test.js +240 -0
- package/dist/test.js.map +1 -0
- package/dist/testUtils.d.ts +20 -0
- package/dist/testUtils.d.ts.map +1 -0
- package/dist/testUtils.js +29 -0
- package/dist/testUtils.js.map +1 -0
- package/dist/transaction.d.ts +28 -0
- package/dist/transaction.d.ts.map +1 -0
- package/dist/transaction.js +318 -0
- package/dist/transaction.js.map +1 -0
- package/dist/transport.d.ts +24 -0
- package/dist/transport.d.ts.map +1 -0
- package/dist/transport.js +16 -0
- package/dist/transport.js.map +1 -0
- package/dist/types.d.ts +85 -0
- package/dist/types.d.ts.map +1 -0
- package/dist/types.js +58 -0
- package/dist/types.js.map +1 -0
- package/dist/utxo.d.ts +4 -0
- package/dist/utxo.d.ts.map +1 -0
- package/dist/utxo.js +39 -0
- package/dist/utxo.js.map +1 -0
- package/package.json +53 -0
package/dist/indexer.js
ADDED
|
@@ -0,0 +1,216 @@
|
|
|
1
|
+
import { binToHex, cashAddressToLockingBytecode, sha256 } from "@bitauth/libauth";
|
|
2
|
+
import { createNode } from "@mem-cash/core";
|
|
3
|
+
import { createDispatch } from "./dispatch.js";
|
|
4
|
+
import { createTestHandlers } from "./test.js";
|
|
5
|
+
import { formatHeaderResponse } from "./types.js";
|
|
6
|
+
/** BCH mainnet genesis hash. */
|
|
7
|
+
const BCH_GENESIS_HASH = "000000000019d6689c085ae165831e934ff763ae46a2a6c172b3f1b60a8ce26f";
|
|
8
|
+
/**
|
|
9
|
+
* Create a Indexer instance: a core Node with Electrum RPC dispatch.
|
|
10
|
+
*
|
|
11
|
+
* All `test.*` RPC methods are available via `request()`.
|
|
12
|
+
* Core node methods (`submitTransaction`, `mine`, etc.) are available directly.
|
|
13
|
+
*/
|
|
14
|
+
export function createIndexer(config) {
|
|
15
|
+
const node = createNode(config);
|
|
16
|
+
const enableTest = config?.disableTestHandlers !== true;
|
|
17
|
+
const testHandlers = enableTest
|
|
18
|
+
? new Map(createTestHandlers(node.storage))
|
|
19
|
+
: new Map();
|
|
20
|
+
const serverVersion = config?.serverVersion ?? "mem-cash/0.1";
|
|
21
|
+
const genesisHash = config?.genesisHash ?? BCH_GENESIS_HASH;
|
|
22
|
+
// Notification routing: per-scripthash, header, transaction, and dsproof callback sets
|
|
23
|
+
const scriptHashCallbacks = new Map();
|
|
24
|
+
const headerCallbacks = new Set();
|
|
25
|
+
const txCallbacks = new Map();
|
|
26
|
+
const dsproofCallbacks = new Map();
|
|
27
|
+
// In-memory dsproof store (populated by test.add_dsproof)
|
|
28
|
+
const dsproofs = new Map();
|
|
29
|
+
function getDsproof(txid) {
|
|
30
|
+
return dsproofs.get(txid) ?? null;
|
|
31
|
+
}
|
|
32
|
+
function notifyTxSubscriptions() {
|
|
33
|
+
if (txCallbacks.size === 0)
|
|
34
|
+
return;
|
|
35
|
+
const tip = node.getTip();
|
|
36
|
+
for (const [txHash, cbs] of txCallbacks) {
|
|
37
|
+
const record = node.getTx(txHash);
|
|
38
|
+
const memTx = node.getMempoolTx(txHash);
|
|
39
|
+
let confirmations = null;
|
|
40
|
+
if (record && record.height > 0 && tip) {
|
|
41
|
+
confirmations = tip.height - record.height + 1;
|
|
42
|
+
}
|
|
43
|
+
else if (record || memTx) {
|
|
44
|
+
confirmations = 0;
|
|
45
|
+
}
|
|
46
|
+
if (confirmations !== null) {
|
|
47
|
+
for (const cb of cbs)
|
|
48
|
+
cb([txHash, confirmations]);
|
|
49
|
+
}
|
|
50
|
+
}
|
|
51
|
+
}
|
|
52
|
+
function onNotification(notification) {
|
|
53
|
+
if (notification.type === "scripthash") {
|
|
54
|
+
const cbs = scriptHashCallbacks.get(notification.scriptHash);
|
|
55
|
+
if (cbs) {
|
|
56
|
+
for (const cb of cbs) {
|
|
57
|
+
cb([notification.scriptHash, notification.status]);
|
|
58
|
+
}
|
|
59
|
+
}
|
|
60
|
+
}
|
|
61
|
+
else {
|
|
62
|
+
for (const cb of headerCallbacks) {
|
|
63
|
+
cb([formatHeaderResponse(notification.header)]);
|
|
64
|
+
}
|
|
65
|
+
}
|
|
66
|
+
notifyTxSubscriptions();
|
|
67
|
+
}
|
|
68
|
+
const consumerId = node.subscriptions.addConsumer(onNotification);
|
|
69
|
+
const hooks = node.subscriptions.hooksForConsumer(consumerId);
|
|
70
|
+
// Register test.add_dsproof handler — stores a dsproof and notifies subscribers
|
|
71
|
+
if (enableTest) {
|
|
72
|
+
testHandlers.set("test.add_dsproof", (_ctx, params) => {
|
|
73
|
+
if (params.length < 2) {
|
|
74
|
+
return { error: { code: -32602, message: "Expected [txid, dsproof]" } };
|
|
75
|
+
}
|
|
76
|
+
const txid = params[0];
|
|
77
|
+
const dsproof = params[1];
|
|
78
|
+
dsproofs.set(txid, dsproof);
|
|
79
|
+
const cbs = dsproofCallbacks.get(txid);
|
|
80
|
+
if (cbs) {
|
|
81
|
+
for (const cb of cbs)
|
|
82
|
+
cb([txid, dsproof]);
|
|
83
|
+
}
|
|
84
|
+
return { result: true };
|
|
85
|
+
});
|
|
86
|
+
}
|
|
87
|
+
// Build dispatch with test handlers only if enabled
|
|
88
|
+
const fullDispatch = createDispatch(enableTest ? testHandlers : undefined);
|
|
89
|
+
const ctx = {
|
|
90
|
+
node,
|
|
91
|
+
serverVersion,
|
|
92
|
+
protocolMin: "1.6",
|
|
93
|
+
protocolMax: "1.6",
|
|
94
|
+
genesisHash,
|
|
95
|
+
hashFunction: "sha256",
|
|
96
|
+
getDsproof,
|
|
97
|
+
listDsproofs: () => [...dsproofs.keys()],
|
|
98
|
+
...hooks,
|
|
99
|
+
...(config?.addressPrefix ? { addressPrefix: config.addressPrefix } : {}),
|
|
100
|
+
...(config?.banner ? { banner: config.banner } : {}),
|
|
101
|
+
...(config?.donationAddress ? { donationAddress: config.donationAddress } : {}),
|
|
102
|
+
};
|
|
103
|
+
function toArray(params) {
|
|
104
|
+
if (params === undefined)
|
|
105
|
+
return [];
|
|
106
|
+
if (Array.isArray(params))
|
|
107
|
+
return params;
|
|
108
|
+
return Object.values(params);
|
|
109
|
+
}
|
|
110
|
+
async function request(method, params) {
|
|
111
|
+
const handlerResult = await fullDispatch(ctx, method, toArray(params));
|
|
112
|
+
if ("error" in handlerResult) {
|
|
113
|
+
const e = new Error(handlerResult.error.message);
|
|
114
|
+
e.code = handlerResult.error.code;
|
|
115
|
+
throw e;
|
|
116
|
+
}
|
|
117
|
+
return handlerResult.result;
|
|
118
|
+
}
|
|
119
|
+
async function subscribe(method, params, callback) {
|
|
120
|
+
const paramsArray = toArray(params);
|
|
121
|
+
const handlerResult = await fullDispatch(ctx, method, paramsArray);
|
|
122
|
+
if ("error" in handlerResult) {
|
|
123
|
+
throw new Error(handlerResult.error.message);
|
|
124
|
+
}
|
|
125
|
+
if (method === "blockchain.scripthash.subscribe") {
|
|
126
|
+
const scriptHash = paramsArray[0];
|
|
127
|
+
let cbs = scriptHashCallbacks.get(scriptHash);
|
|
128
|
+
if (!cbs) {
|
|
129
|
+
cbs = new Set();
|
|
130
|
+
scriptHashCallbacks.set(scriptHash, cbs);
|
|
131
|
+
}
|
|
132
|
+
cbs.add(callback);
|
|
133
|
+
callback([scriptHash, handlerResult.result]);
|
|
134
|
+
return async () => {
|
|
135
|
+
cbs.delete(callback);
|
|
136
|
+
if (cbs.size === 0)
|
|
137
|
+
scriptHashCallbacks.delete(scriptHash);
|
|
138
|
+
await fullDispatch(ctx, "blockchain.scripthash.unsubscribe", [scriptHash]);
|
|
139
|
+
};
|
|
140
|
+
}
|
|
141
|
+
if (method === "blockchain.address.subscribe") {
|
|
142
|
+
const address = paramsArray[0];
|
|
143
|
+
// The address handler delegates to scripthash.subscribe internally,
|
|
144
|
+
// so the subscription manager already tracks the scripthash.
|
|
145
|
+
// We register a callback that maps scripthash notifications to [address, status].
|
|
146
|
+
const decoded = cashAddressToLockingBytecode(address);
|
|
147
|
+
if (typeof decoded === "string")
|
|
148
|
+
throw new Error(`Invalid address: ${decoded}`);
|
|
149
|
+
const scriptHash = binToHex(sha256.hash(decoded.bytecode));
|
|
150
|
+
const wrappedCb = (data) => {
|
|
151
|
+
const [, status] = data;
|
|
152
|
+
callback([address, status]);
|
|
153
|
+
};
|
|
154
|
+
let cbs = scriptHashCallbacks.get(scriptHash);
|
|
155
|
+
if (!cbs) {
|
|
156
|
+
cbs = new Set();
|
|
157
|
+
scriptHashCallbacks.set(scriptHash, cbs);
|
|
158
|
+
}
|
|
159
|
+
cbs.add(wrappedCb);
|
|
160
|
+
// Deliver initial [address, status]
|
|
161
|
+
callback([address, handlerResult.result]);
|
|
162
|
+
return async () => {
|
|
163
|
+
cbs.delete(wrappedCb);
|
|
164
|
+
if (cbs.size === 0)
|
|
165
|
+
scriptHashCallbacks.delete(scriptHash);
|
|
166
|
+
await fullDispatch(ctx, "blockchain.address.unsubscribe", [address]);
|
|
167
|
+
};
|
|
168
|
+
}
|
|
169
|
+
if (method === "blockchain.headers.subscribe") {
|
|
170
|
+
headerCallbacks.add(callback);
|
|
171
|
+
callback([handlerResult.result]);
|
|
172
|
+
return async () => {
|
|
173
|
+
headerCallbacks.delete(callback);
|
|
174
|
+
// Only unsubscribe from the protocol when no callbacks remain,
|
|
175
|
+
// so that other active header watchers keep receiving notifications.
|
|
176
|
+
if (headerCallbacks.size === 0) {
|
|
177
|
+
await fullDispatch(ctx, "blockchain.headers.unsubscribe", []);
|
|
178
|
+
}
|
|
179
|
+
};
|
|
180
|
+
}
|
|
181
|
+
if (method === "blockchain.transaction.subscribe") {
|
|
182
|
+
const txHash = paramsArray[0];
|
|
183
|
+
let cbs = txCallbacks.get(txHash);
|
|
184
|
+
if (!cbs) {
|
|
185
|
+
cbs = new Set();
|
|
186
|
+
txCallbacks.set(txHash, cbs);
|
|
187
|
+
}
|
|
188
|
+
cbs.add(callback);
|
|
189
|
+
callback(handlerResult.result);
|
|
190
|
+
return async () => {
|
|
191
|
+
cbs.delete(callback);
|
|
192
|
+
if (cbs.size === 0)
|
|
193
|
+
txCallbacks.delete(txHash);
|
|
194
|
+
};
|
|
195
|
+
}
|
|
196
|
+
if (method === "blockchain.transaction.dsproof.subscribe") {
|
|
197
|
+
const txHash = paramsArray[0];
|
|
198
|
+
let cbs = dsproofCallbacks.get(txHash);
|
|
199
|
+
if (!cbs) {
|
|
200
|
+
cbs = new Set();
|
|
201
|
+
dsproofCallbacks.set(txHash, cbs);
|
|
202
|
+
}
|
|
203
|
+
cbs.add(callback);
|
|
204
|
+
// Deliver initial status from handler result
|
|
205
|
+
callback(handlerResult.result);
|
|
206
|
+
return async () => {
|
|
207
|
+
cbs.delete(callback);
|
|
208
|
+
if (cbs.size === 0)
|
|
209
|
+
dsproofCallbacks.delete(txHash);
|
|
210
|
+
};
|
|
211
|
+
}
|
|
212
|
+
throw new Error(`Method ${method} does not support subscriptions`);
|
|
213
|
+
}
|
|
214
|
+
return { ...node, request, subscribe };
|
|
215
|
+
}
|
|
216
|
+
//# sourceMappingURL=indexer.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"indexer.js","sourceRoot":"","sources":["../src/indexer.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,40 @@
|
|
|
1
|
+
import type { Node, NodeConfig } from "@mem-cash/core";
|
|
2
|
+
import type { ElectrumCashTestSchema, ExtractParams, ExtractRequestMethod, ExtractReturn, ExtractSubscriptionMethod, Schema } from "./schema.js";
|
|
3
|
+
/** Function that tears down a subscription. */
|
|
4
|
+
export type Unsubscribe = () => Promise<void>;
|
|
5
|
+
/** Configuration for the MemCash Electrum instance. */
|
|
6
|
+
export interface MemCashConfig extends NodeConfig {
|
|
7
|
+
/** Server version string (default: "mem-cash/0.1"). */
|
|
8
|
+
readonly serverVersion?: string;
|
|
9
|
+
/** Genesis hash (default: BCH mainnet). */
|
|
10
|
+
readonly genesisHash?: string;
|
|
11
|
+
/** CashAddress prefix for address encoding (default: "bitcoincash"). */
|
|
12
|
+
readonly addressPrefix?: string;
|
|
13
|
+
/** Server banner text. */
|
|
14
|
+
readonly banner?: string;
|
|
15
|
+
/** Server donation address. */
|
|
16
|
+
readonly donationAddress?: string;
|
|
17
|
+
}
|
|
18
|
+
/** A core Node wrapped with Electrum RPC dispatch. */
|
|
19
|
+
export interface MemCash<S extends Schema = ElectrumCashTestSchema> extends Node {
|
|
20
|
+
/**
|
|
21
|
+
* Dispatch an Electrum RPC method.
|
|
22
|
+
* Params can be a positional array or a named-parameter object.
|
|
23
|
+
* Returns the unwrapped result; throws on RPC error.
|
|
24
|
+
*/
|
|
25
|
+
readonly request: <M extends ExtractRequestMethod<S>>(method: M, params?: ExtractParams<S, M>) => Promise<ExtractReturn<S, M>>;
|
|
26
|
+
/**
|
|
27
|
+
* Subscribe to an Electrum method. The callback receives the initial
|
|
28
|
+
* result immediately and subsequent notifications as they occur.
|
|
29
|
+
* Returns an unsubscribe function.
|
|
30
|
+
*/
|
|
31
|
+
readonly subscribe: <M extends ExtractSubscriptionMethod<S>>(method: M, params: ExtractParams<S, M>, callback: (data: ExtractReturn<S, M>) => void) => Promise<Unsubscribe>;
|
|
32
|
+
}
|
|
33
|
+
/**
|
|
34
|
+
* Create a MemCash instance: a core Node with Electrum RPC dispatch.
|
|
35
|
+
*
|
|
36
|
+
* All `test.*` RPC methods are available via `request()`.
|
|
37
|
+
* Core node methods (`submitTransaction`, `mine`, etc.) are available directly.
|
|
38
|
+
*/
|
|
39
|
+
export declare function createMemCash(config?: MemCashConfig): MemCash;
|
|
40
|
+
//# sourceMappingURL=memCash.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"memCash.d.ts","sourceRoot":"","sources":["../src/memCash.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,IAAI,EAAE,UAAU,EAAgB,MAAM,gBAAgB,CAAC;AAIrE,OAAO,KAAK,EACX,sBAAsB,EACtB,aAAa,EACb,oBAAoB,EACpB,aAAa,EACb,yBAAyB,EACzB,MAAM,EACN,MAAM,aAAa,CAAC;AAQrB,+CAA+C;AAC/C,MAAM,MAAM,WAAW,GAAG,MAAM,OAAO,CAAC,IAAI,CAAC,CAAC;AAE9C,uDAAuD;AACvD,MAAM,WAAW,aAAc,SAAQ,UAAU;IAChD,uDAAuD;IACvD,QAAQ,CAAC,aAAa,CAAC,EAAE,MAAM,CAAC;IAChC,2CAA2C;IAC3C,QAAQ,CAAC,WAAW,CAAC,EAAE,MAAM,CAAC;IAC9B,wEAAwE;IACxE,QAAQ,CAAC,aAAa,CAAC,EAAE,MAAM,CAAC;IAChC,0BAA0B;IAC1B,QAAQ,CAAC,MAAM,CAAC,EAAE,MAAM,CAAC;IACzB,+BAA+B;IAC/B,QAAQ,CAAC,eAAe,CAAC,EAAE,MAAM,CAAC;CAClC;AAED,sDAAsD;AACtD,MAAM,WAAW,OAAO,CAAC,CAAC,SAAS,MAAM,GAAG,sBAAsB,CAAE,SAAQ,IAAI;IAC/E;;;;OAIG;IACH,QAAQ,CAAC,OAAO,EAAE,CAAC,CAAC,SAAS,oBAAoB,CAAC,CAAC,CAAC,EACnD,MAAM,EAAE,CAAC,EACT,MAAM,CAAC,EAAE,aAAa,CAAC,CAAC,EAAE,CAAC,CAAC,KACxB,OAAO,CAAC,aAAa,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,CAAC;IAElC;;;;OAIG;IACH,QAAQ,CAAC,SAAS,EAAE,CAAC,CAAC,SAAS,yBAAyB,CAAC,CAAC,CAAC,EAC1D,MAAM,EAAE,CAAC,EACT,MAAM,EAAE,aAAa,CAAC,CAAC,EAAE,CAAC,CAAC,EAC3B,QAAQ,EAAE,CAAC,IAAI,EAAE,aAAa,CAAC,CAAC,EAAE,CAAC,CAAC,KAAK,IAAI,KACzC,OAAO,CAAC,WAAW,CAAC,CAAC;CAC1B;AAED;;;;;GAKG;AACH,wBAAgB,aAAa,CAAC,MAAM,CAAC,EAAE,aAAa,GAAG,OAAO,CA0N7D"}
|
package/dist/memCash.js
ADDED
|
@@ -0,0 +1,212 @@
|
|
|
1
|
+
import { binToHex, cashAddressToLockingBytecode, sha256 } from "@bitauth/libauth";
|
|
2
|
+
import { createNode } from "@mem-cash/core";
|
|
3
|
+
import { createDispatch } from "./dispatch.js";
|
|
4
|
+
import { createTestHandlers } from "./test.js";
|
|
5
|
+
import { formatHeaderResponse } from "./types.js";
|
|
6
|
+
/** BCH mainnet genesis hash. */
|
|
7
|
+
const BCH_GENESIS_HASH = "000000000019d6689c085ae165831e934ff763ae46a2a6c172b3f1b60a8ce26f";
|
|
8
|
+
/**
|
|
9
|
+
* Create a MemCash instance: a core Node with Electrum RPC dispatch.
|
|
10
|
+
*
|
|
11
|
+
* All `test.*` RPC methods are available via `request()`.
|
|
12
|
+
* Core node methods (`submitTransaction`, `mine`, etc.) are available directly.
|
|
13
|
+
*/
|
|
14
|
+
export function createMemCash(config) {
|
|
15
|
+
const node = createNode(config);
|
|
16
|
+
const baseTestHandlers = createTestHandlers(node.storage);
|
|
17
|
+
const testHandlers = new Map(baseTestHandlers);
|
|
18
|
+
const serverVersion = config?.serverVersion ?? "mem-cash/0.1";
|
|
19
|
+
const genesisHash = config?.genesisHash ?? BCH_GENESIS_HASH;
|
|
20
|
+
// Notification routing: per-scripthash, header, transaction, and dsproof callback sets
|
|
21
|
+
const scriptHashCallbacks = new Map();
|
|
22
|
+
const headerCallbacks = new Set();
|
|
23
|
+
const txCallbacks = new Map();
|
|
24
|
+
const dsproofCallbacks = new Map();
|
|
25
|
+
// In-memory dsproof store (populated by test.add_dsproof)
|
|
26
|
+
const dsproofs = new Map();
|
|
27
|
+
function getDsproof(txid) {
|
|
28
|
+
return dsproofs.get(txid) ?? null;
|
|
29
|
+
}
|
|
30
|
+
function notifyTxSubscriptions() {
|
|
31
|
+
if (txCallbacks.size === 0)
|
|
32
|
+
return;
|
|
33
|
+
const tip = node.getTip();
|
|
34
|
+
for (const [txHash, cbs] of txCallbacks) {
|
|
35
|
+
const record = node.getTx(txHash);
|
|
36
|
+
const memTx = node.getMempoolTx(txHash);
|
|
37
|
+
let confirmations = null;
|
|
38
|
+
if (record && record.height > 0 && tip) {
|
|
39
|
+
confirmations = tip.height - record.height + 1;
|
|
40
|
+
}
|
|
41
|
+
else if (record || memTx) {
|
|
42
|
+
confirmations = 0;
|
|
43
|
+
}
|
|
44
|
+
if (confirmations !== null) {
|
|
45
|
+
for (const cb of cbs)
|
|
46
|
+
cb([txHash, confirmations]);
|
|
47
|
+
}
|
|
48
|
+
}
|
|
49
|
+
}
|
|
50
|
+
function onNotification(notification) {
|
|
51
|
+
if (notification.type === "scripthash") {
|
|
52
|
+
const cbs = scriptHashCallbacks.get(notification.scriptHash);
|
|
53
|
+
if (cbs) {
|
|
54
|
+
for (const cb of cbs) {
|
|
55
|
+
cb([notification.scriptHash, notification.status]);
|
|
56
|
+
}
|
|
57
|
+
}
|
|
58
|
+
}
|
|
59
|
+
else {
|
|
60
|
+
for (const cb of headerCallbacks) {
|
|
61
|
+
cb([formatHeaderResponse(notification.header)]);
|
|
62
|
+
}
|
|
63
|
+
}
|
|
64
|
+
notifyTxSubscriptions();
|
|
65
|
+
}
|
|
66
|
+
const consumerId = node.subscriptions.addConsumer(onNotification);
|
|
67
|
+
const hooks = node.subscriptions.hooksForConsumer(consumerId);
|
|
68
|
+
// Register test.add_dsproof handler — stores a dsproof and notifies subscribers
|
|
69
|
+
testHandlers.set("test.add_dsproof", (_ctx, params) => {
|
|
70
|
+
if (params.length < 2) {
|
|
71
|
+
return { error: { code: -32602, message: "Expected [txid, dsproof]" } };
|
|
72
|
+
}
|
|
73
|
+
const txid = params[0];
|
|
74
|
+
const dsproof = params[1];
|
|
75
|
+
dsproofs.set(txid, dsproof);
|
|
76
|
+
const cbs = dsproofCallbacks.get(txid);
|
|
77
|
+
if (cbs) {
|
|
78
|
+
for (const cb of cbs)
|
|
79
|
+
cb([txid, dsproof]);
|
|
80
|
+
}
|
|
81
|
+
return { result: true };
|
|
82
|
+
});
|
|
83
|
+
// Rebuild dispatch with updated test handlers (now includes test.add_dsproof)
|
|
84
|
+
const fullDispatch = createDispatch(testHandlers);
|
|
85
|
+
const ctx = {
|
|
86
|
+
node,
|
|
87
|
+
serverVersion,
|
|
88
|
+
protocolMin: "1.6.0",
|
|
89
|
+
protocolMax: "1.6.0",
|
|
90
|
+
genesisHash,
|
|
91
|
+
hashFunction: "sha256",
|
|
92
|
+
getDsproof,
|
|
93
|
+
listDsproofs: () => [...dsproofs.keys()],
|
|
94
|
+
...hooks,
|
|
95
|
+
...(config?.addressPrefix ? { addressPrefix: config.addressPrefix } : {}),
|
|
96
|
+
...(config?.banner ? { banner: config.banner } : {}),
|
|
97
|
+
...(config?.donationAddress ? { donationAddress: config.donationAddress } : {}),
|
|
98
|
+
};
|
|
99
|
+
function toArray(params) {
|
|
100
|
+
if (params === undefined)
|
|
101
|
+
return [];
|
|
102
|
+
if (Array.isArray(params))
|
|
103
|
+
return params;
|
|
104
|
+
return Object.values(params);
|
|
105
|
+
}
|
|
106
|
+
async function request(method, params) {
|
|
107
|
+
const handlerResult = await fullDispatch(ctx, method, toArray(params));
|
|
108
|
+
if ("error" in handlerResult) {
|
|
109
|
+
const e = new Error(handlerResult.error.message);
|
|
110
|
+
e.code = handlerResult.error.code;
|
|
111
|
+
throw e;
|
|
112
|
+
}
|
|
113
|
+
return handlerResult.result;
|
|
114
|
+
}
|
|
115
|
+
async function subscribe(method, params, callback) {
|
|
116
|
+
const paramsArray = toArray(params);
|
|
117
|
+
const handlerResult = await fullDispatch(ctx, method, paramsArray);
|
|
118
|
+
if ("error" in handlerResult) {
|
|
119
|
+
throw new Error(handlerResult.error.message);
|
|
120
|
+
}
|
|
121
|
+
if (method === "blockchain.scripthash.subscribe") {
|
|
122
|
+
const scriptHash = paramsArray[0];
|
|
123
|
+
let cbs = scriptHashCallbacks.get(scriptHash);
|
|
124
|
+
if (!cbs) {
|
|
125
|
+
cbs = new Set();
|
|
126
|
+
scriptHashCallbacks.set(scriptHash, cbs);
|
|
127
|
+
}
|
|
128
|
+
cbs.add(callback);
|
|
129
|
+
callback([scriptHash, handlerResult.result]);
|
|
130
|
+
return async () => {
|
|
131
|
+
cbs.delete(callback);
|
|
132
|
+
if (cbs.size === 0)
|
|
133
|
+
scriptHashCallbacks.delete(scriptHash);
|
|
134
|
+
await fullDispatch(ctx, "blockchain.scripthash.unsubscribe", [scriptHash]);
|
|
135
|
+
};
|
|
136
|
+
}
|
|
137
|
+
if (method === "blockchain.address.subscribe") {
|
|
138
|
+
const address = paramsArray[0];
|
|
139
|
+
// The address handler delegates to scripthash.subscribe internally,
|
|
140
|
+
// so the subscription manager already tracks the scripthash.
|
|
141
|
+
// We register a callback that maps scripthash notifications to [address, status].
|
|
142
|
+
const decoded = cashAddressToLockingBytecode(address);
|
|
143
|
+
if (typeof decoded === "string")
|
|
144
|
+
throw new Error(`Invalid address: ${decoded}`);
|
|
145
|
+
const scriptHash = binToHex(sha256.hash(decoded.bytecode));
|
|
146
|
+
const wrappedCb = (data) => {
|
|
147
|
+
const [, status] = data;
|
|
148
|
+
callback([address, status]);
|
|
149
|
+
};
|
|
150
|
+
let cbs = scriptHashCallbacks.get(scriptHash);
|
|
151
|
+
if (!cbs) {
|
|
152
|
+
cbs = new Set();
|
|
153
|
+
scriptHashCallbacks.set(scriptHash, cbs);
|
|
154
|
+
}
|
|
155
|
+
cbs.add(wrappedCb);
|
|
156
|
+
// Deliver initial [address, status]
|
|
157
|
+
callback([address, handlerResult.result]);
|
|
158
|
+
return async () => {
|
|
159
|
+
cbs.delete(wrappedCb);
|
|
160
|
+
if (cbs.size === 0)
|
|
161
|
+
scriptHashCallbacks.delete(scriptHash);
|
|
162
|
+
await fullDispatch(ctx, "blockchain.address.unsubscribe", [address]);
|
|
163
|
+
};
|
|
164
|
+
}
|
|
165
|
+
if (method === "blockchain.headers.subscribe") {
|
|
166
|
+
headerCallbacks.add(callback);
|
|
167
|
+
callback([handlerResult.result]);
|
|
168
|
+
return async () => {
|
|
169
|
+
headerCallbacks.delete(callback);
|
|
170
|
+
// Only unsubscribe from the protocol when no callbacks remain,
|
|
171
|
+
// so that other active header watchers keep receiving notifications.
|
|
172
|
+
if (headerCallbacks.size === 0) {
|
|
173
|
+
await fullDispatch(ctx, "blockchain.headers.unsubscribe", []);
|
|
174
|
+
}
|
|
175
|
+
};
|
|
176
|
+
}
|
|
177
|
+
if (method === "blockchain.transaction.subscribe") {
|
|
178
|
+
const txHash = paramsArray[0];
|
|
179
|
+
let cbs = txCallbacks.get(txHash);
|
|
180
|
+
if (!cbs) {
|
|
181
|
+
cbs = new Set();
|
|
182
|
+
txCallbacks.set(txHash, cbs);
|
|
183
|
+
}
|
|
184
|
+
cbs.add(callback);
|
|
185
|
+
callback(handlerResult.result);
|
|
186
|
+
return async () => {
|
|
187
|
+
cbs.delete(callback);
|
|
188
|
+
if (cbs.size === 0)
|
|
189
|
+
txCallbacks.delete(txHash);
|
|
190
|
+
};
|
|
191
|
+
}
|
|
192
|
+
if (method === "blockchain.transaction.dsproof.subscribe") {
|
|
193
|
+
const txHash = paramsArray[0];
|
|
194
|
+
let cbs = dsproofCallbacks.get(txHash);
|
|
195
|
+
if (!cbs) {
|
|
196
|
+
cbs = new Set();
|
|
197
|
+
dsproofCallbacks.set(txHash, cbs);
|
|
198
|
+
}
|
|
199
|
+
cbs.add(callback);
|
|
200
|
+
// Deliver initial status from handler result
|
|
201
|
+
callback(handlerResult.result);
|
|
202
|
+
return async () => {
|
|
203
|
+
cbs.delete(callback);
|
|
204
|
+
if (cbs.size === 0)
|
|
205
|
+
dsproofCallbacks.delete(txHash);
|
|
206
|
+
};
|
|
207
|
+
}
|
|
208
|
+
throw new Error(`Method ${method} does not support subscriptions`);
|
|
209
|
+
}
|
|
210
|
+
return { ...node, request, subscribe };
|
|
211
|
+
}
|
|
212
|
+
//# sourceMappingURL=memCash.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"memCash.js","sourceRoot":"","sources":["../src/memCash.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,6 @@
|
|
|
1
|
+
import { type HandlerResult, type ProtocolContext } from "./types.js";
|
|
2
|
+
/** mempool.get_fee_histogram */
|
|
3
|
+
export declare function getFeeHistogram(ctx: ProtocolContext, _params: unknown[]): HandlerResult;
|
|
4
|
+
/** mempool.get_info */
|
|
5
|
+
export declare function getInfo(ctx: ProtocolContext, _params: unknown[]): HandlerResult;
|
|
6
|
+
//# sourceMappingURL=mempool.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"mempool.d.ts","sourceRoot":"","sources":["../src/mempool.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,KAAK,aAAa,EAAM,KAAK,eAAe,EAAE,MAAM,YAAY,CAAC;AAE1E,gCAAgC;AAChC,wBAAgB,eAAe,CAAC,GAAG,EAAE,eAAe,EAAE,OAAO,EAAE,OAAO,EAAE,GAAG,aAAa,CAqCvF;AAED,uBAAuB;AACvB,wBAAgB,OAAO,CAAC,GAAG,EAAE,eAAe,EAAE,OAAO,EAAE,OAAO,EAAE,GAAG,aAAa,CAQ/E"}
|
package/dist/mempool.js
ADDED
|
@@ -0,0 +1,46 @@
|
|
|
1
|
+
import { ok } from "./types.js";
|
|
2
|
+
/** mempool.get_fee_histogram */
|
|
3
|
+
export function getFeeHistogram(ctx, _params) {
|
|
4
|
+
const txids = ctx.node.getMempoolTxids();
|
|
5
|
+
// Collect fee rates (sat/byte) for each mempool tx
|
|
6
|
+
const entries = [];
|
|
7
|
+
for (const txid of txids) {
|
|
8
|
+
const tx = ctx.node.getMempoolTx(txid);
|
|
9
|
+
if (!tx || tx.size === 0)
|
|
10
|
+
continue;
|
|
11
|
+
entries.push({
|
|
12
|
+
feeRate: Number(tx.fee) / tx.size,
|
|
13
|
+
size: tx.size,
|
|
14
|
+
});
|
|
15
|
+
}
|
|
16
|
+
// Sort by fee rate descending
|
|
17
|
+
entries.sort((a, b) => b.feeRate - a.feeRate);
|
|
18
|
+
// Build histogram buckets: [fee_rate, cumulative_vsize]
|
|
19
|
+
// Use logarithmic boundaries matching ElectrumX/Fulcrum convention
|
|
20
|
+
const bucketBoundaries = [1000, 500, 200, 100, 50, 20, 10, 5, 2, 1, 0.5, 0.2, 0.1, 0.01, 0];
|
|
21
|
+
const histogram = [];
|
|
22
|
+
let idx = 0;
|
|
23
|
+
for (const boundary of bucketBoundaries) {
|
|
24
|
+
let cumulativeSize = 0;
|
|
25
|
+
let entry = entries[idx];
|
|
26
|
+
while (entry && entry.feeRate >= boundary) {
|
|
27
|
+
cumulativeSize += entry.size;
|
|
28
|
+
idx++;
|
|
29
|
+
entry = entries[idx];
|
|
30
|
+
}
|
|
31
|
+
if (cumulativeSize > 0) {
|
|
32
|
+
histogram.push([boundary, cumulativeSize]);
|
|
33
|
+
}
|
|
34
|
+
}
|
|
35
|
+
return ok(histogram);
|
|
36
|
+
}
|
|
37
|
+
/** mempool.get_info */
|
|
38
|
+
export function getInfo(ctx, _params) {
|
|
39
|
+
// Default BCH relay fee: 1000 sat/kB = 0.00001 BCH/kB
|
|
40
|
+
const relayFee = ctx.getRelayFee ? ctx.getRelayFee() : 0.00001;
|
|
41
|
+
return ok({
|
|
42
|
+
mempoolminfee: relayFee,
|
|
43
|
+
minrelaytxfee: relayFee,
|
|
44
|
+
});
|
|
45
|
+
}
|
|
46
|
+
//# sourceMappingURL=mempool.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"mempool.js","sourceRoot":"","sources":["../src/mempool.ts"],"names":[],"mappings":"AAAA,OAAO,EAAsB,EAAE,EAAwB,MAAM,YAAY,CAAC;AAE1E,gCAAgC;AAChC,MAAM,UAAU,eAAe,CAAC,GAAoB,EAAE,OAAkB;IACvE,MAAM,KAAK,GAAG,GAAG,CAAC,IAAI,CAAC,eAAe,EAAE,CAAC;IAEzC,mDAAmD;IACnD,MAAM,OAAO,GAAwC,EAAE,CAAC;IACxD,KAAK,MAAM,IAAI,IAAI,KAAK,EAAE,CAAC;QAC1B,MAAM,EAAE,GAAG,GAAG,CAAC,IAAI,CAAC,YAAY,CAAC,IAAI,CAAC,CAAC;QACvC,IAAI,CAAC,EAAE,IAAI,EAAE,CAAC,IAAI,KAAK,CAAC;YAAE,SAAS;QACnC,OAAO,CAAC,IAAI,CAAC;YACZ,OAAO,EAAE,MAAM,CAAC,EAAE,CAAC,GAAG,CAAC,GAAG,EAAE,CAAC,IAAI;YACjC,IAAI,EAAE,EAAE,CAAC,IAAI;SACb,CAAC,CAAC;IACJ,CAAC;IAED,8BAA8B;IAC9B,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,OAAO,GAAG,CAAC,CAAC,OAAO,CAAC,CAAC;IAE9C,wDAAwD;IACxD,mEAAmE;IACnE,MAAM,gBAAgB,GAAG,CAAC,IAAI,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,IAAI,EAAE,CAAC,CAAC,CAAC;IAE5F,MAAM,SAAS,GAAuB,EAAE,CAAC;IACzC,IAAI,GAAG,GAAG,CAAC,CAAC;IACZ,KAAK,MAAM,QAAQ,IAAI,gBAAgB,EAAE,CAAC;QACzC,IAAI,cAAc,GAAG,CAAC,CAAC;QACvB,IAAI,KAAK,GAAG,OAAO,CAAC,GAAG,CAAC,CAAC;QACzB,OAAO,KAAK,IAAI,KAAK,CAAC,OAAO,IAAI,QAAQ,EAAE,CAAC;YAC3C,cAAc,IAAI,KAAK,CAAC,IAAI,CAAC;YAC7B,GAAG,EAAE,CAAC;YACN,KAAK,GAAG,OAAO,CAAC,GAAG,CAAC,CAAC;QACtB,CAAC;QACD,IAAI,cAAc,GAAG,CAAC,EAAE,CAAC;YACxB,SAAS,CAAC,IAAI,CAAC,CAAC,QAAQ,EAAE,cAAc,CAAC,CAAC,CAAC;QAC5C,CAAC;IACF,CAAC;IAED,OAAO,EAAE,CAAC,SAAS,CAAC,CAAC;AACtB,CAAC;AAED,uBAAuB;AACvB,MAAM,UAAU,OAAO,CAAC,GAAoB,EAAE,OAAkB;IAC/D,sDAAsD;IACtD,MAAM,QAAQ,GAAG,GAAG,CAAC,WAAW,CAAC,CAAC,CAAC,GAAG,CAAC,WAAW,EAAE,CAAC,CAAC,CAAC,OAAO,CAAC;IAE/D,OAAO,EAAE,CAAC;QACT,aAAa,EAAE,QAAQ;QACvB,aAAa,EAAE,QAAQ;KACvB,CAAC,CAAC;AACJ,CAAC"}
|