1
- // @ts -ignore
2
1
import { getWhaleClient } from '@waveshq/walletkit-bot' ;
3
- import { BigNumber } from 'bignumber.js' ;
4
2
import { ethers } from 'ethers' ;
5
3
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'
15
9
16
10
const 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 ;
23
12
24
13
export async function handler ( props : StateRelayerHandlerProps ) : Promise < DFCData | undefined > {
25
14
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 ) ;
27
16
const dataStore = { } as DataStore ;
28
- const burnedData = { } as BurnedInformation ;
29
- const dataVault = { } as VaultData ;
30
- const dataMasterNode = { } as MasterNodeData ;
31
17
try {
32
18
// TODO: Check if Function should run (blockHeight > 30 from previous)
33
19
// Get Data from OCEAN API
34
20
const client = getWhaleClient ( urlNetwork , envNetwork ) ;
35
21
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 ( '/' ) ) ;
41
22
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 ) ;
50
32
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 ) ;
79
34
80
35
// 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 ) ;
92
37
93
38
// 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 ) ;
102
40
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 ;
110
41
// Call SC Function to update Data
111
42
// Update Dex information
112
43
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 ( ) ,
117
48
) ;
118
49
119
50
// Update Master Node information
120
51
const masterDataTx = await stateRelayerContract . updateMasterNodeInformation ( dataMasterNode ) ;
121
52
// Update Vault general information
122
53
const vaultTx = await stateRelayerContract . updateVaultGeneralInformation ( dataVault ) ;
123
- // Update Burn information
124
- const burnTx = await stateRelayerContract . updateBurnInfo ( burnedData ) ;
125
54
if ( ! props . testGasCost ) {
126
55
return {
127
56
dataStore,
128
57
dataVault,
129
58
dataMasterNode,
130
- burnedData,
131
59
} ;
132
60
}
133
61
return {
134
62
dataStore,
135
63
dataVault,
136
64
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 ,
142
68
} ;
143
69
} catch ( e ) {
144
70
console . error ( ( e as Error ) . message ) ;
@@ -150,9 +76,7 @@ interface DFCData {
150
76
dataStore : DataStore ;
151
77
dataVault : VaultData ;
152
78
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 ;
158
82
}
0 commit comments