Skip to content

feat: Implement InitProtocolConfig - #193

Draft
snawaz wants to merge 6 commits into
snawaz/mimd-0024-designfrom
snawaz/init-pro-config
Draft

feat: Implement InitProtocolConfig#193
snawaz wants to merge 6 commits into
snawaz/mimd-0024-designfrom
snawaz/init-pro-config

Conversation

@snawaz

@snawaz snawaz commented Aug 5, 2026

Copy link
Copy Markdown
Collaborator

⚠️ NOTE: Use notes like this to emphasize something important about the PR.

This could include other PRs this PR is built on top of; API breaking changes; reasons for why the PR is on hold; or anything else you would like to draw attention to.

Status Type ⚠️ Core Change Issue
Ready/Hold Feature/Bug/Tooling/Refactor/Hotfix Yes/No Link

Problem

What problem are you trying to solve?

Solution

How did you solve the problem?

Before & After Screenshots

Insert screenshots of example code output

BEFORE:
[insert screenshot here]

AFTER:
[insert screenshot here]

Other changes (e.g. bug fixes, small refactors)

Deploy Notes

Notes regarding deployment of the contained body of work. These should note any
new dependencies, new scripts, etc.

New scripts:

  • script : script details

New dependencies:

  • dependency : dependency details

Summary by CodeRabbit

  • New Features

    • Added V2 protocol configuration initialization.
    • Added configurable protocol settings, verifier registries, and account state management.
    • Added address derivation helpers for protocol configuration and verifier registry accounts.
    • Added instruction building, serialization, validation, and dispatch support.
    • Preserved compatibility with existing V1 instruction handling.
  • Bug Fixes

    • Added validation for invalid keys, required values, approval thresholds, penalties, signatures, and account addresses.
  • Tests

    • Added integration coverage for successful initialization, persistence, duplicate setup, invalid inputs, and dispatch compatibility.

@coderabbitai

coderabbitai Bot commented Aug 5, 2026

Copy link
Copy Markdown
Contributor

Review Change Stack

Warning

Review limit reached

@snawaz, you've reached your PR review limit, so we couldn't start this review.

Next review available in: 36 minutes

You've used all free OSS reviews for now. Wait for the free limit to reset to keep reviewing this public repository.

How can I continue?

After more reviews become available, a review can be triggered using the @coderabbitai review command as a PR comment. Alternatively, push new commits to this PR.

To avoid repeated limits, reduce automatic review volume by pausing incremental auto-reviews earlier, using label-based review opt-in, excluding WIP or generated PR titles, or requesting reviews manually when the PR is ready. If your team needs uninterrupted high-volume reviews, an organization admin can enable usage-based reviews.

How do review limits work?

CodeRabbit enforces per-developer PR review limits for each organization. Most developers receive the normal plan review availability.

For paid Pro and Pro+ PR reviews, CodeRabbit uses adaptive limits for sustained high-volume activity. When a developer's recent PR review activity reaches the 95th percentile or higher among CodeRabbit users, additional reviews become available more gradually as earlier reviews age out of the rolling window.

Please refer docs for additional details.

Review details
⚙️ Run configuration

Configuration used: Path: .coderabbit.yaml

Review profile: ASSERTIVE

Plan: Pro Plus

Run ID: 3529e7a5-d921-4af5-8c02-e2c6990d82c0

📥 Commits

Reviewing files that changed from the base of the PR and between ec03b1f and 32db27f.

📒 Files selected for processing (3)
  • src/v2/processor/bootstrap/init_protocol_config.rs
  • src/v2/processor/bootstrap/mod.rs
  • src/v2/processor/mod.rs
📝 Walkthrough

Walkthrough

Adds the public v2 API for protocol configuration initialization, including instruction arguments, instruction identifiers, PDA helpers, and serialized protocol and verifier-registry state. Adds an instruction builder and processor dispatch. The processor validates accounts and arguments, creates both PDAs, and stores initialized state. Updates legacy dispatch to recognize v2 instructions. Adds integration tests for serialization, successful and failed initialization, validation, and V1 dispatch compatibility.

✨ Finishing Touches
🧪 Generate unit tests (beta)
  • Create PR with unit tests
  • Commit unit tests in branch snawaz/init-pro-config

Thanks for using CodeRabbit! It's free for OSS, and your support helps us grow. If you like it, consider giving us a shout-out.

