The Contract Manager module manages sudo call failures and provides resubmission capabilities for IBC-related contract operations.

Parameters

ParameterTypeDescription
sudo_call_gas_limituint64Maximum 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:
  1. Limits gas usage during sudo calls
  2. Captures and stores failures for later resubmission
  3. Converts out-of-gas panics to error responses