# Remove gas rewards: stop paying part of the gas burned by a `FunctionCall` # back to the contract account as a reward. Set the reward from 30% to 0%. burnt_gas_reward: { old: { numerator: 3, denominator: 10 }, new: { numerator: 0, denominator: 1 }, } # Limit contracts to one local per two bytes of contract code, in addition to # the existing absolute limit on locals per contract. min_contract_size_per_local: { new: 2 } # Bound the combined size of a single receipt's resolved promise inputs. # The value is measured against the borsh-encoded `ReceivedData` of each input, # and is set to `max_length_returned_data` (4 MiB) plus the worst-case per-input # framing overhead (`max_number_input_data_dependencies` * 5 bytes = 640), so # that up to 4 MiB of promise-input data always fits regardless of how it is # split across data receipts (in particular, a single maximum-size return is # always accepted). max_receipt_total_input_size: {old: 4_294_967_295, new: 4_194_944} # Enable the ML-DSA-65 (FIPS 204) signature verification host function. ml_dsa_verify_host_fn: { old: false, new: true } # Charge the contract-loading fee and finalize as a gas-bearing abort when a # compiled module fails to load at `Module::deserialize`, instead of a # zero-gas nop. fix_contract_loading_error: { old: false, new: true } # Fix two related ML-DSA-65 cost-charging issues: # - gas keys: price exec (storage) fees on trie_id_len() and send (transmission) # fees on len(), instead of pricing the exec fee on the wire length; # - meta transactions: meter the inner delegate signature verification compute on # the receiver shard instead of the signer shard. fix_ml_dsa_cost_charging: { old: false, new: true } # Enable the sha3_256, sha3_384 and sha3_512 (FIPS-202) host functions. sha3_host_fns: { old: false, new: true } # Universal accounts: make `0u` account ids implicit, so a transfer can create # the account before its state init is applied. universal_accounts: { old: false, new: true } # Bound the number of storage entries a state-init action may carry. Each entry # costs `..._state_init_per_entry` to execute (200 Ggas), and that lands in the # receipt's congestion gas whether or not it is burnt, so an uncapped count lets # one receipt reserve several times `max_congestion_outgoing_gas` (10 PGas) and # pin its own shard at full outgoing congestion. # # 1_500 is just above the ceiling the contract-created path already has: a # contract pays the same 200 Ggas per entry out of its own gas, against # `max_total_prepaid_gas` of 300 Tgas, so it can never build more than ~1_449. # Capping at or above that keeps the two creation paths in agreement, and no # payable contract action becomes unrepresentable. At 1_500 entries the receipt # carries ~0.3 PGas of congestion, 3% of the cap. # # `DeterministicStateInit` has been live since protocol 82, so this is a real # tightening rather than a limit on a new action: the base value stays unlimited # and only takes effect here. Enforced for newly created receipts only, so # receipts already in flight at the upgrade keep executing. max_state_init_entries: {old: 4_294_967_295, new: 1_500}