{ "address": "0xd93CAc3de4215C5B7d2778B1732BAF7Ce1ab253C", "abi": [ { "anonymous": false, "inputs": [ { "indexed": true, "internalType": "address", "name": "cosaddr", "type": "address" }, { "indexed": false, "internalType": "uint256", "name": "chainId", "type": "uint256" } ], "name": "CosignerAdded", "type": "event" }, { "anonymous": false, "inputs": [ { "indexed": true, "internalType": "address", "name": "cosaddr", "type": "address" }, { "indexed": false, "internalType": "uint256", "name": "chainId", "type": "uint256" } ], "name": "CosignerRemoved", "type": "event" }, { "anonymous": false, "inputs": [ { "indexed": true, "internalType": "address", "name": "previousOwner", "type": "address" }, { "indexed": true, "internalType": "address", "name": "newOwner", "type": "address" } ], "name": "OwnershipTransferred", "type": "event" }, { "inputs": [], "name": "MIN_COSIGNER_REQUIRED", "outputs": [ { "internalType": "uint8", "name": "", "type": "uint8" } ], "stateMutability": "view", "type": "function" }, { "inputs": [ { "internalType": "address", "name": "cosaddr", "type": "address" }, { "internalType": "uint256", "name": "chainId", "type": "uint256" } ], "name": "addCosigner", "outputs": [], "stateMutability": "nonpayable", "type": "function" }, { "inputs": [ { "internalType": "address[]", "name": "cosaddrs", "type": "address[]" }, { "internalType": "uint256", "name": "chainId", "type": "uint256" } ], "name": "addCosignerBatch", "outputs": [], "stateMutability": "nonpayable", "type": "function" }, { "inputs": [ { "internalType": "uint256", "name": "chainId", "type": "uint256" } ], "name": "getCosignCount", "outputs": [ { "internalType": "uint8", "name": "", "type": "uint8" } ], "stateMutability": "view", "type": "function" }, { "inputs": [ { "internalType": "uint256", "name": "chainId", "type": "uint256" } ], "name": "getCosigners", "outputs": [ { "internalType": "address[]", "name": "", "type": "address[]" } ], "stateMutability": "view", "type": "function" }, { "inputs": [], "name": "owner", "outputs": [ { "internalType": "address", "name": "", "type": "address" } ], "stateMutability": "view", "type": "function" }, { "inputs": [ { "internalType": "address", "name": "cosaddr", "type": "address" } ], "name": "removeCosigner", "outputs": [], "stateMutability": "nonpayable", "type": "function" }, { "inputs": [ { "internalType": "address[]", "name": "cosaddrs", "type": "address[]" } ], "name": "removeCosignerBatch", "outputs": [], "stateMutability": "nonpayable", "type": "function" }, { "inputs": [], "name": "renounceOwnership", "outputs": [], "stateMutability": "nonpayable", "type": "function" }, { "inputs": [ { "internalType": "bytes4", "name": "interfaceId", "type": "bytes4" } ], "name": "supportsInterface", "outputs": [ { "internalType": "bool", "name": "", "type": "bool" } ], "stateMutability": "view", "type": "function" }, { "inputs": [ { "internalType": "address", "name": "newOwner", "type": "address" } ], "name": "transferOwnership", "outputs": [], "stateMutability": "nonpayable", "type": "function" }, { "inputs": [ { "internalType": "bytes32", "name": "commitment", "type": "bytes32" }, { "internalType": "uint256", "name": "chainId", "type": "uint256" }, { "internalType": "bytes[]", "name": "signatures", "type": "bytes[]" } ], "name": "verify", "outputs": [ { "internalType": "bool", "name": "", "type": "bool" } ], "stateMutability": "view", "type": "function" } ], "transactionHash": "0xd16ab0523b6a0c93b752e9cfec0d8ffd81d0024710f74fcb10c5c0e547865d36", "receipt": { "to": null, "from": "0x4A9C1E6f19BEf400C1cDb84de0601dD5E3Fc9706", "contractAddress": "0xd93CAc3de4215C5B7d2778B1732BAF7Ce1ab253C", "transactionIndex": 36, "gasUsed": "1255231", "logsBloom": "0x00000000000000000000000000000000000000000020000000800000000000000001000000000000000000000000000000008000000000000000000000000000000004000000000000000000000000800001000000000000000100000000000000000000020000200000000000000800000000000000000080000000000000400000000000000000800000000000000000000000000000000000000000000000200000000000000000000200000000000000000000000000000000000000004400000000000000000001000000000000000000000000000000100000000020000000000000000000100000000000000000000000000008000000000000100000", "blockHash": "0xc6aebffe403da437e253c777ae454da7eae85d415efbaf640c3f50b439871515", "transactionHash": "0xd16ab0523b6a0c93b752e9cfec0d8ffd81d0024710f74fcb10c5c0e547865d36", "logs": [ { "transactionIndex": 36, "blockNumber": 22325826, "transactionHash": "0xd16ab0523b6a0c93b752e9cfec0d8ffd81d0024710f74fcb10c5c0e547865d36", "address": "0xd93CAc3de4215C5B7d2778B1732BAF7Ce1ab253C", "topics": [ "0x8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e0", "0x0000000000000000000000000000000000000000000000000000000000000000", "0x0000000000000000000000004a9c1e6f19bef400c1cdb84de0601dd5e3fc9706" ], "data": "0x", "logIndex": 225, "blockHash": "0xc6aebffe403da437e253c777ae454da7eae85d415efbaf640c3f50b439871515" }, { "transactionIndex": 36, "blockNumber": 22325826, "transactionHash": "0xd16ab0523b6a0c93b752e9cfec0d8ffd81d0024710f74fcb10c5c0e547865d36", "address": "0x0000000000000000000000000000000000001010", "topics": [ "0x4dfe1bbbcf077ddc3e01291eea2d5c70c2b422b415d95645b9adcfd678cb1d63", "0x0000000000000000000000000000000000000000000000000000000000001010", "0x0000000000000000000000004a9c1e6f19bef400c1cdb84de0601dd5e3fc9706", "0x0000000000000000000000007b5000af8ab69fd59eb0d4f5762bff57c9c04385" ], "data": "0x0000000000000000000000000000000000000000000000000085c8c7400e7b3f0000000000000000000000000000000000000000000000000de0b6b3a764000000000000000000000000000000000000000000000000b241b34b1a0304be39b30000000000000000000000000000000000000000000000000d5aedec675584c100000000000000000000000000000000000000000000b241b3d0e2ca44ccb4f2", "logIndex": 226, "blockHash": "0xc6aebffe403da437e253c777ae454da7eae85d415efbaf640c3f50b439871515" } ], "blockNumber": 22325826, "cumulativeGasUsed": "8757993", "status": 1, "byzantium": true }, "args": [], "solcInputHash": "4b226e48919e387d495ca981a6b5bf20", "metadata": "{\"compiler\":{\"version\":\"0.8.4+commit.c7e474f2\"},\"language\":\"Solidity\",\"output\":{\"abi\":[{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"internalType\":\"address\",\"name\":\"cosaddr\",\"type\":\"address\"},{\"indexed\":false,\"internalType\":\"uint256\",\"name\":\"chainId\",\"type\":\"uint256\"}],\"name\":\"CosignerAdded\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"internalType\":\"address\",\"name\":\"cosaddr\",\"type\":\"address\"},{\"indexed\":false,\"internalType\":\"uint256\",\"name\":\"chainId\",\"type\":\"uint256\"}],\"name\":\"CosignerRemoved\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"internalType\":\"address\",\"name\":\"previousOwner\",\"type\":\"address\"},{\"indexed\":true,\"internalType\":\"address\",\"name\":\"newOwner\",\"type\":\"address\"}],\"name\":\"OwnershipTransferred\",\"type\":\"event\"},{\"inputs\":[],\"name\":\"MIN_COSIGNER_REQUIRED\",\"outputs\":[{\"internalType\":\"uint8\",\"name\":\"\",\"type\":\"uint8\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"cosaddr\",\"type\":\"address\"},{\"internalType\":\"uint256\",\"name\":\"chainId\",\"type\":\"uint256\"}],\"name\":\"addCosigner\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address[]\",\"name\":\"cosaddrs\",\"type\":\"address[]\"},{\"internalType\":\"uint256\",\"name\":\"chainId\",\"type\":\"uint256\"}],\"name\":\"addCosignerBatch\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"uint256\",\"name\":\"chainId\",\"type\":\"uint256\"}],\"name\":\"getCosignCount\",\"outputs\":[{\"internalType\":\"uint8\",\"name\":\"\",\"type\":\"uint8\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"uint256\",\"name\":\"chainId\",\"type\":\"uint256\"}],\"name\":\"getCosigners\",\"outputs\":[{\"internalType\":\"address[]\",\"name\":\"\",\"type\":\"address[]\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"owner\",\"outputs\":[{\"internalType\":\"address\",\"name\":\"\",\"type\":\"address\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"cosaddr\",\"type\":\"address\"}],\"name\":\"removeCosigner\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address[]\",\"name\":\"cosaddrs\",\"type\":\"address[]\"}],\"name\":\"removeCosignerBatch\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"renounceOwnership\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"bytes4\",\"name\":\"interfaceId\",\"type\":\"bytes4\"}],\"name\":\"supportsInterface\",\"outputs\":[{\"internalType\":\"bool\",\"name\":\"\",\"type\":\"bool\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"newOwner\",\"type\":\"address\"}],\"name\":\"transferOwnership\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"bytes32\",\"name\":\"commitment\",\"type\":\"bytes32\"},{\"internalType\":\"uint256\",\"name\":\"chainId\",\"type\":\"uint256\"},{\"internalType\":\"bytes[]\",\"name\":\"signatures\",\"type\":\"bytes[]\"}],\"name\":\"verify\",\"outputs\":[{\"internalType\":\"bool\",\"name\":\"\",\"type\":\"bool\"}],\"stateMutability\":\"view\",\"type\":\"function\"}],\"devdoc\":{\"kind\":\"dev\",\"methods\":{\"owner()\":{\"details\":\"Returns the address of the current owner.\"},\"renounceOwnership()\":{\"details\":\"Leaves the contract without owner. It will not be possible to call `onlyOwner` functions anymore. Can only be called by the current owner. NOTE: Renouncing ownership will leave the contract without an owner, thereby removing any functionality that is only available to the owner.\"},\"supportsInterface(bytes4)\":{\"details\":\"See {IERC165-supportsInterface}.\"},\"transferOwnership(address)\":{\"details\":\"Transfers ownership of the contract to a new account (`newOwner`). Can only be called by the current owner.\"}},\"version\":1},\"userdoc\":{\"kind\":\"user\",\"methods\":{},\"version\":1}},\"settings\":{\"compilationTarget\":{\"contracts/managers/BridgeCosignerManager.sol\":\"BridgeCosignerManager\"},\"evmVersion\":\"berlin\",\"metadata\":{\"bytecodeHash\":\"ipfs\",\"useLiteralContent\":true},\"optimizer\":{\"enabled\":true,\"runs\":200},\"remappings\":[]},\"sources\":{\"@openzeppelin/contracts/access/Ownable.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\n\\npragma solidity ^0.8.0;\\n\\nimport \\\"../utils/Context.sol\\\";\\n\\n/**\\n * @dev Contract module which provides a basic access control mechanism, where\\n * there is an account (an owner) that can be granted exclusive access to\\n * specific functions.\\n *\\n * By default, the owner account will be the one that deploys the contract. This\\n * can later be changed with {transferOwnership}.\\n *\\n * This module is used through inheritance. It will make available the modifier\\n * `onlyOwner`, which can be applied to your functions to restrict their use to\\n * the owner.\\n */\\nabstract contract Ownable is Context {\\n address private _owner;\\n\\n event OwnershipTransferred(address indexed previousOwner, address indexed newOwner);\\n\\n /**\\n * @dev Initializes the contract setting the deployer as the initial owner.\\n */\\n constructor() {\\n _setOwner(_msgSender());\\n }\\n\\n /**\\n * @dev Returns the address of the current owner.\\n */\\n function owner() public view virtual returns (address) {\\n return _owner;\\n }\\n\\n /**\\n * @dev Throws if called by any account other than the owner.\\n */\\n modifier onlyOwner() {\\n require(owner() == _msgSender(), \\\"Ownable: caller is not the owner\\\");\\n _;\\n }\\n\\n /**\\n * @dev Leaves the contract without owner. It will not be possible to call\\n * `onlyOwner` functions anymore. Can only be called by the current owner.\\n *\\n * NOTE: Renouncing ownership will leave the contract without an owner,\\n * thereby removing any functionality that is only available to the owner.\\n */\\n function renounceOwnership() public virtual onlyOwner {\\n _setOwner(address(0));\\n }\\n\\n /**\\n * @dev Transfers ownership of the contract to a new account (`newOwner`).\\n * Can only be called by the current owner.\\n */\\n function transferOwnership(address newOwner) public virtual onlyOwner {\\n require(newOwner != address(0), \\\"Ownable: new owner is the zero address\\\");\\n _setOwner(newOwner);\\n }\\n\\n function _setOwner(address newOwner) private {\\n address oldOwner = _owner;\\n _owner = newOwner;\\n emit OwnershipTransferred(oldOwner, newOwner);\\n }\\n}\\n\",\"keccak256\":\"0x6bb804a310218875e89d12c053e94a13a4607cdf7cc2052f3e52bd32a0dc50a1\",\"license\":\"MIT\"},\"@openzeppelin/contracts/utils/Context.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\n\\npragma solidity ^0.8.0;\\n\\n/**\\n * @dev Provides information about the current execution context, including the\\n * sender of the transaction and its data. While these are generally available\\n * via msg.sender and msg.data, they should not be accessed in such a direct\\n * manner, since when dealing with meta-transactions the account sending and\\n * paying for execution may not be the actual sender (as far as an application\\n * is concerned).\\n *\\n * This contract is only required for intermediate, library-like contracts.\\n */\\nabstract contract Context {\\n function _msgSender() internal view virtual returns (address) {\\n return msg.sender;\\n }\\n\\n function _msgData() internal view virtual returns (bytes calldata) {\\n return msg.data;\\n }\\n}\\n\",\"keccak256\":\"0x90565a39ae45c80f0468dc96c7b20d0afc3055f344c8203a0c9258239f350b9f\",\"license\":\"MIT\"},\"@openzeppelin/contracts/utils/cryptography/ECDSA.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\n\\npragma solidity ^0.8.0;\\n\\n/**\\n * @dev Elliptic Curve Digital Signature Algorithm (ECDSA) operations.\\n *\\n * These functions can be used to verify that a message was signed by the holder\\n * of the private keys of a given address.\\n */\\nlibrary ECDSA {\\n enum RecoverError {\\n NoError,\\n InvalidSignature,\\n InvalidSignatureLength,\\n InvalidSignatureS,\\n InvalidSignatureV\\n }\\n\\n function _throwError(RecoverError error) private pure {\\n if (error == RecoverError.NoError) {\\n return; // no error: do nothing\\n } else if (error == RecoverError.InvalidSignature) {\\n revert(\\\"ECDSA: invalid signature\\\");\\n } else if (error == RecoverError.InvalidSignatureLength) {\\n revert(\\\"ECDSA: invalid signature length\\\");\\n } else if (error == RecoverError.InvalidSignatureS) {\\n revert(\\\"ECDSA: invalid signature 's' value\\\");\\n } else if (error == RecoverError.InvalidSignatureV) {\\n revert(\\\"ECDSA: invalid signature 'v' value\\\");\\n }\\n }\\n\\n /**\\n * @dev Returns the address that signed a hashed message (`hash`) with\\n * `signature` or error string. This address can then be used for verification purposes.\\n *\\n * The `ecrecover` EVM opcode allows for malleable (non-unique) signatures:\\n * this function rejects them by requiring the `s` value to be in the lower\\n * half order, and the `v` value to be either 27 or 28.\\n *\\n * IMPORTANT: `hash` _must_ be the result of a hash operation for the\\n * verification to be secure: it is possible to craft signatures that\\n * recover to arbitrary addresses for non-hashed data. A safe way to ensure\\n * this is by receiving a hash of the original message (which may otherwise\\n * be too long), and then calling {toEthSignedMessageHash} on it.\\n *\\n * Documentation for signature generation:\\n * - with https://web3js.readthedocs.io/en/v1.3.4/web3-eth-accounts.html#sign[Web3.js]\\n * - with https://docs.ethers.io/v5/api/signer/#Signer-signMessage[ethers]\\n *\\n * _Available since v4.3._\\n */\\n function tryRecover(bytes32 hash, bytes memory signature) internal pure returns (address, RecoverError) {\\n // Check the signature length\\n // - case 65: r,s,v signature (standard)\\n // - case 64: r,vs signature (cf https://eips.ethereum.org/EIPS/eip-2098) _Available since v4.1._\\n if (signature.length == 65) {\\n bytes32 r;\\n bytes32 s;\\n uint8 v;\\n // ecrecover takes the signature parameters, and the only way to get them\\n // currently is to use assembly.\\n assembly {\\n r := mload(add(signature, 0x20))\\n s := mload(add(signature, 0x40))\\n v := byte(0, mload(add(signature, 0x60)))\\n }\\n return tryRecover(hash, v, r, s);\\n } else if (signature.length == 64) {\\n bytes32 r;\\n bytes32 vs;\\n // ecrecover takes the signature parameters, and the only way to get them\\n // currently is to use assembly.\\n assembly {\\n r := mload(add(signature, 0x20))\\n vs := mload(add(signature, 0x40))\\n }\\n return tryRecover(hash, r, vs);\\n } else {\\n return (address(0), RecoverError.InvalidSignatureLength);\\n }\\n }\\n\\n /**\\n * @dev Returns the address that signed a hashed message (`hash`) with\\n * `signature`. This address can then be used for verification purposes.\\n *\\n * The `ecrecover` EVM opcode allows for malleable (non-unique) signatures:\\n * this function rejects them by requiring the `s` value to be in the lower\\n * half order, and the `v` value to be either 27 or 28.\\n *\\n * IMPORTANT: `hash` _must_ be the result of a hash operation for the\\n * verification to be secure: it is possible to craft signatures that\\n * recover to arbitrary addresses for non-hashed data. A safe way to ensure\\n * this is by receiving a hash of the original message (which may otherwise\\n * be too long), and then calling {toEthSignedMessageHash} on it.\\n */\\n function recover(bytes32 hash, bytes memory signature) internal pure returns (address) {\\n (address recovered, RecoverError error) = tryRecover(hash, signature);\\n _throwError(error);\\n return recovered;\\n }\\n\\n /**\\n * @dev Overload of {ECDSA-tryRecover} that receives the `r` and `vs` short-signature fields separately.\\n *\\n * See https://eips.ethereum.org/EIPS/eip-2098[EIP-2098 short signatures]\\n *\\n * _Available since v4.3._\\n */\\n function tryRecover(\\n bytes32 hash,\\n bytes32 r,\\n bytes32 vs\\n ) internal pure returns (address, RecoverError) {\\n bytes32 s;\\n uint8 v;\\n assembly {\\n s := and(vs, 0x7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff)\\n v := add(shr(255, vs), 27)\\n }\\n return tryRecover(hash, v, r, s);\\n }\\n\\n /**\\n * @dev Overload of {ECDSA-recover} that receives the `r and `vs` short-signature fields separately.\\n *\\n * _Available since v4.2._\\n */\\n function recover(\\n bytes32 hash,\\n bytes32 r,\\n bytes32 vs\\n ) internal pure returns (address) {\\n (address recovered, RecoverError error) = tryRecover(hash, r, vs);\\n _throwError(error);\\n return recovered;\\n }\\n\\n /**\\n * @dev Overload of {ECDSA-tryRecover} that receives the `v`,\\n * `r` and `s` signature fields separately.\\n *\\n * _Available since v4.3._\\n */\\n function tryRecover(\\n bytes32 hash,\\n uint8 v,\\n bytes32 r,\\n bytes32 s\\n ) internal pure returns (address, RecoverError) {\\n // EIP-2 still allows signature malleability for ecrecover(). Remove this possibility and make the signature\\n // unique. Appendix F in the Ethereum Yellow paper (https://ethereum.github.io/yellowpaper/paper.pdf), defines\\n // the valid range for s in (301): 0 < s < secp256k1n \\u00f7 2 + 1, and for v in (302): v \\u2208 {27, 28}. Most\\n // signatures from current libraries generate a unique signature with an s-value in the lower half order.\\n //\\n // If your library generates malleable signatures, such as s-values in the upper range, calculate a new s-value\\n // with 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFEBAAEDCE6AF48A03BBFD25E8CD0364141 - s1 and flip v from 27 to 28 or\\n // vice versa. If your library also generates signatures with 0/1 for v instead 27/28, add 27 to v to accept\\n // these malleable signatures as well.\\n if (uint256(s) > 0x7FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF5D576E7357A4501DDFE92F46681B20A0) {\\n return (address(0), RecoverError.InvalidSignatureS);\\n }\\n if (v != 27 && v != 28) {\\n return (address(0), RecoverError.InvalidSignatureV);\\n }\\n\\n // If the signature is valid (and not malleable), return the signer address\\n address signer = ecrecover(hash, v, r, s);\\n if (signer == address(0)) {\\n return (address(0), RecoverError.InvalidSignature);\\n }\\n\\n return (signer, RecoverError.NoError);\\n }\\n\\n /**\\n * @dev Overload of {ECDSA-recover} that receives the `v`,\\n * `r` and `s` signature fields separately.\\n */\\n function recover(\\n bytes32 hash,\\n uint8 v,\\n bytes32 r,\\n bytes32 s\\n ) internal pure returns (address) {\\n (address recovered, RecoverError error) = tryRecover(hash, v, r, s);\\n _throwError(error);\\n return recovered;\\n }\\n\\n /**\\n * @dev Returns an Ethereum Signed Message, created from a `hash`. This\\n * produces hash corresponding to the one signed with the\\n * https://eth.wiki/json-rpc/API#eth_sign[`eth_sign`]\\n * JSON-RPC method as part of EIP-191.\\n *\\n * See {recover}.\\n */\\n function toEthSignedMessageHash(bytes32 hash) internal pure returns (bytes32) {\\n // 32 is the length in bytes of hash,\\n // enforced by the type signature above\\n return keccak256(abi.encodePacked(\\\"\\\\x19Ethereum Signed Message:\\\\n32\\\", hash));\\n }\\n\\n /**\\n * @dev Returns an Ethereum Signed Typed Data, created from a\\n * `domainSeparator` and a `structHash`. This produces hash corresponding\\n * to the one signed with the\\n * https://eips.ethereum.org/EIPS/eip-712[`eth_signTypedData`]\\n * JSON-RPC method as part of EIP-712.\\n *\\n * See {recover}.\\n */\\n function toTypedDataHash(bytes32 domainSeparator, bytes32 structHash) internal pure returns (bytes32) {\\n return keccak256(abi.encodePacked(\\\"\\\\x19\\\\x01\\\", domainSeparator, structHash));\\n }\\n}\\n\",\"keccak256\":\"0xbc991a1cf357ce19480831a40792c814238a3b5458134703682abd8aa39719fb\",\"license\":\"MIT\"},\"@openzeppelin/contracts/utils/introspection/ERC165.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\n\\npragma solidity ^0.8.0;\\n\\nimport \\\"./IERC165.sol\\\";\\n\\n/**\\n * @dev Implementation of the {IERC165} interface.\\n *\\n * Contracts that want to implement ERC165 should inherit from this contract and override {supportsInterface} to check\\n * for the additional interface id that will be supported. For example:\\n *\\n * ```solidity\\n * function supportsInterface(bytes4 interfaceId) public view virtual override returns (bool) {\\n * return interfaceId == type(MyInterface).interfaceId || super.supportsInterface(interfaceId);\\n * }\\n * ```\\n *\\n * Alternatively, {ERC165Storage} provides an easier to use but more expensive implementation.\\n */\\nabstract contract ERC165 is IERC165 {\\n /**\\n * @dev See {IERC165-supportsInterface}.\\n */\\n function supportsInterface(bytes4 interfaceId) public view virtual override returns (bool) {\\n return interfaceId == type(IERC165).interfaceId;\\n }\\n}\\n\",\"keccak256\":\"0x5718c5df9bd67ac68a796961df938821bb5dc0cd4c6118d77e9145afb187409b\",\"license\":\"MIT\"},\"@openzeppelin/contracts/utils/introspection/IERC165.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\n\\npragma solidity ^0.8.0;\\n\\n/**\\n * @dev Interface of the ERC165 standard, as defined in the\\n * https://eips.ethereum.org/EIPS/eip-165[EIP].\\n *\\n * Implementers can declare support of contract interfaces, which can then be\\n * queried by others ({ERC165Checker}).\\n *\\n * For an implementation, see {ERC165}.\\n */\\ninterface IERC165 {\\n /**\\n * @dev Returns true if this contract implements the interface defined by\\n * `interfaceId`. See the corresponding\\n * https://eips.ethereum.org/EIPS/eip-165#how-interfaces-are-identified[EIP section]\\n * to learn more about how these ids are created.\\n *\\n * This function call must use less than 30 000 gas.\\n */\\n function supportsInterface(bytes4 interfaceId) external view returns (bool);\\n}\\n\",\"keccak256\":\"0xa28007762d9da9db878dd421960c8cb9a10471f47ab5c1b3309bfe48e9e79ff4\",\"license\":\"MIT\"},\"contracts/interfaces/IBridgeCosignerManager.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.4;\\n\\ninterface IBridgeCosignerManager {\\n event CosignerAdded(address indexed cosaddr, uint256 chainId);\\n event CosignerRemoved(address indexed cosaddr, uint256 chainId);\\n struct Cosigner {\\n address addr;\\n uint256 chainId;\\n uint256 index;\\n bool active;\\n }\\n\\n function addCosigner(address cosaddr, uint256 chainId) external;\\n\\n function addCosignerBatch(address[] calldata cosaddrs, uint256 chainId)\\n external;\\n\\n function removeCosigner(address cosaddr) external;\\n\\n function removeCosignerBatch(address[] calldata cosaddrs) external;\\n\\n function getCosigners(uint256 chainId)\\n external\\n view\\n returns (address[] memory);\\n\\n function getCosignCount(uint256 chainId) external view returns (uint8);\\n\\n function verify(\\n bytes32 commitment,\\n uint256 chainId,\\n bytes[] calldata signatures\\n ) external view returns (bool);\\n}\\n\",\"keccak256\":\"0xfabdd8ef3a89d2a7a561c731347028ccdb596e05154054c61e51908f402b0dde\",\"license\":\"MIT\"},\"contracts/managers/BridgeCosignerManager.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.4;\\n\\nimport \\\"@openzeppelin/contracts/utils/introspection/ERC165.sol\\\";\\nimport \\\"@openzeppelin/contracts/access/Ownable.sol\\\";\\nimport \\\"@openzeppelin/contracts/utils/cryptography/ECDSA.sol\\\";\\n\\n\\nimport \\\"../interfaces/IBridgeCosignerManager.sol\\\";\\n\\ncontract BridgeCosignerManager is ERC165, Ownable, IBridgeCosignerManager {\\n using ECDSA for bytes32;\\n\\n uint8 public constant MIN_COSIGNER_REQUIRED = 2;\\n mapping(address => Cosigner) internal _cosigners;\\n mapping(uint256 => address[]) internal _cosaddrs;\\n\\n function supportsInterface(bytes4 interfaceId)\\n public\\n view\\n virtual\\n override\\n returns (bool)\\n {\\n return\\n interfaceId == type(IBridgeCosignerManager).interfaceId ||\\n super.supportsInterface(interfaceId);\\n }\\n\\n function addCosigner(address cosaddr, uint256 chainId)\\n public\\n override\\n onlyOwner\\n {\\n Cosigner memory cosigner = _cosigners[cosaddr];\\n require(!cosigner.active, \\\"BCM: ALREADY_EXIST\\\");\\n require(cosaddr != address(0), \\\"BCM: ZERO_ADDRESS\\\");\\n\\n uint256 currentChainId;\\n assembly {\\n currentChainId := chainid()\\n }\\n require(currentChainId != chainId, \\\"BCM: ONLY_EXTERNAL\\\");\\n\\n _cosaddrs[chainId].push(cosaddr);\\n _cosigners[cosaddr] = Cosigner(\\n cosaddr,\\n chainId,\\n _cosaddrs[chainId].length - 1,\\n true\\n );\\n\\n emit CosignerAdded(cosaddr, chainId);\\n }\\n\\n function addCosignerBatch(address[] calldata cosaddrs, uint256 chainId)\\n public\\n override\\n onlyOwner\\n {\\n require(cosaddrs.length != 0, \\\"BCM: EMPTY_BATCH\\\");\\n\\n for (uint256 i = 0; i < cosaddrs.length; i++) {\\n addCosigner(cosaddrs[i], chainId);\\n }\\n }\\n\\n function removeCosigner(address cosaddr) public override onlyOwner {\\n require(cosaddr != address(0), \\\"BCM: ZERO_ADDRESS\\\");\\n Cosigner memory cosigner = _cosigners[cosaddr];\\n require(cosigner.active, \\\"BCM: NOT_EXIST\\\");\\n\\n address[] storage addrs = _cosaddrs[cosigner.chainId];\\n\\n if (addrs.length > 1) {\\n // move last to rm slot\\n addrs[cosigner.index] = _cosaddrs[cosigner.chainId][\\n addrs.length - 1\\n ];\\n addrs.pop();\\n\\n // change indexing\\n address cosaddrLast = addrs[cosigner.index];\\n _cosigners[cosaddrLast].index = cosigner.index;\\n } else {\\n // just remove it as 1 left\\n addrs.pop();\\n }\\n\\n delete _cosigners[cosaddr];\\n\\n emit CosignerRemoved(cosigner.addr, cosigner.chainId);\\n }\\n\\n function removeCosignerBatch(address[] calldata cosaddrs)\\n public\\n override\\n onlyOwner\\n {\\n require(cosaddrs.length == 0, \\\"BCM: EMPTY_BATCH\\\");\\n\\n for (uint256 i = 0; i < cosaddrs.length; i++) {\\n removeCosigner(cosaddrs[i]);\\n }\\n }\\n\\n function getCosigners(uint256 chainId)\\n public\\n view\\n override\\n returns (address[] memory)\\n {\\n return _cosaddrs[chainId];\\n }\\n\\n function getCosignCount(uint256 chainId)\\n public\\n view\\n override\\n returns (uint8)\\n {\\n uint8 voteCount = (uint8(_cosaddrs[chainId].length) * 2) / 3; // 67%\\n return\\n MIN_COSIGNER_REQUIRED >= voteCount\\n ? MIN_COSIGNER_REQUIRED\\n : voteCount;\\n }\\n\\n function recover(bytes32 hash, bytes calldata signature)\\n internal\\n pure\\n returns (address)\\n {\\n return hash.toEthSignedMessageHash().recover(signature);\\n }\\n\\n function verify(\\n bytes32 commitment,\\n uint256 chainId,\\n bytes[] calldata signatures\\n ) external view override returns (bool) {\\n uint8 _required = getCosignCount(chainId);\\n if (_required > signatures.length) {\\n return false;\\n }\\n\\n address[] memory cached = new address[](signatures.length);\\n uint8 signersMatch;\\n\\n for (uint8 i = 0; i < signatures.length; i++) {\\n address signer = recover(commitment, signatures[i]);\\n Cosigner memory cosigner = _cosigners[signer];\\n\\n if (\\n cosigner.active &&\\n cosigner.chainId == chainId &&\\n !_inCache(cached, signer)\\n ) {\\n signersMatch++;\\n cached[i] = signer;\\n if (signersMatch == _required) return true;\\n }\\n }\\n\\n return false;\\n }\\n\\n function _inCache(address[] memory cached, address signer)\\n internal\\n pure\\n returns (bool hasCache)\\n {\\n for (uint8 j = 0; j < cached.length; j++) {\\n if (cached[j] == signer) {\\n hasCache = true;\\n break;\\n }\\n // prevent iteration if cache not updated in slot\\n if (cached[j] == address(0)) {\\n break;\\n }\\n }\\n }\\n}\\n\",\"keccak256\":\"0xc6c74b07af55f6b66ffc71ee4611baff09c3c743541dfbe2117d8aa860213d46\",\"license\":\"MIT\"}},\"version\":1}", "bytecode": "0x608060405234801561001057600080fd5b5061001a3361001f565b61006f565b600080546001600160a01b038381166001600160a01b0319831681178455604051919092169283917f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e09190a35050565b61154b8061007e6000396000f3fe608060405234801561001057600080fd5b50600436106100b45760003560e01c80637874e3bc116100715780637874e3bc146101565780638789b873146101695780638da5cb5b14610171578063c9807fd01461018c578063d371f9241461019f578063f2fde38b146101b257600080fd5b806301ffc9a7146100b957806318ffdbd3146100e15780633e6e8f68146100f657806345f251221461010957806358874d8f14610129578063715018a61461014e575b600080fd5b6100cc6100c736600461134f565b6101c5565b60405190151581526020015b60405180910390f35b6100f46100ef3660046112b4565b6101fc565b005b6100cc6101043660046112fe565b6102d0565b61011c610117366004611377565b6104a7565b6040516100d8919061138f565b61013c610137366004611377565b610513565b60405160ff90911681526020016100d8565b6100f461055a565b6100f461016436600461124b565b610590565b61013c600281565b6000546040516001600160a01b0390911681526020016100d8565b6100f461019a366004611274565b6107df565b6100f46101ad366004611231565b6108a4565b6100f46101c0366004611231565b610bd6565b60006001600160e01b03198216632cb096af60e11b14806101f657506301ffc9a760e01b6001600160e01b03198316145b92915050565b6000546001600160a01b0316331461022f5760405162461bcd60e51b8152600401610226906113dc565b60405180910390fd5b8161026f5760405162461bcd60e51b815260206004820152601060248201526f084869a74408a9aa0a8b2be8482a886960831b6044820152606401610226565b60005b828110156102ca576102b884848381811061029d57634e487b7160e01b600052603260045260246000fd5b90506020020160208101906102b29190611231565b83610590565b806102c2816114c4565b915050610272565b50505050565b6000806102dc85610513565b905060ff81168310156102f357600091505061049f565b60008367ffffffffffffffff81111561031c57634e487b7160e01b600052604160045260246000fd5b604051908082528060200260200182016040528015610345578160200160208202803683370190505b5090506000805b60ff81168611156104965760006103978a89898560ff1681811061038057634e487b7160e01b600052603260045260246000fd5b90506020028101906103929190611411565b610c71565b6001600160a01b0380821660009081526001602081815260409283902083516080810185528154909516855291820154908401526002810154918301919091526003015460ff16158015606083018190529293509091906103fb5750898160200151145b801561040e575061040c8583610cbe565b155b15610481578361041d816114df565b94505081858460ff168151811061044457634e487b7160e01b600052603260045260246000fd5b60200260200101906001600160a01b031690816001600160a01b0316815250508560ff168460ff161415610481576001965050505050505061049f565b5050808061048e906114df565b91505061034c565b50600093505050505b949350505050565b60008181526002602090815260409182902080548351818402810184019094528084526060939283018282801561050757602002820191906000526020600020905b81546001600160a01b031681526001909101906020018083116104e9575b50505050509050919050565b6000818152600260208190526040822054829160039161053291611484565b61053c9190611456565b905060ff8116600210156105505780610553565b60025b9392505050565b6000546001600160a01b031633146105845760405162461bcd60e51b8152600401610226906113dc565b61058e6000610d7e565b565b6000546001600160a01b031633146105ba5760405162461bcd60e51b8152600401610226906113dc565b6001600160a01b0380831660009081526001602081815260409283902083516080810185528154909516855291820154908401526002810154918301919091526003015460ff16158015606083015261064a5760405162461bcd60e51b81526020600482015260126024820152711090d34e881053149150511657d1561254d560721b6044820152606401610226565b6001600160a01b0383166106945760405162461bcd60e51b815260206004820152601160248201527042434d3a205a45524f5f4144445245535360781b6044820152606401610226565b46828114156106da5760405162461bcd60e51b81526020600482015260126024820152711090d34e8813d3931657d15615115493905360721b6044820152606401610226565b600083815260026020818152604080842080546001808201835582875284872090910180546001600160a01b0319166001600160a01b038c1690811790915583516080810185529081528085018a90529589905293909252905490830191610741916114ad565b8152600160209182018190526001600160a01b038781166000818152838552604090819020865181546001600160a01b031916941693909317835585850151938301939093558483015160028301556060909401516003909101805460ff1916911515919091179055518581527f0f0900314007cc69e519d583fb1873eba5aa4c24e2877bc4d2e44522dd73cd0e910160405180910390a250505050565b6000546001600160a01b031633146108095760405162461bcd60e51b8152600401610226906113dc565b801561084a5760405162461bcd60e51b815260206004820152601060248201526f084869a74408a9aa0a8b2be8482a886960831b6044820152606401610226565b60005b8181101561089f5761088d83838381811061087857634e487b7160e01b600052603260045260246000fd5b90506020020160208101906101ad9190611231565b80610897816114c4565b91505061084d565b505050565b6000546001600160a01b031633146108ce5760405162461bcd60e51b8152600401610226906113dc565b6001600160a01b0381166109185760405162461bcd60e51b815260206004820152601160248201527042434d3a205a45524f5f4144445245535360781b6044820152606401610226565b6001600160a01b0380821660009081526001602081815260409283902083516080810185528154909516855291820154908401526002810154918301919091526003015460ff161515606082018190526109a55760405162461bcd60e51b815260206004820152600e60248201526d1090d34e881393d517d1561254d560921b6044820152606401610226565b6020808201516000908152600290915260409020805460011015610b1157602080830151600090815260029091526040902081546109e5906001906114ad565b81548110610a0357634e487b7160e01b600052603260045260246000fd5b9060005260206000200160009054906101000a90046001600160a01b031681836040015181548110610a4557634e487b7160e01b600052603260045260246000fd5b9060005260206000200160006101000a8154816001600160a01b0302191690836001600160a01b0316021790555080805480610a9157634e487b7160e01b600052603160045260246000fd5b6001900381819060005260206000200160006101000a8154906001600160a01b0302191690559055600081836040015181548110610adf57634e487b7160e01b600052603260045260246000fd5b60009182526020808320909101546040808701516001600160a01b039092168452600190925291206002015550610b52565b80805480610b2f57634e487b7160e01b600052603160045260246000fd5b600082815260209020810160001990810180546001600160a01b03191690550190555b6001600160a01b03838116600090815260016020818152604080842080546001600160a01b031916815592830184905560028301939093556003909101805460ff191690558451858201519251928352909216917f61d7c9145a2e12d35dfb19f8fe0ff62e8eea82802cb7f5ddf745d3dc4bc32a23910160405180910390a2505050565b6000546001600160a01b03163314610c005760405162461bcd60e51b8152600401610226906113dc565b6001600160a01b038116610c655760405162461bcd60e51b815260206004820152602660248201527f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160448201526564647265737360d01b6064820152608401610226565b610c6e81610d7e565b50565b600061049f83838080601f016020809104026020016040519081016040528093929190818152602001838380828437600092019190915250610cb89250889150610dce9050565b90610e21565b6000805b83518160ff161015610d7757826001600160a01b0316848260ff1681518110610cfb57634e487b7160e01b600052603260045260246000fd5b60200260200101516001600160a01b03161415610d1b5760019150610d77565b60006001600160a01b0316848260ff1681518110610d4957634e487b7160e01b600052603260045260246000fd5b60200260200101516001600160a01b03161415610d6557610d77565b80610d6f816114df565b915050610cc2565b5092915050565b600080546001600160a01b038381166001600160a01b0319831681178455604051919092169283917f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e09190a35050565b6040517f19457468657265756d205369676e6564204d6573736167653a0a3332000000006020820152603c8101829052600090605c01604051602081830303815290604052805190602001209050919050565b6000806000610e308585610e45565b91509150610e3d81610eb5565b509392505050565b600080825160411415610e7c5760208301516040840151606085015160001a610e70878285856110b6565b94509450505050610eae565b825160401415610ea65760208301516040840151610e9b8683836111a3565b935093505050610eae565b506000905060025b9250929050565b6000816004811115610ed757634e487b7160e01b600052602160045260246000fd5b1415610ee05750565b6001816004811115610f0257634e487b7160e01b600052602160045260246000fd5b1415610f505760405162461bcd60e51b815260206004820152601860248201527f45434453413a20696e76616c6964207369676e617475726500000000000000006044820152606401610226565b6002816004811115610f7257634e487b7160e01b600052602160045260246000fd5b1415610fc05760405162461bcd60e51b815260206004820152601f60248201527f45434453413a20696e76616c6964207369676e6174757265206c656e677468006044820152606401610226565b6003816004811115610fe257634e487b7160e01b600052602160045260246000fd5b141561103b5760405162461bcd60e51b815260206004820152602260248201527f45434453413a20696e76616c6964207369676e6174757265202773272076616c604482015261756560f01b6064820152608401610226565b600481600481111561105d57634e487b7160e01b600052602160045260246000fd5b1415610c6e5760405162461bcd60e51b815260206004820152602260248201527f45434453413a20696e76616c6964207369676e6174757265202776272076616c604482015261756560f01b6064820152608401610226565b6000807f7fffffffffffffffffffffffffffffff5d576e7357a4501ddfe92f46681b20a08311156110ed575060009050600361119a565b8460ff16601b1415801561110557508460ff16601c14155b15611116575060009050600461119a565b6040805160008082526020820180845289905260ff881692820192909252606081018690526080810185905260019060a0016020604051602081039080840390855afa15801561116a573d6000803e3d6000fd5b5050604051601f1901519150506001600160a01b0381166111935760006001925092505061119a565b9150600090505b94509492505050565b6000806001600160ff1b03831660ff84901c601b016111c4878288856110b6565b935093505050935093915050565b80356001600160a01b03811681146111e957600080fd5b919050565b60008083601f8401126111ff578182fd5b50813567ffffffffffffffff811115611216578182fd5b6020830191508360208260051b8501011115610eae57600080fd5b600060208284031215611242578081fd5b610553826111d2565b6000806040838503121561125d578081fd5b611266836111d2565b946020939093013593505050565b60008060208385031215611286578182fd5b823567ffffffffffffffff81111561129c578283fd5b6112a8858286016111ee565b90969095509350505050565b6000806000604084860312156112c8578081fd5b833567ffffffffffffffff8111156112de578182fd5b6112ea868287016111ee565b909790965060209590950135949350505050565b60008060008060608587031215611313578081fd5b8435935060208501359250604085013567ffffffffffffffff811115611337578182fd5b611343878288016111ee565b95989497509550505050565b600060208284031215611360578081fd5b81356001600160e01b031981168114610553578182fd5b600060208284031215611388578081fd5b5035919050565b6020808252825182820181905260009190848201906040850190845b818110156113d05783516001600160a01b0316835292840192918401916001016113ab565b50909695505050505050565b6020808252818101527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572604082015260600190565b6000808335601e19843603018112611427578283fd5b83018035915067ffffffffffffffff821115611441578283fd5b602001915036819003821315610eae57600080fd5b600060ff83168061147557634e487b7160e01b82526012600452602482fd5b8060ff84160491505092915050565b600060ff821660ff84168160ff04811182151516156114a5576114a56114ff565b029392505050565b6000828210156114bf576114bf6114ff565b500390565b60006000198214156114d8576114d86114ff565b5060010190565b600060ff821660ff8114156114f6576114f66114ff565b60010192915050565b634e487b7160e01b600052601160045260246000fdfea26469706673582212202cdf2930fe4191a9ea034d69cfbbb644bf3945be9bf7a10b52d1fac6ef3541d464736f6c63430008040033", "deployedBytecode": "0x608060405234801561001057600080fd5b50600436106100b45760003560e01c80637874e3bc116100715780637874e3bc146101565780638789b873146101695780638da5cb5b14610171578063c9807fd01461018c578063d371f9241461019f578063f2fde38b146101b257600080fd5b806301ffc9a7146100b957806318ffdbd3146100e15780633e6e8f68146100f657806345f251221461010957806358874d8f14610129578063715018a61461014e575b600080fd5b6100cc6100c736600461134f565b6101c5565b60405190151581526020015b60405180910390f35b6100f46100ef3660046112b4565b6101fc565b005b6100cc6101043660046112fe565b6102d0565b61011c610117366004611377565b6104a7565b6040516100d8919061138f565b61013c610137366004611377565b610513565b60405160ff90911681526020016100d8565b6100f461055a565b6100f461016436600461124b565b610590565b61013c600281565b6000546040516001600160a01b0390911681526020016100d8565b6100f461019a366004611274565b6107df565b6100f46101ad366004611231565b6108a4565b6100f46101c0366004611231565b610bd6565b60006001600160e01b03198216632cb096af60e11b14806101f657506301ffc9a760e01b6001600160e01b03198316145b92915050565b6000546001600160a01b0316331461022f5760405162461bcd60e51b8152600401610226906113dc565b60405180910390fd5b8161026f5760405162461bcd60e51b815260206004820152601060248201526f084869a74408a9aa0a8b2be8482a886960831b6044820152606401610226565b60005b828110156102ca576102b884848381811061029d57634e487b7160e01b600052603260045260246000fd5b90506020020160208101906102b29190611231565b83610590565b806102c2816114c4565b915050610272565b50505050565b6000806102dc85610513565b905060ff81168310156102f357600091505061049f565b60008367ffffffffffffffff81111561031c57634e487b7160e01b600052604160045260246000fd5b604051908082528060200260200182016040528015610345578160200160208202803683370190505b5090506000805b60ff81168611156104965760006103978a89898560ff1681811061038057634e487b7160e01b600052603260045260246000fd5b90506020028101906103929190611411565b610c71565b6001600160a01b0380821660009081526001602081815260409283902083516080810185528154909516855291820154908401526002810154918301919091526003015460ff16158015606083018190529293509091906103fb5750898160200151145b801561040e575061040c8583610cbe565b155b15610481578361041d816114df565b94505081858460ff168151811061044457634e487b7160e01b600052603260045260246000fd5b60200260200101906001600160a01b031690816001600160a01b0316815250508560ff168460ff161415610481576001965050505050505061049f565b5050808061048e906114df565b91505061034c565b50600093505050505b949350505050565b60008181526002602090815260409182902080548351818402810184019094528084526060939283018282801561050757602002820191906000526020600020905b81546001600160a01b031681526001909101906020018083116104e9575b50505050509050919050565b6000818152600260208190526040822054829160039161053291611484565b61053c9190611456565b905060ff8116600210156105505780610553565b60025b9392505050565b6000546001600160a01b031633146105845760405162461bcd60e51b8152600401610226906113dc565b61058e6000610d7e565b565b6000546001600160a01b031633146105ba5760405162461bcd60e51b8152600401610226906113dc565b6001600160a01b0380831660009081526001602081815260409283902083516080810185528154909516855291820154908401526002810154918301919091526003015460ff16158015606083015261064a5760405162461bcd60e51b81526020600482015260126024820152711090d34e881053149150511657d1561254d560721b6044820152606401610226565b6001600160a01b0383166106945760405162461bcd60e51b815260206004820152601160248201527042434d3a205a45524f5f4144445245535360781b6044820152606401610226565b46828114156106da5760405162461bcd60e51b81526020600482015260126024820152711090d34e8813d3931657d15615115493905360721b6044820152606401610226565b600083815260026020818152604080842080546001808201835582875284872090910180546001600160a01b0319166001600160a01b038c1690811790915583516080810185529081528085018a90529589905293909252905490830191610741916114ad565b8152600160209182018190526001600160a01b038781166000818152838552604090819020865181546001600160a01b031916941693909317835585850151938301939093558483015160028301556060909401516003909101805460ff1916911515919091179055518581527f0f0900314007cc69e519d583fb1873eba5aa4c24e2877bc4d2e44522dd73cd0e910160405180910390a250505050565b6000546001600160a01b031633146108095760405162461bcd60e51b8152600401610226906113dc565b801561084a5760405162461bcd60e51b815260206004820152601060248201526f084869a74408a9aa0a8b2be8482a886960831b6044820152606401610226565b60005b8181101561089f5761088d83838381811061087857634e487b7160e01b600052603260045260246000fd5b90506020020160208101906101ad9190611231565b80610897816114c4565b91505061084d565b505050565b6000546001600160a01b031633146108ce5760405162461bcd60e51b8152600401610226906113dc565b6001600160a01b0381166109185760405162461bcd60e51b815260206004820152601160248201527042434d3a205a45524f5f4144445245535360781b6044820152606401610226565b6001600160a01b0380821660009081526001602081815260409283902083516080810185528154909516855291820154908401526002810154918301919091526003015460ff161515606082018190526109a55760405162461bcd60e51b815260206004820152600e60248201526d1090d34e881393d517d1561254d560921b6044820152606401610226565b6020808201516000908152600290915260409020805460011015610b1157602080830151600090815260029091526040902081546109e5906001906114ad565b81548110610a0357634e487b7160e01b600052603260045260246000fd5b9060005260206000200160009054906101000a90046001600160a01b031681836040015181548110610a4557634e487b7160e01b600052603260045260246000fd5b9060005260206000200160006101000a8154816001600160a01b0302191690836001600160a01b0316021790555080805480610a9157634e487b7160e01b600052603160045260246000fd5b6001900381819060005260206000200160006101000a8154906001600160a01b0302191690559055600081836040015181548110610adf57634e487b7160e01b600052603260045260246000fd5b60009182526020808320909101546040808701516001600160a01b039092168452600190925291206002015550610b52565b80805480610b2f57634e487b7160e01b600052603160045260246000fd5b600082815260209020810160001990810180546001600160a01b03191690550190555b6001600160a01b03838116600090815260016020818152604080842080546001600160a01b031916815592830184905560028301939093556003909101805460ff191690558451858201519251928352909216917f61d7c9145a2e12d35dfb19f8fe0ff62e8eea82802cb7f5ddf745d3dc4bc32a23910160405180910390a2505050565b6000546001600160a01b03163314610c005760405162461bcd60e51b8152600401610226906113dc565b6001600160a01b038116610c655760405162461bcd60e51b815260206004820152602660248201527f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160448201526564647265737360d01b6064820152608401610226565b610c6e81610d7e565b50565b600061049f83838080601f016020809104026020016040519081016040528093929190818152602001838380828437600092019190915250610cb89250889150610dce9050565b90610e21565b6000805b83518160ff161015610d7757826001600160a01b0316848260ff1681518110610cfb57634e487b7160e01b600052603260045260246000fd5b60200260200101516001600160a01b03161415610d1b5760019150610d77565b60006001600160a01b0316848260ff1681518110610d4957634e487b7160e01b600052603260045260246000fd5b60200260200101516001600160a01b03161415610d6557610d77565b80610d6f816114df565b915050610cc2565b5092915050565b600080546001600160a01b038381166001600160a01b0319831681178455604051919092169283917f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e09190a35050565b6040517f19457468657265756d205369676e6564204d6573736167653a0a3332000000006020820152603c8101829052600090605c01604051602081830303815290604052805190602001209050919050565b6000806000610e308585610e45565b91509150610e3d81610eb5565b509392505050565b600080825160411415610e7c5760208301516040840151606085015160001a610e70878285856110b6565b94509450505050610eae565b825160401415610ea65760208301516040840151610e9b8683836111a3565b935093505050610eae565b506000905060025b9250929050565b6000816004811115610ed757634e487b7160e01b600052602160045260246000fd5b1415610ee05750565b6001816004811115610f0257634e487b7160e01b600052602160045260246000fd5b1415610f505760405162461bcd60e51b815260206004820152601860248201527f45434453413a20696e76616c6964207369676e617475726500000000000000006044820152606401610226565b6002816004811115610f7257634e487b7160e01b600052602160045260246000fd5b1415610fc05760405162461bcd60e51b815260206004820152601f60248201527f45434453413a20696e76616c6964207369676e6174757265206c656e677468006044820152606401610226565b6003816004811115610fe257634e487b7160e01b600052602160045260246000fd5b141561103b5760405162461bcd60e51b815260206004820152602260248201527f45434453413a20696e76616c6964207369676e6174757265202773272076616c604482015261756560f01b6064820152608401610226565b600481600481111561105d57634e487b7160e01b600052602160045260246000fd5b1415610c6e5760405162461bcd60e51b815260206004820152602260248201527f45434453413a20696e76616c6964207369676e6174757265202776272076616c604482015261756560f01b6064820152608401610226565b6000807f7fffffffffffffffffffffffffffffff5d576e7357a4501ddfe92f46681b20a08311156110ed575060009050600361119a565b8460ff16601b1415801561110557508460ff16601c14155b15611116575060009050600461119a565b6040805160008082526020820180845289905260ff881692820192909252606081018690526080810185905260019060a0016020604051602081039080840390855afa15801561116a573d6000803e3d6000fd5b5050604051601f1901519150506001600160a01b0381166111935760006001925092505061119a565b9150600090505b94509492505050565b6000806001600160ff1b03831660ff84901c601b016111c4878288856110b6565b935093505050935093915050565b80356001600160a01b03811681146111e957600080fd5b919050565b60008083601f8401126111ff578182fd5b50813567ffffffffffffffff811115611216578182fd5b6020830191508360208260051b8501011115610eae57600080fd5b600060208284031215611242578081fd5b610553826111d2565b6000806040838503121561125d578081fd5b611266836111d2565b946020939093013593505050565b60008060208385031215611286578182fd5b823567ffffffffffffffff81111561129c578283fd5b6112a8858286016111ee565b90969095509350505050565b6000806000604084860312156112c8578081fd5b833567ffffffffffffffff8111156112de578182fd5b6112ea868287016111ee565b909790965060209590950135949350505050565b60008060008060608587031215611313578081fd5b8435935060208501359250604085013567ffffffffffffffff811115611337578182fd5b611343878288016111ee565b95989497509550505050565b600060208284031215611360578081fd5b81356001600160e01b031981168114610553578182fd5b600060208284031215611388578081fd5b5035919050565b6020808252825182820181905260009190848201906040850190845b818110156113d05783516001600160a01b0316835292840192918401916001016113ab565b50909695505050505050565b6020808252818101527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572604082015260600190565b6000808335601e19843603018112611427578283fd5b83018035915067ffffffffffffffff821115611441578283fd5b602001915036819003821315610eae57600080fd5b600060ff83168061147557634e487b7160e01b82526012600452602482fd5b8060ff84160491505092915050565b600060ff821660ff84168160ff04811182151516156114a5576114a56114ff565b029392505050565b6000828210156114bf576114bf6114ff565b500390565b60006000198214156114d8576114d86114ff565b5060010190565b600060ff821660ff8114156114f6576114f66114ff565b60010192915050565b634e487b7160e01b600052601160045260246000fdfea26469706673582212202cdf2930fe4191a9ea034d69cfbbb644bf3945be9bf7a10b52d1fac6ef3541d464736f6c63430008040033", "devdoc": { "kind": "dev", "methods": { "owner()": { "details": "Returns the address of the current owner." }, "renounceOwnership()": { "details": "Leaves the contract without owner. It will not be possible to call `onlyOwner` functions anymore. Can only be called by the current owner. NOTE: Renouncing ownership will leave the contract without an owner, thereby removing any functionality that is only available to the owner." }, "supportsInterface(bytes4)": { "details": "See {IERC165-supportsInterface}." }, "transferOwnership(address)": { "details": "Transfers ownership of the contract to a new account (`newOwner`). Can only be called by the current owner." } }, "version": 1 }, "userdoc": { "kind": "user", "methods": {}, "version": 1 }, "storageLayout": { "storage": [ { "astId": 1069, "contract": "contracts/managers/BridgeCosignerManager.sol:BridgeCosignerManager", "label": "_owner", "offset": 0, "slot": "0", "type": "t_address" }, { "astId": 3973, "contract": "contracts/managers/BridgeCosignerManager.sol:BridgeCosignerManager", "label": "_cosigners", "offset": 0, "slot": "1", "type": "t_mapping(t_address,t_struct(Cosigner)2791_storage)" }, { "astId": 3978, "contract": "contracts/managers/BridgeCosignerManager.sol:BridgeCosignerManager", "label": "_cosaddrs", "offset": 0, "slot": "2", "type": "t_mapping(t_uint256,t_array(t_address)dyn_storage)" } ], "types": { "t_address": { "encoding": "inplace", "label": "address", "numberOfBytes": "20" }, "t_array(t_address)dyn_storage": { "base": "t_address", "encoding": "dynamic_array", "label": "address[]", "numberOfBytes": "32" }, "t_bool": { "encoding": "inplace", "label": "bool", "numberOfBytes": "1" }, "t_mapping(t_address,t_struct(Cosigner)2791_storage)": { "encoding": "mapping", "key": "t_address", "label": "mapping(address => struct IBridgeCosignerManager.Cosigner)", "numberOfBytes": "32", "value": "t_struct(Cosigner)2791_storage" }, "t_mapping(t_uint256,t_array(t_address)dyn_storage)": { "encoding": "mapping", "key": "t_uint256", "label": "mapping(uint256 => address[])", "numberOfBytes": "32", "value": "t_array(t_address)dyn_storage" }, "t_struct(Cosigner)2791_storage": { "encoding": "inplace", "label": "struct IBridgeCosignerManager.Cosigner", "members": [ { "astId": 2784, "contract": "contracts/managers/BridgeCosignerManager.sol:BridgeCosignerManager", "label": "addr", "offset": 0, "slot": "0", "type": "t_address" }, { "astId": 2786, "contract": "contracts/managers/BridgeCosignerManager.sol:BridgeCosignerManager", "label": "chainId", "offset": 0, "slot": "1", "type": "t_uint256" }, { "astId": 2788, "contract": "contracts/managers/BridgeCosignerManager.sol:BridgeCosignerManager", "label": "index", "offset": 0, "slot": "2", "type": "t_uint256" }, { "astId": 2790, "contract": "contracts/managers/BridgeCosignerManager.sol:BridgeCosignerManager", "label": "active", "offset": 0, "slot": "3", "type": "t_bool" } ], "numberOfBytes": "128" }, "t_uint256": { "encoding": "inplace", "label": "uint256", "numberOfBytes": "32" } } } }