❤️ Share

Comment @coderabbitai help to get the list of available commands.

@coderabbitai coderabbitai Bot left a comment

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

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

Actionable comments posted: 3

🤖 Prompt for all review comments with AI agents
Verify each finding against current code. Fix only still-valid issues, skip the
rest with a brief reason, keep changes minimal, and validate.

Inline comments:
In @.gitignore:
- Around line 6-7: Update the untracked ignore rule in .gitignore to /untracked/
so it applies only to the repository-root directory.

In `@dlp-api/src/v2/instruction_builder/init_protocol_config.rs`:
- Around line 28-31: The init_protocol_config builder currently calls
to_vec(&args).unwrap(), which can panic on Borsh serialization failure. Update
the InitProtocolConfig path in init_protocol_config.rs to remove the unwrap by
propagating the serialization error through the public builder API, or make the
serialization precondition explicit and enforced so to_vec cannot fail; keep the
DlpV2Instruction::InitProtocolConfig path unchanged aside from replacing the
panic-prone handling.

In `@src/v2/processor/init_protocol_config.rs`:
- Line 43: Update the initializer around load_signer in the protocol
configuration setup to authorize the signer before creating either the global
ProtocolConfig or VerifierRegistry PDA. Validate it against the configured
bootstrap authority, governance authority, or verified program upgrade
authority, and reject unauthorized signers before assigning
ProtocolConfig.authority or persisting any protocol-wide settings.
🪄 Autofix

Fix all unresolved CodeRabbit comments on this PR:

  • Push a commit to this branch (recommended)
  • Create a new PR with the fixes

ℹ️ Review info
⚙️ Run configuration

Configuration used: Path: .coderabbit.yaml

Review profile: ASSERTIVE

Plan: Pro Plus

Run ID: f5c3b56c-fcda-45ae-9eb9-fadec1db5f75

📥 Commits

Reviewing files that changed from the base of the PR and between 4445e0d and 1aeeb3b.

📒 Files selected for processing (19)
  • .gitignore
  • dlp-api/src/lib.rs
  • dlp-api/src/v2/args/init_protocol_config.rs
  • dlp-api/src/v2/args/mod.rs
  • dlp-api/src/v2/instruction.rs
  • dlp-api/src/v2/instruction_builder/init_protocol_config.rs
  • dlp-api/src/v2/instruction_builder/mod.rs
  • dlp-api/src/v2/mod.rs
  • dlp-api/src/v2/pda.rs
  • dlp-api/src/v2/state/mod.rs
  • dlp-api/src/v2/state/protocol_config.rs
  • dlp-api/src/v2/state/utils.rs
  • dlp-api/src/v2/state/verifier_registry.rs
  • src/lib.rs
  • src/processor/mod.rs
  • src/v2/mod.rs
  • src/v2/processor/init_protocol_config.rs
  • src/v2/processor/mod.rs
  • tests/test_v2_init_protocol_config.rs

Comment thread .gitignore
Comment on lines +6 to +7
untracked/

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

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

🎯 Functional Correctness | 🟡 Minor | ⚡ Quick win

🧩 Analysis chain

🏁 Script executed:

#!/bin/bash
set -euo pipefail

echo "== .gitignore =="
if [ -f .gitignore ]; then
  cat -n .gitignore
else
  echo ".gitignore not found"
fi

echo
echo "== untracked references =="
rg -n --hidden --glob '!/.git/**' 'untracked|untracked/' . || true

echo
echo "== git pattern behavior probe =="
python3 - <<'PY'
patterns = ["/untracked/", "untracked/"]
directories = [
    "untracked",
    "/untracked/",
    "a/untracked",
    "a/untracked/",
    "a/untracked/README.json",
    "a/untracked/b",
]
import posixpath, fnmatch
print("gitignore semantics:")
print("- leading '/' anchors to repository root")
print("- trailing '/' matches only directories")
print("- no slash elsewhere matches repository name (not path) then any recursive path")
for pat in patterns:
    print(f"\nPattern {pat!r}:")
    for d in directories:
        m = False
        if pat.startswith("/"):
            # repository-root anchor; pattern is relative to root
            if fnmatch.fnmatch(d, pat[1:]):
                m = True
        elif "/" in pat or pat.endswith("/"):
            m =  ("/" in pat or pat.endswith("/")) and fnmatch.fnmatch(d, pat)
        else:
            # bare name matches repository name then nested paths under it
            m = fnmatch.fnmatch(d, pat + "/**") or fnmatch.fnmatch(d, pat)
        print(f"  {d!r}: {m}")
