Problem
The governance precompile (0x0805) allows submitting proposals via submitProposal, which accepts a JSON envelope containing messages. For parameter-change proposals (e.g. /cosmos.staking.v1beta1.MsgUpdateParams) and software upgrade proposals (/cosmos.upgrade.v1beta1.MsgSoftwareUpgrade), each message requires an authority field set to the governance module account's Bech32 address.
This address is deterministic — derived from authtypes.NewModuleAddress(govtypes.ModuleName) — but it is not exposed by any EVM precompile query. Smart contracts and dApps interacting with the governance precompile have no way to discover this address on-chain. They must either:
- Hardcode the address (breaks on chains with different bech32 prefixes)
- Query the Cosmos LCD/gRPC endpoint out-of-band (not possible from within a smart contract)
This effectively limits EVM-only dApps to text/signaling proposals (empty messages array), since parameter-change and software-upgrade proposals cannot construct valid messages without the authority address.
Reproducibility
- Start a localnet (
./local_node.sh)
- Try to submit a parameter-change proposal from a smart contract using the gov precompile
- The contract has no way to discover the
authority address needed for MsgUpdateParams — it must be hardcoded or fetched off-chain
# The authority address is deterministic but not queryable on-chain:
cast call 0x0000000000000000000000000000000000000805 "getParams()" --rpc-url http://localhost:8545
# Returns params, but no authority address
Potential Impact
- Severity: Medium — blocks an entire class of proposals from EVM contracts
- User scope: All EVM dApps using the governance precompile
- Downstream effects: Parameter changes and software upgrades cannot be proposed from smart contracts
Proposed Solution
Add a new view query getAuthority() to the governance precompile that returns the governance module account address in both Bech32 and EVM hex formats. This is a non-breaking, read-only addition.
Problem
The governance precompile (
0x0805) allows submitting proposals viasubmitProposal, which accepts a JSON envelope containingmessages. For parameter-change proposals (e.g./cosmos.staking.v1beta1.MsgUpdateParams) and software upgrade proposals (/cosmos.upgrade.v1beta1.MsgSoftwareUpgrade), each message requires anauthorityfield set to the governance module account's Bech32 address.This address is deterministic — derived from
authtypes.NewModuleAddress(govtypes.ModuleName)— but it is not exposed by any EVM precompile query. Smart contracts and dApps interacting with the governance precompile have no way to discover this address on-chain. They must either:This effectively limits EVM-only dApps to text/signaling proposals (empty
messagesarray), since parameter-change and software-upgrade proposals cannot construct valid messages without the authority address.Reproducibility
./local_node.sh)authorityaddress needed forMsgUpdateParams— it must be hardcoded or fetched off-chainPotential Impact
Proposed Solution
Add a new view query
getAuthority()to the governance precompile that returns the governance module account address in both Bech32 and EVM hex formats. This is a non-breaking, read-only addition.