Overview
ETH Balance
0 ETH
Eth Value
$0.00More Info
Private Name Tags
ContractCreator
Latest 7 from a total of 7 transactions
Transaction Hash |
Method
|
Block
|
From
|
To
|
|||||
---|---|---|---|---|---|---|---|---|---|
Burn | 13325479 | 1167 days ago | IN | 0 ETH | 0.01570556 | ||||
Burn | 13325126 | 1167 days ago | IN | 0 ETH | 0.02143914 | ||||
Burn | 13325110 | 1167 days ago | IN | 0 ETH | 0.04064145 | ||||
Add Mint Request | 13132666 | 1197 days ago | IN | 0 ETH | 0.01956714 | ||||
Add Mint Request | 13131489 | 1197 days ago | IN | 0 ETH | 0.01753301 | ||||
Set Broker Depos... | 13131315 | 1197 days ago | IN | 0 ETH | 0.01076678 | ||||
Set Broker Depos... | 13131299 | 1197 days ago | IN | 0 ETH | 0.00853048 |
View more zero value Internal Transactions in Advanced View mode
Advanced mode:
Loading...
Loading
Contract Name:
Bridge
Compiler Version
v0.8.3+commit.8d00100c
Contract Source Code (Solidity)
/** *Submitted for verification at Etherscan.io on 2021-08-29 */ // SPDX-License-Identifier: MIT pragma solidity 0.8.3; // Part: OpenZeppelin/[email protected]/Context /* * @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; } } // Part: OpenZeppelin/[email protected]/IERC20 /** * @dev Interface of the ERC20 standard as defined in the EIP. */ interface IERC20 { /** * @dev Returns the amount of tokens in existence. */ function totalSupply() external view returns (uint256); /** * @dev Returns the amount of tokens owned by `account`. */ function balanceOf(address account) external view returns (uint256); /** * @dev Moves `amount` tokens from the caller's account to `recipient`. * * Returns a boolean value indicating whether the operation succeeded. * * Emits a {Transfer} event. */ function transfer(address recipient, uint256 amount) external returns (bool); /** * @dev Returns the remaining number of tokens that `spender` will be * allowed to spend on behalf of `owner` through {transferFrom}. This is * zero by default. * * This value changes when {approve} or {transferFrom} are called. */ function allowance(address owner, address spender) external view returns (uint256); /** * @dev Sets `amount` as the allowance of `spender` over the caller's tokens. * * Returns a boolean value indicating whether the operation succeeded. * * IMPORTANT: Beware that changing an allowance with this method brings the risk * that someone may use both the old and the new allowance by unfortunate * transaction ordering. One possible solution to mitigate this race * condition is to first reduce the spender's allowance to 0 and set the * desired value afterwards: * https://github.com/ethereum/EIPs/issues/20#issuecomment-263524729 * * Emits an {Approval} event. */ function approve(address spender, uint256 amount) external returns (bool); /** * @dev Moves `amount` tokens from `sender` to `recipient` using the * allowance mechanism. `amount` is then deducted from the caller's * allowance. * * Returns a boolean value indicating whether the operation succeeded. * * Emits a {Transfer} event. */ function transferFrom(address sender, address recipient, uint256 amount) external returns (bool); /** * @dev Emitted when `value` tokens are moved from one account (`from`) to * another (`to`). * * Note that `value` may be zero. */ event Transfer(address indexed from, address indexed to, uint256 value); /** * @dev Emitted when the allowance of a `spender` for an `owner` is set by * a call to {approve}. `value` is the new allowance. */ event Approval(address indexed owner, address indexed spender, uint256 value); } // Part: OpenZeppelin/[email protected]/IERC20Metadata /** * @dev Interface for the optional metadata functions from the ERC20 standard. * * _Available since v4.1._ */ interface IERC20Metadata is IERC20 { /** * @dev Returns the name of the token. */ function name() external view returns (string memory); /** * @dev Returns the symbol of the token. */ function symbol() external view returns (string memory); /** * @dev Returns the decimals places of the token. */ function decimals() external view returns (uint8); } // Part: OpenZeppelin/[email protected]/Ownable /** * @dev Contract module which provides a basic access control mechanism, where * there is an account (an owner) that can be granted exclusive access to * specific functions. * * By default, the owner account will be the one that deploys the contract. This * can later be changed with {transferOwnership}. * * This module is used through inheritance. It will make available the modifier * `onlyOwner`, which can be applied to your functions to restrict their use to * the owner. */ abstract contract Ownable is Context { address private _owner; event OwnershipTransferred(address indexed previousOwner, address indexed newOwner); /** * @dev Initializes the contract setting the deployer as the initial owner. */ constructor () { address msgSender = _msgSender(); _owner = msgSender; emit OwnershipTransferred(address(0), msgSender); } /** * @dev Returns the address of the current owner. */ function owner() public view virtual returns (address) { return _owner; } /** * @dev Throws if called by any account other than the owner. */ modifier onlyOwner() { require(owner() == _msgSender(), "Ownable: caller is not the owner"); _; } /** * @dev Leaves the contract without owner. It will not be possible to call * `onlyOwner` functions anymore. Can only be called by the current owner. * * NOTE: Renouncing ownership will leave the contract without an owner, * thereby removing any functionality that is only available to the owner. */ function renounceOwnership() public virtual onlyOwner { emit OwnershipTransferred(_owner, address(0)); _owner = address(0); } /** * @dev Transfers ownership of the contract to a new account (`newOwner`). * Can only be called by the current owner. */ function transferOwnership(address newOwner) public virtual onlyOwner { require(newOwner != address(0), "Ownable: new owner is the zero address"); emit OwnershipTransferred(_owner, newOwner); _owner = newOwner; } } // Part: OpenZeppelin/[email protected]/ERC20 /** * @dev Implementation of the {IERC20} interface. * * This implementation is agnostic to the way tokens are created. This means * that a supply mechanism has to be added in a derived contract using {_mint}. * For a generic mechanism see {ERC20PresetMinterPauser}. * * TIP: For a detailed writeup see our guide * https://forum.zeppelin.solutions/t/how-to-implement-erc20-supply-mechanisms/226[How * to implement supply mechanisms]. * * We have followed general OpenZeppelin guidelines: functions revert instead * of returning `false` on failure. This behavior is nonetheless conventional * and does not conflict with the expectations of ERC20 applications. * * Additionally, an {Approval} event is emitted on calls to {transferFrom}. * This allows applications to reconstruct the allowance for all accounts just * by listening to said events. Other implementations of the EIP may not emit * these events, as it isn't required by the specification. * * Finally, the non-standard {decreaseAllowance} and {increaseAllowance} * functions have been added to mitigate the well-known issues around setting * allowances. See {IERC20-approve}. */ contract ERC20 is Context, IERC20, IERC20Metadata { mapping (address => uint256) private _balances; mapping (address => mapping (address => uint256)) private _allowances; uint256 private _totalSupply; string private _name; string private _symbol; /** * @dev Sets the values for {name} and {symbol}. * * The defaut value of {decimals} is 18. To select a different value for * {decimals} you should overload it. * * All two of these values are immutable: they can only be set once during * construction. */ constructor (string memory name_, string memory symbol_) { _name = name_; _symbol = symbol_; } /** * @dev Returns the name of the token. */ function name() public view virtual override returns (string memory) { return _name; } /** * @dev Returns the symbol of the token, usually a shorter version of the * name. */ function symbol() public view virtual override returns (string memory) { return _symbol; } /** * @dev Returns the number of decimals used to get its user representation. * For example, if `decimals` equals `2`, a balance of `505` tokens should * be displayed to a user as `5,05` (`505 / 10 ** 2`). * * Tokens usually opt for a value of 18, imitating the relationship between * Ether and Wei. This is the value {ERC20} uses, unless this function is * overridden; * * NOTE: This information is only used for _display_ purposes: it in * no way affects any of the arithmetic of the contract, including * {IERC20-balanceOf} and {IERC20-transfer}. */ function decimals() public view virtual override returns (uint8) { return 18; } /** * @dev See {IERC20-totalSupply}. */ function totalSupply() public view virtual override returns (uint256) { return _totalSupply; } /** * @dev See {IERC20-balanceOf}. */ function balanceOf(address account) public view virtual override returns (uint256) { return _balances[account]; } /** * @dev See {IERC20-transfer}. * * Requirements: * * - `recipient` cannot be the zero address. * - the caller must have a balance of at least `amount`. */ function transfer(address recipient, uint256 amount) public virtual override returns (bool) { _transfer(_msgSender(), recipient, amount); return true; } /** * @dev See {IERC20-allowance}. */ function allowance(address owner, address spender) public view virtual override returns (uint256) { return _allowances[owner][spender]; } /** * @dev See {IERC20-approve}. * * Requirements: * * - `spender` cannot be the zero address. */ function approve(address spender, uint256 amount) public virtual override returns (bool) { _approve(_msgSender(), spender, amount); return true; } /** * @dev See {IERC20-transferFrom}. * * Emits an {Approval} event indicating the updated allowance. This is not * required by the EIP. See the note at the beginning of {ERC20}. * * Requirements: * * - `sender` and `recipient` cannot be the zero address. * - `sender` must have a balance of at least `amount`. * - the caller must have allowance for ``sender``'s tokens of at least * `amount`. */ function transferFrom(address sender, address recipient, uint256 amount) public virtual override returns (bool) { _transfer(sender, recipient, amount); uint256 currentAllowance = _allowances[sender][_msgSender()]; require(currentAllowance >= amount, "ERC20: transfer amount exceeds allowance"); _approve(sender, _msgSender(), currentAllowance - amount); return true; } /** * @dev Atomically increases the allowance granted to `spender` by the caller. * * This is an alternative to {approve} that can be used as a mitigation for * problems described in {IERC20-approve}. * * Emits an {Approval} event indicating the updated allowance. * * Requirements: * * - `spender` cannot be the zero address. */ function increaseAllowance(address spender, uint256 addedValue) public virtual returns (bool) { _approve(_msgSender(), spender, _allowances[_msgSender()][spender] + addedValue); return true; } /** * @dev Atomically decreases the allowance granted to `spender` by the caller. * * This is an alternative to {approve} that can be used as a mitigation for * problems described in {IERC20-approve}. * * Emits an {Approval} event indicating the updated allowance. * * Requirements: * * - `spender` cannot be the zero address. * - `spender` must have allowance for the caller of at least * `subtractedValue`. */ function decreaseAllowance(address spender, uint256 subtractedValue) public virtual returns (bool) { uint256 currentAllowance = _allowances[_msgSender()][spender]; require(currentAllowance >= subtractedValue, "ERC20: decreased allowance below zero"); _approve(_msgSender(), spender, currentAllowance - subtractedValue); return true; } /** * @dev Moves tokens `amount` from `sender` to `recipient`. * * This is internal function is equivalent to {transfer}, and can be used to * e.g. implement automatic token fees, slashing mechanisms, etc. * * Emits a {Transfer} event. * * Requirements: * * - `sender` cannot be the zero address. * - `recipient` cannot be the zero address. * - `sender` must have a balance of at least `amount`. */ function _transfer(address sender, address recipient, uint256 amount) internal virtual { require(sender != address(0), "ERC20: transfer from the zero address"); require(recipient != address(0), "ERC20: transfer to the zero address"); _beforeTokenTransfer(sender, recipient, amount); uint256 senderBalance = _balances[sender]; require(senderBalance >= amount, "ERC20: transfer amount exceeds balance"); _balances[sender] = senderBalance - amount; _balances[recipient] += amount; emit Transfer(sender, recipient, amount); } /** @dev Creates `amount` tokens and assigns them to `account`, increasing * the total supply. * * Emits a {Transfer} event with `from` set to the zero address. * * Requirements: * * - `to` cannot be the zero address. */ function _mint(address account, uint256 amount) internal virtual { require(account != address(0), "ERC20: mint to the zero address"); _beforeTokenTransfer(address(0), account, amount); _totalSupply += amount; _balances[account] += amount; emit Transfer(address(0), account, amount); } /** * @dev Destroys `amount` tokens from `account`, reducing the * total supply. * * Emits a {Transfer} event with `to` set to the zero address. * * Requirements: * * - `account` cannot be the zero address. * - `account` must have at least `amount` tokens. */ function _burn(address account, uint256 amount) internal virtual { require(account != address(0), "ERC20: burn from the zero address"); _beforeTokenTransfer(account, address(0), amount); uint256 accountBalance = _balances[account]; require(accountBalance >= amount, "ERC20: burn amount exceeds balance"); _balances[account] = accountBalance - amount; _totalSupply -= amount; emit Transfer(account, address(0), amount); } /** * @dev Sets `amount` as the allowance of `spender` over the `owner` s tokens. * * This internal function is equivalent to `approve`, and can be used to * e.g. set automatic allowances for certain subsystems, etc. * * Emits an {Approval} event. * * Requirements: * * - `owner` cannot be the zero address. * - `spender` cannot be the zero address. */ function _approve(address owner, address spender, uint256 amount) internal virtual { require(owner != address(0), "ERC20: approve from the zero address"); require(spender != address(0), "ERC20: approve to the zero address"); _allowances[owner][spender] = amount; emit Approval(owner, spender, amount); } /** * @dev Hook that is called before any transfer of tokens. This includes * minting and burning. * * Calling conditions: * * - when `from` and `to` are both non-zero, `amount` of ``from``'s tokens * will be to transferred to `to`. * - when `from` is zero, `amount` tokens will be minted for `to`. * - when `to` is zero, `amount` of ``from``'s tokens will be burned. * - `from` and `to` are never both zero. * * To learn more about hooks, head to xref:ROOT:extending-contracts.adoc#using-hooks[Using Hooks]. */ function _beforeTokenTransfer(address from, address to, uint256 amount) internal virtual { } } // Part: ControllerInterface interface ControllerInterface { function mint(address to, uint amount) external returns (bool); function burn(uint value) external returns (bool); function isCustodian(address addr) external view returns (bool); function isBroker(address addr) external view returns (bool); function getToken() external view returns (ERC20); } // File: Bridge.sol contract Bridge is Ownable { enum RequestStatus {PENDING, CANCELED, APPROVED, REJECTED} struct Request { address requester; // sender of the request. uint amount; // amount of token to mint/burn. string depositAddress; // custodian's asset address in mint, broker's asset address in burn. string txid; // asset txid for sending/redeeming asset in the mint/burn process. uint nonce; // serial number allocated for each request. uint timestamp; // time of the request creation. RequestStatus status; // status of the request. } ControllerInterface public controller; // mapping between broker to the corresponding custodian deposit address, used in the minting process. // by using a different deposit address per broker the custodian can identify which broker deposited. mapping(address=>string) public custodianDepositAddress; // mapping between broker to the its deposit address where the asset should be moved to, used in the burning process. mapping(address=>string) public brokerDepositAddress; // mapping between a mint request hash and the corresponding request nonce. mapping(bytes32=>uint) public mintRequestNonce; // mapping between a burn request hash and the corresponding request nonce. mapping(bytes32=>uint) public burnRequestNonce; Request[] public mintRequests; Request[] public burnRequests; constructor(address _controller) { require(_controller != address(0), "invalid _controller address"); controller = ControllerInterface(_controller); transferOwnership(_controller); } modifier onlyBroker() { require(controller.isBroker(msg.sender), "sender not a broker."); _; } modifier onlyCustodian() { require(controller.isCustodian(msg.sender), "sender not a custodian."); _; } event CustodianDepositAddressSet(address indexed broker, address indexed sender, string depositAddress); function setCustodianDepositAddress( address broker, string memory depositAddress ) external onlyCustodian returns (bool) { require(broker != address(0), "invalid broker address"); require(controller.isBroker(broker), "broker address is not a real broker."); require(!isEmptyString(depositAddress), "invalid asset deposit address"); custodianDepositAddress[broker] = depositAddress; emit CustodianDepositAddressSet(broker, msg.sender, depositAddress); return true; } event BrokerDepositAddressSet(address indexed broker, string depositAddress); function setBrokerDepositAddress(string memory depositAddress) external onlyBroker returns (bool) { require(!isEmptyString(depositAddress), "invalid asset deposit address"); brokerDepositAddress[msg.sender] = depositAddress; emit BrokerDepositAddressSet(msg.sender, depositAddress); return true; } event MintRequestAdd( uint indexed nonce, address indexed requester, uint amount, string depositAddress, string txid, uint timestamp, bytes32 requestHash ); function addMintRequest( uint amount, string memory txid, string memory depositAddress ) external onlyBroker returns (bool) { require(!isEmptyString(depositAddress), "invalid asset deposit address"); require(compareStrings(depositAddress, custodianDepositAddress[msg.sender]), "wrong asset deposit address"); uint nonce = mintRequests.length; uint timestamp = getTimestamp(); Request memory request = Request({ requester: msg.sender, amount: amount, depositAddress: depositAddress, txid: txid, nonce: nonce, timestamp: timestamp, status: RequestStatus.PENDING }); bytes32 requestHash = calcRequestHash(request); mintRequestNonce[requestHash] = nonce; mintRequests.push(request); emit MintRequestAdd(nonce, msg.sender, amount, depositAddress, txid, timestamp, requestHash); return true; } event MintRequestCancel(uint indexed nonce, address indexed requester, bytes32 requestHash); function cancelMintRequest(bytes32 requestHash) external onlyBroker returns (bool) { uint nonce; Request memory request; (nonce, request) = getPendingMintRequest(requestHash); require(msg.sender == request.requester, "cancel sender is different than pending request initiator"); mintRequests[nonce].status = RequestStatus.CANCELED; emit MintRequestCancel(nonce, msg.sender, requestHash); return true; } event MintConfirmed( uint indexed nonce, address indexed requester, uint amount, string depositAddress, string txid, uint timestamp, bytes32 requestHash ); function confirmMintRequest(bytes32 requestHash) external onlyCustodian returns (bool) { uint nonce; Request memory request; (nonce, request) = getPendingMintRequest(requestHash); mintRequests[nonce].status = RequestStatus.APPROVED; require(controller.mint(request.requester, request.amount), "mint failed"); emit MintConfirmed( request.nonce, request.requester, request.amount, request.depositAddress, request.txid, request.timestamp, requestHash ); return true; } event MintRejected( uint indexed nonce, address indexed requester, uint amount, string depositAddress, string txid, uint timestamp, bytes32 requestHash ); function rejectMintRequest(bytes32 requestHash) external onlyCustodian returns (bool) { uint nonce; Request memory request; (nonce, request) = getPendingMintRequest(requestHash); mintRequests[nonce].status = RequestStatus.REJECTED; emit MintRejected( request.nonce, request.requester, request.amount, request.depositAddress, request.txid, request.timestamp, requestHash ); return true; } event Burned( uint indexed nonce, address indexed requester, uint amount, string depositAddress, uint timestamp, bytes32 requestHash ); function burn(uint amount) external onlyBroker returns (bool) { string memory depositAddress = brokerDepositAddress[msg.sender]; require(!isEmptyString(depositAddress), "broker asset deposit address was not set"); uint nonce = burnRequests.length; uint timestamp = getTimestamp(); // set txid as empty since it is not known yet. string memory txid = ""; Request memory request = Request({ requester: msg.sender, amount: amount, depositAddress: depositAddress, txid: txid, nonce: nonce, timestamp: timestamp, status: RequestStatus.PENDING }); bytes32 requestHash = calcRequestHash(request); burnRequestNonce[requestHash] = nonce; burnRequests.push(request); require(controller.getToken().transferFrom(msg.sender, address(controller), amount), "transfer tokens to burn failed"); require(controller.burn(amount), "burn failed"); emit Burned(nonce, msg.sender, amount, depositAddress, timestamp, requestHash); return true; } event BurnConfirmed( uint indexed nonce, address indexed requester, uint amount, string depositAddress, string txid, uint timestamp, bytes32 inputRequestHash ); function confirmBurnRequest(bytes32 requestHash, string memory txid) external onlyCustodian returns (bool) { uint nonce; Request memory request; (nonce, request) = getPendingBurnRequest(requestHash); burnRequests[nonce].txid = txid; burnRequests[nonce].status = RequestStatus.APPROVED; burnRequestNonce[calcRequestHash(burnRequests[nonce])] = nonce; emit BurnConfirmed( request.nonce, request.requester, request.amount, request.depositAddress, txid, request.timestamp, requestHash ); return true; } function getMintRequest(uint nonce) external view returns ( uint requestNonce, address requester, uint amount, string memory depositAddress, string memory txid, uint timestamp, string memory status, bytes32 requestHash ) { Request memory request = mintRequests[nonce]; string memory statusString = getStatusString(request.status); requestNonce = request.nonce; requester = request.requester; amount = request.amount; depositAddress = request.depositAddress; txid = request.txid; timestamp = request.timestamp; status = statusString; requestHash = calcRequestHash(request); } function getMintRequestsLength() external view returns (uint length) { return mintRequests.length; } function getBurnRequest(uint nonce) external view returns ( uint requestNonce, address requester, uint amount, string memory depositAddress, string memory txid, uint timestamp, string memory status, bytes32 requestHash ) { Request storage request = burnRequests[nonce]; string memory statusString = getStatusString(request.status); requestNonce = request.nonce; requester = request.requester; amount = request.amount; depositAddress = request.depositAddress; txid = request.txid; timestamp = request.timestamp; status = statusString; requestHash = calcRequestHash(request); } function getBurnRequestsLength() external view returns (uint length) { return burnRequests.length; } function getTimestamp() internal view returns (uint) { // timestamp is only used for data maintaining purpose, it is not relied on for critical logic. return block.timestamp; // solhint-disable-line not-rely-on-time } function getPendingMintRequest(bytes32 requestHash) internal view returns (uint nonce, Request memory request) { require(requestHash != 0, "request hash is 0"); nonce = mintRequestNonce[requestHash]; request = mintRequests[nonce]; validatePendingRequest(request, requestHash); } function getPendingBurnRequest(bytes32 requestHash) internal view returns (uint nonce, Request memory request) { require(requestHash != 0, "request hash is 0"); nonce = burnRequestNonce[requestHash]; request = burnRequests[nonce]; validatePendingRequest(request, requestHash); } function validatePendingRequest(Request memory request, bytes32 requestHash) internal pure { require(request.status == RequestStatus.PENDING, "request is not pending"); require(requestHash == calcRequestHash(request), "given request hash does not match a pending request"); } function calcRequestHash(Request memory request) internal pure returns (bytes32) { return keccak256(abi.encode( request.requester, request.amount, request.depositAddress, request.txid, request.nonce, request.timestamp )); } function compareStrings (string memory a, string memory b) internal pure returns (bool) { return (keccak256(abi.encodePacked(a)) == keccak256(abi.encodePacked(b))); } function isEmptyString (string memory a) internal pure returns (bool) { return (compareStrings(a, "")); } function getStatusString(RequestStatus status) internal pure returns (string memory) { if (status == RequestStatus.PENDING) { return "pending"; } else if (status == RequestStatus.CANCELED) { return "canceled"; } else if (status == RequestStatus.APPROVED) { return "approved"; } else if (status == RequestStatus.REJECTED) { return "rejected"; } else { // this fallback can never be reached. return "unknown"; } } }
Contract Security Audit
- No Contract Security Audit Submitted- Submit Audit Here
[{"inputs":[{"internalType":"address","name":"_controller","type":"address"}],"stateMutability":"nonpayable","type":"constructor"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"broker","type":"address"},{"indexed":false,"internalType":"string","name":"depositAddress","type":"string"}],"name":"BrokerDepositAddressSet","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"uint256","name":"nonce","type":"uint256"},{"indexed":true,"internalType":"address","name":"requester","type":"address"},{"indexed":false,"internalType":"uint256","name":"amount","type":"uint256"},{"indexed":false,"internalType":"string","name":"depositAddress","type":"string"},{"indexed":false,"internalType":"string","name":"txid","type":"string"},{"indexed":false,"internalType":"uint256","name":"timestamp","type":"uint256"},{"indexed":false,"internalType":"bytes32","name":"inputRequestHash","type":"bytes32"}],"name":"BurnConfirmed","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"uint256","name":"nonce","type":"uint256"},{"indexed":true,"internalType":"address","name":"requester","type":"address"},{"indexed":false,"internalType":"uint256","name":"amount","type":"uint256"},{"indexed":false,"internalType":"string","name":"depositAddress","type":"string"},{"indexed":false,"internalType":"uint256","name":"timestamp","type":"uint256"},{"indexed":false,"internalType":"bytes32","name":"requestHash","type":"bytes32"}],"name":"Burned","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"broker","type":"address"},{"indexed":true,"internalType":"address","name":"sender","type":"address"},{"indexed":false,"internalType":"string","name":"depositAddress","type":"string"}],"name":"CustodianDepositAddressSet","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"uint256","name":"nonce","type":"uint256"},{"indexed":true,"internalType":"address","name":"requester","type":"address"},{"indexed":false,"internalType":"uint256","name":"amount","type":"uint256"},{"indexed":false,"internalType":"string","name":"depositAddress","type":"string"},{"indexed":false,"internalType":"string","name":"txid","type":"string"},{"indexed":false,"internalType":"uint256","name":"timestamp","type":"uint256"},{"indexed":false,"internalType":"bytes32","name":"requestHash","type":"bytes32"}],"name":"MintConfirmed","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"uint256","name":"nonce","type":"uint256"},{"indexed":true,"internalType":"address","name":"requester","type":"address"},{"indexed":false,"internalType":"uint256","name":"amount","type":"uint256"},{"indexed":false,"internalType":"string","name":"depositAddress","type":"string"},{"indexed":false,"internalType":"string","name":"txid","type":"string"},{"indexed":false,"internalType":"uint256","name":"timestamp","type":"uint256"},{"indexed":false,"internalType":"bytes32","name":"requestHash","type":"bytes32"}],"name":"MintRejected","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"uint256","name":"nonce","type":"uint256"},{"indexed":true,"internalType":"address","name":"requester","type":"address"},{"indexed":false,"internalType":"uint256","name":"amount","type":"uint256"},{"indexed":false,"internalType":"string","name":"depositAddress","type":"string"},{"indexed":false,"internalType":"string","name":"txid","type":"string"},{"indexed":false,"internalType":"uint256","name":"timestamp","type":"uint256"},{"indexed":false,"internalType":"bytes32","name":"requestHash","type":"bytes32"}],"name":"MintRequestAdd","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"uint256","name":"nonce","type":"uint256"},{"indexed":true,"internalType":"address","name":"requester","type":"address"},{"indexed":false,"internalType":"bytes32","name":"requestHash","type":"bytes32"}],"name":"MintRequestCancel","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"previousOwner","type":"address"},{"indexed":true,"internalType":"address","name":"newOwner","type":"address"}],"name":"OwnershipTransferred","type":"event"},{"inputs":[{"internalType":"uint256","name":"amount","type":"uint256"},{"internalType":"string","name":"txid","type":"string"},{"internalType":"string","name":"depositAddress","type":"string"}],"name":"addMintRequest","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"","type":"address"}],"name":"brokerDepositAddress","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"amount","type":"uint256"}],"name":"burn","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bytes32","name":"","type":"bytes32"}],"name":"burnRequestNonce","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"","type":"uint256"}],"name":"burnRequests","outputs":[{"internalType":"address","name":"requester","type":"address"},{"internalType":"uint256","name":"amount","type":"uint256"},{"internalType":"string","name":"depositAddress","type":"string"},{"internalType":"string","name":"txid","type":"string"},{"internalType":"uint256","name":"nonce","type":"uint256"},{"internalType":"uint256","name":"timestamp","type":"uint256"},{"internalType":"enum Bridge.RequestStatus","name":"status","type":"uint8"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"bytes32","name":"requestHash","type":"bytes32"}],"name":"cancelMintRequest","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bytes32","name":"requestHash","type":"bytes32"},{"internalType":"string","name":"txid","type":"string"}],"name":"confirmBurnRequest","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bytes32","name":"requestHash","type":"bytes32"}],"name":"confirmMintRequest","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"controller","outputs":[{"internalType":"contract ControllerInterface","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"","type":"address"}],"name":"custodianDepositAddress","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"nonce","type":"uint256"}],"name":"getBurnRequest","outputs":[{"internalType":"uint256","name":"requestNonce","type":"uint256"},{"internalType":"address","name":"requester","type":"address"},{"internalType":"uint256","name":"amount","type":"uint256"},{"internalType":"string","name":"depositAddress","type":"string"},{"internalType":"string","name":"txid","type":"string"},{"internalType":"uint256","name":"timestamp","type":"uint256"},{"internalType":"string","name":"status","type":"string"},{"internalType":"bytes32","name":"requestHash","type":"bytes32"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"getBurnRequestsLength","outputs":[{"internalType":"uint256","name":"length","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"nonce","type":"uint256"}],"name":"getMintRequest","outputs":[{"internalType":"uint256","name":"requestNonce","type":"uint256"},{"internalType":"address","name":"requester","type":"address"},{"internalType":"uint256","name":"amount","type":"uint256"},{"internalType":"string","name":"depositAddress","type":"string"},{"internalType":"string","name":"txid","type":"string"},{"internalType":"uint256","name":"timestamp","type":"uint256"},{"internalType":"string","name":"status","type":"string"},{"internalType":"bytes32","name":"requestHash","type":"bytes32"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"getMintRequestsLength","outputs":[{"internalType":"uint256","name":"length","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"bytes32","name":"","type":"bytes32"}],"name":"mintRequestNonce","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"","type":"uint256"}],"name":"mintRequests","outputs":[{"internalType":"address","name":"requester","type":"address"},{"internalType":"uint256","name":"amount","type":"uint256"},{"internalType":"string","name":"depositAddress","type":"string"},{"internalType":"string","name":"txid","type":"string"},{"internalType":"uint256","name":"nonce","type":"uint256"},{"internalType":"uint256","name":"timestamp","type":"uint256"},{"internalType":"enum Bridge.RequestStatus","name":"status","type":"uint8"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"owner","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"bytes32","name":"requestHash","type":"bytes32"}],"name":"rejectMintRequest","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"renounceOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"string","name":"depositAddress","type":"string"}],"name":"setBrokerDepositAddress","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"broker","type":"address"},{"internalType":"string","name":"depositAddress","type":"string"}],"name":"setCustodianDepositAddress","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"newOwner","type":"address"}],"name":"transferOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"}]
Contract Creation Code
60806040523480156200001157600080fd5b506040516200302d3803806200302d8339810160408190526200003491620001fa565b600080546001600160a01b031916339081178255604051909182916000805160206200300d833981519152908290a3506001600160a01b038116620000c05760405162461bcd60e51b815260206004820152601b60248201527f696e76616c6964205f636f6e74726f6c6c65722061646472657373000000000060448201526064015b60405180910390fd5b600180546001600160a01b0319166001600160a01b038316179055620000e681620000ed565b506200022a565b6000546001600160a01b03163314620001495760405162461bcd60e51b815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e65726044820152606401620000b7565b6001600160a01b038116620001b05760405162461bcd60e51b815260206004820152602660248201527f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160448201526564647265737360d01b6064820152608401620000b7565b600080546040516001600160a01b03808516939216916000805160206200300d83398151915291a3600080546001600160a01b0319166001600160a01b0392909216919091179055565b6000602082840312156200020c578081fd5b81516001600160a01b038116811462000223578182fd5b9392505050565b612dd3806200023a6000396000f3fe608060405234801561001057600080fd5b50600436106101425760003560e01c80638da5cb5b116100b8578063c06e2d241161007c578063c06e2d24146102ce578063c632e4bc146102e1578063c72551be146102f4578063e21c40c014610314578063f2fde38b14610327578063f77c47911461033a57610142565b80638da5cb5b1461023c5780638e24a764146102615780639355f0a4146102745780639ad4b86b14610287578063b69b22d8146102a757610142565b80635c9adea71161010a5780635c9adea7146101de5780636406c10c146101f1578063715018a61461020457806372f69a721461020e57806373e6b0b814610216578063861f92a81461022957610142565b806314990ace146101475780632bf90baa14610170578063311104f314610193578063424e6575146101a557806342966c68146101cb575b600080fd5b61015a6101553660046128cb565b61034d565b6040516101679190612b73565b60405180910390f35b61018361017e36600461295c565b6103e7565b6040519015158152602001610167565b6006545b604051908152602001610167565b6101b86101b336600461295c565b61063b565b6040516101679796959493929190612afb565b6101836101d936600461295c565b6107a9565b61015a6101ec3660046128cb565b610d2b565b6101b86101ff36600461295c565b610d44565b61020c610d54565b005b600754610197565b6101836102243660046128ee565b610df8565b61018361023736600461295c565b611058565b6000546001600160a01b03165b6040516001600160a01b039091168152602001610167565b61018361026f3660046129fa565b6111c8565b610183610282366004612974565b611536565b61019761029536600461295c565b60046020526000908152604090205481565b6102ba6102b536600461295c565b611914565b604051610167989796959493929190612c22565b6101836102dc36600461295c565b611b75565b6101836102ef3660046129bf565b611d3b565b61019761030236600461295c565b60056020526000908152604090205481565b6102ba61032236600461295c565b611e63565b61020c6103353660046128cb565b612041565b600154610249906001600160a01b031681565b6002602052600090815260409020805461036690612d34565b80601f016020809104026020016040519081016040528092919081815260200182805461039290612d34565b80156103df5780601f106103b4576101008083540402835291602001916103df565b820191906000526020600020905b8154815290600101906020018083116103c257829003601f168201915b505050505081565b600154604051630d72032360e21b81523360048201526000916001600160a01b0316906335c80c8c9060240160206040518083038186803b15801561042b57600080fd5b505afa15801561043f573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610463919061293c565b6104885760405162461bcd60e51b815260040161047f90612beb565b60405180910390fd5b6000610492612747565b61049b8461215b565b80925081935050506002600683815481106104c657634e487b7160e01b600052603260045260246000fd5b60009182526020909120600660079092020101805460ff1916600183600381111561050157634e487b7160e01b600052602160045260246000fd5b0217905550600154815160208301516040516340c10f1960e01b81526001600160a01b03928316600482015260248101919091529116906340c10f1990604401602060405180830381600087803b15801561055b57600080fd5b505af115801561056f573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610593919061293c565b6105cd5760405162461bcd60e51b815260206004820152600b60248201526a1b5a5b9d0819985a5b195960aa1b604482015260640161047f565b80600001516001600160a01b031681608001517f051f4ba27061b0e6dc829669a7baa8bba9cf7f6cd2f95e1f0bdd9c22126d8b218360200151846040015185606001518660a001518a604051610627959493929190612c98565b60405180910390a36001925050505b919050565b6006818154811061064b57600080fd5b60009182526020909120600790910201805460018201546002830180546001600160a01b03909316945090929161068190612d34565b80601f01602080910402602001604051908101604052809291908181526020018280546106ad90612d34565b80156106fa5780601f106106cf576101008083540402835291602001916106fa565b820191906000526020600020905b8154815290600101906020018083116106dd57829003601f168201915b50505050509080600301805461070f90612d34565b80601f016020809104026020016040519081016040528092919081815260200182805461073b90612d34565b80156107885780601f1061075d57610100808354040283529160200191610788565b820191906000526020600020905b81548152906001019060200180831161076b57829003601f168201915b50505050600483015460058401546006909401549293909290915060ff1687565b6001546040516322b31d9f60e01b81523360048201526000916001600160a01b0316906322b31d9f9060240160206040518083038186803b1580156107ed57600080fd5b505afa158015610801573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610825919061293c565b6108415760405162461bcd60e51b815260040161047f90612bbd565b336000908152600360205260408120805461085b90612d34565b80601f016020809104026020016040519081016040528092919081815260200182805461088790612d34565b80156108d45780601f106108a9576101008083540402835291602001916108d4565b820191906000526020600020905b8154815290600101906020018083116108b757829003601f168201915b505050505090506108e4816123c4565b156109425760405162461bcd60e51b815260206004820152602860248201527f62726f6b6572206173736574206465706f736974206164647265737320776173604482015267081b9bdd081cd95d60c21b606482015260840161047f565b60075460408051602080820183526000808352835160e08101855233815291820188905292810185905260608101829052608081018490524260a0820181905260c0820184905292610993826123e5565b60008181526005602090815260408083208990556007805460018101825593819052865193027fa66cc928b5edb82af9bd49922954155ab7b0942694bea4ce44661d9a8736c688810180546001600160a01b039095166001600160a01b0319909516949094178455868301517fa66cc928b5edb82af9bd49922954155ab7b0942694bea4ce44661d9a8736c6898201559086015180519495508694610a61937fa66cc928b5edb82af9bd49922954155ab7b0942694bea4ce44661d9a8736c68a9093019291909101906127ab565b5060608201518051610a7d9160038401916020909101906127ab565b506080820151600482015560a0820151600582015560c082015160068201805460ff19166001836003811115610ac357634e487b7160e01b600052602160045260246000fd5b021790555050600154604080516321df0da760e01b815290516001600160a01b0390921692506321df0da7916004808301926020929190829003018186803b158015610b0e57600080fd5b505afa158015610b22573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610b4691906129a3565b6001546040516323b872dd60e01b81523360048201526001600160a01b039182166024820152604481018b90529116906323b872dd90606401602060405180830381600087803b158015610b9957600080fd5b505af1158015610bad573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610bd1919061293c565b610c1d5760405162461bcd60e51b815260206004820152601e60248201527f7472616e7366657220746f6b656e7320746f206275726e206661696c65640000604482015260640161047f565b600154604051630852cd8d60e31b8152600481018a90526001600160a01b03909116906342966c6890602401602060405180830381600087803b158015610c6357600080fd5b505af1158015610c77573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610c9b919061293c565b610cd55760405162461bcd60e51b815260206004820152600b60248201526a189d5c9b8819985a5b195960aa1b604482015260640161047f565b336001600160a01b0316857f865e64c3fa22a0daee479fc02875d3e97d581930b9679232344d4d5dcce6a7b28a898886604051610d159493929190612cd8565b60405180910390a3506001979650505050505050565b6003602052600090815260409020805461036690612d34565b6007818154811061064b57600080fd5b6000546001600160a01b03163314610dae5760405162461bcd60e51b815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572604482015260640161047f565b600080546040516001600160a01b03909116907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e0908390a3600080546001600160a01b0319169055565b600154604051630d72032360e21b81523360048201526000916001600160a01b0316906335c80c8c9060240160206040518083038186803b158015610e3c57600080fd5b505afa158015610e50573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610e74919061293c565b610e905760405162461bcd60e51b815260040161047f90612beb565b6001600160a01b038316610edf5760405162461bcd60e51b8152602060048201526016602482015275696e76616c69642062726f6b6572206164647265737360501b604482015260640161047f565b6001546040516322b31d9f60e01b81526001600160a01b038581166004830152909116906322b31d9f9060240160206040518083038186803b158015610f2457600080fd5b505afa158015610f38573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610f5c919061293c565b610fb45760405162461bcd60e51b8152602060048201526024808201527f62726f6b65722061646472657373206973206e6f742061207265616c2062726f60448201526335b2b91760e11b606482015260840161047f565b610fbd826123c4565b15610fda5760405162461bcd60e51b815260040161047f90612b86565b6001600160a01b03831660009081526002602090815260409091208351611003928501906127ab565b50336001600160a01b0316836001600160a01b03167f889518f7687592efeb6e775822956ccb4e2a41cfb5bab0438d634523ccf6336d846040516110479190612b73565b60405180910390a350600192915050565b600154604051630d72032360e21b81523360048201526000916001600160a01b0316906335c80c8c9060240160206040518083038186803b15801561109c57600080fd5b505afa1580156110b0573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906110d4919061293c565b6110f05760405162461bcd60e51b815260040161047f90612beb565b60006110fa612747565b6111038461215b565b809250819350505060036006838154811061112e57634e487b7160e01b600052603260045260246000fd5b60009182526020909120600660079092020101805460ff1916600183600381111561116957634e487b7160e01b600052602160045260246000fd5b021790555080600001516001600160a01b031681608001517fdadc06f5b98131083e96b856c044184efd23ae2e797a876fd80aa5dae4f724558360200151846040015185606001518660a001518a604051610627959493929190612c98565b6001546040516322b31d9f60e01b81523360048201526000916001600160a01b0316906322b31d9f9060240160206040518083038186803b15801561120c57600080fd5b505afa158015611220573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611244919061293c565b6112605760405162461bcd60e51b815260040161047f90612bbd565b611269826123c4565b156112865760405162461bcd60e51b815260040161047f90612b86565b33600090815260026020526040902080546113299184916112a690612d34565b80601f01602080910402602001604051908101604052809291908181526020018280546112d290612d34565b801561131f5780601f106112f45761010080835404028352916020019161131f565b820191906000526020600020905b81548152906001019060200180831161130257829003601f168201915b5050505050612432565b6113755760405162461bcd60e51b815260206004820152601b60248201527f77726f6e67206173736574206465706f73697420616464726573730000000000604482015260640161047f565b6006546040805160e0810182523381526020810187905290810184905260608101859052608081018290524260a08201819052600060c083018190529091906113bd826123e5565b600081815260046020908152604080832088905560068054600181018255935285517ff652222313e28459528d920b65115c16c04f3efc82aaedc97be59f3f377c0d3f600790940293840180546001600160a01b0319166001600160a01b03909216919091178155868301517ff652222313e28459528d920b65115c16c04f3efc82aaedc97be59f3f377c0d408501559086015180519495508694919361148b937ff652222313e28459528d920b65115c16c04f3efc82aaedc97be59f3f377c0d41909101929101906127ab565b50606082015180516114a79160038401916020909101906127ab565b506080820151600482015560a0820151600582015560c082015160068201805460ff191660018360038111156114ed57634e487b7160e01b600052602160045260246000fd5b02179055505050336001600160a01b0316847f09e00024b3e14e42d4e78c05bf370a34c2e4ce4027dad38abafdb1bf49da432f8a898b8887604051610d15959493929190612c98565b600154604051630d72032360e21b81523360048201526000916001600160a01b0316906335c80c8c9060240160206040518083038186803b15801561157a57600080fd5b505afa15801561158e573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906115b2919061293c565b6115ce5760405162461bcd60e51b815260040161047f90612beb565b60006115d8612747565b6115e18561248b565b8092508193505050836007838154811061160b57634e487b7160e01b600052603260045260246000fd5b9060005260206000209060070201600301908051906020019061162f9291906127ab565b5060026007838154811061165357634e487b7160e01b600052603260045260246000fd5b60009182526020909120600660079092020101805460ff1916600183600381111561168e57634e487b7160e01b600052602160045260246000fd5b02179055508160056000611899600786815481106116bc57634e487b7160e01b600052603260045260246000fd5b90600052602060002090600702016040518060e00160405290816000820160009054906101000a90046001600160a01b03166001600160a01b03166001600160a01b031681526020016001820154815260200160028201805461171e90612d34565b80601f016020809104026020016040519081016040528092919081815260200182805461174a90612d34565b80156117975780601f1061176c57610100808354040283529160200191611797565b820191906000526020600020905b81548152906001019060200180831161177a57829003601f168201915b505050505081526020016003820180546117b090612d34565b80601f01602080910402602001604051908101604052809291908181526020018280546117dc90612d34565b80156118295780601f106117fe57610100808354040283529160200191611829565b820191906000526020600020905b81548152906001019060200180831161180c57829003601f168201915b50505091835250506004820154602082015260058201546040820152600682015460609091019060ff16600381111561187257634e487b7160e01b600052602160045260246000fd5b600381111561189157634e487b7160e01b600052602160045260246000fd5b9052506123e5565b81526020019081526020016000208190555080600001516001600160a01b031681608001517f1949e77206780c38f7c6487c926f8a51280fcdbf63397a01a3428dbfccd2b09f83602001518460400151888660a001518b604051611901959493929190612c98565b60405180910390a3506001949350505050565b60008060006060806000606060008060068a8154811061194457634e487b7160e01b600052603260045260246000fd5b90600052602060002090600702016040518060e00160405290816000820160009054906101000a90046001600160a01b03166001600160a01b03166001600160a01b03168152602001600182015481526020016002820180546119a690612d34565b80601f01602080910402602001604051908101604052809291908181526020018280546119d290612d34565b8015611a1f5780601f106119f457610100808354040283529160200191611a1f565b820191906000526020600020905b815481529060010190602001808311611a0257829003601f168201915b50505050508152602001600382018054611a3890612d34565b80601f0160208091040260200160405190810160405280929190818152602001828054611a6490612d34565b8015611ab15780601f10611a8657610100808354040283529160200191611ab1565b820191906000526020600020905b815481529060010190602001808311611a9457829003601f168201915b50505091835250506004820154602082015260058201546040820152600682015460609091019060ff166003811115611afa57634e487b7160e01b600052602160045260246000fd5b6003811115611b1957634e487b7160e01b600052602160045260246000fd5b8152505090506000611b2e8260c0015161250b565b905081608001519950816000015198508160200151975081604001519650816060015195508160a001519450809350611b66826123e5565b92505050919395975091939597565b6001546040516322b31d9f60e01b81523360048201526000916001600160a01b0316906322b31d9f9060240160206040518083038186803b158015611bb957600080fd5b505afa158015611bcd573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611bf1919061293c565b611c0d5760405162461bcd60e51b815260040161047f90612bbd565b6000611c17612747565b611c208461215b565b805191935091506001600160a01b03163314611ca45760405162461bcd60e51b815260206004820152603960248201527f63616e63656c2073656e64657220697320646966666572656e74207468616e2060448201527f70656e64696e67207265717565737420696e69746961746f7200000000000000606482015260840161047f565b600160068381548110611cc757634e487b7160e01b600052603260045260246000fd5b60009182526020909120600660079092020101805460ff19166001836003811115611d0257634e487b7160e01b600052602160045260246000fd5b0217905550604051848152339083907fb419f275eebfa354bbab2709955ee0c0e25ca95fae50a8e3672c5e3d9c931f5890602001610627565b6001546040516322b31d9f60e01b81523360048201526000916001600160a01b0316906322b31d9f9060240160206040518083038186803b158015611d7f57600080fd5b505afa158015611d93573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611db7919061293c565b611dd35760405162461bcd60e51b815260040161047f90612bbd565b611ddc826123c4565b15611df95760405162461bcd60e51b815260040161047f90612b86565b3360009081526003602090815260409091208351611e19928501906127ab565b50336001600160a01b03167fd4bf22af0d62666e8b980f7e5a35e41f5b3fe0fe17917ec781288c9da27ca21f83604051611e539190612b73565b60405180910390a2506001919050565b60008060006060806000606060008060078a81548110611e9357634e487b7160e01b600052603260045260246000fd5b600091825260208220600660079092020190810154909250611eb79060ff1661250b565b600483015483546001850154600286018054939e506001600160a01b039092169c509a50919250611ee790612d34565b80601f0160208091040260200160405190810160405280929190818152602001828054611f1390612d34565b8015611f605780601f10611f3557610100808354040283529160200191611f60565b820191906000526020600020905b815481529060010190602001808311611f4357829003601f168201915b50505050509650816003018054611f7690612d34565b80601f0160208091040260200160405190810160405280929190818152602001828054611fa290612d34565b8015611fef5780601f10611fc457610100808354040283529160200191611fef565b820191906000526020600020905b815481529060010190602001808311611fd257829003601f168201915b50505060058501546040805160e08101825287546001600160a01b0316815260018801546020820152600288018054969c50929a509598508895611b6695909450879350908401919061171e90612d34565b6000546001600160a01b0316331461209b5760405162461bcd60e51b815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572604482015260640161047f565b6001600160a01b0381166121005760405162461bcd60e51b815260206004820152602660248201527f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160448201526564647265737360d01b606482015260840161047f565b600080546040516001600160a01b03808516939216917f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e091a3600080546001600160a01b0319166001600160a01b0392909216919091179055565b6000612165612747565b826121a65760405162461bcd60e51b81526020600482015260116024820152700726571756573742068617368206973203607c1b604482015260640161047f565b6000838152600460205260409020546006805491935090839081106121db57634e487b7160e01b600052603260045260246000fd5b90600052602060002090600702016040518060e00160405290816000820160009054906101000a90046001600160a01b03166001600160a01b03166001600160a01b031681526020016001820154815260200160028201805461223d90612d34565b80601f016020809104026020016040519081016040528092919081815260200182805461226990612d34565b80156122b65780601f1061228b576101008083540402835291602001916122b6565b820191906000526020600020905b81548152906001019060200180831161229957829003601f168201915b505050505081526020016003820180546122cf90612d34565b80601f01602080910402602001604051908101604052809291908181526020018280546122fb90612d34565b80156123485780601f1061231d57610100808354040283529160200191612348565b820191906000526020600020905b81548152906001019060200180831161232b57829003601f168201915b50505091835250506004820154602082015260058201546040820152600682015460609091019060ff16600381111561239157634e487b7160e01b600052602160045260246000fd5b60038111156123b057634e487b7160e01b600052602160045260246000fd5b90525090506123bf8184612664565b915091565b60006123df8260405180602001604052806000815250612432565b92915050565b80516020808301516040808501516060860151608087015160a08801519351600097612415979096959101612aac565b604051602081830303815290604052805190602001209050919050565b6000816040516020016124459190612a90565b604051602081830303815290604052805190602001208360405160200161246c9190612a90565b6040516020818303038152906040528051906020012014905092915050565b6000612495612747565b826124d65760405162461bcd60e51b81526020600482015260116024820152700726571756573742068617368206973203607c1b604482015260640161047f565b6000838152600560205260409020546007805491935090839081106121db57634e487b7160e01b600052603260045260246000fd5b6060600082600381111561252f57634e487b7160e01b600052602160045260246000fd5b1415612559575060408051808201909152600781526670656e64696e6760c81b6020820152610636565b600182600381111561257b57634e487b7160e01b600052602160045260246000fd5b14156125a6575060408051808201909152600881526718d85b98d95b195960c21b6020820152610636565b60028260038111156125c857634e487b7160e01b600052602160045260246000fd5b14156125f35750604080518082019091526008815267185c1c1c9bdd995960c21b6020820152610636565b600382600381111561261557634e487b7160e01b600052602160045260246000fd5b141561264057506040805180820190915260088152671c995a9958dd195960c21b6020820152610636565b506040805180820190915260078152663ab735b737bbb760c91b6020820152610636565b60008260c00151600381111561268a57634e487b7160e01b600052602160045260246000fd5b146126d05760405162461bcd60e51b815260206004820152601660248201527572657175657374206973206e6f742070656e64696e6760501b604482015260640161047f565b6126d9826123e5565b81146127435760405162461bcd60e51b815260206004820152603360248201527f676976656e2072657175657374206861736820646f6573206e6f74206d6174636044820152721a0818481c195b991a5b99c81c995c5d595cdd606a1b606482015260840161047f565b5050565b6040518060e0016040528060006001600160a01b031681526020016000815260200160608152602001606081526020016000815260200160008152602001600060038111156127a657634e487b7160e01b600052602160045260246000fd5b905290565b8280546127b790612d34565b90600052602060002090601f0160209004810192826127d9576000855561281f565b82601f106127f257805160ff191683800117855561281f565b8280016001018555821561281f579182015b8281111561281f578251825591602001919060010190612804565b5061282b92915061282f565b5090565b5b8082111561282b5760008155600101612830565b600082601f830112612854578081fd5b813567ffffffffffffffff8082111561286f5761286f612d6f565b604051601f8301601f19908116603f0116810190828211818310171561289757612897612d6f565b816040528381528660208588010111156128af578485fd5b8360208701602083013792830160200193909352509392505050565b6000602082840312156128dc578081fd5b81356128e781612d85565b9392505050565b60008060408385031215612900578081fd5b823561290b81612d85565b9150602083013567ffffffffffffffff811115612926578182fd5b61293285828601612844565b9150509250929050565b60006020828403121561294d578081fd5b815180151581146128e7578182fd5b60006020828403121561296d578081fd5b5035919050565b60008060408385031215612986578182fd5b82359150602083013567ffffffffffffffff811115612926578182fd5b6000602082840312156129b4578081fd5b81516128e781612d85565b6000602082840312156129d0578081fd5b813567ffffffffffffffff8111156129e6578182fd5b6129f284828501612844565b949350505050565b600080600060608486031215612a0e578081fd5b83359250602084013567ffffffffffffffff80821115612a2c578283fd5b612a3887838801612844565b93506040860135915080821115612a4d578283fd5b50612a5a86828701612844565b9150509250925092565b60008151808452612a7c816020860160208601612d04565b601f01601f19169290920160200192915050565b60008251612aa2818460208701612d04565b9190910192915050565b600060018060a01b038816825286602083015260c06040830152612ad360c0830187612a64565b8281036060840152612ae58187612a64565b6080840195909552505060a00152949350505050565b600060018060a01b038916825287602083015260e06040830152612b2260e0830188612a64565b8281036060840152612b348188612a64565b9150508460808301528360a083015260048310612b6157634e487b7160e01b600052602160045260246000fd5b8260c083015298975050505050505050565b6000602082526128e76020830184612a64565b6020808252601d908201527f696e76616c6964206173736574206465706f7369742061646472657373000000604082015260600190565b60208082526014908201527339b2b73232b9103737ba103090313937b5b2b91760611b604082015260600190565b60208082526017908201527f73656e646572206e6f74206120637573746f6469616e2e000000000000000000604082015260600190565b8881526001600160a01b03881660208201526040810187905261010060608201819052600090612c5483820189612a64565b90508281036080840152612c688188612a64565b90508560a084015282810360c0840152612c828186612a64565b9150508260e08301529998505050505050505050565b600086825260a06020830152612cb160a0830187612a64565b8281036040840152612cc38187612a64565b60608401959095525050608001529392505050565b600085825260806020830152612cf16080830186612a64565b6040830194909452506060015292915050565b60005b83811015612d1f578181015183820152602001612d07565b83811115612d2e576000848401525b50505050565b600181811c90821680612d4857607f821691505b60208210811415612d6957634e487b7160e01b600052602260045260246000fd5b50919050565b634e487b7160e01b600052604160045260246000fd5b6001600160a01b0381168114612d9a57600080fd5b5056fea2646970667358221220a47959ccc5c8f4f69c3c1547d89e5503f7e753a707508575440b94f688dc06c264736f6c634300080300338be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e000000000000000000000000064ee1a675942bd995dc0b1f89229222bc4ccbdc3
Deployed Bytecode
0x608060405234801561001057600080fd5b50600436106101425760003560e01c80638da5cb5b116100b8578063c06e2d241161007c578063c06e2d24146102ce578063c632e4bc146102e1578063c72551be146102f4578063e21c40c014610314578063f2fde38b14610327578063f77c47911461033a57610142565b80638da5cb5b1461023c5780638e24a764146102615780639355f0a4146102745780639ad4b86b14610287578063b69b22d8146102a757610142565b80635c9adea71161010a5780635c9adea7146101de5780636406c10c146101f1578063715018a61461020457806372f69a721461020e57806373e6b0b814610216578063861f92a81461022957610142565b806314990ace146101475780632bf90baa14610170578063311104f314610193578063424e6575146101a557806342966c68146101cb575b600080fd5b61015a6101553660046128cb565b61034d565b6040516101679190612b73565b60405180910390f35b61018361017e36600461295c565b6103e7565b6040519015158152602001610167565b6006545b604051908152602001610167565b6101b86101b336600461295c565b61063b565b6040516101679796959493929190612afb565b6101836101d936600461295c565b6107a9565b61015a6101ec3660046128cb565b610d2b565b6101b86101ff36600461295c565b610d44565b61020c610d54565b005b600754610197565b6101836102243660046128ee565b610df8565b61018361023736600461295c565b611058565b6000546001600160a01b03165b6040516001600160a01b039091168152602001610167565b61018361026f3660046129fa565b6111c8565b610183610282366004612974565b611536565b61019761029536600461295c565b60046020526000908152604090205481565b6102ba6102b536600461295c565b611914565b604051610167989796959493929190612c22565b6101836102dc36600461295c565b611b75565b6101836102ef3660046129bf565b611d3b565b61019761030236600461295c565b60056020526000908152604090205481565b6102ba61032236600461295c565b611e63565b61020c6103353660046128cb565b612041565b600154610249906001600160a01b031681565b6002602052600090815260409020805461036690612d34565b80601f016020809104026020016040519081016040528092919081815260200182805461039290612d34565b80156103df5780601f106103b4576101008083540402835291602001916103df565b820191906000526020600020905b8154815290600101906020018083116103c257829003601f168201915b505050505081565b600154604051630d72032360e21b81523360048201526000916001600160a01b0316906335c80c8c9060240160206040518083038186803b15801561042b57600080fd5b505afa15801561043f573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610463919061293c565b6104885760405162461bcd60e51b815260040161047f90612beb565b60405180910390fd5b6000610492612747565b61049b8461215b565b80925081935050506002600683815481106104c657634e487b7160e01b600052603260045260246000fd5b60009182526020909120600660079092020101805460ff1916600183600381111561050157634e487b7160e01b600052602160045260246000fd5b0217905550600154815160208301516040516340c10f1960e01b81526001600160a01b03928316600482015260248101919091529116906340c10f1990604401602060405180830381600087803b15801561055b57600080fd5b505af115801561056f573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610593919061293c565b6105cd5760405162461bcd60e51b815260206004820152600b60248201526a1b5a5b9d0819985a5b195960aa1b604482015260640161047f565b80600001516001600160a01b031681608001517f051f4ba27061b0e6dc829669a7baa8bba9cf7f6cd2f95e1f0bdd9c22126d8b218360200151846040015185606001518660a001518a604051610627959493929190612c98565b60405180910390a36001925050505b919050565b6006818154811061064b57600080fd5b60009182526020909120600790910201805460018201546002830180546001600160a01b03909316945090929161068190612d34565b80601f01602080910402602001604051908101604052809291908181526020018280546106ad90612d34565b80156106fa5780601f106106cf576101008083540402835291602001916106fa565b820191906000526020600020905b8154815290600101906020018083116106dd57829003601f168201915b50505050509080600301805461070f90612d34565b80601f016020809104026020016040519081016040528092919081815260200182805461073b90612d34565b80156107885780601f1061075d57610100808354040283529160200191610788565b820191906000526020600020905b81548152906001019060200180831161076b57829003601f168201915b50505050600483015460058401546006909401549293909290915060ff1687565b6001546040516322b31d9f60e01b81523360048201526000916001600160a01b0316906322b31d9f9060240160206040518083038186803b1580156107ed57600080fd5b505afa158015610801573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610825919061293c565b6108415760405162461bcd60e51b815260040161047f90612bbd565b336000908152600360205260408120805461085b90612d34565b80601f016020809104026020016040519081016040528092919081815260200182805461088790612d34565b80156108d45780601f106108a9576101008083540402835291602001916108d4565b820191906000526020600020905b8154815290600101906020018083116108b757829003601f168201915b505050505090506108e4816123c4565b156109425760405162461bcd60e51b815260206004820152602860248201527f62726f6b6572206173736574206465706f736974206164647265737320776173604482015267081b9bdd081cd95d60c21b606482015260840161047f565b60075460408051602080820183526000808352835160e08101855233815291820188905292810185905260608101829052608081018490524260a0820181905260c0820184905292610993826123e5565b60008181526005602090815260408083208990556007805460018101825593819052865193027fa66cc928b5edb82af9bd49922954155ab7b0942694bea4ce44661d9a8736c688810180546001600160a01b039095166001600160a01b0319909516949094178455868301517fa66cc928b5edb82af9bd49922954155ab7b0942694bea4ce44661d9a8736c6898201559086015180519495508694610a61937fa66cc928b5edb82af9bd49922954155ab7b0942694bea4ce44661d9a8736c68a9093019291909101906127ab565b5060608201518051610a7d9160038401916020909101906127ab565b506080820151600482015560a0820151600582015560c082015160068201805460ff19166001836003811115610ac357634e487b7160e01b600052602160045260246000fd5b021790555050600154604080516321df0da760e01b815290516001600160a01b0390921692506321df0da7916004808301926020929190829003018186803b158015610b0e57600080fd5b505afa158015610b22573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610b4691906129a3565b6001546040516323b872dd60e01b81523360048201526001600160a01b039182166024820152604481018b90529116906323b872dd90606401602060405180830381600087803b158015610b9957600080fd5b505af1158015610bad573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610bd1919061293c565b610c1d5760405162461bcd60e51b815260206004820152601e60248201527f7472616e7366657220746f6b656e7320746f206275726e206661696c65640000604482015260640161047f565b600154604051630852cd8d60e31b8152600481018a90526001600160a01b03909116906342966c6890602401602060405180830381600087803b158015610c6357600080fd5b505af1158015610c77573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610c9b919061293c565b610cd55760405162461bcd60e51b815260206004820152600b60248201526a189d5c9b8819985a5b195960aa1b604482015260640161047f565b336001600160a01b0316857f865e64c3fa22a0daee479fc02875d3e97d581930b9679232344d4d5dcce6a7b28a898886604051610d159493929190612cd8565b60405180910390a3506001979650505050505050565b6003602052600090815260409020805461036690612d34565b6007818154811061064b57600080fd5b6000546001600160a01b03163314610dae5760405162461bcd60e51b815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572604482015260640161047f565b600080546040516001600160a01b03909116907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e0908390a3600080546001600160a01b0319169055565b600154604051630d72032360e21b81523360048201526000916001600160a01b0316906335c80c8c9060240160206040518083038186803b158015610e3c57600080fd5b505afa158015610e50573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610e74919061293c565b610e905760405162461bcd60e51b815260040161047f90612beb565b6001600160a01b038316610edf5760405162461bcd60e51b8152602060048201526016602482015275696e76616c69642062726f6b6572206164647265737360501b604482015260640161047f565b6001546040516322b31d9f60e01b81526001600160a01b038581166004830152909116906322b31d9f9060240160206040518083038186803b158015610f2457600080fd5b505afa158015610f38573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610f5c919061293c565b610fb45760405162461bcd60e51b8152602060048201526024808201527f62726f6b65722061646472657373206973206e6f742061207265616c2062726f60448201526335b2b91760e11b606482015260840161047f565b610fbd826123c4565b15610fda5760405162461bcd60e51b815260040161047f90612b86565b6001600160a01b03831660009081526002602090815260409091208351611003928501906127ab565b50336001600160a01b0316836001600160a01b03167f889518f7687592efeb6e775822956ccb4e2a41cfb5bab0438d634523ccf6336d846040516110479190612b73565b60405180910390a350600192915050565b600154604051630d72032360e21b81523360048201526000916001600160a01b0316906335c80c8c9060240160206040518083038186803b15801561109c57600080fd5b505afa1580156110b0573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906110d4919061293c565b6110f05760405162461bcd60e51b815260040161047f90612beb565b60006110fa612747565b6111038461215b565b809250819350505060036006838154811061112e57634e487b7160e01b600052603260045260246000fd5b60009182526020909120600660079092020101805460ff1916600183600381111561116957634e487b7160e01b600052602160045260246000fd5b021790555080600001516001600160a01b031681608001517fdadc06f5b98131083e96b856c044184efd23ae2e797a876fd80aa5dae4f724558360200151846040015185606001518660a001518a604051610627959493929190612c98565b6001546040516322b31d9f60e01b81523360048201526000916001600160a01b0316906322b31d9f9060240160206040518083038186803b15801561120c57600080fd5b505afa158015611220573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611244919061293c565b6112605760405162461bcd60e51b815260040161047f90612bbd565b611269826123c4565b156112865760405162461bcd60e51b815260040161047f90612b86565b33600090815260026020526040902080546113299184916112a690612d34565b80601f01602080910402602001604051908101604052809291908181526020018280546112d290612d34565b801561131f5780601f106112f45761010080835404028352916020019161131f565b820191906000526020600020905b81548152906001019060200180831161130257829003601f168201915b5050505050612432565b6113755760405162461bcd60e51b815260206004820152601b60248201527f77726f6e67206173736574206465706f73697420616464726573730000000000604482015260640161047f565b6006546040805160e0810182523381526020810187905290810184905260608101859052608081018290524260a08201819052600060c083018190529091906113bd826123e5565b600081815260046020908152604080832088905560068054600181018255935285517ff652222313e28459528d920b65115c16c04f3efc82aaedc97be59f3f377c0d3f600790940293840180546001600160a01b0319166001600160a01b03909216919091178155868301517ff652222313e28459528d920b65115c16c04f3efc82aaedc97be59f3f377c0d408501559086015180519495508694919361148b937ff652222313e28459528d920b65115c16c04f3efc82aaedc97be59f3f377c0d41909101929101906127ab565b50606082015180516114a79160038401916020909101906127ab565b506080820151600482015560a0820151600582015560c082015160068201805460ff191660018360038111156114ed57634e487b7160e01b600052602160045260246000fd5b02179055505050336001600160a01b0316847f09e00024b3e14e42d4e78c05bf370a34c2e4ce4027dad38abafdb1bf49da432f8a898b8887604051610d15959493929190612c98565b600154604051630d72032360e21b81523360048201526000916001600160a01b0316906335c80c8c9060240160206040518083038186803b15801561157a57600080fd5b505afa15801561158e573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906115b2919061293c565b6115ce5760405162461bcd60e51b815260040161047f90612beb565b60006115d8612747565b6115e18561248b565b8092508193505050836007838154811061160b57634e487b7160e01b600052603260045260246000fd5b9060005260206000209060070201600301908051906020019061162f9291906127ab565b5060026007838154811061165357634e487b7160e01b600052603260045260246000fd5b60009182526020909120600660079092020101805460ff1916600183600381111561168e57634e487b7160e01b600052602160045260246000fd5b02179055508160056000611899600786815481106116bc57634e487b7160e01b600052603260045260246000fd5b90600052602060002090600702016040518060e00160405290816000820160009054906101000a90046001600160a01b03166001600160a01b03166001600160a01b031681526020016001820154815260200160028201805461171e90612d34565b80601f016020809104026020016040519081016040528092919081815260200182805461174a90612d34565b80156117975780601f1061176c57610100808354040283529160200191611797565b820191906000526020600020905b81548152906001019060200180831161177a57829003601f168201915b505050505081526020016003820180546117b090612d34565b80601f01602080910402602001604051908101604052809291908181526020018280546117dc90612d34565b80156118295780601f106117fe57610100808354040283529160200191611829565b820191906000526020600020905b81548152906001019060200180831161180c57829003601f168201915b50505091835250506004820154602082015260058201546040820152600682015460609091019060ff16600381111561187257634e487b7160e01b600052602160045260246000fd5b600381111561189157634e487b7160e01b600052602160045260246000fd5b9052506123e5565b81526020019081526020016000208190555080600001516001600160a01b031681608001517f1949e77206780c38f7c6487c926f8a51280fcdbf63397a01a3428dbfccd2b09f83602001518460400151888660a001518b604051611901959493929190612c98565b60405180910390a3506001949350505050565b60008060006060806000606060008060068a8154811061194457634e487b7160e01b600052603260045260246000fd5b90600052602060002090600702016040518060e00160405290816000820160009054906101000a90046001600160a01b03166001600160a01b03166001600160a01b03168152602001600182015481526020016002820180546119a690612d34565b80601f01602080910402602001604051908101604052809291908181526020018280546119d290612d34565b8015611a1f5780601f106119f457610100808354040283529160200191611a1f565b820191906000526020600020905b815481529060010190602001808311611a0257829003601f168201915b50505050508152602001600382018054611a3890612d34565b80601f0160208091040260200160405190810160405280929190818152602001828054611a6490612d34565b8015611ab15780601f10611a8657610100808354040283529160200191611ab1565b820191906000526020600020905b815481529060010190602001808311611a9457829003601f168201915b50505091835250506004820154602082015260058201546040820152600682015460609091019060ff166003811115611afa57634e487b7160e01b600052602160045260246000fd5b6003811115611b1957634e487b7160e01b600052602160045260246000fd5b8152505090506000611b2e8260c0015161250b565b905081608001519950816000015198508160200151975081604001519650816060015195508160a001519450809350611b66826123e5565b92505050919395975091939597565b6001546040516322b31d9f60e01b81523360048201526000916001600160a01b0316906322b31d9f9060240160206040518083038186803b158015611bb957600080fd5b505afa158015611bcd573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611bf1919061293c565b611c0d5760405162461bcd60e51b815260040161047f90612bbd565b6000611c17612747565b611c208461215b565b805191935091506001600160a01b03163314611ca45760405162461bcd60e51b815260206004820152603960248201527f63616e63656c2073656e64657220697320646966666572656e74207468616e2060448201527f70656e64696e67207265717565737420696e69746961746f7200000000000000606482015260840161047f565b600160068381548110611cc757634e487b7160e01b600052603260045260246000fd5b60009182526020909120600660079092020101805460ff19166001836003811115611d0257634e487b7160e01b600052602160045260246000fd5b0217905550604051848152339083907fb419f275eebfa354bbab2709955ee0c0e25ca95fae50a8e3672c5e3d9c931f5890602001610627565b6001546040516322b31d9f60e01b81523360048201526000916001600160a01b0316906322b31d9f9060240160206040518083038186803b158015611d7f57600080fd5b505afa158015611d93573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611db7919061293c565b611dd35760405162461bcd60e51b815260040161047f90612bbd565b611ddc826123c4565b15611df95760405162461bcd60e51b815260040161047f90612b86565b3360009081526003602090815260409091208351611e19928501906127ab565b50336001600160a01b03167fd4bf22af0d62666e8b980f7e5a35e41f5b3fe0fe17917ec781288c9da27ca21f83604051611e539190612b73565b60405180910390a2506001919050565b60008060006060806000606060008060078a81548110611e9357634e487b7160e01b600052603260045260246000fd5b600091825260208220600660079092020190810154909250611eb79060ff1661250b565b600483015483546001850154600286018054939e506001600160a01b039092169c509a50919250611ee790612d34565b80601f0160208091040260200160405190810160405280929190818152602001828054611f1390612d34565b8015611f605780601f10611f3557610100808354040283529160200191611f60565b820191906000526020600020905b815481529060010190602001808311611f4357829003601f168201915b50505050509650816003018054611f7690612d34565b80601f0160208091040260200160405190810160405280929190818152602001828054611fa290612d34565b8015611fef5780601f10611fc457610100808354040283529160200191611fef565b820191906000526020600020905b815481529060010190602001808311611fd257829003601f168201915b50505060058501546040805160e08101825287546001600160a01b0316815260018801546020820152600288018054969c50929a509598508895611b6695909450879350908401919061171e90612d34565b6000546001600160a01b0316331461209b5760405162461bcd60e51b815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572604482015260640161047f565b6001600160a01b0381166121005760405162461bcd60e51b815260206004820152602660248201527f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160448201526564647265737360d01b606482015260840161047f565b600080546040516001600160a01b03808516939216917f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e091a3600080546001600160a01b0319166001600160a01b0392909216919091179055565b6000612165612747565b826121a65760405162461bcd60e51b81526020600482015260116024820152700726571756573742068617368206973203607c1b604482015260640161047f565b6000838152600460205260409020546006805491935090839081106121db57634e487b7160e01b600052603260045260246000fd5b90600052602060002090600702016040518060e00160405290816000820160009054906101000a90046001600160a01b03166001600160a01b03166001600160a01b031681526020016001820154815260200160028201805461223d90612d34565b80601f016020809104026020016040519081016040528092919081815260200182805461226990612d34565b80156122b65780601f1061228b576101008083540402835291602001916122b6565b820191906000526020600020905b81548152906001019060200180831161229957829003601f168201915b505050505081526020016003820180546122cf90612d34565b80601f01602080910402602001604051908101604052809291908181526020018280546122fb90612d34565b80156123485780601f1061231d57610100808354040283529160200191612348565b820191906000526020600020905b81548152906001019060200180831161232b57829003601f168201915b50505091835250506004820154602082015260058201546040820152600682015460609091019060ff16600381111561239157634e487b7160e01b600052602160045260246000fd5b60038111156123b057634e487b7160e01b600052602160045260246000fd5b90525090506123bf8184612664565b915091565b60006123df8260405180602001604052806000815250612432565b92915050565b80516020808301516040808501516060860151608087015160a08801519351600097612415979096959101612aac565b604051602081830303815290604052805190602001209050919050565b6000816040516020016124459190612a90565b604051602081830303815290604052805190602001208360405160200161246c9190612a90565b6040516020818303038152906040528051906020012014905092915050565b6000612495612747565b826124d65760405162461bcd60e51b81526020600482015260116024820152700726571756573742068617368206973203607c1b604482015260640161047f565b6000838152600560205260409020546007805491935090839081106121db57634e487b7160e01b600052603260045260246000fd5b6060600082600381111561252f57634e487b7160e01b600052602160045260246000fd5b1415612559575060408051808201909152600781526670656e64696e6760c81b6020820152610636565b600182600381111561257b57634e487b7160e01b600052602160045260246000fd5b14156125a6575060408051808201909152600881526718d85b98d95b195960c21b6020820152610636565b60028260038111156125c857634e487b7160e01b600052602160045260246000fd5b14156125f35750604080518082019091526008815267185c1c1c9bdd995960c21b6020820152610636565b600382600381111561261557634e487b7160e01b600052602160045260246000fd5b141561264057506040805180820190915260088152671c995a9958dd195960c21b6020820152610636565b506040805180820190915260078152663ab735b737bbb760c91b6020820152610636565b60008260c00151600381111561268a57634e487b7160e01b600052602160045260246000fd5b146126d05760405162461bcd60e51b815260206004820152601660248201527572657175657374206973206e6f742070656e64696e6760501b604482015260640161047f565b6126d9826123e5565b81146127435760405162461bcd60e51b815260206004820152603360248201527f676976656e2072657175657374206861736820646f6573206e6f74206d6174636044820152721a0818481c195b991a5b99c81c995c5d595cdd606a1b606482015260840161047f565b5050565b6040518060e0016040528060006001600160a01b031681526020016000815260200160608152602001606081526020016000815260200160008152602001600060038111156127a657634e487b7160e01b600052602160045260246000fd5b905290565b8280546127b790612d34565b90600052602060002090601f0160209004810192826127d9576000855561281f565b82601f106127f257805160ff191683800117855561281f565b8280016001018555821561281f579182015b8281111561281f578251825591602001919060010190612804565b5061282b92915061282f565b5090565b5b8082111561282b5760008155600101612830565b600082601f830112612854578081fd5b813567ffffffffffffffff8082111561286f5761286f612d6f565b604051601f8301601f19908116603f0116810190828211818310171561289757612897612d6f565b816040528381528660208588010111156128af578485fd5b8360208701602083013792830160200193909352509392505050565b6000602082840312156128dc578081fd5b81356128e781612d85565b9392505050565b60008060408385031215612900578081fd5b823561290b81612d85565b9150602083013567ffffffffffffffff811115612926578182fd5b61293285828601612844565b9150509250929050565b60006020828403121561294d578081fd5b815180151581146128e7578182fd5b60006020828403121561296d578081fd5b5035919050565b60008060408385031215612986578182fd5b82359150602083013567ffffffffffffffff811115612926578182fd5b6000602082840312156129b4578081fd5b81516128e781612d85565b6000602082840312156129d0578081fd5b813567ffffffffffffffff8111156129e6578182fd5b6129f284828501612844565b949350505050565b600080600060608486031215612a0e578081fd5b83359250602084013567ffffffffffffffff80821115612a2c578283fd5b612a3887838801612844565b93506040860135915080821115612a4d578283fd5b50612a5a86828701612844565b9150509250925092565b60008151808452612a7c816020860160208601612d04565b601f01601f19169290920160200192915050565b60008251612aa2818460208701612d04565b9190910192915050565b600060018060a01b038816825286602083015260c06040830152612ad360c0830187612a64565b8281036060840152612ae58187612a64565b6080840195909552505060a00152949350505050565b600060018060a01b038916825287602083015260e06040830152612b2260e0830188612a64565b8281036060840152612b348188612a64565b9150508460808301528360a083015260048310612b6157634e487b7160e01b600052602160045260246000fd5b8260c083015298975050505050505050565b6000602082526128e76020830184612a64565b6020808252601d908201527f696e76616c6964206173736574206465706f7369742061646472657373000000604082015260600190565b60208082526014908201527339b2b73232b9103737ba103090313937b5b2b91760611b604082015260600190565b60208082526017908201527f73656e646572206e6f74206120637573746f6469616e2e000000000000000000604082015260600190565b8881526001600160a01b03881660208201526040810187905261010060608201819052600090612c5483820189612a64565b90508281036080840152612c688188612a64565b90508560a084015282810360c0840152612c828186612a64565b9150508260e08301529998505050505050505050565b600086825260a06020830152612cb160a0830187612a64565b8281036040840152612cc38187612a64565b60608401959095525050608001529392505050565b600085825260806020830152612cf16080830186612a64565b6040830194909452506060015292915050565b60005b83811015612d1f578181015183820152602001612d07565b83811115612d2e576000848401525b50505050565b600181811c90821680612d4857607f821691505b60208210811415612d6957634e487b7160e01b600052602260045260246000fd5b50919050565b634e487b7160e01b600052604160045260246000fd5b6001600160a01b0381168114612d9a57600080fd5b5056fea2646970667358221220a47959ccc5c8f4f69c3c1547d89e5503f7e753a707508575440b94f688dc06c264736f6c63430008030033
Constructor Arguments (ABI-Encoded and is the last bytes of the Contract Creation Code above)
00000000000000000000000064ee1a675942bd995dc0b1f89229222bc4ccbdc3
-----Decoded View---------------
Arg [0] : _controller (address): 0x64ee1a675942BD995Dc0B1f89229222bc4cCBDC3
-----Encoded View---------------
1 Constructor Arguments found :
Arg [0] : 00000000000000000000000064ee1a675942bd995dc0b1f89229222bc4ccbdc3
Loading...
Loading
Loading...
Loading
Multichain Portfolio | 30 Chains
Chain | Token | Portfolio % | Price | Amount | Value |
---|
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.