Skip to content
Open
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
4 changes: 2 additions & 2 deletions .github/workflows/run-tests.yml
Original file line number Diff line number Diff line change
Expand Up @@ -51,7 +51,7 @@ jobs:
steps:
- uses: actions/checkout@v4
- name: Run fmt
run: cargo fmt -- --check
run: rustup component add --toolchain nightly-x86_64-unknown-linux-gnu rustfmt && cargo +nightly fmt -- --check
Copy link
Contributor

@coderabbitai coderabbitai bot Feb 24, 2026

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

🧹 Nitpick | 🔵 Trivial

Nightly fmt: consider pinning the nightly version for reproducibility.

Using cargo +nightly fmt is fine for accessing unstable formatting options, but an unpinned nightly means formatting results can change day-to-day. Consider pinning to a specific nightly date (e.g., nightly-2025-12-01) to avoid spurious CI failures.

🤖 Prompt for AI Agents
Verify each finding against the current code and only fix it if needed.

In @.github/workflows/run-tests.yml at line 54, The workflow currently installs
and uses an unpinned nightly via the run step that calls "rustup component add
--toolchain nightly-x86_64-unknown-linux-gnu rustfmt" and "cargo +nightly fmt --
--check"; change both invocations to use a specific pinned nightly (e.g.,
nightly-2025-12-01) so the toolchain and cargo+toolchain invocations are
deterministic: update the rustup --toolchain value to the pinned nightly
identifier and change the cargo +nightly invocation to cargo +nightly-YYYY-MM-DD
fmt -- --check (matching the same pinned date).

Copy link
Contributor Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

How to pin and where?

Copy link
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

@snawaz, to pin the nightly version, you need to specify a date in the format nightly-YYYY-MM-DD instead of just nightly. Here's how:

Where: Line 54 in .github/workflows/run-tests.yml

Current code:

run: rustup component add --toolchain nightly-x86_64-unknown-linux-gnu rustfmt && cargo +nightly fmt -- --check

Pinned version:

run: rustup component add --toolchain nightly-2026-02-01-x86_64-unknown-linux-gnu rustfmt && cargo +nightly-2026-02-01 fmt -- --check

How to pick a date:

  1. Choose a recent nightly that's known to work (e.g., nightly-2026-02-01)
  2. Both the --toolchain flag and the +nightly-* prefix should use the same date
  3. The date format is YYYY-MM-DD

This ensures the formatter behavior stays consistent across CI runs, preventing unexpected formatting changes when nightly Rust updates.

- name: Run clippy
run: cargo clippy -- --deny=warnings

Expand Down Expand Up @@ -80,7 +80,7 @@ jobs:
run: |
cargo build

- name: run tests
- name: run tests (cargo test-sbf)
run: |
export PATH="/home/runner/.local/share/solana/install/active_release/bin:$PATH"
cargo test-sbf --features unit_test_config
Expand Down
15 changes: 15 additions & 0 deletions Cargo.lock

Some generated files are not rendered by default. Learn more about how customized files appear on GitHub.

16 changes: 14 additions & 2 deletions Cargo.toml
Original file line number Diff line number Diff line change
Expand Up @@ -17,7 +17,14 @@ name = "dlp"

