Skip to content

Commit b31edef

Browse files
authored
Merge pull request #200 from Data-Nexus/bsc
BSC - Decimal Fix & Graph-ts Upgade
2 parents 595b512 + d4054b0 commit b31edef

10 files changed

+114
-113
lines changed

abis/ERC20.json

+1-1
Original file line numberDiff line numberDiff line change
@@ -84,7 +84,7 @@
8484
"outputs": [
8585
{
8686
"name": "",
87-
"type": "uint8"
87+
"type": "uint32"
8888
}
8989
],
9090
"payable": false,

package.json

+2-2
Original file line numberDiff line numberDiff line change
@@ -14,8 +14,8 @@
1414
"watch-local": "graph deploy ianlapham/uniswap-v3-bsc --watch --debug --node http://127.0.0.1:8020/ --ipfs http://localhost:5001"
1515
},
1616
"devDependencies": {
17-
"@graphprotocol/graph-cli": "^0.20.0",
18-
"@graphprotocol/graph-ts": "^0.20.0",
17+
"@graphprotocol/graph-cli": "^0.64.1",
18+
"@graphprotocol/graph-ts": "^0.32.0",
1919
"@typescript-eslint/eslint-plugin": "^2.0.0",
2020
"@typescript-eslint/parser": "^2.0.0",
2121
"eslint": "^6.2.2",

src/mappings/core.ts

+43-45
Original file line numberDiff line numberDiff line change
@@ -25,20 +25,19 @@ import { createTick, feeTierToTickSpacing } from '../utils/tick'
2525
export function handleInitialize(event: Initialize): void {
2626
// update pool sqrt price and tick
2727
let pool = Pool.load(event.address.toHexString())
28-
if (!pool) return
28+
if (!pool) return
2929

3030
pool.sqrtPrice = event.params.sqrtPriceX96
3131
pool.tick = BigInt.fromI32(event.params.tick)
3232
pool.save()
33-
33+
3434
// update token prices
3535
let token0 = Token.load(pool.token0)
3636
let token1 = Token.load(pool.token1)
3737

38-
3938
// update ETH price now that prices could have changed
4039
let bundle = Bundle.load('1')
41-
if (!token0 || !token1 || !bundle) return
40+
if (!token0 || !token1 || !bundle) return
4241

4342
bundle.ethPriceUSD = getEthPriceInUSD()
4443
bundle.save()
@@ -53,7 +52,6 @@ export function handleInitialize(event: Initialize): void {
5352
token1.save()
5453
}
5554

56-
5755
function updateTickFeeVarsAndSave(tick: Tick, event: ethereum.Event): void {
5856
let poolAddress = event.address
5957
// not all ticks are initialized so obtaining null is expected behavior
@@ -66,7 +64,6 @@ function updateTickFeeVarsAndSave(tick: Tick, event: ethereum.Event): void {
6664
updateTickDayData(tick, event)
6765
}
6866

69-
7067
export function handleMint(event: MintEvent): void {
7168
let bundle = Bundle.load('1')
7269
let poolAddress = event.address.toHexString()
@@ -76,7 +73,7 @@ export function handleMint(event: MintEvent): void {
7673

7774
let token0 = Token.load(pool.token0)
7875
let token1 = Token.load(pool.token1)
79-
if (!token0 || !token1) return
76+
if (!token0 || !token1) return
8077

8178
let amount0 = convertTokenToDecimal(event.params.amount0, token0.decimals)
8279
let amount1 = convertTokenToDecimal(event.params.amount1, token1.decimals)
@@ -185,8 +182,8 @@ export function handleMint(event: MintEvent): void {
185182
mint.save()
186183

187184
// Update inner tick vars and save the ticks
188-
updateTickFeeVarsAndSave(lowerTick!, event)
189-
updateTickFeeVarsAndSave(upperTick!, event)
185+
updateTickFeeVarsAndSave(lowerTick, event)
186+
updateTickFeeVarsAndSave(upperTick, event)
190187
}
191188

192189
export function handleBurn(event: BurnEvent): void {
@@ -199,7 +196,7 @@ export function handleBurn(event: BurnEvent): void {
199196
let token0 = Token.load(pool.token0)
200197
let token1 = Token.load(pool.token1)
201198

202-
if (!token0 || !token1) return
199+
if (!token0 || !token1) return
203200

204201
let amount0 = convertTokenToDecimal(event.params.amount0, token0.decimals)
205202
let amount1 = convertTokenToDecimal(event.params.amount1, token1.decimals)
@@ -270,7 +267,7 @@ export function handleBurn(event: BurnEvent): void {
270267
let upperTickId = poolAddress + '#' + BigInt.fromI32(event.params.tickUpper).toString()
271268
let lowerTick = Tick.load(lowerTickId)
272269
let upperTick = Tick.load(upperTickId)
273-
if (!lowerTick || !upperTick) return
270+
if (!lowerTick || !upperTick) return
274271

275272
let amount = event.params.amount
276273
lowerTick.liquidityGross = lowerTick.liquidityGross.minus(amount)
@@ -285,8 +282,8 @@ export function handleBurn(event: BurnEvent): void {
285282
updateTokenDayData(token1 as Token, event)
286283
updateTokenHourData(token0 as Token, event)
287284
updateTokenHourData(token1 as Token, event)
288-
updateTickFeeVarsAndSave(lowerTick!, event)
289-
updateTickFeeVarsAndSave(upperTick!, event)
285+
updateTickFeeVarsAndSave(lowerTick, event)
286+
updateTickFeeVarsAndSave(upperTick, event)
290287

291288
token0.save()
292289
token1.save()
@@ -304,16 +301,15 @@ function loadTickUpdateFeeVarsAndSave(tickId: i32, event: ethereum.Event): void
304301
.concat(tickId.toString())
305302
)
306303
if (tick !== null) {
307-
updateTickFeeVarsAndSave(tick!, event)
304+
updateTickFeeVarsAndSave(tick, event)
308305
}
309306
}
310307

311-
312308
export function handleSwap(event: SwapEvent): void {
313309
let bundle = Bundle.load('1')
314310
let factory = Factory.load(FACTORY_ADDRESS)
315311
let pool = Pool.load(event.address.toHexString())
316-
if (!factory || !pool || !bundle) return
312+
if (!factory || !pool || !bundle) return
317313

318314
// hot fix for bad pricing
319315
if (pool.id == '0x9663f2ca0454accad3e094448ea6f77443880454') {
@@ -322,7 +318,7 @@ export function handleSwap(event: SwapEvent): void {
322318

323319
let token0 = Token.load(pool.token0)
324320
let token1 = Token.load(pool.token1)
325-
if (!token0 || !token1) return
321+
if (!token0 || !token1) return
326322

327323
let oldTick = pool.tick
328324

@@ -509,42 +505,44 @@ export function handleSwap(event: SwapEvent): void {
509505
// Update inner vars of current or crossed ticks
510506
let newTick = pool.tick
511507
let tickSpacing = feeTierToTickSpacing(pool.feeTier)
512-
let modulo = newTick.mod(tickSpacing)
513-
if (modulo.equals(ZERO_BI)) {
514-
// Current tick is initialized and needs to be updated
515-
loadTickUpdateFeeVarsAndSave(newTick.toI32(), event)
516-
}
517-
518-
if (!oldTick) return
519-
520-
let numIters = oldTick
521-
.minus(newTick!)
522-
.abs()
523-
.div(tickSpacing)
524-
525-
if (numIters.gt(BigInt.fromI32(100))) {
526-
// In case more than 100 ticks need to be updated ignore the update in
527-
// order to avoid timeouts. From testing this behavior occurs only upon
528-
// pool initialization. This should not be a big issue as the ticks get
529-
// updated later. For early users this error also disappears when calling
530-
// collect
531-
} else if (newTick.gt(oldTick!)) {
532-
let firstInitialized = oldTick.plus(tickSpacing.minus(modulo))
533-
for (let i = firstInitialized; i.le(newTick!); i = i.plus(tickSpacing)) {
534-
loadTickUpdateFeeVarsAndSave(i.toI32(), event)
508+
if (newTick) {
509+
let modulo = newTick.mod(tickSpacing)
510+
if (modulo.equals(ZERO_BI)) {
511+
// Current tick is initialized and needs to be updated
512+
loadTickUpdateFeeVarsAndSave(newTick.toI32(), event)
535513
}
536-
} else if (newTick.lt(oldTick!)) {
537-
let firstInitialized = oldTick.minus(modulo)
538-
for (let i = firstInitialized; i.ge(newTick!); i = i.minus(tickSpacing)) {
539-
loadTickUpdateFeeVarsAndSave(i.toI32(), event)
514+
515+
if (oldTick) {
516+
let numIters = oldTick
517+
.minus(newTick)
518+
.abs()
519+
.div(tickSpacing)
520+
521+
if (numIters.gt(BigInt.fromI32(100))) {
522+
// In case more than 100 ticks need to be updated ignore the update in
523+
// order to avoid timeouts. From testing this behavior occurs only upon
524+
// pool initialization. This should not be a big issue as the ticks get
525+
// updated later. For early users this error also disappears when calling
526+
// collect
527+
} else if (newTick.gt(oldTick)) {
528+
let firstInitialized = oldTick.plus(tickSpacing.minus(modulo))
529+
for (let i = firstInitialized; i.le(newTick); i = i.plus(tickSpacing)) {
530+
loadTickUpdateFeeVarsAndSave(i.toI32(), event)
531+
}
532+
} else if (newTick.lt(oldTick)) {
533+
let firstInitialized = oldTick.minus(modulo)
534+
for (let i = firstInitialized; i.ge(newTick); i = i.minus(tickSpacing)) {
535+
loadTickUpdateFeeVarsAndSave(i.toI32(), event)
536+
}
537+
}
540538
}
541539
}
542540
}
543541

544542
export function handleFlash(event: FlashEvent): void {
545543
// update fee growth
546544
let pool = Pool.load(event.address.toHexString())
547-
if (!pool) return
545+
if (!pool) return
548546

549547
let poolContract = PoolABI.bind(event.address)
550548
let feeGrowthGlobal0X128 = poolContract.feeGrowthGlobal0X128()

src/mappings/position-manager.ts

+27-17
Original file line numberDiff line numberDiff line change
@@ -100,18 +100,20 @@ export function handleIncreaseLiquidity(event: IncreaseLiquidity): void {
100100
let token0 = Token.load(position.token0)
101101
let token1 = Token.load(position.token1)
102102

103-
let amount0 = convertTokenToDecimal(event.params.amount0, token0.decimals)
104-
let amount1 = convertTokenToDecimal(event.params.amount1, token1.decimals)
103+
if (token0 && token1) {
104+
let amount0 = convertTokenToDecimal(event.params.amount0, token0.decimals)
105+
let amount1 = convertTokenToDecimal(event.params.amount1, token1.decimals)
105106

106-
position.liquidity = position.liquidity.plus(event.params.liquidity)
107-
position.depositedToken0 = position.depositedToken0.plus(amount0)
108-
position.depositedToken1 = position.depositedToken1.plus(amount1)
107+
position.liquidity = position.liquidity.plus(event.params.liquidity)
108+
position.depositedToken0 = position.depositedToken0.plus(amount0)
109+
position.depositedToken1 = position.depositedToken1.plus(amount1)
110+
}
109111

110-
updateFeeVars(position!, event, event.params.tokenId)
112+
updateFeeVars(position, event, event.params.tokenId)
111113

112114
position.save()
113115

114-
savePositionSnapshot(position!, event)
116+
savePositionSnapshot(position, event)
115117
}
116118

117119
export function handleDecreaseLiquidity(event: DecreaseLiquidity): void {
@@ -134,16 +136,19 @@ export function handleDecreaseLiquidity(event: DecreaseLiquidity): void {
134136

135137
let token0 = Token.load(position.token0)
136138
let token1 = Token.load(position.token1)
137-
let amount0 = convertTokenToDecimal(event.params.amount0, token0.decimals)
138-
let amount1 = convertTokenToDecimal(event.params.amount1, token1.decimals)
139139

140-
position.liquidity = position.liquidity.minus(event.params.liquidity)
141-
position.withdrawnToken0 = position.withdrawnToken0.plus(amount0)
142-
position.withdrawnToken1 = position.withdrawnToken1.plus(amount1)
140+
if (token0 && token1) {
141+
let amount0 = convertTokenToDecimal(event.params.amount0, token0.decimals)
142+
let amount1 = convertTokenToDecimal(event.params.amount1, token1.decimals)
143143

144-
position = updateFeeVars(position!, event, event.params.tokenId)
144+
position.liquidity = position.liquidity.minus(event.params.liquidity)
145+
position.withdrawnToken0 = position.withdrawnToken0.plus(amount0)
146+
position.withdrawnToken1 = position.withdrawnToken1.plus(amount1)
147+
}
148+
149+
position = updateFeeVars(position, event, event.params.tokenId)
145150
position.save()
146-
savePositionSnapshot(position!, event)
151+
savePositionSnapshot(position, event)
147152
}
148153

149154
export function handleCollect(event: Collect): void {
@@ -157,9 +162,14 @@ export function handleCollect(event: Collect): void {
157162
}
158163

159164
let token0 = Token.load(position.token0)
160-
let amount0 = convertTokenToDecimal(event.params.amount0, token0.decimals)
161-
position.collectedFeesToken0 = position.collectedFeesToken0.plus(amount0)
162-
position.collectedFeesToken1 = position.collectedFeesToken1.plus(amount0)
165+
let token1 = Token.load(position.token1)
166+
167+
if (token0 && token1) {
168+
let amount0 = convertTokenToDecimal(event.params.amount0, token0.decimals)
169+
let amount1 = convertTokenToDecimal(event.params.amount0, token1.decimals)
170+
position.collectedFeesToken0 = position.collectedFeesToken0.plus(amount0)
171+
position.collectedFeesToken1 = position.collectedFeesToken1.plus(amount1)
172+
}
163173

164174
position = updateFeeVars(position!, event, event.params.tokenId)
165175
position.save()

src/utils/index.ts

+1-1
Original file line numberDiff line numberDiff line change
@@ -87,7 +87,7 @@ export function loadTransaction(event: ethereum.Event): Transaction {
8787
}
8888
transaction.blockNumber = event.block.number
8989
transaction.timestamp = event.block.timestamp
90-
transaction.gasUsed = event.transaction.gasUsed
90+
transaction.gasUsed = BigInt.zero() //needs to be moved to transaction receipt
9191
transaction.gasPrice = event.transaction.gasPrice
9292
transaction.save()
9393
return transaction as Transaction

src/utils/intervalUpdates.ts

+5-5
Original file line numberDiff line numberDiff line change
@@ -21,7 +21,7 @@ import { ethereum } from '@graphprotocol/graph-ts'
2121
* @param event
2222
*/
2323
export function updateUniswapDayData(event: ethereum.Event): UniswapDayData {
24-
let uniswap = Factory.load(FACTORY_ADDRESS)
24+
let uniswap = Factory.load(FACTORY_ADDRESS)!
2525
let timestamp = event.block.timestamp.toI32()
2626
let dayID = timestamp / 86400 // rounded
2727
let dayStartTimestamp = dayID * 86400
@@ -48,7 +48,7 @@ export function updatePoolDayData(event: ethereum.Event): PoolDayData {
4848
.toHexString()
4949
.concat('-')
5050
.concat(dayID.toString())
51-
let pool = Pool.load(event.address.toHexString())
51+
let pool = Pool.load(event.address.toHexString())!
5252
let poolDayData = PoolDayData.load(dayPoolID)
5353
if (poolDayData === null) {
5454
poolDayData = new PoolDayData(dayPoolID)
@@ -97,7 +97,7 @@ export function updatePoolHourData(event: ethereum.Event): PoolHourData {
9797
.toHexString()
9898
.concat('-')
9999
.concat(hourIndex.toString())
100-
let pool = Pool.load(event.address.toHexString())
100+
let pool = Pool.load(event.address.toHexString())!
101101
let poolHourData = PoolHourData.load(hourPoolID)
102102
if (poolHourData === null) {
103103
poolHourData = new PoolHourData(hourPoolID)
@@ -141,7 +141,7 @@ export function updatePoolHourData(event: ethereum.Event): PoolHourData {
141141
}
142142

143143
export function updateTokenDayData(token: Token, event: ethereum.Event): TokenDayData {
144-
let bundle = Bundle.load('1')
144+
let bundle = Bundle.load('1')!
145145
let timestamp = event.block.timestamp.toI32()
146146
let dayID = timestamp / 86400
147147
let dayStartTimestamp = dayID * 86400
@@ -184,7 +184,7 @@ export function updateTokenDayData(token: Token, event: ethereum.Event): TokenDa
184184
}
185185

186186
export function updateTokenHourData(token: Token, event: ethereum.Event): TokenHourData {
187-
let bundle = Bundle.load('1')
187+
let bundle = Bundle.load('1')!
188188
let timestamp = event.block.timestamp.toI32()
189189
let hourIndex = timestamp / 3600 // get unique hour within unix history
190190
let hourStartUnix = hourIndex * 3600 // want the rounded effect

src/utils/pricing.ts

+8-10
Original file line numberDiff line numberDiff line change
@@ -5,22 +5,20 @@ import { BigDecimal, BigInt } from '@graphprotocol/graph-ts'
55
import { exponentToBigDecimal, safeDiv } from '../utils/index'
66

77
const WBNB_ADDRESS = '0xbb4cdb9cbd36b01bd1cbaebf2de08d9173bc095c'
8-
const USDC_WBNB_03_POOL = '0x6bcb0Ba386E9de0C29006e46B2f01f047cA1806E'
8+
const USDC_WBNB_03_POOL = '0x6fe9e9de56356f7edbfcbb29fab7cd69471a4869'
99

1010
// token where amounts should contribute to tracked volume and liquidity
1111
// usually tokens that many tokens are paired with s
12-
export let WHITELIST_TOKENS: string[] = [
13-
WBNB_ADDRESS,
14-
]
12+
export let WHITELIST_TOKENS: string[] = [WBNB_ADDRESS]
1513

1614
let STABLE_COINS: string[] = [
1715
'0x55d398326f99059ff775485246999027b3197955', // USDT
18-
'0x8ac76a51cc950d9822d68b83fe1ad97b32cd580d', // USDC
16+
'0x8ac76a51cc950d9822d68b83fe1ad97b32cd580d' // USDC
1917
]
2018

21-
let MINIMUM_ETH_LOCKED = BigDecimal.fromString('0')
19+
let MINIMUM_ETH_LOCKED = BigDecimal.fromString('300')
2220

23-
let Q192 = 2 ** 192
21+
let Q192 = BigInt.fromI32(2).pow(192 as u8)
2422
export function sqrtPriceX96ToTokenPrices(sqrtPriceX96: BigInt, token0: Token, token1: Token): BigDecimal[] {
2523
let num = sqrtPriceX96.times(sqrtPriceX96).toBigDecimal()
2624
let denom = BigDecimal.fromString(Q192.toString())
@@ -74,15 +72,15 @@ export function findBnbPerToken(token: Token): BigDecimal {
7472
if (!pool) {
7573
return ZERO_BD
7674
}
77-
75+
7876
if (pool.liquidity.gt(ZERO_BI)) {
7977
if (pool.token0 == token.id) {
8078
// whitelist token is token1
8179
let token1 = Token.load(pool.token1)
8280
if (!token1) {
8381
return ZERO_BD
8482
}
85-
83+
8684
// get the derived ETH in pool
8785
let ethLocked = pool.totalValueLockedToken1.times(token1.derivedETH)
8886
if (ethLocked.gt(largestLiquidityETH) && ethLocked.gt(MINIMUM_ETH_LOCKED)) {
@@ -96,7 +94,7 @@ export function findBnbPerToken(token: Token): BigDecimal {
9694
if (!token0) {
9795
return ZERO_BD
9896
}
99-
97+
10098
// get the derived ETH in pool
10199
let ethLocked = pool.totalValueLockedToken0.times(token0.derivedETH)
102100
if (ethLocked.gt(largestLiquidityETH) && ethLocked.gt(MINIMUM_ETH_LOCKED)) {

0 commit comments

Comments
 (0)