Skip to main content

Multisig Module

Verify messages using validator signatures

The MultisigISM is one of the most commonly used ISM types. These ISMs verify that m of n Validators have attested to the validity of a particular interchain message.

Interface

MultisigISMs must implement the IMultisigIsm interface.

// SPDX-License-Identifier: MIT OR Apache-2.0
pragma solidity >=0.6.11;

import {IInterchainSecurityModule} from "../IInterchainSecurityModule.sol";

interface IMultisigIsm is IInterchainSecurityModule {
/**
* @notice Returns the set of validators responsible for verifying _message
* and the number of signatures required
* @dev Can change based on the content of _message
* @param _message Hyperlane formatted interchain message
* @return validators The array of validator addresses
* @return threshold The number of validator signatures needed
*/
function validatorsAndThreshold(
bytes calldata _message
) external view returns (address[] memory validators, uint8 threshold);
}

Configure

The hyperlane-monorepo contains MultisigISM implementations (including a legacy version and more gas-efficient versions deployable via factories) that application developers can deploy off-the-shelf, specifying their desired configuration.

Developers can configure, for each origin chain, a set of n Validators, and the number of validator signatures (m) needed to verify a message.

Validator signatures are not specific to an ISM. In other words, developers can configure their MultisigISM to use any validator that's running on Hyperlane and it will "just work".

Customize

The hyperlane-monorepo contains an abstract MultisigISM implementation that application developers can fork.

Developers simply need to implement the validatorsAndThreshold() function.

By creating a custom implementation, application developers can tailor the security provided by a MultisigISM to the needs of their application.

For example, a custom implementation could vary the number of signatures required, based on the content of the message being verified.

Example

import {TokenMessage} from "solidity/contracts/token/libs/TokenMessage.sol";

function validatorsAndThreshold(
bytes calldata _message
) public view returns (address[] memory, uint8) {
using TokenMessage for bytes;
// ...
uint256 memory tokenAmount = _message.amount();
if (tokenAmount < firstThreshold) {
// ... `addresses` ...
return (
addresses,
firstThresholdValidatorsNumber
);
} else if (tokenAmount < secondThreshold) {
// ... `addresses` ...
return (
addresses,
secondThresholdValidatorsNumber
);
} else ... {...}
}

// ...