[features]
no-entrypoint = []
sdk = ["no-entrypoint"]
sdk = [
"no-entrypoint",
"dep:solana-sdk",
"dep:rand",
"dep:sha2",
"dep:x25519-dalek",
"dep:curve25519-dalek",
]
program = [
"dep:pinocchio",
"dep:pinocchio-log",
Expand Down Expand Up @@ -60,7 +67,12 @@ pinocchio-associated-token-account = { version = "0.3.0" , optional = true }
solana-address = { version = "2.0", features = ["bytemuck", "decode", "syscalls", "curve25519", "std"] }

# manually resolves the conflict with a pinned version of serde
serde = "=1.0.226"
serde = { version = "=1.0.226", features = ["derive"] }
sha2 = { version = "0.10", optional = true }
x25519-dalek = { version = "2", features = ["static_secrets"], optional = true }
curve25519-dalek = { version = "4", optional = true }
solana-sdk = { version = ">=1.16", optional = true }
Copy link
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

⚠️ Potential issue | 🟡 Minor

Unbounded solana-sdk version range risks breaking changes.

version = ">=1.16" has no upper bound. The Solana SDK has had significant breaking changes across major versions (1.x → 2.x). Consider adding an upper bound to prevent accidental upgrades to incompatible versions.

💡 Suggested fix
-solana-sdk = { version = ">=1.16", optional = true }
+solana-sdk = { version = ">=1.16, <3.0.0", optional = true }

This would match the constraint already used for solana-program on Line 52.

📝 Committable suggestion

‼️ IMPORTANT
Carefully review the code before committing. Ensure that it accurately replaces the highlighted code, contains no missing lines, and has no issues with indentation. Thoroughly test & benchmark the code to ensure it meets the requirements.

Suggested change
solana-sdk = { version = ">=1.16", optional = true }
solana-sdk = { version = ">=1.16, <3.0.0", optional = true }
🤖 Prompt for AI Agents
Verify each finding against the current code and only fix it if needed.

In `@Cargo.toml` at line 74, The dependency entry for solana-sdk uses an unbounded
version ("solana-sdk = { version = \">=1.16\", optional = true }") which risks
pulling in breaking major releases; change the version requirement to include an
upper bound consistent with solana-program (e.g., use a caret or range that caps
at the next major version) so it will allow 1.16.x-compatible updates but
prevent accidental 2.x upgrades—update the solana-sdk dependency declaration in
Cargo.toml to mirror the solana-program constraint.

rand = { version = "=0.8.5", features = ["small_rng"], optional = true }
Copy link
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

⚠️ Potential issue | 🟡 Minor

Exact rand pin blocks security patch updates.

=0.8.5 prevents any patch upgrade (e.g., 0.8.6) that might include security or correctness fixes. Pinning x25519-dalek v2 already anchors the rand_core 0.6 ABI; using ^0.8.5 gives the same compatibility guarantee while allowing patch updates.

🛡️ Proposed fix
-rand = { version = "=0.8.5", features = ["small_rng"], optional = true }
+rand = { version = "^0.8.5", features = ["small_rng"], optional = true }

The same relaxation should also be applied to the identical dev-dependency pin on line 80.

📝 Committable suggestion

‼️ IMPORTANT
Carefully review the code before committing. Ensure that it accurately replaces the highlighted code, contains no missing lines, and has no issues with indentation. Thoroughly test & benchmark the code to ensure it meets the requirements.

Suggested change
rand = { version = "=0.8.5", features = ["small_rng"], optional = true }
rand = { version = "^0.8.5", features = ["small_rng"], optional = true }
🤖 Prompt for AI Agents
Verify each finding against the current code and only fix it if needed.

In `@Cargo.toml` at line 75, The Cargo.toml pins the rand dependency with an exact
version ("rand = { version = \"=0.8.5\", features = [\"small_rng\"], optional =
true }") which prevents patch upgrades; change the version specifier to a caret
range (e.g., "^0.8.5") for that rand entry and apply the identical relaxation to
the matching dev-dependency entry so patch releases (0.8.x) can be picked up
while preserving API compatibility.


[dev-dependencies]
assertables = "9.8.2"
Expand Down
3 changes: 3 additions & 0 deletions Makefile
Original file line number Diff line number Diff line change
Expand Up @@ -4,5 +4,8 @@ build:
test:
RUST_LOG=off cargo test-sbf --features unit_test_config

lint:
cargo clippy -- --deny=warnings
Comment on lines +7 to +8
Copy link
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

🧹 Nitpick | 🔵 Trivial

🧩 Analysis chain

🏁 Script executed:

# First, examine the full Makefile context
cat Makefile

Repository: magicblock-labs/delegation-program

Length of output: 232


🏁 Script executed:

# Find all Cargo.toml files and check their features sections
fd 'Cargo.toml' --exec grep -A 20 '\[features\]' {}

Repository: magicblock-labs/delegation-program

Length of output: 722


🏁 Script executed:

# Also check the root directory structure to understand if this is a workspace
ls -la | head -20

Repository: magicblock-labs/delegation-program

Length of output: 1174


🏁 Script executed:

# Verify what code is gated by sdk feature to confirm it's material
rg '#\[cfg.*feature.*sdk' src/ --type rust -A 2 | head -30

Repository: magicblock-labs/delegation-program

Length of output: 1183


🏁 Script executed:

# Check if there are test files or cfg(test) blocks in src/
rg '#\[cfg\(test\)' src/ --type rust

Repository: magicblock-labs/delegation-program

Length of output: 299


lint target will silently skip feature-gated and test code.

Two gaps:

  1. Feature flags absent — the PR gates SDK code behind a sdk feature (and tests use --features unit_test_config). Without passing the relevant features, all #[cfg(feature = "sdk")]-guarded code is invisible to clippy and will never be linted.
  2. --all-targets missing — test modules, examples, and benchmarks are excluded from the lint run.
🔧 Proposed fix
 lint:
-	cargo clippy -- --deny=warnings
+	cargo clippy --all-targets --all-features -- -D warnings

If linting every feature combination is too broad, at minimum mirror the test target's feature set:

 lint:
-	cargo clippy -- --deny=warnings
+	cargo clippy --all-targets --features sdk,unit_test_config -- -D warnings
📝 Committable suggestion

‼️ IMPORTANT
Carefully review the code before committing. Ensure that it accurately replaces the highlighted code, contains no missing lines, and has no issues with indentation. Thoroughly test & benchmark the code to ensure it meets the requirements.

Suggested change
lint:
cargo clippy -- --deny=warnings
lint:
cargo clippy --all-targets --all-features -- -D warnings
Suggested change
lint:
cargo clippy -- --deny=warnings
lint:
cargo clippy --all-targets --features sdk,unit_test_config -- -D warnings
🤖 Prompt for AI Agents
Verify each finding against the current code and only fix it if needed.

In `@Makefile` around lines 7 - 8, The lint target currently runs "cargo clippy --
--deny=warnings" which skips feature-gated SDK code and test targets; update the
Makefile's lint target (the "lint" recipe) to run clippy across all targets and
with the test/features used in CI/tests by adding the flags "--all-targets" and
the feature set used by tests (e.g. "--features unit_test_config") so clippy
will analyze #[cfg(feature = "sdk")] code and test modules; keep the "--
--deny=warnings" passthrough to preserve fail-on-warning behavior.


fmt:
cargo +nightly fmt
5 changes: 4 additions & 1 deletion src/args/delegate.rs
Original file line number Diff line number Diff line change
@@ -1,7 +1,10 @@
use borsh::{BorshDeserialize, BorshSerialize};
use serde::{Deserialize, Serialize};
use solana_program::pubkey::Pubkey;

#[derive(Default, Debug, BorshSerialize, BorshDeserialize)]
#[derive(
Default, Debug, BorshSerialize, BorshDeserialize, Serialize, Deserialize,
)]
Comment on lines +2 to +7
Copy link
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

