@@ -679,14 +679,17 @@ public static void MapBasaltEndpoints(
679679 // If the contract storage format changes, this endpoint must be updated accordingly.
680680 app . MapGet ( "/v1/pools" , ( ) =>
681681 {
682+ // S2-03: Fork state for consistent multi-read snapshot
683+ var snapshot = stateDb . Fork ( ) ;
684+
682685 var contractAddr = new Address ( new byte [ ]
683686 {
684687 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 ,
685688 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0x10 , 0x05 ,
686689 } ) ;
687690
688691 // Read _nextPoolId (key "sp_next")
689- var nextIdRaw = stateDb . GetStorage ( contractAddr , Blake3Hasher . Hash ( Encoding . UTF8 . GetBytes ( "sp_next" ) ) ) ;
692+ var nextIdRaw = snapshot . GetStorage ( contractAddr , Blake3Hasher . Hash ( Encoding . UTF8 . GetBytes ( "sp_next" ) ) ) ;
690693 ulong poolCount = 0 ;
691694 if ( nextIdRaw is { Length : >= 9 } && nextIdRaw [ 0 ] == 0x01 )
692695 poolCount = System . Buffers . Binary . BinaryPrimitives . ReadUInt64LittleEndian ( nextIdRaw . AsSpan ( 1 ) ) ;
@@ -697,19 +700,19 @@ public static void MapBasaltEndpoints(
697700 var idStr = i . ToString ( ) ;
698701
699702 // Operator (key "sp_ops:{id}", tag 0x07 = string)
700- var opsRaw = stateDb . GetStorage ( contractAddr , Blake3Hasher . Hash ( Encoding . UTF8 . GetBytes ( "sp_ops:" + idStr ) ) ) ;
703+ var opsRaw = snapshot . GetStorage ( contractAddr , Blake3Hasher . Hash ( Encoding . UTF8 . GetBytes ( "sp_ops:" + idStr ) ) ) ;
701704 var operatorHex = opsRaw is { Length : > 1 } && opsRaw [ 0 ] == 0x07
702705 ? Encoding . UTF8 . GetString ( opsRaw . AsSpan ( 1 ) )
703706 : "" ;
704707
705708 // Total stake (key "sp_total:{id}", tag 0x0A = UInt256)
706- var stakeRaw = stateDb . GetStorage ( contractAddr , Blake3Hasher . Hash ( Encoding . UTF8 . GetBytes ( "sp_total:" + idStr ) ) ) ;
709+ var stakeRaw = snapshot . GetStorage ( contractAddr , Blake3Hasher . Hash ( Encoding . UTF8 . GetBytes ( "sp_total:" + idStr ) ) ) ;
707710 var totalStake = stakeRaw is { Length : >= 33 } && stakeRaw [ 0 ] == 0x0A
708711 ? new UInt256 ( stakeRaw . AsSpan ( 1 , 32 ) ) . ToString ( )
709712 : "0" ;
710713
711714 // Total rewards (key "sp_rewards:{id}", tag 0x0A = UInt256)
712- var rewardsRaw = stateDb . GetStorage ( contractAddr , Blake3Hasher . Hash ( Encoding . UTF8 . GetBytes ( "sp_rewards:" + idStr ) ) ) ;
715+ var rewardsRaw = snapshot . GetStorage ( contractAddr , Blake3Hasher . Hash ( Encoding . UTF8 . GetBytes ( "sp_rewards:" + idStr ) ) ) ;
713716 var totalRewards = rewardsRaw is { Length : >= 33 } && rewardsRaw [ 0 ] == 0x0A
714717 ? new UInt256 ( rewardsRaw . AsSpan ( 1 , 32 ) ) . ToString ( )
715718 : "0" ;
0 commit comments