Contract
0x3b53d2c7b44d40be05fa5e2309ffeb6eb2492d88
9
My Name Tag:
Not Available, login to update
[ Download CSV Export ]
Contract Name:
PeggedTokenBridgeV2
Compiler Version
v0.8.9+commit.e5eed63a
Optimization Enabled:
Yes with 800 runs
Other Settings:
default evmVersion
Contract Source Code (Solidity Standard Json-Input format)
// SPDX-License-Identifier: GPL-3.0-only pragma solidity 0.8.9; import "../interfaces/ISigsVerifier.sol"; import "../interfaces/IPeggedToken.sol"; import "../interfaces/IPeggedTokenBurnFrom.sol"; import "../libraries/PbPegged.sol"; import "../safeguard/Pauser.sol"; import "../safeguard/VolumeControl.sol"; import "../safeguard/DelayedTransfer.sol"; /** * @title The bridge contract to mint and burn pegged tokens * @dev Work together with OriginalTokenVault deployed at remote chains. */ contract PeggedTokenBridgeV2 is Pauser, VolumeControl, DelayedTransfer { ISigsVerifier public immutable sigsVerifier; mapping(bytes32 => bool) public records; mapping(address => uint256) public supplies; mapping(address => uint256) public minBurn; mapping(address => uint256) public maxBurn; event Mint( bytes32 mintId, address token, address account, uint256 amount, // ref_chain_id defines the reference chain ID, taking values of: // 1. The common case: the chain ID on which the remote corresponding deposit or burn happened; // 2. Refund for wrong burn: this chain ID on which the burn happened uint64 refChainId, // ref_id defines a unique reference ID, taking values of: // 1. The common case of deposit/burn-mint: the deposit or burn ID on the remote chain; // 2. Refund for wrong burn: the burn ID on this chain bytes32 refId, address depositor ); event Burn( bytes32 burnId, address token, address account, uint256 amount, uint64 toChainId, address toAccount, uint64 nonce ); event MinBurnUpdated(address token, uint256 amount); event MaxBurnUpdated(address token, uint256 amount); event SupplyUpdated(address token, uint256 supply); constructor(ISigsVerifier _sigsVerifier) { sigsVerifier = _sigsVerifier; } /** * @notice Mint tokens triggered by deposit at a remote chain's OriginalTokenVault. * @param _request The serialized Mint protobuf. * @param _sigs The list of signatures sorted by signing addresses in ascending order. A relay must be signed-off by * +2/3 of the sigsVerifier's current signing power to be delivered. * @param _signers The sorted list of signers. * @param _powers The signing powers of the signers. */ function mint( bytes calldata _request, bytes[] calldata _sigs, address[] calldata _signers, uint256[] calldata _powers ) external whenNotPaused returns (bytes32) { bytes32 domain = keccak256(abi.encodePacked(block.chainid, address(this), "Mint")); sigsVerifier.verifySigs(abi.encodePacked(domain, _request), _sigs, _signers, _powers); PbPegged.Mint memory request = PbPegged.decMint(_request); bytes32 mintId = keccak256( // len = 20 + 20 + 32 + 20 + 8 + 32 + 20 = 152 abi.encodePacked( request.account, request.token, request.amount, request.depositor, request.refChainId, request.refId, address(this) ) ); require(records[mintId] == false, "record exists"); records[mintId] = true; _updateVolume(request.token, request.amount); uint256 delayThreshold = delayThresholds[request.token]; if (delayThreshold > 0 && request.amount > delayThreshold) { _addDelayedTransfer(mintId, request.account, request.token, request.amount); } else { IPeggedToken(request.token).mint(request.account, request.amount); } supplies[request.token] += request.amount; emit Mint( mintId, request.token, request.account, request.amount, request.refChainId, request.refId, request.depositor ); return mintId; } /** * @notice Burn pegged tokens to trigger a cross-chain withdrawal of the original tokens at a remote chain's * OriginalTokenVault, or mint at another remote chain * NOTE: This function DOES NOT SUPPORT fee-on-transfer / rebasing tokens. * @param _token The pegged token address. * @param _amount The amount to burn. * @param _toChainId If zero, withdraw from original vault; otherwise, the remote chain to mint tokens. * @param _toAccount The account to receive tokens on the remote chain * @param _nonce A number to guarantee unique depositId. Can be timestamp in practice. */ function burn( address _token, uint256 _amount, uint64 _toChainId, address _toAccount, uint64 _nonce ) external whenNotPaused returns (bytes32) { bytes32 burnId = _burn(_token, _amount, _toChainId, _toAccount, _nonce); IPeggedToken(_token).burn(msg.sender, _amount); return burnId; } // same with `burn` above, use openzeppelin ERC20Burnable interface function burnFrom( address _token, uint256 _amount, uint64 _toChainId, address _toAccount, uint64 _nonce ) external whenNotPaused returns (bytes32) { bytes32 burnId = _burn(_token, _amount, _toChainId, _toAccount, _nonce); IPeggedTokenBurnFrom(_token).burnFrom(msg.sender, _amount); return burnId; } function _burn( address _token, uint256 _amount, uint64 _toChainId, address _toAccount, uint64 _nonce ) private returns (bytes32) { require(_amount > minBurn[_token], "amount too small"); require(maxBurn[_token] == 0 || _amount <= maxBurn[_token], "amount too large"); supplies[_token] -= _amount; bytes32 burnId = keccak256( // len = 20 + 20 + 32 + 8 + 20 + 8 + 8 + 20 = 136 abi.encodePacked( msg.sender, _token, _amount, _toChainId, _toAccount, _nonce, uint64(block.chainid), address(this) ) ); require(records[burnId] == false, "record exists"); records[burnId] = true; emit Burn(burnId, _token, msg.sender, _amount, _toChainId, _toAccount, _nonce); return burnId; } function executeDelayedTransfer(bytes32 id) external whenNotPaused { delayedTransfer memory transfer = _executeDelayedTransfer(id); IPeggedToken(transfer.token).mint(transfer.receiver, transfer.amount); } function setMinBurn(address[] calldata _tokens, uint256[] calldata _amounts) external onlyGovernor { require(_tokens.length == _amounts.length, "length mismatch"); for (uint256 i = 0; i < _tokens.length; i++) { minBurn[_tokens[i]] = _amounts[i]; emit MinBurnUpdated(_tokens[i], _amounts[i]); } } function setMaxBurn(address[] calldata _tokens, uint256[] calldata _amounts) external onlyGovernor { require(_tokens.length == _amounts.length, "length mismatch"); for (uint256 i = 0; i < _tokens.length; i++) { maxBurn[_tokens[i]] = _amounts[i]; emit MaxBurnUpdated(_tokens[i], _amounts[i]); } } function setSupply(address _token, uint256 _supply) external onlyOwner { supplies[_token] = _supply; emit SupplyUpdated(_token, _supply); } function increaseSupply(address _token, uint256 _delta) external onlyOwner { supplies[_token] += _delta; emit SupplyUpdated(_token, supplies[_token]); } function decreaseSupply(address _token, uint256 _delta) external onlyOwner { supplies[_token] -= _delta; emit SupplyUpdated(_token, supplies[_token]); } }
// SPDX-License-Identifier: GPL-3.0-only pragma solidity >=0.8.0; interface ISigsVerifier { /** * @notice Verifies that a message is signed by a quorum among the signers. * @param _msg signed message * @param _sigs list of signatures sorted by signer addresses in ascending order * @param _signers sorted list of current signers * @param _powers powers of current signers */ function verifySigs( bytes memory _msg, bytes[] calldata _sigs, address[] calldata _signers, uint256[] calldata _powers ) external view; }
// SPDX-License-Identifier: GPL-3.0-only pragma solidity >=0.8.0; interface IPeggedToken { function mint(address _to, uint256 _amount) external; function burn(address _from, uint256 _amount) external; }
// SPDX-License-Identifier: GPL-3.0-only pragma solidity >=0.8.0; // used for pegged token with openzeppelin ERC20Burnable interface // only compatible with PeggedTokenBridgeV2 interface IPeggedTokenBurnFrom { function mint(address _to, uint256 _amount) external; function burnFrom(address _from, uint256 _amount) external; }
// SPDX-License-Identifier: GPL-3.0-only // Code generated by protoc-gen-sol. DO NOT EDIT. // source: contracts/libraries/proto/pegged.proto pragma solidity 0.8.9; import "./Pb.sol"; library PbPegged { using Pb for Pb.Buffer; // so we can call Pb funcs on Buffer obj struct Mint { address token; // tag: 1 address account; // tag: 2 uint256 amount; // tag: 3 address depositor; // tag: 4 uint64 refChainId; // tag: 5 bytes32 refId; // tag: 6 } // end struct Mint function decMint(bytes memory raw) internal pure returns (Mint memory m) { Pb.Buffer memory buf = Pb.fromBytes(raw); uint256 tag; Pb.WireType wire; while (buf.hasMore()) { (tag, wire) = buf.decKey(); if (false) {} // solidity has no switch/case else if (tag == 1) { m.token = Pb._address(buf.decBytes()); } else if (tag == 2) { m.account = Pb._address(buf.decBytes()); } else if (tag == 3) { m.amount = Pb._uint256(buf.decBytes()); } else if (tag == 4) { m.depositor = Pb._address(buf.decBytes()); } else if (tag == 5) { m.refChainId = uint64(buf.decVarint()); } else if (tag == 6) { m.refId = Pb._bytes32(buf.decBytes()); } else { buf.skipValue(wire); } // skip value of unknown tag } } // end decoder Mint struct Withdraw { address token; // tag: 1 address receiver; // tag: 2 uint256 amount; // tag: 3 address burnAccount; // tag: 4 uint64 refChainId; // tag: 5 bytes32 refId; // tag: 6 } // end struct Withdraw function decWithdraw(bytes memory raw) internal pure returns (Withdraw memory m) { Pb.Buffer memory buf = Pb.fromBytes(raw); uint256 tag; Pb.WireType wire; while (buf.hasMore()) { (tag, wire) = buf.decKey(); if (false) {} // solidity has no switch/case else if (tag == 1) { m.token = Pb._address(buf.decBytes()); } else if (tag == 2) { m.receiver = Pb._address(buf.decBytes()); } else if (tag == 3) { m.amount = Pb._uint256(buf.decBytes()); } else if (tag == 4) { m.burnAccount = Pb._address(buf.decBytes()); } else if (tag == 5) { m.refChainId = uint64(buf.decVarint()); } else if (tag == 6) { m.refId = Pb._bytes32(buf.decBytes()); } else { buf.skipValue(wire); } // skip value of unknown tag } } // end decoder Withdraw }
// SPDX-License-Identifier: GPL-3.0-only pragma solidity 0.8.9; import "@openzeppelin/contracts/security/Pausable.sol"; import "./Ownable.sol"; abstract contract Pauser is Ownable, Pausable { mapping(address => bool) public pausers; event PauserAdded(address account); event PauserRemoved(address account); constructor() { _addPauser(msg.sender); } modifier onlyPauser() { require(isPauser(msg.sender), "Caller is not pauser"); _; } function pause() public onlyPauser { _pause(); } function unpause() public onlyPauser { _unpause(); } function isPauser(address account) public view returns (bool) { return pausers[account]; } function addPauser(address account) public onlyOwner { _addPauser(account); } function removePauser(address account) public onlyOwner { _removePauser(account); } function renouncePauser() public { _removePauser(msg.sender); } function _addPauser(address account) private { require(!isPauser(account), "Account is already pauser"); pausers[account] = true; emit PauserAdded(account); } function _removePauser(address account) private { require(isPauser(account), "Account is not pauser"); pausers[account] = false; emit PauserRemoved(account); } }
// SPDX-License-Identifier: GPL-3.0-only pragma solidity 0.8.9; import "./Governor.sol"; abstract contract VolumeControl is Governor { uint256 public epochLength; // seconds mapping(address => uint256) public epochVolumes; // key is token mapping(address => uint256) public epochVolumeCaps; // key is token mapping(address => uint256) public lastOpTimestamps; // key is token event EpochLengthUpdated(uint256 length); event EpochVolumeUpdated(address token, uint256 cap); function setEpochLength(uint256 _length) external onlyGovernor { epochLength = _length; emit EpochLengthUpdated(_length); } function setEpochVolumeCaps(address[] calldata _tokens, uint256[] calldata _caps) external onlyGovernor { require(_tokens.length == _caps.length, "length mismatch"); for (uint256 i = 0; i < _tokens.length; i++) { epochVolumeCaps[_tokens[i]] = _caps[i]; emit EpochVolumeUpdated(_tokens[i], _caps[i]); } } function _updateVolume(address _token, uint256 _amount) internal { if (epochLength == 0) { return; } uint256 cap = epochVolumeCaps[_token]; if (cap == 0) { return; } uint256 volume = epochVolumes[_token]; uint256 timestamp = block.timestamp; uint256 epochStartTime = (timestamp / epochLength) * epochLength; if (lastOpTimestamps[_token] < epochStartTime) { volume = _amount; } else { volume += _amount; } require(volume <= cap, "volume exceeds cap"); epochVolumes[_token] = volume; lastOpTimestamps[_token] = timestamp; } }
// SPDX-License-Identifier: GPL-3.0-only pragma solidity 0.8.9; import "./Governor.sol"; abstract contract DelayedTransfer is Governor { struct delayedTransfer { address receiver; address token; uint256 amount; uint256 timestamp; } mapping(bytes32 => delayedTransfer) public delayedTransfers; mapping(address => uint256) public delayThresholds; uint256 public delayPeriod; // in seconds event DelayedTransferAdded(bytes32 id); event DelayedTransferExecuted(bytes32 id, address receiver, address token, uint256 amount); event DelayPeriodUpdated(uint256 period); event DelayThresholdUpdated(address token, uint256 threshold); function setDelayThresholds(address[] calldata _tokens, uint256[] calldata _thresholds) external onlyGovernor { require(_tokens.length == _thresholds.length, "length mismatch"); for (uint256 i = 0; i < _tokens.length; i++) { delayThresholds[_tokens[i]] = _thresholds[i]; emit DelayThresholdUpdated(_tokens[i], _thresholds[i]); } } function setDelayPeriod(uint256 _period) external onlyGovernor { delayPeriod = _period; emit DelayPeriodUpdated(_period); } function _addDelayedTransfer( bytes32 id, address receiver, address token, uint256 amount ) internal { require(delayedTransfers[id].timestamp == 0, "delayed transfer already exists"); delayedTransfers[id] = delayedTransfer({ receiver: receiver, token: token, amount: amount, timestamp: block.timestamp }); emit DelayedTransferAdded(id); } // caller needs to do the actual token transfer function _executeDelayedTransfer(bytes32 id) internal returns (delayedTransfer memory) { delayedTransfer memory transfer = delayedTransfers[id]; require(transfer.timestamp > 0, "delayed transfer not exist"); require(block.timestamp > transfer.timestamp + delayPeriod, "delayed transfer still locked"); delete delayedTransfers[id]; emit DelayedTransferExecuted(id, transfer.receiver, transfer.token, transfer.amount); return transfer; } }
// SPDX-License-Identifier: GPL-3.0-only pragma solidity 0.8.9; // runtime proto sol library library Pb { enum WireType { Varint, Fixed64, LengthDelim, StartGroup, EndGroup, Fixed32 } struct Buffer { uint256 idx; // the start index of next read. when idx=b.length, we're done bytes b; // hold serialized proto msg, readonly } // create a new in-memory Buffer object from raw msg bytes function fromBytes(bytes memory raw) internal pure returns (Buffer memory buf) { buf.b = raw; buf.idx = 0; } // whether there are unread bytes function hasMore(Buffer memory buf) internal pure returns (bool) { return buf.idx < buf.b.length; } // decode current field number and wiretype function decKey(Buffer memory buf) internal pure returns (uint256 tag, WireType wiretype) { uint256 v = decVarint(buf); tag = v / 8; wiretype = WireType(v & 7); } // count tag occurrences, return an array due to no memory map support // have to create array for (maxtag+1) size. cnts[tag] = occurrences // should keep buf.idx unchanged because this is only a count function function cntTags(Buffer memory buf, uint256 maxtag) internal pure returns (uint256[] memory cnts) { uint256 originalIdx = buf.idx; cnts = new uint256[](maxtag + 1); // protobuf's tags are from 1 rather than 0 uint256 tag; WireType wire; while (hasMore(buf)) { (tag, wire) = decKey(buf); cnts[tag] += 1; skipValue(buf, wire); } buf.idx = originalIdx; } // read varint from current buf idx, move buf.idx to next read, return the int value function decVarint(Buffer memory buf) internal pure returns (uint256 v) { bytes10 tmp; // proto int is at most 10 bytes (7 bits can be used per byte) bytes memory bb = buf.b; // get buf.b mem addr to use in assembly v = buf.idx; // use v to save one additional uint variable assembly { tmp := mload(add(add(bb, 32), v)) // load 10 bytes from buf.b[buf.idx] to tmp } uint256 b; // store current byte content v = 0; // reset to 0 for return value for (uint256 i = 0; i < 10; i++) { assembly { b := byte(i, tmp) // don't use tmp[i] because it does bound check and costs extra } v |= (b & 0x7F) << (i * 7); if (b & 0x80 == 0) { buf.idx += i + 1; return v; } } revert(); // i=10, invalid varint stream } // read length delimited field and return bytes function decBytes(Buffer memory buf) internal pure returns (bytes memory b) { uint256 len = decVarint(buf); uint256 end = buf.idx + len; require(end <= buf.b.length); // avoid overflow b = new bytes(len); bytes memory bufB = buf.b; // get buf.b mem addr to use in assembly uint256 bStart; uint256 bufBStart = buf.idx; assembly { bStart := add(b, 32) bufBStart := add(add(bufB, 32), bufBStart) } for (uint256 i = 0; i < len; i += 32) { assembly { mstore(add(bStart, i), mload(add(bufBStart, i))) } } buf.idx = end; } // return packed ints function decPacked(Buffer memory buf) internal pure returns (uint256[] memory t) { uint256 len = decVarint(buf); uint256 end = buf.idx + len; require(end <= buf.b.length); // avoid overflow // array in memory must be init w/ known length // so we have to create a tmp array w/ max possible len first uint256[] memory tmp = new uint256[](len); uint256 i = 0; // count how many ints are there while (buf.idx < end) { tmp[i] = decVarint(buf); i++; } t = new uint256[](i); // init t with correct length for (uint256 j = 0; j < i; j++) { t[j] = tmp[j]; } return t; } // move idx pass current value field, to beginning of next tag or msg end function skipValue(Buffer memory buf, WireType wire) internal pure { if (wire == WireType.Varint) { decVarint(buf); } else if (wire == WireType.LengthDelim) { uint256 len = decVarint(buf); buf.idx += len; // skip len bytes value data require(buf.idx <= buf.b.length); // avoid overflow } else { revert(); } // unsupported wiretype } // type conversion help utils function _bool(uint256 x) internal pure returns (bool v) { return x != 0; } function _uint256(bytes memory b) internal pure returns (uint256 v) { require(b.length <= 32); // b's length must be smaller than or equal to 32 assembly { v := mload(add(b, 32)) } // load all 32bytes to v v = v >> (8 * (32 - b.length)); // only first b.length is valid } function _address(bytes memory b) internal pure returns (address v) { v = _addressPayable(b); } function _addressPayable(bytes memory b) internal pure returns (address payable v) { require(b.length == 20); //load 32bytes then shift right 12 bytes assembly { v := div(mload(add(b, 32)), 0x1000000000000000000000000) } } function _bytes32(bytes memory b) internal pure returns (bytes32 v) { require(b.length == 32); assembly { v := mload(add(b, 32)) } } // uint[] to uint8[] function uint8s(uint256[] memory arr) internal pure returns (uint8[] memory t) { t = new uint8[](arr.length); for (uint256 i = 0; i < t.length; i++) { t[i] = uint8(arr[i]); } } function uint32s(uint256[] memory arr) internal pure returns (uint32[] memory t) { t = new uint32[](arr.length); for (uint256 i = 0; i < t.length; i++) { t[i] = uint32(arr[i]); } } function uint64s(uint256[] memory arr) internal pure returns (uint64[] memory t) { t = new uint64[](arr.length); for (uint256 i = 0; i < t.length; i++) { t[i] = uint64(arr[i]); } } function bools(uint256[] memory arr) internal pure returns (bool[] memory t) { t = new bool[](arr.length); for (uint256 i = 0; i < t.length; i++) { t[i] = arr[i] != 0; } } }
// SPDX-License-Identifier: MIT // OpenZeppelin Contracts v4.4.1 (security/Pausable.sol) pragma solidity ^0.8.0; import "../utils/Context.sol"; /** * @dev Contract module which allows children to implement an emergency stop * mechanism that can be triggered by an authorized account. * * This module is used through inheritance. It will make available the * modifiers `whenNotPaused` and `whenPaused`, which can be applied to * the functions of your contract. Note that they will not be pausable by * simply including this module, only once the modifiers are put in place. */ abstract contract Pausable is Context { /** * @dev Emitted when the pause is triggered by `account`. */ event Paused(address account); /** * @dev Emitted when the pause is lifted by `account`. */ event Unpaused(address account); bool private _paused; /** * @dev Initializes the contract in unpaused state. */ constructor() { _paused = false; } /** * @dev Returns true if the contract is paused, and false otherwise. */ function paused() public view virtual returns (bool) { return _paused; } /** * @dev Modifier to make a function callable only when the contract is not paused. * * Requirements: * * - The contract must not be paused. */ modifier whenNotPaused() { require(!paused(), "Pausable: paused"); _; } /** * @dev Modifier to make a function callable only when the contract is paused. * * Requirements: * * - The contract must be paused. */ modifier whenPaused() { require(paused(), "Pausable: not paused"); _; } /** * @dev Triggers stopped state. * * Requirements: * * - The contract must not be paused. */ function _pause() internal virtual whenNotPaused { _paused = true; emit Paused(_msgSender()); } /** * @dev Returns to normal state. * * Requirements: * * - The contract must be paused. */ function _unpause() internal virtual whenPaused { _paused = false; emit Unpaused(_msgSender()); } }
// SPDX-License-Identifier: GPL-3.0-only pragma solidity ^0.8.0; /** * @dev Contract module which provides a basic access control mechanism, where * there is an account (an owner) that can be granted exclusive access to * specific functions. * * By default, the owner account will be the one that deploys the contract. This * can later be changed with {transferOwnership}. * * This module is used through inheritance. It will make available the modifier * `onlyOwner`, which can be applied to your functions to restrict their use to * the owner. * * This adds a normal func that setOwner if _owner is address(0). So we can't allow * renounceOwnership. So we can support Proxy based upgradable contract */ abstract contract Ownable { address private _owner; event OwnershipTransferred(address indexed previousOwner, address indexed newOwner); /** * @dev Initializes the contract setting the deployer as the initial owner. */ constructor() { _setOwner(msg.sender); } /** * @dev Only to be called by inherit contracts, in their init func called by Proxy * we require _owner == address(0), which is only possible when it's a delegateCall * because constructor sets _owner in contract state. */ function initOwner() internal { require(_owner == address(0), "owner already set"); _setOwner(msg.sender); } /** * @dev Returns the address of the current owner. */ function owner() public view virtual returns (address) { return _owner; } /** * @dev Throws if called by any account other than the owner. */ modifier onlyOwner() { require(owner() == msg.sender, "Ownable: caller is not the owner"); _; } /** * @dev Transfers ownership of the contract to a new account (`newOwner`). * Can only be called by the current owner. */ function transferOwnership(address newOwner) public virtual onlyOwner { require(newOwner != address(0), "Ownable: new owner is the zero address"); _setOwner(newOwner); } function _setOwner(address newOwner) private { address oldOwner = _owner; _owner = newOwner; emit OwnershipTransferred(oldOwner, newOwner); } }
// SPDX-License-Identifier: MIT // OpenZeppelin Contracts v4.4.1 (utils/Context.sol) pragma solidity ^0.8.0; /** * @dev Provides information about the current execution context, including the * sender of the transaction and its data. While these are generally available * via msg.sender and msg.data, they should not be accessed in such a direct * manner, since when dealing with meta-transactions the account sending and * paying for execution may not be the actual sender (as far as an application * is concerned). * * This contract is only required for intermediate, library-like contracts. */ abstract contract Context { function _msgSender() internal view virtual returns (address) { return msg.sender; } function _msgData() internal view virtual returns (bytes calldata) { return msg.data; } }
// SPDX-License-Identifier: GPL-3.0-only pragma solidity 0.8.9; import "./Ownable.sol"; abstract contract Governor is Ownable { mapping(address => bool) public governors; event GovernorAdded(address account); event GovernorRemoved(address account); modifier onlyGovernor() { require(isGovernor(msg.sender), "Caller is not governor"); _; } constructor() { _addGovernor(msg.sender); } function isGovernor(address _account) public view returns (bool) { return governors[_account]; } function addGovernor(address _account) public onlyOwner { _addGovernor(_account); } function removeGovernor(address _account) public onlyOwner { _removeGovernor(_account); } function renounceGovernor() public { _removeGovernor(msg.sender); } function _addGovernor(address _account) private { require(!isGovernor(_account), "Account is already governor"); governors[_account] = true; emit GovernorAdded(_account); } function _removeGovernor(address _account) private { require(isGovernor(_account), "Account is not governor"); governors[_account] = false; emit GovernorRemoved(_account); } }
{ "optimizer": { "enabled": true, "runs": 800 }, "outputSelection": { "*": { "*": [ "evm.bytecode", "evm.deployedBytecode", "devdoc", "userdoc", "metadata", "abi" ] } }, "metadata": { "useLiteralContent": true }, "libraries": {} }
[{"inputs":[{"internalType":"contract ISigsVerifier","name":"_sigsVerifier","type":"address"}],"stateMutability":"nonpayable","type":"constructor"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"bytes32","name":"burnId","type":"bytes32"},{"indexed":false,"internalType":"address","name":"token","type":"address"},{"indexed":false,"internalType":"address","name":"account","type":"address"},{"indexed":false,"internalType":"uint256","name":"amount","type":"uint256"},{"indexed":false,"internalType":"uint64","name":"toChainId","type":"uint64"},{"indexed":false,"internalType":"address","name":"toAccount","type":"address"},{"indexed":false,"internalType":"uint64","name":"nonce","type":"uint64"}],"name":"Burn","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"uint256","name":"period","type":"uint256"}],"name":"DelayPeriodUpdated","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"address","name":"token","type":"address"},{"indexed":false,"internalType":"uint256","name":"threshold","type":"uint256"}],"name":"DelayThresholdUpdated","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"bytes32","name":"id","type":"bytes32"}],"name":"DelayedTransferAdded","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"bytes32","name":"id","type":"bytes32"},{"indexed":false,"internalType":"address","name":"receiver","type":"address"},{"indexed":false,"internalType":"address","name":"token","type":"address"},{"indexed":false,"internalType":"uint256","name":"amount","type":"uint256"}],"name":"DelayedTransferExecuted","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"uint256","name":"length","type":"uint256"}],"name":"EpochLengthUpdated","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"address","name":"token","type":"address"},{"indexed":false,"internalType":"uint256","name":"cap","type":"uint256"}],"name":"EpochVolumeUpdated","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"address","name":"account","type":"address"}],"name":"GovernorAdded","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"address","name":"account","type":"address"}],"name":"GovernorRemoved","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"address","name":"token","type":"address"},{"indexed":false,"internalType":"uint256","name":"amount","type":"uint256"}],"name":"MaxBurnUpdated","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"address","name":"token","type":"address"},{"indexed":false,"internalType":"uint256","name":"amount","type":"uint256"}],"name":"MinBurnUpdated","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"bytes32","name":"mintId","type":"bytes32"},{"indexed":false,"internalType":"address","name":"token","type":"address"},{"indexed":false,"internalType":"address","name":"account","type":"address"},{"indexed":false,"internalType":"uint256","name":"amount","type":"uint256"},{"indexed":false,"internalType":"uint64","name":"refChainId","type":"uint64"},{"indexed":false,"internalType":"bytes32","name":"refId","type":"bytes32"},{"indexed":false,"internalType":"address","name":"depositor","type":"address"}],"name":"Mint","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"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"address","name":"account","type":"address"}],"name":"Paused","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"address","name":"account","type":"address"}],"name":"PauserAdded","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"address","name":"account","type":"address"}],"name":"PauserRemoved","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"address","name":"token","type":"address"},{"indexed":false,"internalType":"uint256","name":"supply","type":"uint256"}],"name":"SupplyUpdated","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"address","name":"account","type":"address"}],"name":"Unpaused","type":"event"},{"inputs":[{"internalType":"address","name":"_account","type":"address"}],"name":"addGovernor","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"account","type":"address"}],"name":"addPauser","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"_token","type":"address"},{"internalType":"uint256","name":"_amount","type":"uint256"},{"internalType":"uint64","name":"_toChainId","type":"uint64"},{"internalType":"address","name":"_toAccount","type":"address"},{"internalType":"uint64","name":"_nonce","type":"uint64"}],"name":"burn","outputs":[{"internalType":"bytes32","name":"","type":"bytes32"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"_token","type":"address"},{"internalType":"uint256","name":"_amount","type":"uint256"},{"internalType":"uint64","name":"_toChainId","type":"uint64"},{"internalType":"address","name":"_toAccount","type":"address"},{"internalType":"uint64","name":"_nonce","type":"uint64"}],"name":"burnFrom","outputs":[{"internalType":"bytes32","name":"","type":"bytes32"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"_token","type":"address"},{"internalType":"uint256","name":"_delta","type":"uint256"}],"name":"decreaseSupply","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"delayPeriod","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"","type":"address"}],"name":"delayThresholds","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"bytes32","name":"","type":"bytes32"}],"name":"delayedTransfers","outputs":[{"internalType":"address","name":"receiver","type":"address"},{"internalType":"address","name":"token","type":"address"},{"internalType":"uint256","name":"amount","type":"uint256"},{"internalType":"uint256","name":"timestamp","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"epochLength","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"","type":"address"}],"name":"epochVolumeCaps","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"","type":"address"}],"name":"epochVolumes","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"bytes32","name":"id","type":"bytes32"}],"name":"executeDelayedTransfer","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"","type":"address"}],"name":"governors","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"_token","type":"address"},{"internalType":"uint256","name":"_delta","type":"uint256"}],"name":"increaseSupply","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"_account","type":"address"}],"name":"isGovernor","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"account","type":"address"}],"name":"isPauser","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"","type":"address"}],"name":"lastOpTimestamps","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"","type":"address"}],"name":"maxBurn","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"","type":"address"}],"name":"minBurn","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"bytes","name":"_request","type":"bytes"},{"internalType":"bytes[]","name":"_sigs","type":"bytes[]"},{"internalType":"address[]","name":"_signers","type":"address[]"},{"internalType":"uint256[]","name":"_powers","type":"uint256[]"}],"name":"mint","outputs":[{"internalType":"bytes32","name":"","type":"bytes32"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"owner","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"pause","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"paused","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"","type":"address"}],"name":"pausers","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"bytes32","name":"","type":"bytes32"}],"name":"records","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"_account","type":"address"}],"name":"removeGovernor","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"account","type":"address"}],"name":"removePauser","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"renounceGovernor","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"renouncePauser","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_period","type":"uint256"}],"name":"setDelayPeriod","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address[]","name":"_tokens","type":"address[]"},{"internalType":"uint256[]","name":"_thresholds","type":"uint256[]"}],"name":"setDelayThresholds","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_length","type":"uint256"}],"name":"setEpochLength","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address[]","name":"_tokens","type":"address[]"},{"internalType":"uint256[]","name":"_caps","type":"uint256[]"}],"name":"setEpochVolumeCaps","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address[]","name":"_tokens","type":"address[]"},{"internalType":"uint256[]","name":"_amounts","type":"uint256[]"}],"name":"setMaxBurn","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address[]","name":"_tokens","type":"address[]"},{"internalType":"uint256[]","name":"_amounts","type":"uint256[]"}],"name":"setMinBurn","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"_token","type":"address"},{"internalType":"uint256","name":"_supply","type":"uint256"}],"name":"setSupply","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"sigsVerifier","outputs":[{"internalType":"contract ISigsVerifier","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"","type":"address"}],"name":"supplies","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"newOwner","type":"address"}],"name":"transferOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"unpause","outputs":[],"stateMutability":"nonpayable","type":"function"}]
Contract Creation Code
60a06040523480156200001157600080fd5b50604051620032123803806200321283398101604081905262000034916200024f565b6200003f3362000074565b6000805460ff60a01b191690556200005733620000c4565b62000062336200018f565b6001600160a01b031660805262000281565b600080546001600160a01b038381166001600160a01b0319831681178455604051919092169283917f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e09190a35050565b6001600160a01b03811660009081526001602052604090205460ff1615620001335760405162461bcd60e51b815260206004820152601960248201527f4163636f756e7420697320616c7265616479207061757365720000000000000060448201526064015b60405180910390fd5b6001600160a01b038116600081815260016020818152604092839020805460ff191690921790915590519182527f6719d08c1888103bea251a4ed56406bd0c3e69723c8a1686e017e7bbe159b6f891015b60405180910390a150565b6001600160a01b03811660009081526002602052604090205460ff1615620001fa5760405162461bcd60e51b815260206004820152601b60248201527f4163636f756e7420697320616c726561647920676f7665726e6f72000000000060448201526064016200012a565b6001600160a01b038116600081815260026020908152604091829020805460ff1916600117905590519182527fdc5a48d79e2e147530ff63ecdbed5a5a66adb9d5cf339384d5d076da197c40b5910162000184565b6000602082840312156200026257600080fd5b81516001600160a01b03811681146200027a57600080fd5b9392505050565b608051612f6e620002a460003960008181610601015261157b0152612f6e6000f3fe608060405234801561001057600080fd5b50600436106102c85760003560e01c806382dc1ec41161017b578063bf4816f0116100d8578063eecdac881161008c578063f832138311610071578063f8321383146106a0578063f8734302146106c0578063f9a8ea08146106d357600080fd5b8063eecdac881461067a578063f2fde38b1461068d57600080fd5b8063e026049c116100bd578063e026049c14610623578063e3eece261461062b578063e43581b81461064e57600080fd5b8063bf4816f0146105e9578063ccf2683b146105fc57600080fd5b8063a00293011161012f578063b1c94d9411610114578063b1c94d94146105ad578063b4d8cedc146105b6578063b5f2bc47146105c957600080fd5b8063a00293011461052d578063adc0d57f1461054057600080fd5b80638da5cb5b116101605780638da5cb5b146104e25780639e25fc5c146105075780639e422c331461051a57600080fd5b806382dc1ec4146104c75780638456cb59146104da57600080fd5b806352532faa116102295780636b2c0f55116101dd57806379fcd8ee116101c257806379fcd8ee146104715780637f8560131461048457806380f51c12146104a457600080fd5b80636b2c0f55146104565780636ef8d66d1461046957600080fd5b806357d775f81161020e57806357d775f81461041b5780635c975abb1461042457806360216b001461043657600080fd5b806352532faa146103e857806354eea7961461040857600080fd5b80633d5721071161028057806346fbf68e1161026557806346fbf68e1461038957806347b16c6c146103b5578063497bf3b2146103c857600080fd5b80633d5721071461036e5780633f4ba83a1461038157600080fd5b806317bdbae5116102b157806317bdbae51461031a578063274cee311461032d5780633c4a25d01461035b57600080fd5b806301e64725146102cd57806315d0975c14610305575b600080fd5b6102f06102db3660046129b4565b600a6020526000908152604090205460ff1681565b60405190151581526020015b60405180910390f35b6103186103133660046129e9565b6106e6565b005b610318610328366004612a5f565b6107d7565b61034d61033b366004612acb565b600b6020526000908152604090205481565b6040519081526020016102fc565b610318610369366004612acb565b610975565b61031861037c3660046129b4565b6109ea565b610318610a7e565b6102f0610397366004612acb565b6001600160a01b031660009081526001602052604090205460ff1690565b6103186103c3366004612a5f565b610ae7565b61034d6103d6366004612acb565b600d6020526000908152604090205481565b61034d6103f6366004612acb565b60086020526000908152604090205481565b6103186104163660046129b4565b610c7e565b61034d60035481565b600054600160a01b900460ff166102f0565b61034d610444366004612acb565b60046020526000908152604090205481565b610318610464366004612acb565b610d0b565b610318610d7d565b61031861047f3660046129e9565b610d86565b61034d610492366004612acb565b600c6020526000908152604090205481565b6102f06104b2366004612acb565b60016020526000908152604090205460ff1681565b6103186104d5366004612acb565b610e17565b610318610e89565b6000546001600160a01b03165b6040516001600160a01b0390911681526020016102fc565b6103186105153660046129b4565b610ef0565b61034d610528366004612b05565b610fbd565b61034d61053b366004612b05565b611089565b61058261054e3660046129b4565b60076020526000908152604090208054600182015460028301546003909301546001600160a01b0392831693919092169184565b604080516001600160a01b0395861681529490931660208501529183015260608201526080016102fc565b61034d60095481565b6103186105c43660046129e9565b61111c565b61034d6105d7366004612acb565b60056020526000908152604090205481565b6103186105f7366004612a5f565b6111d6565b6104ef7f000000000000000000000000000000000000000000000000000000000000000081565b61031861136d565b6102f0610639366004612acb565b60026020526000908152604090205460ff1681565b6102f061065c366004612acb565b6001600160a01b031660009081526002602052604090205460ff1690565b610318610688366004612acb565b611376565b61031861069b366004612acb565b6113e8565b61034d6106ae366004612acb565b60066020526000908152604090205481565b61034d6106ce366004612b63565b6114d6565b6103186106e1366004612a5f565b611921565b336106f96000546001600160a01b031690565b6001600160a01b0316146107545760405162461bcd60e51b815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e657260448201526064015b60405180910390fd5b6001600160a01b0382166000908152600b60205260408120805483929061077c908490612c68565b90915550506001600160a01b0382166000818152600b6020908152604091829020548251938452908301527feb2f7272b55acd6dea98f5742868e8d2221ad82acb36b2d0cdd00150290e949991015b60405180910390a15050565b3360009081526002602052604090205460ff1661082f5760405162461bcd60e51b815260206004820152601660248201527521b0b63632b91034b9903737ba1033b7bb32b93737b960511b604482015260640161074b565b8281146108705760405162461bcd60e51b815260206004820152600f60248201526e0d8cadccee8d040dad2e6dac2e8c6d608b1b604482015260640161074b565b60005b8381101561096e5782828281811061088d5761088d612c7f565b90506020020135600860008787858181106108aa576108aa612c7f565b90506020020160208101906108bf9190612acb565b6001600160a01b031681526020810191909152604001600020557fceaad6533bfb481492fb3e08ef19297f46611b8fa9de5ef4cf8dc23a56ad09ce85858381811061090c5761090c612c7f565b90506020020160208101906109219190612acb565b84848481811061093357610933612c7f565b604080516001600160a01b0390951685526020918202939093013590840152500160405180910390a18061096681612c95565b915050610873565b5050505050565b336109886000546001600160a01b031690565b6001600160a01b0316146109de5760405162461bcd60e51b815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572604482015260640161074b565b6109e781611ab8565b50565b3360009081526002602052604090205460ff16610a425760405162461bcd60e51b815260206004820152601660248201527521b0b63632b91034b9903737ba1033b7bb32b93737b960511b604482015260640161074b565b60098190556040518181527fc0a39f234199b125fb93713c4d067bdcebbf691087f87b79c0feb92b156ba8b6906020015b60405180910390a150565b3360009081526001602052604090205460ff16610add5760405162461bcd60e51b815260206004820152601460248201527f43616c6c6572206973206e6f7420706175736572000000000000000000000000604482015260640161074b565b610ae5611b75565b565b3360009081526002602052604090205460ff16610b3f5760405162461bcd60e51b815260206004820152601660248201527521b0b63632b91034b9903737ba1033b7bb32b93737b960511b604482015260640161074b565b828114610b805760405162461bcd60e51b815260206004820152600f60248201526e0d8cadccee8d040dad2e6dac2e8c6d608b1b604482015260640161074b565b60005b8381101561096e57828282818110610b9d57610b9d612c7f565b9050602002013560056000878785818110610bba57610bba612c7f565b9050602002016020810190610bcf9190612acb565b6001600160a01b031681526020810191909152604001600020557f608e49c22994f20b5d3496dca088b88dfd81b4a3e8cc3809ea1e10a320107e89858583818110610c1c57610c1c612c7f565b9050602002016020810190610c319190612acb565b848484818110610c4357610c43612c7f565b604080516001600160a01b0390951685526020918202939093013590840152500160405180910390a180610c7681612c95565b915050610b83565b3360009081526002602052604090205460ff16610cd65760405162461bcd60e51b815260206004820152601660248201527521b0b63632b91034b9903737ba1033b7bb32b93737b960511b604482015260640161074b565b60038190556040518181527f2664fec2ff76486ac58ed087310855b648b15b9d19f3de8529e95f7c46b7d6b390602001610a73565b33610d1e6000546001600160a01b031690565b6001600160a01b031614610d745760405162461bcd60e51b815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572604482015260640161074b565b6109e781611c1b565b610ae533611c1b565b33610d996000546001600160a01b031690565b6001600160a01b031614610def5760405162461bcd60e51b815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572604482015260640161074b565b6001600160a01b0382166000908152600b60205260408120805483929061077c908490612cb0565b33610e2a6000546001600160a01b031690565b6001600160a01b031614610e805760405162461bcd60e51b815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572604482015260640161074b565b6109e781611cd4565b3360009081526001602052604090205460ff16610ee85760405162461bcd60e51b815260206004820152601460248201527f43616c6c6572206973206e6f7420706175736572000000000000000000000000604482015260640161074b565b610ae5611d92565b600054600160a01b900460ff1615610f3d5760405162461bcd60e51b815260206004820152601060248201526f14185d5cd8589b194e881c185d5cd95960821b604482015260640161074b565b6000610f4882611e1a565b6020810151815160408084015190516340c10f1960e01b81526001600160a01b039283166004820152602481019190915292935016906340c10f1990604401600060405180830381600087803b158015610fa157600080fd5b505af1158015610fb5573d6000803e3d6000fd5b505050505050565b60008054600160a01b900460ff161561100b5760405162461bcd60e51b815260206004820152601060248201526f14185d5cd8589b194e881c185d5cd95960821b604482015260640161074b565b600061101a8787878787611fec565b60405163079cc67960e41b8152336004820152602481018890529091506001600160a01b038816906379cc6790906044015b600060405180830381600087803b15801561106657600080fd5b505af115801561107a573d6000803e3d6000fd5b50929998505050505050505050565b60008054600160a01b900460ff16156110d75760405162461bcd60e51b815260206004820152601060248201526f14185d5cd8589b194e881c185d5cd95960821b604482015260640161074b565b60006110e68787878787611fec565b604051632770a7eb60e21b8152336004820152602481018890529091506001600160a01b03881690639dc29fac9060440161104c565b3361112f6000546001600160a01b031690565b6001600160a01b0316146111855760405162461bcd60e51b815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572604482015260640161074b565b6001600160a01b0382166000818152600b6020908152604091829020849055815192835282018390527feb2f7272b55acd6dea98f5742868e8d2221ad82acb36b2d0cdd00150290e949991016107cb565b3360009081526002602052604090205460ff1661122e5760405162461bcd60e51b815260206004820152601660248201527521b0b63632b91034b9903737ba1033b7bb32b93737b960511b604482015260640161074b565b82811461126f5760405162461bcd60e51b815260206004820152600f60248201526e0d8cadccee8d040dad2e6dac2e8c6d608b1b604482015260640161074b565b60005b8381101561096e5782828281811061128c5761128c612c7f565b90506020020135600c60008787858181106112a9576112a9612c7f565b90506020020160208101906112be9190612acb565b6001600160a01b031681526020810191909152604001600020557f3796cd0b17a8734f8da819920625598e9a18be490f686725282e5383f1d0668385858381811061130b5761130b612c7f565b90506020020160208101906113209190612acb565b84848481811061133257611332612c7f565b604080516001600160a01b0390951685526020918202939093013590840152500160405180910390a18061136581612c95565b915050611272565b610ae53361228c565b336113896000546001600160a01b031690565b6001600160a01b0316146113df5760405162461bcd60e51b815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572604482015260640161074b565b6109e78161228c565b336113fb6000546001600160a01b031690565b6001600160a01b0316146114515760405162461bcd60e51b815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572604482015260640161074b565b6001600160a01b0381166114cd5760405162461bcd60e51b815260206004820152602660248201527f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160448201527f6464726573730000000000000000000000000000000000000000000000000000606482015260840161074b565b6109e781612345565b60008054600160a01b900460ff16156115245760405162461bcd60e51b815260206004820152601060248201526f14185d5cd8589b194e881c185d5cd95960821b604482015260640161074b565b6000463060405160200161156192919091825260601b6bffffffffffffffffffffffff1916602082015263135a5b9d60e21b603482015260380190565b6040516020818303038152906040528051906020012090507f00000000000000000000000000000000000000000000000000000000000000006001600160a01b031663682dbc22828c8c6040516020016115bd93929190612cc8565b6040516020818303038152906040528a8a8a8a8a8a6040518863ffffffff1660e01b81526004016115f49796959493929190612e2f565b60006040518083038186803b15801561160c57600080fd5b505afa158015611620573d6000803e3d6000fd5b5050505060006116658b8b8080601f0160208091040260200160405190810160405280939291908181526020018383808284376000920191909152506123a292505050565b6020818101518251604080850151606080870151608088015160a089015185516bffffffffffffffffffffffff1998851b8916818b015296841b88166034880152604887019490945290821b8616606886015277ffffffffffffffffffffffffffffffffffffffffffffffff1960c09190911b16607c850152608484019190915230901b90921660a48201528151808203609801815260b890910182528051908301206000818152600a9093529120549192509060ff16156117595760405162461bcd60e51b815260206004820152600d60248201526c7265636f72642065786973747360981b604482015260640161074b565b6000818152600a602052604090819020805460ff191660011790558251908301516117849190612504565b81516001600160a01b031660009081526008602052604090205480158015906117b05750808360400151115b156117d2576117cd8284602001518560000151866040015161261c565b611842565b8251602084015160408086015190516340c10f1960e01b81526001600160a01b03928316600482015260248101919091529116906340c10f1990604401600060405180830381600087803b15801561182957600080fd5b505af115801561183d573d6000803e3d6000fd5b505050505b60408084015184516001600160a01b03166000908152600b602052918220805491929091611871908490612cb0565b925050819055507f5bc84ecccfced5bb04bfc7f3efcdbe7f5cd21949ef146811b4d1967fe41f777a8284600001518560200151866040015187608001518860a00151896060015160405161190997969594939291909687526001600160a01b0395861660208801529385166040870152606086019290925267ffffffffffffffff16608085015260a08401521660c082015260e00190565b60405180910390a1509b9a5050505050505050505050565b3360009081526002602052604090205460ff166119795760405162461bcd60e51b815260206004820152601660248201527521b0b63632b91034b9903737ba1033b7bb32b93737b960511b604482015260640161074b565b8281146119ba5760405162461bcd60e51b815260206004820152600f60248201526e0d8cadccee8d040dad2e6dac2e8c6d608b1b604482015260640161074b565b60005b8381101561096e578282828181106119d7576119d7612c7f565b90506020020135600d60008787858181106119f4576119f4612c7f565b9050602002016020810190611a099190612acb565b6001600160a01b031681526020810191909152604001600020557fa3181379f6db47d9037efc6b6e8e3efe8c55ddb090b4f0512c152f97c4e47da5858583818110611a5657611a56612c7f565b9050602002016020810190611a6b9190612acb565b848484818110611a7d57611a7d612c7f565b604080516001600160a01b0390951685526020918202939093013590840152500160405180910390a180611ab081612c95565b9150506119bd565b6001600160a01b03811660009081526002602052604090205460ff1615611b215760405162461bcd60e51b815260206004820152601b60248201527f4163636f756e7420697320616c726561647920676f7665726e6f720000000000604482015260640161074b565b6001600160a01b038116600081815260026020908152604091829020805460ff1916600117905590519182527fdc5a48d79e2e147530ff63ecdbed5a5a66adb9d5cf339384d5d076da197c40b59101610a73565b600054600160a01b900460ff16611bce5760405162461bcd60e51b815260206004820152601460248201527f5061757361626c653a206e6f7420706175736564000000000000000000000000604482015260640161074b565b6000805460ff60a01b191690557f5db9ee0a495bf2e6ff9c91a7834c1ba4fdd244a5e8aa4e537bd38aeae4b073aa335b6040516001600160a01b03909116815260200160405180910390a1565b6001600160a01b03811660009081526001602052604090205460ff16611c835760405162461bcd60e51b815260206004820152601560248201527f4163636f756e74206973206e6f74207061757365720000000000000000000000604482015260640161074b565b6001600160a01b038116600081815260016020908152604091829020805460ff1916905590519182527fcd265ebaf09df2871cc7bd4133404a235ba12eff2041bb89d9c714a2621c7c7e9101610a73565b6001600160a01b03811660009081526001602052604090205460ff1615611d3d5760405162461bcd60e51b815260206004820152601960248201527f4163636f756e7420697320616c72656164792070617573657200000000000000604482015260640161074b565b6001600160a01b038116600081815260016020818152604092839020805460ff191690921790915590519182527f6719d08c1888103bea251a4ed56406bd0c3e69723c8a1686e017e7bbe159b6f89101610a73565b600054600160a01b900460ff1615611ddf5760405162461bcd60e51b815260206004820152601060248201526f14185d5cd8589b194e881c185d5cd95960821b604482015260640161074b565b6000805460ff60a01b1916600160a01b1790557f62e78cea01bee320cd4e420270b5ea74000d11b0c9f74754ebdbfc544b05a258611bfe3390565b604080516080810182526000808252602082018190529181018290526060810191909152600082815260076020908152604091829020825160808101845281546001600160a01b0390811682526001830154169281019290925260028101549282019290925260039091015460608201819052611ed95760405162461bcd60e51b815260206004820152601a60248201527f64656c61796564207472616e73666572206e6f74206578697374000000000000604482015260640161074b565b6009548160600151611eeb9190612cb0565b4211611f395760405162461bcd60e51b815260206004820152601d60248201527f64656c61796564207472616e73666572207374696c6c206c6f636b6564000000604482015260640161074b565b6000838152600760209081526040808320805473ffffffffffffffffffffffffffffffffffffffff199081168255600182018054909116905560028101849055600301929092558251908301518383015192517f3b40e5089937425d14cdd96947e5661868357e224af59bd8b24a4b8a330d442693611fde93889390929091909384526001600160a01b03928316602085015291166040830152606082015260800190565b60405180910390a192915050565b6001600160a01b0385166000908152600c602052604081205485116120535760405162461bcd60e51b815260206004820152601060248201527f616d6f756e7420746f6f20736d616c6c00000000000000000000000000000000604482015260640161074b565b6001600160a01b0386166000908152600d6020526040902054158061209057506001600160a01b0386166000908152600d60205260409020548511155b6120dc5760405162461bcd60e51b815260206004820152601060248201527f616d6f756e7420746f6f206c6172676500000000000000000000000000000000604482015260640161074b565b6001600160a01b0386166000908152600b602052604081208054879290612104908490612c68565b90915550506040516bffffffffffffffffffffffff1933606090811b8216602084015288811b821660348401526048830188905277ffffffffffffffffffffffffffffffffffffffffffffffff1960c088811b8216606886015287831b8416607086015286811b8216608486015246901b16608c84015230901b16609482015260009060a80160408051601f1981840301815291815281516020928301206000818152600a90935291205490915060ff16156121f25760405162461bcd60e51b815260206004820152600d60248201526c7265636f72642065786973747360981b604482015260640161074b565b6000818152600a6020908152604091829020805460ff1916600117905581518381526001600160a01b038a81169282019290925233928101929092526060820188905267ffffffffffffffff878116608084015290861660a0830152841660c08201527f6298d7b58f235730b3b399dc5c282f15dae8b022e5fbbf89cee21fd83c8810a39060e00160405180910390a19695505050505050565b6001600160a01b03811660009081526002602052604090205460ff166122f45760405162461bcd60e51b815260206004820152601760248201527f4163636f756e74206973206e6f7420676f7665726e6f72000000000000000000604482015260640161074b565b6001600160a01b038116600081815260026020908152604091829020805460ff1916905590519182527f1ebe834e73d60a5fec822c1e1727d34bc79f2ad977ed504581cc1822fe20fb5b9101610a73565b600080546001600160a01b0383811673ffffffffffffffffffffffffffffffffffffffff19831681178455604051919092169283917f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e09190a35050565b6040805160c08101825260008082526020808301829052828401829052606083018290526080830182905260a0830182905283518085019094528184528301849052909190805b602083015151835110156124fc576124008361273c565b9092509050816001141561242f5761241f61241a84612776565b612833565b6001600160a01b031684526123e9565b81600214156124575761244461241a84612776565b6001600160a01b031660208501526123e9565b816003141561247b5761247161246c84612776565b612844565b60408501526123e9565b81600414156124a35761249061241a84612776565b6001600160a01b031660608501526123e9565b81600514156124c9576124b58361287b565b67ffffffffffffffff1660808501526123e9565b81600614156124ed576124e36124de84612776565b6128fd565b60a08501526123e9565b6124f78382612915565b6123e9565b505050919050565b60035461250f575050565b6001600160a01b0382166000908152600560205260409020548061253257505050565b6001600160a01b0383166000908152600460205260408120546003549091429161255c8184612ecb565b6125669190612eed565b6001600160a01b0387166000908152600660205260409020549091508111156125915784925061259e565b61259b8584612cb0565b92505b838311156125ee5760405162461bcd60e51b815260206004820152601260248201527f766f6c756d652065786365656473206361700000000000000000000000000000604482015260640161074b565b506001600160a01b039094166000908152600460209081526040808320939093556006905220929092555050565b6000848152600760205260409020600301541561267b5760405162461bcd60e51b815260206004820152601f60248201527f64656c61796564207472616e7366657220616c72656164792065786973747300604482015260640161074b565b604080516080810182526001600160a01b0380861682528481166020808401918252838501868152426060860190815260008b81526007909352918690209451855490851673ffffffffffffffffffffffffffffffffffffffff1991821617865592516001860180549190951693169290921790925551600283015551600390910155517fcbcfffe5102114216a85d3aceb14ad4b81a3935b1b5c468fadf3889eb9c5dce69061272e9086815260200190565b60405180910390a150505050565b600080600061274a8461287b565b9050612757600882612ecb565b925080600716600581111561276e5761276e612f0c565b915050915091565b606060006127838361287b565b905060008184600001516127979190612cb0565b90508360200151518111156127ab57600080fd5b8167ffffffffffffffff8111156127c4576127c4612f22565b6040519080825280601f01601f1916602001820160405280156127ee576020820181803683370190505b50602080860151865192955091818601919083010160005b85811015612828578181015183820152612821602082612cb0565b9050612806565b505050935250919050565b600061283e8261298c565b92915050565b600060208251111561285557600080fd5b602082015190508151602061286a9190612c68565b612875906008612eed565b1c919050565b602080820151825181019091015160009182805b600a8110156128f75783811a91506128a8816007612eed565b82607f16901b8517945081608016600014156128e5576128c9816001612cb0565b865187906128d8908390612cb0565b9052509395945050505050565b806128ef81612c95565b91505061288f565b50600080fd5b6000815160201461290d57600080fd5b506020015190565b600081600581111561292957612929612f0c565b141561293d576129388261287b565b505050565b600281600581111561295157612951612f0c565b14156102c85760006129628361287b565b905080836000018181516129769190612cb0565b9052506020830151518351111561293857600080fd5b6000815160141461299c57600080fd5b50602001516c01000000000000000000000000900490565b6000602082840312156129c657600080fd5b5035919050565b80356001600160a01b03811681146129e457600080fd5b919050565b600080604083850312156129fc57600080fd5b612a05836129cd565b946020939093013593505050565b60008083601f840112612a2557600080fd5b50813567ffffffffffffffff811115612a3d57600080fd5b6020830191508360208260051b8501011115612a5857600080fd5b9250929050565b60008060008060408587031215612a7557600080fd5b843567ffffffffffffffff80821115612a8d57600080fd5b612a9988838901612a13565b90965094506020870135915080821115612ab257600080fd5b50612abf87828801612a13565b95989497509550505050565b600060208284031215612add57600080fd5b612ae6826129cd565b9392505050565b803567ffffffffffffffff811681146129e457600080fd5b600080600080600060a08688031215612b1d57600080fd5b612b26866129cd565b945060208601359350612b3b60408701612aed565b9250612b49606087016129cd565b9150612b5760808701612aed565b90509295509295909350565b6000806000806000806000806080898b031215612b7f57600080fd5b883567ffffffffffffffff80821115612b9757600080fd5b818b0191508b601f830112612bab57600080fd5b813581811115612bba57600080fd5b8c6020828501011115612bcc57600080fd5b60209283019a509850908a01359080821115612be757600080fd5b612bf38c838d01612a13565b909850965060408b0135915080821115612c0c57600080fd5b612c188c838d01612a13565b909650945060608b0135915080821115612c3157600080fd5b50612c3e8b828c01612a13565b999c989b5096995094979396929594505050565b634e487b7160e01b600052601160045260246000fd5b600082821015612c7a57612c7a612c52565b500390565b634e487b7160e01b600052603260045260246000fd5b6000600019821415612ca957612ca9612c52565b5060010190565b60008219821115612cc357612cc3612c52565b500190565b838152818360208301376000910160200190815292915050565b81835281816020850137506000828201602090810191909152601f909101601f19169091010190565b818352600060208085019450848460051b86018460005b87811015612d8c5783830389528135601e19883603018112612d4357600080fd5b8701803567ffffffffffffffff811115612d5c57600080fd5b803603891315612d6b57600080fd5b612d788582898501612ce2565b9a87019a9450505090840190600101612d22565b5090979650505050505050565b8183526000602080850194508260005b85811015612dd5576001600160a01b03612dc2836129cd565b1687529582019590820190600101612da9565b509495945050505050565b81835260007f07ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff831115612e1257600080fd5b8260051b8083602087013760009401602001938452509192915050565b608081526000885180608084015260005b81811015612e5d576020818c0181015160a0868401015201612e40565b81811115612e6f57600060a083860101525b50601f01601f1916820182810360a09081016020850152612e93908201898b612d0b565b90508281036040840152612ea8818789612d99565b90508281036060840152612ebd818587612de0565b9a9950505050505050505050565b600082612ee857634e487b7160e01b600052601260045260246000fd5b500490565b6000816000190483118215151615612f0757612f07612c52565b500290565b634e487b7160e01b600052602160045260246000fd5b634e487b7160e01b600052604160045260246000fdfea26469706673582212207f0483041017bb51352e4769b343fd0edbacc1fa8e07370faab4de961b1252de64736f6c63430008090033000000000000000000000000841ce48f9446c8e281d3f1444cb859b4a6d0738c
Constructor Arguments (ABI-Encoded and is the last bytes of the Contract Creation Code above)
000000000000000000000000841ce48f9446c8e281d3f1444cb859b4a6d0738c
-----Decoded View---------------
Arg [0] : _sigsVerifier (address): 0x841ce48f9446c8e281d3f1444cb859b4a6d0738c
-----Encoded View---------------
1 Constructor Arguments found :
Arg [0] : 000000000000000000000000841ce48f9446c8e281d3f1444cb859b4a6d0738c
Age | Block | Fee Address | BC Fee Address | Voting Power | Jailed | Incoming |
---|
Make sure to use the "Vote Down" button for any spammy posts, and the "Vote Up" for interesting conversations.