⚠️ Potential issue | 🔴 Critical

🧩 Analysis chain

🏁 Script executed:

#!/bin/bash
# Find all Cargo.toml files in the repository
fd -n 'Cargo.toml$'

Repository: magicblock-labs/delegation-program

Length of output: 308


🏁 Script executed:

#!/bin/bash
# Find all Cargo.toml files in the repository
fd 'Cargo.toml$'

Repository: magicblock-labs/delegation-program

Length of output: 213


🏁 Script executed:

#!/bin/bash
# Check root Cargo.toml for solana-program dependency
echo "=== Root Cargo.toml ===" 
cat Cargo.toml

echo -e "\n=== test-delegation program Cargo.toml ==="
cat tests/integration/programs/test-delegation/Cargo.toml

Repository: magicblock-labs/delegation-program

Length of output: 3750


🏁 Script executed:

#!/bin/bash
# Read the src/args/delegate.rs file around the mentioned lines
cat -n src/args/delegate.rs | head -20

Repository: magicblock-labs/delegation-program

Length of output: 796


🏁 Script executed:

#!/bin/bash
# Search for other structs with Pubkey and Serialize derives
rg -B3 'Serialize.*Deserialize' --type rust | head -40

# Also check if this compiles by looking for build outputs or CI
echo "=== Looking for CI configuration ==="
fd -e yml -e yaml | head -10

