Source Code
Overview
MOVR Balance
MOVR Value
$0.00View more zero value Internal Transactions in Advanced View mode
Cross-Chain Transactions
Loading...
Loading
Contract Name:
Supervisor
Compiler Version
v0.8.2+commit.661d1103
Contract Source Code (Solidity Standard Json-Input format)
// SPDX-License-Identifier: BUSL-1.1
pragma solidity 0.8.2;
import "ECDSA.sol";
/// @title Supervisor is the guardian of YPool. It requires multiple validators to valid
/// the requests from users and workers and sign on them if valid.
contract Supervisor {
using ECDSA for bytes32;
/* ========== STATE VARIABLES ========== */
bytes32 public constant CLAIM_IDENTIFIER = 'SWAPPER_CLAIM';
bytes32 public constant SET_THRESHOLD_IDENTIFIER = 'SET_THRESHOLD';
bytes32 public constant SET_VALIDATOR_IDENTIFIER = 'SET_VALIDATOR';
bytes32 public constant LOCK_CLOSE_SWAP_AND_REFUND_IDENTIFIER = 'LOCK_CLOSE_SWAP_AND_REFUND';
bytes32 public constant BATCH_CLAIM_IDENTIFIER = 'BATCH_CLAIM';
bytes32 public constant VALIDATE_SWAP_IDENTIFIER = 'VALIDATE_SWAP_IDENTIFIER';
bytes32 public constant VALIDATE_XY_CROSS_CHAIN_IDENTIFIER = 'VALIDATE_XY_XCHAIN_IDENTIFIER';
// the chain ID contract located at
uint32 public chainId;
// check if the address is one of the validators
mapping (address => bool) public validators;
// number of validators
uint256 private validatorsNum;
// threshold to pass the signature validation
uint256 public threshold;
// current nonce for write functions
uint256 public nonce;
/// @dev Constuctor with chainId / validators / threshold
/// @param _chainId The chain ID located with
/// @param _validators Initial validator addresses
/// @param _threshold Initial threshold to pass the request validation
constructor(uint32 _chainId, address [] memory _validators, uint256 _threshold) {
chainId = _chainId;
for (uint256 i; i < _validators.length; i++) {
validators[_validators[i]] = true;
}
validatorsNum = _validators.length;
require(_threshold <= validatorsNum, "ERR_INVALID_THRESHOLD");
threshold = _threshold;
}
/* ========== VIEW FUNCTIONS ========== */
/// @notice Check if there are enough signed signatures to the signature hash
/// @param sigIdHash The signature hash to be signed
/// @param signatures Signed signatures by different validators
function checkSignatures(bytes32 sigIdHash, bytes[] memory signatures) public view {
require(signatures.length >= threshold, "ERR_NOT_ENOUGH_SIGNATURES");
address prevAddress = address(0);
for (uint i; i < threshold; i++) {
address recovered = sigIdHash.recover(signatures[i]);
require(validators[recovered], "ERR_NOT_VALIDATOR");
require(recovered > prevAddress, "ERR_WRONG_SIGNER_ORDER");
prevAddress = recovered;
}
}
/* ========== WRITE FUNCTIONS ========== */
/// @notice Change `threshold` by providing a correct nonce and enough signatures from validators
/// @param _threshold New `threshold`
/// @param _nonce The nonce to be processed
/// @param signatures Signed signatures by validators
function setThreshold(uint256 _threshold, uint256 _nonce, bytes[] memory signatures) external {
require(signatures.length >= threshold, "ERR_NOT_ENOUGH_SIGNATURES");
require(_nonce == nonce, "ERR_INVALID_NONCE");
require(_threshold > 0, "ERR_INVALID_THRESHOLD");
require(_threshold <= validatorsNum, "ERR_INVALID_THRESHOLD");
bytes32 sigId = keccak256(abi.encodePacked(SET_THRESHOLD_IDENTIFIER, address(this), chainId, _threshold, _nonce));
bytes32 sigIdHash = sigId.toEthSignedMessageHash();
checkSignatures(sigIdHash, signatures);
threshold = _threshold;
nonce++;
}
/// @notice Set / remove the validator address to be part of signatures committee
/// @param _validator The address to add or remove
/// @param flag `true` to add, `false` to remove
/// @param _nonce The nonce to be processed
/// @param signatures Signed signatures by validators
function setValidator(address _validator, bool flag, uint256 _nonce, bytes[] memory signatures) external {
require(_validator != address(0), "ERR_INVALID_VALIDATOR");
require(signatures.length >= threshold, "ERR_NOT_ENOUGH_SIGNATURES");
require(_nonce == nonce, "ERR_INVALID_NONCE");
require(flag != validators[_validator], "ERR_OPERATION_TO_VALIDATOR");
bytes32 sigId = keccak256(abi.encodePacked(SET_VALIDATOR_IDENTIFIER, address(this), chainId, _validator, flag, _nonce));
bytes32 sigIdHash = sigId.toEthSignedMessageHash();
checkSignatures(sigIdHash, signatures);
if (validators[_validator]) {
validatorsNum--;
validators[_validator] = false;
if (validatorsNum < threshold) threshold--;
} else {
validatorsNum++;
validators[_validator] = true;
}
nonce++;
}
}// SPDX-License-Identifier: MIT
pragma solidity ^0.8.0;
/**
* @dev Elliptic Curve Digital Signature Algorithm (ECDSA) operations.
*
* These functions can be used to verify that a message was signed by the holder
* of the private keys of a given address.
*/
library ECDSA {
enum RecoverError {
NoError,
InvalidSignature,
InvalidSignatureLength,
InvalidSignatureS,
InvalidSignatureV
}
function _throwError(RecoverError error) private pure {
if (error == RecoverError.NoError) {
return; // no error: do nothing
} else if (error == RecoverError.InvalidSignature) {
revert("ECDSA: invalid signature");
} else if (error == RecoverError.InvalidSignatureLength) {
revert("ECDSA: invalid signature length");
} else if (error == RecoverError.InvalidSignatureS) {
revert("ECDSA: invalid signature 's' value");
} else if (error == RecoverError.InvalidSignatureV) {
revert("ECDSA: invalid signature 'v' value");
}
}
/**
* @dev Returns the address that signed a hashed message (`hash`) with
* `signature` or error string. This address can then be used for verification purposes.
*
* The `ecrecover` EVM opcode allows for malleable (non-unique) signatures:
* this function rejects them by requiring the `s` value to be in the lower
* half order, and the `v` value to be either 27 or 28.
*
* IMPORTANT: `hash` _must_ be the result of a hash operation for the
* verification to be secure: it is possible to craft signatures that
* recover to arbitrary addresses for non-hashed data. A safe way to ensure
* this is by receiving a hash of the original message (which may otherwise
* be too long), and then calling {toEthSignedMessageHash} on it.
*
* Documentation for signature generation:
* - with https://web3js.readthedocs.io/en/v1.3.4/web3-eth-accounts.html#sign[Web3.js]
* - with https://docs.ethers.io/v5/api/signer/#Signer-signMessage[ethers]
*
* _Available since v4.3._
*/
function tryRecover(bytes32 hash, bytes memory signature) internal pure returns (address, RecoverError) {
// Check the signature length
// - case 65: r,s,v signature (standard)
// - case 64: r,vs signature (cf https://eips.ethereum.org/EIPS/eip-2098) _Available since v4.1._
if (signature.length == 65) {
bytes32 r;
bytes32 s;
uint8 v;
// ecrecover takes the signature parameters, and the only way to get them
// currently is to use assembly.
assembly {
r := mload(add(signature, 0x20))
s := mload(add(signature, 0x40))
v := byte(0, mload(add(signature, 0x60)))
}
return tryRecover(hash, v, r, s);
} else if (signature.length == 64) {
bytes32 r;
bytes32 vs;
// ecrecover takes the signature parameters, and the only way to get them
// currently is to use assembly.
assembly {
r := mload(add(signature, 0x20))
vs := mload(add(signature, 0x40))
}
return tryRecover(hash, r, vs);
} else {
return (address(0), RecoverError.InvalidSignatureLength);
}
}
/**
* @dev Returns the address that signed a hashed message (`hash`) with
* `signature`. This address can then be used for verification purposes.
*
* The `ecrecover` EVM opcode allows for malleable (non-unique) signatures:
* this function rejects them by requiring the `s` value to be in the lower
* half order, and the `v` value to be either 27 or 28.
*
* IMPORTANT: `hash` _must_ be the result of a hash operation for the
* verification to be secure: it is possible to craft signatures that
* recover to arbitrary addresses for non-hashed data. A safe way to ensure
* this is by receiving a hash of the original message (which may otherwise
* be too long), and then calling {toEthSignedMessageHash} on it.
*/
function recover(bytes32 hash, bytes memory signature) internal pure returns (address) {
(address recovered, RecoverError error) = tryRecover(hash, signature);
_throwError(error);
return recovered;
}
/**
* @dev Overload of {ECDSA-tryRecover} that receives the `r` and `vs` short-signature fields separately.
*
* See https://eips.ethereum.org/EIPS/eip-2098[EIP-2098 short signatures]
*
* _Available since v4.3._
*/
function tryRecover(
bytes32 hash,
bytes32 r,
bytes32 vs
) internal pure returns (address, RecoverError) {
bytes32 s;
uint8 v;
assembly {
s := and(vs, 0x7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff)
v := add(shr(255, vs), 27)
}
return tryRecover(hash, v, r, s);
}
/**
* @dev Overload of {ECDSA-recover} that receives the `r and `vs` short-signature fields separately.
*
* _Available since v4.2._
*/
function recover(
bytes32 hash,
bytes32 r,
bytes32 vs
) internal pure returns (address) {
(address recovered, RecoverError error) = tryRecover(hash, r, vs);
_throwError(error);
return recovered;
}
/**
* @dev Overload of {ECDSA-tryRecover} that receives the `v`,
* `r` and `s` signature fields separately.
*
* _Available since v4.3._
*/
function tryRecover(
bytes32 hash,
uint8 v,
bytes32 r,
bytes32 s
) internal pure returns (address, RecoverError) {
// EIP-2 still allows signature malleability for ecrecover(). Remove this possibility and make the signature
// unique. Appendix F in the Ethereum Yellow paper (https://ethereum.github.io/yellowpaper/paper.pdf), defines
// the valid range for s in (301): 0 < s < secp256k1n ÷ 2 + 1, and for v in (302): v ∈ {27, 28}. Most
// signatures from current libraries generate a unique signature with an s-value in the lower half order.
//
// If your library generates malleable signatures, such as s-values in the upper range, calculate a new s-value
// with 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFEBAAEDCE6AF48A03BBFD25E8CD0364141 - s1 and flip v from 27 to 28 or
// vice versa. If your library also generates signatures with 0/1 for v instead 27/28, add 27 to v to accept
// these malleable signatures as well.
if (uint256(s) > 0x7FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF5D576E7357A4501DDFE92F46681B20A0) {
return (address(0), RecoverError.InvalidSignatureS);
}
if (v != 27 && v != 28) {
return (address(0), RecoverError.InvalidSignatureV);
}
// If the signature is valid (and not malleable), return the signer address
address signer = ecrecover(hash, v, r, s);
if (signer == address(0)) {
return (address(0), RecoverError.InvalidSignature);
}
return (signer, RecoverError.NoError);
}
/**
* @dev Overload of {ECDSA-recover} that receives the `v`,
* `r` and `s` signature fields separately.
*/
function recover(
bytes32 hash,
uint8 v,
bytes32 r,
bytes32 s
) internal pure returns (address) {
(address recovered, RecoverError error) = tryRecover(hash, v, r, s);
_throwError(error);
return recovered;
}
/**
* @dev Returns an Ethereum Signed Message, created from a `hash`. This
* produces hash corresponding to the one signed with the
* https://eth.wiki/json-rpc/API#eth_sign[`eth_sign`]
* JSON-RPC method as part of EIP-191.
*
* See {recover}.
*/
function toEthSignedMessageHash(bytes32 hash) internal pure returns (bytes32) {
// 32 is the length in bytes of hash,
// enforced by the type signature above
return keccak256(abi.encodePacked("\x19Ethereum Signed Message:\n32", hash));
}
/**
* @dev Returns an Ethereum Signed Typed Data, created from a
* `domainSeparator` and a `structHash`. This produces hash corresponding
* to the one signed with the
* https://eips.ethereum.org/EIPS/eip-712[`eth_signTypedData`]
* JSON-RPC method as part of EIP-712.
*
* See {recover}.
*/
function toTypedDataHash(bytes32 domainSeparator, bytes32 structHash) internal pure returns (bytes32) {
return keccak256(abi.encodePacked("\x19\x01", domainSeparator, structHash));
}
}{
"evmVersion": "istanbul",
"optimizer": {
"enabled": true,
"runs": 200
},
"libraries": {
"Supervisor.sol": {}
},
"outputSelection": {
"*": {
"*": [
"evm.bytecode",
"evm.deployedBytecode",
"devdoc",
"userdoc",
"metadata",
"abi"
]
}
}
}Contract Security Audit
- No Contract Security Audit Submitted- Submit Audit Here
Contract ABI
API[{"inputs":[{"internalType":"uint32","name":"_chainId","type":"uint32"},{"internalType":"address[]","name":"_validators","type":"address[]"},{"internalType":"uint256","name":"_threshold","type":"uint256"}],"stateMutability":"nonpayable","type":"constructor"},{"inputs":[],"name":"BATCH_CLAIM_IDENTIFIER","outputs":[{"internalType":"bytes32","name":"","type":"bytes32"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"CLAIM_IDENTIFIER","outputs":[{"internalType":"bytes32","name":"","type":"bytes32"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"LOCK_CLOSE_SWAP_AND_REFUND_IDENTIFIER","outputs":[{"internalType":"bytes32","name":"","type":"bytes32"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"SET_THRESHOLD_IDENTIFIER","outputs":[{"internalType":"bytes32","name":"","type":"bytes32"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"SET_VALIDATOR_IDENTIFIER","outputs":[{"internalType":"bytes32","name":"","type":"bytes32"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"VALIDATE_SWAP_IDENTIFIER","outputs":[{"internalType":"bytes32","name":"","type":"bytes32"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"VALIDATE_XY_CROSS_CHAIN_IDENTIFIER","outputs":[{"internalType":"bytes32","name":"","type":"bytes32"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"chainId","outputs":[{"internalType":"uint32","name":"","type":"uint32"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"bytes32","name":"sigIdHash","type":"bytes32"},{"internalType":"bytes[]","name":"signatures","type":"bytes[]"}],"name":"checkSignatures","outputs":[],"stateMutability":"view","type":"function"},{"inputs":[],"name":"nonce","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"_threshold","type":"uint256"},{"internalType":"uint256","name":"_nonce","type":"uint256"},{"internalType":"bytes[]","name":"signatures","type":"bytes[]"}],"name":"setThreshold","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"_validator","type":"address"},{"internalType":"bool","name":"flag","type":"bool"},{"internalType":"uint256","name":"_nonce","type":"uint256"},{"internalType":"bytes[]","name":"signatures","type":"bytes[]"}],"name":"setValidator","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"threshold","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"","type":"address"}],"name":"validators","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"}]Contract Creation Code
60806040523480156200001157600080fd5b506040516200119c3803806200119c833981016040819052620000349162000146565b6000805463ffffffff191663ffffffff85161781555b8251811015620000c15760018060008584815181106200007a57634e487b7160e01b600052603260045260246000fd5b6020908102919091018101516001600160a01b03168252810191909152604001600020805460ff191691151591909117905580620000b88162000242565b9150506200004a565b50815160028190558111156200011d5760405162461bcd60e51b815260206004820152601560248201527f4552525f494e56414c49445f5448524553484f4c440000000000000000000000604482015260640160405180910390fd5b60035550620002809050565b80516001600160a01b03811681146200014157600080fd5b919050565b6000806000606084860312156200015b578283fd5b835163ffffffff811681146200016f578384fd5b602085810151919450906001600160401b03808211156200018e578485fd5b818701915087601f830112620001a2578485fd5b815181811115620001b757620001b76200026a565b838102604051601f19603f83011681018181108582111715620001de57620001de6200026a565b604052828152858101935084860182860187018c1015620001fd578889fd5b8895505b838610156200022a57620002158162000129565b85526001959095019493860193860162000201565b50809750505050505050604084015190509250925092565b60006000198214156200026357634e487b7160e01b81526011600452602481fd5b5060010190565b634e487b7160e01b600052604160045260246000fd5b610f0c80620002906000396000f3fe608060405234801561001057600080fd5b50600436106100ea5760003560e01c8063935d91dd1161008c578063da8bd3fe11610066578063da8bd3fe146101f4578063f7ca802314610207578063fa52c7d81461021c578063faf55b5c1461024f576100ea565b8063935d91dd146101b35780639a8a0592146101c6578063affed0e0146101eb576100ea565b80635938c87d116100c85780635938c87d146101395780635a0f88301461015057806371aca57e1461016557806374892a721461018c576100ea565b80633c0e39bf146100ef57806342cde4e81461011957806351f61efa14610122575b600080fd5b6101066c14d15517d512149154d213d311609a1b81565b6040519081526020015b60405180910390f35b61010660035481565b6101066c29a2aa2fab20a624a220aa27a960991b81565b6101066c535741505045525f434c41494d60981b81565b61016361015e366004610d7d565b610276565b005b6101067f56414c49444154455f58595f58434841494e5f4944454e54494649455200000081565b6101067f4c4f434b5f434c4f53455f535741505f414e445f524546554e4400000000000081565b6101636101c1366004610dc2565b6103bf565b6000546101d69063ffffffff1681565b60405163ffffffff9091168152602001610110565b61010660045481565b610163610202366004610d11565b610567565b6101066a42415443485f434c41494d60a81b81565b61023f61022a366004610cf0565b60016020526000908152604090205460ff1681565b6040519015158152602001610110565b6101067f56414c49444154455f535741505f4944454e544946494552000000000000000081565b600354815110156102a25760405162461bcd60e51b815260040161029990610e10565b60405180910390fd5b6000805b6003548110156103b95760006102ec8483815181106102d557634e487b7160e01b600052603260045260246000fd5b60200260200101518661080190919063ffffffff16565b6001600160a01b03811660009081526001602052604090205490915060ff1661034b5760405162461bcd60e51b815260206004820152601160248201527022a9292fa727aa2fab20a624a220aa27a960791b6044820152606401610299565b826001600160a01b0316816001600160a01b0316116103a55760405162461bcd60e51b815260206004820152601660248201527522a9292faba927a723afa9a4a3a722a92fa7a92222a960511b6044820152606401610299565b9150806103b181610e8f565b9150506102a6565b50505050565b600354815110156103e25760405162461bcd60e51b815260040161029990610e10565b60045482146104275760405162461bcd60e51b81526020600482015260116024820152704552525f494e56414c49445f4e4f4e434560781b6044820152606401610299565b6000831161046f5760405162461bcd60e51b815260206004820152601560248201527411549497d253959053125117d512149154d213d311605a1b6044820152606401610299565b6002548311156104b95760405162461bcd60e51b815260206004820152601560248201527411549497d253959053125117d512149154d213d311605a1b6044820152606401610299565b60008054604080516c14d15517d512149154d213d311609a1b60208201523060601b6bffffffffffffffffffffffff19169181019190915260e09190911b6001600160e01b03191660548201526058810185905260788101849052609801604051602081830303815290604052805190602001209050600061053a82610825565b90506105468184610276565b60038590556004805490600061055b83610e8f565b91905055505050505050565b6001600160a01b0384166105b55760405162461bcd60e51b815260206004820152601560248201527422a9292fa4a72b20a624a22fab20a624a220aa27a960591b6044820152606401610299565b600354815110156105d85760405162461bcd60e51b815260040161029990610e10565b600454821461061d5760405162461bcd60e51b81526020600482015260116024820152704552525f494e56414c49445f4e4f4e434560781b6044820152606401610299565b6001600160a01b03841660009081526001602052604090205460ff161515831515141561068c5760405162461bcd60e51b815260206004820152601a60248201527f4552525f4f5045524154494f4e5f544f5f56414c494441544f520000000000006044820152606401610299565b60008054604080516c29a2aa2fab20a624a220aa27a960991b602082015230606090811b6bffffffffffffffffffffffff199081169383019390935260e09390931b6001600160e01b03191660548201529187901b16605882015284151560f81b606c820152606d8101849052608d01604051602081830303815290604052805190602001209050600061071f82610825565b905061072b8184610276565b6001600160a01b03861660009081526001602052604090205460ff16156107a8576002805490600061075c83610e78565b90915550506001600160a01b0386166000908152600160205260409020805460ff1916905560035460025410156107a3576003805490600061079d83610e78565b91905055505b6107e4565b600280549060006107b883610e8f565b90915550506001600160a01b0386166000908152600160208190526040909120805460ff191690911790555b600480549060006107f483610e8f565b9190505550505050505050565b60008060006108108585610879565b9150915061081d816108e9565b509392505050565b6040517f19457468657265756d205369676e6564204d6573736167653a0a3332000000006020820152603c8101829052600090605c016040516020818303038152906040528051906020012090505b919050565b6000808251604114156108b05760208301516040840151606085015160001a6108a487828585610aef565b945094505050506108e2565b8251604014156108da57602083015160408401516108cf868383610bdc565b9350935050506108e2565b506000905060025b9250929050565b600081600481111561090b57634e487b7160e01b600052602160045260246000fd5b141561091657610aec565b600181600481111561093857634e487b7160e01b600052602160045260246000fd5b14156109865760405162461bcd60e51b815260206004820152601860248201527f45434453413a20696e76616c6964207369676e617475726500000000000000006044820152606401610299565b60028160048111156109a857634e487b7160e01b600052602160045260246000fd5b14156109f65760405162461bcd60e51b815260206004820152601f60248201527f45434453413a20696e76616c6964207369676e6174757265206c656e677468006044820152606401610299565b6003816004811115610a1857634e487b7160e01b600052602160045260246000fd5b1415610a715760405162461bcd60e51b815260206004820152602260248201527f45434453413a20696e76616c6964207369676e6174757265202773272076616c604482015261756560f01b6064820152608401610299565b6004816004811115610a9357634e487b7160e01b600052602160045260246000fd5b1415610aec5760405162461bcd60e51b815260206004820152602260248201527f45434453413a20696e76616c6964207369676e6174757265202776272076616c604482015261756560f01b6064820152608401610299565b50565b6000807f7fffffffffffffffffffffffffffffff5d576e7357a4501ddfe92f46681b20a0831115610b265750600090506003610bd3565b8460ff16601b14158015610b3e57508460ff16601c14155b15610b4f5750600090506004610bd3565b6040805160008082526020820180845289905260ff881692820192909252606081018690526080810185905260019060a0016020604051602081039080840390855afa158015610ba3573d6000803e3d6000fd5b5050604051601f1901519150506001600160a01b038116610bcc57600060019250925050610bd3565b9150600090505b94509492505050565b6000806001600160ff1b03831660ff84901c601b01610bfd87828885610aef565b935093505050935093915050565b80356001600160a01b038116811461087457600080fd5b6000601f8381840112610c33578182fd5b8235602067ffffffffffffffff80831115610c5057610c50610ec0565b610c5d8283850201610e47565b83815282810190878401875b86811015610ce15781358a018b603f820112610c8357898afd5b86810135604087821115610c9957610c99610ec0565b610caa828c01601f19168a01610e47565b8281528e82848601011115610cbd578c8dfd5b828285018b83013791820189018c9052508552509285019290850190600101610c69565b50909998505050505050505050565b600060208284031215610d01578081fd5b610d0a82610c0b565b9392505050565b60008060008060808587031215610d26578283fd5b610d2f85610c0b565b935060208501358015158114610d43578384fd5b925060408501359150606085013567ffffffffffffffff811115610d65578182fd5b610d7187828801610c22565b91505092959194509250565b60008060408385031215610d8f578182fd5b82359150602083013567ffffffffffffffff811115610dac578182fd5b610db885828601610c22565b9150509250929050565b600080600060608486031215610dd6578283fd5b8335925060208401359150604084013567ffffffffffffffff811115610dfa578182fd5b610e0686828701610c22565b9150509250925092565b60208082526019908201527f4552525f4e4f545f454e4f5547485f5349474e41545552455300000000000000604082015260600190565b604051601f8201601f1916810167ffffffffffffffff81118282101715610e7057610e70610ec0565b604052919050565b600081610e8757610e87610eaa565b506000190190565b6000600019821415610ea357610ea3610eaa565b5060010190565b634e487b7160e01b600052601160045260246000fd5b634e487b7160e01b600052604160045260246000fdfea264697066735822122067cfd024213e1dbae904fba1d07705b49a55feb743583782defa070dcf43748064736f6c634300080200330000000000000000000000000000000000000000000000000000000000000505000000000000000000000000000000000000000000000000000000000000006000000000000000000000000000000000000000000000000000000000000000010000000000000000000000000000000000000000000000000000000000000002000000000000000000000000b7702af3cffa4c5bda7ed48b51351dd437343c1b0000000000000000000000000589312aaefb4155d792e4832a00f8e28222bae4
Deployed Bytecode
0x608060405234801561001057600080fd5b50600436106100ea5760003560e01c8063935d91dd1161008c578063da8bd3fe11610066578063da8bd3fe146101f4578063f7ca802314610207578063fa52c7d81461021c578063faf55b5c1461024f576100ea565b8063935d91dd146101b35780639a8a0592146101c6578063affed0e0146101eb576100ea565b80635938c87d116100c85780635938c87d146101395780635a0f88301461015057806371aca57e1461016557806374892a721461018c576100ea565b80633c0e39bf146100ef57806342cde4e81461011957806351f61efa14610122575b600080fd5b6101066c14d15517d512149154d213d311609a1b81565b6040519081526020015b60405180910390f35b61010660035481565b6101066c29a2aa2fab20a624a220aa27a960991b81565b6101066c535741505045525f434c41494d60981b81565b61016361015e366004610d7d565b610276565b005b6101067f56414c49444154455f58595f58434841494e5f4944454e54494649455200000081565b6101067f4c4f434b5f434c4f53455f535741505f414e445f524546554e4400000000000081565b6101636101c1366004610dc2565b6103bf565b6000546101d69063ffffffff1681565b60405163ffffffff9091168152602001610110565b61010660045481565b610163610202366004610d11565b610567565b6101066a42415443485f434c41494d60a81b81565b61023f61022a366004610cf0565b60016020526000908152604090205460ff1681565b6040519015158152602001610110565b6101067f56414c49444154455f535741505f4944454e544946494552000000000000000081565b600354815110156102a25760405162461bcd60e51b815260040161029990610e10565b60405180910390fd5b6000805b6003548110156103b95760006102ec8483815181106102d557634e487b7160e01b600052603260045260246000fd5b60200260200101518661080190919063ffffffff16565b6001600160a01b03811660009081526001602052604090205490915060ff1661034b5760405162461bcd60e51b815260206004820152601160248201527022a9292fa727aa2fab20a624a220aa27a960791b6044820152606401610299565b826001600160a01b0316816001600160a01b0316116103a55760405162461bcd60e51b815260206004820152601660248201527522a9292faba927a723afa9a4a3a722a92fa7a92222a960511b6044820152606401610299565b9150806103b181610e8f565b9150506102a6565b50505050565b600354815110156103e25760405162461bcd60e51b815260040161029990610e10565b60045482146104275760405162461bcd60e51b81526020600482015260116024820152704552525f494e56414c49445f4e4f4e434560781b6044820152606401610299565b6000831161046f5760405162461bcd60e51b815260206004820152601560248201527411549497d253959053125117d512149154d213d311605a1b6044820152606401610299565b6002548311156104b95760405162461bcd60e51b815260206004820152601560248201527411549497d253959053125117d512149154d213d311605a1b6044820152606401610299565b60008054604080516c14d15517d512149154d213d311609a1b60208201523060601b6bffffffffffffffffffffffff19169181019190915260e09190911b6001600160e01b03191660548201526058810185905260788101849052609801604051602081830303815290604052805190602001209050600061053a82610825565b90506105468184610276565b60038590556004805490600061055b83610e8f565b91905055505050505050565b6001600160a01b0384166105b55760405162461bcd60e51b815260206004820152601560248201527422a9292fa4a72b20a624a22fab20a624a220aa27a960591b6044820152606401610299565b600354815110156105d85760405162461bcd60e51b815260040161029990610e10565b600454821461061d5760405162461bcd60e51b81526020600482015260116024820152704552525f494e56414c49445f4e4f4e434560781b6044820152606401610299565b6001600160a01b03841660009081526001602052604090205460ff161515831515141561068c5760405162461bcd60e51b815260206004820152601a60248201527f4552525f4f5045524154494f4e5f544f5f56414c494441544f520000000000006044820152606401610299565b60008054604080516c29a2aa2fab20a624a220aa27a960991b602082015230606090811b6bffffffffffffffffffffffff199081169383019390935260e09390931b6001600160e01b03191660548201529187901b16605882015284151560f81b606c820152606d8101849052608d01604051602081830303815290604052805190602001209050600061071f82610825565b905061072b8184610276565b6001600160a01b03861660009081526001602052604090205460ff16156107a8576002805490600061075c83610e78565b90915550506001600160a01b0386166000908152600160205260409020805460ff1916905560035460025410156107a3576003805490600061079d83610e78565b91905055505b6107e4565b600280549060006107b883610e8f565b90915550506001600160a01b0386166000908152600160208190526040909120805460ff191690911790555b600480549060006107f483610e8f565b9190505550505050505050565b60008060006108108585610879565b9150915061081d816108e9565b509392505050565b6040517f19457468657265756d205369676e6564204d6573736167653a0a3332000000006020820152603c8101829052600090605c016040516020818303038152906040528051906020012090505b919050565b6000808251604114156108b05760208301516040840151606085015160001a6108a487828585610aef565b945094505050506108e2565b8251604014156108da57602083015160408401516108cf868383610bdc565b9350935050506108e2565b506000905060025b9250929050565b600081600481111561090b57634e487b7160e01b600052602160045260246000fd5b141561091657610aec565b600181600481111561093857634e487b7160e01b600052602160045260246000fd5b14156109865760405162461bcd60e51b815260206004820152601860248201527f45434453413a20696e76616c6964207369676e617475726500000000000000006044820152606401610299565b60028160048111156109a857634e487b7160e01b600052602160045260246000fd5b14156109f65760405162461bcd60e51b815260206004820152601f60248201527f45434453413a20696e76616c6964207369676e6174757265206c656e677468006044820152606401610299565b6003816004811115610a1857634e487b7160e01b600052602160045260246000fd5b1415610a715760405162461bcd60e51b815260206004820152602260248201527f45434453413a20696e76616c6964207369676e6174757265202773272076616c604482015261756560f01b6064820152608401610299565b6004816004811115610a9357634e487b7160e01b600052602160045260246000fd5b1415610aec5760405162461bcd60e51b815260206004820152602260248201527f45434453413a20696e76616c6964207369676e6174757265202776272076616c604482015261756560f01b6064820152608401610299565b50565b6000807f7fffffffffffffffffffffffffffffff5d576e7357a4501ddfe92f46681b20a0831115610b265750600090506003610bd3565b8460ff16601b14158015610b3e57508460ff16601c14155b15610b4f5750600090506004610bd3565b6040805160008082526020820180845289905260ff881692820192909252606081018690526080810185905260019060a0016020604051602081039080840390855afa158015610ba3573d6000803e3d6000fd5b5050604051601f1901519150506001600160a01b038116610bcc57600060019250925050610bd3565b9150600090505b94509492505050565b6000806001600160ff1b03831660ff84901c601b01610bfd87828885610aef565b935093505050935093915050565b80356001600160a01b038116811461087457600080fd5b6000601f8381840112610c33578182fd5b8235602067ffffffffffffffff80831115610c5057610c50610ec0565b610c5d8283850201610e47565b83815282810190878401875b86811015610ce15781358a018b603f820112610c8357898afd5b86810135604087821115610c9957610c99610ec0565b610caa828c01601f19168a01610e47565b8281528e82848601011115610cbd578c8dfd5b828285018b83013791820189018c9052508552509285019290850190600101610c69565b50909998505050505050505050565b600060208284031215610d01578081fd5b610d0a82610c0b565b9392505050565b60008060008060808587031215610d26578283fd5b610d2f85610c0b565b935060208501358015158114610d43578384fd5b925060408501359150606085013567ffffffffffffffff811115610d65578182fd5b610d7187828801610c22565b91505092959194509250565b60008060408385031215610d8f578182fd5b82359150602083013567ffffffffffffffff811115610dac578182fd5b610db885828601610c22565b9150509250929050565b600080600060608486031215610dd6578283fd5b8335925060208401359150604084013567ffffffffffffffff811115610dfa578182fd5b610e0686828701610c22565b9150509250925092565b60208082526019908201527f4552525f4e4f545f454e4f5547485f5349474e41545552455300000000000000604082015260600190565b604051601f8201601f1916810167ffffffffffffffff81118282101715610e7057610e70610ec0565b604052919050565b600081610e8757610e87610eaa565b506000190190565b6000600019821415610ea357610ea3610eaa565b5060010190565b634e487b7160e01b600052601160045260246000fd5b634e487b7160e01b600052604160045260246000fdfea264697066735822122067cfd024213e1dbae904fba1d07705b49a55feb743583782defa070dcf43748064736f6c63430008020033
Constructor Arguments (ABI-Encoded and is the last bytes of the Contract Creation Code above)
0000000000000000000000000000000000000000000000000000000000000505000000000000000000000000000000000000000000000000000000000000006000000000000000000000000000000000000000000000000000000000000000010000000000000000000000000000000000000000000000000000000000000002000000000000000000000000b7702af3cffa4c5bda7ed48b51351dd437343c1b0000000000000000000000000589312aaefb4155d792e4832a00f8e28222bae4
-----Decoded View---------------
Arg [0] : _chainId (uint32): 1285
Arg [1] : _validators (address[]): 0xb7702aF3CFFa4C5bDA7Ed48b51351Dd437343C1B,0x0589312AAEFb4155D792e4832a00f8e28222bae4
Arg [2] : _threshold (uint256): 1
-----Encoded View---------------
6 Constructor Arguments found :
Arg [0] : 0000000000000000000000000000000000000000000000000000000000000505
Arg [1] : 0000000000000000000000000000000000000000000000000000000000000060
Arg [2] : 0000000000000000000000000000000000000000000000000000000000000001
Arg [3] : 0000000000000000000000000000000000000000000000000000000000000002
Arg [4] : 000000000000000000000000b7702af3cffa4c5bda7ed48b51351dd437343c1b
Arg [5] : 0000000000000000000000000589312aaefb4155d792e4832a00f8e28222bae4
Loading...
Loading
Loading...
Loading
Multichain Portfolio | 34 Chains
| Chain | Token | Portfolio % | Price | Amount | Value |
|---|
Loading...
Loading
Loading...
Loading
Loading...
Loading
[ Download: CSV Export ]
A contract address hosts a smart contract, which is a set of code stored on the blockchain that runs when predetermined conditions are met. Learn more about addresses in our Knowledge Base.