@@ -77,6 +77,24 @@ const getUserBalanceAtLevel = async (
7777 return new BigNumber ( 0 ) ;
7878} ;
7979
80+ const getUserXTZBalanceAtLevelViaRpc = async ( network , level , userAddress ) => {
81+ const rpcUrl = rpcNodes [ network ] ;
82+ const url = `${ rpcUrl } /chains/main/blocks/${ level } /context/contracts/${ userAddress } /full_balance` ;
83+
84+ try {
85+ const response = await axios ( { url, method : "GET" } ) ;
86+ if ( response . status === 200 ) {
87+ return new BigNumber ( response . data ) ;
88+ }
89+ } catch ( error ) {
90+ // RPC failed (likely historical block not available), fall back to TzKT
91+ console . warn ( `RPC failed for block ${ level } , falling back to TzKT API` ) ;
92+ return await getUserXTZBalanceAtLevel ( network , level , userAddress ) ;
93+ }
94+
95+ return new BigNumber ( 0 ) ;
96+ } ;
97+
8098const getUserXTZBalanceAtLevel = async ( network , level , userAddress ) => {
8199 const url = `https://api.${ network } .tzkt.io/v1/accounts/${ userAddress } /balance_history/${ level } ` ;
82100 const response = await axios ( { url, method : "GET" } ) ;
@@ -173,11 +191,18 @@ const getUserTotalVotingPowerAtReferenceBlock = async (
173191
174192 return userVotingPower ;
175193 } else {
176- const selfBalance = await getUserXTZBalanceAtLevel (
194+ const selfBalance = await getUserXTZBalanceAtLevelViaRpc (
195+ network ,
196+ level ,
197+ userAddress
198+ ) ;
199+ const selfBalanceLegacy = await getUserXTZBalanceAtLevel (
177200 network ,
178201 level ,
179202 userAddress
180203 ) ;
204+ console . log ( "selfBalance: " , selfBalance ) ;
205+ console . log ( "selfBalanceLegacy: " , selfBalanceLegacy ) ;
181206 return userVotingPower . plus ( selfBalance ) ;
182207 }
183208} ;
0 commit comments