Repository: magicblock-labs/delegation-program

Length of output: 2342


🏁 Script executed:

#!/bin/bash
# Search for any uses of Pubkey with serde in the codebase
rg 'Pubkey' src/args/delegate.rs -A 2 -B 2

# Check if there's any solana-program documentation or version notes
rg 'solana-program' . --type toml -A 3

# Look for any error messages or compilation warnings
fd -e log -e txt

Repository: magicblock-labs/delegation-program

Length of output: 12041


🌐 Web query:

solana-program Pubkey serde Serialize Deserialize implementation

💡 Result:

solana_program::pubkey::Pubkey gets its Serde impls from the solana-pubkey crate (re-exported by solana-program as solana_program::pubkey).[1] Enable the serde feature to get Serialize/Deserialize for Pubkey.[2][3]

Cargo.toml

[dependencies]
serde = { version = "1", features = ["derive"] }

# Enable Pubkey's Serde support
solana-program = { version = "4", features = ["serde"] }
# (Alternatively, depend on solana-pubkey directly with features = ["serde"])

Then you can use it normally:

use serde::{Serialize, Deserialize};
use solana_program::pubkey::Pubkey;

#[derive(Serialize, Deserialize)]
struct X {
  owner: Pubkey,
}

Sources
[1] https://docs.rs/solana-program (re-export of solana_pubkey as pubkey) (docs.rs)
[2] https://lib.rs/crates/solana-pubkey/features (feature flag serde) (lib.rs)
[3] https://docs.rs/solana-pubkey/latest/solana_pubkey/struct.Pubkey.html (Serde Serialize shown in impls) (docs.rs)

Citations:


Enable serde feature for solana-program dependency.

The Pubkey type requires the serde feature to implement Serialize/Deserialize. Update the solana-program dependency in Cargo.toml:

solana-program = { version = ">=1.16, <3.0.0", features = ["serde"] }

Without this, deriving Serialize/Deserialize on DelegateArgs (which contains Option<Pubkey>) will cause a compile error.

🤖 Prompt for AI Agents
Verify each finding against the current code and only fix it if needed.

In `@src/args/delegate.rs` around lines 2 - 7, The compile error comes from
deriving Serialize/Deserialize for a struct (e.g., DelegateArgs) that includes
solana_program::pubkey::Pubkey which needs the serde feature; update the
solana-program dependency in Cargo.toml to enable serde (for example set
solana-program = { version = ">=1.16, <3.0.0", features = ["serde"] }) so Pubkey
implements Serialize/Deserialize and the derives in src/args/delegate.rs
succeed.

