Skip to content

feat(platform)!: non-transferable tokens (PV14) - #5353

Merged
QuantumExplorer merged 3 commits into
v5.0-devfrom
claude/yapp-non-transferable-token-36a052
Oct 9, 2026
Merged

QuantumExplorer merged 3 commits into
v5.0-devfrom
claude/yapp-non-transferable-token-36a052

Conversation

@QuantumExplorer

@QuantumExplorer QuantumExplorer commented Oct 9, 2026 •

Copy link
Copy Markdown
Member

Basic explanation

A token can now be marked transferable: false. Holders keep what they are given and can spend it on the documents of the token's own contract by burning it, but nobody can hand it to anyone else, either with a TokenTransfer or by routing it through a contract that pays its owner.

Issue being fixed or feature implemented

Yappr wants YAPP to work this way: users get YAPP (claim or mint), spend it on posts, replies and likes, and cannot give it away. The only tool so far was to pause the token forever, and from 5.0.0-beta.3 a paused token also refuses document payments (TokenIsPausedError, 40711), burns included. Before protocol version 14 pausing never stopped a transfer either: any contract may charge another contract's token and pay its own owner, so anyone could move a "paused" token by registering such a contract.

What was done?

Before / after

Token configuration (format version 1, protocol version 14):

{ "$formatVersion": "1", "baseSupply": 0, "transferable": false, ... }
Before After, non-transferable token
TokenTransfer moves tokens (paused: refused, 40711) refused: TokenNotTransferableError (40726), in check tx and paid in a block
Own document type, effect: 0 (pay the contract owner) allowed refused at registration: NonTransferableTokenPaymentMustBurnError (10280), and again at payment time (40726)
Own document type, effect: 1 (burn) allowed (paused: refused at payment, 40711) allowed, and works at payment time (paused: still refused, 40711)
Another contract's document type charging it allowed refused at registration: TokenNotTransferableError (40726)
hasShieldedPool: true allowed refused unpaid: NonTransferableTokenShieldedPoolError (10279)
Pool threshold TokenConfigUpdate items (MinimumPoolNotesForOutgoing*) applied on any format 1 configuration refused on a format 1 configuration without a pool
Mint (optionally to a chosen destination), claims, direct purchase, burn, freeze, pause allowed unchanged

