@@ -88,7 +88,6 @@ import {
88
88
POX_SYNTHETIC_EVENT_COLUMNS ,
89
89
prefixedCols ,
90
90
TX_COLUMNS ,
91
- unsafeCols ,
92
91
validateZonefileHash ,
93
92
} from './helpers' ;
94
93
import { PgNotifier } from './pg-notifier' ;
@@ -240,7 +239,7 @@ export class PgStore extends BasePgStore {
240
239
const microblock_tx_count : Record < string , number > = { } ;
241
240
if ( metadata ?. txs ) {
242
241
const txQuery = await sql < ContractTxQueryResult [ ] > `
243
- SELECT ${ unsafeCols ( sql , [ ... TX_COLUMNS , abiColumn ( ) ] ) }
242
+ SELECT ${ sql ( TX_COLUMNS ) } , ${ abiColumn ( sql ) }
244
243
FROM txs
245
244
WHERE index_block_hash = ${ block . result . index_block_hash }
246
245
AND canonical = true AND microblock_canonical = true
@@ -528,7 +527,7 @@ export class PgStore extends BasePgStore {
528
527
throw new Error ( `Could not find block by hash ${ blockHash } ` ) ;
529
528
}
530
529
const result = await sql < ContractTxQueryResult [ ] > `
531
- SELECT ${ unsafeCols ( sql , [ ... TX_COLUMNS , abiColumn ( ) ] ) }
530
+ SELECT ${ sql ( TX_COLUMNS ) } , ${ abiColumn ( sql ) }
532
531
FROM txs
533
532
WHERE index_block_hash = ${ blockQuery . result . index_block_hash }
534
533
AND canonical = true AND microblock_canonical = true
@@ -613,7 +612,7 @@ export class PgStore extends BasePgStore {
613
612
const { block_height } = await this . getChainTip ( sql ) ;
614
613
const unanchoredBlockHeight = block_height + 1 ;
615
614
const query = await sql < ContractTxQueryResult [ ] > `
616
- SELECT ${ unsafeCols ( sql , [ ... TX_COLUMNS , abiColumn ( ) ] ) }
615
+ SELECT ${ sql ( TX_COLUMNS ) } , ${ abiColumn ( sql ) }
617
616
FROM txs
618
617
WHERE canonical = true AND microblock_canonical = true AND block_height = ${ unanchoredBlockHeight }
619
618
ORDER BY block_height DESC, microblock_sequence DESC, tx_index DESC
@@ -823,7 +822,7 @@ export class PgStore extends BasePgStore {
823
822
AND index_block_hash = ${ blockQuery . result . index_block_hash }
824
823
` ;
825
824
const result = await sql < ContractTxQueryResult [ ] > `
826
- SELECT ${ unsafeCols ( sql , [ ... TX_COLUMNS , abiColumn ( ) ] ) }
825
+ SELECT ${ sql ( TX_COLUMNS ) } , ${ abiColumn ( sql ) }
827
826
FROM txs
828
827
WHERE canonical = true AND microblock_canonical = true
829
828
AND index_block_hash = ${ blockQuery . result . index_block_hash }
@@ -977,7 +976,7 @@ export class PgStore extends BasePgStore {
977
976
}
978
977
return await this . sqlTransaction ( async sql => {
979
978
const result = await sql < MempoolTxQueryResult [ ] > `
980
- SELECT ${ unsafeCols ( sql , [ ... MEMPOOL_TX_COLUMNS , abiColumn ( 'mempool_txs' ) ] ) }
979
+ SELECT ${ sql ( MEMPOOL_TX_COLUMNS ) } , ${ abiColumn ( sql , 'mempool_txs' ) }
981
980
FROM mempool_txs
982
981
WHERE tx_id IN ${ sql ( args . txIds ) }
983
982
` ;
@@ -996,7 +995,7 @@ export class PgStore extends BasePgStore {
996
995
} ) : Promise < FoundOrNot < DbMempoolTx > > {
997
996
return await this . sqlTransaction ( async sql => {
998
997
const result = await sql < MempoolTxQueryResult [ ] > `
999
- SELECT ${ unsafeCols ( sql , [ ... MEMPOOL_TX_COLUMNS , abiColumn ( 'mempool_txs' ) ] ) }
998
+ SELECT ${ sql ( MEMPOOL_TX_COLUMNS ) } , ${ abiColumn ( sql , 'mempool_txs' ) }
1000
999
FROM mempool_txs
1001
1000
WHERE tx_id = ${ txId }
1002
1001
` ;
@@ -1048,11 +1047,9 @@ export class PgStore extends BasePgStore {
1048
1047
DbTxStatus . DroppedProblematic ,
1049
1048
] ;
1050
1049
const resultQuery = await sql < ( MempoolTxQueryResult & { count : number } ) [ ] > `
1051
- SELECT ${ unsafeCols ( sql , [
1052
- ...prefixedCols ( MEMPOOL_TX_COLUMNS , 'mempool' ) ,
1053
- abiColumn ( 'mempool' ) ,
1054
- '(COUNT(*) OVER())::INTEGER AS count' ,
1055
- ] ) }
1050
+ SELECT ${ sql ( prefixedCols ( MEMPOOL_TX_COLUMNS , 'mempool' ) ) } ,
1051
+ ${ abiColumn ( sql , 'mempool' ) } ,
1052
+ (COUNT(*) OVER())::INTEGER AS count
1056
1053
FROM (
1057
1054
SELECT *
1058
1055
FROM mempool_txs
@@ -1323,7 +1320,7 @@ export class PgStore extends BasePgStore {
1323
1320
orderBy == 'fee' ? sql `fee_rate` : orderBy == 'size' ? sql `tx_size` : sql `receipt_time` ;
1324
1321
const orderSql = order == 'asc' ? sql `ASC` : sql `DESC` ;
1325
1322
const resultQuery = await sql < ( MempoolTxQueryResult & { count : number } ) [ ] > `
1326
- SELECT ${ unsafeCols ( sql , [ ... MEMPOOL_TX_COLUMNS , abiColumn ( 'mempool_txs' ) ] ) } , ${ count }
1323
+ SELECT ${ sql ( MEMPOOL_TX_COLUMNS ) } , ${ abiColumn ( sql , 'mempool_txs' ) } , ${ count }
1327
1324
FROM mempool_txs
1328
1325
WHERE ${
1329
1326
address
@@ -1386,7 +1383,7 @@ export class PgStore extends BasePgStore {
1386
1383
return await this . sqlTransaction ( async sql => {
1387
1384
const maxBlockHeight = await this . getMaxBlockHeight ( sql , { includeUnanchored } ) ;
1388
1385
const result = await sql < ContractTxQueryResult [ ] > `
1389
- SELECT ${ unsafeCols ( sql , [ ... TX_COLUMNS , abiColumn ( ) ] ) }
1386
+ SELECT ${ sql ( TX_COLUMNS ) } , ${ abiColumn ( sql ) }
1390
1387
FROM txs
1391
1388
WHERE tx_id = ${ txId } AND block_height <= ${ maxBlockHeight }
1392
1389
ORDER BY canonical DESC, microblock_canonical DESC, block_height DESC
@@ -1434,7 +1431,7 @@ export class PgStore extends BasePgStore {
1434
1431
FROM chain_tip
1435
1432
` ;
1436
1433
resultQuery = await sql < ContractTxQueryResult [ ] > `
1437
- SELECT ${ unsafeCols ( sql , [ ... TX_COLUMNS , abiColumn ( ) ] ) }
1434
+ SELECT ${ sql ( TX_COLUMNS ) } , ${ abiColumn ( sql ) }
1438
1435
FROM txs
1439
1436
WHERE canonical = true AND microblock_canonical = true AND block_height <= ${ maxHeight }
1440
1437
ORDER BY block_height DESC, microblock_sequence DESC, tx_index DESC
@@ -1450,7 +1447,7 @@ export class PgStore extends BasePgStore {
1450
1447
AND type_id IN ${ sql ( txTypeIds ) } AND block_height <= ${ maxHeight }
1451
1448
` ;
1452
1449
resultQuery = await sql < ContractTxQueryResult [ ] > `
1453
- SELECT ${ unsafeCols ( sql , [ ... TX_COLUMNS , abiColumn ( ) ] ) }
1450
+ SELECT ${ sql ( TX_COLUMNS ) } , ${ abiColumn ( sql ) }
1454
1451
FROM txs
1455
1452
WHERE canonical = true AND microblock_canonical = true
1456
1453
AND type_id IN ${ sql ( txTypeIds ) } AND block_height <= ${ maxHeight }
@@ -1474,11 +1471,13 @@ export class PgStore extends BasePgStore {
1474
1471
} ) : Promise < { results : DbEvent [ ] } > {
1475
1472
return await this . sqlTransaction ( async sql => {
1476
1473
if ( args . txs . length === 0 ) return { results : [ ] } ;
1477
- // TODO: This hack has to be done because postgres.js can't figure out how to interpolate
1478
- // these `bytea` VALUES comparisons yet.
1479
- const transactionValues = args . txs
1480
- . map ( tx => `('\\x${ tx . txId . slice ( 2 ) } '::bytea, '\\x${ tx . indexBlockHash . slice ( 2 ) } '::bytea)` )
1481
- . join ( ', ' ) ;
1474
+
1475
+ const transactionValues = args . txs . map ( tx => [
1476
+ `\\x${ tx . txId . slice ( 2 ) } ` ,
1477
+ `\\x${ tx . indexBlockHash . slice ( 2 ) } ` ,
1478
+ ] ) ;
1479
+ const txValuesSql = sql ( transactionValues . map ( tx => sql `(${ tx [ 0 ] } ::bytea, ${ tx [ 1 ] } ::bytea)` ) ) ;
1480
+
1482
1481
const eventIndexStart = args . offset ;
1483
1482
const eventIndexEnd = args . offset + args . limit - 1 ;
1484
1483
const stxLockResults = await sql <
@@ -1497,7 +1496,7 @@ export class PgStore extends BasePgStore {
1497
1496
SELECT
1498
1497
event_index, tx_id, tx_index, block_height, canonical, locked_amount, unlock_height, locked_address, contract_name
1499
1498
FROM stx_lock_events
1500
- WHERE (tx_id, index_block_hash) IN (VALUES ${ sql . unsafe ( transactionValues ) } )
1499
+ WHERE (tx_id, index_block_hash) IN ${ txValuesSql }
1501
1500
AND microblock_canonical = true AND event_index BETWEEN ${ eventIndexStart } AND ${ eventIndexEnd }
1502
1501
` ;
1503
1502
const stxResults = await sql <
@@ -1517,7 +1516,7 @@ export class PgStore extends BasePgStore {
1517
1516
SELECT
1518
1517
event_index, tx_id, tx_index, block_height, canonical, asset_event_type_id, sender, recipient, amount, memo
1519
1518
FROM stx_events
1520
- WHERE (tx_id, index_block_hash) IN (VALUES ${ sql . unsafe ( transactionValues ) } )
1519
+ WHERE (tx_id, index_block_hash) IN ${ txValuesSql }
1521
1520
AND microblock_canonical = true AND event_index BETWEEN ${ eventIndexStart } AND ${ eventIndexEnd }
1522
1521
` ;
1523
1522
const ftResults = await sql <
@@ -1537,7 +1536,7 @@ export class PgStore extends BasePgStore {
1537
1536
SELECT
1538
1537
event_index, tx_id, tx_index, block_height, canonical, asset_event_type_id, sender, recipient, asset_identifier, amount
1539
1538
FROM ft_events
1540
- WHERE (tx_id, index_block_hash) IN (VALUES ${ sql . unsafe ( transactionValues ) } )
1539
+ WHERE (tx_id, index_block_hash) IN ${ txValuesSql }
1541
1540
AND microblock_canonical = true AND event_index BETWEEN ${ eventIndexStart } AND ${ eventIndexEnd }
1542
1541
` ;
1543
1542
const nftResults = await sql <
@@ -1557,7 +1556,7 @@ export class PgStore extends BasePgStore {
1557
1556
SELECT
1558
1557
event_index, tx_id, tx_index, block_height, canonical, asset_event_type_id, sender, recipient, asset_identifier, value
1559
1558
FROM nft_events
1560
- WHERE (tx_id, index_block_hash) = ANY(VALUES ${ sql . unsafe ( transactionValues ) } )
1559
+ WHERE (tx_id, index_block_hash) IN ${ txValuesSql }
1561
1560
AND microblock_canonical = true AND event_index BETWEEN ${ eventIndexStart } AND ${ eventIndexEnd }
1562
1561
` ;
1563
1562
const logResults = await sql <
@@ -1575,7 +1574,7 @@ export class PgStore extends BasePgStore {
1575
1574
SELECT
1576
1575
event_index, tx_id, tx_index, block_height, canonical, contract_identifier, topic, value
1577
1576
FROM contract_logs
1578
- WHERE (tx_id, index_block_hash) IN (VALUES ${ sql . unsafe ( transactionValues ) } )
1577
+ WHERE (tx_id, index_block_hash) IN ${ txValuesSql }
1579
1578
AND microblock_canonical = true AND event_index BETWEEN ${ eventIndexStart } AND ${ eventIndexEnd }
1580
1579
` ;
1581
1580
return {
@@ -2745,7 +2744,9 @@ export class PgStore extends BasePgStore {
2745
2744
LIMIT ${ args . limit }
2746
2745
OFFSET ${ args . offset }
2747
2746
)
2748
- SELECT ${ unsafeCols ( this . sql , [ ...TX_COLUMNS , abiColumn ( ) , 'count' ] ) }
2747
+ SELECT ${ this . sql ( TX_COLUMNS ) } ,
2748
+ ${ abiColumn ( this . sql ) } ,
2749
+ count
2749
2750
FROM stx_txs
2750
2751
INNER JOIN txs USING (tx_id, index_block_hash, microblock_hash)
2751
2752
` ;
@@ -2814,7 +2815,7 @@ export class PgStore extends BasePgStore {
2814
2815
events.sender as event_sender,
2815
2816
events.recipient as event_recipient,
2816
2817
events.memo as event_memo,
2817
- ${ this . sql . unsafe ( abiColumn ( 'transactions' ) ) }
2818
+ ${ abiColumn ( this . sql , 'transactions' ) }
2818
2819
FROM transactions
2819
2820
LEFT JOIN events ON transactions.tx_id = events.tx_id
2820
2821
AND transactions.tx_id = ${ tx_id }
@@ -2914,7 +2915,7 @@ export class PgStore extends BasePgStore {
2914
2915
)
2915
2916
SELECT
2916
2917
transactions.*,
2917
- ${ this . sql . unsafe ( abiColumn ( 'transactions' ) ) } ,
2918
+ ${ abiColumn ( this . sql , 'transactions' ) } ,
2918
2919
events.event_index as event_index,
2919
2920
events.event_type_id as event_type,
2920
2921
events.amount as event_amount,
@@ -3039,7 +3040,7 @@ export class PgStore extends BasePgStore {
3039
3040
// TODO(mb): add support for searching for microblock by hash
3040
3041
return await this . sqlTransaction ( async sql => {
3041
3042
const txQuery = await sql < ContractTxQueryResult [ ] > `
3042
- SELECT ${ unsafeCols ( sql , [ ... TX_COLUMNS , abiColumn ( ) ] ) }
3043
+ SELECT ${ sql ( TX_COLUMNS ) } , ${ abiColumn ( sql ) }
3043
3044
FROM txs WHERE tx_id = ${ hash } LIMIT 1
3044
3045
` ;
3045
3046
if ( txQuery . length > 0 ) {
@@ -3054,7 +3055,7 @@ export class PgStore extends BasePgStore {
3054
3055
} ;
3055
3056
}
3056
3057
const txMempoolQuery = await sql < MempoolTxQueryResult [ ] > `
3057
- SELECT ${ unsafeCols ( sql , [ ... MEMPOOL_TX_COLUMNS , abiColumn ( 'mempool_txs' ) ] ) }
3058
+ SELECT ${ sql ( MEMPOOL_TX_COLUMNS ) } , ${ abiColumn ( sql , 'mempool_txs' ) }
3058
3059
FROM mempool_txs WHERE pruned = false AND tx_id = ${ hash } LIMIT 1
3059
3060
` ;
3060
3061
if ( txMempoolQuery . length > 0 ) {
@@ -3099,7 +3100,7 @@ export class PgStore extends BasePgStore {
3099
3100
return await this . sqlTransaction ( async sql => {
3100
3101
if ( isContract ) {
3101
3102
const contractMempoolTxResult = await sql < MempoolTxQueryResult [ ] > `
3102
- SELECT ${ unsafeCols ( sql , [ ... MEMPOOL_TX_COLUMNS , abiColumn ( 'mempool_txs' ) ] ) }
3103
+ SELECT ${ sql ( MEMPOOL_TX_COLUMNS ) } , ${ abiColumn ( sql , 'mempool_txs' ) }
3103
3104
FROM mempool_txs WHERE pruned = false AND smart_contract_contract_id = ${ principal } LIMIT 1
3104
3105
` ;
3105
3106
if ( contractMempoolTxResult . length > 0 ) {
@@ -3114,7 +3115,7 @@ export class PgStore extends BasePgStore {
3114
3115
} ;
3115
3116
}
3116
3117
const contractTxResult = await sql < ContractTxQueryResult [ ] > `
3117
- SELECT ${ unsafeCols ( sql , [ ... TX_COLUMNS , abiColumn ( ) ] ) }
3118
+ SELECT ${ sql ( TX_COLUMNS ) } , ${ abiColumn ( sql ) }
3118
3119
FROM txs
3119
3120
WHERE smart_contract_contract_id = ${ principal }
3120
3121
ORDER BY canonical DESC, microblock_canonical DESC, block_height DESC
@@ -3259,13 +3260,12 @@ export class PgStore extends BasePgStore {
3259
3260
${
3260
3261
args . includeTxMetadata
3261
3262
? this . sql `
3262
- SELECT ${ unsafeCols ( this . sql , [
3263
+ SELECT ${ this . sql ( [
3263
3264
'nft.asset_identifier' ,
3264
3265
'nft.value' ,
3265
3266
...prefixedCols ( TX_COLUMNS , 'txs' ) ,
3266
- abiColumn ( ) ,
3267
3267
'nft.count' ,
3268
- ] ) }
3268
+ ] ) } , ${ abiColumn ( this . sql ) }
3269
3269
FROM nft
3270
3270
INNER JOIN txs USING (tx_id)
3271
3271
WHERE txs.canonical = TRUE AND txs.microblock_canonical = TRUE
@@ -3301,16 +3301,15 @@ export class PgStore extends BasePgStore {
3301
3301
includeTxMetadata : boolean ;
3302
3302
} ) : Promise < { results : NftEventWithTxMetadata [ ] ; total : number } > {
3303
3303
const columns = args . includeTxMetadata
3304
- ? unsafeCols ( this . sql , [
3304
+ ? this . sql ` ${ this . sql ( [
3305
3305
'asset_identifier' ,
3306
3306
'value' ,
3307
3307
'event_index' ,
3308
3308
'asset_event_type_id' ,
3309
3309
'sender' ,
3310
3310
'recipient' ,
3311
3311
...prefixedCols ( TX_COLUMNS , 'txs' ) ,
3312
- abiColumn ( ) ,
3313
- ] )
3312
+ ] ) } , ${ abiColumn ( this . sql ) } `
3314
3313
: this . sql `nft.*` ;
3315
3314
const nftTxResults = await this . sql < ( DbNftEvent & ContractTxQueryResult & { count : number } ) [ ] > `
3316
3315
SELECT ${ columns } , (COUNT(*) OVER())::INTEGER AS count
@@ -3362,16 +3361,15 @@ export class PgStore extends BasePgStore {
3362
3361
includeTxMetadata : boolean ;
3363
3362
} ) : Promise < { results : NftEventWithTxMetadata [ ] ; total : number } > {
3364
3363
const columns = args . includeTxMetadata
3365
- ? unsafeCols ( this . sql , [
3364
+ ? this . sql ` ${ this . sql ( [
3366
3365
'asset_identifier' ,
3367
3366
'value' ,
3368
3367
'event_index' ,
3369
3368
'asset_event_type_id' ,
3370
3369
'sender' ,
3371
3370
'recipient' ,
3372
3371
...prefixedCols ( TX_COLUMNS , 'txs' ) ,
3373
- abiColumn ( ) ,
3374
- ] )
3372
+ ] ) } , ${ abiColumn ( this . sql ) } `
3375
3373
: this . sql `nft.*` ;
3376
3374
const nftTxResults = await this . sql < ( DbNftEvent & ContractTxQueryResult & { count : number } ) [ ] > `
3377
3375
SELECT ${ columns } , (COUNT(*) OVER())::INTEGER AS count
@@ -3442,7 +3440,7 @@ export class PgStore extends BasePgStore {
3442
3440
return await this . sqlTransaction ( async sql => {
3443
3441
const maxBlockHeight = await this . getMaxBlockHeight ( sql , { includeUnanchored } ) ;
3444
3442
const result = await sql < ContractTxQueryResult [ ] > `
3445
- SELECT ${ unsafeCols ( sql , [ ... TX_COLUMNS , abiColumn ( ) ] ) }
3443
+ SELECT ${ sql ( TX_COLUMNS ) } , ${ abiColumn ( sql ) }
3446
3444
FROM txs
3447
3445
WHERE tx_id IN ${ sql ( txIds ) }
3448
3446
AND block_height <= ${ maxBlockHeight }
0 commit comments