pub struct DelegateArgs {
/// The frequency at which the validator should commit the account data
/// if no commit is triggered by the owning program
Expand Down
48 changes: 48 additions & 0 deletions src/args/delegate_with_actions.rs
Original file line number Diff line number Diff line change
@@ -0,0 +1,48 @@
use serde::{Deserialize, Serialize};
use solana_program::{instruction::Instruction, pubkey::Pubkey};

use super::DelegateArgs;
use crate::compact;

#[derive(Debug, Serialize, Deserialize)]
pub struct DelegateWithActionsArgs {
/// Standard delegation parameters.
pub delegate: DelegateArgs,

/// Compact post-delegation actions.
pub actions: PostDelegationActions,
}

#[derive(Debug, Serialize, Deserialize)]
pub struct PostDelegationActions {
/// Number of signer pubkeys in the `pubkeys` prefix.
/// First `signer_count` entries of `pubkeys` are required signers.
pub signer_count: u8,

/// Shared pubkey table. Account metas and program IDs reference this table by index.
pub pubkeys: Vec<Pubkey>,

/// Instruction payload in compact cleartext or encrypted bytes.
pub instructions: Instructions,
}

#[derive(Clone, Debug, Serialize, Deserialize)]
pub enum Instructions {
/// Compact cleartext instructions.
ClearText {
instructions: Vec<compact::Instruction>,
},

/// Encrypted compact instruction bytes.
Encrypted { instructions: Vec<u8> },
}

#[derive(Debug, Serialize, Deserialize)]
pub struct DecryptedInstructions {
/// Sender-provided nonce/salt to randomize ciphertext so identical
/// plaintext does not always map to identical encrypted bytes.
pub random_salt: u64,

/// Decrypted instructions ready for execution.
pub instructions: Vec<Instruction>,
}
Comment on lines +40 to +48
Copy link
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

⚠️ Potential issue | 🟡 Minor

🧩 Analysis chain

🏁 Script executed:

rg -n 'DecryptedInstructions' --type rust

Repository: magicblock-labs/delegation-program

Length of output: 149


🏁 Script executed:

cat -n src/args/delegate_with_actions.rs | sed -n '35,55p'

Repository: magicblock-labs/delegation-program

Length of output: 602


🏁 Script executed:

cat -n src/args/delegate_with_actions.rs | sed -n '1,60p'

Repository: magicblock-labs/delegation-program

Length of output: 1869


🏁 Script executed:

rg -n 'decrypt' --type rust -i

Repository: magicblock-labs/delegation-program

Length of output: 996


🏁 Script executed:

cat -n tests/test_delegate_with_actions.rs | sed -n '150,165p'

Repository: magicblock-labs/delegation-program

Length of output: 836


DecryptedInstructions is unused—remove it or document its intended purpose.

The struct is not referenced anywhere in the codebase. The test decrypts into Vec<compact::Instruction> directly rather than using DecryptedInstructions. Either remove the struct if it's dead code or add a doc comment explaining its intended consumer and when it should be used.

🤖 Prompt for AI Agents
Verify each finding against the current code and only fix it if needed.

In `@src/args/delegate_with_actions.rs` around lines 40 - 48,
DecryptedInstructions is dead code; either remove the struct or make it
intentionally used. Option A (preferred): delete the DecryptedInstructions type
and its Serialize/Deserialize derives and update/remove any imports so tests
continue to deserialize directly into Vec<compact::Instruction>. Option B: keep
it—add a clear doc comment describing its purpose and change the decrypt/test
code to deserialize into DecryptedInstructions (and update call sites to use
.instructions and .random_salt) so the type is actually consumed.

2 changes: 2 additions & 0 deletions src/args/mod.rs
Original file line number Diff line number Diff line change
Expand Up @@ -2,6 +2,7 @@ mod call_handler;
mod commit_state;
mod delegate;
mod delegate_ephemeral_balance;
mod delegate_with_actions;
mod top_up_ephemeral_balance;
mod types;
mod validator_claim_fees;
Expand All @@ -11,6 +12,7 @@ pub use call_handler::*;
pub use commit_state::*;
pub use delegate::*;
pub use delegate_ephemeral_balance::*;
pub use delegate_with_actions::*;
pub use top_up_ephemeral_balance::*;
pub use types::*;
pub use validator_claim_fees::*;
Expand Down
60 changes: 60 additions & 0 deletions src/compact/account_meta.rs
Original file line number Diff line number Diff line change
@@ -0,0 +1,60 @@
use serde::{Deserialize, Serialize};

const ACCOUNT_INDEX_MASK: u8 = 0b0011_1111;
const SIGNER_MASK: u8 = 0b0100_0000;
const WRITABLE_MASK: u8 = 0b1000_0000;

///
/// MAX_PUBKEYS = 64
///
pub const MAX_PUBKEYS: u8 = ACCOUNT_INDEX_MASK + 1;

/// Compact account meta packed into one byte.
/// Bits `0..=5` encode the pubkey-table index (`0..MAX_PUBKEYS-1`).
/// Bit `6` is `is_signer`, and bit `7` is `is_writable`.
#[derive(Clone, Copy, Debug, Serialize, Deserialize)]
pub struct AccountMeta(u8);

impl AccountMeta {
pub fn new(index: u8, is_signer: bool) -> Self {
Self::try_new(index, is_signer, true).expect("index is out of range")
}
pub fn new_readonly(index: u8, is_signer: bool) -> Self {
Self::try_new(index, is_signer, false).expect("index is out of range")
}
Comment on lines +18 to +24
Copy link
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

🧹 Nitpick | 🔵 Trivial

new and new_readonly panic on invalid input — consider documenting or returning Result.

These constructors call .expect(...) which will panic if index >= 64. For a public API, this is fine if callers are always trusted, but the panic message should ideally include the offending index value for debugging.

💡 Minor improvement: include the bad index in the panic
     pub fn new(index: u8, is_signer: bool) -> Self {
-        Self::try_new(index, is_signer, true).expect("index is out of range")
+        Self::try_new(index, is_signer, true)
+            .unwrap_or_else(|| panic!("compact AccountMeta index {index} is out of range (max {})", MAX_PUBKEYS - 1))
     }
     pub fn new_readonly(index: u8, is_signer: bool) -> Self {
-        Self::try_new(index, is_signer, false).expect("index is out of range")
+        Self::try_new(index, is_signer, false)
+            .unwrap_or_else(|| panic!("compact AccountMeta index {index} is out of range (max {})", MAX_PUBKEYS - 1))
     }
🤖 Prompt for AI Agents
Verify each finding against the current code and only fix it if needed.

In `@src/compact/account_meta.rs` around lines 18 - 24, AccountMeta::new and
AccountMeta::new_readonly call Self::try_new(...).expect(...) which panics
without showing the offending index; update these constructors to either return
a Result by propagating the TryResult from try_new or, if you keep the panic
API, replace the expect message with one that includes the invalid index value
(e.g. include index in the message) so callers see which index triggered the
error; refer to AccountMeta::new, AccountMeta::new_readonly, and try_new to
apply the change.


pub fn try_new(
index: u8,
is_signer: bool,
is_writable: bool,
) -> Option<Self> {
if index >= MAX_PUBKEYS {
return None;
}
let mut packed = index;
if is_signer {
packed |= SIGNER_MASK;
}
if is_writable {
packed |= WRITABLE_MASK;
}
Some(Self(packed))
}

pub fn index(self) -> u8 {
self.0 & ACCOUNT_INDEX_MASK
}

pub fn is_signer(self) -> bool {
(self.0 & SIGNER_MASK) != 0
}

pub fn is_writable(self) -> bool {
(self.0 & WRITABLE_MASK) != 0
}

pub fn set_index(&mut self, new_index: u8) {
*self = Self::try_new(new_index, self.is_signer(), self.is_writable())
.expect("index is out of range");
}
}
39 changes: 39 additions & 0 deletions src/compact/instruction.rs
Original file line number Diff line number Diff line change
@@ -0,0 +1,39 @@
use serde::{Deserialize, Serialize};

use crate::compact;

#[derive(Clone, Debug, Serialize, Deserialize)]
pub struct Instruction {
pub program_id: u8,
pub accounts: Vec<compact::AccountMeta>,
pub data: Vec<u8>,
}

impl Instruction {
pub fn from_instruction(
ix: solana_program::instruction::Instruction,
index_of: &mut impl FnMut(
/*account_key*/ solana_program::pubkey::Pubkey,
/*signer*/ bool,
) -> u8,
) -> Instruction {
Instruction {
program_id: index_of(ix.program_id, false),

accounts: ix
.accounts
.iter()
.map(|meta| {
compact::AccountMeta::try_new(
index_of(meta.pubkey, meta.is_signer),
meta.is_signer,
meta.is_writable,
)
.expect("compact account index must fit in 6 bits")
})
.collect(),

data: ix.data,
}
}
}
5 changes: 5 additions & 0 deletions src/compact/mod.rs
Original file line number Diff line number Diff line change
@@ -0,0 +1,5 @@
mod account_meta;
mod instruction;

pub use account_meta::*;
pub use instruction::*;
3 changes: 3 additions & 0 deletions src/discriminator.rs
Original file line number Diff line number Diff line change
Expand Up @@ -53,6 +53,9 @@ pub enum DlpDiscriminator {

/// See [crate::processor::process_commit_finalize_from_buffer] for docs.
CommitFinalizeFromBuffer = 22,

/// See [crate::processor::process_delegate_with_actions] for docs.
DelegateWithActions = 23,
}

impl DlpDiscriminator {
Expand Down
Loading