PY

Repository: magicblock-labs/delegation-program

Length of output: 1206


🌐 Web query:

gitignore untracked/ matches directories named untracked at any depth /untracked/ root directory documentation

💡 Result:

In Git's ignore pattern syntax, there is a distinct difference between patterns that include a directory separator (like /) and those that do not [1][2][3]. To match directories named untracked at any depth in your repository, you should use the pattern: /untracked/ Explanation of how this works: 1. Pattern Matching Rules: If a pattern does not contain a directory separator at the beginning or middle, it matches at any level of the directory tree [1][2][3]. However, if you add a slash at the end (e.g., untracked/), it specifically targets a directory named untracked [1][3]. 2. The Leading / Sequence: The / syntax is used to explicitly match directories at any level [4][1]. Specifically, a leading / followed by a slash means to match the directory in all directories [4][1]. 3. Why not /untracked/: A pattern starting with a leading slash, such as /untracked/, is relative to the directory level of the.gitignore file itself [1][2]. This means it will only match a directory named untracked located at the root of your repository (where the.gitignore file is located), not at deeper levels [1][2][3]. Therefore, while the simple pattern untracked/ (no leading slash) will technically match directories named untracked at any depth due to the behavior of patterns without internal separators [1][2], using /untracked/ is the explicit, best-practice way to ensure it is interpreted as a directory match across all subdirectories [4][1].

Citations:


🌐 Web query:

gitignore pattern /dir/ meaning ignore directory dir at root gitignore.txt

💡 Result:

In a.gitignore file, a pattern starting with a leading slash, such as /dir/, matches a path relative to the directory where that specific.gitignore file is located [1][2][3]. Key technical details regarding this pattern: 1. Anchoring: A leading slash anchors the pattern to the directory level of the.gitignore file itself [1][2]. If the.gitignore file is at the root of your repository, /dir/ will indeed only match a directory named dir at that root level [2][4]. If the.gitignore file is located in a subdirectory (e.g., project/subdir/.gitignore), then /dir/ inside that file will only match a directory named dir located directly within project/subdir/ [1][3]. 2. Directory-Only Match: Because the pattern ends with a trailing slash (/), it explicitly matches only directories [1][2]. Git will ignore the directory dir and everything contained within it [5][6]. It will not match regular files or symbolic links named dir [1][3]. 3. Comparison with No Slash: If you omit the leading slash (e.g., using just dir/), the pattern is not anchored to the.gitignore file's location [2][4]. Instead, it will match a directory named dir at any depth within the directory tree (e.g., dir/, a/dir/, a/b/dir/) [2][4]. In summary, the leading slash is used to restrict the scope of the match to the immediate level of the.gitignore file, preventing the pattern from matching occurrences of that directory in deeper subdirectories [2][4]. If the pattern already contains a middle slash (e.g., /dir/subdir/ or doc/frotz/), the leading slash becomes redundant as the pattern is already anchored to the location of the.gitignore file [1][3][4].

Citations:


Anchor the root-scoped ignore path.

untracked/ matches the untracked directory at any repository depth. If this rule only targets the repository root, use /untracked/.

🤖 Prompt for AI Agents
Verify each finding against current code. Fix only still-valid issues, skip the
rest with a brief reason, keep changes minimal, and validate.

In @.gitignore around lines 6 - 7, Update the untracked ignore rule in
.gitignore to /untracked/ so it applies only to the repository-root directory.

Comment on lines +28 to +31
data: [
DlpV2Instruction::InitProtocolConfig.to_vec(),
to_vec(&args).unwrap(),
]

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

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

🩺 Stability & Availability | 🟠 Major | 🏗️ Heavy lift

Remove the serialization .unwrap().

Line 30 panics if Borsh serialization returns an error. Change this public builder to return a serialization error, or provide an explicit enforced invariant that proves serialization cannot fail.

As per path instructions, treat .unwrap() in production Rust code as a major issue.

🤖 Prompt for AI Agents
Verify each finding against current code. Fix only still-valid issues, skip the
rest with a brief reason, keep changes minimal, and validate.

