@swaptoshi/dex-module
Version:
Klayr decentralized exchange (dex) on-chain module
65 lines • 3.53 kB
JavaScript
;
Object.defineProperty(exports, "__esModule", { value: true });
exports.countInitializedTicksCrossed = countInitializedTicksCrossed;
exports.countOneBits = countOneBits;
const int_1 = require("../int");
async function countInitializedTicksCrossed(tickBitmapStore, context, self, tickBefore, tickAfter) {
let initializedTicksCrossed = int_1.Uint32.from(0);
let wordPosLower = int_1.Int16.from(0);
let wordPosHigher = int_1.Int16.from(0);
let bitPosLower = int_1.Uint8.from(0);
let bitPosHigher = int_1.Uint8.from(0);
let tickBeforeInitialized = false;
let tickAfterInitialized = false;
const wordPos = int_1.Int16.from(0).add(int_1.Int24.from(tickBefore).div(self.tickSpacing).shr(8));
const bitPos = int_1.Uint8.from(0).add(int_1.Int24.from(tickBefore).div(self.tickSpacing).mod(256));
const wordPosAfter = int_1.Int16.from(0).add(int_1.Int24.from(tickAfter).div(self.tickSpacing).shr(8));
const bitPosAfter = int_1.Uint8.from(int_1.Int24.from(tickAfter).div(self.tickSpacing).mod(256));
tickAfterInitialized =
int_1.Uint256.from(int_1.Uint256.from((await tickBitmapStore.getOrDefault(context, tickBitmapStore.getKey(self.address, wordPosAfter.toString()))).bitmap).and(int_1.Uint256.from(1).shl(bitPosAfter))).gt(0) &&
int_1.Uint256.from(int_1.Int24.from(tickAfter).mod(self.tickSpacing)).eq(0) &&
int_1.Int24.from(tickBefore).gt(tickAfter);
tickBeforeInitialized =
int_1.Uint256.from(int_1.Uint256.from((await tickBitmapStore.getOrDefault(context, tickBitmapStore.getKey(self.address, wordPos.toString()))).bitmap).and(int_1.Uint256.from(1).shl(bitPos))).gt(0) &&
int_1.Uint256.from(int_1.Int24.from(tickBefore).mod(self.tickSpacing)).eq(0) &&
int_1.Int24.from(tickBefore).lt(tickAfter);
if (wordPos.lt(wordPosAfter) || (wordPos.eq(wordPosAfter) && bitPos.lte(bitPosAfter))) {
wordPosLower = int_1.Int16.from(wordPos);
bitPosLower = int_1.Uint8.from(bitPos);
wordPosHigher = int_1.Int16.from(wordPosAfter);
bitPosHigher = int_1.Uint8.from(bitPosAfter);
}
else {
wordPosLower = int_1.Int16.from(wordPosAfter);
bitPosLower = int_1.Uint8.from(bitPosAfter);
wordPosHigher = int_1.Int16.from(wordPos);
bitPosHigher = int_1.Uint8.from(bitPos);
}
let mask = int_1.Uint256.from(int_1.Uint256.MAX).shl(bitPosLower);
while (wordPosLower.lte(wordPosHigher)) {
if (wordPosLower.eq(wordPosHigher)) {
mask = mask.and(int_1.Uint256.from(int_1.Uint256.MAX).shr(int_1.Uint8.from(255).sub(bitPosHigher)));
}
const masked = int_1.Uint256.from((await tickBitmapStore.getOrDefault(context, tickBitmapStore.getKey(self.address, wordPosLower.toString()))).bitmap).and(mask);
initializedTicksCrossed = initializedTicksCrossed.add(countOneBits(masked.toString()));
wordPosLower = wordPosLower.add(1);
mask = int_1.Uint256.from(int_1.Uint256.MAX);
}
if (tickAfterInitialized) {
initializedTicksCrossed = initializedTicksCrossed.sub(1);
}
if (tickBeforeInitialized) {
initializedTicksCrossed = initializedTicksCrossed.sub(1);
}
return initializedTicksCrossed.toString();
}
function countOneBits(_x) {
let x = int_1.Uint256.from(_x);
let bits = int_1.Uint16.from(0);
while (!x.eq(0)) {
bits = bits.add(1);
x = x.and(x.sub(1));
}
return bits.toString();
}
//# sourceMappingURL=pool_ticks_counter.js.map