@bsv/wallet-toolbox 2.0.11 → 2.1.0-beta.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.
- package/CHANGELOG.md +27 -0
- package/out/src/index.all.d.ts +1 -0
- package/out/src/index.all.d.ts.map +1 -1
- package/out/src/index.all.js +1 -0
- package/out/src/index.all.js.map +1 -1
- package/out/src/mockchain/MockChainMigrations.d.ts +20 -0
- package/out/src/mockchain/MockChainMigrations.d.ts.map +1 -0
- package/out/src/mockchain/MockChainMigrations.js +67 -0
- package/out/src/mockchain/MockChainMigrations.js.map +1 -0
- package/out/src/mockchain/MockChainStorage.d.ts +58 -0
- package/out/src/mockchain/MockChainStorage.d.ts.map +1 -0
- package/out/src/mockchain/MockChainStorage.js +101 -0
- package/out/src/mockchain/MockChainStorage.js.map +1 -0
- package/out/src/mockchain/MockChainTracker.d.ts +28 -0
- package/out/src/mockchain/MockChainTracker.d.ts.map +1 -0
- package/out/src/mockchain/MockChainTracker.js +95 -0
- package/out/src/mockchain/MockChainTracker.js.map +1 -0
- package/out/src/mockchain/MockMiner.d.ts +16 -0
- package/out/src/mockchain/MockMiner.d.ts.map +1 -0
- package/out/src/mockchain/MockMiner.js +136 -0
- package/out/src/mockchain/MockMiner.js.map +1 -0
- package/out/src/mockchain/MockServices.d.ts +44 -0
- package/out/src/mockchain/MockServices.d.ts.map +1 -0
- package/out/src/mockchain/MockServices.js +504 -0
- package/out/src/mockchain/MockServices.js.map +1 -0
- package/out/src/mockchain/index.d.ts +9 -0
- package/out/src/mockchain/index.d.ts.map +1 -0
- package/out/src/mockchain/index.js +18 -0
- package/out/src/mockchain/index.js.map +1 -0
- package/out/src/mockchain/merkleTree.d.ts +13 -0
- package/out/src/mockchain/merkleTree.d.ts.map +1 -0
- package/out/src/mockchain/merkleTree.js +113 -0
- package/out/src/mockchain/merkleTree.js.map +1 -0
- package/out/src/monitor/Monitor.d.ts +3 -3
- package/out/src/monitor/Monitor.d.ts.map +1 -1
- package/out/src/monitor/Monitor.js +7 -0
- package/out/src/monitor/Monitor.js.map +1 -1
- package/out/src/monitor/tasks/TaskMineBlock.d.ts +13 -0
- package/out/src/monitor/tasks/TaskMineBlock.d.ts.map +1 -0
- package/out/src/monitor/tasks/TaskMineBlock.js +29 -0
- package/out/src/monitor/tasks/TaskMineBlock.js.map +1 -0
- package/out/src/sdk/types.d.ts +1 -1
- package/out/src/sdk/types.d.ts.map +1 -1
- package/out/src/services/Services.d.ts.map +1 -1
- package/out/src/services/Services.js +14 -4
- package/out/src/services/Services.js.map +1 -1
- package/out/src/services/chaintracker/chaintracks/Ingest/WhatsOnChainIngestorWs.d.ts.map +1 -1
- package/out/src/services/chaintracker/chaintracks/Ingest/WhatsOnChainIngestorWs.js +24 -6
- package/out/src/services/chaintracker/chaintracks/Ingest/WhatsOnChainIngestorWs.js.map +1 -1
- package/out/src/services/chaintracker/chaintracks/Ingest/__tests/WhatsOnChainServices.test.d.ts +2 -0
- package/out/src/services/chaintracker/chaintracks/Ingest/__tests/WhatsOnChainServices.test.d.ts.map +1 -0
- package/out/src/services/chaintracker/chaintracks/Ingest/__tests/WhatsOnChainServices.test.js +102 -0
- package/out/src/services/chaintracker/chaintracks/Ingest/__tests/WhatsOnChainServices.test.js.map +1 -0
- package/out/src/services/chaintracker/chaintracks/Storage/ChaintracksStorageNoDb.d.ts.map +1 -1
- package/out/src/services/chaintracker/chaintracks/Storage/ChaintracksStorageNoDb.js +8 -8
- package/out/src/services/chaintracker/chaintracks/Storage/ChaintracksStorageNoDb.js.map +1 -1
- package/out/src/services/chaintracker/chaintracks/util/blockHeaderUtilities.d.ts.map +1 -1
- package/out/src/services/chaintracker/chaintracks/util/blockHeaderUtilities.js +27 -21
- package/out/src/services/chaintracker/chaintracks/util/blockHeaderUtilities.js.map +1 -1
- package/out/src/services/createDefaultWalletServicesOptions.d.ts.map +1 -1
- package/out/src/services/createDefaultWalletServicesOptions.js +14 -4
- package/out/src/services/createDefaultWalletServicesOptions.js.map +1 -1
- package/out/src/services/providers/Bitails.d.ts.map +1 -1
- package/out/src/services/providers/Bitails.js +10 -1
- package/out/src/services/providers/Bitails.js.map +1 -1
- package/out/src/services/providers/SdkWhatsOnChain.d.ts +1 -1
- package/out/src/services/providers/SdkWhatsOnChain.d.ts.map +1 -1
- package/out/src/services/providers/SdkWhatsOnChain.js.map +1 -1
- package/out/src/services/providers/WhatsOnChain.d.ts.map +1 -1
- package/out/src/services/providers/WhatsOnChain.js +2 -0
- package/out/src/services/providers/WhatsOnChain.js.map +1 -1
- package/out/src/utility/utilityHelpers.d.ts.map +1 -1
- package/out/src/utility/utilityHelpers.js +10 -1
- package/out/src/utility/utilityHelpers.js.map +1 -1
- package/package.json +3 -3
package/CHANGELOG.md
CHANGED
|
@@ -4,6 +4,33 @@ This document captures the history of significant changes to the wallet-toolbox
|
|
|
4
4
|
The git commit history contains the details but is unable to draw
|
|
5
5
|
attention to changes that materially alter behavior or extend functionality.
|
|
6
6
|
|
|
7
|
+
## wallet-toolbox 2.1.0
|
|
8
|
+
|
|
9
|
+
### Add `teratest` and `mock` chain types
|
|
10
|
+
|
|
11
|
+
- Change `Chain` type from `'main' | 'test'` to `'main' | 'test' | 'teratest' | 'mock'`.
|
|
12
|
+
|
|
13
|
+
**`teratest` chain:**
|
|
14
|
+
- Add ARC URL `https://arc-teratest.taal.com` for the teratest network.
|
|
15
|
+
- Chaintracks URL follows existing `${chain}net-chaintracks.babbage.systems` pattern.
|
|
16
|
+
- WhatsOnChain URL follows existing `https://api.whatsonchain.com/v1/bsv/${network}` pattern.
|
|
17
|
+
- Bitails is not available on teratest (only `main` and `test`).
|
|
18
|
+
|
|
19
|
+
**`mock` chain — full self-contained mock blockchain:**
|
|
20
|
+
- Add new `src/mockchain/` module with `MockServices`, `MockChainTracker`, `MockMiner`, `MockChainStorage`, and merkle tree utilities.
|
|
21
|
+
- `MockServices` implements the `WalletServices` interface against a local SQLite database (3 tables: `mockchain_block_headers`, `mockchain_transactions`, `mockchain_utxos`).
|
|
22
|
+
- Transactions are validated with full script execution via `@bsv/sdk` `Transaction.verify()`.
|
|
23
|
+
- Coinbase maturity rule enforced (100 block confirmations required before spending).
|
|
24
|
+
- On-demand block mining via `MockServices.mineBlock()`.
|
|
25
|
+
- Chain reorganization simulation via `MockServices.reorg()` with `txidMap` for controlling which transactions land in which new blocks.
|
|
26
|
+
- Add `TaskMineBlock` monitor task for periodic mining (10 minutes) with `mineNow` static flag for on-demand triggering.
|
|
27
|
+
- `Monitor.services` type widened from `Services` to `Services | WalletServices` to support mock chain.
|
|
28
|
+
- `Services` class, `createDefaultWalletServicesOptions`, and external service providers (`WhatsOnChain`, `Bitails`) throw explicit errors if instantiated with `'mock'` chain.
|
|
29
|
+
|
|
30
|
+
**Explicit chain handling across codebase:**
|
|
31
|
+
- Convert chain-dependent ternaries to explicit switch statements in `toWalletNetwork`, `genesisHeader`, `Bitails` constructor, WoC WebSocket ingestors, and `ChaintracksStorageNoDb`.
|
|
32
|
+
- Each chain value (`main`, `test`, `teratest`, `mock`) is handled explicitly rather than falling through a catch-all else branch.
|
|
33
|
+
|
|
7
34
|
## wallet-toolbox 2.0.9
|
|
8
35
|
|
|
9
36
|
Added support for more currency types.
|
package/out/src/index.all.d.ts
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.all.d.ts","sourceRoot":"","sources":["../../src/index.all.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,GAAG,MAAM,aAAa,CAAA;AAElC,cAAc,qBAAqB,CAAA;AACnC,cAAc,qBAAqB,CAAA;AACnC,cAAc,mCAAmC,CAAA;AAEjD,cAAc,SAAS,CAAA;AACvB,cAAc,yBAAyB,CAAA;AAEvC,cAAc,eAAe,CAAA;AAC7B,cAAc,eAAe,CAAA;AAE7B,cAAc,yBAAyB,CAAA;AACvC,cAAc,mBAAmB,CAAA;AACjC,cAAc,4BAA4B,CAAA;AAC1C,cAAc,qBAAqB,CAAA;AACnC,cAAc,uBAAuB,CAAA;AACrC,cAAc,uBAAuB,CAAA;AACrC,cAAc,2DAA2D,CAAA;AACzE,cAAc,0DAA0D,CAAA;AACxE,cAAc,4DAA4D,CAAA;AAC1E,cAAc,2DAA2D,CAAA;AACzE,cAAc,wBAAwB,CAAA;AACtC,cAAc,UAAU,CAAA;AACxB,cAAc,gBAAgB,CAAA;AAC9B,cAAc,+BAA+B,CAAA;AAC7C,cAAc,4BAA4B,CAAA;AAC1C,cAAc,yBAAyB,CAAA;AACvC,cAAc,uBAAuB,CAAA;AACrC,cAAc,4BAA4B,CAAA"}
|
|
1
|
+
{"version":3,"file":"index.all.d.ts","sourceRoot":"","sources":["../../src/index.all.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,GAAG,MAAM,aAAa,CAAA;AAElC,cAAc,qBAAqB,CAAA;AACnC,cAAc,qBAAqB,CAAA;AACnC,cAAc,mCAAmC,CAAA;AAEjD,cAAc,SAAS,CAAA;AACvB,cAAc,yBAAyB,CAAA;AAEvC,cAAc,eAAe,CAAA;AAC7B,cAAc,eAAe,CAAA;AAE7B,cAAc,yBAAyB,CAAA;AACvC,cAAc,mBAAmB,CAAA;AACjC,cAAc,4BAA4B,CAAA;AAC1C,cAAc,qBAAqB,CAAA;AACnC,cAAc,uBAAuB,CAAA;AACrC,cAAc,uBAAuB,CAAA;AACrC,cAAc,2DAA2D,CAAA;AACzE,cAAc,0DAA0D,CAAA;AACxE,cAAc,4DAA4D,CAAA;AAC1E,cAAc,2DAA2D,CAAA;AACzE,cAAc,wBAAwB,CAAA;AACtC,cAAc,UAAU,CAAA;AACxB,cAAc,gBAAgB,CAAA;AAC9B,cAAc,+BAA+B,CAAA;AAC7C,cAAc,4BAA4B,CAAA;AAC1C,cAAc,yBAAyB,CAAA;AACvC,cAAc,uBAAuB,CAAA;AACrC,cAAc,4BAA4B,CAAA;AAC1C,cAAc,mBAAmB,CAAA"}
|
package/out/src/index.all.js
CHANGED
|
@@ -63,4 +63,5 @@ __exportStar(require("./WalletPermissionsManager"), exports);
|
|
|
63
63
|
__exportStar(require("./WalletSettingsManager"), exports);
|
|
64
64
|
__exportStar(require("./ShamirWalletManager"), exports);
|
|
65
65
|
__exportStar(require("./entropy/EntropyCollector"), exports);
|
|
66
|
+
__exportStar(require("./mockchain/index"), exports);
|
|
66
67
|
//# sourceMappingURL=index.all.js.map
|
package/out/src/index.all.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.all.js","sourceRoot":"","sources":["../../src/index.all.ts"],"names":[],"mappings":";;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;AAAA,mDAAkC;AAElC,sDAAmC;AACnC,sDAAmC;AACnC,oEAAiD;AAEjD,0CAAuB;AACvB,0DAAuC;AAEvC,gDAA6B;AAC7B,gDAA6B;AAE7B,0DAAuC;AACvC,oDAAiC;AACjC,6DAA0C;AAC1C,sDAAmC;AACnC,wDAAqC;AACrC,wDAAqC;AACrC,4FAAyE;AACzE,2FAAwE;AACxE,6FAA0E;AAC1E,4FAAyE;AACzE,yDAAsC;AACtC,2CAAwB;AACxB,iDAA8B;AAC9B,gEAA6C;AAC7C,6DAA0C;AAC1C,0DAAuC;AACvC,wDAAqC;AACrC,6DAA0C"}
|
|
1
|
+
{"version":3,"file":"index.all.js","sourceRoot":"","sources":["../../src/index.all.ts"],"names":[],"mappings":";;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;AAAA,mDAAkC;AAElC,sDAAmC;AACnC,sDAAmC;AACnC,oEAAiD;AAEjD,0CAAuB;AACvB,0DAAuC;AAEvC,gDAA6B;AAC7B,gDAA6B;AAE7B,0DAAuC;AACvC,oDAAiC;AACjC,6DAA0C;AAC1C,sDAAmC;AACnC,wDAAqC;AACrC,wDAAqC;AACrC,4FAAyE;AACzE,2FAAwE;AACxE,6FAA0E;AAC1E,4FAAyE;AACzE,yDAAsC;AACtC,2CAAwB;AACxB,iDAA8B;AAC9B,gEAA6C;AAC7C,6DAA0C;AAC1C,0DAAuC;AACvC,wDAAqC;AACrC,6DAA0C;AAC1C,oDAAiC"}
|
|
@@ -0,0 +1,20 @@
|
|
|
1
|
+
import { Knex } from 'knex';
|
|
2
|
+
interface Migration {
|
|
3
|
+
up: (knex: Knex) => Promise<void>;
|
|
4
|
+
down?: (knex: Knex) => Promise<void>;
|
|
5
|
+
}
|
|
6
|
+
interface MigrationSource<TMigrationSpec> {
|
|
7
|
+
getMigrations(loadExtensions: readonly string[]): Promise<TMigrationSpec[]>;
|
|
8
|
+
getMigrationName(migration: TMigrationSpec): string;
|
|
9
|
+
getMigration(migration: TMigrationSpec): Promise<Migration>;
|
|
10
|
+
}
|
|
11
|
+
export declare class MockChainMigrations implements MigrationSource<string> {
|
|
12
|
+
migrations: Record<string, Migration>;
|
|
13
|
+
constructor();
|
|
14
|
+
getMigrations(): Promise<string[]>;
|
|
15
|
+
getMigrationName(migration: string): string;
|
|
16
|
+
getMigration(migration: string): Promise<Migration>;
|
|
17
|
+
setupMigrations(): Record<string, Migration>;
|
|
18
|
+
}
|
|
19
|
+
export {};
|
|
20
|
+
//# sourceMappingURL=MockChainMigrations.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"MockChainMigrations.d.ts","sourceRoot":"","sources":["../../../src/mockchain/MockChainMigrations.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,IAAI,EAAE,MAAM,MAAM,CAAA;AAE3B,UAAU,SAAS;IACjB,EAAE,EAAE,CAAC,IAAI,EAAE,IAAI,KAAK,OAAO,CAAC,IAAI,CAAC,CAAA;IACjC,IAAI,CAAC,EAAE,CAAC,IAAI,EAAE,IAAI,KAAK,OAAO,CAAC,IAAI,CAAC,CAAA;CACrC;AAED,UAAU,eAAe,CAAC,cAAc;IACtC,aAAa,CAAC,cAAc,EAAE,SAAS,MAAM,EAAE,GAAG,OAAO,CAAC,cAAc,EAAE,CAAC,CAAA;IAC3E,gBAAgB,CAAC,SAAS,EAAE,cAAc,GAAG,MAAM,CAAA;IACnD,YAAY,CAAC,SAAS,EAAE,cAAc,GAAG,OAAO,CAAC,SAAS,CAAC,CAAA;CAC5D;AAED,qBAAa,mBAAoB,YAAW,eAAe,CAAC,MAAM,CAAC;IACjE,UAAU,EAAE,MAAM,CAAC,MAAM,EAAE,SAAS,CAAC,CAAK;;IAMpC,aAAa,IAAI,OAAO,CAAC,MAAM,EAAE,CAAC;IAGxC,gBAAgB,CAAC,SAAS,EAAE,MAAM;IAG5B,YAAY,CAAC,SAAS,EAAE,MAAM,GAAG,OAAO,CAAC,SAAS,CAAC;IAIzD,eAAe,IAAI,MAAM,CAAC,MAAM,EAAE,SAAS,CAAC;CAmD7C"}
|
|
@@ -0,0 +1,67 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.MockChainMigrations = void 0;
|
|
4
|
+
class MockChainMigrations {
|
|
5
|
+
constructor() {
|
|
6
|
+
this.migrations = {};
|
|
7
|
+
this.migrations = this.setupMigrations();
|
|
8
|
+
}
|
|
9
|
+
async getMigrations() {
|
|
10
|
+
return Object.keys(this.migrations).sort();
|
|
11
|
+
}
|
|
12
|
+
getMigrationName(migration) {
|
|
13
|
+
return migration;
|
|
14
|
+
}
|
|
15
|
+
async getMigration(migration) {
|
|
16
|
+
return this.migrations[migration];
|
|
17
|
+
}
|
|
18
|
+
setupMigrations() {
|
|
19
|
+
const migrations = {};
|
|
20
|
+
migrations['2026-01-01-001 initial mockchain tables'] = {
|
|
21
|
+
async up(knex) {
|
|
22
|
+
await knex.schema.createTable('mockchain_block_headers', table => {
|
|
23
|
+
table.integer('height').primary();
|
|
24
|
+
table.string('hash', 64).notNullable().unique();
|
|
25
|
+
table.string('previousHash', 64).notNullable();
|
|
26
|
+
table.string('merkleRoot', 64).notNullable();
|
|
27
|
+
table.integer('version').notNullable().defaultTo(1);
|
|
28
|
+
table.integer('time').notNullable();
|
|
29
|
+
table.integer('bits').notNullable();
|
|
30
|
+
table.integer('nonce').notNullable();
|
|
31
|
+
table.string('coinbaseTxid', 64).notNullable();
|
|
32
|
+
table.timestamp('created_at').defaultTo(knex.fn.now()).notNullable();
|
|
33
|
+
});
|
|
34
|
+
await knex.schema.createTable('mockchain_transactions', table => {
|
|
35
|
+
table.string('txid', 64).primary();
|
|
36
|
+
table.binary('rawTx').notNullable();
|
|
37
|
+
table.integer('blockHeight').nullable();
|
|
38
|
+
table.integer('blockIndex').nullable();
|
|
39
|
+
table.timestamp('created_at').defaultTo(knex.fn.now()).notNullable();
|
|
40
|
+
});
|
|
41
|
+
await knex.schema.createTable('mockchain_utxos', table => {
|
|
42
|
+
table.increments('id').primary();
|
|
43
|
+
table.string('txid', 64).notNullable();
|
|
44
|
+
table.integer('vout').notNullable();
|
|
45
|
+
table.binary('lockingScript').notNullable();
|
|
46
|
+
table.bigInteger('satoshis').notNullable();
|
|
47
|
+
table.string('scriptHash', 64).notNullable();
|
|
48
|
+
table.string('spentByTxid', 64).nullable();
|
|
49
|
+
table.boolean('isCoinbase').notNullable().defaultTo(false);
|
|
50
|
+
table.integer('blockHeight').nullable();
|
|
51
|
+
table.timestamp('created_at').defaultTo(knex.fn.now()).notNullable();
|
|
52
|
+
table.unique(['txid', 'vout']);
|
|
53
|
+
table.index('scriptHash');
|
|
54
|
+
table.index('spentByTxid');
|
|
55
|
+
});
|
|
56
|
+
},
|
|
57
|
+
async down(knex) {
|
|
58
|
+
await knex.schema.dropTableIfExists('mockchain_utxos');
|
|
59
|
+
await knex.schema.dropTableIfExists('mockchain_transactions');
|
|
60
|
+
await knex.schema.dropTableIfExists('mockchain_block_headers');
|
|
61
|
+
}
|
|
62
|
+
};
|
|
63
|
+
return migrations;
|
|
64
|
+
}
|
|
65
|
+
}
|
|
66
|
+
exports.MockChainMigrations = MockChainMigrations;
|
|
67
|
+
//# sourceMappingURL=MockChainMigrations.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"MockChainMigrations.js","sourceRoot":"","sources":["../../../src/mockchain/MockChainMigrations.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,58 @@
|
|
|
1
|
+
import { Knex } from 'knex';
|
|
2
|
+
import { BlockHeader } from '../sdk/WalletServices.interfaces';
|
|
3
|
+
export interface MockChainBlockHeaderRow {
|
|
4
|
+
height: number;
|
|
5
|
+
hash: string;
|
|
6
|
+
previousHash: string;
|
|
7
|
+
merkleRoot: string;
|
|
8
|
+
version: number;
|
|
9
|
+
time: number;
|
|
10
|
+
bits: number;
|
|
11
|
+
nonce: number;
|
|
12
|
+
coinbaseTxid: string;
|
|
13
|
+
created_at?: Date | string;
|
|
14
|
+
}
|
|
15
|
+
export interface MockChainTransactionRow {
|
|
16
|
+
txid: string;
|
|
17
|
+
rawTx: number[] | Buffer | Uint8Array;
|
|
18
|
+
blockHeight: number | null;
|
|
19
|
+
blockIndex: number | null;
|
|
20
|
+
created_at?: Date | string;
|
|
21
|
+
}
|
|
22
|
+
export interface MockChainUtxoRow {
|
|
23
|
+
id?: number;
|
|
24
|
+
txid: string;
|
|
25
|
+
vout: number;
|
|
26
|
+
lockingScript: number[] | Buffer | Uint8Array;
|
|
27
|
+
satoshis: number;
|
|
28
|
+
scriptHash: string;
|
|
29
|
+
spentByTxid: string | null;
|
|
30
|
+
isCoinbase: boolean;
|
|
31
|
+
blockHeight: number | null;
|
|
32
|
+
created_at?: Date | string;
|
|
33
|
+
}
|
|
34
|
+
export declare class MockChainStorage {
|
|
35
|
+
knex: Knex;
|
|
36
|
+
constructor(knex: Knex);
|
|
37
|
+
migrate(): Promise<void>;
|
|
38
|
+
insertTransaction(txid: string, rawTx: number[]): Promise<void>;
|
|
39
|
+
getTransaction(txid: string): Promise<MockChainTransactionRow | undefined>;
|
|
40
|
+
getUnminedTransactions(): Promise<MockChainTransactionRow[]>;
|
|
41
|
+
setTransactionBlock(txid: string, height: number, index: number): Promise<void>;
|
|
42
|
+
insertUtxo(txid: string, vout: number, lockingScript: number[], satoshis: number, scriptHash: string, isCoinbase?: boolean, blockHeight?: number | null): Promise<void>;
|
|
43
|
+
getUtxo(txid: string, vout: number): Promise<MockChainUtxoRow | undefined>;
|
|
44
|
+
getUtxosByScriptHash(scriptHash: string): Promise<MockChainUtxoRow[]>;
|
|
45
|
+
markUtxoSpent(txid: string, vout: number, spentByTxid: string): Promise<void>;
|
|
46
|
+
insertBlockHeader(header: MockChainBlockHeaderRow): Promise<void>;
|
|
47
|
+
getBlockHeaderByHeight(height: number): Promise<BlockHeader | undefined>;
|
|
48
|
+
getBlockHeaderByHash(hash: string): Promise<BlockHeader | undefined>;
|
|
49
|
+
getChainTip(): Promise<BlockHeader | undefined>;
|
|
50
|
+
getTransactionsInBlock(height: number): Promise<MockChainTransactionRow[]>;
|
|
51
|
+
deleteBlockHeader(height: number): Promise<void>;
|
|
52
|
+
deleteTransaction(txid: string): Promise<void>;
|
|
53
|
+
deleteUtxosByTxid(txid: string): Promise<void>;
|
|
54
|
+
setUtxoBlockHeight(txid: string, blockHeight: number | null): Promise<void>;
|
|
55
|
+
unspendUtxo(txid: string, vout: number): Promise<void>;
|
|
56
|
+
private rowToBlockHeader;
|
|
57
|
+
}
|
|
58
|
+
//# sourceMappingURL=MockChainStorage.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"MockChainStorage.d.ts","sourceRoot":"","sources":["../../../src/mockchain/MockChainStorage.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,101 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.MockChainStorage = void 0;
|
|
4
|
+
const MockChainMigrations_1 = require("./MockChainMigrations");
|
|
5
|
+
class MockChainStorage {
|
|
6
|
+
constructor(knex) {
|
|
7
|
+
this.knex = knex;
|
|
8
|
+
}
|
|
9
|
+
async migrate() {
|
|
10
|
+
const migrationSource = new MockChainMigrations_1.MockChainMigrations();
|
|
11
|
+
await this.knex.migrate.latest({
|
|
12
|
+
migrationSource,
|
|
13
|
+
tableName: 'knex_migrations_mockchain'
|
|
14
|
+
});
|
|
15
|
+
}
|
|
16
|
+
async insertTransaction(txid, rawTx) {
|
|
17
|
+
await this.knex('mockchain_transactions').insert({
|
|
18
|
+
txid,
|
|
19
|
+
rawTx: Buffer.from(rawTx),
|
|
20
|
+
blockHeight: null,
|
|
21
|
+
blockIndex: null
|
|
22
|
+
});
|
|
23
|
+
}
|
|
24
|
+
async getTransaction(txid) {
|
|
25
|
+
return this.knex('mockchain_transactions').where({ txid }).first();
|
|
26
|
+
}
|
|
27
|
+
async getUnminedTransactions() {
|
|
28
|
+
return this.knex('mockchain_transactions').whereNull('blockHeight');
|
|
29
|
+
}
|
|
30
|
+
async setTransactionBlock(txid, height, index) {
|
|
31
|
+
await this.knex('mockchain_transactions').where({ txid }).update({ blockHeight: height, blockIndex: index });
|
|
32
|
+
}
|
|
33
|
+
async insertUtxo(txid, vout, lockingScript, satoshis, scriptHash, isCoinbase = false, blockHeight = null) {
|
|
34
|
+
await this.knex('mockchain_utxos').insert({
|
|
35
|
+
txid,
|
|
36
|
+
vout,
|
|
37
|
+
lockingScript: Buffer.from(lockingScript),
|
|
38
|
+
satoshis,
|
|
39
|
+
scriptHash,
|
|
40
|
+
spentByTxid: null,
|
|
41
|
+
isCoinbase,
|
|
42
|
+
blockHeight
|
|
43
|
+
});
|
|
44
|
+
}
|
|
45
|
+
async getUtxo(txid, vout) {
|
|
46
|
+
return this.knex('mockchain_utxos').where({ txid, vout }).first();
|
|
47
|
+
}
|
|
48
|
+
async getUtxosByScriptHash(scriptHash) {
|
|
49
|
+
return this.knex('mockchain_utxos').where({ scriptHash });
|
|
50
|
+
}
|
|
51
|
+
async markUtxoSpent(txid, vout, spentByTxid) {
|
|
52
|
+
await this.knex('mockchain_utxos').where({ txid, vout }).update({ spentByTxid });
|
|
53
|
+
}
|
|
54
|
+
async insertBlockHeader(header) {
|
|
55
|
+
await this.knex('mockchain_block_headers').insert(header);
|
|
56
|
+
}
|
|
57
|
+
async getBlockHeaderByHeight(height) {
|
|
58
|
+
const row = await this.knex('mockchain_block_headers').where({ height }).first();
|
|
59
|
+
return row ? this.rowToBlockHeader(row) : undefined;
|
|
60
|
+
}
|
|
61
|
+
async getBlockHeaderByHash(hash) {
|
|
62
|
+
const row = await this.knex('mockchain_block_headers').where({ hash }).first();
|
|
63
|
+
return row ? this.rowToBlockHeader(row) : undefined;
|
|
64
|
+
}
|
|
65
|
+
async getChainTip() {
|
|
66
|
+
const row = await this.knex('mockchain_block_headers').orderBy('height', 'desc').first();
|
|
67
|
+
return row ? this.rowToBlockHeader(row) : undefined;
|
|
68
|
+
}
|
|
69
|
+
async getTransactionsInBlock(height) {
|
|
70
|
+
return this.knex('mockchain_transactions').where({ blockHeight: height }).orderBy('blockIndex', 'asc');
|
|
71
|
+
}
|
|
72
|
+
async deleteBlockHeader(height) {
|
|
73
|
+
await this.knex('mockchain_block_headers').where({ height }).delete();
|
|
74
|
+
}
|
|
75
|
+
async deleteTransaction(txid) {
|
|
76
|
+
await this.knex('mockchain_transactions').where({ txid }).delete();
|
|
77
|
+
}
|
|
78
|
+
async deleteUtxosByTxid(txid) {
|
|
79
|
+
await this.knex('mockchain_utxos').where({ txid }).delete();
|
|
80
|
+
}
|
|
81
|
+
async setUtxoBlockHeight(txid, blockHeight) {
|
|
82
|
+
await this.knex('mockchain_utxos').where({ txid }).update({ blockHeight });
|
|
83
|
+
}
|
|
84
|
+
async unspendUtxo(txid, vout) {
|
|
85
|
+
await this.knex('mockchain_utxos').where({ txid, vout }).update({ spentByTxid: null });
|
|
86
|
+
}
|
|
87
|
+
rowToBlockHeader(row) {
|
|
88
|
+
return {
|
|
89
|
+
height: row.height,
|
|
90
|
+
hash: row.hash,
|
|
91
|
+
previousHash: row.previousHash,
|
|
92
|
+
merkleRoot: row.merkleRoot,
|
|
93
|
+
version: row.version,
|
|
94
|
+
time: row.time,
|
|
95
|
+
bits: row.bits,
|
|
96
|
+
nonce: row.nonce
|
|
97
|
+
};
|
|
98
|
+
}
|
|
99
|
+
}
|
|
100
|
+
exports.MockChainStorage = MockChainStorage;
|
|
101
|
+
//# sourceMappingURL=MockChainStorage.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"MockChainStorage.js","sourceRoot":"","sources":["../../../src/mockchain/MockChainStorage.ts"],"names":[],"mappings":";;;AACA,+DAA2D;AAqC3D,MAAa,gBAAgB;IAC3B,YAAmB,IAAU;QAAV,SAAI,GAAJ,IAAI,CAAM;IAAG,CAAC;IAEjC,KAAK,CAAC,OAAO;QACX,MAAM,eAAe,GAAG,IAAI,yCAAmB,EAAE,CAAA;QACjD,MAAM,IAAI,CAAC,IAAI,CAAC,OAAO,CAAC,MAAM,CAAC;YAC7B,eAAe;YACf,SAAS,EAAE,2BAA2B;SACvC,CAAC,CAAA;IACJ,CAAC;IAED,KAAK,CAAC,iBAAiB,CAAC,IAAY,EAAE,KAAe;QACnD,MAAM,IAAI,CAAC,IAAI,CAAC,wBAAwB,CAAC,CAAC,MAAM,CAAC;YAC/C,IAAI;YACJ,KAAK,EAAE,MAAM,CAAC,IAAI,CAAC,KAAK,CAAC;YACzB,WAAW,EAAE,IAAI;YACjB,UAAU,EAAE,IAAI;SACjB,CAAC,CAAA;IACJ,CAAC;IAED,KAAK,CAAC,cAAc,CAAC,IAAY;QAC/B,OAAO,IAAI,CAAC,IAAI,CAAC,wBAAwB,CAAC,CAAC,KAAK,CAAC,EAAE,IAAI,EAAE,CAAC,CAAC,KAAK,EAAE,CAAA;IACpE,CAAC;IAED,KAAK,CAAC,sBAAsB;QAC1B,OAAO,IAAI,CAAC,IAAI,CAAC,wBAAwB,CAAC,CAAC,SAAS,CAAC,aAAa,CAAC,CAAA;IACrE,CAAC;IAED,KAAK,CAAC,mBAAmB,CAAC,IAAY,EAAE,MAAc,EAAE,KAAa;QACnE,MAAM,IAAI,CAAC,IAAI,CAAC,wBAAwB,CAAC,CAAC,KAAK,CAAC,EAAE,IAAI,EAAE,CAAC,CAAC,MAAM,CAAC,EAAE,WAAW,EAAE,MAAM,EAAE,UAAU,EAAE,KAAK,EAAE,CAAC,CAAA;IAC9G,CAAC;IAED,KAAK,CAAC,UAAU,CACd,IAAY,EACZ,IAAY,EACZ,aAAuB,EACvB,QAAgB,EAChB,UAAkB,EAClB,UAAU,GAAG,KAAK,EAClB,cAA6B,IAAI;QAEjC,MAAM,IAAI,CAAC,IAAI,CAAC,iBAAiB,CAAC,CAAC,MAAM,CAAC;YACxC,IAAI;YACJ,IAAI;YACJ,aAAa,EAAE,MAAM,CAAC,IAAI,CAAC,aAAa,CAAC;YACzC,QAAQ;YACR,UAAU;YACV,WAAW,EAAE,IAAI;YACjB,UAAU;YACV,WAAW;SACZ,CAAC,CAAA;IACJ,CAAC;IAED,KAAK,CAAC,OAAO,CAAC,IAAY,EAAE,IAAY;QACtC,OAAO,IAAI,CAAC,IAAI,CAAC,iBAAiB,CAAC,CAAC,KAAK,CAAC,EAAE,IAAI,EAAE,IAAI,EAAE,CAAC,CAAC,KAAK,EAAE,CAAA;IACnE,CAAC;IAED,KAAK,CAAC,oBAAoB,CAAC,UAAkB;QAC3C,OAAO,IAAI,CAAC,IAAI,CAAC,iBAAiB,CAAC,CAAC,KAAK,CAAC,EAAE,UAAU,EAAE,CAAC,CAAA;IAC3D,CAAC;IAED,KAAK,CAAC,aAAa,CAAC,IAAY,EAAE,IAAY,EAAE,WAAmB;QACjE,MAAM,IAAI,CAAC,IAAI,CAAC,iBAAiB,CAAC,CAAC,KAAK,CAAC,EAAE,IAAI,EAAE,IAAI,EAAE,CAAC,CAAC,MAAM,CAAC,EAAE,WAAW,EAAE,CAAC,CAAA;IAClF,CAAC;IAED,KAAK,CAAC,iBAAiB,CAAC,MAA+B;QACrD,MAAM,IAAI,CAAC,IAAI,CAAC,yBAAyB,CAAC,CAAC,MAAM,CAAC,MAAM,CAAC,CAAA;IAC3D,CAAC;IAED,KAAK,CAAC,sBAAsB,CAAC,MAAc;QACzC,MAAM,GAAG,GAAG,MAAM,IAAI,CAAC,IAAI,CAAC,yBAAyB,CAAC,CAAC,KAAK,CAAC,EAAE,MAAM,EAAE,CAAC,CAAC,KAAK,EAAE,CAAA;QAChF,OAAO,GAAG,CAAC,CAAC,CAAC,IAAI,CAAC,gBAAgB,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,SAAS,CAAA;IACrD,CAAC;IAED,KAAK,CAAC,oBAAoB,CAAC,IAAY;QACrC,MAAM,GAAG,GAAG,MAAM,IAAI,CAAC,IAAI,CAAC,yBAAyB,CAAC,CAAC,KAAK,CAAC,EAAE,IAAI,EAAE,CAAC,CAAC,KAAK,EAAE,CAAA;QAC9E,OAAO,GAAG,CAAC,CAAC,CAAC,IAAI,CAAC,gBAAgB,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,SAAS,CAAA;IACrD,CAAC;IAED,KAAK,CAAC,WAAW;QACf,MAAM,GAAG,GAAG,MAAM,IAAI,CAAC,IAAI,CAAC,yBAAyB,CAAC,CAAC,OAAO,CAAC,QAAQ,EAAE,MAAM,CAAC,CAAC,KAAK,EAAE,CAAA;QACxF,OAAO,GAAG,CAAC,CAAC,CAAC,IAAI,CAAC,gBAAgB,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,SAAS,CAAA;IACrD,CAAC;IAED,KAAK,CAAC,sBAAsB,CAAC,MAAc;QACzC,OAAO,IAAI,CAAC,IAAI,CAAC,wBAAwB,CAAC,CAAC,KAAK,CAAC,EAAE,WAAW,EAAE,MAAM,EAAE,CAAC,CAAC,OAAO,CAAC,YAAY,EAAE,KAAK,CAAC,CAAA;IACxG,CAAC;IAED,KAAK,CAAC,iBAAiB,CAAC,MAAc;QACpC,MAAM,IAAI,CAAC,IAAI,CAAC,yBAAyB,CAAC,CAAC,KAAK,CAAC,EAAE,MAAM,EAAE,CAAC,CAAC,MAAM,EAAE,CAAA;IACvE,CAAC;IAED,KAAK,CAAC,iBAAiB,CAAC,IAAY;QAClC,MAAM,IAAI,CAAC,IAAI,CAAC,wBAAwB,CAAC,CAAC,KAAK,CAAC,EAAE,IAAI,EAAE,CAAC,CAAC,MAAM,EAAE,CAAA;IACpE,CAAC;IAED,KAAK,CAAC,iBAAiB,CAAC,IAAY;QAClC,MAAM,IAAI,CAAC,IAAI,CAAC,iBAAiB,CAAC,CAAC,KAAK,CAAC,EAAE,IAAI,EAAE,CAAC,CAAC,MAAM,EAAE,CAAA;IAC7D,CAAC;IAED,KAAK,CAAC,kBAAkB,CAAC,IAAY,EAAE,WAA0B;QAC/D,MAAM,IAAI,CAAC,IAAI,CAAC,iBAAiB,CAAC,CAAC,KAAK,CAAC,EAAE,IAAI,EAAE,CAAC,CAAC,MAAM,CAAC,EAAE,WAAW,EAAE,CAAC,CAAA;IAC5E,CAAC;IAED,KAAK,CAAC,WAAW,CAAC,IAAY,EAAE,IAAY;QAC1C,MAAM,IAAI,CAAC,IAAI,CAAC,iBAAiB,CAAC,CAAC,KAAK,CAAC,EAAE,IAAI,EAAE,IAAI,EAAE,CAAC,CAAC,MAAM,CAAC,EAAE,WAAW,EAAE,IAAI,EAAE,CAAC,CAAA;IACxF,CAAC;IAEO,gBAAgB,CAAC,GAA4B;QACnD,OAAO;YACL,MAAM,EAAE,GAAG,CAAC,MAAM;YAClB,IAAI,EAAE,GAAG,CAAC,IAAI;YACd,YAAY,EAAE,GAAG,CAAC,YAAY;YAC9B,UAAU,EAAE,GAAG,CAAC,UAAU;YAC1B,OAAO,EAAE,GAAG,CAAC,OAAO;YACpB,IAAI,EAAE,GAAG,CAAC,IAAI;YACd,IAAI,EAAE,GAAG,CAAC,IAAI;YACd,KAAK,EAAE,GAAG,CAAC,KAAK;SACjB,CAAA;IACH,CAAC;CACF;AAxHD,4CAwHC"}
|
|
@@ -0,0 +1,28 @@
|
|
|
1
|
+
import { Chain } from '../sdk/types';
|
|
2
|
+
import { BaseBlockHeader, BlockHeader } from '../sdk/WalletServices.interfaces';
|
|
3
|
+
import { ChaintracksClientApi, ChaintracksInfoApi, HeaderListener, ReorgListener } from '../services/chaintracker/chaintracks/Api/ChaintracksClientApi';
|
|
4
|
+
import { MockChainStorage } from './MockChainStorage';
|
|
5
|
+
export declare class MockChainTracker implements ChaintracksClientApi {
|
|
6
|
+
chain: Chain;
|
|
7
|
+
storage: MockChainStorage;
|
|
8
|
+
constructor(chain: Chain, storage: MockChainStorage);
|
|
9
|
+
currentHeight(): Promise<number>;
|
|
10
|
+
isValidRootForHeight(root: string, height: number): Promise<boolean>;
|
|
11
|
+
getChain(): Promise<Chain>;
|
|
12
|
+
getInfo(): Promise<ChaintracksInfoApi>;
|
|
13
|
+
getPresentHeight(): Promise<number>;
|
|
14
|
+
getHeaders(height: number, count: number): Promise<string>;
|
|
15
|
+
findChainTipHeader(): Promise<BlockHeader>;
|
|
16
|
+
findChainTipHash(): Promise<string>;
|
|
17
|
+
findHeaderForHeight(height: number): Promise<BlockHeader | undefined>;
|
|
18
|
+
findHeaderForBlockHash(hash: string): Promise<BlockHeader | undefined>;
|
|
19
|
+
addHeader(_header: BaseBlockHeader): Promise<void>;
|
|
20
|
+
startListening(): Promise<void>;
|
|
21
|
+
listening(): Promise<void>;
|
|
22
|
+
isListening(): Promise<boolean>;
|
|
23
|
+
isSynchronized(): Promise<boolean>;
|
|
24
|
+
subscribeHeaders(_listener: HeaderListener): Promise<string>;
|
|
25
|
+
subscribeReorgs(_listener: ReorgListener): Promise<string>;
|
|
26
|
+
unsubscribe(_subscriptionId: string): Promise<boolean>;
|
|
27
|
+
}
|
|
28
|
+
//# sourceMappingURL=MockChainTracker.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"MockChainTracker.d.ts","sourceRoot":"","sources":["../../../src/mockchain/MockChainTracker.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,KAAK,EAAE,MAAM,cAAc,CAAA;AACpC,OAAO,EAAE,eAAe,EAAE,WAAW,EAAE,MAAM,kCAAkC,CAAA;AAE/E,OAAO,EACL,oBAAoB,EACpB,kBAAkB,EAClB,cAAc,EACd,aAAa,EACd,MAAM,+DAA+D,CAAA;AACtE,OAAO,EAAE,gBAAgB,EAAE,MAAM,oBAAoB,CAAA;AAIrD,qBAAa,gBAAiB,YAAW,oBAAoB;IAElD,KAAK,EAAE,KAAK;IACZ,OAAO,EAAE,gBAAgB;gBADzB,KAAK,EAAE,KAAK,EACZ,OAAO,EAAE,gBAAgB;IAG5B,aAAa,IAAI,OAAO,CAAC,MAAM,CAAC;IAKhC,oBAAoB,CAAC,IAAI,EAAE,MAAM,EAAE,MAAM,EAAE,MAAM,GAAG,OAAO,CAAC,OAAO,CAAC;IAMpE,QAAQ,IAAI,OAAO,CAAC,KAAK,CAAC;IAI1B,OAAO,IAAI,OAAO,CAAC,kBAAkB,CAAC;IAatC,gBAAgB,IAAI,OAAO,CAAC,MAAM,CAAC;IAInC,UAAU,CAAC,MAAM,EAAE,MAAM,EAAE,KAAK,EAAE,MAAM,GAAG,OAAO,CAAC,MAAM,CAAC;IAW1D,kBAAkB,IAAI,OAAO,CAAC,WAAW,CAAC;IAM1C,gBAAgB,IAAI,OAAO,CAAC,MAAM,CAAC;IAMnC,mBAAmB,CAAC,MAAM,EAAE,MAAM,GAAG,OAAO,CAAC,WAAW,GAAG,SAAS,CAAC;IAIrE,sBAAsB,CAAC,IAAI,EAAE,MAAM,GAAG,OAAO,CAAC,WAAW,GAAG,SAAS,CAAC;IAItE,SAAS,CAAC,OAAO,EAAE,eAAe,GAAG,OAAO,CAAC,IAAI,CAAC;IAIlD,cAAc,IAAI,OAAO,CAAC,IAAI,CAAC;IAI/B,SAAS,IAAI,OAAO,CAAC,IAAI,CAAC;IAI1B,WAAW,IAAI,OAAO,CAAC,OAAO,CAAC;IAI/B,cAAc,IAAI,OAAO,CAAC,OAAO,CAAC;IAIlC,gBAAgB,CAAC,SAAS,EAAE,cAAc,GAAG,OAAO,CAAC,MAAM,CAAC;IAI5D,eAAe,CAAC,SAAS,EAAE,aAAa,GAAG,OAAO,CAAC,MAAM,CAAC;IAI1D,WAAW,CAAC,eAAe,EAAE,MAAM,GAAG,OAAO,CAAC,OAAO,CAAC;CAG7D"}
|
|
@@ -0,0 +1,95 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.MockChainTracker = void 0;
|
|
4
|
+
const sdk_1 = require("@bsv/sdk");
|
|
5
|
+
const Services_1 = require("../services/Services");
|
|
6
|
+
const WERR_errors_1 = require("../sdk/WERR_errors");
|
|
7
|
+
class MockChainTracker {
|
|
8
|
+
constructor(chain, storage) {
|
|
9
|
+
this.chain = chain;
|
|
10
|
+
this.storage = storage;
|
|
11
|
+
}
|
|
12
|
+
async currentHeight() {
|
|
13
|
+
const tip = await this.storage.getChainTip();
|
|
14
|
+
return tip ? tip.height : -1;
|
|
15
|
+
}
|
|
16
|
+
async isValidRootForHeight(root, height) {
|
|
17
|
+
const header = await this.storage.getBlockHeaderByHeight(height);
|
|
18
|
+
if (!header)
|
|
19
|
+
return false;
|
|
20
|
+
return header.merkleRoot === root;
|
|
21
|
+
}
|
|
22
|
+
async getChain() {
|
|
23
|
+
return this.chain;
|
|
24
|
+
}
|
|
25
|
+
async getInfo() {
|
|
26
|
+
const tip = await this.storage.getChainTip();
|
|
27
|
+
return {
|
|
28
|
+
chain: this.chain,
|
|
29
|
+
heightBulk: tip ? tip.height : -1,
|
|
30
|
+
heightLive: tip ? tip.height : -1,
|
|
31
|
+
storage: 'mockchain',
|
|
32
|
+
bulkIngestors: [],
|
|
33
|
+
liveIngestors: [],
|
|
34
|
+
packages: []
|
|
35
|
+
};
|
|
36
|
+
}
|
|
37
|
+
async getPresentHeight() {
|
|
38
|
+
return this.currentHeight();
|
|
39
|
+
}
|
|
40
|
+
async getHeaders(height, count) {
|
|
41
|
+
let hex = '';
|
|
42
|
+
for (let h = height; h < height + count; h++) {
|
|
43
|
+
const header = await this.storage.getBlockHeaderByHeight(h);
|
|
44
|
+
if (!header)
|
|
45
|
+
break;
|
|
46
|
+
const binary = (0, Services_1.toBinaryBaseBlockHeader)(header);
|
|
47
|
+
hex += sdk_1.Utils.toHex(binary);
|
|
48
|
+
}
|
|
49
|
+
return hex;
|
|
50
|
+
}
|
|
51
|
+
async findChainTipHeader() {
|
|
52
|
+
const tip = await this.storage.getChainTip();
|
|
53
|
+
if (!tip)
|
|
54
|
+
throw new Error('Mock chain has no blocks');
|
|
55
|
+
return tip;
|
|
56
|
+
}
|
|
57
|
+
async findChainTipHash() {
|
|
58
|
+
const tip = await this.storage.getChainTip();
|
|
59
|
+
if (!tip)
|
|
60
|
+
throw new Error('Mock chain has no blocks');
|
|
61
|
+
return tip.hash;
|
|
62
|
+
}
|
|
63
|
+
async findHeaderForHeight(height) {
|
|
64
|
+
return this.storage.getBlockHeaderByHeight(height);
|
|
65
|
+
}
|
|
66
|
+
async findHeaderForBlockHash(hash) {
|
|
67
|
+
return this.storage.getBlockHeaderByHash(hash);
|
|
68
|
+
}
|
|
69
|
+
async addHeader(_header) {
|
|
70
|
+
// no-op for mock chain
|
|
71
|
+
}
|
|
72
|
+
async startListening() {
|
|
73
|
+
// no-op
|
|
74
|
+
}
|
|
75
|
+
async listening() {
|
|
76
|
+
// no-op
|
|
77
|
+
}
|
|
78
|
+
async isListening() {
|
|
79
|
+
return true;
|
|
80
|
+
}
|
|
81
|
+
async isSynchronized() {
|
|
82
|
+
return true;
|
|
83
|
+
}
|
|
84
|
+
async subscribeHeaders(_listener) {
|
|
85
|
+
throw new WERR_errors_1.WERR_NOT_IMPLEMENTED('subscribeHeaders not supported on mock chain');
|
|
86
|
+
}
|
|
87
|
+
async subscribeReorgs(_listener) {
|
|
88
|
+
throw new WERR_errors_1.WERR_NOT_IMPLEMENTED('subscribeReorgs not supported on mock chain');
|
|
89
|
+
}
|
|
90
|
+
async unsubscribe(_subscriptionId) {
|
|
91
|
+
throw new WERR_errors_1.WERR_NOT_IMPLEMENTED('unsubscribe not supported on mock chain');
|
|
92
|
+
}
|
|
93
|
+
}
|
|
94
|
+
exports.MockChainTracker = MockChainTracker;
|
|
95
|
+
//# sourceMappingURL=MockChainTracker.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"MockChainTracker.js","sourceRoot":"","sources":["../../../src/mockchain/MockChainTracker.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,16 @@
|
|
|
1
|
+
import { Transaction } from '@bsv/sdk';
|
|
2
|
+
import { MockChainStorage } from './MockChainStorage';
|
|
3
|
+
import { BlockHeader } from '../sdk/WalletServices.interfaces';
|
|
4
|
+
/**
|
|
5
|
+
* Creates a coinbase transaction for the given block height.
|
|
6
|
+
* Uses OP_TRUE (0x51) as the output script so anyone can spend it.
|
|
7
|
+
*/
|
|
8
|
+
export declare function createCoinbaseTransaction(height: number): Transaction;
|
|
9
|
+
export declare class MockMiner {
|
|
10
|
+
/**
|
|
11
|
+
* Mine a new block containing all unmined transactions.
|
|
12
|
+
* Returns the new block header.
|
|
13
|
+
*/
|
|
14
|
+
mineBlock(storage: MockChainStorage): Promise<BlockHeader>;
|
|
15
|
+
}
|
|
16
|
+
//# sourceMappingURL=MockMiner.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"MockMiner.d.ts","sourceRoot":"","sources":["../../../src/mockchain/MockMiner.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,WAAW,EAAiB,MAAM,UAAU,CAAA;AACrD,OAAO,EAAE,gBAAgB,EAA2B,MAAM,oBAAoB,CAAA;AAK9E,OAAO,EAAE,WAAW,EAAE,MAAM,kCAAkC,CAAA;AAE9D;;;GAGG;AACH,wBAAgB,yBAAyB,CAAC,MAAM,EAAE,MAAM,GAAG,WAAW,CAoCrE;AAED,qBAAa,SAAS;IACpB;;;OAGG;IACG,SAAS,CAAC,OAAO,EAAE,gBAAgB,GAAG,OAAO,CAAC,WAAW,CAAC;CA+FjE"}
|
|
@@ -0,0 +1,136 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.MockMiner = void 0;
|
|
4
|
+
exports.createCoinbaseTransaction = createCoinbaseTransaction;
|
|
5
|
+
const sdk_1 = require("@bsv/sdk");
|
|
6
|
+
const MockChainStorage_1 = require("./MockChainStorage");
|
|
7
|
+
const merkleTree_1 = require("./merkleTree");
|
|
8
|
+
const Services_1 = require("../services/Services");
|
|
9
|
+
const utilityHelpers_1 = require("../utility/utilityHelpers");
|
|
10
|
+
const utilityHelpers_noBuffer_1 = require("../utility/utilityHelpers.noBuffer");
|
|
11
|
+
/**
|
|
12
|
+
* Creates a coinbase transaction for the given block height.
|
|
13
|
+
* Uses OP_TRUE (0x51) as the output script so anyone can spend it.
|
|
14
|
+
*/
|
|
15
|
+
function createCoinbaseTransaction(height) {
|
|
16
|
+
const tx = new sdk_1.Transaction();
|
|
17
|
+
// BIP34: height in scriptSig
|
|
18
|
+
// Encode height as a minimally-encoded script number pushed in the unlocking script
|
|
19
|
+
const heightBytes = [];
|
|
20
|
+
let h = height;
|
|
21
|
+
if (h === 0) {
|
|
22
|
+
heightBytes.push(0);
|
|
23
|
+
}
|
|
24
|
+
else {
|
|
25
|
+
while (h > 0) {
|
|
26
|
+
heightBytes.push(h & 0xff);
|
|
27
|
+
h >>= 8;
|
|
28
|
+
}
|
|
29
|
+
// If the high bit is set, add a 0x00 byte to keep it positive
|
|
30
|
+
if (heightBytes[heightBytes.length - 1] & 0x80) {
|
|
31
|
+
heightBytes.push(0);
|
|
32
|
+
}
|
|
33
|
+
}
|
|
34
|
+
const scriptSigBytes = [heightBytes.length, ...heightBytes];
|
|
35
|
+
const unlockingScript = sdk_1.Script.fromBinary(scriptSigBytes);
|
|
36
|
+
tx.addInput({
|
|
37
|
+
sourceTXID: '00'.repeat(32),
|
|
38
|
+
sourceOutputIndex: 0xffffffff,
|
|
39
|
+
unlockingScript,
|
|
40
|
+
sequence: 0xffffffff
|
|
41
|
+
});
|
|
42
|
+
tx.addOutput({
|
|
43
|
+
satoshis: 5000000000,
|
|
44
|
+
lockingScript: sdk_1.Script.fromHex('51') // OP_TRUE
|
|
45
|
+
});
|
|
46
|
+
return tx;
|
|
47
|
+
}
|
|
48
|
+
class MockMiner {
|
|
49
|
+
/**
|
|
50
|
+
* Mine a new block containing all unmined transactions.
|
|
51
|
+
* Returns the new block header.
|
|
52
|
+
*/
|
|
53
|
+
async mineBlock(storage) {
|
|
54
|
+
const tip = await storage.getChainTip();
|
|
55
|
+
const newHeight = tip ? tip.height + 1 : 0;
|
|
56
|
+
const previousHash = tip ? tip.hash : '00'.repeat(32);
|
|
57
|
+
const unminedTxs = await storage.getUnminedTransactions();
|
|
58
|
+
const coinbaseTx = createCoinbaseTransaction(newHeight);
|
|
59
|
+
const coinbaseTxid = coinbaseTx.id('hex');
|
|
60
|
+
const coinbaseRawTx = Array.from(coinbaseTx.toBinary());
|
|
61
|
+
const txids = [coinbaseTxid, ...unminedTxs.map(t => t.txid)];
|
|
62
|
+
const merkleRoot = (0, merkleTree_1.computeMerkleRoot)(txids);
|
|
63
|
+
const time = Math.floor(Date.now() / 1000);
|
|
64
|
+
const bits = 0x207fffff;
|
|
65
|
+
const nonce = Math.floor(Math.random() * 0xffffffff);
|
|
66
|
+
const headerObj = {
|
|
67
|
+
version: 1,
|
|
68
|
+
previousHash,
|
|
69
|
+
merkleRoot,
|
|
70
|
+
time,
|
|
71
|
+
bits,
|
|
72
|
+
nonce
|
|
73
|
+
};
|
|
74
|
+
const headerBinary = (0, Services_1.toBinaryBaseBlockHeader)(headerObj);
|
|
75
|
+
const hash = (0, utilityHelpers_noBuffer_1.asString)((0, utilityHelpers_1.doubleSha256BE)(headerBinary));
|
|
76
|
+
// Compute script hash for the coinbase output (OP_TRUE = 0x51)
|
|
77
|
+
const coinbaseOutputScript = [0x51];
|
|
78
|
+
const coinbaseScriptHash = (0, utilityHelpers_noBuffer_1.asString)((0, utilityHelpers_1.sha256Hash)(coinbaseOutputScript));
|
|
79
|
+
// Wrap in a knex transaction for atomicity
|
|
80
|
+
await storage.knex.transaction(async (trx) => {
|
|
81
|
+
const trxStorage = new MockChainStorage_1.MockChainStorage(trx);
|
|
82
|
+
// Insert coinbase tx
|
|
83
|
+
await trxStorage.knex('mockchain_transactions').insert({
|
|
84
|
+
txid: coinbaseTxid,
|
|
85
|
+
rawTx: Buffer.from(coinbaseRawTx),
|
|
86
|
+
blockHeight: newHeight,
|
|
87
|
+
blockIndex: 0
|
|
88
|
+
});
|
|
89
|
+
// Insert coinbase UTXO
|
|
90
|
+
await trxStorage.knex('mockchain_utxos').insert({
|
|
91
|
+
txid: coinbaseTxid,
|
|
92
|
+
vout: 0,
|
|
93
|
+
lockingScript: Buffer.from(coinbaseOutputScript),
|
|
94
|
+
satoshis: 5000000000,
|
|
95
|
+
scriptHash: coinbaseScriptHash,
|
|
96
|
+
spentByTxid: null,
|
|
97
|
+
isCoinbase: true,
|
|
98
|
+
blockHeight: newHeight
|
|
99
|
+
});
|
|
100
|
+
// Update unmined txs with block height and sequential block index
|
|
101
|
+
for (let i = 0; i < unminedTxs.length; i++) {
|
|
102
|
+
await trxStorage
|
|
103
|
+
.knex('mockchain_transactions')
|
|
104
|
+
.where({ txid: unminedTxs[i].txid })
|
|
105
|
+
.update({ blockHeight: newHeight, blockIndex: i + 1 });
|
|
106
|
+
// Update blockHeight on UTXOs belonging to these transactions
|
|
107
|
+
await trxStorage.knex('mockchain_utxos').where({ txid: unminedTxs[i].txid }).update({ blockHeight: newHeight });
|
|
108
|
+
}
|
|
109
|
+
// Insert block header
|
|
110
|
+
const headerRow = {
|
|
111
|
+
height: newHeight,
|
|
112
|
+
hash,
|
|
113
|
+
previousHash,
|
|
114
|
+
merkleRoot,
|
|
115
|
+
version: 1,
|
|
116
|
+
time,
|
|
117
|
+
bits,
|
|
118
|
+
nonce,
|
|
119
|
+
coinbaseTxid
|
|
120
|
+
};
|
|
121
|
+
await trxStorage.knex('mockchain_block_headers').insert(headerRow);
|
|
122
|
+
});
|
|
123
|
+
return {
|
|
124
|
+
height: newHeight,
|
|
125
|
+
hash,
|
|
126
|
+
previousHash,
|
|
127
|
+
merkleRoot,
|
|
128
|
+
version: 1,
|
|
129
|
+
time,
|
|
130
|
+
bits,
|
|
131
|
+
nonce
|
|
132
|
+
};
|
|
133
|
+
}
|
|
134
|
+
}
|
|
135
|
+
exports.MockMiner = MockMiner;
|
|
136
|
+
//# sourceMappingURL=MockMiner.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"MockMiner.js","sourceRoot":"","sources":["../../../src/mockchain/MockMiner.ts"],"names":[],"mappings":"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"}
|