Skip to content

Commit 6b0f6e6

Browse files
committed
Add layer enum for tick index bitmap
1 parent aa88536 commit 6b0f6e6

File tree

2 files changed

+57
-41
lines changed

2 files changed

+57
-41
lines changed

pallets/swap/src/lib.rs

Lines changed: 33 additions & 25 deletions
Original file line numberDiff line numberDiff line change
@@ -9,7 +9,7 @@ use safe_math::*;
99
use sp_arithmetic::helpers_128bit::sqrt;
1010
use substrate_fixed::types::U64F64;
1111

12-
use self::tick::{Tick, TickIndex, TickIndexBitmap};
12+
use self::tick::{Layer, Tick, TickIndex, TickIndexBitmap};
1313

1414
pub mod pallet;
1515
mod tick;
@@ -1127,22 +1127,26 @@ where
11271127
let bitmap = TickIndexBitmap::from(index);
11281128

11291129
// Update layer words
1130-
let mut word0_value = self.state_ops.get_layer0_word(bitmap.word_at(0));
1131-
let mut word1_value = self.state_ops.get_layer1_word(bitmap.word_at(1));
1132-
let mut word2_value = self.state_ops.get_layer2_word(bitmap.word_at(2));
1130+
let mut word0_value = self.state_ops.get_layer0_word(bitmap.word_at(Layer::Top));
1131+
let mut word1_value = self
1132+
.state_ops
1133+
.get_layer1_word(bitmap.word_at(Layer::Middle));
1134+
let mut word2_value = self
1135+
.state_ops
1136+
.get_layer2_word(bitmap.word_at(Layer::Bottom));
11331137

11341138
// Set bits in each layer
1135-
word0_value |= bitmap.bit_mask(0);
1136-
word1_value |= bitmap.bit_mask(1);
1137-
word2_value |= bitmap.bit_mask(2);
1139+
word0_value |= bitmap.bit_mask(Layer::Top);
1140+
word1_value |= bitmap.bit_mask(Layer::Middle);
1141+
word2_value |= bitmap.bit_mask(Layer::Bottom);
11381142

11391143
// Update the storage
11401144
self.state_ops
1141-
.set_layer0_word(bitmap.word_at(0), word0_value);
1145+
.set_layer0_word(bitmap.word_at(Layer::Top), word0_value);
11421146
self.state_ops
1143-
.set_layer1_word(bitmap.word_at(1), word1_value);
1147+
.set_layer1_word(bitmap.word_at(Layer::Middle), word1_value);
11441148
self.state_ops
1145-
.set_layer2_word(bitmap.word_at(2), word2_value);
1149+
.set_layer2_word(bitmap.word_at(Layer::Bottom), word2_value);
11461150
}
11471151

11481152
pub fn remove_active_tick(&mut self, index: TickIndex) {
@@ -1155,25 +1159,29 @@ where
11551159
let bitmap = TickIndexBitmap::from(index);
11561160

11571161
// Update layer words
1158-
let mut word0_value = self.state_ops.get_layer0_word(bitmap.word_at(0));
1159-
let mut word1_value = self.state_ops.get_layer1_word(bitmap.word_at(1));
1160-
let mut word2_value = self.state_ops.get_layer2_word(bitmap.word_at(2));
1162+
let mut word0_value = self.state_ops.get_layer0_word(bitmap.word_at(Layer::Top));
1163+
let mut word1_value = self
1164+
.state_ops
1165+
.get_layer1_word(bitmap.word_at(Layer::Middle));
1166+
let mut word2_value = self
1167+
.state_ops
1168+
.get_layer2_word(bitmap.word_at(Layer::Bottom));
11611169

11621170
// Turn the bit off (& !bit) and save as needed
1163-
word2_value &= !bitmap.bit_mask(2);
1171+
word2_value &= !bitmap.bit_mask(Layer::Bottom);
11641172
self.state_ops
1165-
.set_layer2_word(bitmap.word_at(2), word2_value);
1173+
.set_layer2_word(bitmap.word_at(Layer::Bottom), word2_value);
11661174

11671175
if word2_value == 0 {
1168-
word1_value &= !bitmap.bit_mask(1);
1176+
word1_value &= !bitmap.bit_mask(Layer::Middle);
11691177
self.state_ops
1170-
.set_layer1_word(bitmap.word_at(1), word1_value);
1178+
.set_layer1_word(bitmap.word_at(Layer::Middle), word1_value);
11711179
}
11721180

11731181
if word1_value == 0 {
1174-
word0_value &= !bitmap.bit_mask(0);
1182+
word0_value &= !bitmap.bit_mask(Layer::Top);
11751183
self.state_ops
1176-
.set_layer0_word(bitmap.word_at(0), word0_value);
1184+
.set_layer0_word(bitmap.word_at(Layer::Top), word0_value);
11771185
}
11781186
}
11791187