effect itself is not new: it has been part of tokenCost since protocol version 9 (0 pays the contract owner and is the default, 1 burns; only a contract's own token can be burned, 10261). The only change is that a non-transferable token requires effect: 1.

Changes

  • dpp: TokenConfigurationV1.transferable (serde default true, appended on the bincode wire), TokenConfigurationV1Getters::is_transferable (a V0 configuration is always transferable) and TokenConfigurationV1Setters::set_transferable. The canonical V0/V1 form keeps V1 for a non-transferable token without a pool: disabling the pool used to downgrade every V1 configuration to V0, which would have dropped the flag. Disabling the pool now clears its threshold and resets its rules whether or not the configuration downgrades, and TokenConfiguration::set_minimum_pool_notes_for_outgoing (refusing a threshold on a token without a pool) is the one place that rule lives; wasm-dpp2 delegates to it. TokenConfigurationV1::can_apply_token_configuration_item refuses the three pool threshold items on a configuration without a pool. validate_shielded_pool_rules refuses a non-transferable pooled token. The document type token cost parser refuses an own non-transferable token cost that pays the owner. Three consensus errors: 10279 and 10280 (basic, data contract band) and 40726 (state, token band), appended to their enums (discriminants 204, 205 and 173).
  • drive-abci: batch advanced structure validation 1 (protocol version 14 only) refuses a TokenTransfer of a non-transferable token. It reads the configuration from the contract the action already carries, so there is no extra read and the mempool refuses it too. Contract create and update state validation 0 refuse an external token cost on a non-transferable token, inside the loop that already fetches that contract to check the token exists, so fees do not change; the refusal names the document type and the tokenCost actions (data_contract_common::non_transferable_token_cost). Document-base state validation 2 (protocol version 14 only) refuses a payment to the contract owner in the contract's own non-transferable token again, from the configuration in hand, so the rule holds at payment time as well as at registration.
  • wasm-dpp maps the three errors. wasm-dpp2: TokenConfiguration accepts and exposes transferable (getter and setter); the pool threshold writer no longer assumes every format 1 configuration has a pool.
  • Docs: v14 note 89, new book page data-model/non-transferable-tokens.md, updates to contract-keywords/token-cost.md and data-model/token-shielded-pools.md.

The flag is fixed at creation: there is no TokenConfigUpdate item for it, and a contract update cannot change an existing token's configuration (the existing V1 field-guard test in validate_update now covers transferable). Every rule is therefore enforced at registration or on the transfer, and a document payment never has to look the flag up.

In-place changes to shipped generations

Generation Selected by Why consensus cannot change there
Document type token cost parser (parse_token_costs, shared by parser generations 1 to 3) protocol versions 9 to 14 The refusal needs a non-transferable token, which only a format 1 token configuration can be. The pre-activation gate (validate_is_allowed through validate_token_configurations) refuses format 1 unpaid before protocol version 14, ahead of any parsing.
validate_shielded_pool_rules every protocol version It returns early for a configuration without a pool, and both a pool and a non-transferable flag need format 1.
TokenConfigurationV1::can_apply_token_configuration_item (used by token config update state validation 0) every protocol version Only a format 1 configuration reaches it, and none exists before protocol version 14.
Data contract create state validation 0 protocol versions up to 13, and called by generation 1 at 14 The refusal needs the referenced external token to be non-transferable, a stored format 1 configuration, which no earlier version can store.
Data contract update state validation 0 protocol versions up to 13, and called by generation 1 at 14 Same as create.

Batch advanced structure validation 1 and document-base state validation 2 are selected only by protocol version 14, which is unreleased, so they are extended in place without a shipped-generation argument. A protocol version 13 test (should_still_refuse_a_non_transferable_token_as_an_unsupported_format_at_protocol_version_13) shows a contract with a non-transferable token and a pay-the-owner cost is still refused unpaid as an unsupported format there, before any edited code runs.

For Yappr social v14

  • Token 0: "$formatVersion": "1", "transferable": false, "startAsPaused": false.
  • post, reply, like and likeReply create costs: add "effect": 1. Left at the default (pay the owner), the contract is refused with 10280.
  • Hand YAPP out by minting (mintingAllowChoosingDestination is already true) or the once-per-identity distribution. A base supply would stay with the maker, who cannot send it either, so baseSupply: 0 is the clean choice.

How Has This Been Tested?

  • dpp, new: configuration tests (format switching, interaction with the pool flag in both orders with a threshold and rules, the threshold setter, threshold items refused without a pool, 10279, bincode, JSON and Value round trips) and parser tests (10280, burn accepted, transferable control). Existing groups pass: error discriminant pins, codes, token configuration, parser v3, validate_update (including the V1 field guard extended to transferable).
  • drive-abci, new: a transfer refused in check tx and in a block with balances unchanged; a document paid by burning a non-transferable token succeeds; a payment to the owner in it refused at payment time for a contract inserted without registration checks; a mint to another identity, a once-per-identity claim and a direct purchase still credit identities; the protocol version 13 refusal above; contract create with a burn cost accepted, paying the owner refused (10280), an external non-transferable token refused (40726), a pool refused unpaid (10279); a contract update adding a document type that charges an external non-transferable token refused (40726). Existing suites pass: token transitions, contract create and update, document creation and advanced structure (670 tests).
  • wasm-dpp2: TokenConfiguration.spec.ts against a fresh build, 16 passing including 7 new transferable cases.
  • cargo fmt --all; cargo clippy -p dpp -p drive-abci --all-features --all-targets -- -D warnings clean; wasm-dpp and wasm-dpp2 build for wasm32-unknown-unknown with no warnings in the changed files.

Breaking Changes

Consensus-breaking at protocol version 14: new validation rules and three new consensus errors. transferable is appended to TokenConfigurationV1's bincode encoding, like the other in-place protocol version 14 changes, so a network that already stored a format 1 token (a token with a shielded pool) under an earlier 5.0.0 beta cannot decode it with this build and needs a re-cut. Earlier protocol versions are unchanged.

Checklist:

  • I have performed a self-review of my own code
  • I have commented my code, particularly in hard-to-understand areas
  • I have added or updated relevant unit/integration/functional/e2e tests
  • I have added "!" to the title and described breaking changes in the corresponding section if my code contains any
  • I have made corresponding changes to the documentation if needed
  • If I added or changed GroveDB structure, I described it in the area's structure.rs, regenerated grovedb-structure.json, and checked the structure viewer link posted on this pull request

For repository code-owners and collaborators only

  • I have assigned this pull request to a milestone

🤖 Generated with Claude Code

Summary by CodeRabbit

  • New Features
    • Added support for configuring non-transferable tokens in protocol version 14. Tokens remain transferable by default; non-transferable tokens cannot be transferred, used for payments to a contract owner, or combined with shielded pools.
    • Document creation costs can still use a contract’s own non-transferable token when payment burns the tokens. Minting, claims, direct purchases, burns, freezing, and pausing remain available.
    • Shielded-pool threshold settings can only be changed when a token has a pool.
  • Documentation
    • Added guidance on non-transferable token behavior, configuration, and payment restrictions.

PR Hygiene · a2dcb1b

  • Bots — coderabbitai ✓ · thepastaclaw not yet — /skip-bots proceeds without the ones not yet reported
  • Self-review — post /self-reviewed
  • Build running
  • Approvals — you own every area touched; none needed

When every merge requirement is met, the PR Hygiene check passes. Reviewer limits do not block merging; other required GitHub checks and protections still apply.

QuantumExplorer and others added 2 commits October 9, 2026 05:32
A token configuration of format 1 gains `transferable`, true when absent
and fixed at creation. A non-transferable token cannot change hands:
- a TokenTransfer is refused (TokenNotTransferableError, 40726) in batch
  advanced structure validation 1, so the mempool refuses it too;
- a document type of its own contract must burn it rather than pay the
  contract owner (NonTransferableTokenPaymentMustBurnError, 10280);
- another contract's document type cannot charge it (40726 at contract
  create and update, reusing the read that checks the token exists);
