@bsv/overlay 2.2.0 → 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.
Files changed (155) hide show
  1. package/LICENSE.txt +57 -27
  2. package/README.md +102 -266
  3. package/dist/cjs/mod.d.ts +15 -0
  4. package/dist/cjs/mod.d.ts.map +1 -0
  5. package/dist/cjs/mod.js +4 -1
  6. package/dist/cjs/mod.js.map +1 -1
  7. package/dist/cjs/package.json +46 -18
  8. package/dist/cjs/src/Advertisement.d.ts +9 -0
  9. package/dist/cjs/src/Advertisement.d.ts.map +1 -0
  10. package/dist/cjs/src/Advertiser.d.ts +36 -0
  11. package/dist/cjs/src/Advertiser.d.ts.map +1 -0
  12. package/dist/cjs/src/BASM.d.ts +110 -0
  13. package/dist/cjs/src/BASM.d.ts.map +1 -0
  14. package/dist/cjs/src/BASM.js.map +1 -1
  15. package/dist/cjs/src/BASMRemote.d.ts +14 -0
  16. package/dist/cjs/src/BASMRemote.d.ts.map +1 -0
  17. package/dist/cjs/src/BASMRemote.js.map +1 -1
  18. package/dist/cjs/src/Engine.d.ts +377 -0
  19. package/dist/cjs/src/Engine.d.ts.map +1 -0
  20. package/dist/cjs/src/Engine.js +430 -436
  21. package/dist/cjs/src/Engine.js.map +1 -1
  22. package/dist/cjs/src/GASP/OverlayGASPRemote.d.ts +24 -0
  23. package/dist/cjs/src/GASP/OverlayGASPRemote.d.ts.map +1 -0
  24. package/dist/cjs/src/GASP/OverlayGASPRemote.js +7 -10
  25. package/dist/cjs/src/GASP/OverlayGASPRemote.js.map +1 -1
  26. package/dist/cjs/src/GASP/OverlayGASPStorage.d.ts +103 -0
  27. package/dist/cjs/src/GASP/OverlayGASPStorage.d.ts.map +1 -0
  28. package/dist/cjs/src/GASP/OverlayGASPStorage.js +34 -31
  29. package/dist/cjs/src/GASP/OverlayGASPStorage.js.map +1 -1
  30. package/dist/cjs/src/LookupFormula.d.ts +29 -0
  31. package/dist/cjs/src/LookupFormula.d.ts.map +1 -0
  32. package/dist/cjs/src/LookupService.d.ts +85 -0
  33. package/dist/cjs/src/LookupService.d.ts.map +1 -0
  34. package/dist/cjs/src/Output.d.ts +32 -0
  35. package/dist/cjs/src/Output.d.ts.map +1 -0
  36. package/dist/cjs/src/SafeLog.d.ts +14 -0
  37. package/dist/cjs/src/SafeLog.d.ts.map +1 -0
  38. package/dist/cjs/src/SafeLog.js +44 -0
  39. package/dist/cjs/src/SafeLog.js.map +1 -0
  40. package/{src/SyncConfiguration.ts → dist/cjs/src/SyncConfiguration.d.ts} +2 -1
  41. package/dist/cjs/src/SyncConfiguration.d.ts.map +1 -0
  42. package/dist/cjs/src/TopicManager.d.ts +35 -0
  43. package/dist/cjs/src/TopicManager.d.ts.map +1 -0
  44. package/dist/cjs/src/storage/Storage.d.ts +237 -0
  45. package/dist/cjs/src/storage/Storage.d.ts.map +1 -0
  46. package/dist/cjs/src/storage/knex/KnexStorage.d.ts +69 -0
  47. package/dist/cjs/src/storage/knex/KnexStorage.d.ts.map +1 -0
  48. package/dist/cjs/src/storage/knex/KnexStorage.js +7 -10
  49. package/dist/cjs/src/storage/knex/KnexStorage.js.map +1 -1
  50. package/dist/cjs/src/storage/knex/all-migrations.d.ts +11 -0
  51. package/dist/cjs/src/storage/knex/all-migrations.d.ts.map +1 -0
  52. package/dist/cjs/src/storage/knex/all-migrations.js.map +1 -1
  53. package/dist/cjs/src/storage/knex/migrations/2024-05-18-001-initial.d.ts +4 -0
  54. package/dist/cjs/src/storage/knex/migrations/2024-05-18-001-initial.d.ts.map +1 -0
  55. package/dist/cjs/src/storage/knex/migrations/2024-05-18-001-initial.js.map +1 -1
  56. package/dist/cjs/src/storage/knex/migrations/2024-07-10-001-block-height.d.ts +4 -0
  57. package/dist/cjs/src/storage/knex/migrations/2024-07-10-001-block-height.d.ts.map +1 -0
  58. package/dist/cjs/src/storage/knex/migrations/2024-07-10-001-block-height.js.map +1 -1
  59. package/dist/cjs/src/storage/knex/migrations/2024-07-17-001-transactions.d.ts +4 -0
  60. package/dist/cjs/src/storage/knex/migrations/2024-07-17-001-transactions.d.ts.map +1 -0
  61. package/dist/cjs/src/storage/knex/migrations/2024-07-17-001-transactions.js +36 -12
  62. package/dist/cjs/src/storage/knex/migrations/2024-07-17-001-transactions.js.map +1 -1
  63. package/dist/cjs/src/storage/knex/migrations/2024-07-18-001-indexes.d.ts +4 -0
  64. package/dist/cjs/src/storage/knex/migrations/2024-07-18-001-indexes.d.ts.map +1 -0
  65. package/dist/cjs/src/storage/knex/migrations/2024-07-18-001-indexes.js.map +1 -1
  66. package/dist/cjs/src/storage/knex/migrations/2025-05-28-001-enlarge.d.ts +4 -0
  67. package/dist/cjs/src/storage/knex/migrations/2025-05-28-001-enlarge.d.ts.map +1 -0
  68. package/dist/cjs/src/storage/knex/migrations/2025-05-28-001-enlarge.js.map +1 -1
  69. package/dist/cjs/src/storage/knex/migrations/2025-06-25-001-gasp-pagination-support.d.ts +4 -0
  70. package/dist/cjs/src/storage/knex/migrations/2025-06-25-001-gasp-pagination-support.d.ts.map +1 -0
  71. package/dist/cjs/src/storage/knex/migrations/2025-06-25-001-gasp-pagination-support.js.map +1 -1
  72. package/dist/cjs/src/storage/knex/migrations/2025-07-22-001-fix-score-column-type.d.ts +4 -0
  73. package/dist/cjs/src/storage/knex/migrations/2025-07-22-001-fix-score-column-type.d.ts.map +1 -0
  74. package/dist/cjs/src/storage/knex/migrations/2025-07-22-001-fix-score-column-type.js.map +1 -1
  75. package/dist/cjs/src/storage/knex/migrations/2025-11-11-001-utxo-lookup-index.d.ts +9 -0
  76. package/dist/cjs/src/storage/knex/migrations/2025-11-11-001-utxo-lookup-index.d.ts.map +1 -0
  77. package/dist/cjs/src/storage/knex/migrations/2025-11-11-001-utxo-lookup-index.js.map +1 -1
  78. package/dist/cjs/src/storage/knex/migrations/2026-05-29-001-brc136-basm.d.ts +4 -0
  79. package/dist/cjs/src/storage/knex/migrations/2026-05-29-001-brc136-basm.d.ts.map +1 -0
  80. package/dist/cjs/src/storage/knex/migrations/2026-05-29-001-brc136-basm.js.map +1 -1
  81. package/dist/esm/mod.js +2 -1
  82. package/dist/esm/mod.js.map +1 -1
  83. package/dist/esm/src/BASMRemote.js.map +1 -1
  84. package/dist/esm/src/Engine.js +408 -414
  85. package/dist/esm/src/Engine.js.map +1 -1
  86. package/dist/esm/src/GASP/OverlayGASPRemote.js +2 -2
  87. package/dist/esm/src/GASP/OverlayGASPRemote.js.map +1 -1
  88. package/dist/esm/src/GASP/OverlayGASPStorage.js +23 -19
  89. package/dist/esm/src/GASP/OverlayGASPStorage.js.map +1 -1
  90. package/dist/esm/src/SafeLog.js +40 -0
  91. package/dist/esm/src/SafeLog.js.map +1 -0
  92. package/dist/esm/src/storage/knex/KnexStorage.js.map +1 -1
  93. package/dist/esm/src/storage/knex/migrations/2024-07-17-001-transactions.js +36 -12
  94. package/dist/esm/src/storage/knex/migrations/2024-07-17-001-transactions.js.map +1 -1
  95. package/dist/types/mod.d.ts +5 -4
  96. package/dist/types/mod.d.ts.map +1 -1
  97. package/dist/types/src/BASMRemote.d.ts.map +1 -1
  98. package/dist/types/src/Engine.d.ts +15 -0
  99. package/dist/types/src/Engine.d.ts.map +1 -1
  100. package/dist/types/src/GASP/OverlayGASPRemote.d.ts +2 -2
  101. package/dist/types/src/GASP/OverlayGASPRemote.d.ts.map +1 -1
  102. package/dist/types/src/GASP/OverlayGASPStorage.d.ts +3 -1
  103. package/dist/types/src/GASP/OverlayGASPStorage.d.ts.map +1 -1
  104. package/dist/types/src/SafeLog.d.ts +14 -0
  105. package/dist/types/src/SafeLog.d.ts.map +1 -0
  106. package/dist/types/src/storage/knex/KnexStorage.d.ts.map +1 -1
  107. package/dist/types/src/storage/knex/all-migrations.d.ts.map +1 -1
  108. package/dist/types/src/storage/knex/migrations/2024-07-17-001-transactions.d.ts.map +1 -1
  109. package/package.json +87 -30
  110. package/dist/cjs/tsconfig.cjs.tsbuildinfo +0 -1
  111. package/dist/esm/tsconfig.esm.tsbuildinfo +0 -1
  112. package/dist/types/tsconfig.types.tsbuildinfo +0 -1
  113. package/docs/API.md +0 -944
  114. package/docs/BRC-136-BASM.md +0 -327
  115. package/docs/README.md +0 -16
  116. package/docs/Synchronization.md +0 -212
  117. package/docs/concepts/00-overview.md +0 -85
  118. package/docs/concepts/01-best-practices.md +0 -202
  119. package/docs/concepts/02-query-performance.md +0 -345
  120. package/docs/concepts/03-database-monitoring.md +0 -211
  121. package/docs/concepts/04-pagination-example.md +0 -186
  122. package/docs/concepts/05-recommendations-summary.md +0 -158
  123. package/docs/concepts/README.md +0 -20
  124. package/docs/examples/README.md +0 -15
  125. package/docs/examples/gs-wip.md +0 -111
  126. package/docs/internal/README.md +0 -11
  127. package/mod.ts +0 -40
  128. package/src/Advertisement.ts +0 -8
  129. package/src/Advertiser.ts +0 -41
  130. package/src/BASM.ts +0 -208
  131. package/src/BASMRemote.ts +0 -54
  132. package/src/Engine.ts +0 -2199
  133. package/src/GASP/OverlayGASPRemote.ts +0 -108
  134. package/src/GASP/OverlayGASPStorage.ts +0 -383
  135. package/src/LookupFormula.ts +0 -31
  136. package/src/LookupService.ts +0 -136
  137. package/src/Output.ts +0 -31
  138. package/src/TopicManager.ts +0 -40
  139. package/src/__tests/BASM.test.ts +0 -44
  140. package/src/__tests/BASMChain.test.ts +0 -290
  141. package/src/__tests/Engine.test.ts +0 -1345
  142. package/src/__tests/OverlayGASPRemote.test.ts +0 -135
  143. package/src/__tests/OverlayGASPStorage.test.ts +0 -171
  144. package/src/storage/Storage.ts +0 -260
  145. package/src/storage/knex/KnexStorage.ts +0 -651
  146. package/src/storage/knex/all-migrations.ts +0 -32
  147. package/src/storage/knex/migrations/2024-05-18-001-initial.ts +0 -30
  148. package/src/storage/knex/migrations/2024-07-10-001-block-height.ts +0 -15
  149. package/src/storage/knex/migrations/2024-07-17-001-transactions.ts +0 -40
  150. package/src/storage/knex/migrations/2024-07-18-001-indexes.ts +0 -30
  151. package/src/storage/knex/migrations/2025-05-28-001-enlarge.ts +0 -42
  152. package/src/storage/knex/migrations/2025-06-25-001-gasp-pagination-support.ts +0 -46
  153. package/src/storage/knex/migrations/2025-07-22-001-fix-score-column-type.ts +0 -24
  154. package/src/storage/knex/migrations/2025-11-11-001-utxo-lookup-index.ts +0 -18
  155. 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,40 +0,0 @@
