Skip to content

Commit a9ab814

Browse files
feat: add FeatureSet activate/deactivate to Node bindings (LiteSVM#289)
* add additional methods to FeatureSet class * chore: remove unintended yarn.lock changes * added full definitions for FeatureSet for Node.js
1 parent 10fa4e4 commit a9ab814

3 files changed

Lines changed: 96 additions & 1 deletion

File tree

crates/node-litesvm/litesvm/internal.d.ts

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -251,6 +251,12 @@ export declare class FeatureSet {
251251
static allEnabled(): FeatureSet
252252
isActive(featureId: Uint8Array): boolean
253253
activatedSlot(featureId: Uint8Array): bigint | null
254+
activate(featureId: Uint8Array, slot: bigint): void
255+
deactivate(featureId: Uint8Array): void
256+
getActiveFeatures(): Array<Buffer>
257+
getInactiveFeatures(): Array<Buffer>
258+
getActiveFeaturesCount(): number
259+
getInactiveFeaturesCount(): number
254260
toString(): string
255261
}
256262

crates/node-litesvm/src/feature_set.rs

Lines changed: 44 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,10 @@
11
use {
2-
crate::{to_string_js, util::convert_pubkey},
2+
crate::{
3+
to_string_js,
4+
util::{bigint_to_u64, convert_pubkey},
5+
},
36
agave_feature_set::FeatureSet as FeatureSetOriginal,
7+
napi::bindgen_prelude::*,
48
};
59

610
#[derive(Debug, Clone)]
@@ -28,6 +32,45 @@ impl FeatureSet {
2832
pub fn activated_slot(&self, feature_id: &[u8]) -> Option<u64> {
2933
self.0.activated_slot(&convert_pubkey(feature_id))
3034
}
35+
36+
#[napi]
37+
pub fn activate(&mut self, feature_id: &[u8], slot: BigInt) {
38+
let slot_u64 = bigint_to_u64(&slot).unwrap_or(0);
39+
self.0.activate(&convert_pubkey(feature_id), slot_u64);
40+
}
41+
42+
#[napi]
43+
pub fn deactivate(&mut self, feature_id: &[u8]) {
44+
self.0.deactivate(&convert_pubkey(feature_id));
45+
}
46+
47+
#[napi]
48+
pub fn get_active_features(&self) -> Vec<Buffer> {
49+
self.0
50+
.active()
51+
.keys()
52+
.map(|pubkey| Buffer::from(pubkey.to_bytes().to_vec()))
53+
.collect()
54+
}
55+
56+
#[napi]
57+
pub fn get_inactive_features(&self) -> Vec<Buffer> {
58+
self.0
59+
.inactive()
60+
.iter()
61+
.map(|pubkey| Buffer::from(pubkey.to_bytes().to_vec()))
62+
.collect()
63+
}
64+
65+
#[napi]
66+
pub fn get_active_features_count(&self) -> u32 {
67+
self.0.active().len() as u32
68+
}
69+
70+
#[napi]
71+
pub fn get_inactive_features_count(&self) -> u32 {
72+
self.0.inactive().len() as u32
73+
}
3174
}
3275

3376
to_string_js!(FeatureSet);
Lines changed: 46 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,46 @@
1+
import { describe, it } from "node:test"
2+
import assert from "node:assert"
3+
import { FeatureSet } from "../litesvm"
4+
import { PublicKey } from "@solana/web3.js"
5+
6+
describe("FeatureSet", () => {
7+
it("should create default feature set", () => {
8+
const fs = new FeatureSet()
9+
assert.ok(fs)
10+
})
11+
12+
it("should create all_enabled feature set", () => {
13+
const fs = FeatureSet.allEnabled()
14+
assert.ok(fs)
15+
})
16+
17+
it("should activate and check feature", () => {
18+
const fs = new FeatureSet()
19+
const featureId = PublicKey.unique()
20+
21+
const isActiveBeforeActivation = fs.isActive(featureId.toBuffer())
22+
assert.strictEqual(isActiveBeforeActivation, false)
23+
24+
fs.activate(featureId.toBuffer(), 100n)
25+
26+
const isActiveAfterActivation = fs.isActive(featureId.toBuffer())
27+
assert.strictEqual(isActiveAfterActivation, true)
28+
29+
const slot = fs.activatedSlot(featureId.toBuffer())
30+
assert.strictEqual(slot, 100n)
31+
})
32+
33+
it("should deactivate feature", () => {
34+
const fs = FeatureSet.allEnabled()
35+
const featureId = PublicKey.unique()
36+
37+
fs.activate(featureId.toBuffer(), 50n)
38+
assert.strictEqual(fs.isActive(featureId.toBuffer()), true)
39+
40+
fs.deactivate(featureId.toBuffer())
41+
assert.strictEqual(fs.isActive(featureId.toBuffer()), false)
42+
43+
const slot = fs.activatedSlot(featureId.toBuffer())
44+
assert.strictEqual(slot, null)
45+
})
46+
})

0 commit comments

Comments
 (0)