Feature Tip: Add private address tag to any address under My Name Tag !
Source Code
Overview
ETH Balance
0 ETH
Eth Value
$0.00Latest 25 from a total of 428 transactions
| Transaction Hash |
Method
|
Block
|
From
|
|
To
|
||||
|---|---|---|---|---|---|---|---|---|---|
| Admin Pause Tran... | 20870996 | 534 days ago | IN | 0 ETH | 0.00122923 | ||||
| Admin Withdraw | 20870982 | 534 days ago | IN | 0 ETH | 0.00150231 | ||||
| Admin Withdraw | 20870980 | 534 days ago | IN | 0 ETH | 0.00152098 | ||||
| Admin Withdraw | 20870973 | 534 days ago | IN | 0 ETH | 0.00143583 | ||||
| Admin Withdraw | 20870969 | 534 days ago | IN | 0 ETH | 0.00132512 | ||||
| Admin Withdraw | 20870966 | 534 days ago | IN | 0 ETH | 0.0013531 | ||||
| Admin Withdraw | 20870963 | 534 days ago | IN | 0 ETH | 0.00135009 | ||||
| Admin Withdraw | 20870961 | 534 days ago | IN | 0 ETH | 0.00134544 | ||||
| Admin Withdraw | 20870957 | 534 days ago | IN | 0 ETH | 0.00126446 | ||||
| Admin Withdraw | 20870955 | 534 days ago | IN | 0 ETH | 0.00117472 | ||||
| Admin Withdraw | 20870948 | 534 days ago | IN | 0 ETH | 0.00126661 | ||||
| Admin Withdraw | 20870943 | 534 days ago | IN | 0 ETH | 0.00127345 | ||||
| Admin Withdraw | 20870938 | 534 days ago | IN | 0 ETH | 0.00132053 | ||||
| Admin Withdraw | 20870936 | 534 days ago | IN | 0 ETH | 0.00131201 | ||||
| Admin Withdraw | 20870931 | 534 days ago | IN | 0 ETH | 0.00100504 | ||||
| Admin Withdraw | 20870927 | 534 days ago | IN | 0 ETH | 0.00115944 | ||||
| Admin Withdraw | 20870925 | 534 days ago | IN | 0 ETH | 0.00125327 | ||||
| Admin Withdraw | 20870921 | 534 days ago | IN | 0 ETH | 0.00124326 | ||||
| Admin Withdraw | 20870917 | 534 days ago | IN | 0 ETH | 0.00120695 | ||||
| Admin Withdraw | 20870912 | 534 days ago | IN | 0 ETH | 0.00119836 | ||||
| Admin Withdraw | 20870910 | 534 days ago | IN | 0 ETH | 0.00087888 | ||||
| Admin Withdraw | 20870906 | 534 days ago | IN | 0 ETH | 0.00086798 | ||||
| Admin Withdraw | 20870900 | 534 days ago | IN | 0 ETH | 0.00113825 | ||||
| Admin Withdraw | 20870896 | 534 days ago | IN | 0 ETH | 0.00087527 | ||||
| Admin Withdraw | 20870893 | 534 days ago | IN | 0 ETH | 0.00109217 |
View more zero value Internal Transactions in Advanced View mode
Advanced mode:
Loading...
Loading
Loading...
Loading
Cross-Chain Transactions
Loading...
Loading
Contract Name:
Bridge
Compiler Version
v0.7.4+commit.3f05b770
Optimization Enabled:
No with 200 runs
Other Settings:
default evmVersion
Contract Source Code (Solidity Standard Json-Input format)
// SPDX-License-Identifier: GPL-3.0-only
pragma solidity 0.7.4;
pragma experimental ABIEncoderV2;
import "./utils/AccessControl.sol";
import "./utils/Pausable.sol";
import "./utils/SafeMath.sol";
import "./interfaces/IDepositExecute.sol";
import "./interfaces/IBridge.sol";
import "./interfaces/IERCHandler.sol";
import "./interfaces/IGenericHandler.sol";
/**
@title Facilitates deposits, creation and votiing of deposit proposals, and deposit executions.
@author ChainSafe Systems.
*/
contract Bridge is Pausable, AccessControl, SafeMath {
uint8 public _chainID;
uint256 public _relayerThreshold;
uint256 public _totalRelayers;
uint256 public _totalProposals;
uint256 public _fee;
uint256 public _expiry;
enum Vote {No, Yes}
enum ProposalStatus {Inactive, Active, Passed, Executed, Cancelled}
struct Proposal {
bytes32 _resourceID;
bytes32 _dataHash;
address[] _yesVotes;
address[] _noVotes;
ProposalStatus _status;
uint256 _proposedBlock;
}
// destinationChainID => number of deposits
mapping(uint8 => uint64) public _depositCounts;
// resourceID => handler address
mapping(bytes32 => address) public _resourceIDToHandlerAddress;
// depositNonce => destinationChainID => bytes
mapping(uint64 => mapping(uint8 => bytes)) public _depositRecords;
// destinationChainID + depositNonce => dataHash => Proposal
mapping(uint72 => mapping(bytes32 => Proposal)) public _proposals;
// destinationChainID + depositNonce => dataHash => relayerAddress => bool
mapping(uint72 => mapping(bytes32 => mapping(address => bool))) public _hasVotedOnProposal;
event RelayerThresholdChanged(uint indexed newThreshold);
event RelayerAdded(address indexed relayer);
event RelayerRemoved(address indexed relayer);
event Deposit(
uint8 indexed destinationChainID,
bytes32 indexed resourceID,
uint64 indexed depositNonce
);
event ProposalEvent(
uint8 indexed originChainID,
uint64 indexed depositNonce,
ProposalStatus indexed status,
bytes32 resourceID,
bytes32 dataHash
);
event ProposalVote(
uint8 indexed originChainID,
uint64 indexed depositNonce,
ProposalStatus indexed status,
bytes32 resourceID
);
bytes32 public constant RELAYER_ROLE = keccak256("RELAYER_ROLE");
modifier onlyAdmin() {
_onlyAdmin();
_;
}
modifier onlyAdminOrRelayer() {
_onlyAdminOrRelayer();
_;
}
modifier onlyRelayers() {
_onlyRelayers();
_;
}
function _onlyAdminOrRelayer() private {
require(hasRole(DEFAULT_ADMIN_ROLE, msg.sender) || hasRole(RELAYER_ROLE, msg.sender),
"sender is not relayer or admin");
}
function _onlyAdmin() private {
require(hasRole(DEFAULT_ADMIN_ROLE, msg.sender), "sender doesn't have admin role");
}
function _onlyRelayers() private {
require(hasRole(RELAYER_ROLE, msg.sender), "sender doesn't have relayer role");
}
/**
@notice Initializes Bridge, creates and grants {msg.sender} the admin role,
creates and grants {initialRelayers} the relayer role.
@param chainID ID of chain the Bridge contract exists on.
@param initialRelayers Addresses that should be initially granted the relayer role.
@param initialRelayerThreshold Number of votes needed for a deposit proposal to be considered passed.
*/
constructor (uint8 chainID, address[] memory initialRelayers, uint initialRelayerThreshold, uint256 fee, uint256 expiry) {
_chainID = chainID;
_relayerThreshold = initialRelayerThreshold;
_fee = fee;
_expiry = expiry;
_setupRole(DEFAULT_ADMIN_ROLE, msg.sender);
_setRoleAdmin(RELAYER_ROLE, DEFAULT_ADMIN_ROLE);
for (uint i; i < initialRelayers.length; i++) {
grantRole(RELAYER_ROLE, initialRelayers[i]);
_totalRelayers++;
}
}
/**
@notice Returns true if {relayer} has the relayer role.
@param relayer Address to check.
*/
function isRelayer(address relayer) external view returns (bool) {
return hasRole(RELAYER_ROLE, relayer);
}
/**
@notice Removes admin role from {msg.sender} and grants it to {newAdmin}.
@notice Only callable by an address that currently has the admin role.
@param newAdmin Address that admin role will be granted to.
*/
function renounceAdmin(address newAdmin) external onlyAdmin {
grantRole(DEFAULT_ADMIN_ROLE, newAdmin);
renounceRole(DEFAULT_ADMIN_ROLE, msg.sender);
}
/**
@notice Pauses deposits, proposal creation and voting, and deposit executions.
@notice Only callable by an address that currently has the admin role.
*/
function adminPauseTransfers() external onlyAdmin {
_pause();
}
/**
@notice Unpauses deposits, proposal creation and voting, and deposit executions.
@notice Only callable by an address that currently has the admin role.
*/
function adminUnpauseTransfers() external onlyAdmin {
_unpause();
}
/**
@notice Modifies the number of votes required for a proposal to be considered passed.
@notice Only callable by an address that currently has the admin role.
@param newThreshold Value {_relayerThreshold} will be changed to.
@notice Emits {RelayerThresholdChanged} event.
*/
function adminChangeRelayerThreshold(uint newThreshold) external onlyAdmin {
_relayerThreshold = newThreshold;
emit RelayerThresholdChanged(newThreshold);
}
/**
@notice Grants {relayerAddress} the relayer role and increases {_totalRelayer} count.
@notice Only callable by an address that currently has the admin role.
@param relayerAddress Address of relayer to be added.
@notice Emits {RelayerAdded} event.
*/
function adminAddRelayer(address relayerAddress) external onlyAdmin {
require(!hasRole(RELAYER_ROLE, relayerAddress), "addr already has relayer role!");
grantRole(RELAYER_ROLE, relayerAddress);
emit RelayerAdded(relayerAddress);
_totalRelayers++;
}
/**
@notice Removes relayer role for {relayerAddress} and decreases {_totalRelayer} count.
@notice Only callable by an address that currently has the admin role.
@param relayerAddress Address of relayer to be removed.
@notice Emits {RelayerRemoved} event.
*/
function adminRemoveRelayer(address relayerAddress) external onlyAdmin {
require(hasRole(RELAYER_ROLE, relayerAddress), "addr doesn't have relayer role!");
revokeRole(RELAYER_ROLE, relayerAddress);
emit RelayerRemoved(relayerAddress);
_totalRelayers--;
}
/**
@notice Sets a new resource for handler contracts that use the IERCHandler interface,
and maps the {handlerAddress} to {resourceID} in {_resourceIDToHandlerAddress}.
@notice Only callable by an address that currently has the admin role.
@param handlerAddress Address of handler resource will be set for.
@param resourceID ResourceID to be used when making deposits.
@param tokenAddress Address of contract to be called when a deposit is made and a deposited is executed.
*/
function adminSetResource(address handlerAddress, bytes32 resourceID, address tokenAddress) external onlyAdmin {
_resourceIDToHandlerAddress[resourceID] = handlerAddress;
IERCHandler handler = IERCHandler(handlerAddress);
handler.setResource(resourceID, tokenAddress);
}
/**
@notice Sets a new resource for handler contracts that use the IGenericHandler interface,
and maps the {handlerAddress} to {resourceID} in {_resourceIDToHandlerAddress}.
@notice Only callable by an address that currently has the admin role.
@param handlerAddress Address of handler resource will be set for.
@param resourceID ResourceID to be used when making deposits.
@param contractAddress Address of contract to be called when a deposit is made and a deposited is executed.
*/
function adminSetGenericResource(
address handlerAddress,
bytes32 resourceID,
address contractAddress,
bytes4 depositFunctionSig,
bytes4 executeFunctionSig
) external onlyAdmin {
_resourceIDToHandlerAddress[resourceID] = handlerAddress;
IGenericHandler handler = IGenericHandler(handlerAddress);
handler.setResource(resourceID, contractAddress, depositFunctionSig, executeFunctionSig);
}
/**
@notice Sets a resource as burnable for handler contracts that use the IERCHandler interface.
@notice Only callable by an address that currently has the admin role.
@param handlerAddress Address of handler resource will be set for.
@param tokenAddress Address of contract to be called when a deposit is made and a deposited is executed.
*/
function adminSetBurnable(address handlerAddress, address tokenAddress) external onlyAdmin {
IERCHandler handler = IERCHandler(handlerAddress);
handler.setBurnable(tokenAddress);
}
/**
@notice Returns a proposal.
@param originChainID Chain ID deposit originated from.
@param depositNonce ID of proposal generated by proposal's origin Bridge contract.
@param dataHash Hash of data to be provided when deposit proposal is executed.
@return Proposal which consists of:
- _dataHash Hash of data to be provided when deposit proposal is executed.
- _yesVotes Number of votes in favor of proposal.
- _noVotes Number of votes against proposal.
- _status Current status of proposal.
*/
function getProposal(uint8 originChainID, uint64 depositNonce, bytes32 dataHash) external view returns (Proposal memory) {
uint72 nonceAndID = (uint72(depositNonce) << 8) | uint72(originChainID);
return _proposals[nonceAndID][dataHash];
}
/**
@notice Changes deposit fee.
@notice Only callable by admin.
@param newFee Value {_fee} will be updated to.
*/
function adminChangeFee(uint newFee) external onlyAdmin {
require(_fee != newFee, "Current fee is equal to new fee");
_fee = newFee;
}
/**
@notice Used to manually withdraw funds from ERC safes.
@param handlerAddress Address of handler to withdraw from.
@param tokenAddress Address of token to withdraw.
@param recipient Address to withdraw tokens to.
@param amountOrTokenID Either the amount of ERC20 tokens or the ERC721 token ID to withdraw.
*/
function adminWithdraw(
address handlerAddress,
address tokenAddress,
address recipient,
uint256 amountOrTokenID
) external onlyAdmin {
IERCHandler handler = IERCHandler(handlerAddress);
handler.withdraw(tokenAddress, recipient, amountOrTokenID);
}
/**
@notice Initiates a transfer using a specified handler contract.
@notice Only callable when Bridge is not paused.
@param destinationChainID ID of chain deposit will be bridged to.
@param resourceID ResourceID used to find address of handler to be used for deposit.
@param data Additional data to be passed to specified handler.
@notice Emits {Deposit} event.
*/
function deposit(uint8 destinationChainID, bytes32 resourceID, bytes calldata data) external payable whenNotPaused {
require(msg.value == _fee, "Incorrect fee supplied");
address handler = _resourceIDToHandlerAddress[resourceID];
require(handler != address(0), "resourceID not mapped to handler");
uint64 depositNonce = ++_depositCounts[destinationChainID];
_depositRecords[depositNonce][destinationChainID] = data;
IDepositExecute depositHandler = IDepositExecute(handler);
depositHandler.deposit(resourceID, destinationChainID, depositNonce, msg.sender, data);
emit Deposit(destinationChainID, resourceID, depositNonce);
}
/**
@notice When called, {msg.sender} will be marked as voting in favor of proposal.
@notice Only callable by relayers when Bridge is not paused.
@param chainID ID of chain deposit originated from.
@param depositNonce ID of deposited generated by origin Bridge contract.
@param dataHash Hash of data provided when deposit was made.
@notice Proposal must not have already been passed or executed.
@notice {msg.sender} must not have already voted on proposal.
@notice Emits {ProposalEvent} event with status indicating the proposal status.
@notice Emits {ProposalVote} event.
*/
function voteProposal(uint8 chainID, uint64 depositNonce, bytes32 resourceID, bytes32 dataHash) external onlyRelayers whenNotPaused {
uint72 nonceAndID = (uint72(depositNonce) << 8) | uint72(chainID);
Proposal storage proposal = _proposals[nonceAndID][dataHash];
require(_resourceIDToHandlerAddress[resourceID] != address(0), "no handler for resourceID");
require(uint(proposal._status) <= 1, "proposal already passed/executed/cancelled");
require(!_hasVotedOnProposal[nonceAndID][dataHash][msg.sender], "relayer already voted");
if (uint(proposal._status) == 0) {
++_totalProposals;
_proposals[nonceAndID][dataHash] = Proposal({
_resourceID : resourceID,
_dataHash : dataHash,
_yesVotes : new address[](1),
_noVotes : new address[](0),
_status : ProposalStatus.Active,
_proposedBlock : block.number
});
proposal._yesVotes[0] = msg.sender;
emit ProposalEvent(chainID, depositNonce, ProposalStatus.Active, resourceID, dataHash);
} else {
if (sub(block.number, proposal._proposedBlock) > _expiry) {
// if the number of blocks that has passed since this proposal was
// submitted exceeds the expiry threshold set, cancel the proposal
proposal._status = ProposalStatus.Cancelled;
emit ProposalEvent(chainID, depositNonce, ProposalStatus.Cancelled, resourceID, dataHash);
} else {
require(dataHash == proposal._dataHash, "datahash mismatch");
proposal._yesVotes.push(msg.sender);
}
}
if (proposal._status != ProposalStatus.Cancelled) {
_hasVotedOnProposal[nonceAndID][dataHash][msg.sender] = true;
emit ProposalVote(chainID, depositNonce, proposal._status, resourceID);
// If _depositThreshold is set to 1, then auto finalize
// or if _relayerThreshold has been exceeded
if (_relayerThreshold <= 1 || proposal._yesVotes.length >= _relayerThreshold) {
proposal._status = ProposalStatus.Passed;
emit ProposalEvent(chainID, depositNonce, ProposalStatus.Passed, resourceID, dataHash);
}
}
}
/**
@notice Executes a deposit proposal that is considered passed using a specified handler contract.
@notice Only callable by relayers when Bridge is not paused.
@param chainID ID of chain deposit originated from.
@param depositNonce ID of deposited generated by origin Bridge contract.
@param dataHash Hash of data originally provided when deposit was made.
@notice Proposal must be past expiry threshold.
@notice Emits {ProposalEvent} event with status {Cancelled}.
*/
function cancelProposal(uint8 chainID, uint64 depositNonce, bytes32 dataHash) public onlyAdminOrRelayer {
uint72 nonceAndID = (uint72(depositNonce) << 8) | uint72(chainID);
Proposal storage proposal = _proposals[nonceAndID][dataHash];
require(proposal._status != ProposalStatus.Cancelled, "Proposal already cancelled");
require(sub(block.number, proposal._proposedBlock) > _expiry, "Proposal not at expiry threshold");
proposal._status = ProposalStatus.Cancelled;
emit ProposalEvent(chainID, depositNonce, ProposalStatus.Cancelled, proposal._resourceID, proposal._dataHash);
}
/**
@notice Executes a deposit proposal that is considered passed using a specified handler contract.
@notice Only callable by relayers when Bridge is not paused.
@param chainID ID of chain deposit originated from.
@param resourceID ResourceID to be used when making deposits.
@param depositNonce ID of deposited generated by origin Bridge contract.
@param data Data originally provided when deposit was made.
@notice Proposal must have Passed status.
@notice Hash of {data} must equal proposal's {dataHash}.
@notice Emits {ProposalEvent} event with status {Executed}.
*/
function executeProposal(uint8 chainID, uint64 depositNonce, bytes calldata data, bytes32 resourceID) external onlyRelayers whenNotPaused {
address handler = _resourceIDToHandlerAddress[resourceID];
uint72 nonceAndID = (uint72(depositNonce) << 8) | uint72(chainID);
bytes32 dataHash = keccak256(abi.encodePacked(handler, data));
Proposal storage proposal = _proposals[nonceAndID][dataHash];
require(proposal._status != ProposalStatus.Inactive, "proposal is not active");
require(proposal._status == ProposalStatus.Passed, "proposal already transferred");
require(dataHash == proposal._dataHash, "data doesn't match datahash");
proposal._status = ProposalStatus.Executed;
IDepositExecute depositHandler = IDepositExecute(_resourceIDToHandlerAddress[proposal._resourceID]);
depositHandler.executeProposal(proposal._resourceID, data);
emit ProposalEvent(chainID, depositNonce, proposal._status, proposal._resourceID, proposal._dataHash);
}
/**
@notice Transfers eth in the contract to the specified addresses. The parameters addrs and amounts are mapped 1-1.
This means that the address at index 0 for addrs will receive the amount (in WEI) from amounts at index 0.
@param addrs Array of addresses to transfer {amounts} to.
@param amounts Array of amonuts to transfer to {addrs}.
*/
function transferFunds(address payable[] calldata addrs, uint[] calldata amounts) external onlyAdmin {
for (uint i = 0; i < addrs.length; i++) {
addrs[i].transfer(amounts[i]);
}
}
}// SPDX-License-Identifier: GPL-3.0-only
pragma solidity 0.7.4;
/**
@title Interface for Bridge contract.
@author ChainSafe Systems.
*/
interface IBridge {
/**
@notice Exposing getter for {_chainID} instead of forcing the use of call.
@return uint8 The {_chainID} that is currently set for the Bridge contract.
*/
function _chainID() external returns (uint8);
}// SPDX-License-Identifier: GPL-3.0-only
pragma solidity 0.7.4;
/**
@title Interface for handler contracts that support deposits and deposit executions.
@author ChainSafe Systems.
*/
interface IDepositExecute {
/**
@notice It is intended that deposit are made using the Bridge contract.
@param destinationChainID Chain ID deposit is expected to be bridged to.
@param depositNonce This value is generated as an ID by the Bridge contract.
@param depositer Address of account making the deposit in the Bridge contract.
@param data Consists of additional data needed for a specific deposit.
*/
function deposit(bytes32 resourceID, uint8 destinationChainID, uint64 depositNonce, address depositer, bytes calldata data) external;
/**
@notice It is intended that proposals are executed by the Bridge contract.
@param data Consists of additional data needed for a specific deposit execution.
*/
function executeProposal(bytes32 resourceID, bytes calldata data) external;
}// SPDX-License-Identifier: GPL-3.0-only
pragma solidity 0.7.4;
/**
@title Interface to be used with handlers that support ERC20s and ERC721s.
@author ChainSafe Systems.
*/
interface IERCHandler {
/**
@notice Correlates {resourceID} with {contractAddress}.
@param resourceID ResourceID to be used when making deposits.
@param contractAddress Address of contract to be called when a deposit is made and a deposited is executed.
*/
function setResource(bytes32 resourceID, address contractAddress) external;
/**
@notice Marks {contractAddress} as mintable/burnable.
@param contractAddress Address of contract to be used when making or executing deposits.
*/
function setBurnable(address contractAddress) external;
/**
@notice Used to manually release funds from ERC safes.
@param tokenAddress Address of token contract to release.
@param recipient Address to release tokens to.
@param amountOrTokenID Either the amount of ERC20 tokens or the ERC721 token ID to release.
*/
function withdraw(address tokenAddress, address recipient, uint256 amountOrTokenID) external;
}// SPDX-License-Identifier: GPL-3.0-only
pragma solidity 0.7.4;
/**
@title Interface for handler that handles generic deposits and deposit executions.
@author ChainSafe Systems.
*/
interface IGenericHandler {
/**
@notice Correlates {resourceID} with {contractAddress}, {depositFunctionSig}, and {executeFunctionSig}.
@param resourceID ResourceID to be used when making deposits.
@param contractAddress Address of contract to be called when a deposit is made and a deposited is executed.
@param depositFunctionSig Function signature of method to be called in {contractAddress} when a deposit is made.
@param executeFunctionSig Function signature of method to be called in {contractAddress} when a deposit is executed.
*/
function setResource(bytes32 resourceID, address contractAddress, bytes4 depositFunctionSig, bytes4 executeFunctionSig) external;
}// SPDX-License-Identifier: MIT
pragma solidity ^0.7.4;
import "./Context.sol";
/**
* @dev Contract module that allows children to implement role-based access
* control mechanisms. This is a lightweight version that doesn't allow enumerating role
* members except through off-chain means by accessing the contract event logs. Some
* applications may benefit from on-chain enumerability, for those cases see
* {AccessControlEnumerable}.
*
* Roles are referred to by their `bytes32` identifier. These should be exposed
* in the external API and be unique. The best way to achieve this is by
* using `public constant` hash digests:
*
* ```
* bytes32 public constant MY_ROLE = keccak256("MY_ROLE");
* ```
*
* Roles can be used to represent a set of permissions. To restrict access to a
* function call, use {hasRole}:
*
* ```
* function foo() public {
* require(hasRole(MY_ROLE, msg.sender));
* ...
* }
* ```
*
* Roles can be granted and revoked dynamically via the {grantRole} and
* {revokeRole} functions. Each role has an associated admin role, and only
* accounts that have a role's admin role can call {grantRole} and {revokeRole}.
*
* By default, the admin role for all roles is `DEFAULT_ADMIN_ROLE`, which means
* that only accounts with this role will be able to grant or revoke other
* roles. More complex role relationships can be created by using
* {_setRoleAdmin}.
*
* WARNING: The `DEFAULT_ADMIN_ROLE` is also its own admin: it has permission to
* grant and revoke this role. Extra precautions should be taken to secure
* accounts that have been granted it.
*/
abstract contract AccessControl is Context {
struct RoleData {
mapping (address => bool) members;
bytes32 adminRole;
}
mapping (bytes32 => RoleData) private _roles;
bytes32 public constant DEFAULT_ADMIN_ROLE = 0x00;
/**
* @dev Emitted when `newAdminRole` is set as ``role``'s admin role, replacing `previousAdminRole`
*
* `DEFAULT_ADMIN_ROLE` is the starting admin for all roles, despite
* {RoleAdminChanged} not being emitted signaling this.
*
* _Available since v3.1._
*/
event RoleAdminChanged(bytes32 indexed role, bytes32 indexed previousAdminRole, bytes32 indexed newAdminRole);
/**
* @dev Emitted when `account` is granted `role`.
*
* `sender` is the account that originated the contract call, an admin role
* bearer except when using {_setupRole}.
*/
event RoleGranted(bytes32 indexed role, address indexed account, address indexed sender);
/**
* @dev Emitted when `account` is revoked `role`.
*
* `sender` is the account that originated the contract call:
* - if using `revokeRole`, it is the admin role bearer
* - if using `renounceRole`, it is the role bearer (i.e. `account`)
*/
event RoleRevoked(bytes32 indexed role, address indexed account, address indexed sender);
/**
* @dev Returns `true` if `account` has been granted `role`.
*/
function hasRole(bytes32 role, address account) public view returns (bool) {
return _roles[role].members[account];
}
/**
* @dev Returns the admin role that controls `role`. See {grantRole} and
* {revokeRole}.
*
* To change a role's admin, use {_setRoleAdmin}.
*/
function getRoleAdmin(bytes32 role) public view returns (bytes32) {
return _roles[role].adminRole;
}
/**
* @dev Grants `role` to `account`.
*
* If `account` had not been already granted `role`, emits a {RoleGranted}
* event.
*
* Requirements:
*
* - the caller must have ``role``'s admin role.
*/
function grantRole(bytes32 role, address account) public virtual {
require(hasRole(getRoleAdmin(role), _msgSender()), "AccessControl: sender must be an admin to grant");
_grantRole(role, account);
}
/**
* @dev Revokes `role` from `account`.
*
* If `account` had been granted `role`, emits a {RoleRevoked} event.
*
* Requirements:
*
* - the caller must have ``role``'s admin role.
*/
function revokeRole(bytes32 role, address account) public virtual {
require(hasRole(getRoleAdmin(role), _msgSender()), "AccessControl: sender must be an admin to revoke");
_revokeRole(role, account);
}
/**
* @dev Revokes `role` from the calling account.
*
* Roles are often managed via {grantRole} and {revokeRole}: this function's
* purpose is to provide a mechanism for accounts to lose their privileges
* if they are compromised (such as when a trusted device is misplaced).
*
* If the calling account had been granted `role`, emits a {RoleRevoked}
* event.
*
* Requirements:
*
* - the caller must be `account`.
*/
function renounceRole(bytes32 role, address account) public virtual {
require(account == _msgSender(), "AccessControl: can only renounce roles for self");
_revokeRole(role, account);
}
/**
* @dev Grants `role` to `account`.
*
* If `account` had not been already granted `role`, emits a {RoleGranted}
* event. Note that unlike {grantRole}, this function doesn't perform any
* checks on the calling account.
*
* [WARNING]
* ====
* This function should only be called from the constructor when setting
* up the initial roles for the system.
*
* Using this function in any other way is effectively circumventing the admin
* system imposed by {AccessControl}.
* ====
*/
function _setupRole(bytes32 role, address account) internal virtual {
_grantRole(role, account);
}
/**
* @dev Sets `adminRole` as ``role``'s admin role.
*
* Emits a {RoleAdminChanged} event.
*/
function _setRoleAdmin(bytes32 role, bytes32 adminRole) internal virtual {
emit RoleAdminChanged(role, getRoleAdmin(role), adminRole);
_roles[role].adminRole = adminRole;
}
function _grantRole(bytes32 role, address account) private {
if (!hasRole(role, account)) {
_roles[role].members[account] = true;
emit RoleGranted(role, account, _msgSender());
}
}
function _revokeRole(bytes32 role, address account) private {
if (hasRole(role, account)) {
_roles[role].members[account] = false;
emit RoleRevoked(role, account, _msgSender());
}
}
}// SPDX-License-Identifier: MIT
pragma solidity ^0.7.4;
/*
* @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) {
this; // silence state mutability warning without generating bytecode - see https://github.com/ethereum/solidity/issues/2691
return msg.data;
}
}// SPDX-License-Identifier: GPL-3.0-only
pragma solidity 0.7.4;
import "./Context.sol";
/**
* @dev Contract module which allows children to implement an emergency stop
* mechanism that can be triggered by an authorized account.
*
* This is a stripped down version of Open zeppelin's Pausable contract.
* https://github.com/OpenZeppelin/openzeppelin-contracts/blob/master/contracts/utils/EnumerableSet.sol
*
*/
contract Pausable {
/**
* @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 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() {
_whenNotPaused();
_;
}
function _whenNotPaused() private view {
require(!_paused, "Pausable: paused");
}
/**
* @dev Modifier to make a function callable only when the contract is not paused.
*
* Requirements:
*
* - The contract must not be paused.
*/
modifier whenPaused() {
_whenPaused();
_;
}
function _whenPaused() private view {
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(msg.sender);
}
/**
* @dev Returns to normal state.
*
* Requirements:
*
* - The contract must be paused.
*/
function _unpause() internal virtual whenPaused {
_paused = false;
emit Unpaused(msg.sender);
}
}// SPDX-License-Identifier: GPL-3.0-only
pragma solidity 0.7.4;
/**
* @dev Wrappers over Solidity's arithmetic operations with added overflow
* checks.
*
* note that this is a stripped down version of open zeppelin's safemath
* https://github.com/OpenZeppelin/openzeppelin-contracts/blob/master/contracts/math/SafeMath.sol
*/
contract SafeMath {
/**
* @dev Returns the subtraction of two unsigned integers, reverting on
* overflow (when the result is negative).
*
* Counterpart to Solidity's `-` operator.
*
* Requirements:
* - Subtraction cannot overflow.
*/
function sub(uint256 a, uint256 b) internal pure returns (uint256) {
return _sub(a, b, "SafeMath: subtraction overflow");
}
/**
* @dev Returns the subtraction of two unsigned integers, reverting with custom message on
* overflow (when the result is negative).
*
* Counterpart to Solidity's `-` operator.
*
* Requirements:
* - Subtraction cannot overflow.
*/
function _sub(uint256 a, uint256 b, string memory errorMessage) internal pure returns (uint256) {
require(b <= a, errorMessage);
uint256 c = a - b;
return c;
}
}{
"remappings": [],
"optimizer": {
"enabled": false,
"runs": 200
},
"evmVersion": "istanbul",
"libraries": {},
"outputSelection": {
"*": {
"*": [
"evm.bytecode",
"evm.deployedBytecode",
"abi"
]
}
}
}Contract Security Audit
- No Contract Security Audit Submitted- Submit Audit Here
Contract ABI
API[{"inputs":[{"internalType":"uint8","name":"chainID","type":"uint8"},{"internalType":"address[]","name":"initialRelayers","type":"address[]"},{"internalType":"uint256","name":"initialRelayerThreshold","type":"uint256"},{"internalType":"uint256","name":"fee","type":"uint256"},{"internalType":"uint256","name":"expiry","type":"uint256"}],"stateMutability":"nonpayable","type":"constructor"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"uint8","name":"destinationChainID","type":"uint8"},{"indexed":true,"internalType":"bytes32","name":"resourceID","type":"bytes32"},{"indexed":true,"internalType":"uint64","name":"depositNonce","type":"uint64"}],"name":"Deposit","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"address","name":"account","type":"address"}],"name":"Paused","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"uint8","name":"originChainID","type":"uint8"},{"indexed":true,"internalType":"uint64","name":"depositNonce","type":"uint64"},{"indexed":true,"internalType":"enum Bridge.ProposalStatus","name":"status","type":"uint8"},{"indexed":false,"internalType":"bytes32","name":"resourceID","type":"bytes32"},{"indexed":false,"internalType":"bytes32","name":"dataHash","type":"bytes32"}],"name":"ProposalEvent","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"uint8","name":"originChainID","type":"uint8"},{"indexed":true,"internalType":"uint64","name":"depositNonce","type":"uint64"},{"indexed":true,"internalType":"enum Bridge.ProposalStatus","name":"status","type":"uint8"},{"indexed":false,"internalType":"bytes32","name":"resourceID","type":"bytes32"}],"name":"ProposalVote","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"relayer","type":"address"}],"name":"RelayerAdded","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"relayer","type":"address"}],"name":"RelayerRemoved","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"uint256","name":"newThreshold","type":"uint256"}],"name":"RelayerThresholdChanged","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"bytes32","name":"role","type":"bytes32"},{"indexed":true,"internalType":"bytes32","name":"previousAdminRole","type":"bytes32"},{"indexed":true,"internalType":"bytes32","name":"newAdminRole","type":"bytes32"}],"name":"RoleAdminChanged","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"bytes32","name":"role","type":"bytes32"},{"indexed":true,"internalType":"address","name":"account","type":"address"},{"indexed":true,"internalType":"address","name":"sender","type":"address"}],"name":"RoleGranted","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"bytes32","name":"role","type":"bytes32"},{"indexed":true,"internalType":"address","name":"account","type":"address"},{"indexed":true,"internalType":"address","name":"sender","type":"address"}],"name":"RoleRevoked","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"address","name":"account","type":"address"}],"name":"Unpaused","type":"event"},{"inputs":[],"name":"DEFAULT_ADMIN_ROLE","outputs":[{"internalType":"bytes32","name":"","type":"bytes32"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"RELAYER_ROLE","outputs":[{"internalType":"bytes32","name":"","type":"bytes32"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"_chainID","outputs":[{"internalType":"uint8","name":"","type":"uint8"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint8","name":"","type":"uint8"}],"name":"_depositCounts","outputs":[{"internalType":"uint64","name":"","type":"uint64"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint64","name":"","type":"uint64"},{"internalType":"uint8","name":"","type":"uint8"}],"name":"_depositRecords","outputs":[{"internalType":"bytes","name":"","type":"bytes"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"_expiry","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"_fee","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint72","name":"","type":"uint72"},{"internalType":"bytes32","name":"","type":"bytes32"},{"internalType":"address","name":"","type":"address"}],"name":"_hasVotedOnProposal","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint72","name":"","type":"uint72"},{"internalType":"bytes32","name":"","type":"bytes32"}],"name":"_proposals","outputs":[{"internalType":"bytes32","name":"_resourceID","type":"bytes32"},{"internalType":"bytes32","name":"_dataHash","type":"bytes32"},{"internalType":"enum Bridge.ProposalStatus","name":"_status","type":"uint8"},{"internalType":"uint256","name":"_proposedBlock","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"_relayerThreshold","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"bytes32","name":"","type":"bytes32"}],"name":"_resourceIDToHandlerAddress","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"_totalProposals","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"_totalRelayers","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"relayerAddress","type":"address"}],"name":"adminAddRelayer","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"newFee","type":"uint256"}],"name":"adminChangeFee","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"newThreshold","type":"uint256"}],"name":"adminChangeRelayerThreshold","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"adminPauseTransfers","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"relayerAddress","type":"address"}],"name":"adminRemoveRelayer","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"handlerAddress","type":"address"},{"internalType":"address","name":"tokenAddress","type":"address"}],"name":"adminSetBurnable","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"handlerAddress","type":"address"},{"internalType":"bytes32","name":"resourceID","type":"bytes32"},{"internalType":"address","name":"contractAddress","type":"address"},{"internalType":"bytes4","name":"depositFunctionSig","type":"bytes4"},{"internalType":"bytes4","name":"executeFunctionSig","type":"bytes4"}],"name":"adminSetGenericResource","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"handlerAddress","type":"address"},{"internalType":"bytes32","name":"resourceID","type":"bytes32"},{"internalType":"address","name":"tokenAddress","type":"address"}],"name":"adminSetResource","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"adminUnpauseTransfers","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"handlerAddress","type":"address"},{"internalType":"address","name":"tokenAddress","type":"address"},{"internalType":"address","name":"recipient","type":"address"},{"internalType":"uint256","name":"amountOrTokenID","type":"uint256"}],"name":"adminWithdraw","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint8","name":"chainID","type":"uint8"},{"internalType":"uint64","name":"depositNonce","type":"uint64"},{"internalType":"bytes32","name":"dataHash","type":"bytes32"}],"name":"cancelProposal","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint8","name":"destinationChainID","type":"uint8"},{"internalType":"bytes32","name":"resourceID","type":"bytes32"},{"internalType":"bytes","name":"data","type":"bytes"}],"name":"deposit","outputs":[],"stateMutability":"payable","type":"function"},{"inputs":[{"internalType":"uint8","name":"chainID","type":"uint8"},{"internalType":"uint64","name":"depositNonce","type":"uint64"},{"internalType":"bytes","name":"data","type":"bytes"},{"internalType":"bytes32","name":"resourceID","type":"bytes32"}],"name":"executeProposal","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint8","name":"originChainID","type":"uint8"},{"internalType":"uint64","name":"depositNonce","type":"uint64"},{"internalType":"bytes32","name":"dataHash","type":"bytes32"}],"name":"getProposal","outputs":[{"components":[{"internalType":"bytes32","name":"_resourceID","type":"bytes32"},{"internalType":"bytes32","name":"_dataHash","type":"bytes32"},{"internalType":"address[]","name":"_yesVotes","type":"address[]"},{"internalType":"address[]","name":"_noVotes","type":"address[]"},{"internalType":"enum Bridge.ProposalStatus","name":"_status","type":"uint8"},{"internalType":"uint256","name":"_proposedBlock","type":"uint256"}],"internalType":"struct Bridge.Proposal","name":"","type":"tuple"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"bytes32","name":"role","type":"bytes32"}],"name":"getRoleAdmin","outputs":[{"internalType":"bytes32","name":"","type":"bytes32"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"bytes32","name":"role","type":"bytes32"},{"internalType":"address","name":"account","type":"address"}],"name":"grantRole","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bytes32","name":"role","type":"bytes32"},{"internalType":"address","name":"account","type":"address"}],"name":"hasRole","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"relayer","type":"address"}],"name":"isRelayer","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"paused","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"newAdmin","type":"address"}],"name":"renounceAdmin","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bytes32","name":"role","type":"bytes32"},{"internalType":"address","name":"account","type":"address"}],"name":"renounceRole","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bytes32","name":"role","type":"bytes32"},{"internalType":"address","name":"account","type":"address"}],"name":"revokeRole","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address payable[]","name":"addrs","type":"address[]"},{"internalType":"uint256[]","name":"amounts","type":"uint256[]"}],"name":"transferFunds","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint8","name":"chainID","type":"uint8"},{"internalType":"uint64","name":"depositNonce","type":"uint64"},{"internalType":"bytes32","name":"resourceID","type":"bytes32"},{"internalType":"bytes32","name":"dataHash","type":"bytes32"}],"name":"voteProposal","outputs":[],"stateMutability":"nonpayable","type":"function"}]Contract Creation Code
60806040523480156200001157600080fd5b5060405162004802380380620048028339818101604052810190620000379190620004b2565b60008060006101000a81548160ff02191690831515021790555084600260006101000a81548160ff021916908360ff160217905550826003819055508160068190555080600781905550620000966000801b336200014a60201b60201c565b620000cb7fe2b7fb3b832174769106daebcfd6d1970523240dda11281102db9363b83b0dc46000801b6200016060201b60201c565b60005b84518110156200013e576200011e7fe2b7fb3b832174769106daebcfd6d1970523240dda11281102db9363b83b0dc48683815181106200010a57fe5b6020026020010151620001be60201b60201c565b6004600081548092919060010191905055508080600101915050620000ce565b5050505050506200064b565b6200015c82826200025c60201b60201c565b5050565b8062000172836200034d60201b60201c565b837fbd79b86ffe0ab8e8776151514217cd7cacd52c909f66475c3af44e129f0b00ff60405160405180910390a48060016000848152602001908152602001600020600101819055505050565b620001ef620001d3836200034d60201b60201c565b620001e36200036d60201b60201c565b6200037560201b60201c565b62000246576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040180806020018281038252602f815260200180620047d3602f913960400191505060405180910390fd5b6200025882826200025c60201b60201c565b5050565b6200026e82826200037560201b60201c565b6200034957600180600084815260200190815260200160002060000160008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff021916908315150217905550620002ee6200036d60201b60201c565b73ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff16837f2f8788117e7eff1d82e926ec794901d17c78024a50270940304540a733656f0d60405160405180910390a45b5050565b600060016000838152602001908152602001600020600101549050919050565b600033905090565b60006001600084815260200190815260200160002060000160008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff16905092915050565b600081519050620003f181620005fd565b92915050565b600082601f8301126200040957600080fd5b8151620004206200041a8262000581565b6200054d565b915081818352602084019350602081019050838560208402820111156200044657600080fd5b60005b838110156200047a57816200045f8882620003e0565b84526020840193506020830192505060018101905062000449565b5050505092915050565b600081519050620004958162000617565b92915050565b600081519050620004ac8162000631565b92915050565b600080600080600060a08688031215620004cb57600080fd5b6000620004db888289016200049b565b955050602086015167ffffffffffffffff811115620004f957600080fd5b6200050788828901620003f7565b94505060406200051a8882890162000484565b93505060606200052d8882890162000484565b9250506080620005408882890162000484565b9150509295509295909350565b6000604051905081810181811067ffffffffffffffff82111715620005775762000576620005fb565b5b8060405250919050565b600067ffffffffffffffff8211156200059f576200059e620005fb565b5b602082029050602081019050919050565b6000620005bd82620005c4565b9050919050565b600073ffffffffffffffffffffffffffffffffffffffff82169050919050565b6000819050919050565b600060ff82169050919050565bfe5b6200060881620005b0565b81146200061457600080fd5b50565b6200062281620005e4565b81146200062e57600080fd5b50565b6200063c81620005ee565b81146200064857600080fd5b50565b614178806200065b6000396000f3fe60806040526004361061021a5760003560e01c806380ae1c2811610123578063a9cf69fa116100ab578063cdb0f73a1161006f578063cdb0f73a146107e7578063d547741f14610810578063d7a9cd7914610839578063e8437ee714610864578063ffaac0eb1461088d5761021a565b8063a9cf69fa14610700578063beab71311461073d578063c5b37c2214610768578063c5ec897014610793578063cb10f215146107be5761021a565b806391d14854116100f257806391d1485414610619578063926d7d7f146106565780639d5773e0146106815780639d82dd63146106ac578063a217fddf146106d55761021a565b806380ae1c281461057357806384db809f1461058a5780638c0c2631146105c757806391c404ac146105f05761021a565b80634b0b919d116101a65780635c975abb116101755780635c975abb1461048e5780635e1fab0f146104b9578063780cf004146104e25780637febe63f1461050b578063802aabe8146105485761021a565b80634b0b919d146103ab5780634e056005146103e85780635059871914610411578063541d5548146104515761021a565b80632f2ff15d116101ed5780632f2ff15d146102ca57806336568abe146102f35780633ee7094a1461031c5780634454b20d146103595780634603ae38146103825761021a565b806305e2ca171461021f57806317f03ce51461023b5780631ff013f114610264578063248a9ca31461028d575b600080fd5b61023960048036038101906102349190613090565b6108a4565b005b34801561024757600080fd5b50610262600480360381019061025d91906130fc565b610b01565b005b34801561027057600080fd5b5061028b6004803603810190610286919061314b565b610cae565b005b34801561029957600080fd5b506102b460048036038101906102af9190612f12565b61145d565b6040516102c19190613996565b60405180910390f35b3480156102d657600080fd5b506102f160048036038101906102ec9190612f3b565b61147d565b005b3480156102ff57600080fd5b5061031a60048036038101906103159190612f3b565b6114f9565b005b34801561032857600080fd5b50610343600480360381019061033e9190612fa0565b611592565b6040516103509190613b1b565b60405180910390f35b34801561036557600080fd5b50610380600480360381019061037b91906131ae565b61164f565b005b34801561038e57600080fd5b506103a960048036038101906103a49190612e9d565b611990565b005b3480156103b757600080fd5b506103d260048036038101906103cd9190613067565b611a33565b6040516103df9190613d9a565b60405180910390f35b3480156103f457600080fd5b5061040f600480360381019061040a9190612f77565b611a5a565b005b34801561041d57600080fd5b5061043860048036038101906104339190612fdc565b611a99565b6040516104489493929190613a48565b60405180910390f35b34801561045d57600080fd5b5061047860048036038101906104739190612ce6565b611ae3565b604051610485919061397b565b60405180910390f35b34801561049a57600080fd5b506104a3611b16565b6040516104b0919061397b565b60405180910390f35b3480156104c557600080fd5b506104e060048036038101906104db9190612ce6565b611b2c565b005b3480156104ee57600080fd5b5061050960048036038101906105049190612d74565b611b51565b005b34801561051757600080fd5b50610532600480360381019061052d9190613018565b611bd4565b60405161053f919061397b565b60405180910390f35b34801561055457600080fd5b5061055d611c10565b60405161056a9190613d7f565b60405180910390f35b34801561057f57600080fd5b50610588611c16565b005b34801561059657600080fd5b506105b160048036038101906105ac9190612f12565b611c28565b6040516105be9190613929565b60405180910390f35b3480156105d357600080fd5b506105ee60048036038101906105e99190612d38565b611c5b565b005b3480156105fc57600080fd5b5061061760048036038101906106129190612f77565b611cd8565b005b34801561062557600080fd5b50610640600480360381019061063b9190612f3b565b611d2f565b60405161064d919061397b565b60405180910390f35b34801561066257600080fd5b5061066b611d9a565b6040516106789190613996565b60405180910390f35b34801561068d57600080fd5b50610696611dbe565b6040516106a39190613d7f565b60405180910390f35b3480156106b857600080fd5b506106d360048036038101906106ce9190612ce6565b611dc4565b005b3480156106e157600080fd5b506106ea611eb8565b6040516106f79190613996565b60405180910390f35b34801561070c57600080fd5b50610727600480360381019061072291906130fc565b611ebf565b6040516107349190613d5d565b60405180910390f35b34801561074957600080fd5b506107526120a0565b60405161075f9190613db5565b60405180910390f35b34801561077457600080fd5b5061077d6120b3565b60405161078a9190613d7f565b60405180910390f35b34801561079f57600080fd5b506107a86120b9565b6040516107b59190613d7f565b60405180910390f35b3480156107ca57600080fd5b506107e560048036038101906107e09190612dd7565b6120bf565b005b3480156107f357600080fd5b5061080e60048036038101906108099190612ce6565b612191565b005b34801561081c57600080fd5b5061083760048036038101906108329190612f3b565b612285565b005b34801561084557600080fd5b5061084e612301565b60405161085b9190613d7f565b60405180910390f35b34801561087057600080fd5b5061088b60048036038101906108869190612e26565b612307565b005b34801561089957600080fd5b506108a26123df565b005b6108ac6123f1565b60065434146108f0576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016108e790613bdd565b60405180910390fd5b60006009600085815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff161415610998576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161098f90613c3d565b60405180910390fd5b6000600860008760ff1660ff168152602001908152602001600020600081819054906101000a900467ffffffffffffffff1660010191906101000a81548167ffffffffffffffff021916908367ffffffffffffffff160217905590508383600a60008467ffffffffffffffff1667ffffffffffffffff16815260200190815260200160002060008960ff1660ff1681526020019081526020016000209190610a419291906129e4565b5060008290508073ffffffffffffffffffffffffffffffffffffffff166338995da9878985338a8a6040518763ffffffff1660e01b8152600401610a8a96959493929190613abf565b600060405180830381600087803b158015610aa457600080fd5b505af1158015610ab8573d6000803e3d6000fd5b505050508167ffffffffffffffff16868860ff167fdbb69440df8433824a026ef190652f29929eb64b4d1d5d2a69be8afe3e6eaed860405160405180910390a450505050505050565b610b09612474565b60008360ff1660088467ffffffffffffffff1668ffffffffffffffffff16901b1790506000600b60008368ffffffffffffffffff1668ffffffffffffffffff16815260200190815260200160002060008481526020019081526020016000209050600480811115610b7657fe5b8160040160009054906101000a900460ff166004811115610b9357fe5b1415610bd4576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610bcb90613c1d565b60405180910390fd5b600754610be54383600501546124f3565b11610c25576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610c1c90613c5d565b60405180910390fd5b60048160040160006101000a81548160ff02191690836004811115610c4657fe5b0217905550600480811115610c5757fe5b8467ffffffffffffffff168660ff167f803c5a12f6bde629cea32e63d4b92d1b560816a6fb72e939d3c89e1cab65041784600001548560010154604051610c9f929190613a1f565b60405180910390a45050505050565b610cb661253d565b610cbe6123f1565b60008460ff1660088567ffffffffffffffff1668ffffffffffffffffff16901b1790506000600b60008368ffffffffffffffffff1668ffffffffffffffffff16815260200190815260200160002060008481526020019081526020016000209050600073ffffffffffffffffffffffffffffffffffffffff166009600086815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff161415610dc2576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610db990613d3d565b60405180910390fd5b60018160040160009054906101000a900460ff166004811115610de157fe5b1115610e22576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610e1990613c9d565b60405180910390fd5b600c60008368ffffffffffffffffff1668ffffffffffffffffff168152602001908152602001600020600084815260200190815260200160002060003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff1615610ee7576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610ede90613b9d565b60405180910390fd5b60008160040160009054906101000a900460ff166004811115610f0657fe5b141561115457600560008154600101919050819055506040518060c00160405280858152602001848152602001600167ffffffffffffffff81118015610f4b57600080fd5b50604051908082528060200260200182016040528015610f7a5781602001602082028036833780820191505090505b508152602001600067ffffffffffffffff81118015610f9857600080fd5b50604051908082528060200260200182016040528015610fc75781602001602082028036833780820191505090505b50815260200160016004811115610fda57fe5b815260200143815250600b60008468ffffffffffffffffff1668ffffffffffffffffff16815260200190815260200160002060008581526020019081526020016000206000820151816000015560208201518160010155604082015181600201908051906020019061104d929190612a72565b50606082015181600301908051906020019061106a929190612a72565b5060808201518160040160006101000a81548160ff0219169083600481111561108f57fe5b021790555060a0820151816005015590505033816002016000815481106110b257fe5b9060005260206000200160006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055506001600481111561110757fe5b8567ffffffffffffffff168760ff167f803c5a12f6bde629cea32e63d4b92d1b560816a6fb72e939d3c89e1cab6504178787604051611147929190613a1f565b60405180910390a4611297565b6007546111654383600501546124f3565b11156111ea5760048160040160006101000a81548160ff0219169083600481111561118c57fe5b021790555060048081111561119d57fe5b8567ffffffffffffffff168760ff167f803c5a12f6bde629cea32e63d4b92d1b560816a6fb72e939d3c89e1cab65041787876040516111dd929190613a1f565b60405180910390a4611296565b80600101548314611230576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161122790613d1d565b60405180910390fd5b80600201339080600181540180825580915050600190039060005260206000200160009091909190916101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055505b5b6004808111156112a357fe5b8160040160009054906101000a900460ff1660048111156112c057fe5b14611455576001600c60008468ffffffffffffffffff1668ffffffffffffffffff168152602001908152602001600020600085815260200190815260200160002060003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff0219169083151502179055508060040160009054906101000a900460ff16600481111561137257fe5b8567ffffffffffffffff168760ff167f25f8daaa4635a7729927ba3f5b3d59cc3320aca7c32c9db4e7ca7b9574343640876040516113b09190613996565b60405180910390a460016003541115806113d35750600354816002018054905010155b156114545760028160040160006101000a81548160ff021916908360048111156113f957fe5b02179055506002600481111561140b57fe5b8567ffffffffffffffff168760ff167f803c5a12f6bde629cea32e63d4b92d1b560816a6fb72e939d3c89e1cab650417878760405161144b929190613a1f565b60405180910390a45b5b505050505050565b600060016000838152602001908152602001600020600101549050919050565b6114966114898361145d565b6114916125a8565b611d2f565b6114eb576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040180806020018281038252602f8152602001806140b5602f913960400191505060405180910390fd5b6114f582826125b0565b5050565b6115016125a8565b73ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff1614611584576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040180806020018281038252602f815260200180614114602f913960400191505060405180910390fd5b61158e8282612690565b5050565b600a602052816000526040600020602052806000526040600020600091509150508054600181600116156101000203166002900480601f0160208091040260200160405190810160405280929190818152602001828054600181600116156101000203166002900480156116475780601f1061161c57610100808354040283529160200191611647565b820191906000526020600020905b81548152906001019060200180831161162a57829003601f168201915b505050505081565b61165761253d565b61165f6123f1565b60006009600083815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905060008660ff1660088767ffffffffffffffff1668ffffffffffffffffff16901b17905060008286866040516020016116d1939291906138ff565b6040516020818303038152906040528051906020012090506000600b60008468ffffffffffffffffff1668ffffffffffffffffff168152602001908152602001600020600083815260200190815260200160002090506000600481111561173457fe5b8160040160009054906101000a900460ff16600481111561175157fe5b1415611792576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161178990613b5d565b60405180910390fd5b6002600481111561179f57fe5b8160040160009054906101000a900460ff1660048111156117bc57fe5b146117fc576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016117f390613b3d565b60405180910390fd5b80600101548214611842576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161183990613bfd565b60405180910390fd5b60038160040160006101000a81548160ff0219169083600481111561186357fe5b02179055506000600960008360000154815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1690508073ffffffffffffffffffffffffffffffffffffffff1663e248cff283600001548a8a6040518463ffffffff1660e01b81526004016118e593929190613a8d565b600060405180830381600087803b1580156118ff57600080fd5b505af1158015611913573d6000803e3d6000fd5b505050508160040160009054906101000a900460ff16600481111561193457fe5b8967ffffffffffffffff168b60ff167f803c5a12f6bde629cea32e63d4b92d1b560816a6fb72e939d3c89e1cab6504178560000154866001015460405161197c929190613a1f565b60405180910390a450505050505050505050565b611998612772565b60005b84849050811015611a2c578484828181106119b257fe5b90506020020160208101906119c79190612d0f565b73ffffffffffffffffffffffffffffffffffffffff166108fc8484848181106119ec57fe5b905060200201359081150290604051600060405180830381858888f19350505050158015611a1e573d6000803e3d6000fd5b50808060010191505061199b565b5050505050565b60086020528060005260406000206000915054906101000a900467ffffffffffffffff1681565b611a62612772565b80600381905550807fa20d6b84cd798a24038be305eff8a45ca82ef54a2aa2082005d8e14c0a4746c860405160405180910390a250565b600b602052816000526040600020602052806000526040600020600091509150508060000154908060010154908060040160009054906101000a900460ff16908060050154905084565b6000611b0f7fe2b7fb3b832174769106daebcfd6d1970523240dda11281102db9363b83b0dc483611d2f565b9050919050565b60008060009054906101000a900460ff16905090565b611b34612772565b611b416000801b8261147d565b611b4e6000801b336114f9565b50565b611b59612772565b60008490508073ffffffffffffffffffffffffffffffffffffffff1663d9caed128585856040518463ffffffff1660e01b8152600401611b9b93929190613944565b600060405180830381600087803b158015611bb557600080fd5b505af1158015611bc9573d6000803e3d6000fd5b505050505050505050565b600c602052826000526040600020602052816000526040600020602052806000526040600020600092509250509054906101000a900460ff1681565b60045481565b611c1e612772565b611c266127c0565b565b60096020528060005260406000206000915054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b611c63612772565b60008290508073ffffffffffffffffffffffffffffffffffffffff166307b7ed99836040518263ffffffff1660e01b8152600401611ca19190613929565b600060405180830381600087803b158015611cbb57600080fd5b505af1158015611ccf573d6000803e3d6000fd5b50505050505050565b611ce0612772565b806006541415611d25576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611d1c90613cfd565b60405180910390fd5b8060068190555050565b60006001600084815260200190815260200160002060000160008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff16905092915050565b7fe2b7fb3b832174769106daebcfd6d1970523240dda11281102db9363b83b0dc481565b60055481565b611dcc612772565b611df67fe2b7fb3b832174769106daebcfd6d1970523240dda11281102db9363b83b0dc482611d2f565b611e35576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611e2c90613bbd565b60405180910390fd5b611e5f7fe2b7fb3b832174769106daebcfd6d1970523240dda11281102db9363b83b0dc482612285565b8073ffffffffffffffffffffffffffffffffffffffff167f10e1f7ce9fd7d1b90a66d13a2ab3cb8dd7f29f3f8d520b143b063ccfbab6906b60405160405180910390a26004600081548092919060019003919050555050565b6000801b81565b611ec7612afc565b60008460ff1660088567ffffffffffffffff1668ffffffffffffffffff16901b179050600b60008268ffffffffffffffffff1668ffffffffffffffffff16815260200190815260200160002060008481526020019081526020016000206040518060c0016040529081600082015481526020016001820154815260200160028201805480602002602001604051908101604052809291908181526020018280548015611fc857602002820191906000526020600020905b8160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019060010190808311611f7e575b505050505081526020016003820180548060200260200160405190810160405280929190818152602001828054801561205657602002820191906000526020600020905b8160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001906001019080831161200c575b505050505081526020016004820160009054906101000a900460ff16600481111561207d57fe5b600481111561208857fe5b81526020016005820154815250509150509392505050565b600260009054906101000a900460ff1681565b60065481565b60075481565b6120c7612772565b826009600084815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555060008390508073ffffffffffffffffffffffffffffffffffffffff1663b8fa373684846040518363ffffffff1660e01b81526004016121599291906139b1565b600060405180830381600087803b15801561217357600080fd5b505af1158015612187573d6000803e3d6000fd5b5050505050505050565b612199612772565b6121c37fe2b7fb3b832174769106daebcfd6d1970523240dda11281102db9363b83b0dc482611d2f565b15612203576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016121fa90613c7d565b60405180910390fd5b61222d7fe2b7fb3b832174769106daebcfd6d1970523240dda11281102db9363b83b0dc48261147d565b8073ffffffffffffffffffffffffffffffffffffffff167f03580ee9f53a62b7cb409a2cb56f9be87747dd15017afc5cef6eef321e4fb2c560405160405180910390a260046000815480929190600101919050555050565b61229e6122918361145d565b6122996125a8565b611d2f565b6122f3576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260308152602001806140e46030913960400191505060405180910390fd5b6122fd8282612690565b5050565b60035481565b61230f612772565b846009600086815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555060008590508073ffffffffffffffffffffffffffffffffffffffff1663bba8185a868686866040518563ffffffff1660e01b81526004016123a594939291906139da565b600060405180830381600087803b1580156123bf57600080fd5b505af11580156123d3573d6000803e3d6000fd5b50505050505050505050565b6123e7612772565b6123ef612831565b565b60008054906101000a900460ff1615612472576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260108152602001807f5061757361626c653a207061757365640000000000000000000000000000000081525060200191505060405180910390fd5b565b6124816000801b33611d2f565b806124b257506124b17fe2b7fb3b832174769106daebcfd6d1970523240dda11281102db9363b83b0dc433611d2f565b5b6124f1576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016124e890613b7d565b60405180910390fd5b565b600061253583836040518060400160405280601e81526020017f536166654d6174683a207375627472616374696f6e206f766572666c6f7700008152506128a2565b905092915050565b6125677fe2b7fb3b832174769106daebcfd6d1970523240dda11281102db9363b83b0dc433611d2f565b6125a6576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161259d90613cbd565b60405180910390fd5b565b600033905090565b6125ba8282611d2f565b61268c57600180600084815260200190815260200160002060000160008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff0219169083151502179055506126316125a8565b73ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff16837f2f8788117e7eff1d82e926ec794901d17c78024a50270940304540a733656f0d60405160405180910390a45b5050565b61269a8282611d2f565b1561276e5760006001600084815260200190815260200160002060000160008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff0219169083151502179055506127136125a8565b73ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff16837ff6391f5c32d9c69d2a47ea670b442974b53935d1edc7fd64eb21e047a839171b60405160405180910390a45b5050565b61277f6000801b33611d2f565b6127be576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016127b590613cdd565b60405180910390fd5b565b6127c86123f1565b60016000806101000a81548160ff0219169083151502179055507f62e78cea01bee320cd4e420270b5ea74000d11b0c9f74754ebdbfc544b05a25833604051808273ffffffffffffffffffffffffffffffffffffffff16815260200191505060405180910390a1565b612839612962565b60008060006101000a81548160ff0219169083151502179055507f5db9ee0a495bf2e6ff9c91a7834c1ba4fdd244a5e8aa4e537bd38aeae4b073aa33604051808273ffffffffffffffffffffffffffffffffffffffff16815260200191505060405180910390a1565b600083831115829061294f576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825283818151815260200191508051906020019080838360005b838110156129145780820151818401526020810190506128f9565b50505050905090810190601f1680156129415780820380516001836020036101000a031916815260200191505b509250505060405180910390fd5b5060008385039050809150509392505050565b60008054906101000a900460ff166129e2576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260148152602001807f5061757361626c653a206e6f742070617573656400000000000000000000000081525060200191505060405180910390fd5b565b828054600181600116156101000203166002900490600052602060002090601f016020900481019282612a1a5760008555612a61565b82601f10612a3357803560ff1916838001178555612a61565b82800160010185558215612a61579182015b82811115612a60578235825591602001919060010190612a45565b5b509050612a6e9190612b43565b5090565b828054828255906000526020600020908101928215612aeb579160200282015b82811115612aea5782518260006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555091602001919060010190612a92565b5b509050612af89190612b43565b5090565b6040518060c001604052806000801916815260200160008019168152602001606081526020016060815260200160006004811115612b3657fe5b8152602001600081525090565b5b80821115612b5c576000816000905550600101612b44565b5090565b600081359050612b6f81613ffc565b92915050565b600081359050612b8481614013565b92915050565b60008083601f840112612b9c57600080fd5b8235905067ffffffffffffffff811115612bb557600080fd5b602083019150836020820283011115612bcd57600080fd5b9250929050565b60008083601f840112612be657600080fd5b8235905067ffffffffffffffff811115612bff57600080fd5b602083019150836020820283011115612c1757600080fd5b9250929050565b600081359050612c2d8161402a565b92915050565b600081359050612c4281614041565b92915050565b60008083601f840112612c5a57600080fd5b8235905067ffffffffffffffff811115612c7357600080fd5b602083019150836001820283011115612c8b57600080fd5b9250929050565b600081359050612ca181614058565b92915050565b600081359050612cb68161406f565b92915050565b600081359050612ccb81614086565b92915050565b600081359050612ce08161409d565b92915050565b600060208284031215612cf857600080fd5b6000612d0684828501612b60565b91505092915050565b600060208284031215612d2157600080fd5b6000612d2f84828501612b75565b91505092915050565b60008060408385031215612d4b57600080fd5b6000612d5985828601612b60565b9250506020612d6a85828601612b60565b9150509250929050565b60008060008060808587031215612d8a57600080fd5b6000612d9887828801612b60565b9450506020612da987828801612b60565b9350506040612dba87828801612b60565b9250506060612dcb87828801612c92565b91505092959194509250565b600080600060608486031215612dec57600080fd5b6000612dfa86828701612b60565b9350506020612e0b86828701612c1e565b9250506040612e1c86828701612b60565b9150509250925092565b600080600080600060a08688031215612e3e57600080fd5b6000612e4c88828901612b60565b9550506020612e5d88828901612c1e565b9450506040612e6e88828901612b60565b9350506060612e7f88828901612c33565b9250506080612e9088828901612c33565b9150509295509295909350565b60008060008060408587031215612eb357600080fd5b600085013567ffffffffffffffff811115612ecd57600080fd5b612ed987828801612b8a565b9450945050602085013567ffffffffffffffff811115612ef857600080fd5b612f0487828801612bd4565b925092505092959194509250565b600060208284031215612f2457600080fd5b6000612f3284828501612c1e565b91505092915050565b60008060408385031215612f4e57600080fd5b6000612f5c85828601612c1e565b9250506020612f6d85828601612b60565b9150509250929050565b600060208284031215612f8957600080fd5b6000612f9784828501612c92565b91505092915050565b60008060408385031215612fb357600080fd5b6000612fc185828601612ca7565b9250506020612fd285828601612cd1565b9150509250929050565b60008060408385031215612fef57600080fd5b6000612ffd85828601612cbc565b925050602061300e85828601612c1e565b9150509250929050565b60008060006060848603121561302d57600080fd5b600061303b86828701612cbc565b935050602061304c86828701612c1e565b925050604061305d86828701612b60565b9150509250925092565b60006020828403121561307957600080fd5b600061308784828501612cd1565b91505092915050565b600080600080606085870312156130a657600080fd5b60006130b487828801612cd1565b94505060206130c587828801612c1e565b935050604085013567ffffffffffffffff8111156130e257600080fd5b6130ee87828801612c48565b925092505092959194509250565b60008060006060848603121561311157600080fd5b600061311f86828701612cd1565b935050602061313086828701612ca7565b925050604061314186828701612c1e565b9150509250925092565b6000806000806080858703121561316157600080fd5b600061316f87828801612cd1565b945050602061318087828801612ca7565b935050604061319187828801612c1e565b92505060606131a287828801612c1e565b91505092959194509250565b6000806000806000608086880312156131c657600080fd5b60006131d488828901612cd1565b95505060206131e588828901612ca7565b945050604086013567ffffffffffffffff81111561320257600080fd5b61320e88828901612c48565b9350935050606061322188828901612c1e565b9150509295509295909350565b600061323a8383613255565b60208301905092915050565b61324f81613f1a565b82525050565b61325e81613e41565b82525050565b61326d81613e41565b82525050565b61328461327f82613e41565b613fa4565b82525050565b600061329582613de0565b61329f8185613e03565b93506132aa83613dd0565b8060005b838110156132db5781516132c2888261322e565b97506132cd83613df6565b9250506001810190506132ae565b5085935050505092915050565b6132f181613e65565b82525050565b61330081613e71565b82525050565b61330f81613e71565b82525050565b61331e81613e7b565b82525050565b60006133308385613e14565b935061333d838584613f62565b61334683613fca565b840190509392505050565b600061335d8385613e25565b935061336a838584613f62565b82840190509392505050565b600061338182613deb565b61338b8185613e14565b935061339b818560208601613f71565b6133a481613fca565b840191505092915050565b6133b881613f2c565b82525050565b6133c781613f2c565b82525050565b60006133da601c83613e30565b91507f70726f706f73616c20616c7265616479207472616e73666572726564000000006000830152602082019050919050565b600061341a601683613e30565b91507f70726f706f73616c206973206e6f7420616374697665000000000000000000006000830152602082019050919050565b600061345a601e83613e30565b91507f73656e646572206973206e6f742072656c61796572206f722061646d696e00006000830152602082019050919050565b600061349a601583613e30565b91507f72656c6179657220616c726561647920766f74656400000000000000000000006000830152602082019050919050565b60006134da601f83613e30565b91507f6164647220646f65736e277420686176652072656c6179657220726f6c6521006000830152602082019050919050565b600061351a601683613e30565b91507f496e636f72726563742066656520737570706c696564000000000000000000006000830152602082019050919050565b600061355a601b83613e30565b91507f6461746120646f65736e2774206d6174636820646174616861736800000000006000830152602082019050919050565b600061359a601a83613e30565b91507f50726f706f73616c20616c72656164792063616e63656c6c65640000000000006000830152602082019050919050565b60006135da602083613e30565b91507f7265736f757263654944206e6f74206d617070656420746f2068616e646c65726000830152602082019050919050565b600061361a602083613e30565b91507f50726f706f73616c206e6f7420617420657870697279207468726573686f6c646000830152602082019050919050565b600061365a601e83613e30565b91507f6164647220616c7265616479206861732072656c6179657220726f6c652100006000830152602082019050919050565b600061369a602a83613e30565b91507f70726f706f73616c20616c7265616479207061737365642f657865637574656460008301527f2f63616e63656c6c6564000000000000000000000000000000000000000000006020830152604082019050919050565b6000613700602083613e30565b91507f73656e64657220646f65736e277420686176652072656c6179657220726f6c656000830152602082019050919050565b6000613740601e83613e30565b91507f73656e64657220646f65736e277420686176652061646d696e20726f6c6500006000830152602082019050919050565b6000613780601f83613e30565b91507f43757272656e742066656520697320657175616c20746f206e657720666565006000830152602082019050919050565b60006137c0601183613e30565b91507f6461746168617368206d69736d617463680000000000000000000000000000006000830152602082019050919050565b6000613800601983613e30565b91507f6e6f2068616e646c657220666f72207265736f757263654944000000000000006000830152602082019050919050565b600060c08301600083015161384b60008601826132f7565b50602083015161385e60208601826132f7565b5060408301518482036040860152613876828261328a565b91505060608301518482036060860152613890828261328a565b91505060808301516138a560808601826133af565b5060a08301516138b860a08601826138c3565b508091505092915050565b6138cc81613eda565b82525050565b6138db81613eda565b82525050565b6138ea81613ee4565b82525050565b6138f981613f0d565b82525050565b600061390b8286613273565b60148201915061391c828486613351565b9150819050949350505050565b600060208201905061393e6000830184613264565b92915050565b60006060820190506139596000830186613264565b6139666020830185613264565b61397360408301846138d2565b949350505050565b600060208201905061399060008301846132e8565b92915050565b60006020820190506139ab6000830184613306565b92915050565b60006040820190506139c66000830185613306565b6139d36020830184613264565b9392505050565b60006080820190506139ef6000830187613306565b6139fc6020830186613264565b613a096040830185613315565b613a166060830184613315565b95945050505050565b6000604082019050613a346000830185613306565b613a416020830184613306565b9392505050565b6000608082019050613a5d6000830187613306565b613a6a6020830186613306565b613a7760408301856133be565b613a8460608301846138d2565b95945050505050565b6000604082019050613aa26000830186613306565b8181036020830152613ab5818486613324565b9050949350505050565b600060a082019050613ad46000830189613306565b613ae160208301886138f0565b613aee60408301876138e1565b613afb6060830186613246565b8181036080830152613b0e818486613324565b9050979650505050505050565b60006020820190508181036000830152613b358184613376565b905092915050565b60006020820190508181036000830152613b56816133cd565b9050919050565b60006020820190508181036000830152613b768161340d565b9050919050565b60006020820190508181036000830152613b968161344d565b9050919050565b60006020820190508181036000830152613bb68161348d565b9050919050565b60006020820190508181036000830152613bd6816134cd565b9050919050565b60006020820190508181036000830152613bf68161350d565b9050919050565b60006020820190508181036000830152613c168161354d565b9050919050565b60006020820190508181036000830152613c368161358d565b9050919050565b60006020820190508181036000830152613c56816135cd565b9050919050565b60006020820190508181036000830152613c768161360d565b9050919050565b60006020820190508181036000830152613c968161364d565b9050919050565b60006020820190508181036000830152613cb68161368d565b9050919050565b60006020820190508181036000830152613cd6816136f3565b9050919050565b60006020820190508181036000830152613cf681613733565b9050919050565b60006020820190508181036000830152613d1681613773565b9050919050565b60006020820190508181036000830152613d36816137b3565b9050919050565b60006020820190508181036000830152613d56816137f3565b9050919050565b60006020820190508181036000830152613d778184613833565b905092915050565b6000602082019050613d9460008301846138d2565b92915050565b6000602082019050613daf60008301846138e1565b92915050565b6000602082019050613dca60008301846138f0565b92915050565b6000819050602082019050919050565b600081519050919050565b600081519050919050565b6000602082019050919050565b600082825260208201905092915050565b600082825260208201905092915050565b600081905092915050565b600082825260208201905092915050565b6000613e4c82613eba565b9050919050565b6000613e5e82613eba565b9050919050565b60008115159050919050565b6000819050919050565b60007fffffffff0000000000000000000000000000000000000000000000000000000082169050919050565b6000819050613eb582613fe8565b919050565b600073ffffffffffffffffffffffffffffffffffffffff82169050919050565b6000819050919050565b600067ffffffffffffffff82169050919050565b600068ffffffffffffffffff82169050919050565b600060ff82169050919050565b6000613f2582613f3e565b9050919050565b6000613f3782613ea7565b9050919050565b6000613f4982613f50565b9050919050565b6000613f5b82613eba565b9050919050565b82818337600083830152505050565b60005b83811015613f8f578082015181840152602081019050613f74565b83811115613f9e576000848401525b50505050565b6000613faf82613fb6565b9050919050565b6000613fc182613fdb565b9050919050565bfe5b6000601f19601f8301169050919050565b60008160601b9050919050565b60058110613ff957613ff8613fc8565b5b50565b61400581613e41565b811461401057600080fd5b50565b61401c81613e53565b811461402757600080fd5b50565b61403381613e71565b811461403e57600080fd5b50565b61404a81613e7b565b811461405557600080fd5b50565b61406181613eda565b811461406c57600080fd5b50565b61407881613ee4565b811461408357600080fd5b50565b61408f81613ef8565b811461409a57600080fd5b50565b6140a681613f0d565b81146140b157600080fd5b5056fe416363657373436f6e74726f6c3a2073656e646572206d75737420626520616e2061646d696e20746f206772616e74416363657373436f6e74726f6c3a2073656e646572206d75737420626520616e2061646d696e20746f207265766f6b65416363657373436f6e74726f6c3a2063616e206f6e6c792072656e6f756e636520726f6c657320666f722073656c66a26469706673582212209468b99a3a8101992d724a81ea4753c2709a7ec043e804024fcaae5d2505cd0e64736f6c63430007040033416363657373436f6e74726f6c3a2073656e646572206d75737420626520616e2061646d696e20746f206772616e74000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000a000000000000000000000000000000000000000000000000000000000000000010000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000006400000000000000000000000000000000000000000000000000000000000000010000000000000000000000002e70f28c39c8d1f1b737cd37e1ec76b72bd87cf6
Deployed Bytecode
0x60806040526004361061021a5760003560e01c806380ae1c2811610123578063a9cf69fa116100ab578063cdb0f73a1161006f578063cdb0f73a146107e7578063d547741f14610810578063d7a9cd7914610839578063e8437ee714610864578063ffaac0eb1461088d5761021a565b8063a9cf69fa14610700578063beab71311461073d578063c5b37c2214610768578063c5ec897014610793578063cb10f215146107be5761021a565b806391d14854116100f257806391d1485414610619578063926d7d7f146106565780639d5773e0146106815780639d82dd63146106ac578063a217fddf146106d55761021a565b806380ae1c281461057357806384db809f1461058a5780638c0c2631146105c757806391c404ac146105f05761021a565b80634b0b919d116101a65780635c975abb116101755780635c975abb1461048e5780635e1fab0f146104b9578063780cf004146104e25780637febe63f1461050b578063802aabe8146105485761021a565b80634b0b919d146103ab5780634e056005146103e85780635059871914610411578063541d5548146104515761021a565b80632f2ff15d116101ed5780632f2ff15d146102ca57806336568abe146102f35780633ee7094a1461031c5780634454b20d146103595780634603ae38146103825761021a565b806305e2ca171461021f57806317f03ce51461023b5780631ff013f114610264578063248a9ca31461028d575b600080fd5b61023960048036038101906102349190613090565b6108a4565b005b34801561024757600080fd5b50610262600480360381019061025d91906130fc565b610b01565b005b34801561027057600080fd5b5061028b6004803603810190610286919061314b565b610cae565b005b34801561029957600080fd5b506102b460048036038101906102af9190612f12565b61145d565b6040516102c19190613996565b60405180910390f35b3480156102d657600080fd5b506102f160048036038101906102ec9190612f3b565b61147d565b005b3480156102ff57600080fd5b5061031a60048036038101906103159190612f3b565b6114f9565b005b34801561032857600080fd5b50610343600480360381019061033e9190612fa0565b611592565b6040516103509190613b1b565b60405180910390f35b34801561036557600080fd5b50610380600480360381019061037b91906131ae565b61164f565b005b34801561038e57600080fd5b506103a960048036038101906103a49190612e9d565b611990565b005b3480156103b757600080fd5b506103d260048036038101906103cd9190613067565b611a33565b6040516103df9190613d9a565b60405180910390f35b3480156103f457600080fd5b5061040f600480360381019061040a9190612f77565b611a5a565b005b34801561041d57600080fd5b5061043860048036038101906104339190612fdc565b611a99565b6040516104489493929190613a48565b60405180910390f35b34801561045d57600080fd5b5061047860048036038101906104739190612ce6565b611ae3565b604051610485919061397b565b60405180910390f35b34801561049a57600080fd5b506104a3611b16565b6040516104b0919061397b565b60405180910390f35b3480156104c557600080fd5b506104e060048036038101906104db9190612ce6565b611b2c565b005b3480156104ee57600080fd5b5061050960048036038101906105049190612d74565b611b51565b005b34801561051757600080fd5b50610532600480360381019061052d9190613018565b611bd4565b60405161053f919061397b565b60405180910390f35b34801561055457600080fd5b5061055d611c10565b60405161056a9190613d7f565b60405180910390f35b34801561057f57600080fd5b50610588611c16565b005b34801561059657600080fd5b506105b160048036038101906105ac9190612f12565b611c28565b6040516105be9190613929565b60405180910390f35b3480156105d357600080fd5b506105ee60048036038101906105e99190612d38565b611c5b565b005b3480156105fc57600080fd5b5061061760048036038101906106129190612f77565b611cd8565b005b34801561062557600080fd5b50610640600480360381019061063b9190612f3b565b611d2f565b60405161064d919061397b565b60405180910390f35b34801561066257600080fd5b5061066b611d9a565b6040516106789190613996565b60405180910390f35b34801561068d57600080fd5b50610696611dbe565b6040516106a39190613d7f565b60405180910390f35b3480156106b857600080fd5b506106d360048036038101906106ce9190612ce6565b611dc4565b005b3480156106e157600080fd5b506106ea611eb8565b6040516106f79190613996565b60405180910390f35b34801561070c57600080fd5b50610727600480360381019061072291906130fc565b611ebf565b6040516107349190613d5d565b60405180910390f35b34801561074957600080fd5b506107526120a0565b60405161075f9190613db5565b60405180910390f35b34801561077457600080fd5b5061077d6120b3565b60405161078a9190613d7f565b60405180910390f35b34801561079f57600080fd5b506107a86120b9565b6040516107b59190613d7f565b60405180910390f35b3480156107ca57600080fd5b506107e560048036038101906107e09190612dd7565b6120bf565b005b3480156107f357600080fd5b5061080e60048036038101906108099190612ce6565b612191565b005b34801561081c57600080fd5b5061083760048036038101906108329190612f3b565b612285565b005b34801561084557600080fd5b5061084e612301565b60405161085b9190613d7f565b60405180910390f35b34801561087057600080fd5b5061088b60048036038101906108869190612e26565b612307565b005b34801561089957600080fd5b506108a26123df565b005b6108ac6123f1565b60065434146108f0576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016108e790613bdd565b60405180910390fd5b60006009600085815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff161415610998576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161098f90613c3d565b60405180910390fd5b6000600860008760ff1660ff168152602001908152602001600020600081819054906101000a900467ffffffffffffffff1660010191906101000a81548167ffffffffffffffff021916908367ffffffffffffffff160217905590508383600a60008467ffffffffffffffff1667ffffffffffffffff16815260200190815260200160002060008960ff1660ff1681526020019081526020016000209190610a419291906129e4565b5060008290508073ffffffffffffffffffffffffffffffffffffffff166338995da9878985338a8a6040518763ffffffff1660e01b8152600401610a8a96959493929190613abf565b600060405180830381600087803b158015610aa457600080fd5b505af1158015610ab8573d6000803e3d6000fd5b505050508167ffffffffffffffff16868860ff167fdbb69440df8433824a026ef190652f29929eb64b4d1d5d2a69be8afe3e6eaed860405160405180910390a450505050505050565b610b09612474565b60008360ff1660088467ffffffffffffffff1668ffffffffffffffffff16901b1790506000600b60008368ffffffffffffffffff1668ffffffffffffffffff16815260200190815260200160002060008481526020019081526020016000209050600480811115610b7657fe5b8160040160009054906101000a900460ff166004811115610b9357fe5b1415610bd4576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610bcb90613c1d565b60405180910390fd5b600754610be54383600501546124f3565b11610c25576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610c1c90613c5d565b60405180910390fd5b60048160040160006101000a81548160ff02191690836004811115610c4657fe5b0217905550600480811115610c5757fe5b8467ffffffffffffffff168660ff167f803c5a12f6bde629cea32e63d4b92d1b560816a6fb72e939d3c89e1cab65041784600001548560010154604051610c9f929190613a1f565b60405180910390a45050505050565b610cb661253d565b610cbe6123f1565b60008460ff1660088567ffffffffffffffff1668ffffffffffffffffff16901b1790506000600b60008368ffffffffffffffffff1668ffffffffffffffffff16815260200190815260200160002060008481526020019081526020016000209050600073ffffffffffffffffffffffffffffffffffffffff166009600086815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff161415610dc2576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610db990613d3d565b60405180910390fd5b60018160040160009054906101000a900460ff166004811115610de157fe5b1115610e22576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610e1990613c9d565b60405180910390fd5b600c60008368ffffffffffffffffff1668ffffffffffffffffff168152602001908152602001600020600084815260200190815260200160002060003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff1615610ee7576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610ede90613b9d565b60405180910390fd5b60008160040160009054906101000a900460ff166004811115610f0657fe5b141561115457600560008154600101919050819055506040518060c00160405280858152602001848152602001600167ffffffffffffffff81118015610f4b57600080fd5b50604051908082528060200260200182016040528015610f7a5781602001602082028036833780820191505090505b508152602001600067ffffffffffffffff81118015610f9857600080fd5b50604051908082528060200260200182016040528015610fc75781602001602082028036833780820191505090505b50815260200160016004811115610fda57fe5b815260200143815250600b60008468ffffffffffffffffff1668ffffffffffffffffff16815260200190815260200160002060008581526020019081526020016000206000820151816000015560208201518160010155604082015181600201908051906020019061104d929190612a72565b50606082015181600301908051906020019061106a929190612a72565b5060808201518160040160006101000a81548160ff0219169083600481111561108f57fe5b021790555060a0820151816005015590505033816002016000815481106110b257fe5b9060005260206000200160006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055506001600481111561110757fe5b8567ffffffffffffffff168760ff167f803c5a12f6bde629cea32e63d4b92d1b560816a6fb72e939d3c89e1cab6504178787604051611147929190613a1f565b60405180910390a4611297565b6007546111654383600501546124f3565b11156111ea5760048160040160006101000a81548160ff0219169083600481111561118c57fe5b021790555060048081111561119d57fe5b8567ffffffffffffffff168760ff167f803c5a12f6bde629cea32e63d4b92d1b560816a6fb72e939d3c89e1cab65041787876040516111dd929190613a1f565b60405180910390a4611296565b80600101548314611230576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161122790613d1d565b60405180910390fd5b80600201339080600181540180825580915050600190039060005260206000200160009091909190916101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055505b5b6004808111156112a357fe5b8160040160009054906101000a900460ff1660048111156112c057fe5b14611455576001600c60008468ffffffffffffffffff1668ffffffffffffffffff168152602001908152602001600020600085815260200190815260200160002060003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff0219169083151502179055508060040160009054906101000a900460ff16600481111561137257fe5b8567ffffffffffffffff168760ff167f25f8daaa4635a7729927ba3f5b3d59cc3320aca7c32c9db4e7ca7b9574343640876040516113b09190613996565b60405180910390a460016003541115806113d35750600354816002018054905010155b156114545760028160040160006101000a81548160ff021916908360048111156113f957fe5b02179055506002600481111561140b57fe5b8567ffffffffffffffff168760ff167f803c5a12f6bde629cea32e63d4b92d1b560816a6fb72e939d3c89e1cab650417878760405161144b929190613a1f565b60405180910390a45b5b505050505050565b600060016000838152602001908152602001600020600101549050919050565b6114966114898361145d565b6114916125a8565b611d2f565b6114eb576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040180806020018281038252602f8152602001806140b5602f913960400191505060405180910390fd5b6114f582826125b0565b5050565b6115016125a8565b73ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff1614611584576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040180806020018281038252602f815260200180614114602f913960400191505060405180910390fd5b61158e8282612690565b5050565b600a602052816000526040600020602052806000526040600020600091509150508054600181600116156101000203166002900480601f0160208091040260200160405190810160405280929190818152602001828054600181600116156101000203166002900480156116475780601f1061161c57610100808354040283529160200191611647565b820191906000526020600020905b81548152906001019060200180831161162a57829003601f168201915b505050505081565b61165761253d565b61165f6123f1565b60006009600083815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905060008660ff1660088767ffffffffffffffff1668ffffffffffffffffff16901b17905060008286866040516020016116d1939291906138ff565b6040516020818303038152906040528051906020012090506000600b60008468ffffffffffffffffff1668ffffffffffffffffff168152602001908152602001600020600083815260200190815260200160002090506000600481111561173457fe5b8160040160009054906101000a900460ff16600481111561175157fe5b1415611792576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161178990613b5d565b60405180910390fd5b6002600481111561179f57fe5b8160040160009054906101000a900460ff1660048111156117bc57fe5b146117fc576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016117f390613b3d565b60405180910390fd5b80600101548214611842576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161183990613bfd565b60405180910390fd5b60038160040160006101000a81548160ff0219169083600481111561186357fe5b02179055506000600960008360000154815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1690508073ffffffffffffffffffffffffffffffffffffffff1663e248cff283600001548a8a6040518463ffffffff1660e01b81526004016118e593929190613a8d565b600060405180830381600087803b1580156118ff57600080fd5b505af1158015611913573d6000803e3d6000fd5b505050508160040160009054906101000a900460ff16600481111561193457fe5b8967ffffffffffffffff168b60ff167f803c5a12f6bde629cea32e63d4b92d1b560816a6fb72e939d3c89e1cab6504178560000154866001015460405161197c929190613a1f565b60405180910390a450505050505050505050565b611998612772565b60005b84849050811015611a2c578484828181106119b257fe5b90506020020160208101906119c79190612d0f565b73ffffffffffffffffffffffffffffffffffffffff166108fc8484848181106119ec57fe5b905060200201359081150290604051600060405180830381858888f19350505050158015611a1e573d6000803e3d6000fd5b50808060010191505061199b565b5050505050565b60086020528060005260406000206000915054906101000a900467ffffffffffffffff1681565b611a62612772565b80600381905550807fa20d6b84cd798a24038be305eff8a45ca82ef54a2aa2082005d8e14c0a4746c860405160405180910390a250565b600b602052816000526040600020602052806000526040600020600091509150508060000154908060010154908060040160009054906101000a900460ff16908060050154905084565b6000611b0f7fe2b7fb3b832174769106daebcfd6d1970523240dda11281102db9363b83b0dc483611d2f565b9050919050565b60008060009054906101000a900460ff16905090565b611b34612772565b611b416000801b8261147d565b611b4e6000801b336114f9565b50565b611b59612772565b60008490508073ffffffffffffffffffffffffffffffffffffffff1663d9caed128585856040518463ffffffff1660e01b8152600401611b9b93929190613944565b600060405180830381600087803b158015611bb557600080fd5b505af1158015611bc9573d6000803e3d6000fd5b505050505050505050565b600c602052826000526040600020602052816000526040600020602052806000526040600020600092509250509054906101000a900460ff1681565b60045481565b611c1e612772565b611c266127c0565b565b60096020528060005260406000206000915054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b611c63612772565b60008290508073ffffffffffffffffffffffffffffffffffffffff166307b7ed99836040518263ffffffff1660e01b8152600401611ca19190613929565b600060405180830381600087803b158015611cbb57600080fd5b505af1158015611ccf573d6000803e3d6000fd5b50505050505050565b611ce0612772565b806006541415611d25576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611d1c90613cfd565b60405180910390fd5b8060068190555050565b60006001600084815260200190815260200160002060000160008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff16905092915050565b7fe2b7fb3b832174769106daebcfd6d1970523240dda11281102db9363b83b0dc481565b60055481565b611dcc612772565b611df67fe2b7fb3b832174769106daebcfd6d1970523240dda11281102db9363b83b0dc482611d2f565b611e35576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611e2c90613bbd565b60405180910390fd5b611e5f7fe2b7fb3b832174769106daebcfd6d1970523240dda11281102db9363b83b0dc482612285565b8073ffffffffffffffffffffffffffffffffffffffff167f10e1f7ce9fd7d1b90a66d13a2ab3cb8dd7f29f3f8d520b143b063ccfbab6906b60405160405180910390a26004600081548092919060019003919050555050565b6000801b81565b611ec7612afc565b60008460ff1660088567ffffffffffffffff1668ffffffffffffffffff16901b179050600b60008268ffffffffffffffffff1668ffffffffffffffffff16815260200190815260200160002060008481526020019081526020016000206040518060c0016040529081600082015481526020016001820154815260200160028201805480602002602001604051908101604052809291908181526020018280548015611fc857602002820191906000526020600020905b8160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019060010190808311611f7e575b505050505081526020016003820180548060200260200160405190810160405280929190818152602001828054801561205657602002820191906000526020600020905b8160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001906001019080831161200c575b505050505081526020016004820160009054906101000a900460ff16600481111561207d57fe5b600481111561208857fe5b81526020016005820154815250509150509392505050565b600260009054906101000a900460ff1681565b60065481565b60075481565b6120c7612772565b826009600084815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555060008390508073ffffffffffffffffffffffffffffffffffffffff1663b8fa373684846040518363ffffffff1660e01b81526004016121599291906139b1565b600060405180830381600087803b15801561217357600080fd5b505af1158015612187573d6000803e3d6000fd5b5050505050505050565b612199612772565b6121c37fe2b7fb3b832174769106daebcfd6d1970523240dda11281102db9363b83b0dc482611d2f565b15612203576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016121fa90613c7d565b60405180910390fd5b61222d7fe2b7fb3b832174769106daebcfd6d1970523240dda11281102db9363b83b0dc48261147d565b8073ffffffffffffffffffffffffffffffffffffffff167f03580ee9f53a62b7cb409a2cb56f9be87747dd15017afc5cef6eef321e4fb2c560405160405180910390a260046000815480929190600101919050555050565b61229e6122918361145d565b6122996125a8565b611d2f565b6122f3576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260308152602001806140e46030913960400191505060405180910390fd5b6122fd8282612690565b5050565b60035481565b61230f612772565b846009600086815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555060008590508073ffffffffffffffffffffffffffffffffffffffff1663bba8185a868686866040518563ffffffff1660e01b81526004016123a594939291906139da565b600060405180830381600087803b1580156123bf57600080fd5b505af11580156123d3573d6000803e3d6000fd5b50505050505050505050565b6123e7612772565b6123ef612831565b565b60008054906101000a900460ff1615612472576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260108152602001807f5061757361626c653a207061757365640000000000000000000000000000000081525060200191505060405180910390fd5b565b6124816000801b33611d2f565b806124b257506124b17fe2b7fb3b832174769106daebcfd6d1970523240dda11281102db9363b83b0dc433611d2f565b5b6124f1576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016124e890613b7d565b60405180910390fd5b565b600061253583836040518060400160405280601e81526020017f536166654d6174683a207375627472616374696f6e206f766572666c6f7700008152506128a2565b905092915050565b6125677fe2b7fb3b832174769106daebcfd6d1970523240dda11281102db9363b83b0dc433611d2f565b6125a6576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161259d90613cbd565b60405180910390fd5b565b600033905090565b6125ba8282611d2f565b61268c57600180600084815260200190815260200160002060000160008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff0219169083151502179055506126316125a8565b73ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff16837f2f8788117e7eff1d82e926ec794901d17c78024a50270940304540a733656f0d60405160405180910390a45b5050565b61269a8282611d2f565b1561276e5760006001600084815260200190815260200160002060000160008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff0219169083151502179055506127136125a8565b73ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff16837ff6391f5c32d9c69d2a47ea670b442974b53935d1edc7fd64eb21e047a839171b60405160405180910390a45b5050565b61277f6000801b33611d2f565b6127be576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016127b590613cdd565b60405180910390fd5b565b6127c86123f1565b60016000806101000a81548160ff0219169083151502179055507f62e78cea01bee320cd4e420270b5ea74000d11b0c9f74754ebdbfc544b05a25833604051808273ffffffffffffffffffffffffffffffffffffffff16815260200191505060405180910390a1565b612839612962565b60008060006101000a81548160ff0219169083151502179055507f5db9ee0a495bf2e6ff9c91a7834c1ba4fdd244a5e8aa4e537bd38aeae4b073aa33604051808273ffffffffffffffffffffffffffffffffffffffff16815260200191505060405180910390a1565b600083831115829061294f576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825283818151815260200191508051906020019080838360005b838110156129145780820151818401526020810190506128f9565b50505050905090810190601f1680156129415780820380516001836020036101000a031916815260200191505b509250505060405180910390fd5b5060008385039050809150509392505050565b60008054906101000a900460ff166129e2576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260148152602001807f5061757361626c653a206e6f742070617573656400000000000000000000000081525060200191505060405180910390fd5b565b828054600181600116156101000203166002900490600052602060002090601f016020900481019282612a1a5760008555612a61565b82601f10612a3357803560ff1916838001178555612a61565b82800160010185558215612a61579182015b82811115612a60578235825591602001919060010190612a45565b5b509050612a6e9190612b43565b5090565b828054828255906000526020600020908101928215612aeb579160200282015b82811115612aea5782518260006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555091602001919060010190612a92565b5b509050612af89190612b43565b5090565b6040518060c001604052806000801916815260200160008019168152602001606081526020016060815260200160006004811115612b3657fe5b8152602001600081525090565b5b80821115612b5c576000816000905550600101612b44565b5090565b600081359050612b6f81613ffc565b92915050565b600081359050612b8481614013565b92915050565b60008083601f840112612b9c57600080fd5b8235905067ffffffffffffffff811115612bb557600080fd5b602083019150836020820283011115612bcd57600080fd5b9250929050565b60008083601f840112612be657600080fd5b8235905067ffffffffffffffff811115612bff57600080fd5b602083019150836020820283011115612c1757600080fd5b9250929050565b600081359050612c2d8161402a565b92915050565b600081359050612c4281614041565b92915050565b60008083601f840112612c5a57600080fd5b8235905067ffffffffffffffff811115612c7357600080fd5b602083019150836001820283011115612c8b57600080fd5b9250929050565b600081359050612ca181614058565b92915050565b600081359050612cb68161406f565b92915050565b600081359050612ccb81614086565b92915050565b600081359050612ce08161409d565b92915050565b600060208284031215612cf857600080fd5b6000612d0684828501612b60565b91505092915050565b600060208284031215612d2157600080fd5b6000612d2f84828501612b75565b91505092915050565b60008060408385031215612d4b57600080fd5b6000612d5985828601612b60565b9250506020612d6a85828601612b60565b9150509250929050565b60008060008060808587031215612d8a57600080fd5b6000612d9887828801612b60565b9450506020612da987828801612b60565b9350506040612dba87828801612b60565b9250506060612dcb87828801612c92565b91505092959194509250565b600080600060608486031215612dec57600080fd5b6000612dfa86828701612b60565b9350506020612e0b86828701612c1e565b9250506040612e1c86828701612b60565b9150509250925092565b600080600080600060a08688031215612e3e57600080fd5b6000612e4c88828901612b60565b9550506020612e5d88828901612c1e565b9450506040612e6e88828901612b60565b9350506060612e7f88828901612c33565b9250506080612e9088828901612c33565b9150509295509295909350565b60008060008060408587031215612eb357600080fd5b600085013567ffffffffffffffff811115612ecd57600080fd5b612ed987828801612b8a565b9450945050602085013567ffffffffffffffff811115612ef857600080fd5b612f0487828801612bd4565b925092505092959194509250565b600060208284031215612f2457600080fd5b6000612f3284828501612c1e565b91505092915050565b60008060408385031215612f4e57600080fd5b6000612f5c85828601612c1e565b9250506020612f6d85828601612b60565b9150509250929050565b600060208284031215612f8957600080fd5b6000612f9784828501612c92565b91505092915050565b60008060408385031215612fb357600080fd5b6000612fc185828601612ca7565b9250506020612fd285828601612cd1565b9150509250929050565b60008060408385031215612fef57600080fd5b6000612ffd85828601612cbc565b925050602061300e85828601612c1e565b9150509250929050565b60008060006060848603121561302d57600080fd5b600061303b86828701612cbc565b935050602061304c86828701612c1e565b925050604061305d86828701612b60565b9150509250925092565b60006020828403121561307957600080fd5b600061308784828501612cd1565b91505092915050565b600080600080606085870312156130a657600080fd5b60006130b487828801612cd1565b94505060206130c587828801612c1e565b935050604085013567ffffffffffffffff8111156130e257600080fd5b6130ee87828801612c48565b925092505092959194509250565b60008060006060848603121561311157600080fd5b600061311f86828701612cd1565b935050602061313086828701612ca7565b925050604061314186828701612c1e565b9150509250925092565b6000806000806080858703121561316157600080fd5b600061316f87828801612cd1565b945050602061318087828801612ca7565b935050604061319187828801612c1e565b92505060606131a287828801612c1e565b91505092959194509250565b6000806000806000608086880312156131c657600080fd5b60006131d488828901612cd1565b95505060206131e588828901612ca7565b945050604086013567ffffffffffffffff81111561320257600080fd5b61320e88828901612c48565b9350935050606061322188828901612c1e565b9150509295509295909350565b600061323a8383613255565b60208301905092915050565b61324f81613f1a565b82525050565b61325e81613e41565b82525050565b61326d81613e41565b82525050565b61328461327f82613e41565b613fa4565b82525050565b600061329582613de0565b61329f8185613e03565b93506132aa83613dd0565b8060005b838110156132db5781516132c2888261322e565b97506132cd83613df6565b9250506001810190506132ae565b5085935050505092915050565b6132f181613e65565b82525050565b61330081613e71565b82525050565b61330f81613e71565b82525050565b61331e81613e7b565b82525050565b60006133308385613e14565b935061333d838584613f62565b61334683613fca565b840190509392505050565b600061335d8385613e25565b935061336a838584613f62565b82840190509392505050565b600061338182613deb565b61338b8185613e14565b935061339b818560208601613f71565b6133a481613fca565b840191505092915050565b6133b881613f2c565b82525050565b6133c781613f2c565b82525050565b60006133da601c83613e30565b91507f70726f706f73616c20616c7265616479207472616e73666572726564000000006000830152602082019050919050565b600061341a601683613e30565b91507f70726f706f73616c206973206e6f7420616374697665000000000000000000006000830152602082019050919050565b600061345a601e83613e30565b91507f73656e646572206973206e6f742072656c61796572206f722061646d696e00006000830152602082019050919050565b600061349a601583613e30565b91507f72656c6179657220616c726561647920766f74656400000000000000000000006000830152602082019050919050565b60006134da601f83613e30565b91507f6164647220646f65736e277420686176652072656c6179657220726f6c6521006000830152602082019050919050565b600061351a601683613e30565b91507f496e636f72726563742066656520737570706c696564000000000000000000006000830152602082019050919050565b600061355a601b83613e30565b91507f6461746120646f65736e2774206d6174636820646174616861736800000000006000830152602082019050919050565b600061359a601a83613e30565b91507f50726f706f73616c20616c72656164792063616e63656c6c65640000000000006000830152602082019050919050565b60006135da602083613e30565b91507f7265736f757263654944206e6f74206d617070656420746f2068616e646c65726000830152602082019050919050565b600061361a602083613e30565b91507f50726f706f73616c206e6f7420617420657870697279207468726573686f6c646000830152602082019050919050565b600061365a601e83613e30565b91507f6164647220616c7265616479206861732072656c6179657220726f6c652100006000830152602082019050919050565b600061369a602a83613e30565b91507f70726f706f73616c20616c7265616479207061737365642f657865637574656460008301527f2f63616e63656c6c6564000000000000000000000000000000000000000000006020830152604082019050919050565b6000613700602083613e30565b91507f73656e64657220646f65736e277420686176652072656c6179657220726f6c656000830152602082019050919050565b6000613740601e83613e30565b91507f73656e64657220646f65736e277420686176652061646d696e20726f6c6500006000830152602082019050919050565b6000613780601f83613e30565b91507f43757272656e742066656520697320657175616c20746f206e657720666565006000830152602082019050919050565b60006137c0601183613e30565b91507f6461746168617368206d69736d617463680000000000000000000000000000006000830152602082019050919050565b6000613800601983613e30565b91507f6e6f2068616e646c657220666f72207265736f757263654944000000000000006000830152602082019050919050565b600060c08301600083015161384b60008601826132f7565b50602083015161385e60208601826132f7565b5060408301518482036040860152613876828261328a565b91505060608301518482036060860152613890828261328a565b91505060808301516138a560808601826133af565b5060a08301516138b860a08601826138c3565b508091505092915050565b6138cc81613eda565b82525050565b6138db81613eda565b82525050565b6138ea81613ee4565b82525050565b6138f981613f0d565b82525050565b600061390b8286613273565b60148201915061391c828486613351565b9150819050949350505050565b600060208201905061393e6000830184613264565b92915050565b60006060820190506139596000830186613264565b6139666020830185613264565b61397360408301846138d2565b949350505050565b600060208201905061399060008301846132e8565b92915050565b60006020820190506139ab6000830184613306565b92915050565b60006040820190506139c66000830185613306565b6139d36020830184613264565b9392505050565b60006080820190506139ef6000830187613306565b6139fc6020830186613264565b613a096040830185613315565b613a166060830184613315565b95945050505050565b6000604082019050613a346000830185613306565b613a416020830184613306565b9392505050565b6000608082019050613a5d6000830187613306565b613a6a6020830186613306565b613a7760408301856133be565b613a8460608301846138d2565b95945050505050565b6000604082019050613aa26000830186613306565b8181036020830152613ab5818486613324565b9050949350505050565b600060a082019050613ad46000830189613306565b613ae160208301886138f0565b613aee60408301876138e1565b613afb6060830186613246565b8181036080830152613b0e818486613324565b9050979650505050505050565b60006020820190508181036000830152613b358184613376565b905092915050565b60006020820190508181036000830152613b56816133cd565b9050919050565b60006020820190508181036000830152613b768161340d565b9050919050565b60006020820190508181036000830152613b968161344d565b9050919050565b60006020820190508181036000830152613bb68161348d565b9050919050565b60006020820190508181036000830152613bd6816134cd565b9050919050565b60006020820190508181036000830152613bf68161350d565b9050919050565b60006020820190508181036000830152613c168161354d565b9050919050565b60006020820190508181036000830152613c368161358d565b9050919050565b60006020820190508181036000830152613c56816135cd565b9050919050565b60006020820190508181036000830152613c768161360d565b9050919050565b60006020820190508181036000830152613c968161364d565b9050919050565b60006020820190508181036000830152613cb68161368d565b9050919050565b60006020820190508181036000830152613cd6816136f3565b9050919050565b60006020820190508181036000830152613cf681613733565b9050919050565b60006020820190508181036000830152613d1681613773565b9050919050565b60006020820190508181036000830152613d36816137b3565b9050919050565b60006020820190508181036000830152613d56816137f3565b9050919050565b60006020820190508181036000830152613d778184613833565b905092915050565b6000602082019050613d9460008301846138d2565b92915050565b6000602082019050613daf60008301846138e1565b92915050565b6000602082019050613dca60008301846138f0565b92915050565b6000819050602082019050919050565b600081519050919050565b600081519050919050565b6000602082019050919050565b600082825260208201905092915050565b600082825260208201905092915050565b600081905092915050565b600082825260208201905092915050565b6000613e4c82613eba565b9050919050565b6000613e5e82613eba565b9050919050565b60008115159050919050565b6000819050919050565b60007fffffffff0000000000000000000000000000000000000000000000000000000082169050919050565b6000819050613eb582613fe8565b919050565b600073ffffffffffffffffffffffffffffffffffffffff82169050919050565b6000819050919050565b600067ffffffffffffffff82169050919050565b600068ffffffffffffffffff82169050919050565b600060ff82169050919050565b6000613f2582613f3e565b9050919050565b6000613f3782613ea7565b9050919050565b6000613f4982613f50565b9050919050565b6000613f5b82613eba565b9050919050565b82818337600083830152505050565b60005b83811015613f8f578082015181840152602081019050613f74565b83811115613f9e576000848401525b50505050565b6000613faf82613fb6565b9050919050565b6000613fc182613fdb565b9050919050565bfe5b6000601f19601f8301169050919050565b60008160601b9050919050565b60058110613ff957613ff8613fc8565b5b50565b61400581613e41565b811461401057600080fd5b50565b61401c81613e53565b811461402757600080fd5b50565b61403381613e71565b811461403e57600080fd5b50565b61404a81613e7b565b811461405557600080fd5b50565b61406181613eda565b811461406c57600080fd5b50565b61407881613ee4565b811461408357600080fd5b50565b61408f81613ef8565b811461409a57600080fd5b50565b6140a681613f0d565b81146140b157600080fd5b5056fe416363657373436f6e74726f6c3a2073656e646572206d75737420626520616e2061646d696e20746f206772616e74416363657373436f6e74726f6c3a2073656e646572206d75737420626520616e2061646d696e20746f207265766f6b65416363657373436f6e74726f6c3a2063616e206f6e6c792072656e6f756e636520726f6c657320666f722073656c66a26469706673582212209468b99a3a8101992d724a81ea4753c2709a7ec043e804024fcaae5d2505cd0e64736f6c63430007040033
Constructor Arguments (ABI-Encoded and is the last bytes of the Contract Creation Code above)
000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000a000000000000000000000000000000000000000000000000000000000000000010000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000006400000000000000000000000000000000000000000000000000000000000000010000000000000000000000002e70f28c39c8d1f1b737cd37e1ec76b72bd87cf6
-----Decoded View---------------
Arg [0] : chainID (uint8): 0
Arg [1] : initialRelayers (address[]): 0x2E70f28C39c8d1f1b737cD37e1EC76b72bD87cf6
Arg [2] : initialRelayerThreshold (uint256): 1
Arg [3] : fee (uint256): 0
Arg [4] : expiry (uint256): 100
-----Encoded View---------------
7 Constructor Arguments found :
Arg [0] : 0000000000000000000000000000000000000000000000000000000000000000
Arg [1] : 00000000000000000000000000000000000000000000000000000000000000a0
Arg [2] : 0000000000000000000000000000000000000000000000000000000000000001
Arg [3] : 0000000000000000000000000000000000000000000000000000000000000000
Arg [4] : 0000000000000000000000000000000000000000000000000000000000000064
Arg [5] : 0000000000000000000000000000000000000000000000000000000000000001
Arg [6] : 0000000000000000000000002e70f28c39c8d1f1b737cd37e1ec76b72bd87cf6
Loading...
Loading
Loading...
Loading
Net Worth in USD
$0.00
Net Worth in ETH
0
Multichain Portfolio | 33 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.