@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.
Files changed (151) hide show
  1. package/LICENSE.txt +57 -27
  2. package/README.md +102 -269
  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 +41 -13
  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 +416 -417
  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 +32 -30
  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.map +1 -1
  62. package/dist/cjs/src/storage/knex/migrations/2024-07-18-001-indexes.d.ts +4 -0
  63. package/dist/cjs/src/storage/knex/migrations/2024-07-18-001-indexes.d.ts.map +1 -0
  64. package/dist/cjs/src/storage/knex/migrations/2024-07-18-001-indexes.js.map +1 -1
  65. package/dist/cjs/src/storage/knex/migrations/2025-05-28-001-enlarge.d.ts +4 -0
  66. package/dist/cjs/src/storage/knex/migrations/2025-05-28-001-enlarge.d.ts.map +1 -0
  67. package/dist/cjs/src/storage/knex/migrations/2025-05-28-001-enlarge.js.map +1 -1
  68. package/dist/cjs/src/storage/knex/migrations/2025-06-25-001-gasp-pagination-support.d.ts +4 -0
  69. package/dist/cjs/src/storage/knex/migrations/2025-06-25-001-gasp-pagination-support.d.ts.map +1 -0
  70. package/dist/cjs/src/storage/knex/migrations/2025-06-25-001-gasp-pagination-support.js.map +1 -1
  71. package/dist/cjs/src/storage/knex/migrations/2025-07-22-001-fix-score-column-type.d.ts +4 -0
  72. package/dist/cjs/src/storage/knex/migrations/2025-07-22-001-fix-score-column-type.d.ts.map +1 -0
  73. package/dist/cjs/src/storage/knex/migrations/2025-07-22-001-fix-score-column-type.js.map +1 -1
  74. package/dist/cjs/src/storage/knex/migrations/2025-11-11-001-utxo-lookup-index.d.ts +9 -0
  75. package/dist/cjs/src/storage/knex/migrations/2025-11-11-001-utxo-lookup-index.d.ts.map +1 -0
  76. package/dist/cjs/src/storage/knex/migrations/2025-11-11-001-utxo-lookup-index.js.map +1 -1
  77. package/dist/cjs/src/storage/knex/migrations/2026-05-29-001-brc136-basm.d.ts +4 -0
  78. package/dist/cjs/src/storage/knex/migrations/2026-05-29-001-brc136-basm.d.ts.map +1 -0
  79. package/dist/cjs/src/storage/knex/migrations/2026-05-29-001-brc136-basm.js.map +1 -1
  80. package/dist/esm/mod.js +2 -1
  81. package/dist/esm/mod.js.map +1 -1
  82. package/dist/esm/src/BASMRemote.js.map +1 -1
  83. package/dist/esm/src/Engine.js +394 -395
  84. package/dist/esm/src/Engine.js.map +1 -1
  85. package/dist/esm/src/GASP/OverlayGASPRemote.js +2 -2
  86. package/dist/esm/src/GASP/OverlayGASPRemote.js.map +1 -1
  87. package/dist/esm/src/GASP/OverlayGASPStorage.js +21 -18
  88. package/dist/esm/src/GASP/OverlayGASPStorage.js.map +1 -1
  89. package/dist/esm/src/SafeLog.js +40 -0
  90. package/dist/esm/src/SafeLog.js.map +1 -0
  91. package/dist/esm/src/storage/knex/KnexStorage.js.map +1 -1
  92. package/dist/types/mod.d.ts +5 -4
  93. package/dist/types/mod.d.ts.map +1 -1
  94. package/dist/types/src/BASMRemote.d.ts.map +1 -1
  95. package/dist/types/src/Engine.d.ts +15 -0
  96. package/dist/types/src/Engine.d.ts.map +1 -1
  97. package/dist/types/src/GASP/OverlayGASPRemote.d.ts +2 -2
  98. package/dist/types/src/GASP/OverlayGASPRemote.d.ts.map +1 -1
  99. package/dist/types/src/GASP/OverlayGASPStorage.d.ts +3 -1
  100. package/dist/types/src/GASP/OverlayGASPStorage.d.ts.map +1 -1
  101. package/dist/types/src/SafeLog.d.ts +14 -0
  102. package/dist/types/src/SafeLog.d.ts.map +1 -0
  103. package/dist/types/src/storage/knex/KnexStorage.d.ts.map +1 -1
  104. package/dist/types/src/storage/knex/all-migrations.d.ts.map +1 -1
  105. package/package.json +85 -28
  106. package/dist/cjs/tsconfig.cjs.tsbuildinfo +0 -1
  107. package/dist/esm/tsconfig.esm.tsbuildinfo +0 -1
  108. package/dist/types/tsconfig.types.tsbuildinfo +0 -1
  109. package/docs/API.md +0 -944
  110. package/docs/BRC-136-BASM.md +0 -327
  111. package/docs/README.md +0 -16
  112. package/docs/Synchronization.md +0 -212
  113. package/docs/concepts/00-overview.md +0 -85
  114. package/docs/concepts/01-best-practices.md +0 -202
  115. package/docs/concepts/02-query-performance.md +0 -345
  116. package/docs/concepts/03-database-monitoring.md +0 -211
  117. package/docs/concepts/04-pagination-example.md +0 -186
  118. package/docs/concepts/05-recommendations-summary.md +0 -158
  119. package/docs/concepts/README.md +0 -20
  120. package/docs/examples/README.md +0 -15
  121. package/docs/examples/gs-wip.md +0 -111
  122. package/docs/internal/README.md +0 -11
  123. package/mod.ts +0 -40
  124. package/src/Advertisement.ts +0 -8
  125. package/src/Advertiser.ts +0 -41
  126. package/src/BASM.ts +0 -208
  127. package/src/BASMRemote.ts +0 -54
  128. package/src/Engine.ts +0 -2194
  129. package/src/GASP/OverlayGASPRemote.ts +0 -108
  130. package/src/GASP/OverlayGASPStorage.ts +0 -384
  131. package/src/LookupFormula.ts +0 -31
  132. package/src/LookupService.ts +0 -136
  133. package/src/Output.ts +0 -31
  134. package/src/TopicManager.ts +0 -40
  135. package/src/__tests/BASM.test.ts +0 -44
  136. package/src/__tests/BASMChain.test.ts +0 -295
  137. package/src/__tests/Engine.test.ts +0 -1381
  138. package/src/__tests/OverlayGASPRemote.test.ts +0 -135
  139. package/src/__tests/OverlayGASPStorage.test.ts +0 -205
  140. package/src/storage/Storage.ts +0 -260
  141. package/src/storage/knex/KnexStorage.ts +0 -651
  142. package/src/storage/knex/all-migrations.ts +0 -32
  143. package/src/storage/knex/migrations/2024-05-18-001-initial.ts +0 -30
  144. package/src/storage/knex/migrations/2024-07-10-001-block-height.ts +0 -15
  145. package/src/storage/knex/migrations/2024-07-17-001-transactions.ts +0 -64
  146. package/src/storage/knex/migrations/2024-07-18-001-indexes.ts +0 -30
  147. package/src/storage/knex/migrations/2025-05-28-001-enlarge.ts +0 -42
  148. package/src/storage/knex/migrations/2025-06-25-001-gasp-pagination-support.ts +0 -46
  149. package/src/storage/knex/migrations/2025-07-22-001-fix-score-column-type.ts +0 -24
  150. package/src/storage/knex/migrations/2025-11-11-001-utxo-lookup-index.ts +0 -18
  151. 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
- }