11const { BackstopConfig, BackstopToken } = require ( "@blend-capital/blend-sdk" ) ;
2+ const { nativeToScVal, rpc, Account, TransactionBuilder, Contract, scValToNative } = require ( "@stellar/stellar-sdk" ) ;
23
34const BACKSTOP_ID = "CAO3AGAMZVRMHITL36EJ2VZQWKYRPWMQAPDQD5YEOF3GIF7T44U4JAL3" ;
45
@@ -7,24 +8,58 @@ const network = {
78 passphrase : "Public Global Stellar Network ; September 2015" ,
89} ;
910
11+ async function getTokenBalance (
12+ token_id ,
13+ address
14+ ) {
15+ // account does not get validated during simulateTx
16+ const account = new Account ( 'GANXGJV2RNOFMOSQ2DTI3RKDBAVERXUVFC27KW3RLVQCLB3RYNO3AAI4' , '123' ) ;
17+ const tx_builder = new TransactionBuilder ( account , {
18+ fee : '1000' ,
19+ timebounds : { minTime : 0 , maxTime : 0 } ,
20+ networkPassphrase : network . passphrase ,
21+ } ) ;
22+ tx_builder . addOperation ( new Contract ( token_id ) . call ( 'balance' , nativeToScVal ( address , { type : 'address' } ) ) ) ;
23+ const stellarRpc = new rpc . Server ( network . rpc , network . opts ) ;
24+ const scval_result = await stellarRpc . simulateTransaction (
25+ tx_builder . build ( )
26+ ) ;
27+ if ( scval_result == undefined ) {
28+ throw Error ( `unable to fetch balance for token: ${ token_id } ` ) ;
29+ }
30+ if ( rpc . Api . isSimulationSuccess ( scval_result ) ) {
31+ const val = scValToNative ( scval_result . result . retval ) ;
32+ return val ;
33+ } else {
34+ throw Error ( `unable to fetch balance for token: ${ token_id } ` ) ;
35+ }
36+ }
37+
1038async function tvl ( api ) {
1139 let backstop = await BackstopConfig . load ( network , BACKSTOP_ID ) ;
12- let backstop_token = await BackstopToken . load (
40+ let backstopTokeData = await BackstopToken . load (
1341 network ,
1442 backstop . backstopTkn ,
1543 backstop . blndTkn ,
1644 backstop . usdcTkn
1745 ) ;
18-
46+
47+ let totalBackstopTokens = await getTokenBalance (
48+ backstop . backstopTkn ,
49+ BACKSTOP_ID
50+ ) ;
51+ let totalBLND = Number ( totalBackstopTokens ) * backstopTokeData . blndPerLpToken / 1e7 ;
52+ let totalUSDC = Number ( totalBackstopTokens ) * backstopTokeData . usdcPerLpToken / 1e7 ;
1953 // backstop token is a 80% BLND 20% USDC Comet pool (Balancer v1 fork)
20- api . addCGToken ( "usd-coin" , Number ( backstop_token . usdc ) / 1e7 ) ;
21- api . addCGToken ( 'blend' , Number ( backstop_token . blnd ) / 1e7 ) ;
54+ api . addCGToken ( "usd-coin" , totalUSDC ) ;
55+ api . addCGToken ( 'blend' , totalBLND ) ;
2256 return api . getBalances ( ) ;
2357}
2458
2559module . exports = {
2660 hallmarks : [
2761 [ 1745478927 , "Calculate TVL using BLND Coin Gecko price instead of approximation via pool weights" ] ,
62+ [ 1745858101 , "Only account for lp tokens held by the backstop contract" ] ,
2863 ] ,
2964 stellar : {
3065 tvl : ( ) => ( { } ) ,
0 commit comments