- it cannot have a shielded pool (NonTransferableTokenShieldedPoolError,
  10279), since unshielding can pay any identity.

Mints, claims, direct purchases, burns, freezes, pause and burn payments
for its own documents are unchanged. Yappr needs this for YAPP: pausing
it forever also refuses its document payments from protocol version 14,
and before 14 never stopped transfers routed through a contract.

The parser, validate_shielded_pool_rules and contract create/update state
validation 0 are edited in place: only a format 1 configuration can be
non-transferable, and the pre-activation gate refuses that format before
protocol version 14.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
…ransferable-token-36a052

# Conflicts:
#	packages/rs-platform-version/src/version/v14.rs
@coderabbitai

coderabbitai Bot commented Oct 9, 2026 •

Copy link
Copy Markdown
Contributor

Review in Change Stack →

No actionable comments were generated in the recent review. 🎉

ℹ️ Recent review info
⚙️ Run configuration
  • Configuration used: Repository: dashpay/platform/.coderabbit.yaml
  • Review profile: CHILL
  • Plan: Advanced
  • Run ID: 9d53a644-d90e-48d9-8571-56111f08a28a
📥 Commits

Reviewing files that changed from the base of the PR and between 94de788 and a2dcb1b.

📒 Files selected for processing (20)
  • book/src/data-model/non-transferable-tokens.md
  • packages/rs-dpp/src/data_contract/associated_token/token_configuration/accessors/mod.rs
  • packages/rs-dpp/src/data_contract/associated_token/token_configuration/methods/can_apply_token_configuration_item/mod.rs
  • packages/rs-dpp/src/data_contract/associated_token/token_configuration/mod.rs
  • packages/rs-dpp/src/data_contract/associated_token/token_configuration/v1/mod.rs
  • packages/rs-dpp/src/data_contract/associated_token/token_configuration_item.rs
  • packages/rs-dpp/src/errors/consensus/state/token/token_not_transferable_error.rs
  • packages/rs-drive-abci/src/execution/validation/state_transition/state_transitions/batch/action_validation/document/document_base_transaction_action/state_v2/mod.rs
  • packages/rs-drive-abci/src/execution/validation/state_transition/state_transitions/batch/advanced_structure/v1/mod.rs
  • packages/rs-drive-abci/src/execution/validation/state_transition/state_transitions/batch/tests/token/non_transferable/mod.rs
  • packages/rs-drive-abci/src/execution/validation/state_transition/state_transitions/data_contract_common/mod.rs
  • packages/rs-drive-abci/src/execution/validation/state_transition/state_transitions/data_contract_common/non_transferable_token_cost.rs
  • packages/rs-drive-abci/src/execution/validation/state_transition/state_transitions/data_contract_create/mod.rs
  • packages/rs-drive-abci/src/execution/validation/state_transition/state_transitions/data_contract_create/state/v0/mod.rs
  • packages/rs-drive-abci/src/execution/validation/state_transition/state_transitions/data_contract_update/mod.rs
  • packages/rs-drive-abci/src/execution/validation/state_transition/state_transitions/data_contract_update/state/v0/mod.rs
  • packages/rs-drive-abci/src/execution/validation/state_transition/state_transitions/mod.rs
  • packages/rs-platform-version/src/version/v14.rs
  • packages/wasm-dpp2/src/tokens/configuration/token_configuration.rs
  • packages/wasm-dpp2/tests/unit/TokenConfiguration.spec.ts
