The Contract Manager module manages sudo call failures and provides resubmission capabilities for IBC-related contract operations.
Parameters
Parameter | Type | Description |
---|
sudo_call_gas_limit | uint64 | Maximum gas that can be used during a sudo call to a contract |
Queries
QueryParams
Retrieve the current module parameters.
CLI:
neutrond query contractmanager params
gRPC:
/neutron/contractmanager/params
Response:
{
"params": {
"sudo_call_gas_limit": "2000000"
}
}
QueryFailures
Query failures for all contracts or a specific contract address.
CLI:
# Query all failures
neutrond query contractmanager failures
# Query failures for specific contract
neutrond query contractmanager failures [address]
gRPC:
# All failures
GET /neutron/contractmanager/failures
# Failures for specific address
GET /neutron/contractmanager/failures/{address}
Example:
neutrond query contractmanager failures neutron1abcdef...
Response:
{
"failures": [
{
"address": "neutron1abcdef...",
"id": "1",
"sudo_payload": "<base64-encoded-payload>",
"error": "codespace: wasm, code: 5"
}
],
"pagination": {
"next_key": null,
"total": "1"
}
}
QueryAddressFailure
Query a specific failure by contract address and failure ID.
gRPC:
GET /neutron/contractmanager/failures/{address}/{failure_id}
Response:
{
"failure": {
"address": "neutron1abcdef...",
"id": "1",
"sudo_payload": "<base64-encoded-payload>",
"error": "codespace: wasm, code: 5"
}
}
QueryFailureDetails
Query detailed error information for a specific failure. This command searches transaction events for the full error message.
CLI:
neutrond query contractmanager failure-details [address] [failure-id]
Example:
neutrond query contractmanager failure-details neutron1abcdef... 1
Response:
dispatch: submessages: Generic error: Contract execution failed
Node Requirements: This query requires a node that indexes transactions and still has the relevant blocks available. If the node doesn’t index transactions or has cleared the block, you’ll get an error: “detailed failure error message not found in node events”.
Core Data Structure
Failure
message Failure {
// Address of the failed contract
string address = 1;
// Id of the failure under specific address
uint64 id = 2;
// Serialized MessageSudoCallback with Packet and Ack(if exists)
bytes sudo_payload = 3;
// Redacted error response of the sudo call. Full error is emitted as an event
string error = 4;
}
CosmWasm Bindings
ResubmitFailure Message
Allows contracts to resubmit their own failed operations:
pub enum NeutronMsg {
ResubmitFailure {
failure_id: u64,
},
// other messages...
}
Permissions: Only the original contract can resubmit its own failures.
ContractManagerFailures Query
Query failures for a specific contract:
pub enum NeutronQuery {
ContractManagerFailures {
address: String,
pagination: Option<PageRequest>,
},
// other queries...
}
Response:
pub struct FailuresResponse {
pub failures: Vec<Failure>,
pub pagination: Option<PageResponse>,
}
gRPC Service Definition
service Query {
// Parameters queries the parameters of the module.
rpc Params(QueryParamsRequest) returns (QueryParamsResponse);
// Queries a Failure by contract address and failure ID.
rpc AddressFailure(QueryFailureRequest) returns (QueryFailureResponse);
// Queries Failures by contract address.
rpc AddressFailures(QueryFailuresRequest) returns (QueryFailuresResponse);
// Queries a list of Failures occurred on the network.
rpc Failures(QueryFailuresRequest) returns (QueryFailuresResponse);
}
Key Concepts
- Sudo Gas Limit: Sudo calls are limited to prevent infinite recursion
- Failure Storage: Failed sudo calls are stored with full context for resubmission
- Error Redaction: Stored errors are redacted (codespace + code only) for determinism
- Resubmission: Contracts can resubmit their own failures without gas limits
- IBC Integration: Primarily used for IBC acknowledgement and timeout handling
SudoLimitWrapper
The module provides middleware that:
- Limits gas usage during sudo calls
- Captures and stores failures for later resubmission
- Converts out-of-gas panics to error responses