UNPKG

@swaptoshi/dex-module

Version:

Klayr decentralized exchange (dex) on-chain module

58 lines 3.02 kB
"use strict"; Object.defineProperty(exports, "__esModule", { value: true }); exports.position = position; exports.flipTick = flipTick; exports.nextInitializedTickWithinOneWord = nextInitializedTickWithinOneWord; const int_1 = require("../int"); const BitMath = require("./bit_math"); function position(tick) { const wordPos = int_1.Int16.from(int_1.Int24.from(tick).shr(8)).toString(); const bitPos = int_1.Uint8.from(int_1.Int24.from(tick).mod(256)).toString(); return [wordPos, bitPos]; } async function flipTick(tickBitmapStore, context, poolAddress, tick, tickSpacing, simulation = false) { if (!int_1.Int24.from(tick).mod(tickSpacing).eq(0)) throw new Error('invalid tickSpacing'); const [wordPos, bitPos] = position(int_1.Int24.from(tick).div(tickSpacing).toString()); const mask = int_1.Uint256.from(1).shl(bitPos); const tickData = await tickBitmapStore.getOrDefault(context, tickBitmapStore.getKey(poolAddress, wordPos)); if (!simulation) { await tickBitmapStore.set(context, tickBitmapStore.getKey(poolAddress, wordPos), { bitmap: int_1.Uint256.from(tickData.bitmap).xor(mask).toString(), }); } } async function nextInitializedTickWithinOneWord(tickBitmapStore, context, poolAddress, tick, tickSpacing, lte) { let next; let initialized; let compressed = int_1.Int24.from(tick).div(tickSpacing); if (int_1.Int24.from(tick).lt(0) && !int_1.Int24.from(tick).mod(tickSpacing).eq(0)) compressed = compressed.sub(1); if (lte) { const [wordPos, bitPos] = position(compressed.toString()); const mask = int_1.Uint256.from(1).shl(bitPos).sub(1).add(int_1.Uint256.from(1).shl(bitPos)); const tickData = await tickBitmapStore.getOrDefault(context, tickBitmapStore.getKey(poolAddress, wordPos)); const masked = int_1.Uint256.from(tickData.bitmap).and(mask); initialized = !masked.eq(0); next = initialized ? int_1.Int24.from(compressed) .sub(int_1.Int24.from(bitPos).sub(BitMath.mostSignificantBit(masked.toString()))) .mul(tickSpacing) : int_1.Int24.from(compressed).sub(bitPos).mul(tickSpacing); } else { const [wordPos, bitPos] = position(compressed.add(1).toString()); const mask = int_1.Uint256.from(1).shl(bitPos).sub(1).not(); const tickData = await tickBitmapStore.getOrDefault(context, tickBitmapStore.getKey(poolAddress, wordPos)); const masked = int_1.Uint256.from(tickData.bitmap).and(mask); initialized = !masked.eq(0); next = initialized ? int_1.Int24.from(compressed) .add(1) .add(int_1.Int24.from(BitMath.leastSignificantBit(masked.toString())).sub(bitPos)) .mul(tickSpacing) : int_1.Int24.from(compressed).add(1).add(int_1.Int24.from(int_1.Uint8.MAX).sub(bitPos)).mul(tickSpacing); } return [next.toString(), initialized]; } //# sourceMappingURL=tick_bitmap.js.map