🚧 Files skipped from review as they are similar to previous changes (1)
  • packages/rs-dpp/src/errors/consensus/state/token/token_not_transferable_error.rs

Included review availability: This review used your included allowance. Your plan provides up to 1 included review per hour; 0 remain after this review.


📝 Walkthrough

Walkthrough

Adds a transferable setting to token configuration and enforces restrictions for non-transferable tokens. Validation rejects token transfers, incompatible shielded pools, and disallowed document token costs. The change includes consensus errors, configuration APIs, tests, and protocol version 14 documentation.

Changes

Non-transferable tokens

Layer / File(s) Summary
Configuration and API
packages/rs-dpp/src/data_contract/associated_token/token_configuration/..., packages/rs-dpp/src/data_contract/methods/validate_update/v0/mod.rs, packages/wasm-dpp2/src/tokens/configuration/token_configuration.rs, packages/wasm-dpp2/tests/unit/TokenConfiguration.spec.ts
Token configurations now have a transferable setting that defaults to true. Rust and WASM APIs expose the setting. Configuration logic handles format-version changes and pool thresholds. Tests cover serialization, version transitions, and pool constraints.
Consensus error contracts
packages/rs-dpp/src/errors/consensus/..., packages/wasm-dpp/src/errors/consensus/consensus_error.rs
Adds consensus errors for non-transferable-token transfers, shielded pools, and owner-directed payments. Registers the new error variants and codes, and converts the errors to WASM errors.
Transfer and payment validation
packages/rs-drive-abci/src/execution/validation/state_transition/state_transitions/batch/...
Batch validation rejects direct transfers and owner-directed document payments involving non-transferable tokens. Tests cover rejected transfers, permitted burns, minting, claims, and purchases.
Contract registration and update validation
packages/rs-dpp/src/data_contract/document_type/class_methods/try_from_schema/..., packages/rs-drive-abci/src/execution/validation/state_transition/state_transitions/data_contract_..., packages/rs-drive-abci/src/execution/validation/state_transition/state_transitions/data_contract_common/...
Schema validation requires a burn for the contract’s own non-transferable token. Contract creation and updates reject external non-transferable token costs and non-transferable tokens with shielded pools.
Protocol and token-cost documentation
book/src/SUMMARY.md, book/src/contract-keywords/token-cost.md, book/src/data-model/*, packages/rs-platform-version/src/version/v14.rs
Documents token configuration, permitted operations, restrictions, and validation points. Updates the Data Model navigation and protocol version 14 notes.

Priority: ➖ Normal

Estimated code review effort: 4 (Complex) | ~50 minutes

Change: Feature

Sequence Diagram(s)

sequenceDiagram
  participant BatchValidation
  participant TokenConfiguration
  participant TokenNotTransferableError
  BatchValidation->>TokenConfiguration: Check is_transferable
  TokenConfiguration-->>BatchValidation: Return transferability
  BatchValidation->>TokenNotTransferableError: Return error when token is not transferable
Loading

Suggested reviewers: shumkov

Merge Risk: ⚪ Minimal · up to a2dcb

The checked transfer and contract-update paths preserve the stated restrictions. No merge-blocking issue remains after normal checks.

🚥 Pre-merge checks | ✅ 4 | ❌ 1

❌ Failed checks (1 warning)

Check name Status Explanation Resolution
Docstring Coverage Warning Docstring coverage is 64.37% which is insufficient. The required threshold is 80.00%. Docstring coverage is scoped to functions touched by this diff. Analyzed 87 functions across 34 files. (1 skipped:… Write docstrings for the functions missing them to satisfy the coverage threshold.
✅ Passed checks (4 passed)
Check name Status Explanation
Linked Issues check Passed Check skipped because no linked issues were found for this pull request.
Out of Scope Changes check Passed Check skipped because no linked issues were found for this pull request.
Description Check Passed Check skipped - CodeRabbit’s high-level summary is enabled.
Title check Passed The title clearly identifies the main change, non-transferable tokens, and the protocol version 14 release context. It is concise and specific.
Full details: Docstring Coverage

Explanation

Docstring coverage is 64.37% which is insufficient. The required threshold is 80.00%. Docstring coverage is scoped to functions touched by this diff. Analyzed 87 functions across 34 files. (1 skipped: 1 unsupported.)

  • Fix all pre-merge checks with AI
✨ Finishing Touches 💡 1
📝 Generate docstrings 💡
  • Commit to this branch
  • Create a new PR
🧪 Generate unit tests (beta)
  • Commit to this branch
  • Create a new PR
  • Autopilot · Keep fixing CodeRabbit findings and required CI, and resolving merge conflicts

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.

@github-actions github-actions Bot added this to the v5.0.0 milestone Oct 9, 2026
@github-actions

github-actions Bot commented Oct 9, 2026 •

Copy link
Copy Markdown
Contributor

Waiting for bot review — coderabbitai ✓ · thepastaclaw not yet. Wait for the missing reviews, or a writer can post /skip-bots to proceed without them; blocking findings still need addressing.
Full checklist in the description.

@github-actions github-actions Bot added the waiting-bots Waiting for the review bots to report on this head label Oct 9, 2026
@github-actions

github-actions Bot commented Oct 9, 2026 •

Copy link
Copy Markdown
Contributor

📖 Book Preview built successfully.

Download the preview from the workflow artifacts.
To view locally: download the artifact, unzip, and open index.html.

Updated at 2026-10-09T05:31:07.237Z

@thepastaclaw

thepastaclaw commented Oct 9, 2026 •

Copy link
Copy Markdown
Collaborator

⚡ Priority review — 1st in line, starts as soon as a slot frees (commit a2dcb1b)
Estimated review time once started: ~10 min (two-phase automated review; median of recent runs).

@thepastaclaw thepastaclaw left a comment

Copy link
Copy Markdown
Collaborator

Choose a reason for hiding this comment

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

Final validation — Phase 1 + Phase 2

Verified all supplied findings against head 94de788 and consolidated the overlapping reports into one non-blocking configuration-handling issue; no blocking finding was confirmed. This was a static review with no local builds or tests. The supplied CI snapshot reports successful Rust workspace and wasm-dpp2 tests, while several JavaScript suites and Docker builds remain pending.

🟡 1 suggestion(s)

Review provenance

Source: reviewer 1: gpt-6.1-sol (agent: phase2-reviewer, role: general); reviewer 2: gpt-6.1-sol (agent: phase2-reviewer, role: architecture-layering); reviewer 3: gpt-6.1-sol (agent: phase2-reviewer, role: ffi-engineer); reviewer 4: gpt-6.1-sol (agent: phase2-reviewer, role: platform-versioning); reviewer 5: gpt-6.1-sol (agent: phase2-reviewer, role: rust-quality); reviewer 6: gpt-6.1-sol (agent: phase2-reviewer, role: security-auditor); reviewer 7: gemini-3.8-flash-high (agent: phase1-reviewer, role: general); reviewer 8: gemini-3.8-flash-high (agent: phase1-reviewer, role: rust-quality); final verifier: gpt-6.1-sol (agent: sol-verifier, role: final-verifier)

  • Triage: critical by gpt-6.1-sol (effort low) — The cross-cutting change modifies consensus acceptance and token movement restrictions in batch/advanced_structure/v1/mod.rs and data_contract_create/state/v0/mod.rs, alongside token configuration serialization and canonicalization.
  • Phase 1 reviewers: gemini-3.8-flash-high — general (completed, effort high); agent phase1-reviewer, gemini-3.8-flash-high — rust-quality (completed, effort high); agent phase1-reviewer
  • Phase 1 model: gemini-3.8-flash-high — antigravity quota: weekly 65% left, 5h 73% left
  • Single stage: Phase 1 and Phase 2 reviewed this head side by side, with no blocker gate between them (triage tier)
  • Fresh verifier: gpt-6.1-sol — final-verifier; agent sol-verifier
  • Phase 2 reviewers: gpt-6.1-sol — general (completed, effort xhigh); agent phase2-reviewer, gpt-6.1-sol — architecture-layering (completed, effort xhigh); agent phase2-reviewer, gpt-6.1-sol — ffi-engineer (completed, effort xhigh); agent phase2-reviewer, gpt-6.1-sol — platform-versioning (completed, effort xhigh); agent phase2-reviewer, gpt-6.1-sol — rust-quality (completed, effort xhigh); agent phase2-reviewer, gpt-6.1-sol — security-auditor (completed, effort xhigh); agent phase2-reviewer
🤖 Prompt for all review comments with AI agents
These findings are from an automated code review. Verify each finding against the current code and only fix it if needed.

In `packages/rs-dpp/src/data_contract/associated_token/token_configuration/accessors/mod.rs`:
- [SUGGESTION] packages/rs-dpp/src/data_contract/associated_token/token_configuration/accessors/mod.rs:281-283: Clear pool-only settings when disabling a pool but retaining V1
  Retaining V1 preserves non-transferability, but now also retains the removed pool's threshold and change-control rules. Before registration, start with a pooled configuration whose threshold is Some(9), call set_transferable(false), then set_has_shielded_pool(false): the pool-less configuration still reports 9. Reversing those calls discards the threshold through the V0 downgrade. In WASM, assigning minimumPoolNotesForOutgoing = undefined cannot repair the retained value because the new no-pool branch returns success without modifying V1. Non-default pool rules also remain in all_used_group_positions() and all_change_control_rules().

  The same no-pool assumption is enforced only by the WASM threshold writer: native callers can construct a pool-less, non-transferable V1 with an in-bounds threshold, and validate_token_configurations accepts it. V1's threshold authorization/application methods likewise do not check pool presence. This produces inconsistent native/WASM behavior and conflicts with wasm-dpp2/CONVENTIONS.md's delegation rule.

  Clear the threshold and reset its change-control rules when disabling the pool, independently of whether the configuration downgrades. Define shared no-pool threshold handling in DPP and delegate the WASM writer to it. Extend the pool-removal tests with a nonzero threshold, non-default rules, both setter orders, and an explicit undefined assignment.

@github-actions

github-actions Bot commented Oct 9, 2026

Copy link
Copy Markdown
Contributor

Bots are done — your move: post /self-reviewed.
Full checklist in the description.

@github-actions github-actions Bot added waiting-self-review Waiting for the author to post /self-reviewed and removed waiting-bots Waiting for the review bots to report on this head labels Oct 9, 2026
- Removing a non-transferable token's pool clears the pool threshold and
  resets its rules even though the configuration stays at format 1;
  TokenConfiguration::set_minimum_pool_notes_for_outgoing holds the
  "a threshold needs a pool" rule and wasm-dpp2 delegates to it.
- The pool threshold TokenConfigUpdate items are refused on a format 1
  configuration without a pool.
- Document-base state validation 2 refuses paying the contract owner in
  the contract's own non-transferable token at payment time too, from the
  configuration in hand.
- The external token refusal names the document type and its tokenCost
  actions, through one shared helper, and the create and update loops
  look each position up once.
- Tests: protocol version 13 still refuses a non-transferable token as an
  unsupported format; mint, claim and direct purchase still credit
  identities; the payment-time refusal; both orders of removing a pool;
  the burn fixture no longer carries a cost registration would refuse;
  shared test helpers.
- Docs: v14 note renumbered to 89, base supply destination corrected.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
@github-actions

github-actions Bot commented Oct 9, 2026 •

Copy link
Copy Markdown
Contributor

Waiting for bot review — coderabbitai ✓ · thepastaclaw not yet. Wait for the missing reviews, or a writer can post /skip-bots to proceed without them; blocking findings still need addressing.
Full checklist in the description.

@github-actions github-actions Bot added waiting-bots Waiting for the review bots to report on this head and removed waiting-self-review Waiting for the author to post /self-reviewed labels Oct 9, 2026
@QuantumExplorer
QuantumExplorer merged commit 4ca59b1 into v5.0-dev Oct 9, 2026
28 of 30 checks passed
@QuantumExplorer
QuantumExplorer deleted the claude/yapp-non-transferable-token-36a052 branch October 9, 2026 05:39
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

waiting-bots Waiting for the review bots to report on this head

Projects

None yet

Development

Successfully merging this pull request may close these issues.

2 participants