Skip to content

Commit 56cc48e

Browse files
authored
Cast oracle price to bigint and then numeric to get proper values (#2689)
Signed-off-by: Shrenuj Bansal <shrenuj@dydx.exchange>
1 parent c0d7369 commit 56cc48e

File tree

4 files changed

+46
-3
lines changed

4 files changed

+46
-3
lines changed

indexer/packages/postgres/__tests__/helpers/constants.ts

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -746,7 +746,7 @@ export const isolatedMarket: MarketCreateObject = {
746746
export const isolatedMarket2: MarketCreateObject = {
747747
id: 4,
748748
pair: 'ISO2-USD',
749-
exponent: -12,
749+
exponent: -20,
750750
minPriceChangePpm: 50,
751751
oraclePrice: '0.000000085',
752752
};

indexer/services/ender/__tests__/handlers/markets/market-price-update-handler.test.ts

Lines changed: 34 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -15,6 +15,7 @@ import { DydxIndexerSubtypes, MarketPriceUpdateEventMessage } from '../../../src
1515
import {
1616
defaultHeight,
1717
defaultMarketPriceUpdate,
18+
defaultMarketPriceUpdate3,
1819
defaultPreviousHeight,
1920
defaultTime,
2021
defaultTxHash,
@@ -154,6 +155,39 @@ describe('marketPriceUpdateHandler', () => {
154155
});
155156
});
156157

158+
it('successfully inserts new oracle price for market with very low exponent', async () => {
159+
const transactionIndex: number = 0;
160+
161+
const kafkaMessage: KafkaMessage = createKafkaMessageFromMarketEvent({
162+
marketEvents: [defaultMarketPriceUpdate3],
163+
transactionIndex,
164+
height: defaultHeight,
165+
time: defaultTime,
166+
txHash: defaultTxHash,
167+
});
168+
169+
await onMessage(kafkaMessage);
170+
171+
const { market, oraclePrice } = await getDbState(defaultMarketPriceUpdate3);
172+
173+
expectOraclePriceMatchesEvent(
174+
defaultMarketPriceUpdate3 as MarketPriceUpdateEventMessage,
175+
oraclePrice,
176+
market,
177+
defaultHeight,
178+
);
179+
180+
const contents: MarketMessageContents = generateOraclePriceContents(
181+
oraclePrice,
182+
market.pair,
183+
);
184+
185+
expectMarketKafkaMessage({
186+
producerSendMock,
187+
contents: JSON.stringify(contents),
188+
});
189+
});
190+
157191
it('successfully inserts new oracle price for market created in same block', async () => {
158192
const transactionIndex: number = 0;
159193
const newMarketId: number = 3000;

indexer/services/ender/__tests__/helpers/constants.ts

Lines changed: 7 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -67,6 +67,13 @@ export const defaultMarketPriceUpdate2: MarketEventV1 = {
6767
},
6868
};
6969

70+
export const defaultMarketPriceUpdate3: MarketEventV1 = {
71+
marketId: 4,
72+
priceUpdate: {
73+
priceWithExponent: Long.fromValue(100000000, true),
74+
},
75+
};
76+
7077
export const defaultFundingUpdateSampleEvent: FundingEventMessage = {
7178
type: FundingEventV1_Type.TYPE_PREMIUM_SAMPLE,
7279
updates: [

indexer/services/ender/src/scripts/handlers/dydx_market_price_update_handler.sql

Lines changed: 4 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -11,6 +11,8 @@ CREATE OR REPLACE FUNCTION dydx_market_price_update_handler(block_height int, bl
1111
1212
(Note that no text should exist before the function declaration to ensure that exception line numbers are correct.)
1313
*/
14+
15+
1416
DECLARE
1517
market_record_id integer;
1618
market_record markets%ROWTYPE;
@@ -25,8 +27,8 @@ BEGIN
2527
END IF;
2628

2729
oracle_price = dydx_trim_scale(
28-
dydx_from_jsonlib_long(event_data->'priceUpdate'->'priceWithExponent') *
29-
power(10, market_record.exponent::numeric));
30+
(dydx_from_jsonlib_long(event_data->'priceUpdate'->'priceWithExponent') *
31+
power(10, market_record.exponent::bigint))::numeric);
3032

3133
market_record."oraclePrice" = oracle_price;
3234

0 commit comments

Comments
 (0)