Skip to content

upstream: [execution] Port unbounded system object size changes (#10836) - #12672

Open
lollobene wants to merge 3 commits into
vm-lang/upstream/mainnet-1.47.1-1.50.1from
vm-lang/upstream/10836-unbounded-system-objects
Open

upstream: [execution] Port unbounded system object size changes (#10836)#12672
lollobene wants to merge 3 commits into
vm-lang/upstream/mainnet-1.47.1-1.50.1from
vm-lang/upstream/10836-unbounded-system-objects

Conversation

@lollobene

@lollobene lollobene commented Aug 14, 2026

Copy link
Copy Markdown
Contributor

Description of change

Ports the upstream removal of object size bounds on objects created or mutated by system transactions, plus its protocol gating. Objects written by the Genesis and System execution modes are no longer capped at max_move_object_size; exceeding it logs a debug_fatal! instead of failing the transaction. Same treatment for the safe-mode system-state update. Gated behind the new allow_unbounded_system_objects feature flag, enabled at protocol version 33.

Hash Description
6eefe1e0c03d528288478d5492ba2c30c2ba46e4 Remove object size bounds on system transactions (#22173)
0886cb100d7567a4ee6c8a121c6d688ee7c2715f Protocol gate unbounded system objects (#22187) (#22188)

Skipped upstream files

File Reason
crates/iota-indexer-alt/src/handlers/coin_balance_buckets.rs No iota-indexer-alt crate in IOTA
crates/iota-open-rpc/spec/openrpc.json IOTA's spec carries no feature-flag dump
iota-execution/{v0,v1,v2}/…/context.rs IOTA only has iota-execution/latest

Downstream adaptations

Area Upstream IOTA
object.rs impl MoveObject MoveStruct from iota-sdk-types behind the sealed MoveStructExt trait — both trait declaration and impl updated
new_from_execution signature (type_, has_public_transfer, …) (tag, …) — no has_public_transfer
Object ID for the log message MoveObject::id_opt(&contents) contents.get(..ObjectId::LENGTH).and_then(|id| ObjectId::from_bytes(id).ok()) — no id_opt downstream; get rather than indexing so a short contents yields None instead of panicking on the oversized-object path
Error kind MoveObjectTooBig ObjectTooBig
update_contents_advance_epoch_safe_mode pub(crate) Public — trait methods inherit trait visibility; the trait is sealed, so no external impls are possible
create_written_object unsafe fn Safe fn — no has_public_transfer invariant to uphold
iota-types dependencies iota-common and iota-metrics already present iota-common added; iota-metrics added under cfg(not(target_arch = "wasm32")), because debug_fatal! expands to iota_metrics::get_metrics() on non-wasm targets and iota-types also builds for wasm32
Protocol version Enabled at v84 Enabled at v33
Extra call sites 4 downstream-only test call sites pass system_mutation: false

Links to any relevant issues

Closes #10836

How the change has been tested

  • Basic tests (linting, compilation, formatting, unit/integration tests)

  • Patch-specific tests (correctness, functionality coverage)

  • I have added tests that prove my fix is effective or that my feature works

  • I have checked that new and existing unit tests pass locally with my changes

  • cargo ci-clippy (--all-targets --all-features -D warnings), cargo ci-license, cargo machete, cargo +nightly fmt --all — all clean.

  • cargo nextest run -p iota-types -p iota-protocol-config -p iota-json-rpc-types --lib — 224 passed.

  • cargo simtest -p iota-e2e-tests safe_mode — 3 passed (test_safe_mode_recovery, safe_mode_reconfig_test, epoch_info_verifies_safe_mode_boundary), covering the safe-mode epoch-advancement path this change touches.

  • Protocol-config snapshots regenerated; the only change is allow_unbounded_system_objects: true on the three v33 snapshots (default, Mainnet, Testnet).

No tests were added: both upstream commits ship without tests, and the new behaviour is only observable on a system transaction that writes an over-limit object.

Release Notes

  • Protocol: objects created or mutated by system transactions are no longer bounded by the max object size limit, gated by the allow_unbounded_system_objects feature flag (enabled at protocol version 33).

lollobene and others added 2 commits August 12, 2026 17:23
## Description

Allows objects created/mutated by system transactions to not be bounded
by normal limits and brings it in-line with the rest of the way we treat
system transactions and limit interactions.

## Test plan

CI

Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>
## Description

Forgot to add in the protocol gating when switching from a larger bound
to a feature flag. This adds in the proper protocol gating. This is a
reverse cherry pick so this has already landed in the release branch.

## Test plan

CI

Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>
@lollobene
lollobene requested review from a team as code owners August 14, 2026 11:27
@iota-ci iota-ci added sc-platform Issues related to the Smart Contract Platform group. vm-language Issues related to the VM & Language Team labels Aug 14, 2026
@lollobene
lollobene marked this pull request as draft August 14, 2026 11:29
@lollobene
lollobene marked this pull request as ready for review August 14, 2026 12:26
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

sc-platform Issues related to the Smart Contract Platform group. vm-language Issues related to the VM & Language Team

Projects

None yet

Development

Successfully merging this pull request may close these issues.

[execution] Evaluate and port upstream unbounded system object size changes

3 participants