1
- import type { Knex } from 'knex'
2
-
3
- export async function up (knex: Knex): Promise<void> {
4
- // Create the new transactions table
5
- await knex.schema.createTable('transactions', table => {
6
- table.increments()
7
- table.specificType('beef', 'longblob')
8
- table.string('txid', 64).unique()
9
- })
10
-
11
- // Move data from outputs table to the new transactions table and ensure deduplication
12
- await knex.raw(`
13
- INSERT IGNORE INTO transactions (txid, beef)
14
- SELECT txid, beef
15
- FROM outputs
16
- WHERE beef IS NOT NULL
17
- `)
18
-
19
- // Drop the beef column from the outputs table
20
- await knex.schema.table('outputs', table => {
21
- table.dropColumn('beef')
22
- })
23
- }
24
-
25
- export async function down (knex: Knex): Promise<void> {
26
- // Add the beef column back to the outputs table
27
- await knex.schema.table('outputs', table => {
28
- table.binary('beef')
29
- })
30
-
31
- // Move data back from the transactions table to the outputs table using a JOIN
32
- await knex.raw(`
33
- UPDATE outputs
34
- JOIN transactions ON outputs.txid = transactions.txid
35
- SET outputs.beef = transactions.beef
36
- `)
37
-
38
- // Drop the transactions table
39
- await knex.schema.dropTable('transactions')
40
- }
@@ -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
- }