@@ -3043,13 +3043,9 @@ describe('postgres datastore', () => {
30433043 reward_index : 0 ,
30443044 } ;
30453045 await db . updateBurnchainRewards ( {
3046- burnchainBlockHash : reward1 . burn_block_hash ,
3047- burnchainBlockHeight : reward1 . burn_block_height ,
30483046 rewards : [ reward1 , reward2 ] ,
30493047 } ) ;
30503048 await db . updateBurnchainRewards ( {
3051- burnchainBlockHash : reward3 . burn_block_hash ,
3052- burnchainBlockHeight : reward3 . burn_block_height ,
30533049 rewards : [ reward3 ] ,
30543050 } ) ;
30553051 const rewardQuery = await db . getBurnchainRewards ( {
@@ -3091,80 +3087,145 @@ describe('postgres datastore', () => {
30913087 test ( 'pg burnchain reward reorg handling' , async ( ) => {
30923088 const addr1 = '1G4ayBXJvxZMoZpaNdZG6VyWwWq2mHpMjQ' ;
30933089 const addr2 = '1DDUAqoyXvhF4cxznN9uL6j9ok1oncsT2z' ;
3094- const reward1 : DbBurnchainReward = {
3095- canonical : true ,
3096- burn_block_hash : '0x1234' ,
3097- burn_block_height : 200 ,
3098- burn_amount : 2000n ,
3099- reward_recipient : addr1 ,
3100- reward_amount : 900n ,
3101- reward_index : 0 ,
3102- } ;
3103- const reward2 : DbBurnchainReward = {
3104- canonical : true ,
3105- burn_block_hash : '0x1234' ,
3090+
3091+ const mineTenure = async ( args : {
3092+ block_height : number ;
3093+ block_hash : string ;
3094+ index_block_hash : string ;
3095+ parent_index_block_hash : string ;
3096+ parent_block_hash : string ;
3097+ burn_block_hash : string ;
3098+ burn_block_height : number ;
3099+ tenure_height : number ;
3100+ } ) => {
3101+ // Add some rewards
3102+ await db . updateBurnchainRewards ( {
3103+ rewards : [
3104+ {
3105+ canonical : true ,
3106+ burn_block_hash : args . burn_block_hash ,
3107+ burn_block_height : args . burn_block_height ,
3108+ burn_amount : 2000n ,
3109+ reward_recipient : addr1 ,
3110+ reward_amount : 900n ,
3111+ reward_index : 0 ,
3112+ } ,
3113+ {
3114+ canonical : true ,
3115+ burn_block_hash : args . burn_block_hash ,
3116+ burn_block_height : args . burn_block_height ,
3117+ burn_amount : 2001n ,
3118+ reward_recipient : addr2 ,
3119+ reward_amount : 901n ,
3120+ reward_index : 1 ,
3121+ } ,
3122+ ] ,
3123+ } ) ;
3124+ // Mine a tenure based on that burn block
3125+ await db . update (
3126+ new TestBlockBuilder ( {
3127+ block_height : args . block_height ,
3128+ block_hash : args . block_hash ,
3129+ index_block_hash : args . index_block_hash ,
3130+ parent_index_block_hash : args . parent_index_block_hash ,
3131+ parent_block_hash : args . parent_block_hash ,
3132+ burn_block_hash : args . burn_block_hash ,
3133+ burn_block_height : args . burn_block_height ,
3134+ tenure_height : args . tenure_height ,
3135+ } ) . build ( )
3136+ ) ;
3137+ } ;
3138+
3139+ // Mine 3 tenures, check rewards
3140+ await mineTenure ( {
3141+ block_height : 1 ,
3142+ block_hash : '0x11' ,
3143+ index_block_hash : '0x11' ,
3144+ parent_index_block_hash : '0x0000' ,
3145+ parent_block_hash : '0x0000' ,
3146+ burn_block_hash : '0x1111' ,
31063147 burn_block_height : 200 ,
3107- burn_amount : 2001n ,
3108- reward_recipient : addr1 ,
3109- reward_amount : 901n ,
3110- reward_index : 1 ,
3111- } ;
3112- const reward3 : DbBurnchainReward = {
3113- canonical : true ,
3114- burn_block_hash : '0x2345' ,
3115- burn_block_height : 201 ,
3116- burn_amount : 3001n ,
3117- reward_recipient : addr1 ,
3118- reward_amount : 902n ,
3119- reward_index : 0 ,
3120- } ;
3121- // block that triggers a reorg of all previous
3122- const reward4 : DbBurnchainReward = {
3123- canonical : true ,
3124- burn_block_hash : reward1 . burn_block_hash ,
3125- burn_block_height : reward1 . burn_block_height ,
3126- burn_amount : 4001n ,
3127- reward_recipient : addr2 ,
3128- reward_amount : 903n ,
3129- reward_index : 0 ,
3130- } ;
3131- await db . updateBurnchainRewards ( {
3132- burnchainBlockHash : reward1 . burn_block_hash ,
3133- burnchainBlockHeight : reward1 . burn_block_height ,
3134- rewards : [ reward1 , reward2 ] ,
3148+ tenure_height : 1 ,
31353149 } ) ;
3136- await db . updateBurnchainRewards ( {
3137- burnchainBlockHash : reward3 . burn_block_hash ,
3138- burnchainBlockHeight : reward3 . burn_block_height ,
3139- rewards : [ reward3 ] ,
3150+ await mineTenure ( {
3151+ block_height : 2 ,
3152+ block_hash : '0x22' ,
3153+ index_block_hash : '0x22' ,
3154+ parent_index_block_hash : '0x11' ,
3155+ parent_block_hash : '0x11' ,
3156+ burn_block_hash : '0x1112' ,
3157+ burn_block_height : 201 ,
3158+ tenure_height : 2 ,
31403159 } ) ;
3141- await db . updateBurnchainRewards ( {
3142- burnchainBlockHash : reward4 . burn_block_hash ,
3143- burnchainBlockHeight : reward4 . burn_block_height ,
3144- rewards : [ reward4 ] ,
3160+ await mineTenure ( {
3161+ block_height : 3 ,
3162+ block_hash : '0x33' ,
3163+ index_block_hash : '0x33' ,
3164+ parent_index_block_hash : '0x22' ,
3165+ parent_block_hash : '0x22' ,
3166+ burn_block_hash : '0x1113' ,
3167+ burn_block_height : 202 ,
3168+ tenure_height : 3 ,
31453169 } ) ;
3146- // Should return zero rewards since given address was only in blocks that have been reorged into non-canonical.
3147- const rewardQuery1 = await db . getBurnchainRewards ( {
3148- burnchainRecipient : addr1 ,
3170+ const rewards = await db . getBurnchainRewards ( {
31493171 limit : 100 ,
31503172 offset : 0 ,
31513173 } ) ;
3152- expect ( rewardQuery1 ) . toEqual ( [ ] ) ;
3153- const rewardQuery2 = await db . getBurnchainRewards ( {
3154- burnchainRecipient : addr2 ,
3174+ expect ( rewards ) . toHaveLength ( 6 ) ;
3175+ expect ( rewards . map ( r => r . burn_block_hash ) ) . toEqual ( [
3176+ '0x1113' ,
3177+ '0x1113' ,
3178+ '0x1112' ,
3179+ '0x1112' ,
3180+ '0x1111' ,
3181+ '0x1111' ,
3182+ ] ) ;
3183+
3184+ // Create re-org after burn block 201, check rewards again
3185+ await mineTenure ( {
3186+ block_height : 2 ,
3187+ block_hash : '0x22bb' ,
3188+ index_block_hash : '0x22bb' ,
3189+ parent_index_block_hash : '0x11' ,
3190+ parent_block_hash : '0x11' ,
3191+ burn_block_hash : '0x1112bb' ,
3192+ burn_block_height : 201 ,
3193+ tenure_height : 2 ,
3194+ } ) ;
3195+ await mineTenure ( {
3196+ block_height : 3 ,
3197+ block_hash : '0x33bb' ,
3198+ index_block_hash : '0x33bb' ,
3199+ parent_index_block_hash : '0x22bb' ,
3200+ parent_block_hash : '0x22bb' ,
3201+ burn_block_hash : '0x1113bb' ,
3202+ burn_block_height : 202 ,
3203+ tenure_height : 3 ,
3204+ } ) ;
3205+ await mineTenure ( {
3206+ block_height : 4 ,
3207+ block_hash : '0x44bb' ,
3208+ index_block_hash : '0x44bb' ,
3209+ parent_index_block_hash : '0x33bb' ,
3210+ parent_block_hash : '0x33bb' ,
3211+ burn_block_hash : '0x1114' ,
3212+ burn_block_height : 203 ,
3213+ tenure_height : 4 ,
3214+ } ) ;
3215+ const rewards2 = await db . getBurnchainRewards ( {
31553216 limit : 100 ,
31563217 offset : 0 ,
31573218 } ) ;
3158- expect ( rewardQuery2 ) . toEqual ( [
3159- {
3160- canonical : true ,
3161- burn_block_hash : '0x1234 ',
3162- burn_block_height : 200 ,
3163- burn_amount : 4001n ,
3164- reward_recipient : addr2 ,
3165- reward_amount : 903n ,
3166- reward_index : 0 ,
3167- } ,
3219+ expect ( rewards2 ) . toHaveLength ( 8 ) ;
3220+ expect ( rewards2 . map ( r => r . burn_block_hash ) ) . toEqual ( [
3221+ '0x1114' ,
3222+ '0x1114 ',
3223+ '0x1113bb' ,
3224+ '0x1113bb' ,
3225+ '0x1112bb' ,
3226+ '0x1112bb' ,
3227+ '0x1111' ,
3228+ '0x1111' ,
31683229 ] ) ;
31693230 } ) ;
31703231
0 commit comments