@bsv/overlay 2.2.1 → 2.2.7
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/LICENSE.txt +57 -27
- package/README.md +102 -269
- package/dist/cjs/mod.d.ts +15 -0
- package/dist/cjs/mod.d.ts.map +1 -0
- package/dist/cjs/mod.js +4 -1
- package/dist/cjs/mod.js.map +1 -1
- package/dist/cjs/package.json +41 -13
- package/dist/cjs/src/Advertisement.d.ts +9 -0
- package/dist/cjs/src/Advertisement.d.ts.map +1 -0
- package/dist/cjs/src/Advertiser.d.ts +36 -0
- package/dist/cjs/src/Advertiser.d.ts.map +1 -0
- package/dist/cjs/src/BASM.d.ts +110 -0
- package/dist/cjs/src/BASM.d.ts.map +1 -0
- package/dist/cjs/src/BASM.js.map +1 -1
- package/dist/cjs/src/BASMRemote.d.ts +14 -0
- package/dist/cjs/src/BASMRemote.d.ts.map +1 -0
- package/dist/cjs/src/BASMRemote.js.map +1 -1
- package/dist/cjs/src/Engine.d.ts +377 -0
- package/dist/cjs/src/Engine.d.ts.map +1 -0
- package/dist/cjs/src/Engine.js +416 -417
- package/dist/cjs/src/Engine.js.map +1 -1
- package/dist/cjs/src/GASP/OverlayGASPRemote.d.ts +24 -0
- package/dist/cjs/src/GASP/OverlayGASPRemote.d.ts.map +1 -0
- package/dist/cjs/src/GASP/OverlayGASPRemote.js +7 -10
- package/dist/cjs/src/GASP/OverlayGASPRemote.js.map +1 -1
- package/dist/cjs/src/GASP/OverlayGASPStorage.d.ts +103 -0
- package/dist/cjs/src/GASP/OverlayGASPStorage.d.ts.map +1 -0
- package/dist/cjs/src/GASP/OverlayGASPStorage.js +32 -30
- package/dist/cjs/src/GASP/OverlayGASPStorage.js.map +1 -1
- package/dist/cjs/src/LookupFormula.d.ts +29 -0
- package/dist/cjs/src/LookupFormula.d.ts.map +1 -0
- package/dist/cjs/src/LookupService.d.ts +85 -0
- package/dist/cjs/src/LookupService.d.ts.map +1 -0
- package/dist/cjs/src/Output.d.ts +32 -0
- package/dist/cjs/src/Output.d.ts.map +1 -0
- package/dist/cjs/src/SafeLog.d.ts +14 -0
- package/dist/cjs/src/SafeLog.d.ts.map +1 -0
- package/dist/cjs/src/SafeLog.js +44 -0
- package/dist/cjs/src/SafeLog.js.map +1 -0
- package/{src/SyncConfiguration.ts → dist/cjs/src/SyncConfiguration.d.ts} +2 -1
- package/dist/cjs/src/SyncConfiguration.d.ts.map +1 -0
- package/dist/cjs/src/TopicManager.d.ts +35 -0
- package/dist/cjs/src/TopicManager.d.ts.map +1 -0
- package/dist/cjs/src/storage/Storage.d.ts +237 -0
- package/dist/cjs/src/storage/Storage.d.ts.map +1 -0
- package/dist/cjs/src/storage/knex/KnexStorage.d.ts +69 -0
- package/dist/cjs/src/storage/knex/KnexStorage.d.ts.map +1 -0
- package/dist/cjs/src/storage/knex/KnexStorage.js +7 -10
- package/dist/cjs/src/storage/knex/KnexStorage.js.map +1 -1
- package/dist/cjs/src/storage/knex/all-migrations.d.ts +11 -0
- package/dist/cjs/src/storage/knex/all-migrations.d.ts.map +1 -0
- package/dist/cjs/src/storage/knex/all-migrations.js.map +1 -1
- package/dist/cjs/src/storage/knex/migrations/2024-05-18-001-initial.d.ts +4 -0
- package/dist/cjs/src/storage/knex/migrations/2024-05-18-001-initial.d.ts.map +1 -0
- package/dist/cjs/src/storage/knex/migrations/2024-05-18-001-initial.js.map +1 -1
- package/dist/cjs/src/storage/knex/migrations/2024-07-10-001-block-height.d.ts +4 -0
- package/dist/cjs/src/storage/knex/migrations/2024-07-10-001-block-height.d.ts.map +1 -0
- package/dist/cjs/src/storage/knex/migrations/2024-07-10-001-block-height.js.map +1 -1
- package/dist/cjs/src/storage/knex/migrations/2024-07-17-001-transactions.d.ts +4 -0
- package/dist/cjs/src/storage/knex/migrations/2024-07-17-001-transactions.d.ts.map +1 -0
- package/dist/cjs/src/storage/knex/migrations/2024-07-17-001-transactions.js.map +1 -1
- package/dist/cjs/src/storage/knex/migrations/2024-07-18-001-indexes.d.ts +4 -0
- package/dist/cjs/src/storage/knex/migrations/2024-07-18-001-indexes.d.ts.map +1 -0
- package/dist/cjs/src/storage/knex/migrations/2024-07-18-001-indexes.js.map +1 -1
- package/dist/cjs/src/storage/knex/migrations/2025-05-28-001-enlarge.d.ts +4 -0
- package/dist/cjs/src/storage/knex/migrations/2025-05-28-001-enlarge.d.ts.map +1 -0
- package/dist/cjs/src/storage/knex/migrations/2025-05-28-001-enlarge.js.map +1 -1
- package/dist/cjs/src/storage/knex/migrations/2025-06-25-001-gasp-pagination-support.d.ts +4 -0
- package/dist/cjs/src/storage/knex/migrations/2025-06-25-001-gasp-pagination-support.d.ts.map +1 -0
- package/dist/cjs/src/storage/knex/migrations/2025-06-25-001-gasp-pagination-support.js.map +1 -1
- package/dist/cjs/src/storage/knex/migrations/2025-07-22-001-fix-score-column-type.d.ts +4 -0
- package/dist/cjs/src/storage/knex/migrations/2025-07-22-001-fix-score-column-type.d.ts.map +1 -0
- package/dist/cjs/src/storage/knex/migrations/2025-07-22-001-fix-score-column-type.js.map +1 -1
- package/dist/cjs/src/storage/knex/migrations/2025-11-11-001-utxo-lookup-index.d.ts +9 -0
- package/dist/cjs/src/storage/knex/migrations/2025-11-11-001-utxo-lookup-index.d.ts.map +1 -0
- package/dist/cjs/src/storage/knex/migrations/2025-11-11-001-utxo-lookup-index.js.map +1 -1
- package/dist/cjs/src/storage/knex/migrations/2026-05-29-001-brc136-basm.d.ts +4 -0
- package/dist/cjs/src/storage/knex/migrations/2026-05-29-001-brc136-basm.d.ts.map +1 -0
- package/dist/cjs/src/storage/knex/migrations/2026-05-29-001-brc136-basm.js.map +1 -1
- package/dist/esm/mod.js +2 -1
- package/dist/esm/mod.js.map +1 -1
- package/dist/esm/src/BASMRemote.js.map +1 -1
- package/dist/esm/src/Engine.js +394 -395
- package/dist/esm/src/Engine.js.map +1 -1
- package/dist/esm/src/GASP/OverlayGASPRemote.js +2 -2
- package/dist/esm/src/GASP/OverlayGASPRemote.js.map +1 -1
- package/dist/esm/src/GASP/OverlayGASPStorage.js +21 -18
- package/dist/esm/src/GASP/OverlayGASPStorage.js.map +1 -1
- package/dist/esm/src/SafeLog.js +40 -0
- package/dist/esm/src/SafeLog.js.map +1 -0
- package/dist/esm/src/storage/knex/KnexStorage.js.map +1 -1
- package/dist/types/mod.d.ts +5 -4
- package/dist/types/mod.d.ts.map +1 -1
- package/dist/types/src/BASMRemote.d.ts.map +1 -1
- package/dist/types/src/Engine.d.ts +15 -0
- package/dist/types/src/Engine.d.ts.map +1 -1
- package/dist/types/src/GASP/OverlayGASPRemote.d.ts +2 -2
- package/dist/types/src/GASP/OverlayGASPRemote.d.ts.map +1 -1
- package/dist/types/src/GASP/OverlayGASPStorage.d.ts +3 -1
- package/dist/types/src/GASP/OverlayGASPStorage.d.ts.map +1 -1
- package/dist/types/src/SafeLog.d.ts +14 -0
- package/dist/types/src/SafeLog.d.ts.map +1 -0
- package/dist/types/src/storage/knex/KnexStorage.d.ts.map +1 -1
- package/dist/types/src/storage/knex/all-migrations.d.ts.map +1 -1
- package/package.json +85 -28
- package/dist/cjs/tsconfig.cjs.tsbuildinfo +0 -1
- package/dist/esm/tsconfig.esm.tsbuildinfo +0 -1
- package/dist/types/tsconfig.types.tsbuildinfo +0 -1
- package/docs/API.md +0 -944
- package/docs/BRC-136-BASM.md +0 -327
- package/docs/README.md +0 -16
- package/docs/Synchronization.md +0 -212
- package/docs/concepts/00-overview.md +0 -85
- package/docs/concepts/01-best-practices.md +0 -202
- package/docs/concepts/02-query-performance.md +0 -345
- package/docs/concepts/03-database-monitoring.md +0 -211
- package/docs/concepts/04-pagination-example.md +0 -186
- package/docs/concepts/05-recommendations-summary.md +0 -158
- package/docs/concepts/README.md +0 -20
- package/docs/examples/README.md +0 -15
- package/docs/examples/gs-wip.md +0 -111
- package/docs/internal/README.md +0 -11
- package/mod.ts +0 -40
- package/src/Advertisement.ts +0 -8
- package/src/Advertiser.ts +0 -41
- package/src/BASM.ts +0 -208
- package/src/BASMRemote.ts +0 -54
- package/src/Engine.ts +0 -2194
- package/src/GASP/OverlayGASPRemote.ts +0 -108
- package/src/GASP/OverlayGASPStorage.ts +0 -384
- package/src/LookupFormula.ts +0 -31
- package/src/LookupService.ts +0 -136
- package/src/Output.ts +0 -31
- package/src/TopicManager.ts +0 -40
- package/src/__tests/BASM.test.ts +0 -44
- package/src/__tests/BASMChain.test.ts +0 -295
- package/src/__tests/Engine.test.ts +0 -1381
- package/src/__tests/OverlayGASPRemote.test.ts +0 -135
- package/src/__tests/OverlayGASPStorage.test.ts +0 -205
- package/src/storage/Storage.ts +0 -260
- package/src/storage/knex/KnexStorage.ts +0 -651
- package/src/storage/knex/all-migrations.ts +0 -32
- package/src/storage/knex/migrations/2024-05-18-001-initial.ts +0 -30
- package/src/storage/knex/migrations/2024-07-10-001-block-height.ts +0 -15
- package/src/storage/knex/migrations/2024-07-17-001-transactions.ts +0 -64
- package/src/storage/knex/migrations/2024-07-18-001-indexes.ts +0 -30
- package/src/storage/knex/migrations/2025-05-28-001-enlarge.ts +0 -42
- package/src/storage/knex/migrations/2025-06-25-001-gasp-pagination-support.ts +0 -46
- package/src/storage/knex/migrations/2025-07-22-001-fix-score-column-type.ts +0 -24
- package/src/storage/knex/migrations/2025-11-11-001-utxo-lookup-index.ts +0 -18
- package/src/storage/knex/migrations/2026-05-29-001-brc136-basm.ts +0 -123
|
@@ -1,30 +0,0 @@
|
|
|
1
|
-
import type { Knex } from 'knex'
|
|
2
|
-
|
|
3
|
-
export async function up (knex: Knex): Promise<void> {
|
|
4
|
-
await knex.schema.createTable('outputs', table => {
|
|
5
|
-
table.increments()
|
|
6
|
-
table.string('txid', 64)
|
|
7
|
-
table.integer('outputIndex', 10)
|
|
8
|
-
table.binary('outputScript')
|
|
9
|
-
table.string('topic')
|
|
10
|
-
table.integer('satoshis', 15)
|
|
11
|
-
table.binary('beef')
|
|
12
|
-
// Represents the outputs that were provided as inputs
|
|
13
|
-
// to the transaction that created this output.
|
|
14
|
-
// This indicates the correct history of this output.
|
|
15
|
-
table.text('outputsConsumed', 'longtext').defaultTo('[]')
|
|
16
|
-
// Tracks any outputs the current output is used as an input in it's creation
|
|
17
|
-
table.text('consumedBy', 'longtext').defaultTo('[]')
|
|
18
|
-
table.boolean('spent').defaultTo(false)
|
|
19
|
-
})
|
|
20
|
-
await knex.schema.createTable('applied_transactions', table => {
|
|
21
|
-
table.increments()
|
|
22
|
-
table.string('txid', 64)
|
|
23
|
-
table.string('topic')
|
|
24
|
-
})
|
|
25
|
-
}
|
|
26
|
-
|
|
27
|
-
export async function down (knex: Knex): Promise<void> {
|
|
28
|
-
await knex.schema.dropTable('applied_transactions')
|
|
29
|
-
await knex.schema.dropTable('outputs')
|
|
30
|
-
}
|
|
@@ -1,15 +0,0 @@
|
|
|
1
|
-
import type { Knex } from 'knex'
|
|
2
|
-
|
|
3
|
-
export async function up (knex: Knex): Promise<void> {
|
|
4
|
-
// Add new column for blockHeight associated with outputs
|
|
5
|
-
await knex.schema.table('outputs', table => {
|
|
6
|
-
table.integer('blockHeight').unsigned().nullable()
|
|
7
|
-
})
|
|
8
|
-
}
|
|
9
|
-
|
|
10
|
-
export async function down (knex: Knex): Promise<void> {
|
|
11
|
-
// Remove the blockHeight column (rollback operation)
|
|
12
|
-
await knex.schema.table('outputs', table => {
|
|
13
|
-
table.dropColumn('blockHeight')
|
|
14
|
-
})
|
|
15
|
-
}
|
|
@@ -1,64 +0,0 @@
|
|
|
1
|
-
import type { Knex } from 'knex'
|
|
2
|
-
|
|
3
|
-
export async function up (knex: Knex): Promise<void> {
|
|
4
|
-
const client = (knex.client.config.client || '').toLowerCase()
|
|
5
|
-
|
|
6
|
-
// Create the new transactions table
|
|
7
|
-
await knex.schema.createTable('transactions', table => {
|
|
8
|
-
table.increments()
|
|
9
|
-
table.specificType('beef', 'longblob')
|
|
10
|
-
table.string('txid', 64).unique()
|
|
11
|
-
})
|
|
12
|
-
|
|
13
|
-
// Move data from outputs table to the new transactions table and ensure deduplication
|
|
14
|
-
if (client.startsWith('mysql')) {
|
|
15
|
-
await knex.raw(`
|
|
16
|
-
INSERT IGNORE INTO transactions (txid, beef)
|
|
17
|
-
SELECT txid, beef
|
|
18
|
-
FROM outputs
|
|
19
|
-
WHERE beef IS NOT NULL
|
|
20
|
-
`)
|
|
21
|
-
} else {
|
|
22
|
-
// SQLite / PostgreSQL: INSERT IGNORE is MySQL-only syntax
|
|
23
|
-
await knex.raw(`
|
|
24
|
-
INSERT INTO transactions (txid, beef)
|
|
25
|
-
SELECT txid, beef
|
|
26
|
-
FROM outputs
|
|
27
|
-
WHERE beef IS NOT NULL
|
|
28
|
-
ON CONFLICT (txid) DO NOTHING
|
|
29
|
-
`)
|
|
30
|
-
}
|
|
31
|
-
|
|
32
|
-
// Drop the beef column from the outputs table
|
|
33
|
-
await knex.schema.table('outputs', table => {
|
|
34
|
-
table.dropColumn('beef')
|
|
35
|
-
})
|
|
36
|
-
}
|
|
37
|
-
|
|
38
|
-
export async function down (knex: Knex): Promise<void> {
|
|
39
|
-
const client = (knex.client.config.client || '').toLowerCase()
|
|
40
|
-
|
|
41
|
-
// Add the beef column back to the outputs table
|
|
42
|
-
await knex.schema.table('outputs', table => {
|
|
43
|
-
table.binary('beef')
|
|
44
|
-
})
|
|
45
|
-
|
|
46
|
-
// Move data back from the transactions table to the outputs table
|
|
47
|
-
if (client.startsWith('mysql')) {
|
|
48
|
-
await knex.raw(`
|
|
49
|
-
UPDATE outputs
|
|
50
|
-
JOIN transactions ON outputs.txid = transactions.txid
|
|
51
|
-
SET outputs.beef = transactions.beef
|
|
52
|
-
`)
|
|
53
|
-
} else {
|
|
54
|
-
// SQLite / PostgreSQL: UPDATE ... JOIN is MySQL-only syntax
|
|
55
|
-
await knex.raw(`
|
|
56
|
-
UPDATE outputs
|
|
57
|
-
SET beef = (SELECT beef FROM transactions WHERE transactions.txid = outputs.txid)
|
|
58
|
-
WHERE txid IN (SELECT txid FROM transactions)
|
|
59
|
-
`)
|
|
60
|
-
}
|
|
61
|
-
|
|
62
|
-
// Drop the transactions table
|
|
63
|
-
await knex.schema.dropTable('transactions')
|
|
64
|
-
}
|
|
@@ -1,30 +0,0 @@
|
|
|
1
|
-
import type { Knex } from 'knex'
|
|
2
|
-
export async function up (knex: Knex): Promise<void> {
|
|
3
|
-
// Add index for applied_transactions table
|
|
4
|
-
await knex.schema.table('applied_transactions', function (table) {
|
|
5
|
-
table.index(['txid', 'topic'], 'idx_applied_transactions_txid_topic')
|
|
6
|
-
})
|
|
7
|
-
// Add index for transactions table
|
|
8
|
-
await knex.schema.table('transactions', function (table) {
|
|
9
|
-
table.index('txid', 'idx_transactions_txid')
|
|
10
|
-
})
|
|
11
|
-
// Add index for outputs table
|
|
12
|
-
await knex.schema.table('outputs', function (table) {
|
|
13
|
-
table.index(['txid', 'outputIndex', 'topic'], 'idx_outputs_txid_outputIndex_topic')
|
|
14
|
-
})
|
|
15
|
-
}
|
|
16
|
-
|
|
17
|
-
export async function down (knex: Knex): Promise<void> {
|
|
18
|
-
// Drop index for applied_transactions table
|
|
19
|
-
await knex.schema.table('applied_transactions', function (table) {
|
|
20
|
-
table.dropIndex(['txid', 'topic'], 'idx_applied_transactions_txid_topic')
|
|
21
|
-
})
|
|
22
|
-
// Drop index for transactions table
|
|
23
|
-
await knex.schema.table('transactions', function (table) {
|
|
24
|
-
table.dropIndex('txid', 'idx_transactions_txid')
|
|
25
|
-
})
|
|
26
|
-
// Drop index for outputs table
|
|
27
|
-
await knex.schema.table('outputs', function (table) {
|
|
28
|
-
table.dropIndex(['txid', 'outputIndex', 'topic'], 'idx_outputs_txid_outputIndex_topic')
|
|
29
|
-
})
|
|
30
|
-
}
|
|
@@ -1,42 +0,0 @@
|
|
|
1
|
-
// migrations/005_enlarge_blobs.ts
|
|
2
|
-
import type { Knex } from 'knex'
|
|
3
|
-
|
|
4
|
-
export async function up (knex: Knex): Promise<void> {
|
|
5
|
-
const client = (knex.client.config.client || '').toLowerCase()
|
|
6
|
-
|
|
7
|
-
if (client.startsWith('mysql')) {
|
|
8
|
-
await knex.schema.alterTable('outputs', table => {
|
|
9
|
-
table.specificType('outputScript', 'LONGBLOB').alter()
|
|
10
|
-
})
|
|
11
|
-
} else if (client === 'sqlite3') {
|
|
12
|
-
await knex.schema.alterTable('outputs', table => {
|
|
13
|
-
table.binary('outputScript').alter()
|
|
14
|
-
})
|
|
15
|
-
}
|
|
16
|
-
|
|
17
|
-
if (client.startsWith('mysql')) {
|
|
18
|
-
await knex.schema.alterTable('transactions', table => {
|
|
19
|
-
table.specificType('beef', 'LONGBLOB').alter()
|
|
20
|
-
})
|
|
21
|
-
} else if (client === 'sqlite3') {
|
|
22
|
-
await knex.schema.alterTable('transactions', table => {
|
|
23
|
-
table.binary('beef').alter()
|
|
24
|
-
})
|
|
25
|
-
}
|
|
26
|
-
}
|
|
27
|
-
|
|
28
|
-
export async function down (knex: Knex): Promise<void> {
|
|
29
|
-
const client = (knex.client.config.client || '').toLowerCase()
|
|
30
|
-
|
|
31
|
-
if (client.startsWith('mysql') || client === 'sqlite3') {
|
|
32
|
-
await knex.schema.alterTable('outputs', table => {
|
|
33
|
-
table.binary('outputScript').alter()
|
|
34
|
-
})
|
|
35
|
-
}
|
|
36
|
-
|
|
37
|
-
if (client.startsWith('mysql') || client === 'sqlite3') {
|
|
38
|
-
await knex.schema.alterTable('transactions', table => {
|
|
39
|
-
table.binary('beef').alter()
|
|
40
|
-
})
|
|
41
|
-
}
|
|
42
|
-
}
|
|
@@ -1,46 +0,0 @@
|
|
|
1
|
-
import type { Knex } from 'knex'
|
|
2
|
-
|
|
3
|
-
export async function up (knex: Knex): Promise<void> {
|
|
4
|
-
// 1. Add score column to outputs table for pagination/sorting
|
|
5
|
-
const hasScoreColumn = await knex.schema.hasColumn('outputs', 'score')
|
|
6
|
-
|
|
7
|
-
if (!hasScoreColumn) {
|
|
8
|
-
// Add new column for score (can be timestamp or any other sorting factor)
|
|
9
|
-
await knex.schema.table('outputs', table => {
|
|
10
|
-
table.float('score').notNullable().defaultTo(0)
|
|
11
|
-
// Create compound index on topic and score for efficient querying
|
|
12
|
-
table.index(['topic', 'score'])
|
|
13
|
-
})
|
|
14
|
-
}
|
|
15
|
-
|
|
16
|
-
// 2. Create host_sync_state table for tracking sync progress per host/topic
|
|
17
|
-
const hostSyncStateExists = await knex.schema.hasTable('host_sync_state')
|
|
18
|
-
|
|
19
|
-
if (!hostSyncStateExists) {
|
|
20
|
-
await knex.schema.createTable('host_sync_state', table => {
|
|
21
|
-
table.string('host').notNullable()
|
|
22
|
-
table.string('topic').notNullable()
|
|
23
|
-
table.bigInteger('since').unsigned().notNullable()
|
|
24
|
-
table.primary(['host', 'topic'])
|
|
25
|
-
table.index('host')
|
|
26
|
-
table.index('topic')
|
|
27
|
-
})
|
|
28
|
-
}
|
|
29
|
-
}
|
|
30
|
-
|
|
31
|
-
export async function down (knex: Knex): Promise<void> {
|
|
32
|
-
// Rollback in reverse order
|
|
33
|
-
|
|
34
|
-
// 1. Drop host_sync_state table
|
|
35
|
-
await knex.schema.dropTableIfExists('host_sync_state')
|
|
36
|
-
|
|
37
|
-
// 2. Remove score column from outputs table
|
|
38
|
-
const hasScoreColumn = await knex.schema.hasColumn('outputs', 'score')
|
|
39
|
-
if (hasScoreColumn) {
|
|
40
|
-
await knex.schema.table('outputs', table => {
|
|
41
|
-
// Drop the compound index on topic and score
|
|
42
|
-
table.dropIndex(['topic', 'score'])
|
|
43
|
-
table.dropColumn('score')
|
|
44
|
-
})
|
|
45
|
-
}
|
|
46
|
-
}
|
|
@@ -1,24 +0,0 @@
|
|
|
1
|
-
import type { Knex } from 'knex'
|
|
2
|
-
|
|
3
|
-
export async function up (knex: Knex): Promise<void> {
|
|
4
|
-
// Fix score column type from float to bigint to handle large timestamp values
|
|
5
|
-
const hasScoreColumn = await knex.schema.hasColumn('outputs', 'score')
|
|
6
|
-
|
|
7
|
-
if (hasScoreColumn) {
|
|
8
|
-
// Modify the score column to be bigint instead of float
|
|
9
|
-
await knex.schema.table('outputs', table => {
|
|
10
|
-
table.bigInteger('score').notNullable().defaultTo(0).alter()
|
|
11
|
-
})
|
|
12
|
-
}
|
|
13
|
-
}
|
|
14
|
-
|
|
15
|
-
export async function down (knex: Knex): Promise<void> {
|
|
16
|
-
// Rollback to original float type
|
|
17
|
-
const hasScoreColumn = await knex.schema.hasColumn('outputs', 'score')
|
|
18
|
-
|
|
19
|
-
if (hasScoreColumn) {
|
|
20
|
-
await knex.schema.table('outputs', table => {
|
|
21
|
-
table.float('score', 8, 2).notNullable().defaultTo(0).alter()
|
|
22
|
-
})
|
|
23
|
-
}
|
|
24
|
-
}
|
|
@@ -1,18 +0,0 @@
|
|
|
1
|
-
import type { Knex } from 'knex'
|
|
2
|
-
|
|
3
|
-
/**
|
|
4
|
-
* Adds optimized index for findUTXOsForTopic queries.
|
|
5
|
-
* This query pattern is: WHERE topic = ? AND spent = false ORDER BY score
|
|
6
|
-
* The composite index (topic, spent, score) enables efficient range scans.
|
|
7
|
-
*/
|
|
8
|
-
export async function up (knex: Knex): Promise<void> {
|
|
9
|
-
await knex.schema.table('outputs', function (table) {
|
|
10
|
-
table.index(['topic', 'spent', 'score'], 'idx_outputs_topic_spent_score')
|
|
11
|
-
})
|
|
12
|
-
}
|
|
13
|
-
|
|
14
|
-
export async function down (knex: Knex): Promise<void> {
|
|
15
|
-
await knex.schema.table('outputs', function (table) {
|
|
16
|
-
table.dropIndex(['topic', 'spent', 'score'], 'idx_outputs_topic_spent_score')
|
|
17
|
-
})
|
|
18
|
-
}
|
|
@@ -1,123 +0,0 @@
|
|
|
1
|
-
import type { Knex } from 'knex'
|
|
2
|
-
|
|
3
|
-
function binaryLargeType(knex: Knex): string {
|
|
4
|
-
const client = String(knex.client.config.client ?? '').toLowerCase()
|
|
5
|
-
if (client.includes('mysql')) return 'longblob'
|
|
6
|
-
if (client.includes('pg')) return 'bytea'
|
|
7
|
-
return 'blob'
|
|
8
|
-
}
|
|
9
|
-
|
|
10
|
-
async function addColumnIfMissing(
|
|
11
|
-
knex: Knex,
|
|
12
|
-
tableName: string,
|
|
13
|
-
columnName: string,
|
|
14
|
-
addColumn: (table: Knex.TableBuilder) => void
|
|
15
|
-
): Promise<void> {
|
|
16
|
-
const exists = await knex.schema.hasColumn(tableName, columnName)
|
|
17
|
-
if (!exists) {
|
|
18
|
-
await knex.schema.table(tableName, addColumn)
|
|
19
|
-
}
|
|
20
|
-
}
|
|
21
|
-
|
|
22
|
-
export async function up(knex: Knex): Promise<void> {
|
|
23
|
-
await addColumnIfMissing(knex, 'applied_transactions', 'blockHeight', table => {
|
|
24
|
-
table.integer('blockHeight').unsigned().nullable()
|
|
25
|
-
})
|
|
26
|
-
await addColumnIfMissing(knex, 'applied_transactions', 'blockHash', table => {
|
|
27
|
-
table.string('blockHash', 64).nullable()
|
|
28
|
-
})
|
|
29
|
-
await addColumnIfMissing(knex, 'applied_transactions', 'blockIndex', table => {
|
|
30
|
-
table.integer('blockIndex').unsigned().nullable()
|
|
31
|
-
})
|
|
32
|
-
await addColumnIfMissing(knex, 'applied_transactions', 'merkleRoot', table => {
|
|
33
|
-
table.string('merkleRoot', 64).nullable()
|
|
34
|
-
})
|
|
35
|
-
await addColumnIfMissing(knex, 'applied_transactions', 'firstSeenHeight', table => {
|
|
36
|
-
table.integer('firstSeenHeight').unsigned().nullable()
|
|
37
|
-
})
|
|
38
|
-
await addColumnIfMissing(knex, 'applied_transactions', 'proven', table => {
|
|
39
|
-
table.boolean('proven').notNullable().defaultTo(false)
|
|
40
|
-
})
|
|
41
|
-
|
|
42
|
-
await addColumnIfMissing(knex, 'transactions', 'rawTx', table => {
|
|
43
|
-
table.specificType('rawTx', binaryLargeType(knex)).nullable()
|
|
44
|
-
})
|
|
45
|
-
await addColumnIfMissing(knex, 'transactions', 'merklePath', table => {
|
|
46
|
-
table.specificType('merklePath', binaryLargeType(knex)).nullable()
|
|
47
|
-
})
|
|
48
|
-
await addColumnIfMissing(knex, 'transactions', 'blockHeight', table => {
|
|
49
|
-
table.integer('blockHeight').unsigned().nullable()
|
|
50
|
-
})
|
|
51
|
-
await addColumnIfMissing(knex, 'transactions', 'blockHash', table => {
|
|
52
|
-
table.string('blockHash', 64).nullable()
|
|
53
|
-
})
|
|
54
|
-
await addColumnIfMissing(knex, 'transactions', 'blockIndex', table => {
|
|
55
|
-
table.integer('blockIndex').unsigned().nullable()
|
|
56
|
-
})
|
|
57
|
-
await addColumnIfMissing(knex, 'transactions', 'merkleRoot', table => {
|
|
58
|
-
table.string('merkleRoot', 64).nullable()
|
|
59
|
-
})
|
|
60
|
-
await addColumnIfMissing(knex, 'transactions', 'updatedAt', table => {
|
|
61
|
-
table.timestamp('updatedAt').nullable()
|
|
62
|
-
})
|
|
63
|
-
|
|
64
|
-
const topicBlockAnchorsExists = await knex.schema.hasTable('topic_block_anchors')
|
|
65
|
-
if (!topicBlockAnchorsExists) {
|
|
66
|
-
await knex.schema.createTable('topic_block_anchors', table => {
|
|
67
|
-
table.increments()
|
|
68
|
-
table.string('topic').notNullable()
|
|
69
|
-
table.integer('blockHeight').unsigned().notNullable()
|
|
70
|
-
table.string('blockHash', 64).notNullable()
|
|
71
|
-
table.string('basmRoot', 64).notNullable()
|
|
72
|
-
table.integer('admittedCount').unsigned().notNullable()
|
|
73
|
-
table.string('tac', 64).notNullable()
|
|
74
|
-
table.timestamp('updatedAt').nullable()
|
|
75
|
-
table.unique(['topic', 'blockHeight'], 'idx_topic_block_anchors_topic_height_unique')
|
|
76
|
-
table.index(['topic', 'blockHeight'], 'idx_topic_block_anchors_topic_height')
|
|
77
|
-
table.index(['topic', 'blockHash'], 'idx_topic_block_anchors_topic_hash')
|
|
78
|
-
})
|
|
79
|
-
}
|
|
80
|
-
|
|
81
|
-
const syncStateExists = await knex.schema.hasTable('basm_sync_state')
|
|
82
|
-
if (!syncStateExists) {
|
|
83
|
-
await knex.schema.createTable('basm_sync_state', table => {
|
|
84
|
-
table.string('host').notNullable()
|
|
85
|
-
table.string('topic').notNullable()
|
|
86
|
-
table.integer('lastHeight').unsigned().notNullable().defaultTo(0)
|
|
87
|
-
table.timestamp('updatedAt').nullable()
|
|
88
|
-
table.primary(['host', 'topic'])
|
|
89
|
-
table.index('topic')
|
|
90
|
-
})
|
|
91
|
-
}
|
|
92
|
-
|
|
93
|
-
const appliedTopicHeightIndex = 'idx_applied_transactions_topic_height'
|
|
94
|
-
const hasAppliedTopicHeightIndex = await knex.schema.hasTable('applied_transactions')
|
|
95
|
-
if (hasAppliedTopicHeightIndex) {
|
|
96
|
-
await knex.schema.table('applied_transactions', table => {
|
|
97
|
-
table.index(['topic', 'blockHeight', 'blockHash', 'blockIndex'], appliedTopicHeightIndex)
|
|
98
|
-
table.index(['topic', 'proven', 'firstSeenHeight'], 'idx_applied_transactions_unproven')
|
|
99
|
-
})
|
|
100
|
-
}
|
|
101
|
-
}
|
|
102
|
-
|
|
103
|
-
export async function down(knex: Knex): Promise<void> {
|
|
104
|
-
await knex.schema.dropTableIfExists('basm_sync_state')
|
|
105
|
-
await knex.schema.dropTableIfExists('topic_block_anchors')
|
|
106
|
-
|
|
107
|
-
await knex.schema.table('applied_transactions', table => {
|
|
108
|
-
table.dropIndex(['topic', 'blockHeight', 'blockHash', 'blockIndex'], 'idx_applied_transactions_topic_height')
|
|
109
|
-
table.dropIndex(['topic', 'proven', 'firstSeenHeight'], 'idx_applied_transactions_unproven')
|
|
110
|
-
})
|
|
111
|
-
|
|
112
|
-
for (const column of ['updatedAt', 'merkleRoot', 'blockIndex', 'blockHash', 'blockHeight', 'merklePath', 'rawTx']) {
|
|
113
|
-
if (await knex.schema.hasColumn('transactions', column)) {
|
|
114
|
-
await knex.schema.table('transactions', table => table.dropColumn(column))
|
|
115
|
-
}
|
|
116
|
-
}
|
|
117
|
-
|
|
118
|
-
for (const column of ['proven', 'firstSeenHeight', 'merkleRoot', 'blockIndex', 'blockHash', 'blockHeight']) {
|
|
119
|
-
if (await knex.schema.hasColumn('applied_transactions', column)) {
|
|
120
|
-
await knex.schema.table('applied_transactions', table => table.dropColumn(column))
|
|
121
|
-
}
|
|
122
|
-
}
|
|
123
|
-
}
|