In `@dlp-api/src/v2/instruction_builder/init_protocol_config.rs` around lines 28 -
31, The init_protocol_config builder currently calls to_vec(&args).unwrap(),
which can panic on Borsh serialization failure. Update the InitProtocolConfig
path in init_protocol_config.rs to remove the unwrap by propagating the
serialization error through the public builder API, or make the serialization
precondition explicit and enforced so to_vec cannot fail; keep the
DlpV2Instruction::InitProtocolConfig path unchanged aside from replacing the
panic-prone handling.

Source: Path instructions

return Err(ProgramError::NotEnoughAccountKeys);
};

load_signer(authority, "authority")?;

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

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

🔒 Security & Privacy | 🔴 Critical | ⚡ Quick win

🧩 Analysis chain

🏁 Script executed:

#!/bin/bash
set -euo pipefail

echo "Files:"
git ls-files | rg '(^|/)(init_protocol_config|processor/mod|lib|loader|protocol_config|verifier_registry|pda\.rs)\.(rs|toml)$|v2.*\.rs$' | sed -n '1,200p'

echo
echo "init_protocol_config.rs:"
cat -n src/v2/processor/init_protocol_config.rs

echo
echo "v2 args:"
cat -n dlp-api/src/v2/args/init_protocol_config.rs

echo
echo "processor/loaders relevant:"
sed -n '1,120p;170,215p' src/processor/utils/loaders.rs | cat -n

echo
echo "instruction enum:"
rg -n "InitProtocolConfig|DlpV2Instruction|process_instruction|slow_process_instruction" -S src dl

echo
echo "search for bootstrap/governance/upgrade auth words:"
rg -n "governance|bootstrap|upgrade_authority|upgrade|authority|load_unauthorized|load_signer|load.*authority|program_id" src dlp-api -S | sed -n '1,220p'

Repository: magicblock-labs/delegation-program

Length of output: 14222


Authorization Bypass (CWE-862): Missing Authorization

Reachability: External

Reachability path
● Entry
  src/lib.rs
│
▼
● Hop
  src/v2/mod.rs:3
  processor
│
▼
● Hop
  src/v2/processor/mod.rs:11
  process_instruction
│
▼
● Sink
  src/v2/processor/init_protocol_config.rs

Authorize the global initializer.

load_signer(authority, "authority") only checks signature presence. When the global ProtocolConfig and VerifierRegistry PDAs are uninitialized, any signer becomes ProtocolConfig.authority and can persist protocol-wide VRF, resolver, economic, and timing settings. Require a configured bootstrap authority, governance authority, or validated program upgrade authority before creating either PDA.

🤖 Prompt for AI Agents
Verify each finding against current code. Fix only still-valid issues, skip the
rest with a brief reason, keep changes minimal, and validate.

In `@src/v2/processor/init_protocol_config.rs` at line 43, Update the initializer
around load_signer in the protocol configuration setup to authorize the signer
before creating either the global ProtocolConfig or VerifierRegistry PDA.
Validate it against the configured bootstrap authority, governance authority, or
verified program upgrade authority, and reject unauthorized signers before
assigning ProtocolConfig.authority or persisting any protocol-wide settings.

@snawaz
snawaz force-pushed the snawaz/init-pro-config branch from 1aeeb3b to 36aeb49 Compare August 7, 2026 10:34
@snawaz
snawaz changed the base branch from snawaz/mimd-0025-design to snawaz/mimd-0024-design August 7, 2026 10:35

@coderabbitai coderabbitai Bot left a comment

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

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

Actionable comments posted: 1

🤖 Prompt for all review comments with AI agents
Verify each finding against current code. Fix only still-valid issues, skip the
rest with a brief reason, keep changes minimal, and validate.

Inline comments:
In `@dlp-api/Cargo.toml`:
- Line 52: Update the wheels dependency declaration in Cargo.toml to use a
dependency resolvable by supported Cargo commands, replacing the unprovisioned
sibling-repository path with a published crate or a Git dependency that
consumers can reliably fetch.
🪄 Autofix

Fix all unresolved CodeRabbit comments on this PR:

  • Push a commit to this branch (recommended)
  • Create a new PR with the fixes

ℹ️ Review info
⚙️ Run configuration

Configuration used: Path: .coderabbit.yaml

Review profile: ASSERTIVE

Plan: Pro Plus

Run ID: 731f7a5c-b0a4-4b11-8fdd-14b53df9efb6

📥 Commits

