@@ -13,17 +13,47 @@ function getAssetPrice(asset: Asset, priceResult: PriceResponse): BNCoin {
1313 return BNCoin . fromDenomAndBigNumber ( asset . denom , price . shiftedBy ( decimalDiff ) )
1414}
1515
16+ function chunkArray < T > ( array : T [ ] , chunkSize : number ) : T [ ] [ ] {
17+ const chunks : T [ ] [ ] = [ ]
18+ for ( let i = 0 ; i < array . length ; i += chunkSize ) {
19+ chunks . push ( array . slice ( i , i + chunkSize ) )
20+ }
21+ return chunks
22+ }
23+
1624export default async function getOraclePrices (
1725 chainConfig : ChainConfig ,
1826 assets : Asset [ ] ,
1927) : Promise < BNCoin [ ] > {
20- const oracleQueryClient = chainConfig . isOsmosis
21- ? await getOracleQueryClientOsmosis ( chainConfig )
22- : await getOracleQueryClientNeutron ( chainConfig )
28+ if ( ! assets . length ) return [ ]
2329 try {
24- if ( ! assets . length ) return [ ]
30+ let priceResults : PriceResponse [ ] = [ ]
31+ if ( chainConfig . isOsmosis ) {
32+ const osmosisOracleQueryClient = await getOracleQueryClientOsmosis ( chainConfig )
33+ priceResults = await iterateContractQuery ( osmosisOracleQueryClient . prices )
34+ } else {
35+ const neutronOracleQueryClient = await getOracleQueryClientNeutron ( chainConfig )
36+ const denoms = assets . map ( ( asset ) => asset . denom )
37+
38+ const denomChunks = chunkArray ( denoms , 3 )
2539
26- const priceResults = await iterateContractQuery ( oracleQueryClient . prices )
40+ const chunkResults = await Promise . all (
41+ denomChunks . map ( async ( chunk ) => {
42+ return await neutronOracleQueryClient . pricesByDenoms ( { denoms : chunk , kind : 'default' } )
43+ } ) ,
44+ )
45+
46+ priceResults = chunkResults . reduce ( ( acc : PriceResponse [ ] , result ) => {
47+ if ( result && typeof result === 'object' ) {
48+ const priceEntries = Object . entries ( result ) . map ( ( [ denom , price ] ) => ( {
49+ denom,
50+ price : String ( price ) ,
51+ } ) ) as PriceResponse [ ]
52+ return [ ...acc , ...priceEntries ]
53+ }
54+ return acc
55+ } , [ ] )
56+ }
2757
2858 return assets . map ( ( asset ) => {
2959 const priceResponse = priceResults . find ( byDenom ( asset . denom ) ) as PriceResponse
@@ -32,9 +62,12 @@ export default async function getOraclePrices(
3262 } catch ( error ) {
3363 console . error ( error )
3464 try {
65+ const queryClient = chainConfig . isOsmosis
66+ ? await getOracleQueryClientOsmosis ( chainConfig )
67+ : await getOracleQueryClientNeutron ( chainConfig )
3568 return Promise . all (
3669 assets . map ( async ( asset ) => {
37- const priceResponse = await oracleQueryClient . price ( { denom : asset . denom } )
70+ const priceResponse = await queryClient . price ( { denom : asset . denom } )
3871 return getAssetPrice ( asset , priceResponse )
3972 } ) ,
4073 )
0 commit comments