1- // @ts -ignore
21import { getWhaleClient } from '@waveshq/walletkit-bot' ;
3- import { BigNumber } from 'bignumber.js' ;
42import { ethers } from 'ethers' ;
53
6- import { StateRelayer , StateRelayer__factory } from '../generated' ;
7- import {
8- BurnedInformation ,
9- DataStore ,
10- MasterNodeData ,
11- PairData ,
12- StateRelayerHandlerProps ,
13- VaultData ,
14- } from './utils/types' ;
4+ import { StateRelayer__factory } from '../generated' ;
5+ import { tranformPairData , transformDataMasternode , transformDataVault } from './utils/transformData' ;
6+ import { DataStore , MasterNodeData , StateRelayerHandlerProps , VaultData } from './utils/types' ;
7+ import { ApiPagedResponse } from '@defichain/whale-api-client'
8+ import { PoolPairData } from '@defichain/whale-api-client/dist/api/poolpairs'
159
1610const DENOMINATION = 'USDT' ;
17- const DECIMALS = 10 ;
18-
19- const transformToEthersBigNumber = ( str : string , decimals : number ) : ethers . BigNumber =>
20- ethers . BigNumber . from (
21- new BigNumber ( str ) . multipliedBy ( new BigNumber ( '10' ) . pow ( decimals ) ) . integerValue ( BigNumber . ROUND_FLOOR ) . toString ( ) ,
22- ) ;
11+ const PAGESIZE = 50 ;
2312
2413export async function handler ( props : StateRelayerHandlerProps ) : Promise < DFCData | undefined > {
2514 const { urlNetwork, envNetwork, signer, contractAddress } = props ;
26- const stateRelayerContract = new ethers . Contract ( contractAddress , StateRelayer__factory . abi , signer ) as StateRelayer ;
15+ const stateRelayerContract = StateRelayer__factory . connect ( contractAddress , signer ) ;
2716 const dataStore = { } as DataStore ;
28- const burnedData = { } as BurnedInformation ;
29- const dataVault = { } as VaultData ;
30- const dataMasterNode = { } as MasterNodeData ;
3117 try {
3218 // TODO: Check if Function should run (blockHeight > 30 from previous)
3319 // Get Data from OCEAN API
3420 const client = getWhaleClient ( urlNetwork , envNetwork ) ;
3521 const statsData = await client . stats . get ( ) ;
36- const rawPoolPairData = await client . poolpairs . list ( 200 ) ;
37- const dexPriceData = await client . poolpairs . listDexPrices ( DENOMINATION ) ;
38-
39- // sanitize response data
40- const poolPairData = rawPoolPairData . filter ( ( pair : any ) => ! pair . displaySymbol . includes ( '/' ) ) ;
4122
42- /* ------------ Data from /dex ----------- */
43- // totalValueLockInPoolPair
44- const totalValueLockInPoolPair = transformToEthersBigNumber ( statsData . tvl . dex . toString ( ) , DECIMALS ) ;
45- // total24HVolume
46- const total24HVolume = transformToEthersBigNumber (
47- poolPairData . reduce ( ( acc :any , currPair :any ) => acc + ( currPair . volume ?. h24 ?? 0 ) , 0 ) . toString ( ) ,
48- DECIMALS ,
49- ) ;
23+ let rawPoolPairData : Array < PoolPairData > = [ ] ;
24+ let pagedPoolPairData : ApiPagedResponse < PoolPairData > = await client . poolpairs . list ( PAGESIZE ) ;
25+ rawPoolPairData = rawPoolPairData . concat ( pagedPoolPairData ) ;
26+ while ( pagedPoolPairData . hasNext ) {
27+ pagedPoolPairData = await client . paginate ( pagedPoolPairData ) ;
28+ rawPoolPairData = rawPoolPairData . concat ( pagedPoolPairData ) ;
29+ }
30+
31+ const dexPriceData = await client . poolpairs . listDexPrices ( DENOMINATION ) ;
5032
51- // /dex/pair
52- const pair = poolPairData . reduce < PairData > ( ( acc :any , currPair :any ) => {
53- let tokenPrice = new BigNumber ( 0 ) ;
54- // price ratio is
55- const priceRatio = currPair . priceRatio . ba ;
56- const { symbol } = currPair . tokenB ;
57- if ( symbol === DENOMINATION || new BigNumber ( priceRatio ) . isZero ( ) ) {
58- tokenPrice = new BigNumber ( priceRatio ) ;
59- } else {
60- const dexPricePerToken = new BigNumber ( dexPriceData . dexPrices [ symbol ] ?. denominationPrice ?? 0 ) ;
61- tokenPrice = dexPricePerToken . multipliedBy ( currPair . priceRatio . ba ) ;
62- }
63- return {
64- ...acc ,
65- [ currPair . displaySymbol ] : {
66- primaryTokenPrice : transformToEthersBigNumber ( tokenPrice . toString ( ) , DECIMALS ) ,
67- volume24H : transformToEthersBigNumber ( currPair . volume ?. h24 . toString ( ) ?? '0' , DECIMALS ) ,
68- totalLiquidity : transformToEthersBigNumber ( currPair . totalLiquidity . usd ?? '0' , DECIMALS ) ,
69- APR : transformToEthersBigNumber ( currPair . apr ?. total . toString ( ) ?? '0' , DECIMALS ) ,
70- firstTokenBalance : transformToEthersBigNumber ( currPair . tokenA . reserve , DECIMALS ) ,
71- secondTokenBalance : transformToEthersBigNumber ( currPair . tokenB . reserve , DECIMALS ) ,
72- rewards : transformToEthersBigNumber ( currPair . apr ?. reward . toString ( ) ?? '0' , DECIMALS ) ,
73- commissions : transformToEthersBigNumber ( currPair . commission , DECIMALS ) ,
74- decimals : DECIMALS ,
75- } ,
76- } as PairData ;
77- } , { } as PairData ) ;
78- dataStore . pair = pair ;
33+ const inputForDexUpdate = tranformPairData ( rawPoolPairData , statsData , dexPriceData ) ;
7934
8035 // Data from vaults
81- const totalLoanValue = statsData . loan . value . loan ;
82- const totalCollateralValue = statsData . loan . value . collateral ;
83- dataVault . noOfVaults = transformToEthersBigNumber ( statsData . loan . count . openVaults . toString ( ) , 0 ) ;
84- dataVault . totalLoanValue = transformToEthersBigNumber ( totalLoanValue . toString ( ) , DECIMALS ) ;
85- dataVault . totalCollateralValue = transformToEthersBigNumber ( totalCollateralValue . toString ( ) , DECIMALS ) ;
86- dataVault . totalCollateralizationRatio = transformToEthersBigNumber (
87- ( ( totalCollateralValue / totalLoanValue ) * 100 ) . toFixed ( 3 ) . toString ( ) ,
88- DECIMALS ,
89- ) ;
90- dataVault . activeAuctions = transformToEthersBigNumber ( statsData . loan . count . openAuctions . toString ( ) , 0 ) ;
91- dataVault . decimals = DECIMALS ;
36+ const dataVault = transformDataVault ( statsData ) ;
9237
9338 // Data from Master Nodes
94- dataMasterNode . totalValueLockedInMasterNodes = transformToEthersBigNumber (
95- statsData . tvl . masternodes . toString ( ) ,
96- DECIMALS ,
97- ) ;
98- dataMasterNode . zeroYearLocked = transformToEthersBigNumber ( statsData . masternodes . locked [ 0 ] . count . toString ( ) , 0 ) ;
99- dataMasterNode . fiveYearLocked = transformToEthersBigNumber ( statsData . masternodes . locked [ 2 ] . count . toString ( ) , 0 ) ;
100- dataMasterNode . tenYearLocked = transformToEthersBigNumber ( statsData . masternodes . locked [ 1 ] . count . toString ( ) , 0 ) ;
101- dataMasterNode . decimals = DECIMALS ;
39+ const dataMasterNode = transformDataMasternode ( statsData ) ;
10240
103- // Get Data from all burns in ecosystem
104- burnedData . fee = transformToEthersBigNumber ( statsData . burned . fee . toString ( ) , DECIMALS ) ;
105- burnedData . auction = transformToEthersBigNumber ( statsData . burned . auction . toString ( ) , DECIMALS ) ;
106- burnedData . payback = transformToEthersBigNumber ( statsData . burned . payback . toString ( ) , DECIMALS ) ;
107- burnedData . emission = transformToEthersBigNumber ( statsData . burned . emission . toString ( ) , DECIMALS ) ;
108- burnedData . total = transformToEthersBigNumber ( statsData . burned . total . toString ( ) , DECIMALS ) ;
109- burnedData . decimals = DECIMALS ;
11041 // Call SC Function to update Data
11142 // Update Dex information
11243 const dexInfoTx = await stateRelayerContract . updateDEXInfo (
113- Object . keys ( dataStore . pair ) ,
114- Object . values ( dataStore . pair ) ,
115- totalValueLockInPoolPair ,
116- total24HVolume ,
44+ inputForDexUpdate . dex ,
45+ inputForDexUpdate . dexInfo ,
46+ inputForDexUpdate . totalValueLocked . toString ( ) ,
47+ inputForDexUpdate . total24HVolume . toString ( ) ,
11748 ) ;
11849
11950 // Update Master Node information
12051 const masterDataTx = await stateRelayerContract . updateMasterNodeInformation ( dataMasterNode ) ;
12152 // Update Vault general information
12253 const vaultTx = await stateRelayerContract . updateVaultGeneralInformation ( dataVault ) ;
123- // Update Burn information
124- const burnTx = await stateRelayerContract . updateBurnInfo ( burnedData ) ;
12554 if ( ! props . testGasCost ) {
12655 return {
12756 dataStore,
12857 dataVault,
12958 dataMasterNode,
130- burnedData,
13159 } ;
13260 }
13361 return {
13462 dataStore,
13563 dataVault,
13664 dataMasterNode,
137- burnedData,
138- dexInfoTxReceipt : await dexInfoTx . wait ( ) ,
139- masterDataTxReceipt : await masterDataTx . wait ( ) ,
140- vaultTxReceipt : await vaultTx . wait ( ) ,
141- burnTxReceipt : await burnTx . wait ( ) ,
65+ dexInfoTxReceipt : ( await dexInfoTx . wait ( ) ) || undefined ,
66+ masterDataTxReceipt : ( await masterDataTx . wait ( ) ) || undefined ,
67+ vaultTxReceipt : ( await vaultTx . wait ( ) ) || undefined ,
14268 } ;
14369 } catch ( e ) {
14470 console . error ( ( e as Error ) . message ) ;
@@ -150,9 +76,7 @@ interface DFCData {
15076 dataStore : DataStore ;
15177 dataVault : VaultData ;
15278 dataMasterNode : MasterNodeData ;
153- burnedData : BurnedInformation ;
154- dexInfoTxReceipt ?: ethers . providers . TransactionReceipt ;
155- masterDataTxReceipt ?: ethers . providers . TransactionReceipt ;
156- vaultTxReceipt ?: ethers . providers . TransactionReceipt ;
157- burnTxReceipt ?: ethers . providers . TransactionReceipt ;
79+ dexInfoTxReceipt ?: ethers . ContractTransactionReceipt ;
80+ masterDataTxReceipt ?: ethers . ContractTransactionReceipt ;
81+ vaultTxReceipt ?: ethers . ContractTransactionReceipt ;
15882}
0 commit comments