More Info
Private Name Tags
ContractCreator
Latest 25 from a total of 197 transactions
Transaction Hash |
Method
|
Block
|
From
|
To
|
|||||
---|---|---|---|---|---|---|---|---|---|
Liquidate Unclos... | 10539751 | 1645 days ago | IN | 0 ETH | 0.05029927 | ||||
Liquidate Unclos... | 10539704 | 1645 days ago | IN | 0 ETH | 0.00545613 | ||||
Liquidate Unclos... | 10539671 | 1645 days ago | IN | 0 ETH | 0.03976567 | ||||
Liquidate Unclos... | 10539626 | 1645 days ago | IN | 0 ETH | 0.03528652 | ||||
Liquidate Unclos... | 10539611 | 1645 days ago | IN | 0 ETH | 0.04278348 | ||||
Close Loan | 10449896 | 1659 days ago | IN | 0 ETH | 0.01550711 | ||||
Close Loan | 10343515 | 1676 days ago | IN | 0 ETH | 0.00884191 | ||||
Close Loan | 10314245 | 1680 days ago | IN | 0 ETH | 0.01294935 | ||||
Close Loan | 10314161 | 1680 days ago | IN | 0 ETH | 0.01252737 | ||||
Close Loan | 10298715 | 1683 days ago | IN | 0 ETH | 0.00703344 | ||||
Close Loan | 10251160 | 1690 days ago | IN | 0 ETH | 0.01024177 | ||||
Close Loan | 10177052 | 1702 days ago | IN | 0 ETH | 0.00686281 | ||||
Close Loan | 10167254 | 1703 days ago | IN | 0 ETH | 0.01170715 | ||||
Close Loan | 10137455 | 1708 days ago | IN | 0 ETH | 0.00667022 | ||||
Close Loan | 10118400 | 1711 days ago | IN | 0 ETH | 0.00605542 | ||||
Close Loan | 10091079 | 1715 days ago | IN | 0 ETH | 0.0099604 | ||||
Close Loan | 10091067 | 1715 days ago | IN | 0 ETH | 0.01561659 | ||||
Close Loan | 10039902 | 1723 days ago | IN | 0 ETH | 0.00806862 | ||||
Close Loan | 9950268 | 1737 days ago | IN | 0 ETH | 0.00007043 | ||||
Close Loan | 9950268 | 1737 days ago | IN | 0 ETH | 0.0009632 | ||||
Close Loan | 9935392 | 1739 days ago | IN | 0 ETH | 0.00608493 | ||||
Close Loan | 9935003 | 1739 days ago | IN | 0 ETH | 0.00422149 | ||||
Close Loan | 9934968 | 1739 days ago | IN | 0 ETH | 0.00549894 | ||||
Close Loan | 9909805 | 1743 days ago | IN | 0 ETH | 0.00488403 | ||||
Close Loan | 9909750 | 1743 days ago | IN | 0 ETH | 0.00580046 |
Latest 25 internal transactions (View All)
Advanced mode:
Parent Transaction Hash | Block |
From
|
To
|
|||
---|---|---|---|---|---|---|
10539751 | 1645 days ago | 98.30419689 ETH | ||||
10539751 | 1645 days ago | 1.6958031 ETH | ||||
10539671 | 1645 days ago | 49.15219532 ETH | ||||
10539671 | 1645 days ago | 0.84780467 ETH | ||||
10539626 | 1645 days ago | 1.47495944 ETH | ||||
10539626 | 1645 days ago | 0.02504055 ETH | ||||
10539611 | 1645 days ago | 0.98366491 ETH | ||||
10539611 | 1645 days ago | 0.01633508 ETH | ||||
10449896 | 1659 days ago | 147.69083856 ETH | ||||
10449896 | 1659 days ago | 2.30916143 ETH | ||||
10343515 | 1676 days ago | 0.89165712 ETH | ||||
10343515 | 1676 days ago | 0.10834287 ETH | ||||
10314245 | 1680 days ago | 8.81107113 ETH | ||||
10314245 | 1680 days ago | 0.18892886 ETH | ||||
10314161 | 1680 days ago | 14.67419552 ETH | ||||
10314161 | 1680 days ago | 0.32580447 ETH | ||||
10298715 | 1683 days ago | 7.7977466 ETH | ||||
10298715 | 1683 days ago | 0.20225339 ETH | ||||
10251160 | 1690 days ago | 1.57848285 ETH | ||||
10251160 | 1690 days ago | 0.02151714 ETH | ||||
10177052 | 1702 days ago | 2.96283995 ETH | ||||
10177052 | 1702 days ago | 0.03716004 ETH | ||||
10167254 | 1703 days ago | 0.98760587 ETH | ||||
10167254 | 1703 days ago | 0.01239412 ETH | ||||
10137455 | 1708 days ago | 0.99064273 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:
EtherCollateral
Compiler Version
v0.4.25+commit.59dbf8f1
Optimization Enabled:
Yes with 200 runs
Other Settings:
default evmVersion
Contract Source Code (Solidity)
/** *Submitted for verification at Etherscan.io on 2020-02-20 */ /* * Synthetix - EtherCollateral.sol * * https://github.com/Synthetixio/synthetix * https://synthetix.io * * MIT License * =========== * * Copyright (c) 2020 Synthetix * * Permission is hereby granted, free of charge, to any person obtaining a copy * of this software and associated documentation files (the "Software"), to deal * in the Software without restriction, including without limitation the rights * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell * copies of the Software, and to permit persons to whom the Software is * furnished to do so, subject to the following conditions: * * The above copyright notice and this permission notice shall be included in all * copies or substantial portions of the Software. * * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE */ /* =============================================== * Flattened with Solidifier by Coinage * * https://solidifier.coina.ge * =============================================== */ pragma solidity ^0.4.24; /** * @title Helps contracts guard against reentrancy attacks. * @author Remco Bloemen <remco@2π.com>, Eenae <[email protected]> * @dev If you mark a function `nonReentrant`, you should also * mark it `external`. */ contract ReentrancyGuard { /// @dev counter to allow mutex lock with only one SSTORE operation uint256 private _guardCounter; constructor() internal { // The counter starts at one to prevent changing it from zero to a non-zero // value, which is a more expensive operation. _guardCounter = 1; } /** * @dev Prevents a contract from calling itself, directly or indirectly. * Calling a `nonReentrant` function from another `nonReentrant` * function is not supported. It is possible to prevent this from happening * by making the `nonReentrant` function external, and make it call a * `private` function that does the actual work. */ modifier nonReentrant() { _guardCounter += 1; uint256 localCounter = _guardCounter; _; require(localCounter == _guardCounter); } } /* ----------------------------------------------------------------- FILE INFORMATION ----------------------------------------------------------------- file: Owned.sol version: 1.1 author: Anton Jurisevic Dominic Romanowski date: 2018-2-26 ----------------------------------------------------------------- MODULE DESCRIPTION ----------------------------------------------------------------- An Owned contract, to be inherited by other contracts. Requires its owner to be explicitly set in the constructor. Provides an onlyOwner access modifier. To change owner, the current owner must nominate the next owner, who then has to accept the nomination. The nomination can be cancelled before it is accepted by the new owner by having the previous owner change the nomination (setting it to 0). ----------------------------------------------------------------- */ /** * @title A contract with an owner. * @notice Contract ownership can be transferred by first nominating the new owner, * who must then accept the ownership, which prevents accidental incorrect ownership transfers. */ contract Owned { address public owner; address public nominatedOwner; /** * @dev Owned Constructor */ constructor(address _owner) public { require(_owner != address(0), "Owner address cannot be 0"); owner = _owner; emit OwnerChanged(address(0), _owner); } /** * @notice Nominate a new owner of this contract. * @dev Only the current owner may nominate a new owner. */ function nominateNewOwner(address _owner) external onlyOwner { nominatedOwner = _owner; emit OwnerNominated(_owner); } /** * @notice Accept the nomination to be owner. */ function acceptOwnership() external { require(msg.sender == nominatedOwner, "You must be nominated before you can accept ownership"); emit OwnerChanged(owner, nominatedOwner); owner = nominatedOwner; nominatedOwner = address(0); } modifier onlyOwner { require(msg.sender == owner, "Only the contract owner may perform this action"); _; } event OwnerNominated(address newOwner); event OwnerChanged(address oldOwner, address newOwner); } /* ----------------------------------------------------------------- FILE INFORMATION ----------------------------------------------------------------- file: Pausable.sol version: 1.0 author: Kevin Brown date: 2018-05-22 ----------------------------------------------------------------- MODULE DESCRIPTION ----------------------------------------------------------------- This contract allows an inheriting contract to be marked as paused. It also defines a modifier which can be used by the inheriting contract to prevent actions while paused. ----------------------------------------------------------------- */ /** * @title A contract that can be paused by its owner */ contract Pausable is Owned { uint public lastPauseTime; bool public paused; /** * @dev Constructor * @param _owner The account which controls this contract. */ constructor(address _owner) public Owned(_owner) { // Paused will be false, and lastPauseTime will be 0 upon initialisation } /** * @notice Change the paused state of the contract * @dev Only the contract owner may call this. */ function setPaused(bool _paused) external onlyOwner { // Ensure we're actually changing the state before we do anything if (_paused == paused) { return; } // Set our paused state. paused = _paused; // If applicable, set the last pause time. if (paused) { lastPauseTime = now; } // Let everyone know that our pause state has changed. emit PauseChanged(paused); } event PauseChanged(bool isPaused); modifier notPaused { require(!paused, "This action cannot be performed while the contract is paused"); _; } } /** * @title SafeMath * @dev Math operations with safety checks that revert on error */ library SafeMath { /** * @dev Multiplies two numbers, reverts on 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-solidity/pull/522 if (a == 0) { return 0; } uint256 c = a * b; require(c / a == b, "SafeMath.mul Error"); return c; } /** * @dev Integer division of two numbers truncating the quotient, reverts on division by zero. */ function div(uint256 a, uint256 b) internal pure returns (uint256) { require(b > 0, "SafeMath.div Error"); // Solidity only automatically asserts when dividing by 0 uint256 c = a / b; // assert(a == b * c + a % b); // There is no case in which this doesn't hold return c; } /** * @dev Subtracts two numbers, reverts on overflow (i.e. if subtrahend is greater than minuend). */ function sub(uint256 a, uint256 b) internal pure returns (uint256) { require(b <= a, "SafeMath.sub Error"); uint256 c = a - b; return c; } /** * @dev Adds two numbers, reverts on overflow. */ function add(uint256 a, uint256 b) internal pure returns (uint256) { uint256 c = a + b; require(c >= a, "SafeMath.add Error"); return c; } /** * @dev Divides two numbers and returns the remainder (unsigned integer modulo), * reverts when dividing by zero. */ function mod(uint256 a, uint256 b) internal pure returns (uint256) { require(b != 0, "SafeMath.mod Error"); return a % b; } } /* ----------------------------------------------------------------- FILE INFORMATION ----------------------------------------------------------------- file: SafeDecimalMath.sol version: 2.0 author: Kevin Brown Gavin Conway date: 2018-10-18 ----------------------------------------------------------------- MODULE DESCRIPTION ----------------------------------------------------------------- A library providing safe mathematical operations for division and multiplication with the capability to round or truncate the results to the nearest increment. Operations can return a standard precision or high precision decimal. High precision decimals are useful for example when attempting to calculate percentages or fractions accurately. ----------------------------------------------------------------- */ /** * @title Safely manipulate unsigned fixed-point decimals at a given precision level. * @dev Functions accepting uints in this contract and derived contracts * are taken to be such fixed point decimals of a specified precision (either standard * or high). */ library SafeDecimalMath { using SafeMath for uint; /* Number of decimal places in the representations. */ uint8 public constant decimals = 18; uint8 public constant highPrecisionDecimals = 27; /* The number representing 1.0. */ uint public constant UNIT = 10**uint(decimals); /* The number representing 1.0 for higher fidelity numbers. */ uint public constant PRECISE_UNIT = 10**uint(highPrecisionDecimals); uint private constant UNIT_TO_HIGH_PRECISION_CONVERSION_FACTOR = 10**uint(highPrecisionDecimals - decimals); /** * @return Provides an interface to UNIT. */ function unit() external pure returns (uint) { return UNIT; } /** * @return Provides an interface to PRECISE_UNIT. */ function preciseUnit() external pure returns (uint) { return PRECISE_UNIT; } /** * @return The result of multiplying x and y, interpreting the operands as fixed-point * decimals. * * @dev A unit factor is divided out after the product of x and y is evaluated, * so that product must be less than 2**256. As this is an integer division, * the internal division always rounds down. This helps save on gas. Rounding * is more expensive on gas. */ function multiplyDecimal(uint x, uint y) internal pure returns (uint) { /* Divide by UNIT to remove the extra factor introduced by the product. */ return x.mul(y) / UNIT; } /** * @return The result of safely multiplying x and y, interpreting the operands * as fixed-point decimals of the specified precision unit. * * @dev The operands should be in the form of a the specified unit factor which will be * divided out after the product of x and y is evaluated, so that product must be * less than 2**256. * * Unlike multiplyDecimal, this function rounds the result to the nearest increment. * Rounding is useful when you need to retain fidelity for small decimal numbers * (eg. small fractions or percentages). */ function _multiplyDecimalRound(uint x, uint y, uint precisionUnit) private pure returns (uint) { /* Divide by UNIT to remove the extra factor introduced by the product. */ uint quotientTimesTen = x.mul(y) / (precisionUnit / 10); if (quotientTimesTen % 10 >= 5) { quotientTimesTen += 10; } return quotientTimesTen / 10; } /** * @return The result of safely multiplying x and y, interpreting the operands * as fixed-point decimals of a precise unit. * * @dev The operands should be in the precise unit factor which will be * divided out after the product of x and y is evaluated, so that product must be * less than 2**256. * * Unlike multiplyDecimal, this function rounds the result to the nearest increment. * Rounding is useful when you need to retain fidelity for small decimal numbers * (eg. small fractions or percentages). */ function multiplyDecimalRoundPrecise(uint x, uint y) internal pure returns (uint) { return _multiplyDecimalRound(x, y, PRECISE_UNIT); } /** * @return The result of safely multiplying x and y, interpreting the operands * as fixed-point decimals of a standard unit. * * @dev The operands should be in the standard unit factor which will be * divided out after the product of x and y is evaluated, so that product must be * less than 2**256. * * Unlike multiplyDecimal, this function rounds the result to the nearest increment. * Rounding is useful when you need to retain fidelity for small decimal numbers * (eg. small fractions or percentages). */ function multiplyDecimalRound(uint x, uint y) internal pure returns (uint) { return _multiplyDecimalRound(x, y, UNIT); } /** * @return The result of safely dividing x and y. The return value is a high * precision decimal. * * @dev y is divided after the product of x and the standard precision unit * is evaluated, so the product of x and UNIT must be less than 2**256. As * this is an integer division, the result is always rounded down. * This helps save on gas. Rounding is more expensive on gas. */ function divideDecimal(uint x, uint y) internal pure returns (uint) { /* Reintroduce the UNIT factor that will be divided out by y. */ return x.mul(UNIT).div(y); } /** * @return The result of safely dividing x and y. The return value is as a rounded * decimal in the precision unit specified in the parameter. * * @dev y is divided after the product of x and the specified precision unit * is evaluated, so the product of x and the specified precision unit must * be less than 2**256. The result is rounded to the nearest increment. */ function _divideDecimalRound(uint x, uint y, uint precisionUnit) private pure returns (uint) { uint resultTimesTen = x.mul(precisionUnit * 10).div(y); if (resultTimesTen % 10 >= 5) { resultTimesTen += 10; } return resultTimesTen / 10; } /** * @return The result of safely dividing x and y. The return value is as a rounded * standard precision decimal. * * @dev y is divided after the product of x and the standard precision unit * is evaluated, so the product of x and the standard precision unit must * be less than 2**256. The result is rounded to the nearest increment. */ function divideDecimalRound(uint x, uint y) internal pure returns (uint) { return _divideDecimalRound(x, y, UNIT); } /** * @return The result of safely dividing x and y. The return value is as a rounded * high precision decimal. * * @dev y is divided after the product of x and the high precision unit * is evaluated, so the product of x and the high precision unit must * be less than 2**256. The result is rounded to the nearest increment. */ function divideDecimalRoundPrecise(uint x, uint y) internal pure returns (uint) { return _divideDecimalRound(x, y, PRECISE_UNIT); } /** * @dev Convert a standard decimal representation to a high precision one. */ function decimalToPreciseDecimal(uint i) internal pure returns (uint) { return i.mul(UNIT_TO_HIGH_PRECISION_CONVERSION_FACTOR); } /** * @dev Convert a high precision decimal to a standard decimal representation. */ function preciseDecimalToDecimal(uint i) internal pure returns (uint) { uint quotientTimesTen = i / (UNIT_TO_HIGH_PRECISION_CONVERSION_FACTOR / 10); if (quotientTimesTen % 10 >= 5) { quotientTimesTen += 10; } return quotientTimesTen / 10; } } /** * @title FeePool Interface * @notice Abstract contract to hold public getters */ contract IFeePool { address public FEE_ADDRESS; uint public exchangeFeeRate; function amountReceivedFromExchange(uint value) external view returns (uint); function amountReceivedFromTransfer(uint value) external view returns (uint); function recordFeePaid(uint sUSDAmount) external; function appendAccountIssuanceRecord(address account, uint lockedAmount, uint debtEntryIndex) external; function setRewardsToDistribute(uint amount) external; } interface ISynth { function burn(address account, uint amount) external; function issue(address account, uint amount) external; function transfer(address to, uint value) external returns (bool); function transferFrom(address from, address to, uint value) external returns (bool); function transferFromAndSettle(address from, address to, uint value) external returns (bool); function balanceOf(address owner) external view returns (uint); } /** * @title ERC20 interface * @dev see https://github.com/ethereum/EIPs/issues/20 */ contract IERC20 { function totalSupply() public view returns (uint); function balanceOf(address owner) public view returns (uint); function allowance(address owner, address spender) public view returns (uint); function transfer(address to, uint value) public returns (bool); function approve(address spender, uint value) public returns (bool); function transferFrom(address from, address to, uint value) public returns (bool); // ERC20 Optional function name() public view returns (string); function symbol() public view returns (string); function decimals() public view returns (uint8); event Transfer(address indexed from, address indexed to, uint value); event Approval(address indexed owner, address indexed spender, uint value); } /** * @title Synthetix Depot interface */ contract IDepot { function exchangeEtherForSynths() public payable returns (uint); function exchangeEtherForSynthsAtRate(uint guaranteedRate) external payable returns (uint); function depositSynths(uint amount) external; function withdrawMyDepositedSynths() external; // Deprecated ABI for MAINNET. Only used on Testnets function exchangeEtherForSNX() external payable returns (uint); function exchangeEtherForSNXAtRate(uint guaranteedRate) external payable returns (uint); function exchangeSynthsForSNX() external payable returns (uint); } contract AddressResolver is Owned { mapping(bytes32 => address) public repository; constructor(address _owner) public Owned(_owner) {} /* ========== MUTATIVE FUNCTIONS ========== */ function importAddresses(bytes32[] names, address[] destinations) public onlyOwner { require(names.length == destinations.length, "Input lengths must match"); for (uint i = 0; i < names.length; i++) { repository[names[i]] = destinations[i]; } } /* ========== VIEWS ========== */ function getAddress(bytes32 name) public view returns (address) { return repository[name]; } function requireAndGetAddress(bytes32 name, string reason) public view returns (address) { address _foundAddress = repository[name]; require(_foundAddress != address(0), reason); return _foundAddress; } } contract MixinResolver is Owned { AddressResolver public resolver; constructor(address _owner, address _resolver) public Owned(_owner) { resolver = AddressResolver(_resolver); } /* ========== SETTERS ========== */ function setResolver(AddressResolver _resolver) public onlyOwner { resolver = _resolver; } } contract EtherCollateral is Owned, Pausable, ReentrancyGuard, MixinResolver { using SafeMath for uint256; using SafeDecimalMath for uint256; // ========== CONSTANTS ========== uint256 constant ONE_THOUSAND = SafeDecimalMath.unit() * 1000; uint256 constant ONE_HUNDRED = SafeDecimalMath.unit() * 100; uint256 constant SECONDS_IN_A_YEAR = 31536000; // Common Year // Where fees are pooled in sUSD. address constant FEE_ADDRESS = 0xfeEFEEfeefEeFeefEEFEEfEeFeefEEFeeFEEFEeF; // ========== SETTER STATE VARIABLES ========== // The ratio of Collateral to synths issued uint256 public collateralizationRatio = SafeDecimalMath.unit() * 150; // If updated, all outstanding loans will pay this interest rate in on closure of the loan. Default 5% uint256 public interestRate = (5 * SafeDecimalMath.unit()) / 100; uint256 public interestPerSecond = interestRate.div(SECONDS_IN_A_YEAR); // Minting fee for issuing the synths. Default 50 bips. uint256 public issueFeeRate = (5 * SafeDecimalMath.unit()) / 1000; // Maximum amount of sETH that can be issued by the EtherCollateral contract. Default 5000 uint256 public issueLimit = SafeDecimalMath.unit() * 5000; // Minimum amount of ETH to create loan preventing griefing and gas consumption. Min 1ETH = 0.6666666667 sETH uint256 public minLoanSize = SafeDecimalMath.unit() * 1; // Maximum number of loans an account can create uint256 public accountLoanLimit = 50; // If true then any wallet addres can close a loan not just the loan creator. bool public loanLiquidationOpen = false; // Time when remaining loans can be liquidated uint256 public liquidationDeadline; // ========== STATE VARIABLES ========== // The total number of synths issued by the collateral in this contract uint256 public totalIssuedSynths; // Total number of loans ever created uint256 public totalLoansCreated; // Total number of open loans uint256 public totalOpenLoanCount; // Synth loan storage struct struct synthLoanStruct { // Acccount that created the loan address account; // Amount (in collateral token ) that they deposited uint256 collateralAmount; // Amount (in synths) that they issued to borrow uint256 loanAmount; // When the loan was created uint256 timeCreated; // ID for the loan uint256 loanID; // When the loan was paidback (closed) uint256 timeClosed; } // Users Loans by address mapping(address => synthLoanStruct[]) public accountsSynthLoans; // Account Open Loan Counter mapping(address => uint256) public accountOpenLoanCounter; // ========== CONSTRUCTOR ========== constructor(address _owner, address _resolver) public Owned(_owner) Pausable(_owner) MixinResolver(_owner, _resolver) { liquidationDeadline = now + 92 days; // Time before loans can be liquidated } // ========== SETTERS ========== function setCollateralizationRatio(uint256 ratio) external onlyOwner { require(ratio <= ONE_THOUSAND, "Too high"); require(ratio >= ONE_HUNDRED, "Too low"); collateralizationRatio = ratio; emit CollateralizationRatioUpdated(ratio); } function setInterestRate(uint256 _interestRate) external onlyOwner { require(_interestRate > SECONDS_IN_A_YEAR, "Interest rate cannot be less that the SECONDS_IN_A_YEAR"); require(_interestRate <= SafeDecimalMath.unit(), "Interest cannot be more than 100% APR"); interestRate = _interestRate; interestPerSecond = _interestRate.div(SECONDS_IN_A_YEAR); emit InterestRateUpdated(interestRate); } function setIssueFeeRate(uint256 _issueFeeRate) external onlyOwner { issueFeeRate = _issueFeeRate; emit IssueFeeRateUpdated(issueFeeRate); } function setIssueLimit(uint256 _issueLimit) external onlyOwner { issueLimit = _issueLimit; emit IssueLimitUpdated(issueLimit); } function setMinLoanSize(uint256 _minLoanSize) external onlyOwner { minLoanSize = _minLoanSize; emit MinLoanSizeUpdated(minLoanSize); } function setAccountLoanLimit(uint256 _loanLimit) external onlyOwner { uint256 HARD_CAP = 1000; require(_loanLimit < HARD_CAP, "Owner cannot set higher than HARD_CAP"); accountLoanLimit = _loanLimit; emit AccountLoanLimitUpdated(accountLoanLimit); } function setLoanLiquidationOpen(bool _loanLiquidationOpen) external onlyOwner { require(now > liquidationDeadline, "Before liquidation deadline"); loanLiquidationOpen = _loanLiquidationOpen; emit LoanLiquidationOpenUpdated(loanLiquidationOpen); } // ========== PUBLIC VIEWS ========== function getContractInfo() external view returns ( uint256 _collateralizationRatio, uint256 _issuanceRatio, uint256 _interestRate, uint256 _interestPerSecond, uint256 _issueFeeRate, uint256 _issueLimit, uint256 _minLoanSize, uint256 _totalIssuedSynths, uint256 _totalLoansCreated, uint256 _totalOpenLoanCount, uint256 _ethBalance, uint256 _liquidationDeadline, bool _loanLiquidationOpen ) { _collateralizationRatio = collateralizationRatio; _issuanceRatio = issuanceRatio(); _interestRate = interestRate; _interestPerSecond = interestPerSecond; _issueFeeRate = issueFeeRate; _issueLimit = issueLimit; _minLoanSize = minLoanSize; _totalIssuedSynths = totalIssuedSynths; _totalLoansCreated = totalLoansCreated; _totalOpenLoanCount = totalOpenLoanCount; _ethBalance = address(this).balance; _liquidationDeadline = liquidationDeadline; _loanLiquidationOpen = loanLiquidationOpen; } // returns value of 100 / collateralizationRatio. // e.g. 100/150 = 0.666666666666666667 // or in wei 100000000000000000000/150000000000000000000 = 666666666666666667 function issuanceRatio() public view returns (uint256) { // this Rounds so you get slightly more rather than slightly less // 4999999999999999995000 return ONE_HUNDRED.divideDecimalRound(collateralizationRatio); } function loanAmountFromCollateral(uint256 collateralAmount) public view returns (uint256) { return collateralAmount.multiplyDecimal(issuanceRatio()); } function collateralAmountForLoan(uint256 loanAmount) external view returns (uint256) { return loanAmount.multiplyDecimal(collateralizationRatio.divideDecimalRound(ONE_HUNDRED)); } function currentInterestOnLoan(address _account, uint256 _loanID) external view returns (uint256) { // Get the loan from storage synthLoanStruct memory synthLoan = _getLoanFromStorage(_account, _loanID); uint256 loanLifeSpan = _loanLifeSpan(synthLoan); return accruedInterestOnLoan(synthLoan.loanAmount, loanLifeSpan); } function accruedInterestOnLoan(uint256 _loanAmount, uint256 _seconds) public view returns (uint256 interestAmount) { // Simple interest calculated per second // Interest = Principal * rate * time interestAmount = _loanAmount.multiplyDecimalRound(interestPerSecond.mul(_seconds)); } function calculateMintingFee(address _account, uint256 _loanID) external view returns (uint256) { // Get the loan from storage synthLoanStruct memory synthLoan = _getLoanFromStorage(_account, _loanID); return _calculateMintingFee(synthLoan); } function openLoanIDsByAccount(address _account) external view returns (uint256[]) { uint256[] _openLoanIDs; uint256 _counter = 0; synthLoanStruct[] memory synthLoans = accountsSynthLoans[_account]; for (uint256 i = 0; i < synthLoans.length; i++) { if (synthLoans[i].timeClosed == 0) { _openLoanIDs[_counter] = synthLoans[i].loanID; _counter++; } } // Create the fixed size array to return uint256[] memory _result = new uint256[](_counter); // Copy loanIDs from dynamic array to fixed array for (uint256 j = 0; j < _counter; j++) { _result[j] = _openLoanIDs[j]; } // Return an array with list of open Loan IDs return _result; } function getLoan(address _account, uint256 _loanID) external view returns ( address account, uint256 collateralAmount, uint256 loanAmount, uint256 timeCreated, uint256 loanID, uint256 timeClosed, uint256 interest, uint256 totalFees ) { synthLoanStruct memory synthLoan = _getLoanFromStorage(_account, _loanID); account = synthLoan.account; collateralAmount = synthLoan.collateralAmount; loanAmount = synthLoan.loanAmount; timeCreated = synthLoan.timeCreated; loanID = synthLoan.loanID; timeClosed = synthLoan.timeClosed; interest = accruedInterestOnLoan(synthLoan.loanAmount, _loanLifeSpan(synthLoan)); totalFees = interest.add(_calculateMintingFee(synthLoan)); } function loanLifeSpan(address _account, uint256 _loanID) external view returns (uint256 loanLifeSpan) { synthLoanStruct memory synthLoan = _getLoanFromStorage(_account, _loanID); loanLifeSpan = _loanLifeSpan(synthLoan); } // ========== PUBLIC FUNCTIONS ========== function openLoan() external payable notPaused nonReentrant returns (uint256 loanID) { // Require ETH sent to be greater than minLoanSize require(msg.value >= minLoanSize, "Not enough ETH to create this loan. Please see the minLoanSize"); // Require loanLiquidationOpen to be false or we are in liquidation phase require(loanLiquidationOpen == false, "Loans are now being liquidated"); // Each account is limted to creating 50 (accountLoanLimit) loans require(accountsSynthLoans[msg.sender].length < accountLoanLimit, "Each account is limted to 50 loans"); // Calculate issuance amount uint256 loanAmount = loanAmountFromCollateral(msg.value); // Require sETH to mint does not exceed cap require(totalIssuedSynths.add(loanAmount) < issueLimit, "Loan Amount exceeds the supply cap. "); // Get a Loan ID loanID = _incrementTotalLoansCounter(); // Create Loan storage object synthLoanStruct memory synthLoan = synthLoanStruct({ account: msg.sender, collateralAmount: msg.value, loanAmount: loanAmount, timeCreated: now, loanID: loanID, timeClosed: 0 }); // Record loan in mapping to account in an array of the accounts open loans accountsSynthLoans[msg.sender].push(synthLoan); // Increment totalIssuedSynths totalIssuedSynths = totalIssuedSynths.add(loanAmount); // Issue the synth synthsETH().issue(msg.sender, loanAmount); // Tell the Dapps a loan was created emit LoanCreated(msg.sender, loanID, loanAmount); } function closeLoan(uint256 loanID) external nonReentrant { _closeLoan(msg.sender, loanID); } // Liquidation of an open loan available for anyone function liquidateUnclosedLoan(address _loanCreatorsAddress, uint256 _loanID) external nonReentrant { require(loanLiquidationOpen, "Liquidation is not open"); // Close the creators loan and send collateral to the closer. _closeLoan(_loanCreatorsAddress, _loanID); // Tell the Dapps this loan was liquidated emit LoanLiquidated(_loanCreatorsAddress, _loanID, msg.sender); } // ========== PRIVATE FUNCTIONS ========== function _closeLoan(address account, uint256 loanID) private { // Get the loan from storage synthLoanStruct memory synthLoan = _getLoanFromStorage(account, loanID); require(synthLoan.loanID > 0, "Loan does not exist"); require(synthLoan.timeClosed == 0, "Loan already closed"); require( synthsETH().balanceOf(msg.sender) >= synthLoan.loanAmount, "You do not have the required Synth balance to close this loan." ); // Record loan as closed _recordLoanClosure(synthLoan); // Decrement totalIssuedSynths totalIssuedSynths = totalIssuedSynths.sub(synthLoan.loanAmount); // Calculate and deduct interest(5%) and minting fee(50 bips) in ETH uint256 interestAmount = accruedInterestOnLoan(synthLoan.loanAmount, _loanLifeSpan(synthLoan)); uint256 mintingFee = _calculateMintingFee(synthLoan); uint256 totalFees = interestAmount.add(mintingFee); // Burn all Synths issued for the loan synthsETH().burn(account, synthLoan.loanAmount); // Fee Distribution. Purchase sUSD with ETH from Depot require(synthsUSD().balanceOf(depot()) >= totalFees, "The sUSD Depot does not have enough sUSD to buy for fees"); depot().exchangeEtherForSynths.value(totalFees)(); // Transfer the sUSD to distribute to SNX holders. synthsUSD().transfer(FEE_ADDRESS, synthsUSD().balanceOf(this)); // Send remainder ETH to caller address(msg.sender).transfer(synthLoan.collateralAmount.sub(totalFees)); // Tell the Dapps emit LoanClosed(account, loanID, totalFees); } function _getLoanFromStorage(address account, uint256 loanID) private view returns (synthLoanStruct) { synthLoanStruct[] memory synthLoans = accountsSynthLoans[account]; for (uint256 i = 0; i < synthLoans.length; i++) { if (synthLoans[i].loanID == loanID) { return synthLoans[i]; } } } function _recordLoanClosure(synthLoanStruct synthLoan) private { // Get storage pointer to the accounts array of loans synthLoanStruct[] storage synthLoans = accountsSynthLoans[synthLoan.account]; for (uint256 i = 0; i < synthLoans.length; i++) { if (synthLoans[i].loanID == synthLoan.loanID) { // Record the time the loan was closed synthLoans[i].timeClosed = now; } } // Reduce Total Open Loans Count totalOpenLoanCount = totalOpenLoanCount.sub(1); } function _incrementTotalLoansCounter() private returns (uint256) { // Increase the total Open loan count totalOpenLoanCount = totalOpenLoanCount.add(1); // Increase the total Loans Created count totalLoansCreated = totalLoansCreated.add(1); // Return total count to be used as a unique ID. return totalLoansCreated; } function _calculateMintingFee(synthLoanStruct synthLoan) private view returns (uint256 mintingFee) { mintingFee = synthLoan.loanAmount.multiplyDecimalRound(issueFeeRate); } function _loanLifeSpan(synthLoanStruct synthLoan) private view returns (uint256 loanLifeSpan) { // Get time loan is open for, and if closed from the timeClosed bool loanClosed = synthLoan.timeClosed > 0; // Calculate loan life span in seconds as (Now - Loan creation time) loanLifeSpan = loanClosed ? synthLoan.timeClosed.sub(synthLoan.timeCreated) : now.sub(synthLoan.timeCreated); } /* ========== INTERNAL VIEWS ========== */ function synthsETH() internal view returns (ISynth) { return ISynth(resolver.requireAndGetAddress("SynthsETH", "Missing SynthsETH address")); } function synthsUSD() internal view returns (ISynth) { return ISynth(resolver.requireAndGetAddress("SynthsUSD", "Missing SynthsUSD address")); } function depot() internal view returns (IDepot) { return IDepot(resolver.requireAndGetAddress("Depot", "Missing Depot address")); } // ========== EVENTS ========== event CollateralizationRatioUpdated(uint256 ratio); event InterestRateUpdated(uint256 interestRate); event IssueFeeRateUpdated(uint256 issueFeeRate); event IssueLimitUpdated(uint256 issueLimit); event MinLoanSizeUpdated(uint256 minLoanSize); event AccountLoanLimitUpdated(uint256 loanLimit); event LoanLiquidationOpenUpdated(bool loanLiquidationOpen); event LoanCreated(address indexed account, uint256 loanID, uint256 amount); event LoanClosed(address indexed account, uint256 loanID, uint256 feesPaid); event LoanLiquidated(address indexed account, uint256 loanID, address liquidator); }
Contract Security Audit
- No Contract Security Audit Submitted- Submit Audit Here
[{"constant":true,"inputs":[],"name":"resolver","outputs":[{"name":"","type":"address"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[{"name":"","type":"address"}],"name":"accountOpenLoanCounter","outputs":[{"name":"","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[],"name":"accountLoanLimit","outputs":[{"name":"","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":false,"inputs":[{"name":"_owner","type":"address"}],"name":"nominateNewOwner","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":false,"inputs":[{"name":"_paused","type":"bool"}],"name":"setPaused","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":true,"inputs":[],"name":"totalLoansCreated","outputs":[{"name":"","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[{"name":"_account","type":"address"},{"name":"_loanID","type":"uint256"}],"name":"calculateMintingFee","outputs":[{"name":"","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[{"name":"_account","type":"address"}],"name":"openLoanIDsByAccount","outputs":[{"name":"","type":"uint256[]"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[],"name":"issueFeeRate","outputs":[{"name":"","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[],"name":"totalOpenLoanCount","outputs":[{"name":"","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":false,"inputs":[{"name":"_resolver","type":"address"}],"name":"setResolver","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":false,"inputs":[{"name":"_issueLimit","type":"uint256"}],"name":"setIssueLimit","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":false,"inputs":[{"name":"_minLoanSize","type":"uint256"}],"name":"setMinLoanSize","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":true,"inputs":[],"name":"nominatedOwner","outputs":[{"name":"","type":"address"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[],"name":"paused","outputs":[{"name":"","type":"bool"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":false,"inputs":[{"name":"_loanLimit","type":"uint256"}],"name":"setAccountLoanLimit","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":false,"inputs":[{"name":"_interestRate","type":"uint256"}],"name":"setInterestRate","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":false,"inputs":[],"name":"openLoan","outputs":[{"name":"loanID","type":"uint256"}],"payable":true,"stateMutability":"payable","type":"function"},{"constant":false,"inputs":[],"name":"acceptOwnership","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":true,"inputs":[],"name":"interestRate","outputs":[{"name":"","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[],"name":"getContractInfo","outputs":[{"name":"_collateralizationRatio","type":"uint256"},{"name":"_issuanceRatio","type":"uint256"},{"name":"_interestRate","type":"uint256"},{"name":"_interestPerSecond","type":"uint256"},{"name":"_issueFeeRate","type":"uint256"},{"name":"_issueLimit","type":"uint256"},{"name":"_minLoanSize","type":"uint256"},{"name":"_totalIssuedSynths","type":"uint256"},{"name":"_totalLoansCreated","type":"uint256"},{"name":"_totalOpenLoanCount","type":"uint256"},{"name":"_ethBalance","type":"uint256"},{"name":"_liquidationDeadline","type":"uint256"},{"name":"_loanLiquidationOpen","type":"bool"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[{"name":"_account","type":"address"},{"name":"_loanID","type":"uint256"}],"name":"currentInterestOnLoan","outputs":[{"name":"","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[{"name":"_account","type":"address"},{"name":"_loanID","type":"uint256"}],"name":"loanLifeSpan","outputs":[{"name":"loanLifeSpan","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[],"name":"owner","outputs":[{"name":"","type":"address"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[{"name":"collateralAmount","type":"uint256"}],"name":"loanAmountFromCollateral","outputs":[{"name":"","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[],"name":"lastPauseTime","outputs":[{"name":"","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[],"name":"liquidationDeadline","outputs":[{"name":"","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[{"name":"_account","type":"address"},{"name":"_loanID","type":"uint256"}],"name":"getLoan","outputs":[{"name":"account","type":"address"},{"name":"collateralAmount","type":"uint256"},{"name":"loanAmount","type":"uint256"},{"name":"timeCreated","type":"uint256"},{"name":"loanID","type":"uint256"},{"name":"timeClosed","type":"uint256"},{"name":"interest","type":"uint256"},{"name":"totalFees","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[{"name":"_loanAmount","type":"uint256"},{"name":"_seconds","type":"uint256"}],"name":"accruedInterestOnLoan","outputs":[{"name":"interestAmount","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":false,"inputs":[{"name":"_issueFeeRate","type":"uint256"}],"name":"setIssueFeeRate","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":true,"inputs":[{"name":"","type":"address"},{"name":"","type":"uint256"}],"name":"accountsSynthLoans","outputs":[{"name":"account","type":"address"},{"name":"collateralAmount","type":"uint256"},{"name":"loanAmount","type":"uint256"},{"name":"timeCreated","type":"uint256"},{"name":"loanID","type":"uint256"},{"name":"timeClosed","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[],"name":"issuanceRatio","outputs":[{"name":"","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":false,"inputs":[{"name":"_loanLiquidationOpen","type":"bool"}],"name":"setLoanLiquidationOpen","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":true,"inputs":[],"name":"minLoanSize","outputs":[{"name":"","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":false,"inputs":[{"name":"loanID","type":"uint256"}],"name":"closeLoan","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":true,"inputs":[],"name":"collateralizationRatio","outputs":[{"name":"","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":false,"inputs":[{"name":"_loanCreatorsAddress","type":"address"},{"name":"_loanID","type":"uint256"}],"name":"liquidateUnclosedLoan","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":true,"inputs":[],"name":"loanLiquidationOpen","outputs":[{"name":"","type":"bool"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[],"name":"interestPerSecond","outputs":[{"name":"","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":false,"inputs":[{"name":"ratio","type":"uint256"}],"name":"setCollateralizationRatio","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":true,"inputs":[],"name":"totalIssuedSynths","outputs":[{"name":"","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[],"name":"issueLimit","outputs":[{"name":"","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[{"name":"loanAmount","type":"uint256"}],"name":"collateralAmountForLoan","outputs":[{"name":"","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"},{"inputs":[{"name":"_owner","type":"address"},{"name":"_resolver","type":"address"}],"payable":false,"stateMutability":"nonpayable","type":"constructor"},{"anonymous":false,"inputs":[{"indexed":false,"name":"ratio","type":"uint256"}],"name":"CollateralizationRatioUpdated","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"name":"interestRate","type":"uint256"}],"name":"InterestRateUpdated","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"name":"issueFeeRate","type":"uint256"}],"name":"IssueFeeRateUpdated","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"name":"issueLimit","type":"uint256"}],"name":"IssueLimitUpdated","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"name":"minLoanSize","type":"uint256"}],"name":"MinLoanSizeUpdated","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"name":"loanLimit","type":"uint256"}],"name":"AccountLoanLimitUpdated","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"name":"loanLiquidationOpen","type":"bool"}],"name":"LoanLiquidationOpenUpdated","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"name":"account","type":"address"},{"indexed":false,"name":"loanID","type":"uint256"},{"indexed":false,"name":"amount","type":"uint256"}],"name":"LoanCreated","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"name":"account","type":"address"},{"indexed":false,"name":"loanID","type":"uint256"},{"indexed":false,"name":"feesPaid","type":"uint256"}],"name":"LoanClosed","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"name":"account","type":"address"},{"indexed":false,"name":"loanID","type":"uint256"},{"indexed":false,"name":"liquidator","type":"address"}],"name":"LoanLiquidated","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"name":"isPaused","type":"bool"}],"name":"PauseChanged","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"name":"newOwner","type":"address"}],"name":"OwnerNominated","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"name":"oldOwner","type":"address"},{"indexed":false,"name":"newOwner","type":"address"}],"name":"OwnerChanged","type":"event"}]
Contract Creation Code
608060408190527f907af6c00000000000000000000000000000000000000000000000000000000081527384d626b2bb4d0f064067e4bf80fce7055d8f3e7b9063907af6c09060849060209060048186803b1580156200005e57600080fd5b505af415801562000073573d6000803e3d6000fd5b505050506040513d60208110156200008a57600080fd5b5051609602600655604080517f907af6c000000000000000000000000000000000000000000000000000000000815290516064917384d626b2bb4d0f064067e4bf80fce7055d8f3e7b9163907af6c091600480820192602092909190829003018186803b158015620000fb57600080fd5b505af415801562000110573d6000803e3d6000fd5b505050506040513d60208110156200012757600080fd5b50516005028115156200013657fe5b0460078190556200015a906301e1338064010000000062001f396200046f82021704565b6008556103e87384d626b2bb4d0f064067e4bf80fce7055d8f3e7b63907af6c06040518163ffffffff167c010000000000000000000000000000000000000000000000000000000002815260040160206040518083038186803b158015620001c157600080fd5b505af4158015620001d6573d6000803e3d6000fd5b505050506040513d6020811015620001ed57600080fd5b5051600502811515620001fc57fe5b046009557384d626b2bb4d0f064067e4bf80fce7055d8f3e7b63907af6c06040518163ffffffff167c010000000000000000000000000000000000000000000000000000000002815260040160206040518083038186803b1580156200026157600080fd5b505af415801562000276573d6000803e3d6000fd5b505050506040513d60208110156200028d57600080fd5b505161138802600a55604080517f907af6c000000000000000000000000000000000000000000000000000000000815290517384d626b2bb4d0f064067e4bf80fce7055d8f3e7b9163907af6c0916004808301926020929190829003018186803b158015620002fb57600080fd5b505af415801562000310573d6000803e3d6000fd5b505050506040513d60208110156200032757600080fd5b5051600b556032600c55600d805460ff191690553480156200034857600080fd5b50604051604080620030c783398101604052805160209091015181818180600160a060020a0381161515620003de57604080517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601960248201527f4f776e657220616464726573732063616e6e6f74206265203000000000000000604482015290519081900360640190fd5b60008054600160a060020a031916600160a060020a038316908117825560408051928352602083019190915280517fb532073b38c83145e3e5135377a08bf9aab55bc0fd7c1179cd4fb995d2a5159c9281900390910190a15050600160045560058054600160a060020a031916600160a060020a03929092169190911790555050504262794a0001600e55620004f6565b600080808311620004e157604080517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601260248201527f536166654d6174682e646976204572726f720000000000000000000000000000604482015290519081900360640190fd5b8284811515620004ed57fe5b04949350505050565b612bc180620005066000396000f3006080604052600436106101f55763ffffffff60e060020a60003504166304f3bcec81146101fa578063089f7fb41461022b5780631474b2791461025e5780631627540c1461027357806316c38b3c1461029657806323aa7f0f146102b057806327cff2e5146102c55780632f2bf15b146102e9578063361e20861461035a5780634189bb491461036f5780634e543b26146103845780634f069f66146103a557806350e3b2e7146103bd57806353a47bb7146103d55780635c975abb146103ea5780635d1a2229146104135780635f84f3021461042b5780636b2319381461044357806379ba50971461044b5780637c3a00fd146104605780637cc1f8671461047557806389c937de146104f15780638c463869146105155780638da5cb5b146105395780638fdc8f3b1461054e57806391b4ded9146105665780639f7d56881461057b578063a1c5158614610590578063a2e17342146105ff578063a76cdfa51461061a578063aa754a2a14610632578063b410a03414610693578063bb8c6d6c146106a8578063cf09b4ae146106c2578063d05951a0146106d7578063dcaf9c44146106ef578063e220a81114610704578063e3c1e58c14610728578063e40108ed1461073d578063e5829d2014610752578063ee5f3f5c1461076a578063eea8f5da1461077f578063f53dfb8414610794575b600080fd5b34801561020657600080fd5b5061020f6107ac565b60408051600160a060020a039092168252519081900360200190f35b34801561023757600080fd5b5061024c600160a060020a03600435166107bb565b60408051918252519081900360200190f35b34801561026a57600080fd5b5061024c6107cd565b34801561027f57600080fd5b50610294600160a060020a03600435166107d3565b005b3480156102a257600080fd5b506102946004351515610898565b3480156102bc57600080fd5b5061024c61096e565b3480156102d157600080fd5b5061024c600160a060020a0360043516602435610974565b3480156102f557600080fd5b5061030a600160a060020a036004351661099d565b60408051602080825283518183015283519192839290830191858101910280838360005b8381101561034657818101518382015260200161032e565b505050509050019250505060405180910390f35b34801561036657600080fd5b5061024c610b61565b34801561037b57600080fd5b5061024c610b67565b34801561039057600080fd5b50610294600160a060020a0360043516610b6d565b3480156103b157600080fd5b50610294600435610c00565b3480156103c957600080fd5b50610294600435610c9f565b3480156103e157600080fd5b5061020f610d3e565b3480156103f657600080fd5b506103ff610d4d565b604080519115158252519081900360200190f35b34801561041f57600080fd5b50610294600435610d56565b34801561043757600080fd5b50610294600435610e78565b61024c6110a1565b34801561045757600080fd5b506102946114d5565b34801561046c57600080fd5b5061024c6115dd565b34801561048157600080fd5b5061048a6115e3565b604080519d8e5260208e019c909c528c8c019a909a5260608c019890985260808b019690965260a08a019490945260c089019290925260e0880152610100870152610120860152610140850152610160840152151561018083015251908190036101a00190f35b3480156104fd57600080fd5b5061024c600160a060020a0360043516602435611658565b34801561052157600080fd5b5061024c600160a060020a0360043516602435611694565b34801561054557600080fd5b5061020f6116b3565b34801561055a57600080fd5b5061024c6004356116c2565b34801561057257600080fd5b5061024c6116e2565b34801561058757600080fd5b5061024c6116e8565b34801561059c57600080fd5b506105b4600160a060020a03600435166024356116ee565b60408051600160a060020a0390991689526020890197909752878701959095526060870193909352608086019190915260a085015260c084015260e083015251908190036101000190f35b34801561060b57600080fd5b5061024c600435602435611775565b34801561062657600080fd5b506102946004356117a3565b34801561063e57600080fd5b50610656600160a060020a0360043516602435611842565b60408051600160a060020a0390971687526020870195909552858501939093526060850191909152608084015260a0830152519081900360c00190f35b34801561069f57600080fd5b5061024c61189f565b3480156106b457600080fd5b50610294600435151561192e565b3480156106ce57600080fd5b5061024c611a37565b3480156106e357600080fd5b50610294600435611a3d565b3480156106fb57600080fd5b5061024c611a64565b34801561071057600080fd5b50610294600160a060020a0360043516602435611a6a565b34801561073457600080fd5b506103ff611b30565b34801561074957600080fd5b5061024c611b39565b34801561075e57600080fd5b50610294600435611b3f565b34801561077657600080fd5b5061024c611d79565b34801561078b57600080fd5b5061024c611d7f565b3480156107a057600080fd5b5061024c600435611d85565b600554600160a060020a031681565b60136020526000908152604090205481565b600c5481565b600054600160a060020a03163314610837576040805160e560020a62461bcd02815260206004820152602f6024820152600080516020612b568339815191526044820152600080516020612b76833981519152606482015290519081900360840190fd5b60018054600160a060020a03831673ffffffffffffffffffffffffffffffffffffffff19909116811790915560408051918252517f906a1c6bd7e3091ea86693dd029a831c19049ce77f1dce2ce0bab1cacbabce229181900360200190a150565b600054600160a060020a031633146108fc576040805160e560020a62461bcd02815260206004820152602f6024820152600080516020612b568339815191526044820152600080516020612b76833981519152606482015290519081900360840190fd5b60035460ff16151581151514156109125761096b565b6003805460ff1916821515179081905560ff161561092f57426002555b6003546040805160ff90921615158252517f8fb6c181ee25a520cf3dd6565006ef91229fcfe5a989566c2a3b8c115570cec59181900360200190a15b50565b60105481565b600061097e612b15565b6109888484611e12565b905061099381611f1e565b91505b5092915050565b606060008060606000606060008094506012600089600160a060020a0316600160a060020a03168152602001908152602001600020805480602002602001604051908101604052809291908181526020016000905b82821015610a635760008481526020908190206040805160c081018252600686029092018054600160a060020a031683526001808201548486015260028201549284019290925260038101546060840152600481015460808401526005015460a083015290835290920191016109f2565b505050509350600092505b8351831015610ae3578383815181101515610a8557fe5b9060200190602002015160a0015160001415610ad8578383815181101515610aa957fe5b90602001906020020151608001518686815481101515610ac557fe5b6000918252602090912001556001909401935b600190920191610a6e565b84604051908082528060200260200182016040528015610b0d578160200160208202803883390190505b509150600090505b84811015610b56578581815481101515610b2b57fe5b90600052602060002001548282815181101515610b4457fe5b60209081029091010152600101610b15565b509695505050505050565b60095481565b60115481565b600054600160a060020a03163314610bd1576040805160e560020a62461bcd02815260206004820152602f6024820152600080516020612b568339815191526044820152600080516020612b76833981519152606482015290519081900360840190fd5b6005805473ffffffffffffffffffffffffffffffffffffffff1916600160a060020a0392909216919091179055565b600054600160a060020a03163314610c64576040805160e560020a62461bcd02815260206004820152602f6024820152600080516020612b568339815191526044820152600080516020612b76833981519152606482015290519081900360840190fd5b600a8190556040805182815290517fbb72ce8874020b3b98429d653df927cac6618ac1932384b1446bf04bf9a1b7e59181900360200190a150565b600054600160a060020a03163314610d03576040805160e560020a62461bcd02815260206004820152602f6024820152600080516020612b568339815191526044820152600080516020612b76833981519152606482015290519081900360840190fd5b600b8190556040805182815290517f8640e538c9503bd8d11554fc26280efe867c12195c0eee0aeede5f4a8d5288399181900360200190a150565b600154600160a060020a031681565b60035460ff1681565b60008054600160a060020a03163314610dbb576040805160e560020a62461bcd02815260206004820152602f6024820152600080516020612b568339815191526044820152600080516020612b76833981519152606482015290519081900360840190fd5b506103e8808210610e3c576040805160e560020a62461bcd02815260206004820152602560248201527f4f776e65722063616e6e6f742073657420686967686572207468616e2048415260448201527f445f434150000000000000000000000000000000000000000000000000000000606482015290519081900360840190fd5b600c8290556040805183815290517f59822dc2d999f6f0618e8b0db5cfc8496084574c769b09609d9b5f4394a310b69181900360200190a15050565b600054600160a060020a03163314610edc576040805160e560020a62461bcd02815260206004820152602f6024820152600080516020612b568339815191526044820152600080516020612b76833981519152606482015290519081900360840190fd5b6301e133808111610f5d576040805160e560020a62461bcd02815260206004820152603760248201527f496e74657265737420726174652063616e6e6f74206265206c6573732074686160448201527f7420746865205345434f4e44535f494e5f415f59454152000000000000000000606482015290519081900360840190fd5b7384d626b2bb4d0f064067e4bf80fce7055d8f3e7b63907af6c06040518163ffffffff1660e060020a02815260040160206040518083038186803b158015610fa457600080fd5b505af4158015610fb8573d6000803e3d6000fd5b505050506040513d6020811015610fce57600080fd5b505181111561104d576040805160e560020a62461bcd02815260206004820152602560248201527f496e7465726573742063616e6e6f74206265206d6f7265207468616e2031303060448201527f2520415052000000000000000000000000000000000000000000000000000000606482015290519081900360840190fd5b6007819055611066816301e1338063ffffffff611f3916565b60085560075460408051918252517fa90e14be5aa57b910aa6dc16c31ff1b5cda380ae25a793b0d3f74df6131a7d749181900360200190a150565b6000806110ac612b15565b60035460ff161561112d576040805160e560020a62461bcd02815260206004820152603c60248201527f5468697320616374696f6e2063616e6e6f7420626520706572666f726d65642060448201527f7768696c652074686520636f6e74726163742069732070617573656400000000606482015290519081900360840190fd5b6004805460010190819055600b543410156111b8576040805160e560020a62461bcd02815260206004820152603e60248201527f4e6f7420656e6f7567682045544820746f206372656174652074686973206c6f60448201527f616e2e20506c656173652073656520746865206d696e4c6f616e53697a650000606482015290519081900360840190fd5b600d5460ff1615611213576040805160e560020a62461bcd02815260206004820152601e60248201527f4c6f616e7320617265206e6f77206265696e67206c6971756964617465640000604482015290519081900360640190fd5b600c5433600090815260126020526040902054106112a1576040805160e560020a62461bcd02815260206004820152602260248201527f45616368206163636f756e74206973206c696d74656420746f203530206c6f6160448201527f6e73000000000000000000000000000000000000000000000000000000000000606482015290519081900360840190fd5b6112aa346116c2565b9250600a546112c484600f54611fa790919063ffffffff16565b1061133e576040805160e560020a62461bcd028152602060048201526024808201527f4c6f616e20416d6f756e7420657863656564732074686520737570706c79206360448201527f61702e2000000000000000000000000000000000000000000000000000000000606482015290519081900360840190fd5b611346612004565b6040805160c08101825233808252346020808401918252838501898152426060860190815260808601888152600060a0880181815296815260128552978820805460018082018355918a52949098208751600690950201805473ffffffffffffffffffffffffffffffffffffffff1916600160a060020a039095169490941784559351968301969096555160028201559351600385015551600484015551600590920191909155600f5491955092506113ff9084611fa7565b600f5561140a61203c565b600160a060020a031663867904b433856040518363ffffffff1660e060020a0281526004018083600160a060020a0316600160a060020a0316815260200182815260200192505050600060405180830381600087803b15801561146c57600080fd5b505af1158015611480573d6000803e3d6000fd5b5050604080518781526020810187905281513394507f58d170de3a12438e22d81380f353b2fcac86f0a708a1374deaa5c6322a95992f93509081900390910190a260045481146114cf57600080fd5b50505090565b600154600160a060020a0316331461155d576040805160e560020a62461bcd02815260206004820152603560248201527f596f75206d757374206265206e6f6d696e61746564206265666f726520796f7560448201527f2063616e20616363657074206f776e6572736869700000000000000000000000606482015290519081900360840190fd5b60005460015460408051600160a060020a03938416815292909116602083015280517fb532073b38c83145e3e5135377a08bf9aab55bc0fd7c1179cd4fb995d2a5159c9281900390910190a1600180546000805473ffffffffffffffffffffffffffffffffffffffff19908116600160a060020a03841617909155169055565b60075481565b600654600080808080808080808080806115fb61189f565b9b506007549a5060085499506009549850600a549750600b549650600f5495506010549450601154935030600160a060020a0316319250600e549150600d60009054906101000a900460ff169050909192939495969798999a9b9c565b6000611662612b15565b600061166e8585611e12565b915061167982612126565b9050611689826040015182611775565b92505b505092915050565b600061169e612b15565b6116a88484611e12565b905061099381612126565b600054600160a060020a031681565b60006116dc6116cf61189f565b839063ffffffff61216916565b92915050565b60025481565b600e5481565b600080600080600080600080611702612b15565b61170c8b8b611e12565b8051602082015160408301516060840151608085015160a0860151949e50929c50909a50985096509450905061174a8761174583612126565b611775565b925061176561175882611f1e565b849063ffffffff611fa716565b9150509295985092959890939650565b600061179c61178f8360085461219590919063ffffffff16565b849063ffffffff61220e16565b9392505050565b600054600160a060020a03163314611807576040805160e560020a62461bcd02815260206004820152602f6024820152600080516020612b568339815191526044820152600080516020612b76833981519152606482015290519081900360840190fd5b60098190556040805182815290517fe7bd72551c54d568cd97b00dc52d2787b5c5d4f0070d3582c1e8ba25141f799c9181900360200190a150565b60126020528160005260406000208181548110151561185d57fe5b6000918252602090912060069091020180546001820154600283015460038401546004850154600590950154600160a060020a03909416965091945092909186565b60006119296006547384d626b2bb4d0f064067e4bf80fce7055d8f3e7b63907af6c06040518163ffffffff1660e060020a02815260040160206040518083038186803b1580156118ee57600080fd5b505af4158015611902573d6000803e3d6000fd5b505050506040513d602081101561191857600080fd5b50516064029063ffffffff61222316565b905090565b600054600160a060020a03163314611992576040805160e560020a62461bcd02815260206004820152602f6024820152600080516020612b568339815191526044820152600080516020612b76833981519152606482015290519081900360840190fd5b600e5442116119eb576040805160e560020a62461bcd02815260206004820152601b60248201527f4265666f7265206c69717569646174696f6e20646561646c696e650000000000604482015290519081900360640190fd5b600d805460ff191682151517908190556040805160ff90921615158252517faa52cf15c1fbb778214c66f64726e141551158858d1c06ca0392c6c5869c8567916020908290030190a150565b600b5481565b6004805460010190819055611a523383612238565b6004548114611a6057600080fd5b5050565b60065481565b6004805460010190819055600d5460ff161515611ad1576040805160e560020a62461bcd02815260206004820152601760248201527f4c69717569646174696f6e206973206e6f74206f70656e000000000000000000604482015290519081900360640190fd5b611adb8383612238565b604080518381523360208201528151600160a060020a038616927fde21b2a43b0a2c2109c049fb1e4bb8653fd67d0ffd74fdcb662db381f1eeab38928290030190a26004548114611b2b57600080fd5b505050565b600d5460ff1681565b60085481565b600054600160a060020a03163314611ba3576040805160e560020a62461bcd02815260206004820152602f6024820152600080516020612b568339815191526044820152600080516020612b76833981519152606482015290519081900360840190fd5b7384d626b2bb4d0f064067e4bf80fce7055d8f3e7b63907af6c06040518163ffffffff1660e060020a02815260040160206040518083038186803b158015611bea57600080fd5b505af4158015611bfe573d6000803e3d6000fd5b505050506040513d6020811015611c1457600080fd5b50516103e802811115611c71576040805160e560020a62461bcd02815260206004820152600860248201527f546f6f2068696768000000000000000000000000000000000000000000000000604482015290519081900360640190fd5b7384d626b2bb4d0f064067e4bf80fce7055d8f3e7b63907af6c06040518163ffffffff1660e060020a02815260040160206040518083038186803b158015611cb857600080fd5b505af4158015611ccc573d6000803e3d6000fd5b505050506040513d6020811015611ce257600080fd5b5051606402811015611d3e576040805160e560020a62461bcd02815260206004820152600760248201527f546f6f206c6f7700000000000000000000000000000000000000000000000000604482015290519081900360640190fd5b60068190556040805182815290517ffb0ebe8c7316e6a251494c38876d13d9a3a029273fce7964c12aa2ce078695309181900360200190a150565b600f5481565b600a5481565b60006116dc6116cf7384d626b2bb4d0f064067e4bf80fce7055d8f3e7b63907af6c06040518163ffffffff1660e060020a02815260040160206040518083038186803b158015611dd457600080fd5b505af4158015611de8573d6000803e3d6000fd5b505050506040513d6020811015611dfe57600080fd5b50516006549060640263ffffffff61222316565b611e1a612b15565b600160a060020a0383166000908152601260209081526040808320805482518185028101850190935280835260609493849084015b82821015611ec05760008481526020908190206040805160c081018252600686029092018054600160a060020a031683526001808201548486015260028201549284019290925260038101546060840152600481015460808401526005015460a08301529083529092019101611e4f565b505050509150600090505b815181101561168c57838282815181101515611ee357fe5b90602001906020020151608001511415611f16578181815181101515611f0557fe5b90602001906020020151925061168c565b600101611ecb565b60006116dc600954836040015161220e90919063ffffffff16565b600080808311611f93576040805160e560020a62461bcd02815260206004820152601260248201527f536166654d6174682e646976204572726f720000000000000000000000000000604482015290519081900360640190fd5b8284811515611f9e57fe5b04949350505050565b60008282018381101561179c576040805160e560020a62461bcd02815260206004820152601260248201527f536166654d6174682e616464204572726f720000000000000000000000000000604482015290519081900360640190fd5b60115460009061201b90600163ffffffff611fa716565b60115560105461203290600163ffffffff611fa716565b6010819055905090565b600554604080517fdacb2d010000000000000000000000000000000000000000000000000000000081527f53796e7468734554480000000000000000000000000000000000000000000000600482015260248101829052601960448201527f4d697373696e672053796e74687345544820616464726573730000000000000060648201529051600092600160a060020a03169163dacb2d0191608480830192602092919082900301818787803b1580156120f557600080fd5b505af1158015612109573d6000803e3d6000fd5b505050506040513d602081101561211f57600080fd5b5051905090565b60a081015160009081108061215057606083015161214b90429063ffffffff61283816565b61179c565b606083015160a084015161179c9163ffffffff61283816565b6000670de0b6b3a7640000612184848463ffffffff61219516565b81151561218d57fe5b049392505050565b6000808315156121a85760009150610996565b508282028284828115156121b857fe5b041461179c576040805160e560020a62461bcd02815260206004820152601260248201527f536166654d6174682e6d756c204572726f720000000000000000000000000000604482015290519081900360640190fd5b600061179c8383670de0b6b3a764000061289a565b600061179c8383670de0b6b3a76400006128d9565b612240612b15565b600080600061224f8686611e12565b9350600084608001511115156122af576040805160e560020a62461bcd02815260206004820152601360248201527f4c6f616e20646f6573206e6f7420657869737400000000000000000000000000604482015290519081900360640190fd5b60a084015115612309576040805160e560020a62461bcd02815260206004820152601360248201527f4c6f616e20616c726561647920636c6f73656400000000000000000000000000604482015290519081900360640190fd5b836040015161231661203c565b600160a060020a03166370a08231336040518263ffffffff1660e060020a0281526004018082600160a060020a0316600160a060020a03168152602001915050602060405180830381600087803b15801561237057600080fd5b505af1158015612384573d6000803e3d6000fd5b505050506040513d602081101561239a57600080fd5b50511015612418576040805160e560020a62461bcd02815260206004820152603e60248201527f596f7520646f206e6f742068617665207468652072657175697265642053796e60448201527f74682062616c616e636520746f20636c6f73652074686973206c6f616e2e0000606482015290519081900360840190fd5b6124218461290b565b6040840151600f546124389163ffffffff61283816565b600f55604084015161244d9061174586612126565b925061245884611f1e565b915061246a838363ffffffff611fa716565b905061247461203c565b600160a060020a0316639dc29fac8786604001516040518363ffffffff1660e060020a0281526004018083600160a060020a0316600160a060020a0316815260200182815260200192505050600060405180830381600087803b1580156124da57600080fd5b505af11580156124ee573d6000803e3d6000fd5b50505050806124fb6129a3565b600160a060020a03166370a08231612511612a5c565b6040518263ffffffff1660e060020a0281526004018082600160a060020a0316600160a060020a03168152602001915050602060405180830381600087803b15801561255c57600080fd5b505af1158015612570573d6000803e3d6000fd5b505050506040513d602081101561258657600080fd5b50511015612604576040805160e560020a62461bcd02815260206004820152603860248201527f5468652073555344204465706f7420646f6573206e6f74206861766520656e6f60448201527f756768207355534420746f2062757920666f7220666565730000000000000000606482015290519081900360840190fd5b61260c612a5c565b600160a060020a0316631f930115826040518263ffffffff1660e060020a0281526004016020604051808303818588803b15801561264957600080fd5b505af115801561265d573d6000803e3d6000fd5b50505050506040513d602081101561267457600080fd5b5061267f90506129a3565b600160a060020a031663a9059cbb73feefeefeefeefeefeefeefeefeefeefeefeefeef6126aa6129a3565b600160a060020a03166370a08231306040518263ffffffff1660e060020a0281526004018082600160a060020a0316600160a060020a03168152602001915050602060405180830381600087803b15801561270457600080fd5b505af1158015612718573d6000803e3d6000fd5b505050506040513d602081101561272e57600080fd5b50516040805160e060020a63ffffffff8616028152600160a060020a03909316600484015260248301919091525160448083019260209291908290030181600087803b15801561277d57600080fd5b505af1158015612791573d6000803e3d6000fd5b505050506040513d60208110156127a757600080fd5b5050602084015133906108fc906127c4908463ffffffff61283816565b6040518115909202916000818181858888f193505050501580156127ec573d6000803e3d6000fd5b5060408051868152602081018390528151600160a060020a038916927f3cc9f5d298758bad94536f27fa6a3033c2793e0a387a2d78e72550a3b8dacf1e928290030190a2505050505050565b60008083831115612893576040805160e560020a62461bcd02815260206004820152601260248201527f536166654d6174682e737562204572726f720000000000000000000000000000604482015290519081900360640190fd5b5050900390565b600080600a83046128b1868663ffffffff61219516565b8115156128ba57fe5b0490506005600a825b06106128cd57600a015b600a9004949350505050565b6000806128ff846128f387600a870263ffffffff61219516565b9063ffffffff611f3916565b90506005600a826128c3565b8051600160a060020a03166000908152601260205260408120905b8154811015612987578260800151828281548110151561294257fe5b906000526020600020906006020160040154141561297f5742828281548110151561296957fe5b9060005260206000209060060201600501819055505b600101612926565b60115461299b90600163ffffffff61283816565b601155505050565b600554604080517fdacb2d010000000000000000000000000000000000000000000000000000000081527f53796e7468735553440000000000000000000000000000000000000000000000600482015260248101829052601960448201527f4d697373696e672053796e74687355534420616464726573730000000000000060648201529051600092600160a060020a03169163dacb2d0191608480830192602092919082900301818787803b1580156120f557600080fd5b600554604080517fdacb2d010000000000000000000000000000000000000000000000000000000081527f4465706f74000000000000000000000000000000000000000000000000000000600482015260248101829052601560448201527f4d697373696e67204465706f742061646472657373000000000000000000000060648201529051600092600160a060020a03169163dacb2d0191608480830192602092919082900301818787803b1580156120f557600080fd5b60c0604051908101604052806000600160a060020a031681526020016000815260200160008152602001600081526020016000815260200160008152509056004f6e6c792074686520636f6e7472616374206f776e6572206d617920706572666f726d207468697320616374696f6e0000000000000000000000000000000000a165627a7a7230582040d2449b2ae046e4dbf8f34e6f0aeaf7b2951fd17bd8c9f8442e0215f43c64950029000000000000000000000000b64ff7a4a33acdf48d97dab0d764afd0f6176882000000000000000000000000fbb6526ed92da8915d4843a86166020d0b7baad0
Deployed Bytecode
0x6080604052600436106101f55763ffffffff60e060020a60003504166304f3bcec81146101fa578063089f7fb41461022b5780631474b2791461025e5780631627540c1461027357806316c38b3c1461029657806323aa7f0f146102b057806327cff2e5146102c55780632f2bf15b146102e9578063361e20861461035a5780634189bb491461036f5780634e543b26146103845780634f069f66146103a557806350e3b2e7146103bd57806353a47bb7146103d55780635c975abb146103ea5780635d1a2229146104135780635f84f3021461042b5780636b2319381461044357806379ba50971461044b5780637c3a00fd146104605780637cc1f8671461047557806389c937de146104f15780638c463869146105155780638da5cb5b146105395780638fdc8f3b1461054e57806391b4ded9146105665780639f7d56881461057b578063a1c5158614610590578063a2e17342146105ff578063a76cdfa51461061a578063aa754a2a14610632578063b410a03414610693578063bb8c6d6c146106a8578063cf09b4ae146106c2578063d05951a0146106d7578063dcaf9c44146106ef578063e220a81114610704578063e3c1e58c14610728578063e40108ed1461073d578063e5829d2014610752578063ee5f3f5c1461076a578063eea8f5da1461077f578063f53dfb8414610794575b600080fd5b34801561020657600080fd5b5061020f6107ac565b60408051600160a060020a039092168252519081900360200190f35b34801561023757600080fd5b5061024c600160a060020a03600435166107bb565b60408051918252519081900360200190f35b34801561026a57600080fd5b5061024c6107cd565b34801561027f57600080fd5b50610294600160a060020a03600435166107d3565b005b3480156102a257600080fd5b506102946004351515610898565b3480156102bc57600080fd5b5061024c61096e565b3480156102d157600080fd5b5061024c600160a060020a0360043516602435610974565b3480156102f557600080fd5b5061030a600160a060020a036004351661099d565b60408051602080825283518183015283519192839290830191858101910280838360005b8381101561034657818101518382015260200161032e565b505050509050019250505060405180910390f35b34801561036657600080fd5b5061024c610b61565b34801561037b57600080fd5b5061024c610b67565b34801561039057600080fd5b50610294600160a060020a0360043516610b6d565b3480156103b157600080fd5b50610294600435610c00565b3480156103c957600080fd5b50610294600435610c9f565b3480156103e157600080fd5b5061020f610d3e565b3480156103f657600080fd5b506103ff610d4d565b604080519115158252519081900360200190f35b34801561041f57600080fd5b50610294600435610d56565b34801561043757600080fd5b50610294600435610e78565b61024c6110a1565b34801561045757600080fd5b506102946114d5565b34801561046c57600080fd5b5061024c6115dd565b34801561048157600080fd5b5061048a6115e3565b604080519d8e5260208e019c909c528c8c019a909a5260608c019890985260808b019690965260a08a019490945260c089019290925260e0880152610100870152610120860152610140850152610160840152151561018083015251908190036101a00190f35b3480156104fd57600080fd5b5061024c600160a060020a0360043516602435611658565b34801561052157600080fd5b5061024c600160a060020a0360043516602435611694565b34801561054557600080fd5b5061020f6116b3565b34801561055a57600080fd5b5061024c6004356116c2565b34801561057257600080fd5b5061024c6116e2565b34801561058757600080fd5b5061024c6116e8565b34801561059c57600080fd5b506105b4600160a060020a03600435166024356116ee565b60408051600160a060020a0390991689526020890197909752878701959095526060870193909352608086019190915260a085015260c084015260e083015251908190036101000190f35b34801561060b57600080fd5b5061024c600435602435611775565b34801561062657600080fd5b506102946004356117a3565b34801561063e57600080fd5b50610656600160a060020a0360043516602435611842565b60408051600160a060020a0390971687526020870195909552858501939093526060850191909152608084015260a0830152519081900360c00190f35b34801561069f57600080fd5b5061024c61189f565b3480156106b457600080fd5b50610294600435151561192e565b3480156106ce57600080fd5b5061024c611a37565b3480156106e357600080fd5b50610294600435611a3d565b3480156106fb57600080fd5b5061024c611a64565b34801561071057600080fd5b50610294600160a060020a0360043516602435611a6a565b34801561073457600080fd5b506103ff611b30565b34801561074957600080fd5b5061024c611b39565b34801561075e57600080fd5b50610294600435611b3f565b34801561077657600080fd5b5061024c611d79565b34801561078b57600080fd5b5061024c611d7f565b3480156107a057600080fd5b5061024c600435611d85565b600554600160a060020a031681565b60136020526000908152604090205481565b600c5481565b600054600160a060020a03163314610837576040805160e560020a62461bcd02815260206004820152602f6024820152600080516020612b568339815191526044820152600080516020612b76833981519152606482015290519081900360840190fd5b60018054600160a060020a03831673ffffffffffffffffffffffffffffffffffffffff19909116811790915560408051918252517f906a1c6bd7e3091ea86693dd029a831c19049ce77f1dce2ce0bab1cacbabce229181900360200190a150565b600054600160a060020a031633146108fc576040805160e560020a62461bcd02815260206004820152602f6024820152600080516020612b568339815191526044820152600080516020612b76833981519152606482015290519081900360840190fd5b60035460ff16151581151514156109125761096b565b6003805460ff1916821515179081905560ff161561092f57426002555b6003546040805160ff90921615158252517f8fb6c181ee25a520cf3dd6565006ef91229fcfe5a989566c2a3b8c115570cec59181900360200190a15b50565b60105481565b600061097e612b15565b6109888484611e12565b905061099381611f1e565b91505b5092915050565b606060008060606000606060008094506012600089600160a060020a0316600160a060020a03168152602001908152602001600020805480602002602001604051908101604052809291908181526020016000905b82821015610a635760008481526020908190206040805160c081018252600686029092018054600160a060020a031683526001808201548486015260028201549284019290925260038101546060840152600481015460808401526005015460a083015290835290920191016109f2565b505050509350600092505b8351831015610ae3578383815181101515610a8557fe5b9060200190602002015160a0015160001415610ad8578383815181101515610aa957fe5b90602001906020020151608001518686815481101515610ac557fe5b6000918252602090912001556001909401935b600190920191610a6e565b84604051908082528060200260200182016040528015610b0d578160200160208202803883390190505b509150600090505b84811015610b56578581815481101515610b2b57fe5b90600052602060002001548282815181101515610b4457fe5b60209081029091010152600101610b15565b509695505050505050565b60095481565b60115481565b600054600160a060020a03163314610bd1576040805160e560020a62461bcd02815260206004820152602f6024820152600080516020612b568339815191526044820152600080516020612b76833981519152606482015290519081900360840190fd5b6005805473ffffffffffffffffffffffffffffffffffffffff1916600160a060020a0392909216919091179055565b600054600160a060020a03163314610c64576040805160e560020a62461bcd02815260206004820152602f6024820152600080516020612b568339815191526044820152600080516020612b76833981519152606482015290519081900360840190fd5b600a8190556040805182815290517fbb72ce8874020b3b98429d653df927cac6618ac1932384b1446bf04bf9a1b7e59181900360200190a150565b600054600160a060020a03163314610d03576040805160e560020a62461bcd02815260206004820152602f6024820152600080516020612b568339815191526044820152600080516020612b76833981519152606482015290519081900360840190fd5b600b8190556040805182815290517f8640e538c9503bd8d11554fc26280efe867c12195c0eee0aeede5f4a8d5288399181900360200190a150565b600154600160a060020a031681565b60035460ff1681565b60008054600160a060020a03163314610dbb576040805160e560020a62461bcd02815260206004820152602f6024820152600080516020612b568339815191526044820152600080516020612b76833981519152606482015290519081900360840190fd5b506103e8808210610e3c576040805160e560020a62461bcd02815260206004820152602560248201527f4f776e65722063616e6e6f742073657420686967686572207468616e2048415260448201527f445f434150000000000000000000000000000000000000000000000000000000606482015290519081900360840190fd5b600c8290556040805183815290517f59822dc2d999f6f0618e8b0db5cfc8496084574c769b09609d9b5f4394a310b69181900360200190a15050565b600054600160a060020a03163314610edc576040805160e560020a62461bcd02815260206004820152602f6024820152600080516020612b568339815191526044820152600080516020612b76833981519152606482015290519081900360840190fd5b6301e133808111610f5d576040805160e560020a62461bcd02815260206004820152603760248201527f496e74657265737420726174652063616e6e6f74206265206c6573732074686160448201527f7420746865205345434f4e44535f494e5f415f59454152000000000000000000606482015290519081900360840190fd5b7384d626b2bb4d0f064067e4bf80fce7055d8f3e7b63907af6c06040518163ffffffff1660e060020a02815260040160206040518083038186803b158015610fa457600080fd5b505af4158015610fb8573d6000803e3d6000fd5b505050506040513d6020811015610fce57600080fd5b505181111561104d576040805160e560020a62461bcd02815260206004820152602560248201527f496e7465726573742063616e6e6f74206265206d6f7265207468616e2031303060448201527f2520415052000000000000000000000000000000000000000000000000000000606482015290519081900360840190fd5b6007819055611066816301e1338063ffffffff611f3916565b60085560075460408051918252517fa90e14be5aa57b910aa6dc16c31ff1b5cda380ae25a793b0d3f74df6131a7d749181900360200190a150565b6000806110ac612b15565b60035460ff161561112d576040805160e560020a62461bcd02815260206004820152603c60248201527f5468697320616374696f6e2063616e6e6f7420626520706572666f726d65642060448201527f7768696c652074686520636f6e74726163742069732070617573656400000000606482015290519081900360840190fd5b6004805460010190819055600b543410156111b8576040805160e560020a62461bcd02815260206004820152603e60248201527f4e6f7420656e6f7567682045544820746f206372656174652074686973206c6f60448201527f616e2e20506c656173652073656520746865206d696e4c6f616e53697a650000606482015290519081900360840190fd5b600d5460ff1615611213576040805160e560020a62461bcd02815260206004820152601e60248201527f4c6f616e7320617265206e6f77206265696e67206c6971756964617465640000604482015290519081900360640190fd5b600c5433600090815260126020526040902054106112a1576040805160e560020a62461bcd02815260206004820152602260248201527f45616368206163636f756e74206973206c696d74656420746f203530206c6f6160448201527f6e73000000000000000000000000000000000000000000000000000000000000606482015290519081900360840190fd5b6112aa346116c2565b9250600a546112c484600f54611fa790919063ffffffff16565b1061133e576040805160e560020a62461bcd028152602060048201526024808201527f4c6f616e20416d6f756e7420657863656564732074686520737570706c79206360448201527f61702e2000000000000000000000000000000000000000000000000000000000606482015290519081900360840190fd5b611346612004565b6040805160c08101825233808252346020808401918252838501898152426060860190815260808601888152600060a0880181815296815260128552978820805460018082018355918a52949098208751600690950201805473ffffffffffffffffffffffffffffffffffffffff1916600160a060020a039095169490941784559351968301969096555160028201559351600385015551600484015551600590920191909155600f5491955092506113ff9084611fa7565b600f5561140a61203c565b600160a060020a031663867904b433856040518363ffffffff1660e060020a0281526004018083600160a060020a0316600160a060020a0316815260200182815260200192505050600060405180830381600087803b15801561146c57600080fd5b505af1158015611480573d6000803e3d6000fd5b5050604080518781526020810187905281513394507f58d170de3a12438e22d81380f353b2fcac86f0a708a1374deaa5c6322a95992f93509081900390910190a260045481146114cf57600080fd5b50505090565b600154600160a060020a0316331461155d576040805160e560020a62461bcd02815260206004820152603560248201527f596f75206d757374206265206e6f6d696e61746564206265666f726520796f7560448201527f2063616e20616363657074206f776e6572736869700000000000000000000000606482015290519081900360840190fd5b60005460015460408051600160a060020a03938416815292909116602083015280517fb532073b38c83145e3e5135377a08bf9aab55bc0fd7c1179cd4fb995d2a5159c9281900390910190a1600180546000805473ffffffffffffffffffffffffffffffffffffffff19908116600160a060020a03841617909155169055565b60075481565b600654600080808080808080808080806115fb61189f565b9b506007549a5060085499506009549850600a549750600b549650600f5495506010549450601154935030600160a060020a0316319250600e549150600d60009054906101000a900460ff169050909192939495969798999a9b9c565b6000611662612b15565b600061166e8585611e12565b915061167982612126565b9050611689826040015182611775565b92505b505092915050565b600061169e612b15565b6116a88484611e12565b905061099381612126565b600054600160a060020a031681565b60006116dc6116cf61189f565b839063ffffffff61216916565b92915050565b60025481565b600e5481565b600080600080600080600080611702612b15565b61170c8b8b611e12565b8051602082015160408301516060840151608085015160a0860151949e50929c50909a50985096509450905061174a8761174583612126565b611775565b925061176561175882611f1e565b849063ffffffff611fa716565b9150509295985092959890939650565b600061179c61178f8360085461219590919063ffffffff16565b849063ffffffff61220e16565b9392505050565b600054600160a060020a03163314611807576040805160e560020a62461bcd02815260206004820152602f6024820152600080516020612b568339815191526044820152600080516020612b76833981519152606482015290519081900360840190fd5b60098190556040805182815290517fe7bd72551c54d568cd97b00dc52d2787b5c5d4f0070d3582c1e8ba25141f799c9181900360200190a150565b60126020528160005260406000208181548110151561185d57fe5b6000918252602090912060069091020180546001820154600283015460038401546004850154600590950154600160a060020a03909416965091945092909186565b60006119296006547384d626b2bb4d0f064067e4bf80fce7055d8f3e7b63907af6c06040518163ffffffff1660e060020a02815260040160206040518083038186803b1580156118ee57600080fd5b505af4158015611902573d6000803e3d6000fd5b505050506040513d602081101561191857600080fd5b50516064029063ffffffff61222316565b905090565b600054600160a060020a03163314611992576040805160e560020a62461bcd02815260206004820152602f6024820152600080516020612b568339815191526044820152600080516020612b76833981519152606482015290519081900360840190fd5b600e5442116119eb576040805160e560020a62461bcd02815260206004820152601b60248201527f4265666f7265206c69717569646174696f6e20646561646c696e650000000000604482015290519081900360640190fd5b600d805460ff191682151517908190556040805160ff90921615158252517faa52cf15c1fbb778214c66f64726e141551158858d1c06ca0392c6c5869c8567916020908290030190a150565b600b5481565b6004805460010190819055611a523383612238565b6004548114611a6057600080fd5b5050565b60065481565b6004805460010190819055600d5460ff161515611ad1576040805160e560020a62461bcd02815260206004820152601760248201527f4c69717569646174696f6e206973206e6f74206f70656e000000000000000000604482015290519081900360640190fd5b611adb8383612238565b604080518381523360208201528151600160a060020a038616927fde21b2a43b0a2c2109c049fb1e4bb8653fd67d0ffd74fdcb662db381f1eeab38928290030190a26004548114611b2b57600080fd5b505050565b600d5460ff1681565b60085481565b600054600160a060020a03163314611ba3576040805160e560020a62461bcd02815260206004820152602f6024820152600080516020612b568339815191526044820152600080516020612b76833981519152606482015290519081900360840190fd5b7384d626b2bb4d0f064067e4bf80fce7055d8f3e7b63907af6c06040518163ffffffff1660e060020a02815260040160206040518083038186803b158015611bea57600080fd5b505af4158015611bfe573d6000803e3d6000fd5b505050506040513d6020811015611c1457600080fd5b50516103e802811115611c71576040805160e560020a62461bcd02815260206004820152600860248201527f546f6f2068696768000000000000000000000000000000000000000000000000604482015290519081900360640190fd5b7384d626b2bb4d0f064067e4bf80fce7055d8f3e7b63907af6c06040518163ffffffff1660e060020a02815260040160206040518083038186803b158015611cb857600080fd5b505af4158015611ccc573d6000803e3d6000fd5b505050506040513d6020811015611ce257600080fd5b5051606402811015611d3e576040805160e560020a62461bcd02815260206004820152600760248201527f546f6f206c6f7700000000000000000000000000000000000000000000000000604482015290519081900360640190fd5b60068190556040805182815290517ffb0ebe8c7316e6a251494c38876d13d9a3a029273fce7964c12aa2ce078695309181900360200190a150565b600f5481565b600a5481565b60006116dc6116cf7384d626b2bb4d0f064067e4bf80fce7055d8f3e7b63907af6c06040518163ffffffff1660e060020a02815260040160206040518083038186803b158015611dd457600080fd5b505af4158015611de8573d6000803e3d6000fd5b505050506040513d6020811015611dfe57600080fd5b50516006549060640263ffffffff61222316565b611e1a612b15565b600160a060020a0383166000908152601260209081526040808320805482518185028101850190935280835260609493849084015b82821015611ec05760008481526020908190206040805160c081018252600686029092018054600160a060020a031683526001808201548486015260028201549284019290925260038101546060840152600481015460808401526005015460a08301529083529092019101611e4f565b505050509150600090505b815181101561168c57838282815181101515611ee357fe5b90602001906020020151608001511415611f16578181815181101515611f0557fe5b90602001906020020151925061168c565b600101611ecb565b60006116dc600954836040015161220e90919063ffffffff16565b600080808311611f93576040805160e560020a62461bcd02815260206004820152601260248201527f536166654d6174682e646976204572726f720000000000000000000000000000604482015290519081900360640190fd5b8284811515611f9e57fe5b04949350505050565b60008282018381101561179c576040805160e560020a62461bcd02815260206004820152601260248201527f536166654d6174682e616464204572726f720000000000000000000000000000604482015290519081900360640190fd5b60115460009061201b90600163ffffffff611fa716565b60115560105461203290600163ffffffff611fa716565b6010819055905090565b600554604080517fdacb2d010000000000000000000000000000000000000000000000000000000081527f53796e7468734554480000000000000000000000000000000000000000000000600482015260248101829052601960448201527f4d697373696e672053796e74687345544820616464726573730000000000000060648201529051600092600160a060020a03169163dacb2d0191608480830192602092919082900301818787803b1580156120f557600080fd5b505af1158015612109573d6000803e3d6000fd5b505050506040513d602081101561211f57600080fd5b5051905090565b60a081015160009081108061215057606083015161214b90429063ffffffff61283816565b61179c565b606083015160a084015161179c9163ffffffff61283816565b6000670de0b6b3a7640000612184848463ffffffff61219516565b81151561218d57fe5b049392505050565b6000808315156121a85760009150610996565b508282028284828115156121b857fe5b041461179c576040805160e560020a62461bcd02815260206004820152601260248201527f536166654d6174682e6d756c204572726f720000000000000000000000000000604482015290519081900360640190fd5b600061179c8383670de0b6b3a764000061289a565b600061179c8383670de0b6b3a76400006128d9565b612240612b15565b600080600061224f8686611e12565b9350600084608001511115156122af576040805160e560020a62461bcd02815260206004820152601360248201527f4c6f616e20646f6573206e6f7420657869737400000000000000000000000000604482015290519081900360640190fd5b60a084015115612309576040805160e560020a62461bcd02815260206004820152601360248201527f4c6f616e20616c726561647920636c6f73656400000000000000000000000000604482015290519081900360640190fd5b836040015161231661203c565b600160a060020a03166370a08231336040518263ffffffff1660e060020a0281526004018082600160a060020a0316600160a060020a03168152602001915050602060405180830381600087803b15801561237057600080fd5b505af1158015612384573d6000803e3d6000fd5b505050506040513d602081101561239a57600080fd5b50511015612418576040805160e560020a62461bcd02815260206004820152603e60248201527f596f7520646f206e6f742068617665207468652072657175697265642053796e60448201527f74682062616c616e636520746f20636c6f73652074686973206c6f616e2e0000606482015290519081900360840190fd5b6124218461290b565b6040840151600f546124389163ffffffff61283816565b600f55604084015161244d9061174586612126565b925061245884611f1e565b915061246a838363ffffffff611fa716565b905061247461203c565b600160a060020a0316639dc29fac8786604001516040518363ffffffff1660e060020a0281526004018083600160a060020a0316600160a060020a0316815260200182815260200192505050600060405180830381600087803b1580156124da57600080fd5b505af11580156124ee573d6000803e3d6000fd5b50505050806124fb6129a3565b600160a060020a03166370a08231612511612a5c565b6040518263ffffffff1660e060020a0281526004018082600160a060020a0316600160a060020a03168152602001915050602060405180830381600087803b15801561255c57600080fd5b505af1158015612570573d6000803e3d6000fd5b505050506040513d602081101561258657600080fd5b50511015612604576040805160e560020a62461bcd02815260206004820152603860248201527f5468652073555344204465706f7420646f6573206e6f74206861766520656e6f60448201527f756768207355534420746f2062757920666f7220666565730000000000000000606482015290519081900360840190fd5b61260c612a5c565b600160a060020a0316631f930115826040518263ffffffff1660e060020a0281526004016020604051808303818588803b15801561264957600080fd5b505af115801561265d573d6000803e3d6000fd5b50505050506040513d602081101561267457600080fd5b5061267f90506129a3565b600160a060020a031663a9059cbb73feefeefeefeefeefeefeefeefeefeefeefeefeef6126aa6129a3565b600160a060020a03166370a08231306040518263ffffffff1660e060020a0281526004018082600160a060020a0316600160a060020a03168152602001915050602060405180830381600087803b15801561270457600080fd5b505af1158015612718573d6000803e3d6000fd5b505050506040513d602081101561272e57600080fd5b50516040805160e060020a63ffffffff8616028152600160a060020a03909316600484015260248301919091525160448083019260209291908290030181600087803b15801561277d57600080fd5b505af1158015612791573d6000803e3d6000fd5b505050506040513d60208110156127a757600080fd5b5050602084015133906108fc906127c4908463ffffffff61283816565b6040518115909202916000818181858888f193505050501580156127ec573d6000803e3d6000fd5b5060408051868152602081018390528151600160a060020a038916927f3cc9f5d298758bad94536f27fa6a3033c2793e0a387a2d78e72550a3b8dacf1e928290030190a2505050505050565b60008083831115612893576040805160e560020a62461bcd02815260206004820152601260248201527f536166654d6174682e737562204572726f720000000000000000000000000000604482015290519081900360640190fd5b5050900390565b600080600a83046128b1868663ffffffff61219516565b8115156128ba57fe5b0490506005600a825b06106128cd57600a015b600a9004949350505050565b6000806128ff846128f387600a870263ffffffff61219516565b9063ffffffff611f3916565b90506005600a826128c3565b8051600160a060020a03166000908152601260205260408120905b8154811015612987578260800151828281548110151561294257fe5b906000526020600020906006020160040154141561297f5742828281548110151561296957fe5b9060005260206000209060060201600501819055505b600101612926565b60115461299b90600163ffffffff61283816565b601155505050565b600554604080517fdacb2d010000000000000000000000000000000000000000000000000000000081527f53796e7468735553440000000000000000000000000000000000000000000000600482015260248101829052601960448201527f4d697373696e672053796e74687355534420616464726573730000000000000060648201529051600092600160a060020a03169163dacb2d0191608480830192602092919082900301818787803b1580156120f557600080fd5b600554604080517fdacb2d010000000000000000000000000000000000000000000000000000000081527f4465706f74000000000000000000000000000000000000000000000000000000600482015260248101829052601560448201527f4d697373696e67204465706f742061646472657373000000000000000000000060648201529051600092600160a060020a03169163dacb2d0191608480830192602092919082900301818787803b1580156120f557600080fd5b60c0604051908101604052806000600160a060020a031681526020016000815260200160008152602001600081526020016000815260200160008152509056004f6e6c792074686520636f6e7472616374206f776e6572206d617920706572666f726d207468697320616374696f6e0000000000000000000000000000000000a165627a7a7230582040d2449b2ae046e4dbf8f34e6f0aeaf7b2951fd17bd8c9f8442e0215f43c64950029
Constructor Arguments (ABI-Encoded and is the last bytes of the Contract Creation Code above)
000000000000000000000000b64ff7a4a33acdf48d97dab0d764afd0f6176882000000000000000000000000fbb6526ed92da8915d4843a86166020d0b7baad0
-----Decoded View---------------
Arg [0] : _owner (address): 0xB64fF7a4a33Acdf48d97dab0D764afD0F6176882
Arg [1] : _resolver (address): 0xFbB6526ed92DA8915d4843a86166020d0B7bAAd0
-----Encoded View---------------
2 Constructor Arguments found :
Arg [0] : 000000000000000000000000b64ff7a4a33acdf48d97dab0d764afd0f6176882
Arg [1] : 000000000000000000000000fbb6526ed92da8915d4843a86166020d0b7baad0
Loading...
Loading
Loading...
Loading
Multichain Portfolio | 30 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.