1
1
import { CoinModel } from './coin' ;
2
2
import { TransactionModel } from './transaction' ;
3
3
import { TransformOptions } from '../types/TransformOptions' ;
4
- import { ChainNetwork } from '../types/ChainNetwork' ;
5
4
import { LoggifyClass } from '../decorators/Loggify' ;
6
5
import { Bitcoin } from '../types/namespaces/Bitcoin' ;
7
6
import { BaseModel } from './base' ;
8
7
import logger from '../logger' ;
8
+ import { ChainStateProvider } from '../providers/chain-state' ;
9
9
10
10
export type IBlock = {
11
11
chain : string ;
@@ -47,7 +47,7 @@ export class Block extends BaseModel<IBlock> {
47
47
}
48
48
49
49
async addBlock ( params : {
50
- block : Bitcoin . Block ;
50
+ block : any ;
51
51
parentChain ?: string ;
52
52
forkHeight ?: number ;
53
53
chain : string ;
@@ -57,7 +57,11 @@ export class Block extends BaseModel<IBlock> {
57
57
const header = block . header . toObject ( ) ;
58
58
const blockTime = header . time * 1000 ;
59
59
60
- await this . handleReorg ( { header, chain, network } ) ;
60
+ const reorg = await this . handleReorg ( { header, chain, network } ) ;
61
+
62
+ if ( reorg ) {
63
+ return Promise . reject ( 'reorg' ) ;
64
+ }
61
65
62
66
const previousBlock = await this . collection . findOne ( { hash : header . prevHash , chain, network } ) ;
63
67
@@ -125,38 +129,14 @@ export class Block extends BaseModel<IBlock> {
125
129
return coinbase ;
126
130
}
127
131
128
- async getLocalTip ( params : ChainNetwork ) {
129
- const { chain, network } = params ;
130
- const [ bestBlock ] = await this . collection
131
- . find ( { processed : true , chain, network } )
132
- . sort ( { height : - 1 } )
133
- . limit ( 1 )
134
- . toArray ( ) ;
135
- return bestBlock || { height : 0 } ;
136
- }
137
-
138
- async getLocatorHashes ( params : ChainNetwork ) {
139
- const { chain, network } = params ;
140
- const locatorBlocks = await this . collection
141
- . find ( { processed : true , chain, network } )
142
- . sort ( { height : - 1 } )
143
- . limit ( 30 )
144
- . toArray ( ) ;
145
-
146
- if ( locatorBlocks . length < 2 ) {
147
- return [ Array ( 65 ) . join ( '0' ) ] ;
148
- }
149
- return locatorBlocks . map ( block => block . hash ) ;
150
- }
151
-
152
- async handleReorg ( params : { header ?: Bitcoin . Block . HeaderObj ; chain : string ; network : string } ) {
132
+ async handleReorg ( params : { header ?: Bitcoin . Block . HeaderObj ; chain : string ; network : string } ) : Promise < boolean > {
153
133
const { header, chain, network } = params ;
154
- const localTip = await BlockModel . getLocalTip ( params ) ;
155
- if ( header && localTip . hash === header . prevHash ) {
156
- return ;
134
+ const localTip = await ChainStateProvider . getLocalTip ( params ) ;
135
+ if ( header && localTip && localTip . hash === header . prevHash ) {
136
+ return false ;
157
137
}
158
- if ( localTip . height === 0 ) {
159
- return ;
138
+ if ( ! localTip || localTip . height === 0 ) {
139
+ return false ;
160
140
}
161
141
logger . info ( `Resetting tip to ${ localTip . previousBlockHash } ` , { chain, network } ) ;
162
142
await this . collection . remove ( { chain, network, height : { $gte : localTip . height } } ) ;
@@ -169,6 +149,7 @@ export class Block extends BaseModel<IBlock> {
169
149
) ;
170
150
171
151
logger . debug ( 'Removed data from above blockHeight: ' , localTip . height ) ;
152
+ return true ;
172
153
}
173
154
174
155
_apiTransform ( block : IBlock , options : TransformOptions ) : any {
0 commit comments