@swaptoshi/dex-module
Version:
Klayr decentralized exchange (dex) on-chain module
58 lines • 3.02 kB
JavaScript
;
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