Skip to content

perf(escrow): reduce TempoStreamChannel storage from 6 to 3 slots#2868

Open
decofe wants to merge 1 commit intomainfrom
jxom/stream-channel-gas-opt
Open

perf(escrow): reduce TempoStreamChannel storage from 6 to 3 slots#2868
decofe wants to merge 1 commit intomainfrom
jxom/stream-channel-gas-opt

Conversation

@decofe
Copy link
Member

@decofe decofe commented Feb 26, 2026

Summary

Reduces open() gas from ~1.3M to ~550-600k on Tempo by cutting storage slots from 6 to 3.

Motivation

Tempo charges 250k gas per new storage slot (TIP-1000). The Channel struct was using 6 slots — token and authorizedSigner are already baked into the channelId hash and don't need to be stored.

Changes

  • Remove token and authorizedSigner from Channel struct (derivable from channelId)
  • Repack struct: payer+closeRequestedAt+finalized (slot 0), payee (slot 1), deposit+settled (slot 2)
  • settle(), close(), topUp(), withdraw() now accept token, authorizedSigner, salt as calldata and verify via computeChannelId
  • requestClose() unchanged (doesn't use either field)
  • Add InvalidChannelParams error + _verifyChannelParams internal helper
  • Update ITempoStreamChannel interface

Downstream impact

ABI changes needed in:

  • tempoxyz/mpp-rs — update sol! ABI blocks for getChannel(), settle(), close(), withdraw(), topUp()
  • tempoxyz/presto — same sol! ABI updates in session.rs
  • wevm/mppx — equivalent TS-side ABI changes

All three already store token, authorizedSigner, salt locally — no architectural changes needed.

Testing

All 57 existing tests updated and passing.

Prompted by: jxom

Remove token and authorizedSigner from Channel struct (derivable from
channelId). Repack remaining fields for optimal slot layout:

  Slot 0: payer(20) + closeRequestedAt(8) + finalized(1) = 29 bytes
  Slot 1: payee(20) = 20 bytes
  Slot 2: deposit(16) + settled(16) = 32 bytes

Functions that need token/authorizedSigner now accept them as calldata
params and verify via channelId recomputation. requestClose() is
unchanged (doesn't use either field).

Estimated gas savings on Tempo (250k gas/SSTORE): ~750k gas on open().

Amp-Thread-ID: https://ampcode.com/threads/T-019c96fc-d95b-758c-908d-6264fa3872b4
Co-authored-by: Amp <amp@ampcode.com>
@github-actions
Copy link

📊 Tempo Precompiles Coverage

precompiles

Coverage: 20752/21815 lines (95.13%)

File details
File Lines Coverage
src/account_keychain/dispatch.rs 36/41 87.80%
src/account_keychain/mod.rs 1131/1150 98.35%
src/error.rs 139/158 87.97%
src/ip_validation.rs 10/10 100.00%
src/lib.rs 328/339 96.76%
src/nonce/dispatch.rs 19/23 82.61%
src/nonce/mod.rs 252/260 96.92%
src/stablecoin_dex/dispatch.rs 349/353 98.87%
src/stablecoin_dex/error.rs 51/51 100.00%
src/stablecoin_dex/mod.rs 2997/3093 96.90%
src/stablecoin_dex/order.rs 362/362 100.00%
src/stablecoin_dex/orderbook.rs 651/683 95.31%
src/storage/evm.rs 321/347 92.51%
src/storage/hashmap.rs 128/140 91.43%
src/storage/mod.rs 5/5 100.00%
src/storage/packing.rs 526/552 95.29%
src/storage/thread_local.rs 146/195 74.87%
src/storage/types/array.rs 211/262 80.53%
src/storage/types/bytes_like.rs 323/338 95.56%
src/storage/types/mapping.rs 148/148 100.00%
src/storage/types/mod.rs 67/91 73.63%
src/storage/types/primitives.rs 564/567 99.47%
src/storage/types/set.rs 454/474 95.78%
src/storage/types/slot.rs 282/296 95.27%
src/storage/types/vec.rs 1077/1095 98.36%
src/test_util.rs 194/231 83.98%
src/tip20/dispatch.rs 584/616 94.81%
src/tip20/mod.rs 1783/1854 96.17%
src/tip20/rewards.rs 444/487 91.17%
src/tip20/roles.rs 187/206 90.78%
src/tip20_factory/dispatch.rs 26/29 89.66%
src/tip20_factory/mod.rs 543/555 97.84%
src/tip403_registry/dispatch.rs 406/443 91.65%
src/tip403_registry/mod.rs 1338/1423 94.03%
src/tip_fee_manager/amm.rs 1111/1147 96.86%
src/tip_fee_manager/dispatch.rs 278/289 96.19%
src/tip_fee_manager/mod.rs 495/510 97.06%
src/validator_config/dispatch.rs 210/221 95.02%
src/validator_config/mod.rs 606/692 87.57%
src/validator_config_v2/dispatch.rs 201/214 93.93%
src/validator_config_v2/mod.rs 1769/1865 94.85%

contracts

Coverage: 209/383 lines (54.57%)

File details
File Lines Coverage
src/lib.rs 1/71 1.41%
src/precompiles/account_keychain.rs 24/30 80.00%
src/precompiles/nonce.rs 9/18 50.00%
src/precompiles/stablecoin_dex.rs 36/48 75.00%
src/precompiles/tip20.rs 52/70 74.29%
src/precompiles/tip20_factory.rs 6/12 50.00%
src/precompiles/tip403_registry.rs 12/15 80.00%
src/precompiles/tip_fee_manager.rs 21/45 46.67%
src/precompiles/validator_config.rs 12/26 46.15%
src/precompiles/validator_config_v2.rs 36/48 75.00%

Total: 20961/22198 lines (94.43%)

📦 Download full HTML report

@goksu goksu removed the request for review from a team February 26, 2026 18:55
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.

2 participants