Skip to content

Commit 0ca3c40

Browse files
authored
Merge pull request #1473 from mars-protocol/develop
getPrices
2 parents 17e9888 + b05e667 commit 0ca3c40

File tree

3 files changed

+276
-115
lines changed

3 files changed

+276
-115
lines changed

package.json

Lines changed: 4 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -22,10 +22,10 @@
2222
"dependencies": {
2323
"@cosmjs/cosmwasm-stargate": "^0.33.1",
2424
"@delphi-labs/shuttle-react": "^4.2.0",
25-
"@keplr-wallet/cosmos": "^0.12.223",
25+
"@keplr-wallet/cosmos": "^0.12.230",
2626
"@next/eslint-plugin-next": "^15.3.1",
2727
"@skip-go/client": "^0.16.30",
28-
"@solana/web3.js": "^1.98.1",
28+
"@solana/web3.js": "^1.98.2",
2929
"@tanstack/react-query": "^5.74.4",
3030
"@tanstack/react-table": "^8.21.3",
3131
"@tippyjs/react": "^4.2.6",
@@ -48,7 +48,7 @@
4848
"react-draggable": "^4.4.6",
4949
"react-helmet-async": "^2.0.5",
5050
"react-qr-code": "^2.0.15",
51-
"react-router-dom": "^7.5.1",
51+
"react-router-dom": "^7.5.3",
5252
"react-spring": "^9.7.5",
5353
"react-toastify": "^11.0.5",
5454
"react-use-clipboard": "^1.0.9",
@@ -57,7 +57,7 @@
5757
"starknet": "^6.24.1",
5858
"swr": "^2.3.3",
5959
"viem": "^2.28.0",
60-
"wagmi": "^2.14.16",
60+
"wagmi": "^2.15.2",
6161
"zustand": "5.0.3"
6262
},
6363
"devDependencies": {

src/api/prices/getOraclePrices.ts

Lines changed: 39 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -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+
1624
export 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

Comments
 (0)