Overview
ETH Balance
0 ETH
Eth Value
$0.00More Info
Private Name Tags
ContractCreator
Latest 21 from a total of 21 transactions
Transaction Hash |
Method
|
Block
|
From
|
To
|
|||||
---|---|---|---|---|---|---|---|---|---|
Build And Enter ... | 11936107 | 1463 days ago | IN | 0 ETH | 0.24032797 | ||||
Build And Enter ... | 11936107 | 1463 days ago | IN | 0 ETH | 0.24032797 | ||||
Build And Enter ... | 10588909 | 1670 days ago | IN | 0 ETH | 0.00275 | ||||
Build And Enter ... | 10259677 | 1721 days ago | IN | 0 ETH | 0.03236437 | ||||
Build And Enter ... | 10040470 | 1755 days ago | IN | 0 ETH | 0.02507099 | ||||
Build And Enter ... | 10001320 | 1761 days ago | IN | 0 ETH | 0.01654685 | ||||
Build And Enter ... | 9952239 | 1769 days ago | IN | 0 ETH | 0.01754969 | ||||
Build And Enter ... | 9947743 | 1769 days ago | IN | 0 ETH | 0.02507099 | ||||
Build And Enter ... | 9932777 | 1772 days ago | IN | 0 ETH | 0.01253549 | ||||
Build And Enter ... | 9922271 | 1773 days ago | IN | 0 ETH | 0.01930466 | ||||
Build And Enter ... | 9918603 | 1774 days ago | IN | 0 ETH | 0.00752129 | ||||
Build And Enter ... | 9905137 | 1776 days ago | IN | 0 ETH | 0.00501419 | ||||
Build And Enter ... | 9900548 | 1777 days ago | IN | 0 ETH | 0.01527051 | ||||
Build And Enter ... | 9878008 | 1780 days ago | IN | 0 ETH | 0.01378904 | ||||
Build And Enter ... | 9876659 | 1780 days ago | IN | 0 ETH | 0.01253549 | ||||
Build And Enter ... | 9867476 | 1782 days ago | IN | 0 ETH | 0.00802271 | ||||
Build And Enter ... | 9859383 | 1783 days ago | IN | 0 ETH | 0.00501419 | ||||
Build And Enter ... | 9842202 | 1786 days ago | IN | 0 ETH | 0.01504259 | ||||
Build And Enter ... | 9840435 | 1786 days ago | IN | 0 ETH | 0.0010839 | ||||
Build And Enter ... | 9838184 | 1786 days ago | IN | 0 ETH | 0.01504259 | ||||
Build And Enter ... | 9836461 | 1786 days ago | IN | 0 ETH | 0.007772 |
Latest 22 internal transactions
Advanced mode:
Parent Transaction Hash | Block |
From
|
To
|
|||
---|---|---|---|---|---|---|
11936107 | 1463 days ago | Contract Creation | 0 ETH | |||
11936107 | 1463 days ago | Contract Creation | 0 ETH | |||
10259677 | 1721 days ago | Contract Creation | 0 ETH | |||
10040470 | 1755 days ago | Contract Creation | 0 ETH | |||
10001320 | 1761 days ago | Contract Creation | 0 ETH | |||
9952239 | 1769 days ago | Contract Creation | 0 ETH | |||
9947743 | 1769 days ago | Contract Creation | 0 ETH | |||
9932777 | 1772 days ago | Contract Creation | 0 ETH | |||
9922271 | 1773 days ago | Contract Creation | 0 ETH | |||
9918603 | 1774 days ago | Contract Creation | 0 ETH | |||
9905137 | 1776 days ago | Contract Creation | 0 ETH | |||
9900548 | 1777 days ago | Contract Creation | 0 ETH | |||
9878008 | 1780 days ago | Contract Creation | 0 ETH | |||
9876659 | 1780 days ago | Contract Creation | 0 ETH | |||
9867476 | 1782 days ago | Contract Creation | 0 ETH | |||
9859383 | 1783 days ago | Contract Creation | 0 ETH | |||
9842202 | 1786 days ago | Contract Creation | 0 ETH | |||
9840435 | 1786 days ago | Contract Creation | 0 ETH | |||
9838184 | 1786 days ago | Contract Creation | 0 ETH | |||
9836461 | 1786 days ago | Contract Creation | 0 ETH | |||
9836093 | 1787 days ago | Contract Creation | 0 ETH | |||
9836093 | 1787 days ago | Contract Creation | 0 ETH |
Loading...
Loading
This contract may be a proxy contract. Click on More Options and select Is this a proxy? to confirm and enable the "Read as Proxy" & "Write as Proxy" tabs.
Contract Source Code Verified (Exact Match)
Contract Name:
DACProxyFactory
Compiler Version
v0.5.16+commit.9c3226ce
Contract Source Code (Solidity)
/** *Submitted for verification at Etherscan.io on 2020-04-09 */ // File: src/lib/BytesLib.sol pragma solidity 0.5.16; // https://github.com/GNSPS/solidity-bytes-utils/blob/b1b22d1e9c4de64defb811f4c65a391630f220d7/contracts/BytesLib.sol contract BytesLibLite { // A lite version of the ByteLib, containing only the "slice" function we need function sliceToEnd( bytes memory _bytes, uint256 _start ) internal pure returns (bytes memory) { require(_start < _bytes.length, "bytes-read-out-of-bounds"); return slice( _bytes, _start, _bytes.length - _start ); } function slice( bytes memory _bytes, uint256 _start, uint256 _length ) internal pure returns (bytes memory) { require(_bytes.length >= (_start + _length), "bytes-read-out-of-bounds"); bytes memory tempBytes; assembly { switch iszero(_length) case 0 { // Get a location of some free memory and store it in tempBytes as // Solidity does for memory variables. tempBytes := mload(0x40) // The first word of the slice result is potentially a partial // word read from the original array. To read it, we calculate // the length of that partial word and start copying that many // bytes into the array. The first word we copy will start with // data we don't care about, but the last `lengthmod` bytes will // land at the beginning of the contents of the new array. When // we're done copying, we overwrite the full first word with // the actual length of the slice. let lengthmod := and(_length, 31) // The multiplication in the next line is necessary // because when slicing multiples of 32 bytes (lengthmod == 0) // the following copy loop was copying the origin's length // and then ending prematurely not copying everything it should. let mc := add(add(tempBytes, lengthmod), mul(0x20, iszero(lengthmod))) let end := add(mc, _length) for { // The multiplication in the next line has the same exact purpose // as the one above. let cc := add(add(add(_bytes, lengthmod), mul(0x20, iszero(lengthmod))), _start) } lt(mc, end) { mc := add(mc, 0x20) cc := add(cc, 0x20) } { mstore(mc, mload(cc)) } mstore(tempBytes, _length) //update free-memory pointer //allocating the array padded to 32 bytes like the compiler does now mstore(0x40, and(add(mc, 31), not(31))) } //if we want a zero-length slice let's just return a zero-length array default { tempBytes := mload(0x40) mstore(0x40, add(tempBytes, 0x20)) } } return tempBytes; } function bytesToAddress(bytes memory _bytes, uint256 _start) internal pure returns (address) { require(_bytes.length >= (_start + 20), "Read out of bounds"); address tempAddress; assembly { tempAddress := div(mload(add(add(_bytes, 0x20), _start)), 0x1000000000000000000000000) } return tempAddress; } } // File: src/interfaces/IERC20.sol pragma solidity 0.5.16; 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); function decimals() external view returns (uint8); function symbol() external view returns (string memory); function name() external view returns (string memory); } // File: @openzeppelin/contracts/math/SafeMath.sol pragma solidity ^0.5.0; /** * @dev Wrappers over Solidity's arithmetic operations with added overflow * checks. * * Arithmetic operations in Solidity wrap on overflow. This can easily result * in bugs, because programmers usually assume that an overflow raises an * error, which is the standard behavior in high level programming languages. * `SafeMath` restores this intuition by reverting the transaction when an * operation overflows. * * Using this library instead of the unchecked operations eliminates an entire * class of bugs, so it's recommended to use it always. */ library SafeMath { /** * @dev Returns the addition of two unsigned integers, reverting on * overflow. * * Counterpart to Solidity's `+` operator. * * Requirements: * - Addition cannot overflow. */ function add(uint256 a, uint256 b) internal pure returns (uint256) { uint256 c = a + b; require(c >= a, "SafeMath: addition overflow"); return c; } /** * @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. * * _Available since v2.4.0._ */ function sub(uint256 a, uint256 b, string memory errorMessage) internal pure returns (uint256) { require(b <= a, errorMessage); uint256 c = a - b; return c; } /** * @dev Returns the multiplication of two unsigned integers, reverting on * overflow. * * Counterpart to Solidity's `*` operator. * * Requirements: * - Multiplication cannot overflow. */ function mul(uint256 a, uint256 b) internal pure returns (uint256) { // Gas optimization: this is cheaper than requiring 'a' not being zero, but the // benefit is lost if 'b' is also tested. // See: https://github.com/OpenZeppelin/openzeppelin-contracts/pull/522 if (a == 0) { return 0; } uint256 c = a * b; require(c / a == b, "SafeMath: multiplication overflow"); return c; } /** * @dev Returns the integer division of two unsigned integers. Reverts on * division by zero. The result is rounded towards zero. * * Counterpart to Solidity's `/` operator. Note: this function uses a * `revert` opcode (which leaves remaining gas untouched) while Solidity * uses an invalid opcode to revert (consuming all remaining gas). * * Requirements: * - The divisor cannot be zero. */ function div(uint256 a, uint256 b) internal pure returns (uint256) { return div(a, b, "SafeMath: division by zero"); } /** * @dev Returns the integer division of two unsigned integers. Reverts with custom message on * division by zero. The result is rounded towards zero. * * Counterpart to Solidity's `/` operator. Note: this function uses a * `revert` opcode (which leaves remaining gas untouched) while Solidity * uses an invalid opcode to revert (consuming all remaining gas). * * Requirements: * - The divisor cannot be zero. * * _Available since v2.4.0._ */ function div(uint256 a, uint256 b, string memory errorMessage) internal pure returns (uint256) { // Solidity only automatically asserts when dividing by 0 require(b > 0, errorMessage); uint256 c = a / b; // assert(a == b * c + a % b); // There is no case in which this doesn't hold return c; } /** * @dev Returns the remainder of dividing two unsigned integers. (unsigned integer modulo), * Reverts when dividing by zero. * * Counterpart to Solidity's `%` operator. This function uses a `revert` * opcode (which leaves remaining gas untouched) while Solidity uses an * invalid opcode to revert (consuming all remaining gas). * * Requirements: * - The divisor cannot be zero. */ function mod(uint256 a, uint256 b) internal pure returns (uint256) { return mod(a, b, "SafeMath: modulo by zero"); } /** * @dev Returns the remainder of dividing two unsigned integers. (unsigned integer modulo), * Reverts with custom message when dividing by zero. * * Counterpart to Solidity's `%` operator. This function uses a `revert` * opcode (which leaves remaining gas untouched) while Solidity uses an * invalid opcode to revert (consuming all remaining gas). * * Requirements: * - The divisor cannot be zero. * * _Available since v2.4.0._ */ function mod(uint256 a, uint256 b, string memory errorMessage) internal pure returns (uint256) { require(b != 0, errorMessage); return a % b; } } // File: @openzeppelin/contracts/utils/Address.sol pragma solidity ^0.5.5; /** * @dev Collection of functions related to the address type */ library Address { /** * @dev Returns true if `account` is a contract. * * [IMPORTANT] * ==== * It is unsafe to assume that an address for which this function returns * false is an externally-owned account (EOA) and not a contract. * * Among others, `isContract` will return false for the following * types of addresses: * * - an externally-owned account * - a contract in construction * - an address where a contract will be created * - an address where a contract lived, but was destroyed * ==== */ function isContract(address account) internal view returns (bool) { // According to EIP-1052, 0x0 is the value returned for not-yet created accounts // and 0xc5d2460186f7233c927e7db2dcc703c0e500b653ca82273b7bfad8045d85a470 is returned // for accounts without code, i.e. `keccak256('')` bytes32 codehash; bytes32 accountHash = 0xc5d2460186f7233c927e7db2dcc703c0e500b653ca82273b7bfad8045d85a470; // solhint-disable-next-line no-inline-assembly assembly { codehash := extcodehash(account) } return (codehash != accountHash && codehash != 0x0); } /** * @dev Converts an `address` into `address payable`. Note that this is * simply a type cast: the actual underlying value is not changed. * * _Available since v2.4.0._ */ function toPayable(address account) internal pure returns (address payable) { return address(uint160(account)); } /** * @dev Replacement for Solidity's `transfer`: sends `amount` wei to * `recipient`, forwarding all available gas and reverting on errors. * * https://eips.ethereum.org/EIPS/eip-1884[EIP1884] increases the gas cost * of certain opcodes, possibly making contracts go over the 2300 gas limit * imposed by `transfer`, making them unable to receive funds via * `transfer`. {sendValue} removes this limitation. * * https://diligence.consensys.net/posts/2019/09/stop-using-soliditys-transfer-now/[Learn more]. * * IMPORTANT: because control is transferred to `recipient`, care must be * taken to not create reentrancy vulnerabilities. Consider using * {ReentrancyGuard} or the * https://solidity.readthedocs.io/en/v0.5.11/security-considerations.html#use-the-checks-effects-interactions-pattern[checks-effects-interactions pattern]. * * _Available since v2.4.0._ */ function sendValue(address payable recipient, uint256 amount) internal { require(address(this).balance >= amount, "Address: insufficient balance"); // solhint-disable-next-line avoid-call-value (bool success, ) = recipient.call.value(amount)(""); require(success, "Address: unable to send value, recipient may have reverted"); } } // File: src/interfaces/ISafeERC20.sol pragma solidity 0.5.16; /** * @title SafeERC20 * @dev Wrappers around ERC20 operations that throw on failure (when the token * contract returns false). Tokens that return no value (and instead revert or * throw on failure) are also supported, non-reverting calls are assumed to be * successful. * To use this library you can add a `using SafeERC20 for ERC20;` statement to your contract, * which allows you to call the safe operations as `token.safeTransfer(...)`, etc. */ library SafeERC20 { using SafeMath for uint256; using Address for address; function safeTransfer(IERC20 token, address to, uint256 value) internal { callOptionalReturn(token, abi.encodeWithSelector(token.transfer.selector, to, value)); } function safeTransferFrom(IERC20 token, address from, address to, uint256 value) internal { callOptionalReturn(token, abi.encodeWithSelector(token.transferFrom.selector, from, to, value)); } function safeApprove(IERC20 token, address spender, uint256 value) internal { // safeApprove should only be called when setting an initial allowance, // or when resetting it to zero. To increase and decrease it, use // 'safeIncreaseAllowance' and 'safeDecreaseAllowance' // solhint-disable-next-line max-line-length require((value == 0) || (token.allowance(address(this), spender) == 0), "SafeERC20: approve from non-zero to non-zero allowance" ); callOptionalReturn(token, abi.encodeWithSelector(token.approve.selector, spender, value)); } function safeIncreaseAllowance(IERC20 token, address spender, uint256 value) internal { uint256 newAllowance = token.allowance(address(this), spender).add(value); callOptionalReturn(token, abi.encodeWithSelector(token.approve.selector, spender, newAllowance)); } function safeDecreaseAllowance(IERC20 token, address spender, uint256 value) internal { uint256 newAllowance = token.allowance(address(this), spender).sub(value, "SafeERC20: decreased allowance below zero"); callOptionalReturn(token, abi.encodeWithSelector(token.approve.selector, spender, newAllowance)); } /** * @dev Imitates a Solidity high-level call (i.e. a regular function call to a contract), relaxing the requirement * on the return value: the return value is optional (but if data is returned, it must not be false). * @param token The token targeted by the call. * @param data The call data (encoded using abi.encode or one of its variants). */ function callOptionalReturn(IERC20 token, bytes memory data) private { // We need to perform a low level call here, to bypass Solidity's return data size checking mechanism, since // we're implementing it ourselves. // A Solidity high level call has three parts: // 1. The target address is checked to verify it contains contract code // 2. The call itself is made, and success asserted // 3. The return value is decoded, which in turn checks the size of the returned data. // solhint-disable-next-line max-line-length require(address(token).isContract(), "SafeERC20: call to non-contract"); // solhint-disable-next-line avoid-low-level-calls (bool success, bytes memory returndata) = address(token).call(data); require(success, "SafeERC20: low-level call failed"); if (returndata.length > 0) { // Return data is optional // solhint-disable-next-line max-line-length require(abi.decode(returndata, (bool)), "SafeERC20: ERC20 operation did not succeed"); } } } // File: src/interfaces/aave/IFlashLoanReceiver.sol pragma solidity 0.5.16; /** * @title IFlashLoanReceiver interface * @notice Interface for the Aave fee IFlashLoanReceiver. * @author Aave * @dev implement this interface to develop a flashloan-compatible flashLoanReceiver contract **/ interface IFlashLoanReceiver { function executeOperation(address _reserve, uint256 _amount, uint256 _fee, bytes calldata _params) external; } // File: src/interfaces/aave/ILendingPoolAddressesProvider.sol pragma solidity 0.5.16; /** @title ILendingPoolAddressesProvider interface @notice provides the interface to fetch the LendingPoolCore address */ contract ILendingPoolAddressesProvider { function getLendingPool() public view returns (address); function setLendingPoolImpl(address _pool) public; function getLendingPoolCore() public view returns (address payable); function setLendingPoolCoreImpl(address _lendingPoolCore) public; function getLendingPoolConfigurator() public view returns (address); function setLendingPoolConfiguratorImpl(address _configurator) public; function getLendingPoolDataProvider() public view returns (address); function setLendingPoolDataProviderImpl(address _provider) public; function getLendingPoolParametersProvider() public view returns (address); function setLendingPoolParametersProviderImpl(address _parametersProvider) public; function getTokenDistributor() public view returns (address); function setTokenDistributor(address _tokenDistributor) public; function getFeeProvider() public view returns (address); function setFeeProviderImpl(address _feeProvider) public; function getLendingPoolLiquidationManager() public view returns (address); function setLendingPoolLiquidationManager(address _manager) public; function getLendingPoolManager() public view returns (address); function setLendingPoolManager(address _lendingPoolManager) public; function getPriceOracle() public view returns (address); function setPriceOracle(address _priceOracle) public; function getLendingRateOracle() public view returns (address); function setLendingRateOracle(address _lendingRateOracle) public; } // File: src/lib/aave/FlashLoanReceiverBase.sol pragma solidity 0.5.16; contract FlashLoanReceiverBase is IFlashLoanReceiver { using SafeMath for uint256; address constant ETHADDRESS = 0xEeeeeEeeeEeEeeEeEeEeeEEEeeeeEeeeeeeeEEeE; ILendingPoolAddressesProvider public addressesProvider = ILendingPoolAddressesProvider(0x24a42fD28C976A61Df5D00D0599C34c4f90748c8); function () external payable { } function transferFundsBackToPoolInternal(address _reserve, uint256 _amount) internal { address payable core = addressesProvider.getLendingPoolCore(); transferInternal(core,_reserve, _amount); } function transferInternal(address payable _destination, address _reserve, uint256 _amount) internal { if(_reserve == ETHADDRESS) { //solium-disable-next-line _destination.call.value(_amount)(""); return; } IERC20(_reserve).transfer(_destination, _amount); } function getBalanceInternal(address _target, address _reserve) internal view returns(uint256) { if(_reserve == ETHADDRESS) { return _target.balance; } return IERC20(_reserve).balanceOf(_target); } } // File: src/lib/dapphub/Auth.sol // This program is free software: you can redistribute it and/or modify // it under the terms of the GNU General Public License as published by // the Free Software Foundation, either version 3 of the License, or // (at your option) any later version. // This program is distributed in the hope that it will be useful, // but WITHOUT ANY WARRANTY; without even the implied warranty of // MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the // GNU General Public License for more details. // You should have received a copy of the GNU General Public License // along with this program. If not, see <http://www.gnu.org/licenses/>. pragma solidity 0.5.16; contract DSAuthority { function canCall( address src, address dst, bytes4 sig ) public view returns (bool); } contract DSAuthEvents { event LogSetAuthority (address indexed authority); event LogSetOwner (address indexed owner); } contract DSAuth is DSAuthEvents { DSAuthority public authority; address public owner; constructor() public { owner = msg.sender; emit LogSetOwner(msg.sender); } function setOwner(address owner_) public auth { owner = owner_; emit LogSetOwner(owner); } function setAuthority(DSAuthority authority_) public auth { authority = authority_; emit LogSetAuthority(address(authority)); } modifier auth { require(isAuthorized(msg.sender, msg.sig), "ds-auth-unauthorized"); _; } function isAuthorized(address src, bytes4 sig) internal view returns (bool) { if (src == address(this)) { return true; } else if (src == owner) { return true; } else if (address(authority) == address(0)) { return false; } else { return authority.canCall(src, address(this), sig); } } } // File: src/lib/dapphub/Note.sol /// note.sol -- the `note' modifier, for logging calls as events // This program is free software: you can redistribute it and/or modify // it under the terms of the GNU General Public License as published by // the Free Software Foundation, either version 3 of the License, or // (at your option) any later version. // This program is distributed in the hope that it will be useful, // but WITHOUT ANY WARRANTY; without even the implied warranty of // MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the // GNU General Public License for more details. // You should have received a copy of the GNU General Public License // along with this program. If not, see <http://www.gnu.org/licenses/>. pragma solidity 0.5.16; contract DSNote { event LogNote( bytes4 indexed sig, address indexed guy, bytes32 indexed foo, bytes32 indexed bar, uint256 wad, bytes fax ) anonymous; modifier note { bytes32 foo; bytes32 bar; uint256 wad; assembly { foo := calldataload(4) bar := calldataload(36) wad := callvalue } emit LogNote(msg.sig, msg.sender, foo, bar, wad, msg.data); _; } } // File: src/lib/dapphub/Proxy.sol // proxy.sol - execute actions atomically through the proxy's identity // Copyright (C) 2017 DappHub, LLC // This program is free software: you can redistribute it and/or modify // it under the terms of the GNU General Public License as published by // the Free Software Foundation, either version 3 of the License, or // (at your option) any later version. // This program is distributed in the hope that it will be useful, // but WITHOUT ANY WARRANTY; without even the implied warranty of // MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the // GNU General Public License for more details. // You should have received a copy of the GNU General Public License // along with this program. If not, see <http://www.gnu.org/licenses/>. pragma solidity >=0.5.0 <0.6.0; // DSProxy // Allows code execution using a persistant identity This can be very // useful to execute a sequence of atomic actions. Since the owner of // the proxy can be changed, this allows for dynamic ownership models // i.e. a multisig contract DSProxy is DSAuth, DSNote { DSProxyCache public cache; // global cache for contracts constructor(address _cacheAddr) public { setCache(_cacheAddr); } function() external payable { } // use the proxy to execute calldata _data on contract _code function execute(bytes memory _code, bytes memory _data) public payable returns (address target, bytes memory response) { target = cache.read(_code); if (target == address(0)) { // deploy contract & store its address in cache target = cache.write(_code); } response = execute(target, _data); } function execute(address _target, bytes memory _data) public auth note payable returns (bytes memory response) { require(_target != address(0), "ds-proxy-target-address-required"); // call contract in current context assembly { let succeeded := delegatecall(sub(gas, 5000), _target, add(_data, 0x20), mload(_data), 0, 0) let size := returndatasize response := mload(0x40) mstore(0x40, add(response, and(add(add(size, 0x20), 0x1f), not(0x1f)))) mstore(response, size) returndatacopy(add(response, 0x20), 0, size) switch iszero(succeeded) case 1 { // throw if delegatecall failed revert(add(response, 0x20), size) } } } //set new cache function setCache(address _cacheAddr) public auth note returns (bool) { require(_cacheAddr != address(0), "ds-proxy-cache-address-required"); cache = DSProxyCache(_cacheAddr); // overwrite cache return true; } } // DSProxyFactory // This factory deploys new proxy instances through build() // Deployed proxy addresses are logged contract DSProxyFactory { event Created(address indexed sender, address indexed owner, address proxy, address cache); mapping(address=>address) public proxies; DSProxyCache public cache; constructor() public { cache = new DSProxyCache(); } // deploys a new proxy instance // sets owner of proxy to caller function build() public returns (address payable proxy) { proxy = build(msg.sender); } // deploys a new proxy instance // sets custom owner of proxy function build(address owner) public returns (address payable proxy) { proxy = address(new DSProxy(address(cache))); emit Created(msg.sender, owner, address(proxy), address(cache)); DSProxy(proxy).setOwner(owner); proxies[owner] = proxy; } } // DSProxyCache // This global cache stores addresses of contracts previously deployed // by a proxy. This saves gas from repeat deployment of the same // contracts and eliminates blockchain bloat. // By default, all proxies deployed from the same factory store // contracts in the same cache. The cache a proxy instance uses can be // changed. The cache uses the sha3 hash of a contract's bytecode to // lookup the address contract DSProxyCache { mapping(bytes32 => address) cache; function read(bytes memory _code) public view returns (address) { bytes32 hash = keccak256(_code); return cache[hash]; } function write(bytes memory _code) public returns (address target) { assembly { target := create(0, add(_code, 0x20), mload(_code)) switch iszero(extcodesize(target)) case 1 { // throw if contract failed to deploy revert(0, 0) } } bytes32 hash = keccak256(_code); cache[hash] = target; } } // File: src/proxies/DACProxy.sol /* Main contract to handle Aave flashloans on Compound Finance. (D)edge's (A)ave (C)ommon Proxy. */ pragma solidity 0.5.16; pragma experimental ABIEncoderV2; contract DACProxy is DSProxy(address(1)), FlashLoanReceiverBase, BytesLibLite { // TODO: Change this value address payable constant protocolFeePayoutAddress1 = 0x773CCbFB422850617A5680D40B1260422d072f41; address payable constant protocolFeePayoutAddress2 = 0xAbcCB8f0a3c206Bb0468C52CCc20f3b81077417B; constructor(address _cacheAddr) public { setCache(_cacheAddr); } function() external payable {} // This is for Aave flashloans function executeOperation( address _reserve, uint256 _amount, uint256 _fee, bytes calldata _params ) external auth { // Assumes that once the action(s) are performed // we will have totalDebt would of _reserve to repay // aave and the protocol uint protocolFee = _fee.div(2); // Re-encodes new data // Function signature should conform to: /* ( // Note: for address, as abiEncoder pads it to 32 bytes our starting position is 12 // due to addresses having 20 bytes in length address - Address to call | start: 12; (20 bytes) bytes - Function sig | start: 32; (4 bytes) uint - Data of _amount | start: 36; (32 bytes) uint - Data of _aaveFee | start: 68; (32 bytes) uint - Data of _protocolFee | start: 100; (32 bytes) bytes - Data of _data | start: 132; (dynamic length) ) i.e. function myFunction( uint amount, uint aaveFee, uint protocolFee, bytes memory _data ) { ... } */ address targetAddress = bytesToAddress(_params, 12); bytes memory fSig = slice(_params, 32, 4); bytes memory data = sliceToEnd(_params, 132); // Re-encodes function signature and injects new // _amount, _fee, and _protocolFee into _data bytes memory newData = abi.encodePacked( fSig, abi.encode(_amount), abi.encode(_fee), abi.encode(protocolFee), data ); // Executes new target execute(targetAddress, newData); // Repays protocol fee if (_reserve == 0xEeeeeEeeeEeEeeEeEeEeeEEEeeeeEeeeeeeeEEeE) { protocolFeePayoutAddress1.call.value(protocolFee.div(2))(""); protocolFeePayoutAddress2.call.value(protocolFee.div(2))(""); } else { IERC20(_reserve).transfer(protocolFeePayoutAddress1, protocolFee.div(2)); IERC20(_reserve).transfer(protocolFeePayoutAddress2, protocolFee.div(2)); } // Repays aave transferFundsBackToPoolInternal(_reserve, _amount.add(_fee)); } } // File: src/lib/dapphub/Guard.sol // guard.sol -- simple whitelist implementation of DSAuthority // Copyright (C) 2017 DappHub, LLC // This program is free software: you can redistribute it and/or modify // it under the terms of the GNU General Public License as published by // the Free Software Foundation, either version 3 of the License, or // (at your option) any later version. // This program is distributed in the hope that it will be useful, // but WITHOUT ANY WARRANTY; without even the implied warranty of // MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the // GNU General Public License for more details. // You should have received a copy of the GNU General Public License // along with this program. If not, see <http://www.gnu.org/licenses/>. pragma solidity 0.5.16; contract DSGuardEvents { event LogPermit( bytes32 indexed src, bytes32 indexed dst, bytes32 indexed sig ); event LogForbid( bytes32 indexed src, bytes32 indexed dst, bytes32 indexed sig ); } contract DSGuard is DSAuth, DSAuthority, DSGuardEvents { bytes32 constant public ANY = bytes32(uint(-1)); mapping (bytes32 => mapping (bytes32 => mapping (bytes32 => bool))) acl; function canCall( address src_, address dst_, bytes4 sig ) public view returns (bool) { bytes32 src = bytes32(bytes20(src_)); bytes32 dst = bytes32(bytes20(dst_)); return acl[src][dst][sig] || acl[src][dst][ANY] || acl[src][ANY][sig] || acl[src][ANY][ANY] || acl[ANY][dst][sig] || acl[ANY][dst][ANY] || acl[ANY][ANY][sig] || acl[ANY][ANY][ANY]; } function permit(bytes32 src, bytes32 dst, bytes32 sig) public auth { acl[src][dst][sig] = true; emit LogPermit(src, dst, sig); } function forbid(bytes32 src, bytes32 dst, bytes32 sig) public auth { acl[src][dst][sig] = false; emit LogForbid(src, dst, sig); } function permit(address src, address dst, bytes32 sig) public { permit(bytes32(bytes20(src)), bytes32(bytes20(dst)), sig); } function forbid(address src, address dst, bytes32 sig) public { forbid(bytes32(bytes20(src)), bytes32(bytes20(dst)), sig); } } contract DSGuardFactory { mapping (address => bool) public isGuard; function newGuard() public returns (DSGuard guard) { guard = new DSGuard(); guard.setOwner(msg.sender); isGuard[address(guard)] = true; } } // File: src/interfaces/compound/IComptroller.sol pragma solidity 0.5.16; interface IComptroller { /** * @notice Marker function used for light validation when updating the comptroller of a market * @dev Implementations should simply return true. * @return true */ function isComptroller() external view returns (bool); /*** Assets You Are In ***/ function enterMarkets(address[] calldata cTokens) external returns (uint[] memory); function exitMarket(address cToken) external returns (uint); /*** Policy Hooks ***/ function getAccountLiquidity(address account) external view returns (uint, uint, uint); function getAssetsIn(address account) external view returns (address[] memory); function mintAllowed(address cToken, address minter, uint mintAmount) external returns (uint); function mintVerify(address cToken, address minter, uint mintAmount, uint mintTokens) external; function redeemAllowed(address cToken, address redeemer, uint redeemTokens) external returns (uint); function redeemVerify(address cToken, address redeemer, uint redeemAmount, uint redeemTokens) external; function borrowAllowed(address cToken, address borrower, uint borrowAmount) external returns (uint); function borrowVerify(address cToken, address borrower, uint borrowAmount) external; function repayBorrowAllowed( address cToken, address payer, address borrower, uint repayAmount) external returns (uint); function repayBorrowVerify( address cToken, address payer, address borrower, uint repayAmount, uint borrowerIndex) external; function liquidateBorrowAllowed( address cTokenBorrowed, address cTokenCollateral, address liquidator, address borrower, uint repayAmount) external returns (uint); function liquidateBorrowVerify( address cTokenBorrowed, address cTokenCollateral, address liquidator, address borrower, uint repayAmount, uint seizeTokens) external; function seizeAllowed( address cTokenCollateral, address cTokenBorrowed, address liquidator, address borrower, uint seizeTokens) external returns (uint); function seizeVerify( address cTokenCollateral, address cTokenBorrowed, address liquidator, address borrower, uint seizeTokens) external; function transferAllowed(address cToken, address src, address dst, uint transferTokens) external returns (uint); function transferVerify(address cToken, address src, address dst, uint transferTokens) external; /*** Liquidity/Liquidation Calculations ***/ function liquidateCalculateSeizeTokens( address cTokenBorrowed, address cTokenCollateral, uint repayAmount) external view returns (uint, uint); } // File: src/proxies/DACProxyFactory.sol pragma solidity 0.5.16; contract DACProxyFactory { event Created(address indexed sender, address indexed owner, address proxy, address cache); mapping(address=>address) public proxies; DSProxyCache public cache; DSGuardFactory public dsGuardFactory; constructor() public { cache = new DSProxyCache(); dsGuardFactory = new DSGuardFactory(); } // deploys a new proxy instance // sets owner of proxy to caller function build() public returns (address payable proxy) { proxy = build(msg.sender); } // deploys a new proxy instance // creates a new guard // sets custom owner of proxy function build(address owner) public returns (address payable) { // If user already has a proxy build, return that instead if (proxies[owner] != address(0)) { return address(uint160(proxies[owner])); } address payable proxy = address(new DACProxy(address(cache))); emit Created(msg.sender, owner, address(proxy), address(cache)); DSGuard guard = dsGuardFactory.newGuard(); guard.setOwner(proxy); // Guard belongs to proxy DACProxy(proxy).setAuthority(guard); DACProxy(proxy).setOwner(owner); proxies[owner] = proxy; return proxy; } // Compound-specific code to enter markets upon proxy creation // So user has to perform less TX function buildAndEnterMarkets( address dedgeCompoundManager, bytes memory enterMarketCalldata ) public returns (address payable) { return buildAndEnterMarkets(msg.sender, dedgeCompoundManager, enterMarketCalldata); } function buildAndEnterMarkets( address owner, address dedgeCompoundManager, bytes memory enterMarketCalldata ) public returns (address payable) { // If user already has a proxy build, return that instead if (proxies[owner] != address(0)) { return address(uint160(proxies[owner])); } address payable proxy = address(new DACProxy(address(cache))); emit Created(msg.sender, owner, address(proxy), address(cache)); DSGuard guard = dsGuardFactory.newGuard(); guard.setOwner(proxy); // Guard belongs to proxy // Enter markets via proxy DACProxy(proxy).execute( dedgeCompoundManager, enterMarketCalldata ); DACProxy(proxy).setAuthority(guard); DACProxy(proxy).setOwner(owner); proxies[owner] = proxy; return proxy; } }
Contract Security Audit
- No Contract Security Audit Submitted- Submit Audit Here
Contract ABI
API[{"inputs":[],"payable":false,"stateMutability":"nonpayable","type":"constructor"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"sender","type":"address"},{"indexed":true,"internalType":"address","name":"owner","type":"address"},{"indexed":false,"internalType":"address","name":"proxy","type":"address"},{"indexed":false,"internalType":"address","name":"cache","type":"address"}],"name":"Created","type":"event"},{"constant":false,"inputs":[],"name":"build","outputs":[{"internalType":"address payable","name":"proxy","type":"address"}],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":false,"inputs":[{"internalType":"address","name":"owner","type":"address"}],"name":"build","outputs":[{"internalType":"address payable","name":"","type":"address"}],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":false,"inputs":[{"internalType":"address","name":"owner","type":"address"},{"internalType":"address","name":"dedgeCompoundManager","type":"address"},{"internalType":"bytes","name":"enterMarketCalldata","type":"bytes"}],"name":"buildAndEnterMarkets","outputs":[{"internalType":"address payable","name":"","type":"address"}],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":false,"inputs":[{"internalType":"address","name":"dedgeCompoundManager","type":"address"},{"internalType":"bytes","name":"enterMarketCalldata","type":"bytes"}],"name":"buildAndEnterMarkets","outputs":[{"internalType":"address payable","name":"","type":"address"}],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":true,"inputs":[],"name":"cache","outputs":[{"internalType":"contract DSProxyCache","name":"","type":"address"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[],"name":"dsGuardFactory","outputs":[{"internalType":"contract DSGuardFactory","name":"","type":"address"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[{"internalType":"address","name":"","type":"address"}],"name":"proxies","outputs":[{"internalType":"address","name":"","type":"address"}],"payable":false,"stateMutability":"view","type":"function"}]
Contract Creation Code
608060405234801561001057600080fd5b5060405161001d906100a8565b604051809103906000f080158015610039573d6000803e3d6000fd5b50600180546001600160a01b0319166001600160a01b0392909216919091179055604051610066906100b5565b604051809103906000f080158015610082573d6000803e3d6000fd5b50600280546001600160a01b0319166001600160a01b03929092169190911790556100c2565b610267806126e783390190565b610cb78061294e83390190565b612616806100d16000396000f3fe60806040523480156200001157600080fd5b5060043610620000885760003560e01c80638e1a55fc11620000635780638e1a55fc14620000df578063c455279114620000e9578063ddd2d6ac1462000100578063f3701da214620001175762000088565b80632e5c9848146200008d57806360c7d29514620000af5780636456568b14620000b9575b600080fd5b620000976200012e565b604051620000a6919062000a83565b60405180910390f35b620000976200013d565b620000d0620000ca3660046200089a565b6200014c565b604051620000a6919062000a20565b620000d06200049a565b620000d0620000fa36600462000871565b620004ac565b620000d06200011136600462000907565b620004c7565b620000d06200012836600462000871565b620004df565b6002546001600160a01b031681565b6001546001600160a01b031681565b6001600160a01b03838116600090815260208190526040812054909116156200019157506001600160a01b038084166000908152602081905260409020541662000493565b6001546040516000916001600160a01b031690620001af90620007a0565b620001bb919062000a20565b604051809103906000f080158015620001d8573d6000803e3d6000fd5b506001546040519192506001600160a01b038088169233927f259b30ca39885c6d801a0b5dbc988640f3c25e2f37531fe138c5c5af8955d41b92620002239287929091169062000a40565b60405180910390a3600254604080516365688cc960e01b815290516000926001600160a01b0316916365688cc991600480830192602092919082900301818787803b1580156200027257600080fd5b505af115801562000287573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250620002ad919081019062000998565b6040516313af403560e01b81529091506001600160a01b038216906313af403590620002de90859060040162000a30565b600060405180830381600087803b158015620002f957600080fd5b505af11580156200030e573d6000803e3d6000fd5b5050604051631cff79cd60e01b81526001600160a01b0385169250631cff79cd915062000342908890889060040162000a5f565b600060405180830381600087803b1580156200035d57600080fd5b505af115801562000372573d6000803e3d6000fd5b505050506040513d6000823e601f3d908101601f191682016040526200039c91908101906200095f565b50604051637a9e5e4b60e01b81526001600160a01b03831690637a9e5e4b90620003cb90849060040162000a83565b600060405180830381600087803b158015620003e657600080fd5b505af1158015620003fb573d6000803e3d6000fd5b50506040516313af403560e01b81526001600160a01b03851692506313af403591506200042d90899060040162000a20565b600060405180830381600087803b1580156200044857600080fd5b505af11580156200045d573d6000803e3d6000fd5b505050506001600160a01b03868116600090815260208190526040902080546001600160a01b0319169184169190911790555090505b9392505050565b6000620004a733620004df565b905090565b6000602081905290815260409020546001600160a01b031681565b6000620004d63384846200014c565b90505b92915050565b6001600160a01b03818116600090815260208190526040812054909116156200052457506001600160a01b03808216600090815260208190526040902054166200079b565b6001546040516000916001600160a01b0316906200054290620007a0565b6200054e919062000a20565b604051809103906000f0801580156200056b573d6000803e3d6000fd5b506001546040519192506001600160a01b038086169233927f259b30ca39885c6d801a0b5dbc988640f3c25e2f37531fe138c5c5af8955d41b92620005b69287929091169062000a40565b60405180910390a3600254604080516365688cc960e01b815290516000926001600160a01b0316916365688cc991600480830192602092919082900301818787803b1580156200060557600080fd5b505af11580156200061a573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525062000640919081019062000998565b6040516313af403560e01b81529091506001600160a01b038216906313af4035906200067190859060040162000a30565b600060405180830381600087803b1580156200068c57600080fd5b505af1158015620006a1573d6000803e3d6000fd5b5050604051637a9e5e4b60e01b81526001600160a01b0385169250637a9e5e4b9150620006d390849060040162000a83565b600060405180830381600087803b158015620006ee57600080fd5b505af115801562000703573d6000803e3d6000fd5b50506040516313af403560e01b81526001600160a01b03851692506313af403591506200073590879060040162000a20565b600060405180830381600087803b1580156200075057600080fd5b505af115801562000765573d6000803e3d6000fd5b505050506001600160a01b03848116600090815260208190526040902080546001600160a01b0319169184169190911790555090505b919050565b611a418062000b9383390190565b8035620004d98162000b6d565b600082601f830112620007cd57600080fd5b8135620007e4620007de8262000abb565b62000a93565b915080825260208301602083018583830111156200080157600080fd5b6200080e83828462000b24565b50505092915050565b600082601f8301126200082957600080fd5b81516200083a620007de8262000abb565b915080825260208301602083018583830111156200085757600080fd5b6200080e83828462000b30565b8051620004d98162000b87565b6000602082840312156200088457600080fd5b6000620008928484620007ae565b949350505050565b600080600060608486031215620008b057600080fd5b6000620008be8686620007ae565b9350506020620008d186828701620007ae565b925050604084013567ffffffffffffffff811115620008ef57600080fd5b620008fd86828701620007bb565b9150509250925092565b600080604083850312156200091b57600080fd5b6000620009298585620007ae565b925050602083013567ffffffffffffffff8111156200094757600080fd5b6200095585828601620007bb565b9150509250929050565b6000602082840312156200097257600080fd5b815167ffffffffffffffff8111156200098a57600080fd5b620008928482850162000817565b600060208284031215620009ab57600080fd5b600062000892848462000864565b620009c48162000b17565b82525050565b620009c48162000af1565b6000620009e28262000ae4565b620009ee818562000ae8565b935062000a0081856020860162000b30565b62000a0b8162000b63565b9093019392505050565b620009c48162000afe565b60208101620004d98284620009ca565b60208101620004d98284620009b9565b6040810162000a508285620009b9565b620004936020830184620009ca565b6040810162000a6f8285620009ca565b8181036020830152620008928184620009d5565b60208101620004d9828462000a15565b60405181810167ffffffffffffffff8111828210171562000ab357600080fd5b604052919050565b600067ffffffffffffffff82111562000ad357600080fd5b506020601f91909101601f19160190565b5190565b90815260200190565b6000620004d98262000b0b565b6000620004d98262000af1565b6001600160a01b031690565b6000620004d98262000afe565b82818337506000910152565b60005b8381101562000b4d57818101518382015260200162000b33565b8381111562000b5d576000848401525b50505050565b601f01601f191690565b62000b788162000af1565b811462000b8457600080fd5b50565b62000b788162000afe56fe6080604052600380546001600160a01b0319167324a42fd28c976a61df5d00d0599c34c4f90748c81790553480156200003757600080fd5b5060405162001a4138038062001a418339810160408190526200005a91620002a3565b600180546001600160a01b0319163390811782556040517fce241d7ca1f669fee44b6fc00b8eba2df3bb514eed0f6f668f8f89096e81ed9490600090a2620000ab816001600160e01b03620000ca16565b50620000c29050816001600160e01b03620000ca16565b5050620004ae565b6000620000ec336001600160e01b03198335166001600160e01b036200019f16565b620001145760405162461bcd60e51b81526004016200010b90620003ea565b60405180910390fd5b60405160043590602435903490829084903390600080356001600160e01b031916916200014591879136906200040e565b60405180910390a46001600160a01b038516620001765760405162461bcd60e51b81526004016200010b90620003fc565b600280546001600160a01b0387166001600160a01b031990911617905560019350505050919050565b60006001600160a01b038316301415620001bc5750600162000283565b6001546001600160a01b0384811691161415620001dc5750600162000283565b6000546001600160a01b0316620001f65750600062000283565b60005460405163b700961360e01b81526001600160a01b039091169063b7009613906200022c90869030908790600401620003bc565b60206040518083038186803b1580156200024557600080fd5b505afa1580156200025a573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250620002809190810190620002cc565b90505b92915050565b8051620002838162000489565b80516200028381620004a3565b600060208284031215620002b657600080fd5b6000620002c4848462000289565b949350505050565b600060208284031215620002df57600080fd5b6000620002c4848462000296565b620002f88162000445565b82525050565b620002f88162000457565b60006200031783856200043c565b93506200032683858462000473565b62000331836200047f565b9093019392505050565b60006200034a6014836200043c565b7f64732d617574682d756e617574686f72697a6564000000000000000000000000815260200192915050565b600062000385601f836200043c565b7f64732d70726f78792d63616368652d616464726573732d726571756972656400815260200192915050565b620002f88162000470565b60608101620003cc8286620002ed565b620003db6020830185620002ed565b620002c46040830184620002fe565b6020808252810162000283816200033b565b60208082528101620002838162000376565b604081016200041e8286620003b1565b81810360208301526200043381848662000309565b95945050505050565b90815260200190565b6000620002838262000464565b151590565b6001600160e01b03191690565b6001600160a01b031690565b90565b82818337506000910152565b601f01601f191690565b620004948162000445565b8114620004a057600080fd5b50565b620004948162000452565b61158380620004be6000396000f3fe6080604052600436106100915760003560e01c80638da5cb5b116100595780638da5cb5b1461013f578063948f507614610161578063bf7e214f1461018e578063c72c4d10146101a3578063ee872558146101b857610091565b806313af4035146100935780631cff79cd146100b35780631f6a1eb9146100dc57806360c7d295146100fd5780637a9e5e4b1461011f575b005b34801561009f57600080fd5b506100916100ae366004610f07565b6101d8565b6100c66100c1366004610f4b565b610263565b6040516100d39190611372565b60405180910390f35b6100ef6100ea366004611039565b610347565b6040516100d3929190611344565b34801561010957600080fd5b50610112610475565b6040516100d39190611383565b34801561012b57600080fd5b5061009161013a36600461106f565b610484565b34801561014b57600080fd5b50610154610502565b6040516100d391906112f3565b34801561016d57600080fd5b5061018161017c366004610f07565b610511565b6040516100d39190611364565b34801561019a57600080fd5b506101126105cb565b3480156101af57600080fd5b506101126105da565b3480156101c457600080fd5b506100916101d3366004610f9d565b6105e9565b6101ee336000356001600160e01b031916610a21565b6102135760405162461bcd60e51b815260040161020a90611391565b60405180910390fd5b600180546001600160a01b0319166001600160a01b0383811691909117918290556040519116907fce241d7ca1f669fee44b6fc00b8eba2df3bb514eed0f6f668f8f89096e81ed9490600090a250565b606061027b336000356001600160e01b031916610a21565b6102975760405162461bcd60e51b815260040161020a90611391565b60405160043590602435903490829084903390600080356001600160e01b031916916102c691879136906113ff565b60405180910390a46001600160a01b0386166102f45760405162461bcd60e51b815260040161020a906113c1565b600080865160208801896113885a03f43d6040519550601f19601f6020830101168601604052808652806000602088013e8115600181146103345761033b565b8160208801fd5b50505050505092915050565b6002546040516322fd145760e21b81526000916060916001600160a01b0390911690638bf4515c9061037d908790600401611372565b60206040518083038186803b15801561039557600080fd5b505afa1580156103a9573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052506103cd9190810190610f2d565b91506001600160a01b03821661046257600254604051633f6861d960e11b81526001600160a01b0390911690637ed0c3b29061040d908790600401611372565b602060405180830381600087803b15801561042757600080fd5b505af115801561043b573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525061045f9190810190610f2d565b91505b61046c8284610263565b90509250929050565b6002546001600160a01b031681565b61049a336000356001600160e01b031916610a21565b6104b65760405162461bcd60e51b815260040161020a90611391565b600080546001600160a01b0319166001600160a01b03838116919091178083556040519116917f1abebea81bfa2637f28358c371278fb15ede7ea8dd28d2e03b112ff6d936ada491a250565b6001546001600160a01b031681565b6000610529336000356001600160e01b031916610a21565b6105455760405162461bcd60e51b815260040161020a90611391565b60405160043590602435903490829084903390600080356001600160e01b0319169161057491879136906113ff565b60405180910390a46001600160a01b0385166105a25760405162461bcd60e51b815260040161020a906113e1565b600280546001600160a01b0387166001600160a01b031990911617905560019350505050919050565b6000546001600160a01b031681565b6003546001600160a01b031681565b6105ff336000356001600160e01b031916610a21565b61061b5760405162461bcd60e51b815260040161020a90611391565b600061062e84600263ffffffff610aff16565b9050600061067484848080601f016020809104026020016040519081016040528093929190818152602001838380828437600092019190915250600c9250610b41915050565b905060606106bd85858080601f0160208091040260200160405190810160405280939291908181526020018383808284376000920191909152506020925060049150610b779050565b9050606061070386868080601f01602080910402602001604051908101604052809392919081815260200183838082843760009201919091525060849250610c0c915050565b90506060828960405160200161071991906113f1565b6040516020818303038152906040528960405160200161073991906113f1565b6040516020818303038152906040528760405160200161075991906113f1565b60408051601f198184030181529082905261077b9493929187906020016112a1565b60405160208183030381529060405290506107968482610263565b5073eeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeee6001600160a01b038b1614156108b15773773ccbfb422850617a5680d40b1260422d072f416107e286600263ffffffff610aff16565b6040516107ee906112e8565b60006040518083038185875af1925050503d806000811461082b576040519150601f19603f3d011682016040523d82523d6000602084013e610830565b606091505b5073abccb8f0a3c206bb0468c52ccc20f3b81077417b915061085b905086600263ffffffff610aff16565b604051610867906112e8565b60006040518083038185875af1925050503d80600081146108a4576040519150601f19603f3d011682016040523d82523d6000602084013e6108a9565b606091505b5050506109fc565b6001600160a01b038a1663a9059cbb73773ccbfb422850617a5680d40b1260422d072f416108e688600263ffffffff610aff16565b6040518363ffffffff1660e01b8152600401610903929190611301565b602060405180830381600087803b15801561091d57600080fd5b505af1158015610931573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250610955919081019061101b565b506001600160a01b038a1663a9059cbb73abccb8f0a3c206bb0468c52ccc20f3b81077417b61098b88600263ffffffff610aff16565b6040518363ffffffff1660e01b81526004016109a8929190611301565b602060405180830381600087803b1580156109c257600080fd5b505af11580156109d6573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052506109fa919081019061101b565b505b610a158a610a108b8b63ffffffff610c3c16565b610c61565b50505050505050505050565b60006001600160a01b038316301415610a3c57506001610af9565b6001546001600160a01b0384811691161415610a5a57506001610af9565b6000546001600160a01b0316610a7257506000610af9565b60005460405163b700961360e01b81526001600160a01b039091169063b700961390610aa69086903090879060040161131c565b60206040518083038186803b158015610abe57600080fd5b505afa158015610ad2573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250610af6919081019061101b565b90505b92915050565b6000610af683836040518060400160405280601a81526020017f536166654d6174683a206469766973696f6e206279207a65726f000000000000815250610cf0565b60008160140183511015610b675760405162461bcd60e51b815260040161020a906113b1565b500160200151600160601b900490565b606081830184511015610b9c5760405162461bcd60e51b815260040161020a906113d1565b606082158015610bb757604051915060208201604052610c01565b6040519150601f8416801560200281840101858101878315602002848b0101015b81831015610bf0578051835260209283019201610bd8565b5050858452601f01601f1916604052505b5090505b9392505050565b606082518210610c2e5760405162461bcd60e51b815260040161020a906113d1565b610af6838384865103610b77565b600082820183811015610af65760405162461bcd60e51b815260040161020a906113a1565b6003546040805163076b7fbb60e51b815290516000926001600160a01b03169163ed6ff760916004808301926020929190829003018186803b158015610ca657600080fd5b505afa158015610cba573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250610cde9190810190610f2d565b9050610ceb818484610d27565b505050565b60008183610d115760405162461bcd60e51b815260040161020a9190611372565b506000838581610d1d57fe5b0495945050505050565b6001600160a01b03821673eeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeee1415610dad57826001600160a01b031681604051610d63906112e8565b60006040518083038185875af1925050503d8060008114610da0576040519150601f19603f3d011682016040523d82523d6000602084013e610da5565b606091505b505050610ceb565b60405163a9059cbb60e01b81526001600160a01b0383169063a9059cbb90610ddb9086908590600401611301565b602060405180830381600087803b158015610df557600080fd5b505af1158015610e09573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250610e2d919081019061101b565b50505050565b8035610af98161150e565b8051610af98161150e565b8051610af981611525565b60008083601f840112610e6657600080fd5b50813567ffffffffffffffff811115610e7e57600080fd5b602083019150836001820283011115610e9657600080fd5b9250929050565b600082601f830112610eae57600080fd5b8135610ec1610ebc82611450565b611429565b91508082526020830160208301858383011115610edd57600080fd5b610ee88382846114cc565b50505092915050565b8035610af98161152e565b8035610af981611537565b600060208284031215610f1957600080fd5b6000610f258484610e33565b949350505050565b600060208284031215610f3f57600080fd5b6000610f258484610e3e565b60008060408385031215610f5e57600080fd5b6000610f6a8585610e33565b925050602083013567ffffffffffffffff811115610f8757600080fd5b610f9385828601610e9d565b9150509250929050565b600080600080600060808688031215610fb557600080fd5b6000610fc18888610e33565b9550506020610fd288828901610efc565b9450506040610fe388828901610efc565b935050606086013567ffffffffffffffff81111561100057600080fd5b61100c88828901610e54565b92509250509295509295909350565b60006020828403121561102d57600080fd5b6000610f258484610e49565b6000806040838503121561104c57600080fd5b823567ffffffffffffffff81111561106357600080fd5b610f6a85828601610e9d565b60006020828403121561108157600080fd5b6000610f258484610ef1565b611096816114c1565b82525050565b6110968161148a565b61109681611495565b6110968161149a565b60006110c3838561147c565b93506110d08385846114cc565b6110d983611504565b9093019392505050565b60006110ee82611478565b6110f8818561147c565b93506111088185602086016114d8565b6110d981611504565b600061111c82611478565b6111268185611485565b93506111368185602086016114d8565b9290920192915050565b611096816114a7565b600061115660148361147c565b73191ccb585d5d1a0b5d5b985d5d1a1bdc9a5e995960621b815260200192915050565b6000611186601b8361147c565b7f536166654d6174683a206164646974696f6e206f766572666c6f770000000000815260200192915050565b60006111bf60128361147c565b7152656164206f7574206f6620626f756e647360701b815260200192915050565b60006111ed60208361147c565b7f64732d70726f78792d7461726765742d616464726573732d7265717569726564815260200192915050565b6000610af9600083611485565b600061123360188361147c565b7f62797465732d726561642d6f75742d6f662d626f756e64730000000000000000815260200192915050565b600061126c601f8361147c565b7f64732d70726f78792d63616368652d616464726573732d726571756972656400815260200192915050565b611096816114be565b60006112ad8288611111565b91506112b98287611111565b91506112c58286611111565b91506112d18285611111565b91506112dd8284611111565b979650505050505050565b6000610af982611219565b60208101610af9828461109c565b6040810161130f828561108d565b610c056020830184611298565b6060810161132a828661109c565b611337602083018561109c565b610f2560408301846110ae565b60408101611352828561109c565b8181036020830152610f2581846110e3565b60208101610af982846110a5565b60208082528101610af681846110e3565b60208101610af98284611140565b60208082528101610af981611149565b60208082528101610af981611179565b60208082528101610af9816111b2565b60208082528101610af9816111e0565b60208082528101610af981611226565b60208082528101610af98161125f565b60208101610af98284611298565b6040810161140d8286611298565b81810360208301526114208184866110b7565b95945050505050565b60405181810167ffffffffffffffff8111828210171561144857600080fd5b604052919050565b600067ffffffffffffffff82111561146757600080fd5b506020601f91909101601f19160190565b5190565b90815260200190565b919050565b6000610af9826114b2565b151590565b6001600160e01b03191690565b6000610af98261148a565b6001600160a01b031690565b90565b6000610af9826114a7565b82818337506000910152565b60005b838110156114f35781810151838201526020016114db565b83811115610e2d5750506000910152565b601f01601f191690565b6115178161148a565b811461152257600080fd5b50565b61151781611495565b611517816114a7565b611517816114be56fea365627a7a72315820a6b84d2d655704c44f5c72b00369357f2858993b7c2449cd7549f151ddacbefc6c6578706572696d656e74616cf564736f6c63430005100040a365627a7a723158202c82190e78029d2dbfee1661e7c94645a505c836d3d2469471b8eea8136182fa6c6578706572696d656e74616cf564736f6c63430005100040608060405234801561001057600080fd5b50610247806100206000396000f3fe608060405234801561001057600080fd5b50600436106100365760003560e01c80637ed0c3b21461003b5780638bf4515c14610064575b600080fd5b61004e610049366004610138565b610077565b60405161005b9190610184565b60405180910390f35b61004e610072366004610138565b6100c2565b60008151602083016000f09050803b156001811461003657508151602092830120600090815291829052604090912080546001600160a01b0319166001600160a01b03831617905590565b805160209182012060009081529081905260409020546001600160a01b031690565b600082601f8301126100f557600080fd5b8135610108610103826101bf565b610198565b9150808252602083016020830185838301111561012457600080fd5b61012f8382846101f8565b50505092915050565b60006020828403121561014a57600080fd5b813567ffffffffffffffff81111561016157600080fd5b61016d848285016100e4565b949350505050565b61017e816101e7565b82525050565b602081016101928284610175565b92915050565b60405181810167ffffffffffffffff811182821017156101b757600080fd5b604052919050565b600067ffffffffffffffff8211156101d657600080fd5b506020601f91909101601f19160190565b60006001600160a01b038216610192565b8281833750600091015256fea365627a7a72315820c3b5a839bbdfaed6259e68fe5779780fa1c8e2118f4278cc8ddced160c91afd86c6578706572696d656e74616cf564736f6c63430005100040608060405234801561001057600080fd5b50610c97806100206000396000f3fe608060405234801561001057600080fd5b50600436106100365760003560e01c8063489c12021461003b57806365688cc914610064575b600080fd5b61004e61004936600461015e565b610079565b60405161005b91906101b3565b60405180910390f35b61006c61008e565b60405161005b91906101c1565b60006020819052908152604090205460ff1681565b600060405161009c90610140565b604051809103906000f0801580156100b8573d6000803e3d6000fd5b506040516313af403560e01b81529091506001600160a01b038216906313af4035906100e89033906004016101a5565b600060405180830381600087803b15801561010257600080fd5b505af1158015610116573d6000803e3d6000fd5b5050506001600160a01b0382166000908152602081905260409020805460ff191660011790555090565b610a408061021583390190565b8035610158816101fd565b92915050565b60006020828403121561017057600080fd5b600061017c848461014d565b949350505050565b61018d816101eb565b82525050565b61018d816101da565b61018d816101f2565b602081016101588284610184565b602081016101588284610193565b60208101610158828461019c565b6000610158826101df565b151590565b6001600160a01b031690565b6000610158825b6000610158826101cf565b610206816101cf565b811461021157600080fd5b5056fe60806040819052600180546001600160a01b03191633908117909155907fce241d7ca1f669fee44b6fc00b8eba2df3bb514eed0f6f668f8f89096e81ed9490600090a26109ef806100516000396000f3fe608060405234801561001057600080fd5b506004361061009e5760003560e01c8063a8542f6611610066578063a8542f661461010f578063b700961314610124578063bf7e214f14610144578063cbeea68c14610159578063f0217ce51461016c5761009e565b806313af4035146100a35780632bc3217d146100b857806379d88d87146100cb5780637a9e5e4b146100de5780638da5cb5b146100f1575b600080fd5b6100b66100b136600461073a565b61017f565b005b6100b66100c6366004610760565b61020a565b6100b66100d936600461080e565b610234565b6100b66100ec366004610840565b6102bf565b6100f961033d565b60405161010691906108c1565b60405180910390f35b61011761034c565b6040516101069190610905565b6101376101323660046107ad565b610352565b60405161010691906108f7565b61014c610567565b6040516101069190610913565b6100b6610167366004610760565b610576565b6100b661017a36600461080e565b610597565b610195336000356001600160e01b031916610625565b6101ba5760405162461bcd60e51b81526004016101b190610921565b60405180910390fd5b600180546001600160a01b0319166001600160a01b0383811691909117918290556040519116907fce241d7ca1f669fee44b6fc00b8eba2df3bb514eed0f6f668f8f89096e81ed9490600090a250565b61022f8360601b6001600160601b0319168360601b6001600160601b03191683610234565b505050565b61024a336000356001600160e01b031916610625565b6102665760405162461bcd60e51b81526004016101b190610921565b60008381526002602090815260408083208584528252808320848452909152808220805460ff19169055518291849186917f95ba64c95d85e67ac83a0476c4a62ac2cf8ab2d0407545b8c9d79c3eefa6282991a4505050565b6102d5336000356001600160e01b031916610625565b6102f15760405162461bcd60e51b81526004016101b190610921565b600080546001600160a01b0319166001600160a01b03838116919091178083556040519116917f1abebea81bfa2637f28358c371278fb15ede7ea8dd28d2e03b112ff6d936ada491a250565b6001546001600160a01b031681565b60001981565b6bffffffffffffffffffffffff19606084811b821660008181526002602090815260408083209488901b9095168083529381528482206001600160e01b03198716835290529283205490919060ff16806103cf575060008281526002602090815260408083208484528252808320600019845290915290205460ff165b8061040757506000828152600260209081526040808320600019845282528083206001600160e01b03198816845290915290205460ff165b80610432575060008281526002602090815260408083206000198452825280832090915290205460ff165b8061047f575060008181527f38b5b2ceac7637132d27514ffcf440b705287635075af7b8bd5adcaa6a4cc5bb602090815260408083206001600160e01b03198816845290915290205460ff165b806104c4575060008181527f38b5b2ceac7637132d27514ffcf440b705287635075af7b8bd5adcaa6a4cc5bb60209081526040808320600019845290915290205460ff165b8061050757506001600160e01b0319841660009081527f47fa60fbc027ac3984ea309688a33182f4193c478b40ba8d294eb2cd3ddc4d97602052604090205460ff165b8061055d57506000196000527f47fa60fbc027ac3984ea309688a33182f4193c478b40ba8d294eb2cd3ddc4d976020527ff423d1317b37667cd26005728bffa7c8b0499e133951fcf8e814d4fc5f4c98f65460ff165b9695505050505050565b6000546001600160a01b031681565b61022f8360601b6001600160601b0319168360601b6001600160601b031916835b6105ad336000356001600160e01b031916610625565b6105c95760405162461bcd60e51b81526004016101b190610921565b60008381526002602090815260408083208584528252808320848452909152808220805460ff19166001179055518291849186917f6f50375045128971c5469d343039ba7b8e30a5b190453737b28bda6f7a30677191a4505050565b60006001600160a01b038316301415610640575060016106fd565b6001546001600160a01b038481169116141561065e575060016106fd565b6000546001600160a01b0316610676575060006106fd565b60005460405163b700961360e01b81526001600160a01b039091169063b7009613906106aa908690309087906004016108cf565b60206040518083038186803b1580156106c257600080fd5b505afa1580156106d6573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052506106fa91908101906107f0565b90505b92915050565b80356106fd81610971565b80516106fd81610988565b80356106fd81610991565b80356106fd8161099a565b80356106fd816109a3565b60006020828403121561074c57600080fd5b60006107588484610703565b949350505050565b60008060006060848603121561077557600080fd5b60006107818686610703565b935050602061079286828701610703565b92505060406107a386828701610719565b9150509250925092565b6000806000606084860312156107c257600080fd5b60006107ce8686610703565b93505060206107df86828701610703565b92505060406107a386828701610724565b60006020828403121561080257600080fd5b6000610758848461070e565b60008060006060848603121561082357600080fd5b600061082f8686610719565b935050602061079286828701610719565b60006020828403121561085257600080fd5b6000610758848461072f565b6108678161093a565b82525050565b61086781610945565b6108678161094a565b6108678161094d565b6108678161095a565b600061089e601483610931565b73191ccb585d5d1a0b5d5b985d5d1a1bdc9a5e995960621b815260200192915050565b602081016106fd828461085e565b606081016108dd828661085e565b6108ea602083018561085e565b610758604083018461087f565b602081016106fd828461086d565b602081016106fd8284610876565b602081016106fd8284610888565b602080825281016106fd81610891565b90815260200190565b60006106fd82610965565b151590565b90565b6001600160e01b03191690565b60006106fd8261093a565b6001600160a01b031690565b61097a8161093a565b811461098557600080fd5b50565b61097a81610945565b61097a8161094a565b61097a8161094d565b61097a8161095a56fea365627a7a72315820ba54699f795869872328ff49d813a3d8b10d917826dfb66dd5c8a4e5a5f790706c6578706572696d656e74616cf564736f6c63430005100040a365627a7a72315820a3b657af318a650499d8f24d4e7e6f5b5480637a37a5e65c2fb1895ba4f9021a6c6578706572696d656e74616cf564736f6c63430005100040
Deployed Bytecode
0x60806040523480156200001157600080fd5b5060043610620000885760003560e01c80638e1a55fc11620000635780638e1a55fc14620000df578063c455279114620000e9578063ddd2d6ac1462000100578063f3701da214620001175762000088565b80632e5c9848146200008d57806360c7d29514620000af5780636456568b14620000b9575b600080fd5b620000976200012e565b604051620000a6919062000a83565b60405180910390f35b620000976200013d565b620000d0620000ca3660046200089a565b6200014c565b604051620000a6919062000a20565b620000d06200049a565b620000d0620000fa36600462000871565b620004ac565b620000d06200011136600462000907565b620004c7565b620000d06200012836600462000871565b620004df565b6002546001600160a01b031681565b6001546001600160a01b031681565b6001600160a01b03838116600090815260208190526040812054909116156200019157506001600160a01b038084166000908152602081905260409020541662000493565b6001546040516000916001600160a01b031690620001af90620007a0565b620001bb919062000a20565b604051809103906000f080158015620001d8573d6000803e3d6000fd5b506001546040519192506001600160a01b038088169233927f259b30ca39885c6d801a0b5dbc988640f3c25e2f37531fe138c5c5af8955d41b92620002239287929091169062000a40565b60405180910390a3600254604080516365688cc960e01b815290516000926001600160a01b0316916365688cc991600480830192602092919082900301818787803b1580156200027257600080fd5b505af115801562000287573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250620002ad919081019062000998565b6040516313af403560e01b81529091506001600160a01b038216906313af403590620002de90859060040162000a30565b600060405180830381600087803b158015620002f957600080fd5b505af11580156200030e573d6000803e3d6000fd5b5050604051631cff79cd60e01b81526001600160a01b0385169250631cff79cd915062000342908890889060040162000a5f565b600060405180830381600087803b1580156200035d57600080fd5b505af115801562000372573d6000803e3d6000fd5b505050506040513d6000823e601f3d908101601f191682016040526200039c91908101906200095f565b50604051637a9e5e4b60e01b81526001600160a01b03831690637a9e5e4b90620003cb90849060040162000a83565b600060405180830381600087803b158015620003e657600080fd5b505af1158015620003fb573d6000803e3d6000fd5b50506040516313af403560e01b81526001600160a01b03851692506313af403591506200042d90899060040162000a20565b600060405180830381600087803b1580156200044857600080fd5b505af11580156200045d573d6000803e3d6000fd5b505050506001600160a01b03868116600090815260208190526040902080546001600160a01b0319169184169190911790555090505b9392505050565b6000620004a733620004df565b905090565b6000602081905290815260409020546001600160a01b031681565b6000620004d63384846200014c565b90505b92915050565b6001600160a01b03818116600090815260208190526040812054909116156200052457506001600160a01b03808216600090815260208190526040902054166200079b565b6001546040516000916001600160a01b0316906200054290620007a0565b6200054e919062000a20565b604051809103906000f0801580156200056b573d6000803e3d6000fd5b506001546040519192506001600160a01b038086169233927f259b30ca39885c6d801a0b5dbc988640f3c25e2f37531fe138c5c5af8955d41b92620005b69287929091169062000a40565b60405180910390a3600254604080516365688cc960e01b815290516000926001600160a01b0316916365688cc991600480830192602092919082900301818787803b1580156200060557600080fd5b505af11580156200061a573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525062000640919081019062000998565b6040516313af403560e01b81529091506001600160a01b038216906313af4035906200067190859060040162000a30565b600060405180830381600087803b1580156200068c57600080fd5b505af1158015620006a1573d6000803e3d6000fd5b5050604051637a9e5e4b60e01b81526001600160a01b0385169250637a9e5e4b9150620006d390849060040162000a83565b600060405180830381600087803b158015620006ee57600080fd5b505af115801562000703573d6000803e3d6000fd5b50506040516313af403560e01b81526001600160a01b03851692506313af403591506200073590879060040162000a20565b600060405180830381600087803b1580156200075057600080fd5b505af115801562000765573d6000803e3d6000fd5b505050506001600160a01b03848116600090815260208190526040902080546001600160a01b0319169184169190911790555090505b919050565b611a418062000b9383390190565b8035620004d98162000b6d565b600082601f830112620007cd57600080fd5b8135620007e4620007de8262000abb565b62000a93565b915080825260208301602083018583830111156200080157600080fd5b6200080e83828462000b24565b50505092915050565b600082601f8301126200082957600080fd5b81516200083a620007de8262000abb565b915080825260208301602083018583830111156200085757600080fd5b6200080e83828462000b30565b8051620004d98162000b87565b6000602082840312156200088457600080fd5b6000620008928484620007ae565b949350505050565b600080600060608486031215620008b057600080fd5b6000620008be8686620007ae565b9350506020620008d186828701620007ae565b925050604084013567ffffffffffffffff811115620008ef57600080fd5b620008fd86828701620007bb565b9150509250925092565b600080604083850312156200091b57600080fd5b6000620009298585620007ae565b925050602083013567ffffffffffffffff8111156200094757600080fd5b6200095585828601620007bb565b9150509250929050565b6000602082840312156200097257600080fd5b815167ffffffffffffffff8111156200098a57600080fd5b620008928482850162000817565b600060208284031215620009ab57600080fd5b600062000892848462000864565b620009c48162000b17565b82525050565b620009c48162000af1565b6000620009e28262000ae4565b620009ee818562000ae8565b935062000a0081856020860162000b30565b62000a0b8162000b63565b9093019392505050565b620009c48162000afe565b60208101620004d98284620009ca565b60208101620004d98284620009b9565b6040810162000a508285620009b9565b620004936020830184620009ca565b6040810162000a6f8285620009ca565b8181036020830152620008928184620009d5565b60208101620004d9828462000a15565b60405181810167ffffffffffffffff8111828210171562000ab357600080fd5b604052919050565b600067ffffffffffffffff82111562000ad357600080fd5b506020601f91909101601f19160190565b5190565b90815260200190565b6000620004d98262000b0b565b6000620004d98262000af1565b6001600160a01b031690565b6000620004d98262000afe565b82818337506000910152565b60005b8381101562000b4d57818101518382015260200162000b33565b8381111562000b5d576000848401525b50505050565b601f01601f191690565b62000b788162000af1565b811462000b8457600080fd5b50565b62000b788162000afe56fe6080604052600380546001600160a01b0319167324a42fd28c976a61df5d00d0599c34c4f90748c81790553480156200003757600080fd5b5060405162001a4138038062001a418339810160408190526200005a91620002a3565b600180546001600160a01b0319163390811782556040517fce241d7ca1f669fee44b6fc00b8eba2df3bb514eed0f6f668f8f89096e81ed9490600090a2620000ab816001600160e01b03620000ca16565b50620000c29050816001600160e01b03620000ca16565b5050620004ae565b6000620000ec336001600160e01b03198335166001600160e01b036200019f16565b620001145760405162461bcd60e51b81526004016200010b90620003ea565b60405180910390fd5b60405160043590602435903490829084903390600080356001600160e01b031916916200014591879136906200040e565b60405180910390a46001600160a01b038516620001765760405162461bcd60e51b81526004016200010b90620003fc565b600280546001600160a01b0387166001600160a01b031990911617905560019350505050919050565b60006001600160a01b038316301415620001bc5750600162000283565b6001546001600160a01b0384811691161415620001dc5750600162000283565b6000546001600160a01b0316620001f65750600062000283565b60005460405163b700961360e01b81526001600160a01b039091169063b7009613906200022c90869030908790600401620003bc565b60206040518083038186803b1580156200024557600080fd5b505afa1580156200025a573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250620002809190810190620002cc565b90505b92915050565b8051620002838162000489565b80516200028381620004a3565b600060208284031215620002b657600080fd5b6000620002c4848462000289565b949350505050565b600060208284031215620002df57600080fd5b6000620002c4848462000296565b620002f88162000445565b82525050565b620002f88162000457565b60006200031783856200043c565b93506200032683858462000473565b62000331836200047f565b9093019392505050565b60006200034a6014836200043c565b7f64732d617574682d756e617574686f72697a6564000000000000000000000000815260200192915050565b600062000385601f836200043c565b7f64732d70726f78792d63616368652d616464726573732d726571756972656400815260200192915050565b620002f88162000470565b60608101620003cc8286620002ed565b620003db6020830185620002ed565b620002c46040830184620002fe565b6020808252810162000283816200033b565b60208082528101620002838162000376565b604081016200041e8286620003b1565b81810360208301526200043381848662000309565b95945050505050565b90815260200190565b6000620002838262000464565b151590565b6001600160e01b03191690565b6001600160a01b031690565b90565b82818337506000910152565b601f01601f191690565b620004948162000445565b8114620004a057600080fd5b50565b620004948162000452565b61158380620004be6000396000f3fe6080604052600436106100915760003560e01c80638da5cb5b116100595780638da5cb5b1461013f578063948f507614610161578063bf7e214f1461018e578063c72c4d10146101a3578063ee872558146101b857610091565b806313af4035146100935780631cff79cd146100b35780631f6a1eb9146100dc57806360c7d295146100fd5780637a9e5e4b1461011f575b005b34801561009f57600080fd5b506100916100ae366004610f07565b6101d8565b6100c66100c1366004610f4b565b610263565b6040516100d39190611372565b60405180910390f35b6100ef6100ea366004611039565b610347565b6040516100d3929190611344565b34801561010957600080fd5b50610112610475565b6040516100d39190611383565b34801561012b57600080fd5b5061009161013a36600461106f565b610484565b34801561014b57600080fd5b50610154610502565b6040516100d391906112f3565b34801561016d57600080fd5b5061018161017c366004610f07565b610511565b6040516100d39190611364565b34801561019a57600080fd5b506101126105cb565b3480156101af57600080fd5b506101126105da565b3480156101c457600080fd5b506100916101d3366004610f9d565b6105e9565b6101ee336000356001600160e01b031916610a21565b6102135760405162461bcd60e51b815260040161020a90611391565b60405180910390fd5b600180546001600160a01b0319166001600160a01b0383811691909117918290556040519116907fce241d7ca1f669fee44b6fc00b8eba2df3bb514eed0f6f668f8f89096e81ed9490600090a250565b606061027b336000356001600160e01b031916610a21565b6102975760405162461bcd60e51b815260040161020a90611391565b60405160043590602435903490829084903390600080356001600160e01b031916916102c691879136906113ff565b60405180910390a46001600160a01b0386166102f45760405162461bcd60e51b815260040161020a906113c1565b600080865160208801896113885a03f43d6040519550601f19601f6020830101168601604052808652806000602088013e8115600181146103345761033b565b8160208801fd5b50505050505092915050565b6002546040516322fd145760e21b81526000916060916001600160a01b0390911690638bf4515c9061037d908790600401611372565b60206040518083038186803b15801561039557600080fd5b505afa1580156103a9573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052506103cd9190810190610f2d565b91506001600160a01b03821661046257600254604051633f6861d960e11b81526001600160a01b0390911690637ed0c3b29061040d908790600401611372565b602060405180830381600087803b15801561042757600080fd5b505af115801561043b573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525061045f9190810190610f2d565b91505b61046c8284610263565b90509250929050565b6002546001600160a01b031681565b61049a336000356001600160e01b031916610a21565b6104b65760405162461bcd60e51b815260040161020a90611391565b600080546001600160a01b0319166001600160a01b03838116919091178083556040519116917f1abebea81bfa2637f28358c371278fb15ede7ea8dd28d2e03b112ff6d936ada491a250565b6001546001600160a01b031681565b6000610529336000356001600160e01b031916610a21565b6105455760405162461bcd60e51b815260040161020a90611391565b60405160043590602435903490829084903390600080356001600160e01b0319169161057491879136906113ff565b60405180910390a46001600160a01b0385166105a25760405162461bcd60e51b815260040161020a906113e1565b600280546001600160a01b0387166001600160a01b031990911617905560019350505050919050565b6000546001600160a01b031681565b6003546001600160a01b031681565b6105ff336000356001600160e01b031916610a21565b61061b5760405162461bcd60e51b815260040161020a90611391565b600061062e84600263ffffffff610aff16565b9050600061067484848080601f016020809104026020016040519081016040528093929190818152602001838380828437600092019190915250600c9250610b41915050565b905060606106bd85858080601f0160208091040260200160405190810160405280939291908181526020018383808284376000920191909152506020925060049150610b779050565b9050606061070386868080601f01602080910402602001604051908101604052809392919081815260200183838082843760009201919091525060849250610c0c915050565b90506060828960405160200161071991906113f1565b6040516020818303038152906040528960405160200161073991906113f1565b6040516020818303038152906040528760405160200161075991906113f1565b60408051601f198184030181529082905261077b9493929187906020016112a1565b60405160208183030381529060405290506107968482610263565b5073eeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeee6001600160a01b038b1614156108b15773773ccbfb422850617a5680d40b1260422d072f416107e286600263ffffffff610aff16565b6040516107ee906112e8565b60006040518083038185875af1925050503d806000811461082b576040519150601f19603f3d011682016040523d82523d6000602084013e610830565b606091505b5073abccb8f0a3c206bb0468c52ccc20f3b81077417b915061085b905086600263ffffffff610aff16565b604051610867906112e8565b60006040518083038185875af1925050503d80600081146108a4576040519150601f19603f3d011682016040523d82523d6000602084013e6108a9565b606091505b5050506109fc565b6001600160a01b038a1663a9059cbb73773ccbfb422850617a5680d40b1260422d072f416108e688600263ffffffff610aff16565b6040518363ffffffff1660e01b8152600401610903929190611301565b602060405180830381600087803b15801561091d57600080fd5b505af1158015610931573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250610955919081019061101b565b506001600160a01b038a1663a9059cbb73abccb8f0a3c206bb0468c52ccc20f3b81077417b61098b88600263ffffffff610aff16565b6040518363ffffffff1660e01b81526004016109a8929190611301565b602060405180830381600087803b1580156109c257600080fd5b505af11580156109d6573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052506109fa919081019061101b565b505b610a158a610a108b8b63ffffffff610c3c16565b610c61565b50505050505050505050565b60006001600160a01b038316301415610a3c57506001610af9565b6001546001600160a01b0384811691161415610a5a57506001610af9565b6000546001600160a01b0316610a7257506000610af9565b60005460405163b700961360e01b81526001600160a01b039091169063b700961390610aa69086903090879060040161131c565b60206040518083038186803b158015610abe57600080fd5b505afa158015610ad2573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250610af6919081019061101b565b90505b92915050565b6000610af683836040518060400160405280601a81526020017f536166654d6174683a206469766973696f6e206279207a65726f000000000000815250610cf0565b60008160140183511015610b675760405162461bcd60e51b815260040161020a906113b1565b500160200151600160601b900490565b606081830184511015610b9c5760405162461bcd60e51b815260040161020a906113d1565b606082158015610bb757604051915060208201604052610c01565b6040519150601f8416801560200281840101858101878315602002848b0101015b81831015610bf0578051835260209283019201610bd8565b5050858452601f01601f1916604052505b5090505b9392505050565b606082518210610c2e5760405162461bcd60e51b815260040161020a906113d1565b610af6838384865103610b77565b600082820183811015610af65760405162461bcd60e51b815260040161020a906113a1565b6003546040805163076b7fbb60e51b815290516000926001600160a01b03169163ed6ff760916004808301926020929190829003018186803b158015610ca657600080fd5b505afa158015610cba573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250610cde9190810190610f2d565b9050610ceb818484610d27565b505050565b60008183610d115760405162461bcd60e51b815260040161020a9190611372565b506000838581610d1d57fe5b0495945050505050565b6001600160a01b03821673eeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeee1415610dad57826001600160a01b031681604051610d63906112e8565b60006040518083038185875af1925050503d8060008114610da0576040519150601f19603f3d011682016040523d82523d6000602084013e610da5565b606091505b505050610ceb565b60405163a9059cbb60e01b81526001600160a01b0383169063a9059cbb90610ddb9086908590600401611301565b602060405180830381600087803b158015610df557600080fd5b505af1158015610e09573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250610e2d919081019061101b565b50505050565b8035610af98161150e565b8051610af98161150e565b8051610af981611525565b60008083601f840112610e6657600080fd5b50813567ffffffffffffffff811115610e7e57600080fd5b602083019150836001820283011115610e9657600080fd5b9250929050565b600082601f830112610eae57600080fd5b8135610ec1610ebc82611450565b611429565b91508082526020830160208301858383011115610edd57600080fd5b610ee88382846114cc565b50505092915050565b8035610af98161152e565b8035610af981611537565b600060208284031215610f1957600080fd5b6000610f258484610e33565b949350505050565b600060208284031215610f3f57600080fd5b6000610f258484610e3e565b60008060408385031215610f5e57600080fd5b6000610f6a8585610e33565b925050602083013567ffffffffffffffff811115610f8757600080fd5b610f9385828601610e9d565b9150509250929050565b600080600080600060808688031215610fb557600080fd5b6000610fc18888610e33565b9550506020610fd288828901610efc565b9450506040610fe388828901610efc565b935050606086013567ffffffffffffffff81111561100057600080fd5b61100c88828901610e54565b92509250509295509295909350565b60006020828403121561102d57600080fd5b6000610f258484610e49565b6000806040838503121561104c57600080fd5b823567ffffffffffffffff81111561106357600080fd5b610f6a85828601610e9d565b60006020828403121561108157600080fd5b6000610f258484610ef1565b611096816114c1565b82525050565b6110968161148a565b61109681611495565b6110968161149a565b60006110c3838561147c565b93506110d08385846114cc565b6110d983611504565b9093019392505050565b60006110ee82611478565b6110f8818561147c565b93506111088185602086016114d8565b6110d981611504565b600061111c82611478565b6111268185611485565b93506111368185602086016114d8565b9290920192915050565b611096816114a7565b600061115660148361147c565b73191ccb585d5d1a0b5d5b985d5d1a1bdc9a5e995960621b815260200192915050565b6000611186601b8361147c565b7f536166654d6174683a206164646974696f6e206f766572666c6f770000000000815260200192915050565b60006111bf60128361147c565b7152656164206f7574206f6620626f756e647360701b815260200192915050565b60006111ed60208361147c565b7f64732d70726f78792d7461726765742d616464726573732d7265717569726564815260200192915050565b6000610af9600083611485565b600061123360188361147c565b7f62797465732d726561642d6f75742d6f662d626f756e64730000000000000000815260200192915050565b600061126c601f8361147c565b7f64732d70726f78792d63616368652d616464726573732d726571756972656400815260200192915050565b611096816114be565b60006112ad8288611111565b91506112b98287611111565b91506112c58286611111565b91506112d18285611111565b91506112dd8284611111565b979650505050505050565b6000610af982611219565b60208101610af9828461109c565b6040810161130f828561108d565b610c056020830184611298565b6060810161132a828661109c565b611337602083018561109c565b610f2560408301846110ae565b60408101611352828561109c565b8181036020830152610f2581846110e3565b60208101610af982846110a5565b60208082528101610af681846110e3565b60208101610af98284611140565b60208082528101610af981611149565b60208082528101610af981611179565b60208082528101610af9816111b2565b60208082528101610af9816111e0565b60208082528101610af981611226565b60208082528101610af98161125f565b60208101610af98284611298565b6040810161140d8286611298565b81810360208301526114208184866110b7565b95945050505050565b60405181810167ffffffffffffffff8111828210171561144857600080fd5b604052919050565b600067ffffffffffffffff82111561146757600080fd5b506020601f91909101601f19160190565b5190565b90815260200190565b919050565b6000610af9826114b2565b151590565b6001600160e01b03191690565b6000610af98261148a565b6001600160a01b031690565b90565b6000610af9826114a7565b82818337506000910152565b60005b838110156114f35781810151838201526020016114db565b83811115610e2d5750506000910152565b601f01601f191690565b6115178161148a565b811461152257600080fd5b50565b61151781611495565b611517816114a7565b611517816114be56fea365627a7a72315820a6b84d2d655704c44f5c72b00369357f2858993b7c2449cd7549f151ddacbefc6c6578706572696d656e74616cf564736f6c63430005100040a365627a7a723158202c82190e78029d2dbfee1661e7c94645a505c836d3d2469471b8eea8136182fa6c6578706572696d656e74616cf564736f6c63430005100040
Deployed Bytecode Sourcemap
39804:2624:0:-;;;;8:9:-1;5:2;;;30:1;27;20:12;5:2;39804:2624:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;40016:36;;;:::i;:::-;;;;;;;;;;;;;;;;39984:25;;;:::i;41501:924::-;;;;;;;;;:::i;:::-;;;;;;;;40258:100;;;:::i;39935:40::-;;;;;;;;;:::i;41240:253::-;;;;;;;;;:::i;40466:659::-;;;;;;;;;:::i;40016:36::-;;;-1:-1:-1;;;;;40016:36:0;;:::o;39984:25::-;;;-1:-1:-1;;;;;39984:25:0;;:::o;41501:924::-;-1:-1:-1;;;;;41759:14:0;;;41660:15;41759:14;;;;;;;;;;;41660:15;;41759:14;:28;41755:100;;-1:-1:-1;;;;;;41827:14:0;;;:7;:14;;;;;;;;;;;;41804:39;;41755:100;41920:5;;41899:28;;41867:21;;-1:-1:-1;;;;;41920:5:0;;41899:28;;;:::i;:::-;;;;;;;;;;;;;;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;-1:-1;41995:5:0;;41944:58;;41867:61;;-1:-1:-1;;;;;;41944:58:0;;;;41952:10;;41944:58;;;;41867:61;;41995:5;;;;41944:58;;;;;;;;;;42031:14;;:25;;;-1:-1:-1;;;42031:25:0;;;;42015:13;;-1:-1:-1;;;;;42031:14:0;;:23;;:25;;;;;;;;;;;;;;42015:13;42031:14;:25;;;5:2:-1;;;;30:1;27;20:12;5:2;42031:25:0;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;42031:25:0;;;;;;;101:4:-1;97:9;90:4;84;80:15;76:31;69:5;65:43;126:6;120:4;113:20;0:138;42031:25:0;;;;;;;;;42067:21;;-1:-1:-1;;;42067:21:0;;42015:41;;-1:-1:-1;;;;;;42067:14:0;;;;;:21;;42082:5;;42067:21;;;;;;;;;;;;;;;;;8:9:-1;5:2;;;30:1;27;20:12;5:2;42067:21:0;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;-1:-1;;42164:103:0;;-1:-1:-1;;;42164:103:0;;-1:-1:-1;;;;;42164:23:0;;;-1:-1:-1;42164:23:0;;-1:-1:-1;42164:103:0;;42202:20;;42237:19;;42164:103;;;;;;;;;;;;;;;;;8:9:-1;5:2;;;30:1;27;20:12;5:2;42164:103:0;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;42164:103:0;;;;;;39:16:-1;36:1;17:17;2:54;101:4;42164:103:0;80:15:-1;;;-1:-1;;76:31;65:43;;120:4;113:20;42164:103:0;;;;;;;;;-1:-1:-1;42280:35:0;;-1:-1:-1;;;42280:35:0;;-1:-1:-1;;;;;42280:28:0;;;;;:35;;42309:5;;42280:35;;;;;;;;;;;;;;;;;8:9:-1;5:2;;;30:1;27;20:12;5:2;42280:35:0;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;-1:-1;;42326:31:0;;-1:-1:-1;;;42326:31:0;;-1:-1:-1;;;;;42326:24:0;;;-1:-1:-1;42326:24:0;;-1:-1:-1;42326:31:0;;42351:5;;42326:31;;;;;;;;;;;;;;;;;8:9:-1;5:2;;;30:1;27;20:12;5:2;42326:31:0;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;-1:-1;;;;;;;;;42370:14:0;;;:7;:14;;;;;;;;;;:22;;-1:-1:-1;;;;;;42370:22:0;;;;;;;;;;-1:-1:-1;42370:22:0;-1:-1:-1;41501:924:0;;;;;;:::o;40258:100::-;40291:21;40333:17;40339:10;40333:5;:17::i;:::-;40325:25;;40258:100;:::o;39935:40::-;;;;;;;;;;;;;-1:-1:-1;;;;;39935:40:0;;:::o;41240:253::-;41375:15;41410:75;41431:10;41443:20;41465:19;41410:20;:75::i;:::-;41403:82;;41240:253;;;;;:::o;40466:659::-;-1:-1:-1;;;;;40611:14:0;;;40512:15;40611:14;;;;;;;;;;;40512:15;;40611:14;:28;40607:100;;-1:-1:-1;;;;;;40679:14:0;;;:7;:14;;;;;;;;;;;;40656:39;;40607:100;40772:5;;40751:28;;40719:21;;-1:-1:-1;;;;;40772:5:0;;40751:28;;;:::i;:::-;;;;;;;;;;;;;;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;-1:-1;40847:5:0;;40796:58;;40719:61;;-1:-1:-1;;;;;;40796:58:0;;;;40804:10;;40796:58;;;;40719:61;;40847:5;;;;40796:58;;;;;;;;;;40883:14;;:25;;;-1:-1:-1;;;40883:25:0;;;;40867:13;;-1:-1:-1;;;;;40883:14:0;;:23;;:25;;;;;;;;;;;;;;40867:13;40883:14;:25;;;5:2:-1;;;;30:1;27;20:12;5:2;40883:25:0;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;40883:25:0;;;;;;;101:4:-1;97:9;90:4;84;80:15;76:31;69:5;65:43;126:6;120:4;113:20;0:138;40883:25:0;;;;;;;;;40919:21;;-1:-1:-1;;;40919:21:0;;40867:41;;-1:-1:-1;;;;;;40919:14:0;;;;;:21;;40934:5;;40919:21;;;;;;;;;;;;;;;;;8:9:-1;5:2;;;30:1;27;20:12;5:2;40919:21:0;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;-1:-1;;40980:35:0;;-1:-1:-1;;;40980:35:0;;-1:-1:-1;;;;;40980:28:0;;;-1:-1:-1;40980:28:0;;-1:-1:-1;40980:35:0;;41009:5;;40980:35;;;;;;;;;;;;;;;;;8:9:-1;5:2;;;30:1;27;20:12;5:2;40980:35:0;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;-1:-1;;41026:31:0;;-1:-1:-1;;;41026:31:0;;-1:-1:-1;;;;;41026:24:0;;;-1:-1:-1;41026:24:0;;-1:-1:-1;41026:31:0;;41051:5;;41026:31;;;;;;;;;;;;;;;;;8:9:-1;5:2;;;30:1;27;20:12;5:2;41026:31:0;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;-1:-1;;;;;;;;;41070:14:0;;;:7;:14;;;;;;;;;;:22;;-1:-1:-1;;;;;;41070:22:0;;;;;;;;;;-1:-1:-1;41070:22:0;-1:-1:-1;40466:659:0;;;;:::o;39804:2624::-;;;;;;;;:::o;5:130:-1:-;72:20;;97:33;72:20;97:33;;143:440;;244:3;237:4;229:6;225:17;221:27;211:2;;262:1;259;252:12;211:2;299:6;286:20;321:64;336:48;377:6;336:48;;;321:64;;;312:73;;405:6;398:5;391:21;441:4;433:6;429:17;474:4;467:5;463:16;509:3;500:6;495:3;491:16;488:25;485:2;;;526:1;523;516:12;485:2;536:41;570:6;565:3;560;536:41;;;204:379;;;;;;;;592:442;;704:3;697:4;689:6;685:17;681:27;671:2;;722:1;719;712:12;671:2;752:6;746:13;774:64;789:48;830:6;789:48;;774:64;765:73;;858:6;851:5;844:21;894:4;886:6;882:17;927:4;920:5;916:16;962:3;953:6;948:3;944:16;941:25;938:2;;;979:1;976;969:12;938:2;989:39;1021:6;1016:3;1011;989:39;;1042:166;1136:13;;1154:49;1136:13;1154:49;;1215:241;;1319:2;1307:9;1298:7;1294:23;1290:32;1287:2;;;1335:1;1332;1325:12;1287:2;1370:1;1387:53;1432:7;1412:9;1387:53;;;1377:63;1281:175;-1:-1;;;;1281:175;1463:595;;;;1610:2;1598:9;1589:7;1585:23;1581:32;1578:2;;;1626:1;1623;1616:12;1578:2;1661:1;1678:53;1723:7;1703:9;1678:53;;;1668:63;;1640:97;1768:2;1786:53;1831:7;1822:6;1811:9;1807:22;1786:53;;;1776:63;;1747:98;1904:2;1893:9;1889:18;1876:32;1928:18;1920:6;1917:30;1914:2;;;1960:1;1957;1950:12;1914:2;1980:62;2034:7;2025:6;2014:9;2010:22;1980:62;;;1970:72;;1855:193;1572:486;;;;;;2065:470;;;2195:2;2183:9;2174:7;2170:23;2166:32;2163:2;;;2211:1;2208;2201:12;2163:2;2246:1;2263:53;2308:7;2288:9;2263:53;;;2253:63;;2225:97;2381:2;2370:9;2366:18;2353:32;2405:18;2397:6;2394:30;2391:2;;;2437:1;2434;2427:12;2391:2;2457:62;2511:7;2502:6;2491:9;2487:22;2457:62;;;2447:72;;2332:193;2157:378;;;;;;2542:360;;2666:2;2654:9;2645:7;2641:23;2637:32;2634:2;;;2682:1;2679;2672:12;2634:2;2717:24;;2761:18;2750:30;;2747:2;;;2793:1;2790;2783:12;2747:2;2813:73;2878:7;2869:6;2858:9;2854:22;2813:73;;2909:295;;3040:2;3028:9;3019:7;3015:23;3011:32;3008:2;;;3056:1;3053;3046:12;3008:2;3091:1;3108:80;3180:7;3160:9;3108:80;;3211:142;3302:45;3341:5;3302:45;;;3297:3;3290:58;3284:69;;;3360:137;3459:32;3485:5;3459:32;;3624:343;;3734:38;3766:5;3734:38;;;3784:70;3847:6;3842:3;3784:70;;;3777:77;;3859:52;3904:6;3899:3;3892:4;3885:5;3881:16;3859:52;;;3932:29;3954:6;3932:29;;;3923:39;;;;3714:253;-1:-1;;;3714:253;3974:172;4080:60;4134:5;4080:60;;4493:213;4611:2;4596:18;;4625:71;4600:9;4669:6;4625:71;;4713:229;4839:2;4824:18;;4853:79;4828:9;4905:6;4853:79;;5201:340;5355:2;5340:18;;5369:79;5344:9;5421:6;5369:79;;;5459:72;5527:2;5516:9;5512:18;5503:6;5459:72;;5548:408;5712:2;5697:18;;5726:71;5701:9;5770:6;5726:71;;;5845:9;5839:4;5835:20;5830:2;5819:9;5815:18;5808:48;5870:76;5941:4;5932:6;5870:76;;5963:259;6104:2;6089:18;;6118:94;6093:9;6185:6;6118:94;;6743:256;6805:2;6799:9;6831:17;;;6906:18;6891:34;;6927:22;;;6888:62;6885:2;;;6963:1;6960;6953:12;6885:2;6979;6972:22;6783:216;;-1:-1;6783:216;7006:321;;7149:18;7141:6;7138:30;7135:2;;;7181:1;7178;7171:12;7135:2;-1:-1;7312:4;7248;7225:17;;;;-1:-1;;7221:33;7302:15;;7072:255;7334:121;7421:12;;7392:63;7463:162;7565:19;;;7614:4;7605:14;;7558:67;7633:91;;7695:24;7713:5;7695:24;;7837:107;;7915:24;7933:5;7915:24;;7951:121;-1:-1;;;;;8013:54;;7996:76;8079:129;;8166:37;8197:5;8166:37;;9368:145;9449:6;9444:3;9439;9426:30;-1:-1;9505:1;9487:16;;9480:27;9419:94;9522:268;9587:1;9594:101;9608:6;9605:1;9602:13;9594:101;;;9675:11;;;9669:18;9656:11;;;9649:39;9630:2;9623:10;9594:101;;;9710:6;9707:1;9704:13;9701:2;;;9775:1;9766:6;9761:3;9757:16;9750:27;9701:2;9571:219;;;;;9798:97;9886:2;9866:14;-1:-1;;9862:28;;9846:49;9903:117;9972:24;9990:5;9972:24;;;9965:5;9962:35;9952:2;;10011:1;10008;10001:12;9952:2;9946:74;;10027:149;10112:40;10146:5;10112:40;
Swarm Source
bzzr://a3b657af318a650499d8f24d4e7e6f5b5480637a37a5e65c2fb1895ba4f9021a
Loading...
Loading
Loading...
Loading
Multichain Portfolio | 31 Chains
Chain | Token | Portfolio % | Price | Amount | Value |
---|
Loading...
Loading
[ Download: CSV Export ]
[ 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.