Reviewing files that changed from the base of the PR and between 1aeeb3b and 36aeb49.

⛔ Files ignored due to path filters (1)
  • Cargo.lock is excluded by !**/*.lock
📒 Files selected for processing (9)
  • dlp-api/Cargo.toml
  • dlp-api/src/v2/args/init_protocol_config.rs
  • dlp-api/src/v2/instruction_builder/init_protocol_config.rs
  • dlp-api/src/v2/state/mod.rs
  • dlp-api/src/v2/state/protocol_config.rs
  • dlp-api/src/v2/state/utils.rs
  • dlp-api/src/v2/state/verifier_registry.rs
  • src/v2/processor/init_protocol_config.rs
  • tests/test_v2_init_protocol_config.rs

Comment thread dlp-api/Cargo.toml
strum = { version = ">=0.27", features = ["derive"] }
thiserror = { version = ">=1" }
serde = { version = "1.0.228", default-features = false, features = ["derive"] }
wheels = { path = "../../magicblock-wheels/rust/wheels" }

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

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

📐 Maintainability & Code Quality | 🟠 Major | ⚡ Quick win

🧩 Analysis chain

🏁 Script executed:

#!/bin/bash
set -euo pipefail

dependency_path="$(cd dlp-api && realpath -m ../../magicblock-wheels/rust/wheels)"
printf 'Resolved wheels path: %s\n' "$dependency_path"
test -f "$dependency_path/Cargo.toml"

Repository: magicblock-labs/delegation-program

Length of output: 218


🏁 Script executed:

#!/bin/bash
set -euo pipefail

printf '%s\n' "Cargo deps around wheels:"
sed -n '45,58p' dlp-api/Cargo.toml 2>/dev/null || true

printf '%s\n' "Repository top-level entries:"
find . -maxdepth 2 -type d \( -name 'magicblock-wheels' -o -name 'dlp-api' -o -name 'wheels' \) 2>/dev/null | sort

printf '%s\n' "Manifest references to magicblock-wheels/wheels:"
rg -n "magicblock-wheels|wheels\s*=" .github dlp-api Cargo.toml . 2>/dev/null | head -200

printf '%s\n' "README/workflow hints for checkout/setup:"
sed -n '1,220p' README.md 2>/dev/null || true
find .github/workflows -type f -maxdepth 2 -print 2>/dev/null | sort | xargs -r -I{} sh -c 'echo "--- {}"; sed -n "1,220p" "{}"'

Repository: magicblock-labs/delegation-program

Length of output: 20908


Use a resolvable dependency for wheels.

wheels points at ../../magicblock-wheels/rust/wheels, but supported cargo commands do not provision that sibling repository. CI may pass only because the runner has unrelated state; replace this with a published crate or a Git/path dep that consumers can checkout.

🤖 Prompt for AI Agents
Verify each finding against current code. Fix only still-valid issues, skip the
rest with a brief reason, keep changes minimal, and validate.

In `@dlp-api/Cargo.toml` at line 52, Update the wheels dependency declaration in
Cargo.toml to use a dependency resolvable by supported Cargo commands, replacing
the unprovisioned sibling-repository path with a published crate or a Git
dependency that consumers can reliably fetch.

@coderabbitai coderabbitai Bot left a comment

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

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

Actionable comments posted: 1

🤖 Prompt for all review comments with AI agents
Verify each finding against current code. Fix only still-valid issues, skip the
rest with a brief reason, keep changes minimal, and validate.

Inline comments:
In `@dlp-api/src/v2/state/verifier_registry.rs`:
- Around line 33-40: Update VerifierRegistry::size_with_discriminator to
propagate the encoded_len() error instead of panicking with expect, changing its
return type accordingly. Update every caller in the verifier initialization path
to handle the returned layout error and map it to ProgramError before computing
PDA sizes.
🪄 Autofix

Fix all unresolved CodeRabbit comments on this PR:

  • Push a commit to this branch (recommended)
  • Create a new PR with the fixes

ℹ️ Review info
⚙️ Run configuration

Configuration used: Path: .coderabbit.yaml

Review profile: ASSERTIVE

Plan: Pro Plus

Run ID: a921973b-1a79-46e6-9603-885f7129fb1e

📥 Commits

Reviewing files that changed from the base of the PR and between 36aeb49 and ec03b1f.

📒 Files selected for processing (4)
  • dlp-api/src/v2/state/protocol_config.rs
  • dlp-api/src/v2/state/verifier_registry.rs
  • src/v2/processor/fraud_proofs/mod.rs
  • src/v2/processor/mod.rs

Comment on lines +33 to +40
pub fn size_with_discriminator(&self) -> usize {
8 + VerifierRegistryLayout {
registry_revision: self.registry_revision,
entries: self.entries.clone(),
}
.encoded_len()
.expect("validated verifier registry size")
}

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

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

🩺 Stability & Availability | 🟠 Major | ⚡ Quick win

🧩 Analysis chain

🏁 Script executed:

#!/bin/bash
set -euo pipefail

echo "== file around verifier_registry.rs =="
sed -n '1,120p' dlp-api/src/v2/state/verifier_registry.rs

echo
echo "== references to size_with_discriminator =="
rg -n "size_with_discriminator|VerifierRegistryLayout|encoded_len" dlp -g '*.rs' || true

echo
echo "== define verifier_registry.rs stat =="
wc -l dlp-api/src/v2/state/verifier_registry.rs

Repository: magicblock-labs/delegation-program

Length of output: 2896


🏁 Script executed:

#!/bin/bash
set -euo pipefail

echo "== repository top-level files =="
git ls-files | sed -n '1,80p'

echo
echo "== search size_with_discriminator references =="
rg -n "size_with_discriminator|VerifierRegistryLayout|encoded_len|layout_error_to_program_error" . -g '*.rs' || true

echo
echo "== candidate utils/state files =="
git ls-files '*utils*.rs' '*state*' | sed -n '1,120p'

Repository: magicblock-labs/delegation-program

Length of output: 7405


🏁 Script executed:

#!/bin/bash
set -euo pipefail

echo "== init_protocol_config.rs caller =="
sed -n '1,120p' src/v2/processor/init_protocol_config.rs

echo
echo "== verifier registry state init =="
rg -n "VerifierRegistry|verifier_registry|VerifierRegistryState|RegistryRevision|registry_revision|entries\.push|try_from_slice|data\.len" src tests -g '*.rs' || true

echo
echo "== v2 state and layout error utility =="
sed -n '1,100p' dlp-api/src/v2/state/mod.rs
sed -n '1,80p' dlp-api/src/v2/state/utils.rs

echo
echo "== same pattern size_with_discriminator references =="
sed -n '33,70p' dlp-api/src/state/delegation_record.rs
sed -n '33,70p' dlp-api/src/state/commit_record.rs
sed -n '33,60p' dlp-api/src/state/undelegation_request.rs
sed -n '33,55p' dlp-api/src/state/program_config.rs

Repository: magicblock-labs/delegation-program

Length of output: 18682


🏁 Script executed:

#!/bin/bash
set -euo pipefail

echo "== Cargo manifests and dependencies =="
cat dlp-api/Cargo.toml | sed -n '1,140p'
cat Cargo.toml | sed -n '1,180p'

echo
echo "== wheels DataLayoutError/Encodable docs from lock if available =="
rg -n "name = \"wheels\"|DataLayoutError|encoded_len|impl Encodable for Vec|fixed_offset_layout" Cargo.lock dlp-api/src src -g '*.rs' || true

Repository: magicblock-labs/delegation-program

Length of output: 6729


🌐 Web query:

wheels fixed_offset_layout Encodable Vec flexible encoded_len DataLayoutError

💡 Result:

The terms you provided do not correspond to a single, unified library or standard, but rather appear to be a collection of identifiers, traits, and error types commonly used in the Rust ecosystem for data serialization, memory layout, and encoding [1][2][3][4]. FixedEncodable This is a trait found in libraries like vector_buffers (used in the Vector observability platform) [1]. It is designed for types that can encode/decode themselves with a fixed-size representation, acting as a companion to a more general Encodable trait that handles versioning and metadata [1]. EncodedLen / encoded_len This is a common pattern across many Rust serialization crates (such as enc, scion-protobuf, and side-proto) [2][5][6]. It defines a method, usually encoded_len(&self) -> usize (or returning a Result), used to determine the number of bytes a type will occupy when serialized [2][5][6]. DataLayoutError While not a single standard, error types with similar names are typical in crates dealing with binary formats, memory alignment, or structured data layout (e.g., crates like binary-layout or similar memory-mapping tools) [4]. Vec and "wheels" The mention of Vec refers to the standard Rust collection, frequently used as a buffer for encoding operations (e.g., encode_to_vec) [6]. "Wheels" is not a standard technical term in this context; it may refer to a specific internal project, a colloquialism for "re-inventing the wheel," or a specific crate/tooling name not widely indexed in public repositories under these combined keywords. Crates for Data Layout If you are working on memory-safe binary layouts or manual struct representation in Rust, you may be looking for one of these common crates: * binary-layout: For defining binary protocols and accessing fields with specific offsets [4]. * memory-layout or struct-layout: For defining explicit struct layouts similar to C# [7][3]. * repr-offset: For calculating field offsets in memory [8]. If you are encountering a specific compiler error or a snippet involving these, it is likely related to an implementation of a custom binary protocol where you are attempting to calculate the encoded length of a vector of elements [9]. [1][9][2][4]

Citations:


🌐 Web query:

github magicblock-wheels rust wheels fixed_offset_layout encoded_len DataLayoutError

💡 Result:

The terms mentioned relate to the internal codebase of MagicBlock, specifically their reusable Rust utilities known as magicblock-wheels [1]. magicblock-wheels is an internal, non-user-facing SDK repository maintained by MagicBlock [1]. It serves as a shared library for code that supports their core projects, including the ephemeral rollups infrastructure [1]. Regarding the specific terms: - fixed_offset_layout: This likely refers to a structural definition used for memory or serialization layouts where field offsets are constant [1]. This is common in Solana-compatible Rust programs, particularly those utilizing the Pinocchio framework, which emphasizes fixed-size, manual serialization to avoid the overhead of dynamic structures like Vec [2]. - encoded_len: This typically represents a function or constant used to determine the size of a serialized object [3]. In the context of Rust serialization (such as within MagicBlock's projects or custom codecs), it is used to calculate the required buffer space without performing allocations [3]. - DataLayoutError: While this is a generic term that appears in various Rust compiler contexts (e.g., rustc_abi or rustc_middle, often related to type layout verification) [4][5], within the context of magicblock-wheels, it likely refers to a custom error type used to handle failures during the decoding or structural validation of account or instruction data [1]. If you are encountering a DataLayoutError while working with this repository, it typically indicates a mismatch between the expected binary format of an account/instruction and the data provided, or a failure in the structural layout mapping defined in your code [1][3]. Because magicblock-wheels is internal infrastructure, you are encouraged to use the public ephemeral-rollups-sdk for production integrations [1][6].

Citations:


🌐 Web query:

site:github.com/magicblock-labs/magicblock-wheels encoded_len flexible Vec

💡 Result:

There is no standard Rust trait or widely recognized library pattern known as encoded_len that specifically targets flexible Vec serialization. The term encoded_len is common in various serialization frameworks to estimate the size of a data structure before encoding, but it is not part of the Rust standard library, and a search of available resources does not identify a specific flexible crate feature associated with this naming convention for Vec types [1]. Developers working on serialization in Rust typically implement custom length-calculation logic or use existing crates like bincode, serde, or borsh, which handle vector length prefixes during the encoding process automatically. If you are referencing a specific internal SDK or niche library, it is likely custom implementation-specific code rather than a general-purpose Rust idiom [1].

Citations:


🌐 Web query:

site:github.com/magicblock-labs/magicblock-wheels "DataLayoutError" "encoded_len"

💡 Result:

No indexed GitHub results were found for:

site:github.com/magicblock-labs/magicblock-wheels "DataLayoutError" "encoded_len"

The repository or matching code may be private, unindexed, or the terms may not appear together.


Do not panic when verifier-registry sizing fails.

VerifierRegistry::size_with_discriminator() is public and currently calls .expect() on encoded_len(). If the layout size is not representable, the verifier init path can panic instead of returning ProgramError. Return the layout error from this method and map it before callers compute PDA sizes.

🤖 Prompt for AI Agents
Verify each finding against current code. Fix only still-valid issues, skip the
rest with a brief reason, keep changes minimal, and validate.

In `@dlp-api/src/v2/state/verifier_registry.rs` around lines 33 - 40, Update
VerifierRegistry::size_with_discriminator to propagate the encoded_len() error
instead of panicking with expect, changing its return type accordingly. Update
every caller in the verifier initialization path to handle the returned layout
error and map it to ProgramError before computing PDA sizes.

Source: Path instructions

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

1 participant