@@ -1193,12 +1201,12 @@ where
11931201
let mut result: u32 = 0;
11941202

11951203
// Layer positions from bitmap
1196-
let layer0_word = bitmap.word_at(0);
1197-
let layer0_bit = bitmap.bit_at(0);
1198-
let layer1_word = bitmap.word_at(1);
1199-
let layer1_bit = bitmap.bit_at(1);
1200-
let layer2_word = bitmap.word_at(2);
1201-
let layer2_bit = bitmap.bit_at(2);
1204+
let layer0_word = bitmap.word_at(Layer::Top);
1205+
let layer0_bit = bitmap.bit_at(Layer::Top);
1206+
let layer1_word = bitmap.word_at(Layer::Middle);
1207+
let layer1_bit = bitmap.bit_at(Layer::Middle);
1208+
let layer2_word = bitmap.word_at(Layer::Bottom);
1209+
let layer2_bit = bitmap.bit_at(Layer::Bottom);
12021210

12031211
// Find the closest active bits in layer 0, then 1, then 2
12041212

pallets/swap/src/tick.rs

Lines changed: 24 additions & 16 deletions
Original file line numberDiff line numberDiff line change
@@ -10,7 +10,7 @@ use frame_support::pallet_prelude::*;
1010
use safe_math::*;
1111
use substrate_fixed::types::U64F64;
1212

13-
use crate::{SqrtPrice, SwapDataOperations};
13+
use crate::SqrtPrice;
1414

1515
const U256_1: U256 = U256::from_limbs([1, 0, 0, 0]);
1616
const U256_2: U256 = U256::from_limbs([2, 0, 0, 0]);
@@ -375,6 +375,17 @@ impl TickIndex {
375375
}
376376
}
377377

378+
/// Represents the three layers in the Uniswap V3 bitmap structure
379+
#[derive(Debug, Clone, Copy, PartialEq, Eq)]
380+
pub enum Layer {
381+
/// Top layer (highest level of the hierarchy)
382+
Top = 0,
383+
/// Middle layer
384+
Middle = 1,
385+
/// Bottom layer (contains the actual ticks)
386+
Bottom = 2,
387+
}
388+
378389
/// A bitmap representation of a tick index position across the three-layer structure
379390
#[derive(Debug, Clone, Copy, PartialEq, Eq)]
380391
pub struct TickIndexBitmap {
@@ -405,32 +416,29 @@ impl TickIndexBitmap {
405416
}
406417

407418
/// Get the mask for a bit in the specified layer
408-
pub fn bit_mask(&self, layer: u8) -> u128 {
419+
pub fn bit_mask(&self, layer: Layer) -> u128 {
409420
match layer {
410-
0 => 1u128 << self.layer0.1,
411-
1 => 1u128 << self.layer1.1,
412-
2 => 1u128 << self.layer2.1,
413-
_ => panic!("Invalid layer: must be 0, 1, or 2"),
421+
Layer::Top => 1u128 << self.layer0.1,
422+
Layer::Middle => 1u128 << self.layer1.1,
423+
Layer::Bottom => 1u128 << self.layer2.1,
414424
}
415425
}
416426

417427
/// Get the word for the specified layer
418-
pub fn word_at(&self, layer: u8) -> u32 {
428+
pub fn word_at(&self, layer: Layer) -> u32 {
419429
match layer {
420-
0 => self.layer0.0,
421-
1 => self.layer1.0,
422-
2 => self.layer2.0,
423-
_ => panic!("Invalid layer: must be 0, 1, or 2"),
430+
Layer::Top => self.layer0.0,
431+
Layer::Middle => self.layer1.0,
432+
Layer::Bottom => self.layer2.0,
424433
}
425434
}
426435

427436
/// Get the bit for the specified layer
428-
pub fn bit_at(&self, layer: u8) -> u32 {
437+
pub fn bit_at(&self, layer: Layer) -> u32 {
429438
match layer {
430-
0 => self.layer0.1,
431-
1 => self.layer1.1,
432-
2 => self.layer2.1,
433-
_ => panic!("Invalid layer: must be 0, 1, or 2"),
439+
Layer::Top => self.layer0.1,
440+
Layer::Middle => self.layer1.1,
441+
Layer::Bottom => self.layer2.1,
434442
}
435443
}
436444

0 commit comments

Comments
 (0)