@@ -850,6 +850,7 @@ export class PgDataStore
850850      const  {  orphanedMicroblocks }  =  await  this . findUnanchoredMicroblocksAtChainTip ( 
851851        client , 
852852        currentMicroblockTip . parent_index_block_hash , 
853+         '' , 
853854        currentMicroblockTip 
854855      ) ; 
855856      if  ( orphanedMicroblocks . length  >  0 )  { 
@@ -858,6 +859,7 @@ export class PgDataStore
858859        const  {  orphanedMicroblockTxs }  =  await  this . handleMicroOrphan ( 
859860          client , 
860861          currentMicroblockTip . parent_index_block_hash , 
862+           '' , 
861863          true , 
862864          orphanedMicroblocks 
863865        ) ; 
@@ -915,11 +917,14 @@ export class PgDataStore
915917          ` 
916918          SELECT microblock_hash 
917919          FROM microblocks 
918-           WHERE parent_index_block_hash = $1 AND microblock_hash = ANY($2) 
920+           WHERE parent_index_block_hash = $1 
921+           AND microblock_hash = ANY($2) 
922+           AND (index_block_hash = $3 OR index_block_hash = '\\x'::bytea) 
919923          ` , 
920924          [ 
921925            hexToBuffer ( data . block . parent_index_block_hash ) , 
922926            data . microblocks . map ( mb  =>  hexToBuffer ( mb . microblock_hash ) ) , 
927+             hexToBuffer ( data . block . index_block_hash ) , 
923928          ] 
924929        ) ; 
925930        const  existingMicroblockHashes  =  new  Set ( 
@@ -976,13 +981,15 @@ export class PgDataStore
976981      }  =  await  this . findUnanchoredMicroblocksAtChainTip ( 
977982        client , 
978983        data . block . parent_index_block_hash , 
984+         data . block . index_block_hash , 
979985        acceptedMicroblockTip 
980986      ) ; 
981987
982988      if  ( orphanedMicroblocks . length  >  0 )  { 
983989        const  {  orphanedMicroblockTxs }  =  await  this . handleMicroOrphan ( 
984990          client , 
985991          data . block . parent_index_block_hash , 
992+           data . block . index_block_hash , 
986993          isCanonical , 
987994          orphanedMicroblocks 
988995        ) ; 
@@ -1004,13 +1011,15 @@ export class PgDataStore
10041011          SET microblock_canonical = true, canonical = $1, index_block_hash = $2, block_hash = $3 
10051012          WHERE parent_index_block_hash = $4 
10061013          AND microblock_hash = ANY($5) 
1014+           AND (index_block_hash = $6 OR index_block_hash = '\\x'::bytea) 
10071015          ` , 
10081016          [ 
10091017            isCanonical , 
10101018            hexToBuffer ( data . block . index_block_hash ) , 
10111019            hexToBuffer ( data . block . block_hash ) , 
10121020            hexToBuffer ( data . block . parent_index_block_hash ) , 
10131021            acceptedMicroblocks . map ( mb  =>  hexToBuffer ( mb ) ) , 
1022+             hexToBuffer ( data . block . index_block_hash ) , 
10141023          ] 
10151024        ) ; 
10161025        // Note: this assumes the stacks-node will never send the same combination of (microblock_hash, parent_index_block_hash) more than once. 
@@ -1027,6 +1036,7 @@ export class PgDataStore
10271036        UPDATE txs 
10281037        SET microblock_canonical = true, canonical = $1, index_block_hash = $2, block_hash = $3, burn_block_time = $4 
10291038        WHERE parent_index_block_hash = $5 
1039+         AND (index_block_hash = $2 OR index_block_hash = '\\x'::bytea) 
10301040        AND microblock_hash = ANY($6) 
10311041        RETURNING tx_id, microblock_hash 
10321042        ` , 
@@ -1189,6 +1199,7 @@ export class PgDataStore
11891199  async  handleMicroOrphan ( 
11901200    client : ClientBase , 
11911201    parentIndexBlockHash : string , 
1202+     indexBlockHash : string , 
11921203    isCanonical : boolean , 
11931204    orphanedMicroblocks : string [ ] 
11941205  ) : Promise < {  orphanedMicroblockTxs : string [ ]  } >  { 
@@ -1199,8 +1210,13 @@ export class PgDataStore
11991210      SET microblock_canonical = false 
12001211      WHERE parent_index_block_hash = $1 
12011212      AND microblock_hash = ANY($2) 
1213+       AND (index_block_hash = $3 OR index_block_hash = '\\x'::bytea) 
12021214      ` , 
1203-       [ hexToBuffer ( parentIndexBlockHash ) ,  orphanedMicroblocks . map ( mb  =>  hexToBuffer ( mb ) ) ] 
1215+       [ 
1216+         hexToBuffer ( parentIndexBlockHash ) , 
1217+         orphanedMicroblocks . map ( mb  =>  hexToBuffer ( mb ) ) , 
1218+         hexToBuffer ( indexBlockHash ) , 
1219+       ] 
12041220    ) ; 
12051221    if  ( orphanMicroblocksQuery . rowCount  !==  orphanedMicroblocks . length )  { 
12061222      throw  new  Error ( `Unexpected number of rows updated when setting microblock_canonical` ) ; 
@@ -1215,12 +1231,14 @@ export class PgDataStore
12151231      SET microblock_canonical = false, canonical = $1 
12161232      WHERE parent_index_block_hash = $2 
12171233      AND microblock_hash = ANY($3) 
1218-       RETURNING tx_id, microblock_hash 
1234+       AND index_block_hash = $4 
1235+       RETURNING tx_id, microblock_hash, block_hash 
12191236      ` , 
12201237      [ 
12211238        isCanonical , 
12221239        hexToBuffer ( parentIndexBlockHash ) , 
12231240        orphanedMicroblocks . map ( mb  =>  hexToBuffer ( mb ) ) , 
1241+         hexToBuffer ( indexBlockHash ) , 
12241242      ] 
12251243    ) ; 
12261244    orphanedMbTxsQuery . rows . forEach ( row  =>  { 
@@ -1262,6 +1280,7 @@ export class PgDataStore
12621280  async  findUnanchoredMicroblocksAtChainTip ( 
12631281    client : ClientBase , 
12641282    parentIndexBlockHash : string , 
1283+     indexBlockHash : string , 
12651284    microblockChainTip : DbMicroblock  |  undefined 
12661285  ) : Promise < {  acceptedMicroblocks : string [ ] ;  orphanedMicroblocks : string [ ]  } >  { 
12671286    // Get any microblocks that this anchor block is responsible for accepting or rejecting. 
@@ -1272,8 +1291,9 @@ export class PgDataStore
12721291      SELECT ${ MICROBLOCK_COLUMNS }  
12731292      FROM microblocks 
12741293      WHERE parent_index_block_hash = $1 
1294+       AND (index_block_hash = $2 OR index_block_hash = '\\x'::bytea) 
12751295      ` , 
1276-       [ hexToBuffer ( parentIndexBlockHash ) ] 
1296+       [ hexToBuffer ( parentIndexBlockHash ) ,   hexToBuffer ( indexBlockHash ) ] 
12771297    ) ; 
12781298    const  candidateMicroblocks  =  mbQuery . rows . map ( row  =>  this . parseMicroblockQueryResult ( row ) ) ; 
12791299
@@ -2755,8 +2775,8 @@ export class PgDataStore
27552775        $1, $2, $3, $4, $5, $6, $7, $8, $9, $10, $11, $12, $13, $14, $15, $16, $17, $18, $19,  
27562776        $20, $21, $22, $23, $24, $25, $26, $27, $28, $29, $30, $31, $32, $33, $34, $35, $36, $37 
27572777      ) 
2758-       --  ON CONFLICT ON CONSTRAINT unique_tx_id_index_block_hash 
2759-       --  DO NOTHING 
2778+       ON CONFLICT ON CONSTRAINT unique_tx_id_index_block_hash 
2779+       DO NOTHING 
27602780      ` , 
27612781      [ 
27622782        hexToBuffer ( tx . tx_id ) , 
0 commit comments