Severity: HIGH · Contract · boundless-events + boundless-profile · blocks mainnet protocol-27 upgrade
Context
The network (mainnet + testnet) is on Protocol 27. PR #87 bumps soroban-sdk 23.5.2 → 27.0.0 (Rust 1.93, stellar-cli 27.0.0) so the contract is built against the current protocol. That PR is safe to merge to testnet, but a mainnet upgrade to the sdk-27 wasm carries a decode-compatibility risk that must be verified first.
Problem
Mainnet is live at 1.1.0, compiled with soroban-sdk 23.x, and holds real state (EventRecord, Winner, Submission, contributor rows, etc.). If we apply_upgrade to an sdk-27 wasm, every persisted row must still decode through the new SDK. A change in how any persisted type serializes across the SDK boundary would trap on read (Error(Object, UnexpectedSize)) — the same failure class that sank #83, but across an SDK version rather than a struct change.
The host test suite starts from empty state, so it does not exercise cross-version decode. Green tests are not evidence here.
Acceptance
- A test (or testnet exercise) that writes rows in the sdk-23 layout and reads them back through sdk-27 code for every persisted type:
EventRecord, Winner, Submission, contributor amount/index, cancellation state, the 1.3.0 prize keys, and instance/config keys.
- OR: deploy sdk-23 (1.1.0-equivalent), seed representative rows on testnet,
apply_upgrade to the sdk-27 wasm via the H6 timelocked path, and confirm every read path (get_event, get_winners, claim_*, start_cancel scans) works post-upgrade.
- Documented result in the mainnet-deploy runbook before the mainnet
propose_upgrade.
Notes
Severity: HIGH · Contract ·
boundless-events+boundless-profile· blocks mainnet protocol-27 upgradeContext
The network (mainnet + testnet) is on Protocol 27. PR #87 bumps
soroban-sdk23.5.2 → 27.0.0 (Rust 1.93, stellar-cli 27.0.0) so the contract is built against the current protocol. That PR is safe to merge totestnet, but a mainnet upgrade to the sdk-27 wasm carries a decode-compatibility risk that must be verified first.Problem
Mainnet is live at 1.1.0, compiled with soroban-sdk 23.x, and holds real state (
EventRecord,Winner,Submission, contributor rows, etc.). If weapply_upgradeto an sdk-27 wasm, every persisted row must still decode through the new SDK. A change in how any persisted type serializes across the SDK boundary would trap on read (Error(Object, UnexpectedSize)) — the same failure class that sank #83, but across an SDK version rather than a struct change.The host test suite starts from empty state, so it does not exercise cross-version decode. Green tests are not evidence here.
Acceptance
EventRecord,Winner,Submission, contributor amount/index, cancellation state, the 1.3.0 prize keys, and instance/config keys.apply_upgradeto the sdk-27 wasm via the H6 timelocked path, and confirm every read path (get_event,get_winners,claim_*,start_cancelscans) works post-upgrade.propose_upgrade.Notes