ETH Price: $2,720.67 (-3.06%)

Contract

0xF518348E86027bD203b56Fb913D6bB1502533f05
 

Overview

ETH Balance

0 ETH

Eth Value

$0.00

Multichain Info

No addresses found
Transaction Hash
Method
Block
From
To
Cancel Offer68254172018-12-04 15:57:452273 days ago1543939065IN
0xF518348E...502533f05
0 ETH0.00036229
Offer68254112018-12-04 15:55:312273 days ago1543938931IN
0xF518348E...502533f05
0 ETH0.000595149
Sign68253932018-12-04 15:49:132273 days ago1543938553IN
0xF518348E...502533f05
0 ETH0.000780919
Deposit68253892018-12-04 15:48:312273 days ago1543938511IN
0xF518348E...502533f05
0.2 ETH0.000816219
Cancel68253542018-12-04 15:38:062273 days ago1543937886IN
0xF518348E...502533f05
0 ETH0.000484067
Create Payment68253492018-12-04 15:37:212273 days ago1543937841IN
0xF518348E...502533f05
0 ETH0.000585796
Release68250142018-12-04 14:19:142273 days ago1543933154IN
0xF518348E...502533f05
0 ETH0.00025977
Release68249962018-12-04 14:14:212273 days ago1543932861IN
0xF518348E...502533f05
0 ETH0.000618777
Release68249472018-12-04 14:05:042273 days ago1543932304IN
0xF518348E...502533f05
0 ETH0.000654137.4
Deposit68249452018-12-04 14:04:522273 days ago1543932292IN
0xF518348E...502533f05
0.0001 ETH0.000716467
Cancel68249452018-12-04 14:04:522273 days ago1543932292IN
0xF518348E...502533f05
0 ETH0.000624457.4
Deposit68249362018-12-04 14:03:162273 days ago1543932196IN
0xF518348E...502533f05
0.000102 ETH0.000756377
Deposit68249292018-12-04 14:01:022273 days ago1543932062IN
0xF518348E...502533f05
0.001 ETH0.000634387
Sign68249282018-12-04 14:00:532273 days ago1543932053IN
0xF518348E...502533f05
0 ETH0.00052447
Create Payment68249112018-12-04 13:56:582273 days ago1543931818IN
0xF518348E...502533f05
0 ETH0.000963328
Sign68249002018-12-04 13:54:422273 days ago1543931682IN
0xF518348E...502533f05
0 ETH0.000780339
Deposit68248942018-12-04 13:53:102273 days ago1543931590IN
0xF518348E...502533f05
0.0001 ETH0.000815649
Create Payment68248742018-12-04 13:48:072273 days ago1543931287IN
0xF518348E...502533f05
0 ETH0.000674017
Sign68248552018-12-04 13:43:212273 days ago1543931001IN
0xF518348E...502533f05
0 ETH0.000602558.05
Create Payment68247942018-12-04 13:27:142273 days ago1543930034IN
0xF518348E...502533f05
0 ETH0.000866599
Create Payment68247792018-12-04 13:23:582273 days ago1543929838IN
0xF518348E...502533f05
0 ETH0.000712057.4
Release68247052018-12-04 13:07:322273 days ago1543928852IN
0xF518348E...502533f05
0 ETH0.000717928
Withdraw68241812018-12-04 11:05:532273 days ago1543921553IN
0xF518348E...502533f05
0 ETH0.001002439
Release68241632018-12-04 11:01:372273 days ago1543921297IN
0xF518348E...502533f05
0 ETH0.000618777
Deposit68241352018-12-04 10:56:192273 days ago1543920979IN
0xF518348E...502533f05
0.02856 ETH0.0032416230
View all transactions

Latest 7 internal transactions

Advanced mode:
Parent Transaction Hash Block
From
To
68253892018-12-04 15:48:312273 days ago1543938511
0xF518348E...502533f05
0.2 ETH
68249452018-12-04 14:04:522273 days ago1543932292
0xF518348E...502533f05
0.0001 ETH
68249362018-12-04 14:03:162273 days ago1543932196
0xF518348E...502533f05
0.000102 ETH
68249292018-12-04 14:01:022273 days ago1543932062
0xF518348E...502533f05
0.001 ETH
68248942018-12-04 13:53:102273 days ago1543931590
0xF518348E...502533f05
0.0001 ETH
68241352018-12-04 10:56:192273 days ago1543920979
0xF518348E...502533f05
0.02856 ETH
67527972018-11-22 17:00:322285 days ago1542906032
0xF518348E...502533f05
0.000119 ETH
Loading...
Loading

Contract Source Code Verified (Exact Match)

Contract Name:
Escrow

Compiler Version
v0.4.24+commit.e67f0147

Optimization Enabled:
Yes with 200 runs

Other Settings:
default evmVersion

Contract Source Code (Solidity)

/**
 *Submitted for verification at Etherscan.io on 2018-11-22
*/

pragma solidity ^0.4.22;

contract Ownable {
    address public owner;
    
    event OwnershipTransferred(address indexed previousOwner, address indexed newOwner);
    
    /**
     * @dev The Ownable constructor sets the original `owner` of the contract to the sender
     * account.
     */
    constructor() public {
        owner = msg.sender;
    }

    /**
     * @dev Throws if called by any account other than the owner.
     */
    modifier onlyOwner() {
        require(msg.sender == owner);
        _;
    }

    /**
     * @dev Allows the current owner to transfer control of the contract to a newOwner.
     * @param newOwner The address to transfer ownership to.
     */
    function transferOwnership(address newOwner) public onlyOwner {
        require(newOwner != address(0));
        emit OwnershipTransferred(owner, newOwner);
        owner = newOwner;
    }

}

contract Token  {
    event Transfer(address indexed _from, address indexed _to, uint256 _value);
    event Approval(address indexed _owner, address indexed _spender, uint256 _value);

    uint256 public totalSupply;

    function balanceOf(address _owner) public view returns (uint256 balance);
    function transfer(address _to, uint256 _value) public returns (bool success);
    function transferFrom(address _from, address _to, uint256 _value) public returns (bool success);
    function approve(address _spender, uint256 _value) public returns (bool success);
    function allowance(address _owner, address _spender) public view returns (uint256 remaining);
    function increaseApproval (address _spender, uint _addedValue) public returns (bool success);
    function decreaseApproval (address _spender, uint _subtractedValue)public returns (bool success);

}

contract EternalStorage {

    /**** Storage Types *******/

    address public owner;

    mapping(bytes32 => uint256)    private uIntStorage;
    mapping(bytes32 => uint8)      private uInt8Storage;
    mapping(bytes32 => string)     private stringStorage;
    mapping(bytes32 => address)    private addressStorage;
    mapping(bytes32 => bytes)      private bytesStorage;
    mapping(bytes32 => bool)       private boolStorage;
    mapping(bytes32 => int256)     private intStorage;
    mapping(bytes32 => bytes32)    private bytes32Storage;


    /*** Modifiers ************/

    /// @dev Only allow access from the latest version of a contract after deployment
    modifier onlyLatestContract() {
        require(addressStorage[keccak256(abi.encodePacked("contract.address", msg.sender))] != 0x0 || msg.sender == owner);
        _;
    }

    /// @dev constructor
    constructor() public {
        owner = msg.sender;
        addressStorage[keccak256(abi.encodePacked("contract.address", msg.sender))] = msg.sender;
    }

    function setOwner() public {
        require(msg.sender == owner);
        addressStorage[keccak256(abi.encodePacked("contract.address", owner))] = 0x0;
        owner = msg.sender;
        addressStorage[keccak256(abi.encodePacked("contract.address", msg.sender))] = msg.sender;
    }

    /**** Get Methods ***********/

    /// @param _key The key for the record
    function getAddress(bytes32 _key) external view returns (address) {
        return addressStorage[_key];
    }

    /// @param _key The key for the record
    function getUint(bytes32 _key) external view returns (uint) {
        return uIntStorage[_key];
    }

    /// @param _key The key for the record
    function getUint8(bytes32 _key) external view returns (uint8) {
        return uInt8Storage[_key];
    }


    /// @param _key The key for the record
    function getString(bytes32 _key) external view returns (string) {
        return stringStorage[_key];
    }

    /// @param _key The key for the record
    function getBytes(bytes32 _key) external view returns (bytes) {
        return bytesStorage[_key];
    }

    /// @param _key The key for the record
    function getBytes32(bytes32 _key) external view returns (bytes32) {
        return bytes32Storage[_key];
    }

    /// @param _key The key for the record
    function getBool(bytes32 _key) external view returns (bool) {
        return boolStorage[_key];
    }

    /// @param _key The key for the record
    function getInt(bytes32 _key) external view returns (int) {
        return intStorage[_key];
    }

    /**** Set Methods ***********/

    /// @param _key The key for the record
    function setAddress(bytes32 _key, address _value) onlyLatestContract external {
        addressStorage[_key] = _value;
    }

    /// @param _key The key for the record
    function setUint(bytes32 _key, uint _value) onlyLatestContract external {
        uIntStorage[_key] = _value;
    }

    /// @param _key The key for the record
    function setUint8(bytes32 _key, uint8 _value) onlyLatestContract external {
        uInt8Storage[_key] = _value;
    }

    /// @param _key The key for the record
    function setString(bytes32 _key, string _value) onlyLatestContract external {
        stringStorage[_key] = _value;
    }

    /// @param _key The key for the record
    function setBytes(bytes32 _key, bytes _value) onlyLatestContract external {
        bytesStorage[_key] = _value;
    }

    /// @param _key The key for the record
    function setBytes32(bytes32 _key, bytes32 _value) onlyLatestContract external {
        bytes32Storage[_key] = _value;
    }

    /// @param _key The key for the record
    function setBool(bytes32 _key, bool _value) onlyLatestContract external {
        boolStorage[_key] = _value;
    }

    /// @param _key The key for the record
    function setInt(bytes32 _key, int _value) onlyLatestContract external {
        intStorage[_key] = _value;
    }

    /**** Delete Methods ***********/

    /// @param _key The key for the record
    function deleteAddress(bytes32 _key) onlyLatestContract external {
        delete addressStorage[_key];
    }

    /// @param _key The key for the record
    function deleteUint(bytes32 _key) onlyLatestContract external {
        delete uIntStorage[_key];
    }

    /// @param _key The key for the record
    function deleteUint8(bytes32 _key) onlyLatestContract external {
        delete uInt8Storage[_key];
    }

    /// @param _key The key for the record
    function deleteString(bytes32 _key) onlyLatestContract external {
        delete stringStorage[_key];
    }

    /// @param _key The key for the record
    function deleteBytes(bytes32 _key) onlyLatestContract external {
        delete bytesStorage[_key];
    }

    /// @param _key The key for the record
    function deleteBytes32(bytes32 _key) onlyLatestContract external {
        delete bytes32Storage[_key];
    }

    /// @param _key The key for the record
    function deleteBool(bytes32 _key) onlyLatestContract external {
        delete boolStorage[_key];
    }

    /// @param _key The key for the record
    function deleteInt(bytes32 _key) onlyLatestContract external {
        delete intStorage[_key];
    }
}

contract PaymentHolder is Ownable {

    modifier onlyAllowed() {
        require(allowed[msg.sender]);
        _;
    }

    modifier onlyUpdater() {
        require(msg.sender == updater);
        _;
    }

    mapping(address => bool) public allowed;
    address public updater;

    /*-----------------MAINTAIN METHODS------------------*/

    function setUpdater(address _updater)
    external onlyOwner {
        updater = _updater;
    }

    function migrate(address newHolder, address[] tokens, address[] _allowed)
    external onlyOwner {
        require(PaymentHolder(newHolder).update.value(address(this).balance)(_allowed));
        for (uint256 i = 0; i < tokens.length; i++) {
            address token = tokens[i];
            uint256 balance = Token(token).balanceOf(this);
            if (balance > 0) {
                require(Token(token).transfer(newHolder, balance));
            }
        }
    }

    function update(address[] _allowed)
    external payable onlyUpdater returns(bool) {
        for (uint256 i = 0; i < _allowed.length; i++) {
            allowed[_allowed[i]] = true;
        }
        return true;
    }

    /*-----------------OWNER FLOW------------------*/

    function allow(address to) 
    external onlyOwner { allowed[to] = true; }

    function prohibit(address to)
    external onlyOwner { allowed[to] = false; }

    /*-----------------ALLOWED FLOW------------------*/

    function depositEth()
    public payable onlyAllowed returns (bool) {
        //Default function to receive eth
        return true;
    }

    function withdrawEth(address to, uint256 amount)
    public onlyAllowed returns(bool) {
        require(address(this).balance >= amount, "Not enough ETH balance");
        to.transfer(amount);
        return true;
    }

    function withdrawToken(address to, uint256 amount, address token)
    public onlyAllowed returns(bool) {
        require(Token(token).balanceOf(this) >= amount, "Not enough token balance");
        require(Token(token).transfer(to, amount));
        return true;
    }
}

library EscrowConfigLib {

    function getPaymentFee(address storageAddress) public view returns (uint8) {
        return EternalStorage(storageAddress).getUint8(keccak256(abi.encodePacked("escrow.config.payment.fee")));
    }

    function setPaymentFee(address storageAddress, uint8 value) public {
        EternalStorage(storageAddress).setUint8(keccak256(abi.encodePacked("escrow.config.payment.fee")), value);
    }

}

contract ICourt is Ownable {

    function getCaseId(address applicant, address respondent, bytes32 deal, uint256 date, bytes32 title, uint256 amount) 
        public pure returns(bytes32);

    function getCaseStatus(bytes32 caseId) public view returns(uint8);

    function getCaseVerdict(bytes32 caseId) public view returns(bool);
}

contract EscrowConfig is Ownable {

    using EscrowConfigLib for address;

    address public config;

    constructor(address storageAddress) public {
        config = storageAddress;
    }

    function resetValuesToDefault() external onlyOwner {
        config.setPaymentFee(2);//%
    }

    function setStorageAddress(address storageAddress) external onlyOwner {
        config = storageAddress;
    }

    function getPaymentFee() external view returns (uint8) {
        return config.getPaymentFee();
    }

    //value - % of payment amount
    function setPaymentFee(uint8 value) external onlyOwner {
        require(value >= 0 && value < 100, "Fee in % of payment amount must be >= 0 and < 100");
        config.setPaymentFee(value);
    }
}

contract Withdrawable is Ownable {
    function withdrawEth(uint value) external onlyOwner {
        require(address(this).balance >= value);
        msg.sender.transfer(value);
    }

    function withdrawToken(address token, uint value) external onlyOwner {
        require(Token(token).balanceOf(address(this)) >= value, "Not enough tokens");
        require(Token(token).transfer(msg.sender, value));
    }
}

library PaymentLib {

    function getPaymentId(address[3] addresses, bytes32 deal, uint256 amount) public pure returns (bytes32) {
        return keccak256(abi.encodePacked(addresses[0], addresses[1], addresses[2], deal, amount));
    }

    function createPayment(
        address storageAddress, bytes32 paymentId, uint8 fee, uint8 status, bool feePayed
    ) public {
        setPaymentStatus(storageAddress, paymentId, status);
        setPaymentFee(storageAddress, paymentId, fee);
        if (feePayed) {
            setFeePayed(storageAddress, paymentId, true);
        }
    }

    function isCancelRequested(address storageAddress, bytes32 paymentId, address party)
    public view returns(bool) {
        return EternalStorage(storageAddress).getBool(keccak256(abi.encodePacked("payment.cance", paymentId, party)));
    }

    function setCancelRequested(address storageAddress, bytes32 paymentId, address party, bool value)
    public {
        EternalStorage(storageAddress).setBool(keccak256(abi.encodePacked("payment.cance", paymentId, party)), value);
    }

    function getPaymentFee(address storageAddress, bytes32 paymentId)
    public view returns (uint8) {
        return EternalStorage(storageAddress).getUint8(keccak256(abi.encodePacked("payment.fee", paymentId)));
    }

    function setPaymentFee(address storageAddress, bytes32 paymentId, uint8 value)
    public {
        EternalStorage(storageAddress).setUint8(keccak256(abi.encodePacked("payment.fee", paymentId)), value);
    }

    function isFeePayed(address storageAddress, bytes32 paymentId)
    public view returns (bool) {
        return EternalStorage(storageAddress).getBool(keccak256(abi.encodePacked("payment.fee.payed", paymentId)));
    }

    function setFeePayed(address storageAddress, bytes32 paymentId, bool value)
    public {
        EternalStorage(storageAddress).setBool(keccak256(abi.encodePacked("payment.fee.payed", paymentId)), value);
    }

    function isDeposited(address storageAddress, bytes32 paymentId)
    public view returns (bool) {
        return EternalStorage(storageAddress).getBool(keccak256(abi.encodePacked("payment.deposited", paymentId)));
    }

    function setDeposited(address storageAddress, bytes32 paymentId, bool value)
    public {
        EternalStorage(storageAddress).setBool(keccak256(abi.encodePacked("payment.deposited", paymentId)), value);
    }

    function isSigned(address storageAddress, bytes32 paymentId)
    public view returns (bool) {
        return EternalStorage(storageAddress).getBool(keccak256(abi.encodePacked("payment.signed", paymentId)));
    }

    function setSigned(address storageAddress, bytes32 paymentId, bool value)
    public {
        EternalStorage(storageAddress).setBool(keccak256(abi.encodePacked("payment.signed", paymentId)), value);
    }

    function getPaymentStatus(address storageAddress, bytes32 paymentId)
    public view returns (uint8) {
        return EternalStorage(storageAddress).getUint8(keccak256(abi.encodePacked("payment.status", paymentId)));
    }

    function setPaymentStatus(address storageAddress, bytes32 paymentId, uint8 status)
    public {
        EternalStorage(storageAddress).setUint8(keccak256(abi.encodePacked("payment.status", paymentId)), status);
    }

    function getOfferAmount(address storageAddress, bytes32 paymentId, address user)
    public view returns (uint256) {
        return EternalStorage(storageAddress).getUint(keccak256(abi.encodePacked("payment.amount.refund", paymentId, user)));
    }

    function setOfferAmount(address storageAddress, bytes32 paymentId, address user, uint256 amount)
    public {
        EternalStorage(storageAddress).setUint(keccak256(abi.encodePacked("payment.amount.refund", paymentId, user)), amount);
    }

    function getWithdrawAmount(address storageAddress, bytes32 paymentId, address user)
    public view returns (uint256) {
        return EternalStorage(storageAddress).getUint(keccak256(abi.encodePacked("payment.amount.withdraw", paymentId, user)));
    }

    function setWithdrawAmount(address storageAddress, bytes32 paymentId, address user, uint256 amount)
    public {
        EternalStorage(storageAddress).setUint(keccak256(abi.encodePacked("payment.amount.withdraw", paymentId, user)), amount);
    }

    function isWithdrawn(address storageAddress, bytes32 paymentId, address user)
    public view returns (bool) {
        return EternalStorage(storageAddress).getBool(keccak256(abi.encodePacked("payment.withdrawed", paymentId, user)));
    }

    function setWithdrawn(address storageAddress, bytes32 paymentId, address user, bool value)
    public {
        EternalStorage(storageAddress).setBool(keccak256(abi.encodePacked("payment.withdrawed", paymentId, user)), value);
    }

    function getPayment(address storageAddress, bytes32 paymentId)
    public view returns(
        uint8 status, uint8 fee, bool feePayed, bool signed, bool deposited
    ) {
        status = uint8(getPaymentStatus(storageAddress, paymentId));
        fee = getPaymentFee(storageAddress, paymentId);
        feePayed = isFeePayed(storageAddress, paymentId);
        signed = isSigned(storageAddress, paymentId);
        deposited = isDeposited(storageAddress, paymentId);
    }

    function getPaymentOffers(address storageAddress, address depositor, address beneficiary, bytes32 paymentId)
    public view returns(uint256 depositorOffer, uint256 beneficiaryOffer) {
        depositorOffer = getOfferAmount(storageAddress, paymentId, depositor);
        beneficiaryOffer = getOfferAmount(storageAddress, paymentId, beneficiary);
    }
}

contract IEscrow is Withdrawable {

    /*----------------------PAYMENT STATUSES----------------------*/

    //SIGNED status kept for backward compatibility
    enum PaymentStatus {NONE/*code=0*/, CREATED/*code=1*/, SIGNED/*code=2*/, CONFIRMED/*code=3*/, RELEASED/*code=4*/, RELEASED_BY_DISPUTE /*code=5*/, CLOSED/*code=6*/, CANCELED/*code=7*/}

    /*----------------------EVENTS----------------------*/

    event PaymentCreated(bytes32 paymentId, address depositor, address beneficiary, address token, bytes32 deal, uint256 amount, uint8 fee, bool feePayed);
    event PaymentSigned(bytes32 paymentId, bool confirmed);
    event PaymentDeposited(bytes32 paymentId, uint256 depositedAmount, bool confirmed);
    event PaymentReleased(bytes32 paymentId);
    event PaymentOffer(bytes32 paymentId, uint256 offerAmount);
    event PaymentOfferCanceled(bytes32 paymentId);
    event PaymentOwnOfferCanceled(bytes32 paymentId);
    event PaymentOfferAccepted(bytes32 paymentId, uint256 releaseToBeneficiary, uint256 refundToDepositor);
    event PaymentWithdrawn(bytes32 paymentId, uint256 amount);
    event PaymentWithdrawnByDispute(bytes32 paymentId, uint256 amount, bytes32 dispute);
    event PaymentCanceled(bytes32 paymentId);
    event PaymentClosed(bytes32 paymentId);
    event PaymentClosedByDispute(bytes32 paymentId, bytes32 dispute);

    /*----------------------PUBLIC STATE----------------------*/

    address public lib;
    address public courtAddress;
    address public paymentHolder;


    /*----------------------CONFIGURATION METHODS (only owner) ----------------------*/
    function setStorageAddress(address _storageAddress) external;

    function setCourtAddress(address _courtAddress) external;

    /*----------------------PUBLIC USER METHODS----------------------*/
    /** @dev Depositor creates escrow payment. Set token as 0x0 in case of ETH amount.
      * @param addresses [depositor, beneficiary, token]
      * @param depositorPayFee If true, depositor have to send (amount + (amount * fee) / 100).
      */
    function createPayment(address[3] addresses, bytes32 deal, uint256 amount, bool depositorPayFee) external;

    /** @dev Beneficiary signs escrow payment as consent for taking part.
      * @param addresses [depositor, beneficiary, token]
      */
    function sign(address[3] addresses, bytes32 deal, uint256 amount) external;

    /** @dev Depositor deposits payment amount only after it was signed by beneficiary.
      * @param addresses [depositor, beneficiary, token]
      */
    function deposit(address[3] addresses, bytes32 deal, uint256 amount) external payable;

    /** @dev Depositor or Beneficiary requests payment cancellation after payment was signed by beneficiary.
      *      Payment is closed, if depositor and beneficiary both request cancellation.
      * @param addresses [depositor, beneficiary, token]
      */
    function cancel(address[3] addresses, bytes32 deal, uint256 amount) external;

    /** @dev Depositor close payment though transfer payment amount to another party.
      * @param addresses [depositor, beneficiary, token]
      */
    function release(address[3] addresses, bytes32 deal, uint256 amount) external;

    /** @dev Depositor or beneficiary offers partial closing payment with offerAmount.
      * @param addresses [depositor, beneficiary, token]
      * @param offerAmount Amount of partial closing offer in currency of payment (ETH or token).
      */
    function offer(address[3] addresses, bytes32 deal, uint256 amount, uint256 offerAmount) external;

    /** @dev Depositor or beneficiary canceles another party offer.
      * @param addresses [depositor, beneficiary, token]
      */
    function cancelOffer(address[3] addresses, bytes32 deal, uint256 amount) external;

    /** @dev Depositor or beneficiary cancels own offer.
      * @param addresses [depositor, beneficiary, token]
      */
    function cancelOwnOffer(address[3] addresses, bytes32 deal, uint256 amount) external;

    /** @dev Depositor or beneficiary accepts opposite party offer.
      * @param addresses [depositor, beneficiary, token]
      */
    function acceptOffer(address[3] addresses, bytes32 deal, uint256 amount) external;


    /** @dev Depositor or beneficiary withdraw amounts.
      * @param addresses [depositor, beneficiary, token]
      */
    function withdraw(address[3] addresses, bytes32 deal, uint256 amount) external;

    /** @dev Depositor or Beneficiary withdraw amounts according dispute verdict.
      * @dev Have to use fucking arrays due to "stack too deep" issue.
      * @param addresses [depositor, beneficiary, token]
      * @param disputeParties [applicant, respondent]
      * @param uints [paymentAmount, disputeAmount, disputeCreatedAt]
      * @param byts [deal, disputeTitle]
      */
    function withdrawByDispute(address[3] addresses, address[2] disputeParties, uint256[3] uints, bytes32[2] byts) external;
}

contract Escrow is IEscrow {
    using PaymentLib for address;
    using EscrowConfigLib for address;

    constructor(address storageAddress, address _paymentHolder, address _courtAddress) public {
        lib = storageAddress;
        courtAddress = _courtAddress;
        paymentHolder = _paymentHolder;
    }

    /*----------------------CONFIGURATION METHODS----------------------*/

    function setStorageAddress(address _storageAddress) external onlyOwner {
        lib = _storageAddress;
    }

    function setPaymentHolder(address _paymentHolder) external onlyOwner {
        paymentHolder = _paymentHolder;
    }

    function setCourtAddress(address _courtAddress) external onlyOwner {
        courtAddress = _courtAddress;
    }

    /*----------------------PUBLIC USER METHODS----------------------*/

    /** @dev Depositor creates escrow payment. Set token as 0x0 in case of ETH amount.
      * @param addresses [depositor, beneficiary, token]
      * @param depositorPayFee If true, depositor have to send (amount + (amount * fee) / 100).
      */
    function createPayment(address[3] addresses, bytes32 deal, uint256 amount, bool depositorPayFee)
    external {
        onlyParties(addresses);
        require(addresses[0] != address(0), "Depositor can not be 0x0 address");
        require(addresses[1] != address(0), "Beneficiary can not be 0x0 address");
        require(addresses[0] != addresses[1], "Depositor and beneficiary can not be the same");
        require(deal != 0x0, "deal can not be 0x0");
        require(amount != 0, "amount can not be 0");
        bytes32 paymentId = getPaymentId(addresses, deal, amount);
        checkStatus(paymentId, PaymentStatus.NONE);
        uint8 fee = lib.getPaymentFee();
        lib.createPayment(paymentId, fee, uint8(PaymentStatus.CREATED), depositorPayFee);
        emit PaymentCreated(paymentId, addresses[0], addresses[1], addresses[2], deal, amount, fee, depositorPayFee);
    }

    /** @dev Beneficiary signs escrow payment as consent for taking part.
      * @param addresses [depositor, beneficiary, token]
      */
    function sign(address[3] addresses, bytes32 deal, uint256 amount)
    external {
        onlyBeneficiary(addresses);
        bytes32 paymentId = getPaymentId(addresses, deal, amount);
        require(!lib.isSigned(paymentId), "Payment can be signed only once");
        checkStatus(paymentId, PaymentStatus.CREATED);
        lib.setSigned(paymentId, true);
        bool confirmed = lib.isDeposited(paymentId);
        if (confirmed) {
            setPaymentStatus(paymentId, PaymentStatus.CONFIRMED);
        }
        emit PaymentSigned(paymentId, confirmed);
    }

    /** @dev Depositor deposits payment amount only after it was signed by beneficiary
      * @param addresses [depositor, beneficiary, token]
      */
    function deposit(address[3] addresses, bytes32 deal, uint256 amount)
    external payable {
        onlyDepositor(addresses);
        bytes32 paymentId = getPaymentId(addresses, deal, amount);
        PaymentStatus status = getPaymentStatus(paymentId);
        require(!lib.isDeposited(paymentId), "Payment can be deposited only once");
        require(status == PaymentStatus.CREATED || status == PaymentStatus.SIGNED, "Invalid current payment status");
        uint256 depositAmount = amount;
        if (lib.isFeePayed(paymentId)) {
            depositAmount = amount + calcFee(amount, lib.getPaymentFee(paymentId));
        }
        address token = getToken(addresses);
        if (token == address(0)) {
            require(msg.value == depositAmount, "ETH amount must be equal amount");
            require(PaymentHolder(paymentHolder).depositEth.value(msg.value)(), "Not enough eth");
        } else {
            require(msg.value == 0, "ETH amount must be 0 for token transfer");
            require(Token(token).allowance(msg.sender, address(this)) >= depositAmount, "Not enough token allowance");
            require(Token(token).balanceOf(msg.sender) >= depositAmount, "No enough tokens");
            require(Token(token).transferFrom(msg.sender, paymentHolder, depositAmount), "Error during transafer tokens");
        }
        lib.setDeposited(paymentId, true);
        bool confirmed = lib.isSigned(paymentId);
        if (confirmed) {
            setPaymentStatus(paymentId, PaymentStatus.CONFIRMED);
        }
        emit PaymentDeposited(paymentId, depositAmount, confirmed);
    }

    /** @dev Depositor or Beneficiary requests payment cancellation after payment was signed by beneficiary.
      *      Payment is closed, if depositor and beneficiary both request cancellation.
      * @param addresses [depositor, beneficiary, token]
      */
    function cancel(address[3] addresses, bytes32 deal, uint256 amount)
    external {
        onlyParties(addresses);
        bytes32 paymentId = getPaymentId(addresses, deal, amount);
        checkStatus(paymentId, PaymentStatus.CREATED);
        setPaymentStatus(paymentId, PaymentStatus.CANCELED);
        if (lib.isDeposited(paymentId)) {
            uint256 amountToRefund = amount;
            if (lib.isFeePayed(paymentId)) {
                amountToRefund = amount + calcFee(amount, lib.getPaymentFee(paymentId));
            }
            transfer(getDepositor(addresses), amountToRefund, getToken(addresses));
        }
        setPaymentStatus(paymentId, PaymentStatus.CANCELED);
        emit PaymentCanceled(paymentId);
        emit PaymentCanceled(paymentId);
    }

    /** @dev Depositor close payment though transfer payment amount to another party.
      * @param addresses [depositor, beneficiary, token]
      */
    function release(address[3] addresses, bytes32 deal, uint256 amount)
    external {
        onlyDepositor(addresses);
        bytes32 paymentId = getPaymentId(addresses, deal, amount);
        checkStatus(paymentId, PaymentStatus.CONFIRMED);
        doRelease(addresses, [amount, 0], paymentId);
        emit PaymentReleased(paymentId);
    }

    /** @dev Depositor or beneficiary offers partial closing payment with offerAmount.
      * @param addresses [depositor, beneficiary, token]
      * @param offerAmount Amount of partial closing offer in currency of payment (ETH or token).
      */
    function offer(address[3] addresses, bytes32 deal, uint256 amount, uint256 offerAmount)
    external {
        onlyParties(addresses);
        require(offerAmount >= 0 && offerAmount <= amount, "Offer amount must be >= 0 and <= payment amount");
        bytes32 paymentId = getPaymentId(addresses, deal, amount);
        uint256 anotherOfferAmount = lib.getOfferAmount(paymentId, getAnotherParty(addresses));
        require(anotherOfferAmount == 0, "Sender can not make offer if another party has done the same before");
        lib.setOfferAmount(paymentId, msg.sender, offerAmount);
        emit PaymentOffer(paymentId, offerAmount);
    }

    /** @dev Depositor or beneficiary cancels opposite party offer.
      * @param addresses [depositor, beneficiary, token]
      */
    function cancelOffer(address[3] addresses, bytes32 deal, uint256 amount)
    external {
        bytes32 paymentId = doCancelOffer(addresses, deal, amount, getAnotherParty(addresses));
        emit PaymentOfferCanceled(paymentId);
    }

    /** @dev Depositor or beneficiary cancels own offer.
    * @param addresses [depositor, beneficiary, token]
    */
    function cancelOwnOffer(address[3] addresses, bytes32 deal, uint256 amount)
    external {
        bytes32 paymentId = doCancelOffer(addresses, deal, amount, msg.sender);
        emit PaymentOwnOfferCanceled(paymentId);
    }

    /** @dev Depositor or beneficiary accepts opposite party offer.
      * @param addresses [depositor, beneficiary, token]
      */
    function acceptOffer(address[3] addresses, bytes32 deal, uint256 amount)
    external {
        onlyParties(addresses);
        bytes32 paymentId = getPaymentId(addresses, deal, amount);
        checkStatus(paymentId, PaymentStatus.CONFIRMED);
        uint256 offerAmount = lib.getOfferAmount(paymentId, getAnotherParty(addresses));
        require(offerAmount != 0, "Sender can not accept another party offer of 0");
        uint256 toBeneficiary = offerAmount;
        uint256 toDepositor = amount - offerAmount;
        //if sender is beneficiary
        if (msg.sender == addresses[1]) {
            toBeneficiary = amount - offerAmount;
            toDepositor = offerAmount;
        }
        doRelease(addresses, [toBeneficiary, toDepositor], paymentId);
        emit PaymentOfferAccepted(paymentId, toBeneficiary, toDepositor);
    }

    /** @dev Depositor or beneficiary withdraw amounts.
      * @param addresses [depositor, beneficiary, token]
      */
    function withdraw(address[3] addresses, bytes32 deal, uint256 amount)
    external {
        onlyParties(addresses);
        bytes32 paymentId = getPaymentId(addresses, deal, amount);
        checkStatus(paymentId, PaymentStatus.RELEASED);
        require(!lib.isWithdrawn(paymentId, msg.sender), "User can not withdraw twice.");
        uint256 withdrawAmount = lib.getWithdrawAmount(paymentId, msg.sender);
        withdrawAmount = transferWithFee(msg.sender, withdrawAmount, addresses[2], paymentId);
        emit PaymentWithdrawn(paymentId, withdrawAmount);
        lib.setWithdrawn(paymentId, msg.sender, true);
        address anotherParty = getAnotherParty(addresses);
        if (lib.getWithdrawAmount(paymentId, anotherParty) == 0 || lib.isWithdrawn(paymentId, anotherParty)) {
            setPaymentStatus(paymentId, PaymentStatus.CLOSED);
            emit PaymentClosed(paymentId);
        }
    }

    /** @dev Depositor or Beneficiary withdraw amounts according dispute verdict.
      * @dev Have to use fucking arrays due to "stack too deep" issue.
      * @param addresses [depositor, beneficiary, token]
      * @param disputeParties [applicant, respondent]
      * @param uints [paymentAmount, disputeAmount, disputeCreatedAt]
      * @param byts [deal, disputeTitle]
      */
    function withdrawByDispute(address[3] addresses, address[2] disputeParties, uint256[3] uints, bytes32[2] byts)
    external {
        onlyParties(addresses);
        require(
            addresses[0] == disputeParties[0] && addresses[1] == disputeParties[1] || addresses[0] == disputeParties[1] && addresses[1] == disputeParties[0],
            "Depositor and beneficiary must be dispute parties"
        );
        bytes32 paymentId = getPaymentId(addresses, byts[0], uints[0]);
        PaymentStatus paymentStatus = getPaymentStatus(paymentId);
        require(paymentStatus == PaymentStatus.CONFIRMED || paymentStatus == PaymentStatus.RELEASED_BY_DISPUTE, "Invalid current payment status");
        require(!lib.isWithdrawn(paymentId, msg.sender), "User can not withdraw twice.");
        bytes32 dispute = ICourt(courtAddress).getCaseId(
            disputeParties[0] /*applicant*/, disputeParties[1]/*respondent*/,
            paymentId/*deal*/, uints[2]/*disputeCreatedAt*/,
            byts[1]/*disputeTitle*/, uints[1]/*disputeAmount*/
        );
        require(ICourt(courtAddress).getCaseStatus(dispute) == 3, "Case must be closed");
        /*[releaseAmount, refundAmount]*/
        uint256[2] memory withdrawAmounts = [uint256(0), 0];
        bool won = ICourt(courtAddress).getCaseVerdict(dispute);
        //depositor == applicant
        if (won) {
            //use paymentAmount if disputeAmount is greater
            withdrawAmounts[0] = uints[1] > uints[0] ? uints[0] : uints[1];
            withdrawAmounts[1] = uints[0] - withdrawAmounts[0];
        } else {
            //make full release
            withdrawAmounts[1] = uints[0];
        }
        if (msg.sender != disputeParties[0]) {
            withdrawAmounts[0] = withdrawAmounts[0] + withdrawAmounts[1];
            withdrawAmounts[1] = withdrawAmounts[0] - withdrawAmounts[1];
            withdrawAmounts[0] = withdrawAmounts[0] - withdrawAmounts[1];
        }
        address anotherParty = getAnotherParty(addresses);
        //if sender is depositor
        withdrawAmounts[0] = transferWithFee(msg.sender, withdrawAmounts[0], addresses[2], paymentId);
        emit PaymentWithdrawnByDispute(paymentId, withdrawAmounts[0], dispute);
        lib.setWithdrawn(paymentId, msg.sender, true);
        if (withdrawAmounts[1] == 0 || lib.isWithdrawn(paymentId, anotherParty)) {
            setPaymentStatus(paymentId, PaymentStatus.CLOSED);
            emit PaymentClosedByDispute(paymentId, dispute);
        } else {
            //need to prevent withdraw by another flow, e.g. simple release or offer accepting
            setPaymentStatus(paymentId, PaymentStatus.RELEASED_BY_DISPUTE);
        }
    }

    /*------------------PRIVATE METHODS----------------------*/
    function getPaymentId(address[3] addresses, bytes32 deal, uint256 amount)
    public pure returns (bytes32) {return PaymentLib.getPaymentId(addresses, deal, amount);}

    function getDepositor(address[3] addresses) private pure returns (address) {return addresses[0];}

    function getBeneficiary(address[3] addresses) private pure returns (address) {return addresses[1];}

    function getToken(address[3] addresses) private pure returns (address) {return addresses[2];}

    function getAnotherParty(address[3] addresses) private view returns (address) {
        return msg.sender == addresses[0] ? addresses[1] : addresses[0];
    }

    function onlyParties(address[3] addresses) private view {require(msg.sender == addresses[0] || msg.sender == addresses[1]);}

    function onlyDepositor(address[3] addresses) private view {require(msg.sender == addresses[0]);}

    function onlyBeneficiary(address[3] addresses) private view {require(msg.sender == addresses[1]);}

    function getPaymentStatus(bytes32 paymentId)
    private view returns (PaymentStatus) {
        return PaymentStatus(lib.getPaymentStatus(paymentId));
    }

    function setPaymentStatus(bytes32 paymentId, PaymentStatus status)
    private {
        lib.setPaymentStatus(paymentId, uint8(status));
    }

    function checkStatus(bytes32 paymentId, PaymentStatus status)
    private view {
        require(lib.getPaymentStatus(paymentId) == uint8(status), "Required status does not match actual one");
    }

    function doCancelOffer(address[3] addresses, bytes32 deal, uint256 amount, address from)
    private returns(bytes32 paymentId) {
        onlyParties(addresses);
        paymentId = getPaymentId(addresses, deal, amount);
        checkStatus(paymentId, PaymentStatus.CONFIRMED);
        uint256 offerAmount = lib.getOfferAmount(paymentId, from);
        require(offerAmount != 0, "Sender can not cancel offer of 0");
        lib.setOfferAmount(paymentId, from, 0);
    }

    /** @param addresses [depositor, beneficiary, token]
      * @param amounts [releaseAmount, refundAmount]
      */
    function doRelease(address[3] addresses, uint256[2] amounts, bytes32 paymentId)
    private {
        setPaymentStatus(paymentId, PaymentStatus.RELEASED);
        lib.setWithdrawAmount(paymentId, getBeneficiary(addresses), amounts[0]);
        lib.setWithdrawAmount(paymentId, getDepositor(addresses), amounts[1]);
    }

    function transferWithFee(address to, uint256 amount, address token, bytes32 paymentId)
    private returns (uint256 amountMinusFee) {
        require(amount != 0, "There is sense to invoke this method if withdraw amount is 0.");
        uint8 fee = 0;
        if (!lib.isFeePayed(paymentId)) {
            fee = lib.getPaymentFee(paymentId);
        }
        amountMinusFee = amount - calcFee(amount, fee);
        transfer(to, amountMinusFee, token);
    }

    function transfer(address to, uint256 amount, address token)
    private {
        if (amount == 0) {
            return;
        }
        if (token == address(0)) {
            require(PaymentHolder(paymentHolder).withdrawEth(to, amount), "Error during withdraw ETH");
        } else {
            require(PaymentHolder(paymentHolder).withdrawToken(to, amount, token), "Error during withdraw Token");
        }
    }

    function calcFee(uint amount, uint fee)
    private pure returns (uint256) {
        return ((amount * fee) / 100);
    }
}

Contract Security Audit

Contract ABI

[{"constant":false,"inputs":[{"name":"addresses","type":"address[3]"},{"name":"deal","type":"bytes32"},{"name":"amount","type":"uint256"}],"name":"sign","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":false,"inputs":[{"name":"addresses","type":"address[3]"},{"name":"disputeParties","type":"address[2]"},{"name":"uints","type":"uint256[3]"},{"name":"byts","type":"bytes32[2]"}],"name":"withdrawByDispute","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":false,"inputs":[{"name":"addresses","type":"address[3]"},{"name":"deal","type":"bytes32"},{"name":"amount","type":"uint256"}],"name":"cancel","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":false,"inputs":[{"name":"addresses","type":"address[3]"},{"name":"deal","type":"bytes32"},{"name":"amount","type":"uint256"}],"name":"deposit","outputs":[],"payable":true,"stateMutability":"payable","type":"function"},{"constant":false,"inputs":[{"name":"addresses","type":"address[3]"},{"name":"deal","type":"bytes32"},{"name":"amount","type":"uint256"},{"name":"depositorPayFee","type":"bool"}],"name":"createPayment","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":false,"inputs":[{"name":"_storageAddress","type":"address"}],"name":"setStorageAddress","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":false,"inputs":[{"name":"addresses","type":"address[3]"},{"name":"deal","type":"bytes32"},{"name":"amount","type":"uint256"}],"name":"cancelOffer","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":true,"inputs":[{"name":"addresses","type":"address[3]"},{"name":"deal","type":"bytes32"},{"name":"amount","type":"uint256"}],"name":"getPaymentId","outputs":[{"name":"","type":"bytes32"}],"payable":false,"stateMutability":"pure","type":"function"},{"constant":true,"inputs":[],"name":"paymentHolder","outputs":[{"name":"","type":"address"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":false,"inputs":[{"name":"_paymentHolder","type":"address"}],"name":"setPaymentHolder","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":false,"inputs":[{"name":"_courtAddress","type":"address"}],"name":"setCourtAddress","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":true,"inputs":[],"name":"owner","outputs":[{"name":"","type":"address"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[],"name":"lib","outputs":[{"name":"","type":"address"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":false,"inputs":[{"name":"token","type":"address"},{"name":"value","type":"uint256"}],"name":"withdrawToken","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":false,"inputs":[{"name":"addresses","type":"address[3]"},{"name":"deal","type":"bytes32"},{"name":"amount","type":"uint256"}],"name":"acceptOffer","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":false,"inputs":[{"name":"addresses","type":"address[3]"},{"name":"deal","type":"bytes32"},{"name":"amount","type":"uint256"}],"name":"withdraw","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":true,"inputs":[],"name":"courtAddress","outputs":[{"name":"","type":"address"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":false,"inputs":[{"name":"addresses","type":"address[3]"},{"name":"deal","type":"bytes32"},{"name":"amount","type":"uint256"}],"name":"cancelOwnOffer","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":false,"inputs":[{"name":"value","type":"uint256"}],"name":"withdrawEth","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":false,"inputs":[{"name":"addresses","type":"address[3]"},{"name":"deal","type":"bytes32"},{"name":"amount","type":"uint256"}],"name":"release","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":false,"inputs":[{"name":"addresses","type":"address[3]"},{"name":"deal","type":"bytes32"},{"name":"amount","type":"uint256"},{"name":"offerAmount","type":"uint256"}],"name":"offer","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":false,"inputs":[{"name":"newOwner","type":"address"}],"name":"transferOwnership","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"inputs":[{"name":"storageAddress","type":"address"},{"name":"_paymentHolder","type":"address"},{"name":"_courtAddress","type":"address"}],"payable":false,"stateMutability":"nonpayable","type":"constructor"},{"anonymous":false,"inputs":[{"indexed":false,"name":"paymentId","type":"bytes32"},{"indexed":false,"name":"depositor","type":"address"},{"indexed":false,"name":"beneficiary","type":"address"},{"indexed":false,"name":"token","type":"address"},{"indexed":false,"name":"deal","type":"bytes32"},{"indexed":false,"name":"amount","type":"uint256"},{"indexed":false,"name":"fee","type":"uint8"},{"indexed":false,"name":"feePayed","type":"bool"}],"name":"PaymentCreated","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"name":"paymentId","type":"bytes32"},{"indexed":false,"name":"confirmed","type":"bool"}],"name":"PaymentSigned","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"name":"paymentId","type":"bytes32"},{"indexed":false,"name":"depositedAmount","type":"uint256"},{"indexed":false,"name":"confirmed","type":"bool"}],"name":"PaymentDeposited","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"name":"paymentId","type":"bytes32"}],"name":"PaymentReleased","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"name":"paymentId","type":"bytes32"},{"indexed":false,"name":"offerAmount","type":"uint256"}],"name":"PaymentOffer","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"name":"paymentId","type":"bytes32"}],"name":"PaymentOfferCanceled","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"name":"paymentId","type":"bytes32"}],"name":"PaymentOwnOfferCanceled","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"name":"paymentId","type":"bytes32"},{"indexed":false,"name":"releaseToBeneficiary","type":"uint256"},{"indexed":false,"name":"refundToDepositor","type":"uint256"}],"name":"PaymentOfferAccepted","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"name":"paymentId","type":"bytes32"},{"indexed":false,"name":"amount","type":"uint256"}],"name":"PaymentWithdrawn","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"name":"paymentId","type":"bytes32"},{"indexed":false,"name":"amount","type":"uint256"},{"indexed":false,"name":"dispute","type":"bytes32"}],"name":"PaymentWithdrawnByDispute","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"name":"paymentId","type":"bytes32"}],"name":"PaymentCanceled","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"name":"paymentId","type":"bytes32"}],"name":"PaymentClosed","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"name":"paymentId","type":"bytes32"},{"indexed":false,"name":"dispute","type":"bytes32"}],"name":"PaymentClosedByDispute","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"name":"previousOwner","type":"address"},{"indexed":true,"name":"newOwner","type":"address"}],"name":"OwnershipTransferred","type":"event"}]

608060405234801561001057600080fd5b50604051606080613c4683398101604090815281516020830151919092015160008054600160a060020a0319908116331790915560018054600160a060020a03958616908316179055600280549285169282169290921790915560038054939092169216919091179055613bbd806100896000396000f30060806040526004361061010e5763ffffffff60e060020a60003504166317958e72811461011357806321d6806e146101325780632f548b84146101505780633881babe1461016d57806358401a9c1461017d57806359b910d61461019f5780635ab01de8146101c05780636b5a8d4e146101dd5780636c8d9a841461023a5780637db5c88e1461026b5780638c838d6f1461028c5780638da5cb5b146102ad57806392801230146102c25780639e281a98146102d7578063a82c7b5a146102fb578063b2e7495114610318578063b67fc9e614610335578063c09f1d191461034a578063c311d04914610367578063cb37cce01461037f578063d0c62e4f1461039c578063f2fde38b146103bc575b600080fd5b34801561011f57600080fd5b5061013060046064356084356103dd565b005b34801561013e57600080fd5b506101306004606460a46101046106e3565b34801561015c57600080fd5b506101306004606435608435610eb5565b610130600460643560843561121d565b34801561018957600080fd5b50610130600460643560843560a4351515611bbb565b3480156101ab57600080fd5b50610130600160a060020a0360043516612028565b3480156101cc57600080fd5b50610130600460643560843561206e565b3480156101e957600080fd5b50604080516060818101909252610228913691600491606491908390600390839083908082843750939650508335945050506020909101359050612105565b60408051918252519081900360200190f35b34801561024657600080fd5b5061024f6121ca565b60408051600160a060020a039092168252519081900360200190f35b34801561027757600080fd5b50610130600160a060020a03600435166121d9565b34801561029857600080fd5b50610130600160a060020a036004351661221f565b3480156102b957600080fd5b5061024f612265565b3480156102ce57600080fd5b5061024f612274565b3480156102e357600080fd5b50610130600160a060020a0360043516602435612283565b34801561030757600080fd5b506101306004606435608435612423565b34801561032457600080fd5b50610130600460643560843561268e565b34801561034157600080fd5b5061024f612b63565b34801561035657600080fd5b506101306004606435608435612b72565b34801561037357600080fd5b50610130600435612be2565b34801561038b57600080fd5b506101306004606435608435612c34565b3480156103a857600080fd5b50610130600460643560843560a435612d13565b3480156103c857600080fd5b50610130600160a060020a0360043516613059565b60008061040c856003806020026040519081016040528092919082600360200280828437506130ed9350505050565b604080516060818101909252610438918790600390839083908082843782019150505050508585612105565b600154604080517f5202d820000000000000000000000000000000000000000000000000000000008152600160a060020a03909216600483015260248201839052519193507370edf62a31c67116e2c1abdd16721dcefbd40b7c91635202d82091604480820192602092909190829003018186803b1580156104b957600080fd5b505af41580156104cd573d6000803e3d6000fd5b505050506040513d60208110156104e357600080fd5b50511561053a576040805160e560020a62461bcd02815260206004820152601f60248201527f5061796d656e742063616e206265207369676e6564206f6e6c79206f6e636500604482015290519081900360640190fd5b61054582600161310d565b60018054604080517f37dd2acd000000000000000000000000000000000000000000000000000000008152600160a060020a03909216600483015260248201859052604482019290925290517370edf62a31c67116e2c1abdd16721dcefbd40b7c916337dd2acd916064808301926000929190829003018186803b1580156105cc57600080fd5b505af41580156105e0573d6000803e3d6000fd5b5050600154604080517fc0194bb2000000000000000000000000000000000000000000000000000000008152600160a060020a03909216600483015260248201869052517370edf62a31c67116e2c1abdd16721dcefbd40b7c935063c0194bb292506044808301926020929190829003018186803b15801561066157600080fd5b505af4158015610675573d6000803e3d6000fd5b505050506040513d602081101561068b57600080fd5b5051905080156106a0576106a0826003613247565b60408051838152821515602082015281517f745edda55b0281ac9c1b596cac561f470be837d565adc773ea2f6f6e03e62097929181900390910190a15050505050565b60008060006106f0613b76565b60008061071f8a6003806020026040519081016040528092919082600360200280828437506132e39350505050565b8935600160a060020a039081168a3591909116148015610752575060208a810135600160a060020a03908116918b013516145b8061078e57508935600160a060020a0390811660208b01359190911614801561078e575060208a0135600160a060020a039081168a3591909116145b151561080a576040805160e560020a62461bcd02815260206004820152603160248201527f4465706f7369746f7220616e642062656e6566696369617279206d757374206260448201527f6520646973707574652070617274696573000000000000000000000000000000606482015290519081900360840190fd5b604080516060818101909252610843918c906003908390839080828437508c935060009250610837915050565b60200201358a35612105565b955061084e86613309565b9450600385600781111561085e57fe5b14806108755750600585600781111561087357fe5b145b15156108cb576040805160e560020a62461bcd02815260206004820152601e60248201527f496e76616c69642063757272656e74207061796d656e74207374617475730000604482015290519081900360640190fd5b6001546040805160e060020a63e3d79b23028152600160a060020a03909216600483015260248201889052336044830152517370edf62a31c67116e2c1abdd16721dcefbd40b7c9163e3d79b23916064808301926020929190829003018186803b15801561093857600080fd5b505af415801561094c573d6000803e3d6000fd5b505050506040513d602081101561096257600080fd5b5051156109b9576040805160e560020a62461bcd02815260206004820152601c60248201527f557365722063616e206e6f742077697468647261772074776963652e00000000604482015290519081900360640190fd5b600254604080517fb4e85e8b000000000000000000000000000000000000000000000000000000008152600160a060020a038c35811660048301526020808e013582166024840152604483018b90528c84013560648401528b81013560848401528c81013560a4840152925193169263b4e85e8b9260c4808401939192918290030181600087803b158015610a4d57600080fd5b505af1158015610a61573d6000803e3d6000fd5b505050506040513d6020811015610a7757600080fd5b5051600254604080517f258198af000000000000000000000000000000000000000000000000000000008152600481018490529051929650600160a060020a039091169163258198af916024808201926020929091908290030181600087803b158015610ae357600080fd5b505af1158015610af7573d6000803e3d6000fd5b505050506040513d6020811015610b0d57600080fd5b505160ff16600314610b69576040805160e560020a62461bcd02815260206004820152601360248201527f43617365206d75737420626520636c6f73656400000000000000000000000000604482015290519081900360640190fd5b6040805180820182526000808252602080830182905260025484517ffeecca1b000000000000000000000000000000000000000000000000000000008152600481018a90529451939750600160a060020a03169363feecca1b9360248083019491928390030190829087803b158015610be157600080fd5b505af1158015610bf5573d6000803e3d6000fd5b505050506040513d6020811015610c0b57600080fd5b505191508115610c3e578735602089013511610c2b576020880135610c2e565b87355b8084528835036020840152610c46565b873560208401525b33600160a060020a038a351614610c6c5760208301805184518101908103918290520383525b604080516060818101909252610c94918c906003908390839080828437506133ca9350505050565b8351909150610cb3903390600160a060020a0360408e013516896133f4565b808452604080518881526020810192909252818101869052517f4bdd5fc7075e9a3e0f5b7a7c89d8cc2109bf7f17b8539083cf459dcdaab4627d9181900360600190a160018054604080517f4eb58add000000000000000000000000000000000000000000000000000000008152600160a060020a03909216600483015260248201899052336044830152606482019290925290517370edf62a31c67116e2c1abdd16721dcefbd40b7c91634eb58add916084808301926000929190829003018186803b158015610d8357600080fd5b505af4158015610d97573d6000803e3d6000fd5b5085925060019150610da69050565b60200201511580610e4e57506001546040805160e060020a63e3d79b23028152600160a060020a039283166004820152602481018990529183166044830152517370edf62a31c67116e2c1abdd16721dcefbd40b7c9163e3d79b23916064808301926020929190829003018186803b158015610e2157600080fd5b505af4158015610e35573d6000803e3d6000fd5b505050506040513d6020811015610e4b57600080fd5b50515b15610e9e57610e5e866006613247565b604080518781526020810186905281517f4df10cf6d48f8da5081ba3ae81b03bda1ebc3687f7d26689effe6179980ac958929181900390910190a1610ea9565b610ea9866005613247565b50505050505050505050565b600080610ee4856003806020026040519081016040528092919082600360200280828437506132e39350505050565b604080516060818101909252610f10918790600390839083908082843782019150505050508585612105565b9150610f1d82600161310d565b610f28826007613247565b600154604080517fc0194bb2000000000000000000000000000000000000000000000000000000008152600160a060020a03909216600483015260248201849052517370edf62a31c67116e2c1abdd16721dcefbd40b7c9163c0194bb2916044808301926020929190829003018186803b158015610fa557600080fd5b505af4158015610fb9573d6000803e3d6000fd5b505050506040513d6020811015610fcf57600080fd5b5051156111a55750600154604080517fbac9b405000000000000000000000000000000000000000000000000000000008152600160a060020a039092166004830152602482018390525183917370edf62a31c67116e2c1abdd16721dcefbd40b7c9163bac9b40591604480820192602092909190829003018186803b15801561105757600080fd5b505af415801561106b573d6000803e3d6000fd5b505050506040513d602081101561108157600080fd5b50511561114457600154604080517fc1c8bbff000000000000000000000000000000000000000000000000000000008152600160a060020a039092166004830152602482018490525161113f9185917370edf62a31c67116e2c1abdd16721dcefbd40b7c9163c1c8bbff916044808301926020929190829003018186803b15801561110b57600080fd5b505af415801561111f573d6000803e3d6000fd5b505050506040513d602081101561113557600080fd5b505160ff166135f9565b830190505b6111a5611173866003806020026040519081016040528092919082600360200280828437506136019350505050565b826111a08860038060200260405190810160405280929190826003602002808284375061360a9350505050565b613614565b6111b0826007613247565b6040805183815290517f40929445cf61fa3eecb1608d40d8d799740665fd4ff83b863f0050e89792b1299181900360200190a16040805183815290517f40929445cf61fa3eecb1608d40d8d799740665fd4ff83b863f0050e89792b1299181900360200190a15050505050565b6000806000806000611251886003806020026040519081016040528092919082600360200280828437506138249350505050565b60408051606081810190925261127d918a90600390839083908082843782019150505050508888612105565b945061128885613309565b600154604080517fc0194bb2000000000000000000000000000000000000000000000000000000008152600160a060020a03909216600483015260248201889052519195507370edf62a31c67116e2c1abdd16721dcefbd40b7c9163c0194bb291604480820192602092909190829003018186803b15801561130957600080fd5b505af415801561131d573d6000803e3d6000fd5b505050506040513d602081101561133357600080fd5b5051156113b0576040805160e560020a62461bcd02815260206004820152602260248201527f5061796d656e742063616e206265206465706f7369746564206f6e6c79206f6e60448201527f6365000000000000000000000000000000000000000000000000000000000000606482015290519081900360840190fd5b60018460078111156113be57fe5b14806113d5575060028460078111156113d357fe5b145b151561142b576040805160e560020a62461bcd02815260206004820152601e60248201527f496e76616c69642063757272656e74207061796d656e74207374617475730000604482015290519081900360640190fd5b600154604080517fbac9b405000000000000000000000000000000000000000000000000000000008152600160a060020a03909216600483015260248201879052518794507370edf62a31c67116e2c1abdd16721dcefbd40b7c9163bac9b405916044808301926020929190829003018186803b1580156114ab57600080fd5b505af41580156114bf573d6000803e3d6000fd5b505050506040513d60208110156114d557600080fd5b50511561156457600154604080517fc1c8bbff000000000000000000000000000000000000000000000000000000008152600160a060020a039092166004830152602482018790525161155f9188917370edf62a31c67116e2c1abdd16721dcefbd40b7c9163c1c8bbff916044808301926020929190829003018186803b15801561110b57600080fd5b860192505b60408051606081810190925261158c918a9060039083908390808284375061360a9350505050565b9150600160a060020a03821615156116d0573483146115f5576040805160e560020a62461bcd02815260206004820152601f60248201527f45544820616d6f756e74206d75737420626520657175616c20616d6f756e7400604482015290519081900360640190fd5b600360009054906101000a9004600160a060020a0316600160a060020a031663439370b1346040518263ffffffff1660e060020a0281526004016020604051808303818588803b15801561164857600080fd5b505af115801561165c573d6000803e3d6000fd5b50505050506040513d602081101561167357600080fd5b505115156116cb576040805160e560020a62461bcd02815260206004820152600e60248201527f4e6f7420656e6f75676820657468000000000000000000000000000000000000604482015290519081900360640190fd5b611a15565b341561174c576040805160e560020a62461bcd02815260206004820152602760248201527f45544820616d6f756e74206d757374206265203020666f7220746f6b656e207460448201527f72616e7366657200000000000000000000000000000000000000000000000000606482015290519081900360840190fd5b604080517fdd62ed3e00000000000000000000000000000000000000000000000000000000815233600482015230602482015290518491600160a060020a0385169163dd62ed3e916044808201926020929091908290030181600087803b1580156117b657600080fd5b505af11580156117ca573d6000803e3d6000fd5b505050506040513d60208110156117e057600080fd5b50511015611838576040805160e560020a62461bcd02815260206004820152601a60248201527f4e6f7420656e6f75676820746f6b656e20616c6c6f77616e6365000000000000604482015290519081900360640190fd5b604080517f70a0823100000000000000000000000000000000000000000000000000000000815233600482015290518491600160a060020a038516916370a08231916024808201926020929091908290030181600087803b15801561189c57600080fd5b505af11580156118b0573d6000803e3d6000fd5b505050506040513d60208110156118c657600080fd5b5051101561191e576040805160e560020a62461bcd02815260206004820152601060248201527f4e6f20656e6f75676820746f6b656e7300000000000000000000000000000000604482015290519081900360640190fd5b600354604080517f23b872dd000000000000000000000000000000000000000000000000000000008152336004820152600160a060020a039283166024820152604481018690529051918416916323b872dd916064808201926020929091908290030181600087803b15801561199357600080fd5b505af11580156119a7573d6000803e3d6000fd5b505050506040513d60208110156119bd57600080fd5b50511515611a15576040805160e560020a62461bcd02815260206004820152601d60248201527f4572726f7220647572696e67207472616e736166657220746f6b656e73000000604482015290519081900360640190fd5b60018054604080517f70e866a1000000000000000000000000000000000000000000000000000000008152600160a060020a03909216600483015260248201889052604482019290925290517370edf62a31c67116e2c1abdd16721dcefbd40b7c916370e866a1916064808301926000929190829003018186803b158015611a9c57600080fd5b505af4158015611ab0573d6000803e3d6000fd5b5050600154604080517f5202d820000000000000000000000000000000000000000000000000000000008152600160a060020a03909216600483015260248201899052517370edf62a31c67116e2c1abdd16721dcefbd40b7c9350635202d82092506044808301926020929190829003018186803b158015611b3157600080fd5b505af4158015611b45573d6000803e3d6000fd5b505050506040513d6020811015611b5b57600080fd5b505190508015611b7057611b70856003613247565b60408051868152602081018590528215158183015290517f02f5059d6c2ca585877c37dea5eef4295b3a86a233b42e826cf0fd5cd85763879181900360600190a15050505050505050565b600080611bea866003806020026040519081016040528092919082600360200280828437506132e39350505050565b600160a060020a038635161515611c4b576040805160e560020a62461bcd02815260206004820181905260248201527f4465706f7369746f722063616e206e6f74206265203078302061646472657373604482015290519081900360640190fd5b600160a060020a036020870135161515611cd5576040805160e560020a62461bcd02815260206004820152602260248201527f42656e65666963696172792063616e206e6f742062652030783020616464726560448201527f7373000000000000000000000000000000000000000000000000000000000000606482015290519081900360840190fd5b8535600160a060020a039081166020880135919091161415611d67576040805160e560020a62461bcd02815260206004820152602d60248201527f4465706f7369746f7220616e642062656e65666963696172792063616e206e6f60448201527f74206265207468652073616d6500000000000000000000000000000000000000606482015290519081900360840190fd5b841515611dbe576040805160e560020a62461bcd02815260206004820152601360248201527f6465616c2063616e206e6f742062652030783000000000000000000000000000604482015290519081900360640190fd5b831515611e15576040805160e560020a62461bcd02815260206004820152601360248201527f616d6f756e742063616e206e6f74206265203000000000000000000000000000604482015290519081900360640190fd5b604080516060818101909252611e41918890600390839083908082843782019150505050508686612105565b9150611e4e82600061310d565b600154604080517f91967c5a000000000000000000000000000000000000000000000000000000008152600160a060020a039092166004830152517337ca21783f23ac3455c97deea6484ae4a2571835916391967c5a916024808301926020929190829003018186803b158015611ec457600080fd5b505af4158015611ed8573d6000803e3d6000fd5b505050506040513d6020811015611eee57600080fd5b505160018054604080517fde67ede8000000000000000000000000000000000000000000000000000000008152600160a060020a0390921660048301526024820186905260ff841660448301526064820192909252851515608482015290519192507370edf62a31c67116e2c1abdd16721dcefbd40b7c9163de67ede89160a480820192600092909190829003018186803b158015611f8c57600080fd5b505af4158015611fa0573d6000803e3d6000fd5b505060408051858152600160a060020a038a3581166020808401919091528b01358116828401528a8301351660608201526080810189905260a0810188905260ff851660c082015286151560e082015290517ff098beb13feecb1bacbeca5ff3775821b39fd983eeea937f7dc5a65579dc0983935090819003610100019150a1505050505050565b600054600160a060020a0316331461203f57600080fd5b6001805473ffffffffffffffffffffffffffffffffffffffff1916600160a060020a0392909216919091179055565b60006120c884600380602002604051908101604052809291908260036020028082843750506040805160608181019092528994508893506120c39250908a906003908390839080828437506133ca9350505050565b61382c565b6040805182815290519192507f081f8f8f13cad6992091771c1f78fd7a439a16c4d4e6c83216da37aaeb6cbb73919081900360200190a150505050565b60007370edf62a31c67116e2c1abdd16721dcefbd40b7c636b5a8d4e8585856040518463ffffffff1660e060020a0281526004018084600360200280838360005b8381101561215e578181015183820152602001612146565b505050509050018360001916600019168152602001828152602001935050505060206040518083038186803b15801561219657600080fd5b505af41580156121aa573d6000803e3d6000fd5b505050506040513d60208110156121c057600080fd5b5051949350505050565b600354600160a060020a031681565b600054600160a060020a031633146121f057600080fd5b6003805473ffffffffffffffffffffffffffffffffffffffff1916600160a060020a0392909216919091179055565b600054600160a060020a0316331461223657600080fd5b6002805473ffffffffffffffffffffffffffffffffffffffff1916600160a060020a0392909216919091179055565b600054600160a060020a031681565b600154600160a060020a031681565b600054600160a060020a0316331461229a57600080fd5b604080517f70a0823100000000000000000000000000000000000000000000000000000000815230600482015290518291600160a060020a038516916370a08231916024808201926020929091908290030181600087803b1580156122fe57600080fd5b505af1158015612312573d6000803e3d6000fd5b505050506040513d602081101561232857600080fd5b50511015612380576040805160e560020a62461bcd02815260206004820152601160248201527f4e6f7420656e6f75676820746f6b656e73000000000000000000000000000000604482015290519081900360640190fd5b604080517fa9059cbb000000000000000000000000000000000000000000000000000000008152336004820152602481018390529051600160a060020a0384169163a9059cbb9160448083019260209291908290030181600087803b1580156123e857600080fd5b505af11580156123fc573d6000803e3d6000fd5b505050506040513d602081101561241257600080fd5b5051151561241f57600080fd5b5050565b600080600080612455876003806020026040519081016040528092919082600360200280828437506132e39350505050565b604080516060818101909252612481918990600390839083908082843782019150505050508787612105565b935061248e84600361310d565b6001546040805160608181019092527370edf62a31c67116e2c1abdd16721dcefbd40b7c9263583ca3dd92600160a060020a039091169188916124e491908d906003908390839080828437506133ca9350505050565b6040805160e060020a63ffffffff8716028152600160a060020a03948516600482015260248101939093529216604482015290516064808301926020929190829003018186803b15801561253757600080fd5b505af415801561254b573d6000803e3d6000fd5b505050506040513d602081101561256157600080fd5b505192508215156125e2576040805160e560020a62461bcd02815260206004820152602e60248201527f53656e6465722063616e206e6f742061636365707420616e6f7468657220706160448201527f727479206f66666572206f662030000000000000000000000000000000000000606482015290519081900360840190fd5b5081905080840333600160a060020a036020890135161415612605575050808303815b6040805160608181019092526126459189906003908390839080828437820191505050505060408051908101604052808581526020018481525086613a07565b604080518581526020810184905280820183905290517f9b11fc121986ae8e0c1c499dbe6d0f4cde998e7f8616207eb0815b89748a2bc49181900360600190a150505050505050565b60008060006126bf866003806020026040519081016040528092919082600360200280828437506132e39350505050565b6040805160608181019092526126eb918890600390839083908082843782019150505050508686612105565b92506126f883600461310d565b6001546040805160e060020a63e3d79b23028152600160a060020a03909216600483015260248201859052336044830152517370edf62a31c67116e2c1abdd16721dcefbd40b7c9163e3d79b23916064808301926020929190829003018186803b15801561276557600080fd5b505af4158015612779573d6000803e3d6000fd5b505050506040513d602081101561278f57600080fd5b5051156127e6576040805160e560020a62461bcd02815260206004820152601c60248201527f557365722063616e206e6f742077697468647261772074776963652e00000000604482015290519081900360640190fd5b600154604080517f1cbd6150000000000000000000000000000000000000000000000000000000008152600160a060020a03909216600483015260248201859052336044830152517370edf62a31c67116e2c1abdd16721dcefbd40b7c91631cbd6150916064808301926020929190829003018186803b15801561286957600080fd5b505af415801561287d573d6000803e3d6000fd5b505050506040513d602081101561289357600080fd5b505191506128b03383600160a060020a0360408a013516866133f4565b604080518581526020810183905281519294507f6675346cd43846f7d47c310d39fb5c15bc7db66b3770338cdf1f133613a5ae98929081900390910190a160018054604080517f4eb58add000000000000000000000000000000000000000000000000000000008152600160a060020a03909216600483015260248201869052336044830152606482019290925290517370edf62a31c67116e2c1abdd16721dcefbd40b7c91634eb58add916084808301926000929190829003018186803b15801561297b57600080fd5b505af415801561298f573d6000803e3d6000fd5b505050506129bf866003806020026040519081016040528092919082600360200280828437506133ca9350505050565b600154604080517f1cbd6150000000000000000000000000000000000000000000000000000000008152600160a060020a039283166004820152602481018790529183166044830152519192507370edf62a31c67116e2c1abdd16721dcefbd40b7c91631cbd615091606480820192602092909190829003018186803b158015612a4857600080fd5b505af4158015612a5c573d6000803e3d6000fd5b505050506040513d6020811015612a7257600080fd5b50511580612b1757506001546040805160e060020a63e3d79b23028152600160a060020a039283166004820152602481018690529183166044830152517370edf62a31c67116e2c1abdd16721dcefbd40b7c9163e3d79b23916064808301926020929190829003018186803b158015612aea57600080fd5b505af4158015612afe573d6000803e3d6000fd5b505050506040513d6020811015612b1457600080fd5b50515b15612b5b57612b27836006613247565b6040805184815290517f68220abc28c532fc63aabe5cfeff203d97feef456c085adc687630a7d7d6fc839181900360200190a15b505050505050565b600254600160a060020a031681565b6000612ba5846003806020026040519081016040528092919082600360200280828437820191505050505084843361382c565b6040805182815290519192507f2a06c2b0c62191099c445efebca8160d9c6e229eca288dc0c8927dfeb145d9c7919081900360200190a150505050565b600054600160a060020a03163314612bf957600080fd5b3031811115612c0757600080fd5b604051339082156108fc029083906000818181858888f1935050505015801561241f573d6000803e3d6000fd5b6000612c62846003806020026040519081016040528092919082600360200280828437506138249350505050565b604080516060818101909252612c8e918690600390839083908082843782019150505050508484612105565b9050612c9b81600361310d565b604080516060818101909252612cda9186906003908390839080828437505060408051808201909152878152600060208201529250859150613a079050565b6040805182815290517fc21bc94c1b5d9d43bbd526118faff1ad8ff9147b010a5308c667a679c4309ea39181900360200190a150505050565b600080612d42866003806020026040519081016040528092919082600360200280828437506132e39350505050565b60008310158015612d535750838311155b1515612dcf576040805160e560020a62461bcd02815260206004820152602f60248201527f4f6666657220616d6f756e74206d757374206265203e3d203020616e64203c3d60448201527f207061796d656e7420616d6f756e740000000000000000000000000000000000606482015290519081900360840190fd5b604080516060818101909252612dfb918890600390839083908082843782019150505050508686612105565b6001546040805160608181019092529294507370edf62a31c67116e2c1abdd16721dcefbd40b7c9263583ca3dd92600160a060020a0316918691612e51918c906003908390839080828437506133ca9350505050565b6040805160e060020a63ffffffff8716028152600160a060020a03948516600482015260248101939093529216604482015290516064808301926020929190829003018186803b158015612ea457600080fd5b505af4158015612eb8573d6000803e3d6000fd5b505050506040513d6020811015612ece57600080fd5b505190508015612f74576040805160e560020a62461bcd02815260206004820152604360248201527f53656e6465722063616e206e6f74206d616b65206f6666657220696620616e6f60448201527f746865722070617274792068617320646f6e65207468652073616d652062656660648201527f6f72650000000000000000000000000000000000000000000000000000000000608482015290519081900360a40190fd5b600154604080517f84fd164b000000000000000000000000000000000000000000000000000000008152600160a060020a0390921660048301526024820184905233604483015260648201859052517370edf62a31c67116e2c1abdd16721dcefbd40b7c916384fd164b916084808301926000929190829003018186803b158015612ffe57600080fd5b505af4158015613012573d6000803e3d6000fd5b5050604080518581526020810187905281517f87c801e0682b2eae974160fe106ed40041a03f8111fabdd5a9073c943419092a9450908190039091019150a1505050505050565b600054600160a060020a0316331461307057600080fd5b600160a060020a038116151561308557600080fd5b60008054604051600160a060020a03808516939216917f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e091a36000805473ffffffffffffffffffffffffffffffffffffffff1916600160a060020a0392909216919091179055565b8060015b6020020151600160a060020a0316331461310a57600080fd5b50565b80600781111561311957fe5b600154604080517fac21e60a000000000000000000000000000000000000000000000000000000008152600160a060020a039092166004830152602482018590525160ff92909216917370edf62a31c67116e2c1abdd16721dcefbd40b7c9163ac21e60a916044808301926020929190829003018186803b15801561319d57600080fd5b505af41580156131b1573d6000803e3d6000fd5b505050506040513d60208110156131c757600080fd5b505160ff161461241f576040805160e560020a62461bcd02815260206004820152602960248201527f52657175697265642073746174757320646f6573206e6f74206d61746368206160448201527f637475616c206f6e650000000000000000000000000000000000000000000000606482015290519081900360840190fd5b6001547370edf62a31c67116e2c1abdd16721dcefbd40b7c90637011660790600160a060020a03168484600781111561327c57fe5b6040805160e060020a63ffffffff8716028152600160a060020a039094166004850152602484019290925260ff166044830152516064808301926000929190829003018186803b1580156132cf57600080fd5b505af4158015612b5b573d6000803e3d6000fd5b8051600160a060020a03163314806132fe57508060016130f1565b151561310a57600080fd5b600154604080517fac21e60a000000000000000000000000000000000000000000000000000000008152600160a060020a03909216600483015260248201839052516000917370edf62a31c67116e2c1abdd16721dcefbd40b7c9163ac21e60a91604480820192602092909190829003018186803b15801561338a57600080fd5b505af415801561339e573d6000803e3d6000fd5b505050506040513d60208110156133b457600080fd5b505160ff1660078111156133c457fe5b92915050565b8051600090600160a060020a031633146133e55781516133c4565b8160015b602002015192915050565b600080841515613474576040805160e560020a62461bcd02815260206004820152603d60248201527f54686572652069732073656e736520746f20696e766f6b652074686973206d6560448201527f74686f6420696620776974686472617720616d6f756e7420697320302e000000606482015290519081900360840190fd5b50600154604080517fbac9b405000000000000000000000000000000000000000000000000000000008152600160a060020a03909216600483015260248201849052516000917370edf62a31c67116e2c1abdd16721dcefbd40b7c9163bac9b40591604480820192602092909190829003018186803b1580156134f657600080fd5b505af415801561350a573d6000803e3d6000fd5b505050506040513d602081101561352057600080fd5b505115156135d457600154604080517fc1c8bbff000000000000000000000000000000000000000000000000000000008152600160a060020a03909216600483015260248201859052517370edf62a31c67116e2c1abdd16721dcefbd40b7c9163c1c8bbff916044808301926020929190829003018186803b1580156135a557600080fd5b505af41580156135b9573d6000803e3d6000fd5b505050506040513d60208110156135cf57600080fd5b505190505b6135e1858260ff166135f9565b850391506135f0868386613614565b50949350505050565b606491020490565b600081816133e9565b60008160026133e9565b8115156136205761381f565b600160a060020a038116151561372657600354604080517f1b9a91a4000000000000000000000000000000000000000000000000000000008152600160a060020a0386811660048301526024820186905291519190921691631b9a91a49160448083019260209291908290030181600087803b15801561369f57600080fd5b505af11580156136b3573d6000803e3d6000fd5b505050506040513d60208110156136c957600080fd5b50511515613721576040805160e560020a62461bcd02815260206004820152601960248201527f4572726f7220647572696e672077697468647261772045544800000000000000604482015290519081900360640190fd5b61381f565b600354604080517f3ccdbb28000000000000000000000000000000000000000000000000000000008152600160a060020a03868116600483015260248201869052848116604483015291519190921691633ccdbb289160648083019260209291908290030181600087803b15801561379d57600080fd5b505af11580156137b1573d6000803e3d6000fd5b505050506040513d60208110156137c757600080fd5b5051151561381f576040805160e560020a62461bcd02815260206004820152601b60248201527f4572726f7220647572696e6720776974686472617720546f6b656e0000000000604482015290519081900360640190fd5b505050565b8060006130f1565b600080613838866132e3565b613843868686612105565b915061385082600361310d565b600154604080517f583ca3dd000000000000000000000000000000000000000000000000000000008152600160a060020a039283166004820152602481018590529185166044830152517370edf62a31c67116e2c1abdd16721dcefbd40b7c9163583ca3dd916064808301926020929190829003018186803b1580156138d557600080fd5b505af41580156138e9573d6000803e3d6000fd5b505050506040513d60208110156138ff57600080fd5b5051905080151561395a576040805160e560020a62461bcd02815260206004820181905260248201527f53656e6465722063616e206e6f742063616e63656c206f66666572206f662030604482015290519081900360640190fd5b600154604080517f84fd164b000000000000000000000000000000000000000000000000000000008152600160a060020a03928316600482015260248101859052918516604483015260006064830181905290517370edf62a31c67116e2c1abdd16721dcefbd40b7c926384fd164b926084808301939192829003018186803b1580156139e657600080fd5b505af41580156139fa573d6000803e3d6000fd5b5050505050949350505050565b613a12816004613247565b6001547370edf62a31c67116e2c1abdd16721dcefbd40b7c90636430435190600160a060020a031683613a4487613b6c565b86516040805163ffffffff871660e060020a028152600160a060020a0395861660048201526024810194909452919093166044830152606482019290925290516084808301926000929190829003018186803b158015613aa357600080fd5b505af4158015613ab7573d6000803e3d6000fd5b50506001547370edf62a31c67116e2c1abdd16721dcefbd40b7c925063643043519150600160a060020a031683613aed87613601565b60208701516040805163ffffffff871660e060020a028152600160a060020a0395861660048201526024810194909452919093166044830152606482019290925290516084808301926000929190829003018186803b158015613b4f57600080fd5b505af4158015613b63573d6000803e3d6000fd5b50505050505050565b60008160016133e9565b604080518082018252906002908290803883395091929150505600a165627a7a72305820df5d282251da892bb5bd4c981514810000e1f5e7fc6d2bc4fb98136f3ba215cc00290000000000000000000000007a690e2f34cf4277a15733d926926f39810635a7000000000000000000000000a40a4959b20f565d371ef8967604c76560896c64000000000000000000000000df7b14d1101e22d502234240385dd72f05cfc0d2

Deployed Bytecode

0x60806040526004361061010e5763ffffffff60e060020a60003504166317958e72811461011357806321d6806e146101325780632f548b84146101505780633881babe1461016d57806358401a9c1461017d57806359b910d61461019f5780635ab01de8146101c05780636b5a8d4e146101dd5780636c8d9a841461023a5780637db5c88e1461026b5780638c838d6f1461028c5780638da5cb5b146102ad57806392801230146102c25780639e281a98146102d7578063a82c7b5a146102fb578063b2e7495114610318578063b67fc9e614610335578063c09f1d191461034a578063c311d04914610367578063cb37cce01461037f578063d0c62e4f1461039c578063f2fde38b146103bc575b600080fd5b34801561011f57600080fd5b5061013060046064356084356103dd565b005b34801561013e57600080fd5b506101306004606460a46101046106e3565b34801561015c57600080fd5b506101306004606435608435610eb5565b610130600460643560843561121d565b34801561018957600080fd5b50610130600460643560843560a4351515611bbb565b3480156101ab57600080fd5b50610130600160a060020a0360043516612028565b3480156101cc57600080fd5b50610130600460643560843561206e565b3480156101e957600080fd5b50604080516060818101909252610228913691600491606491908390600390839083908082843750939650508335945050506020909101359050612105565b60408051918252519081900360200190f35b34801561024657600080fd5b5061024f6121ca565b60408051600160a060020a039092168252519081900360200190f35b34801561027757600080fd5b50610130600160a060020a03600435166121d9565b34801561029857600080fd5b50610130600160a060020a036004351661221f565b3480156102b957600080fd5b5061024f612265565b3480156102ce57600080fd5b5061024f612274565b3480156102e357600080fd5b50610130600160a060020a0360043516602435612283565b34801561030757600080fd5b506101306004606435608435612423565b34801561032457600080fd5b50610130600460643560843561268e565b34801561034157600080fd5b5061024f612b63565b34801561035657600080fd5b506101306004606435608435612b72565b34801561037357600080fd5b50610130600435612be2565b34801561038b57600080fd5b506101306004606435608435612c34565b3480156103a857600080fd5b50610130600460643560843560a435612d13565b3480156103c857600080fd5b50610130600160a060020a0360043516613059565b60008061040c856003806020026040519081016040528092919082600360200280828437506130ed9350505050565b604080516060818101909252610438918790600390839083908082843782019150505050508585612105565b600154604080517f5202d820000000000000000000000000000000000000000000000000000000008152600160a060020a03909216600483015260248201839052519193507370edf62a31c67116e2c1abdd16721dcefbd40b7c91635202d82091604480820192602092909190829003018186803b1580156104b957600080fd5b505af41580156104cd573d6000803e3d6000fd5b505050506040513d60208110156104e357600080fd5b50511561053a576040805160e560020a62461bcd02815260206004820152601f60248201527f5061796d656e742063616e206265207369676e6564206f6e6c79206f6e636500604482015290519081900360640190fd5b61054582600161310d565b60018054604080517f37dd2acd000000000000000000000000000000000000000000000000000000008152600160a060020a03909216600483015260248201859052604482019290925290517370edf62a31c67116e2c1abdd16721dcefbd40b7c916337dd2acd916064808301926000929190829003018186803b1580156105cc57600080fd5b505af41580156105e0573d6000803e3d6000fd5b5050600154604080517fc0194bb2000000000000000000000000000000000000000000000000000000008152600160a060020a03909216600483015260248201869052517370edf62a31c67116e2c1abdd16721dcefbd40b7c935063c0194bb292506044808301926020929190829003018186803b15801561066157600080fd5b505af4158015610675573d6000803e3d6000fd5b505050506040513d602081101561068b57600080fd5b5051905080156106a0576106a0826003613247565b60408051838152821515602082015281517f745edda55b0281ac9c1b596cac561f470be837d565adc773ea2f6f6e03e62097929181900390910190a15050505050565b60008060006106f0613b76565b60008061071f8a6003806020026040519081016040528092919082600360200280828437506132e39350505050565b8935600160a060020a039081168a3591909116148015610752575060208a810135600160a060020a03908116918b013516145b8061078e57508935600160a060020a0390811660208b01359190911614801561078e575060208a0135600160a060020a039081168a3591909116145b151561080a576040805160e560020a62461bcd02815260206004820152603160248201527f4465706f7369746f7220616e642062656e6566696369617279206d757374206260448201527f6520646973707574652070617274696573000000000000000000000000000000606482015290519081900360840190fd5b604080516060818101909252610843918c906003908390839080828437508c935060009250610837915050565b60200201358a35612105565b955061084e86613309565b9450600385600781111561085e57fe5b14806108755750600585600781111561087357fe5b145b15156108cb576040805160e560020a62461bcd02815260206004820152601e60248201527f496e76616c69642063757272656e74207061796d656e74207374617475730000604482015290519081900360640190fd5b6001546040805160e060020a63e3d79b23028152600160a060020a03909216600483015260248201889052336044830152517370edf62a31c67116e2c1abdd16721dcefbd40b7c9163e3d79b23916064808301926020929190829003018186803b15801561093857600080fd5b505af415801561094c573d6000803e3d6000fd5b505050506040513d602081101561096257600080fd5b5051156109b9576040805160e560020a62461bcd02815260206004820152601c60248201527f557365722063616e206e6f742077697468647261772074776963652e00000000604482015290519081900360640190fd5b600254604080517fb4e85e8b000000000000000000000000000000000000000000000000000000008152600160a060020a038c35811660048301526020808e013582166024840152604483018b90528c84013560648401528b81013560848401528c81013560a4840152925193169263b4e85e8b9260c4808401939192918290030181600087803b158015610a4d57600080fd5b505af1158015610a61573d6000803e3d6000fd5b505050506040513d6020811015610a7757600080fd5b5051600254604080517f258198af000000000000000000000000000000000000000000000000000000008152600481018490529051929650600160a060020a039091169163258198af916024808201926020929091908290030181600087803b158015610ae357600080fd5b505af1158015610af7573d6000803e3d6000fd5b505050506040513d6020811015610b0d57600080fd5b505160ff16600314610b69576040805160e560020a62461bcd02815260206004820152601360248201527f43617365206d75737420626520636c6f73656400000000000000000000000000604482015290519081900360640190fd5b6040805180820182526000808252602080830182905260025484517ffeecca1b000000000000000000000000000000000000000000000000000000008152600481018a90529451939750600160a060020a03169363feecca1b9360248083019491928390030190829087803b158015610be157600080fd5b505af1158015610bf5573d6000803e3d6000fd5b505050506040513d6020811015610c0b57600080fd5b505191508115610c3e578735602089013511610c2b576020880135610c2e565b87355b8084528835036020840152610c46565b873560208401525b33600160a060020a038a351614610c6c5760208301805184518101908103918290520383525b604080516060818101909252610c94918c906003908390839080828437506133ca9350505050565b8351909150610cb3903390600160a060020a0360408e013516896133f4565b808452604080518881526020810192909252818101869052517f4bdd5fc7075e9a3e0f5b7a7c89d8cc2109bf7f17b8539083cf459dcdaab4627d9181900360600190a160018054604080517f4eb58add000000000000000000000000000000000000000000000000000000008152600160a060020a03909216600483015260248201899052336044830152606482019290925290517370edf62a31c67116e2c1abdd16721dcefbd40b7c91634eb58add916084808301926000929190829003018186803b158015610d8357600080fd5b505af4158015610d97573d6000803e3d6000fd5b5085925060019150610da69050565b60200201511580610e4e57506001546040805160e060020a63e3d79b23028152600160a060020a039283166004820152602481018990529183166044830152517370edf62a31c67116e2c1abdd16721dcefbd40b7c9163e3d79b23916064808301926020929190829003018186803b158015610e2157600080fd5b505af4158015610e35573d6000803e3d6000fd5b505050506040513d6020811015610e4b57600080fd5b50515b15610e9e57610e5e866006613247565b604080518781526020810186905281517f4df10cf6d48f8da5081ba3ae81b03bda1ebc3687f7d26689effe6179980ac958929181900390910190a1610ea9565b610ea9866005613247565b50505050505050505050565b600080610ee4856003806020026040519081016040528092919082600360200280828437506132e39350505050565b604080516060818101909252610f10918790600390839083908082843782019150505050508585612105565b9150610f1d82600161310d565b610f28826007613247565b600154604080517fc0194bb2000000000000000000000000000000000000000000000000000000008152600160a060020a03909216600483015260248201849052517370edf62a31c67116e2c1abdd16721dcefbd40b7c9163c0194bb2916044808301926020929190829003018186803b158015610fa557600080fd5b505af4158015610fb9573d6000803e3d6000fd5b505050506040513d6020811015610fcf57600080fd5b5051156111a55750600154604080517fbac9b405000000000000000000000000000000000000000000000000000000008152600160a060020a039092166004830152602482018390525183917370edf62a31c67116e2c1abdd16721dcefbd40b7c9163bac9b40591604480820192602092909190829003018186803b15801561105757600080fd5b505af415801561106b573d6000803e3d6000fd5b505050506040513d602081101561108157600080fd5b50511561114457600154604080517fc1c8bbff000000000000000000000000000000000000000000000000000000008152600160a060020a039092166004830152602482018490525161113f9185917370edf62a31c67116e2c1abdd16721dcefbd40b7c9163c1c8bbff916044808301926020929190829003018186803b15801561110b57600080fd5b505af415801561111f573d6000803e3d6000fd5b505050506040513d602081101561113557600080fd5b505160ff166135f9565b830190505b6111a5611173866003806020026040519081016040528092919082600360200280828437506136019350505050565b826111a08860038060200260405190810160405280929190826003602002808284375061360a9350505050565b613614565b6111b0826007613247565b6040805183815290517f40929445cf61fa3eecb1608d40d8d799740665fd4ff83b863f0050e89792b1299181900360200190a16040805183815290517f40929445cf61fa3eecb1608d40d8d799740665fd4ff83b863f0050e89792b1299181900360200190a15050505050565b6000806000806000611251886003806020026040519081016040528092919082600360200280828437506138249350505050565b60408051606081810190925261127d918a90600390839083908082843782019150505050508888612105565b945061128885613309565b600154604080517fc0194bb2000000000000000000000000000000000000000000000000000000008152600160a060020a03909216600483015260248201889052519195507370edf62a31c67116e2c1abdd16721dcefbd40b7c9163c0194bb291604480820192602092909190829003018186803b15801561130957600080fd5b505af415801561131d573d6000803e3d6000fd5b505050506040513d602081101561133357600080fd5b5051156113b0576040805160e560020a62461bcd02815260206004820152602260248201527f5061796d656e742063616e206265206465706f7369746564206f6e6c79206f6e60448201527f6365000000000000000000000000000000000000000000000000000000000000606482015290519081900360840190fd5b60018460078111156113be57fe5b14806113d5575060028460078111156113d357fe5b145b151561142b576040805160e560020a62461bcd02815260206004820152601e60248201527f496e76616c69642063757272656e74207061796d656e74207374617475730000604482015290519081900360640190fd5b600154604080517fbac9b405000000000000000000000000000000000000000000000000000000008152600160a060020a03909216600483015260248201879052518794507370edf62a31c67116e2c1abdd16721dcefbd40b7c9163bac9b405916044808301926020929190829003018186803b1580156114ab57600080fd5b505af41580156114bf573d6000803e3d6000fd5b505050506040513d60208110156114d557600080fd5b50511561156457600154604080517fc1c8bbff000000000000000000000000000000000000000000000000000000008152600160a060020a039092166004830152602482018790525161155f9188917370edf62a31c67116e2c1abdd16721dcefbd40b7c9163c1c8bbff916044808301926020929190829003018186803b15801561110b57600080fd5b860192505b60408051606081810190925261158c918a9060039083908390808284375061360a9350505050565b9150600160a060020a03821615156116d0573483146115f5576040805160e560020a62461bcd02815260206004820152601f60248201527f45544820616d6f756e74206d75737420626520657175616c20616d6f756e7400604482015290519081900360640190fd5b600360009054906101000a9004600160a060020a0316600160a060020a031663439370b1346040518263ffffffff1660e060020a0281526004016020604051808303818588803b15801561164857600080fd5b505af115801561165c573d6000803e3d6000fd5b50505050506040513d602081101561167357600080fd5b505115156116cb576040805160e560020a62461bcd02815260206004820152600e60248201527f4e6f7420656e6f75676820657468000000000000000000000000000000000000604482015290519081900360640190fd5b611a15565b341561174c576040805160e560020a62461bcd02815260206004820152602760248201527f45544820616d6f756e74206d757374206265203020666f7220746f6b656e207460448201527f72616e7366657200000000000000000000000000000000000000000000000000606482015290519081900360840190fd5b604080517fdd62ed3e00000000000000000000000000000000000000000000000000000000815233600482015230602482015290518491600160a060020a0385169163dd62ed3e916044808201926020929091908290030181600087803b1580156117b657600080fd5b505af11580156117ca573d6000803e3d6000fd5b505050506040513d60208110156117e057600080fd5b50511015611838576040805160e560020a62461bcd02815260206004820152601a60248201527f4e6f7420656e6f75676820746f6b656e20616c6c6f77616e6365000000000000604482015290519081900360640190fd5b604080517f70a0823100000000000000000000000000000000000000000000000000000000815233600482015290518491600160a060020a038516916370a08231916024808201926020929091908290030181600087803b15801561189c57600080fd5b505af11580156118b0573d6000803e3d6000fd5b505050506040513d60208110156118c657600080fd5b5051101561191e576040805160e560020a62461bcd02815260206004820152601060248201527f4e6f20656e6f75676820746f6b656e7300000000000000000000000000000000604482015290519081900360640190fd5b600354604080517f23b872dd000000000000000000000000000000000000000000000000000000008152336004820152600160a060020a039283166024820152604481018690529051918416916323b872dd916064808201926020929091908290030181600087803b15801561199357600080fd5b505af11580156119a7573d6000803e3d6000fd5b505050506040513d60208110156119bd57600080fd5b50511515611a15576040805160e560020a62461bcd02815260206004820152601d60248201527f4572726f7220647572696e67207472616e736166657220746f6b656e73000000604482015290519081900360640190fd5b60018054604080517f70e866a1000000000000000000000000000000000000000000000000000000008152600160a060020a03909216600483015260248201889052604482019290925290517370edf62a31c67116e2c1abdd16721dcefbd40b7c916370e866a1916064808301926000929190829003018186803b158015611a9c57600080fd5b505af4158015611ab0573d6000803e3d6000fd5b5050600154604080517f5202d820000000000000000000000000000000000000000000000000000000008152600160a060020a03909216600483015260248201899052517370edf62a31c67116e2c1abdd16721dcefbd40b7c9350635202d82092506044808301926020929190829003018186803b158015611b3157600080fd5b505af4158015611b45573d6000803e3d6000fd5b505050506040513d6020811015611b5b57600080fd5b505190508015611b7057611b70856003613247565b60408051868152602081018590528215158183015290517f02f5059d6c2ca585877c37dea5eef4295b3a86a233b42e826cf0fd5cd85763879181900360600190a15050505050505050565b600080611bea866003806020026040519081016040528092919082600360200280828437506132e39350505050565b600160a060020a038635161515611c4b576040805160e560020a62461bcd02815260206004820181905260248201527f4465706f7369746f722063616e206e6f74206265203078302061646472657373604482015290519081900360640190fd5b600160a060020a036020870135161515611cd5576040805160e560020a62461bcd02815260206004820152602260248201527f42656e65666963696172792063616e206e6f742062652030783020616464726560448201527f7373000000000000000000000000000000000000000000000000000000000000606482015290519081900360840190fd5b8535600160a060020a039081166020880135919091161415611d67576040805160e560020a62461bcd02815260206004820152602d60248201527f4465706f7369746f7220616e642062656e65666963696172792063616e206e6f60448201527f74206265207468652073616d6500000000000000000000000000000000000000606482015290519081900360840190fd5b841515611dbe576040805160e560020a62461bcd02815260206004820152601360248201527f6465616c2063616e206e6f742062652030783000000000000000000000000000604482015290519081900360640190fd5b831515611e15576040805160e560020a62461bcd02815260206004820152601360248201527f616d6f756e742063616e206e6f74206265203000000000000000000000000000604482015290519081900360640190fd5b604080516060818101909252611e41918890600390839083908082843782019150505050508686612105565b9150611e4e82600061310d565b600154604080517f91967c5a000000000000000000000000000000000000000000000000000000008152600160a060020a039092166004830152517337ca21783f23ac3455c97deea6484ae4a2571835916391967c5a916024808301926020929190829003018186803b158015611ec457600080fd5b505af4158015611ed8573d6000803e3d6000fd5b505050506040513d6020811015611eee57600080fd5b505160018054604080517fde67ede8000000000000000000000000000000000000000000000000000000008152600160a060020a0390921660048301526024820186905260ff841660448301526064820192909252851515608482015290519192507370edf62a31c67116e2c1abdd16721dcefbd40b7c9163de67ede89160a480820192600092909190829003018186803b158015611f8c57600080fd5b505af4158015611fa0573d6000803e3d6000fd5b505060408051858152600160a060020a038a3581166020808401919091528b01358116828401528a8301351660608201526080810189905260a0810188905260ff851660c082015286151560e082015290517ff098beb13feecb1bacbeca5ff3775821b39fd983eeea937f7dc5a65579dc0983935090819003610100019150a1505050505050565b600054600160a060020a0316331461203f57600080fd5b6001805473ffffffffffffffffffffffffffffffffffffffff1916600160a060020a0392909216919091179055565b60006120c884600380602002604051908101604052809291908260036020028082843750506040805160608181019092528994508893506120c39250908a906003908390839080828437506133ca9350505050565b61382c565b6040805182815290519192507f081f8f8f13cad6992091771c1f78fd7a439a16c4d4e6c83216da37aaeb6cbb73919081900360200190a150505050565b60007370edf62a31c67116e2c1abdd16721dcefbd40b7c636b5a8d4e8585856040518463ffffffff1660e060020a0281526004018084600360200280838360005b8381101561215e578181015183820152602001612146565b505050509050018360001916600019168152602001828152602001935050505060206040518083038186803b15801561219657600080fd5b505af41580156121aa573d6000803e3d6000fd5b505050506040513d60208110156121c057600080fd5b5051949350505050565b600354600160a060020a031681565b600054600160a060020a031633146121f057600080fd5b6003805473ffffffffffffffffffffffffffffffffffffffff1916600160a060020a0392909216919091179055565b600054600160a060020a0316331461223657600080fd5b6002805473ffffffffffffffffffffffffffffffffffffffff1916600160a060020a0392909216919091179055565b600054600160a060020a031681565b600154600160a060020a031681565b600054600160a060020a0316331461229a57600080fd5b604080517f70a0823100000000000000000000000000000000000000000000000000000000815230600482015290518291600160a060020a038516916370a08231916024808201926020929091908290030181600087803b1580156122fe57600080fd5b505af1158015612312573d6000803e3d6000fd5b505050506040513d602081101561232857600080fd5b50511015612380576040805160e560020a62461bcd02815260206004820152601160248201527f4e6f7420656e6f75676820746f6b656e73000000000000000000000000000000604482015290519081900360640190fd5b604080517fa9059cbb000000000000000000000000000000000000000000000000000000008152336004820152602481018390529051600160a060020a0384169163a9059cbb9160448083019260209291908290030181600087803b1580156123e857600080fd5b505af11580156123fc573d6000803e3d6000fd5b505050506040513d602081101561241257600080fd5b5051151561241f57600080fd5b5050565b600080600080612455876003806020026040519081016040528092919082600360200280828437506132e39350505050565b604080516060818101909252612481918990600390839083908082843782019150505050508787612105565b935061248e84600361310d565b6001546040805160608181019092527370edf62a31c67116e2c1abdd16721dcefbd40b7c9263583ca3dd92600160a060020a039091169188916124e491908d906003908390839080828437506133ca9350505050565b6040805160e060020a63ffffffff8716028152600160a060020a03948516600482015260248101939093529216604482015290516064808301926020929190829003018186803b15801561253757600080fd5b505af415801561254b573d6000803e3d6000fd5b505050506040513d602081101561256157600080fd5b505192508215156125e2576040805160e560020a62461bcd02815260206004820152602e60248201527f53656e6465722063616e206e6f742061636365707420616e6f7468657220706160448201527f727479206f66666572206f662030000000000000000000000000000000000000606482015290519081900360840190fd5b5081905080840333600160a060020a036020890135161415612605575050808303815b6040805160608181019092526126459189906003908390839080828437820191505050505060408051908101604052808581526020018481525086613a07565b604080518581526020810184905280820183905290517f9b11fc121986ae8e0c1c499dbe6d0f4cde998e7f8616207eb0815b89748a2bc49181900360600190a150505050505050565b60008060006126bf866003806020026040519081016040528092919082600360200280828437506132e39350505050565b6040805160608181019092526126eb918890600390839083908082843782019150505050508686612105565b92506126f883600461310d565b6001546040805160e060020a63e3d79b23028152600160a060020a03909216600483015260248201859052336044830152517370edf62a31c67116e2c1abdd16721dcefbd40b7c9163e3d79b23916064808301926020929190829003018186803b15801561276557600080fd5b505af4158015612779573d6000803e3d6000fd5b505050506040513d602081101561278f57600080fd5b5051156127e6576040805160e560020a62461bcd02815260206004820152601c60248201527f557365722063616e206e6f742077697468647261772074776963652e00000000604482015290519081900360640190fd5b600154604080517f1cbd6150000000000000000000000000000000000000000000000000000000008152600160a060020a03909216600483015260248201859052336044830152517370edf62a31c67116e2c1abdd16721dcefbd40b7c91631cbd6150916064808301926020929190829003018186803b15801561286957600080fd5b505af415801561287d573d6000803e3d6000fd5b505050506040513d602081101561289357600080fd5b505191506128b03383600160a060020a0360408a013516866133f4565b604080518581526020810183905281519294507f6675346cd43846f7d47c310d39fb5c15bc7db66b3770338cdf1f133613a5ae98929081900390910190a160018054604080517f4eb58add000000000000000000000000000000000000000000000000000000008152600160a060020a03909216600483015260248201869052336044830152606482019290925290517370edf62a31c67116e2c1abdd16721dcefbd40b7c91634eb58add916084808301926000929190829003018186803b15801561297b57600080fd5b505af415801561298f573d6000803e3d6000fd5b505050506129bf866003806020026040519081016040528092919082600360200280828437506133ca9350505050565b600154604080517f1cbd6150000000000000000000000000000000000000000000000000000000008152600160a060020a039283166004820152602481018790529183166044830152519192507370edf62a31c67116e2c1abdd16721dcefbd40b7c91631cbd615091606480820192602092909190829003018186803b158015612a4857600080fd5b505af4158015612a5c573d6000803e3d6000fd5b505050506040513d6020811015612a7257600080fd5b50511580612b1757506001546040805160e060020a63e3d79b23028152600160a060020a039283166004820152602481018690529183166044830152517370edf62a31c67116e2c1abdd16721dcefbd40b7c9163e3d79b23916064808301926020929190829003018186803b158015612aea57600080fd5b505af4158015612afe573d6000803e3d6000fd5b505050506040513d6020811015612b1457600080fd5b50515b15612b5b57612b27836006613247565b6040805184815290517f68220abc28c532fc63aabe5cfeff203d97feef456c085adc687630a7d7d6fc839181900360200190a15b505050505050565b600254600160a060020a031681565b6000612ba5846003806020026040519081016040528092919082600360200280828437820191505050505084843361382c565b6040805182815290519192507f2a06c2b0c62191099c445efebca8160d9c6e229eca288dc0c8927dfeb145d9c7919081900360200190a150505050565b600054600160a060020a03163314612bf957600080fd5b3031811115612c0757600080fd5b604051339082156108fc029083906000818181858888f1935050505015801561241f573d6000803e3d6000fd5b6000612c62846003806020026040519081016040528092919082600360200280828437506138249350505050565b604080516060818101909252612c8e918690600390839083908082843782019150505050508484612105565b9050612c9b81600361310d565b604080516060818101909252612cda9186906003908390839080828437505060408051808201909152878152600060208201529250859150613a079050565b6040805182815290517fc21bc94c1b5d9d43bbd526118faff1ad8ff9147b010a5308c667a679c4309ea39181900360200190a150505050565b600080612d42866003806020026040519081016040528092919082600360200280828437506132e39350505050565b60008310158015612d535750838311155b1515612dcf576040805160e560020a62461bcd02815260206004820152602f60248201527f4f6666657220616d6f756e74206d757374206265203e3d203020616e64203c3d60448201527f207061796d656e7420616d6f756e740000000000000000000000000000000000606482015290519081900360840190fd5b604080516060818101909252612dfb918890600390839083908082843782019150505050508686612105565b6001546040805160608181019092529294507370edf62a31c67116e2c1abdd16721dcefbd40b7c9263583ca3dd92600160a060020a0316918691612e51918c906003908390839080828437506133ca9350505050565b6040805160e060020a63ffffffff8716028152600160a060020a03948516600482015260248101939093529216604482015290516064808301926020929190829003018186803b158015612ea457600080fd5b505af4158015612eb8573d6000803e3d6000fd5b505050506040513d6020811015612ece57600080fd5b505190508015612f74576040805160e560020a62461bcd02815260206004820152604360248201527f53656e6465722063616e206e6f74206d616b65206f6666657220696620616e6f60448201527f746865722070617274792068617320646f6e65207468652073616d652062656660648201527f6f72650000000000000000000000000000000000000000000000000000000000608482015290519081900360a40190fd5b600154604080517f84fd164b000000000000000000000000000000000000000000000000000000008152600160a060020a0390921660048301526024820184905233604483015260648201859052517370edf62a31c67116e2c1abdd16721dcefbd40b7c916384fd164b916084808301926000929190829003018186803b158015612ffe57600080fd5b505af4158015613012573d6000803e3d6000fd5b5050604080518581526020810187905281517f87c801e0682b2eae974160fe106ed40041a03f8111fabdd5a9073c943419092a9450908190039091019150a1505050505050565b600054600160a060020a0316331461307057600080fd5b600160a060020a038116151561308557600080fd5b60008054604051600160a060020a03808516939216917f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e091a36000805473ffffffffffffffffffffffffffffffffffffffff1916600160a060020a0392909216919091179055565b8060015b6020020151600160a060020a0316331461310a57600080fd5b50565b80600781111561311957fe5b600154604080517fac21e60a000000000000000000000000000000000000000000000000000000008152600160a060020a039092166004830152602482018590525160ff92909216917370edf62a31c67116e2c1abdd16721dcefbd40b7c9163ac21e60a916044808301926020929190829003018186803b15801561319d57600080fd5b505af41580156131b1573d6000803e3d6000fd5b505050506040513d60208110156131c757600080fd5b505160ff161461241f576040805160e560020a62461bcd02815260206004820152602960248201527f52657175697265642073746174757320646f6573206e6f74206d61746368206160448201527f637475616c206f6e650000000000000000000000000000000000000000000000606482015290519081900360840190fd5b6001547370edf62a31c67116e2c1abdd16721dcefbd40b7c90637011660790600160a060020a03168484600781111561327c57fe5b6040805160e060020a63ffffffff8716028152600160a060020a039094166004850152602484019290925260ff166044830152516064808301926000929190829003018186803b1580156132cf57600080fd5b505af4158015612b5b573d6000803e3d6000fd5b8051600160a060020a03163314806132fe57508060016130f1565b151561310a57600080fd5b600154604080517fac21e60a000000000000000000000000000000000000000000000000000000008152600160a060020a03909216600483015260248201839052516000917370edf62a31c67116e2c1abdd16721dcefbd40b7c9163ac21e60a91604480820192602092909190829003018186803b15801561338a57600080fd5b505af415801561339e573d6000803e3d6000fd5b505050506040513d60208110156133b457600080fd5b505160ff1660078111156133c457fe5b92915050565b8051600090600160a060020a031633146133e55781516133c4565b8160015b602002015192915050565b600080841515613474576040805160e560020a62461bcd02815260206004820152603d60248201527f54686572652069732073656e736520746f20696e766f6b652074686973206d6560448201527f74686f6420696620776974686472617720616d6f756e7420697320302e000000606482015290519081900360840190fd5b50600154604080517fbac9b405000000000000000000000000000000000000000000000000000000008152600160a060020a03909216600483015260248201849052516000917370edf62a31c67116e2c1abdd16721dcefbd40b7c9163bac9b40591604480820192602092909190829003018186803b1580156134f657600080fd5b505af415801561350a573d6000803e3d6000fd5b505050506040513d602081101561352057600080fd5b505115156135d457600154604080517fc1c8bbff000000000000000000000000000000000000000000000000000000008152600160a060020a03909216600483015260248201859052517370edf62a31c67116e2c1abdd16721dcefbd40b7c9163c1c8bbff916044808301926020929190829003018186803b1580156135a557600080fd5b505af41580156135b9573d6000803e3d6000fd5b505050506040513d60208110156135cf57600080fd5b505190505b6135e1858260ff166135f9565b850391506135f0868386613614565b50949350505050565b606491020490565b600081816133e9565b60008160026133e9565b8115156136205761381f565b600160a060020a038116151561372657600354604080517f1b9a91a4000000000000000000000000000000000000000000000000000000008152600160a060020a0386811660048301526024820186905291519190921691631b9a91a49160448083019260209291908290030181600087803b15801561369f57600080fd5b505af11580156136b3573d6000803e3d6000fd5b505050506040513d60208110156136c957600080fd5b50511515613721576040805160e560020a62461bcd02815260206004820152601960248201527f4572726f7220647572696e672077697468647261772045544800000000000000604482015290519081900360640190fd5b61381f565b600354604080517f3ccdbb28000000000000000000000000000000000000000000000000000000008152600160a060020a03868116600483015260248201869052848116604483015291519190921691633ccdbb289160648083019260209291908290030181600087803b15801561379d57600080fd5b505af11580156137b1573d6000803e3d6000fd5b505050506040513d60208110156137c757600080fd5b5051151561381f576040805160e560020a62461bcd02815260206004820152601b60248201527f4572726f7220647572696e6720776974686472617720546f6b656e0000000000604482015290519081900360640190fd5b505050565b8060006130f1565b600080613838866132e3565b613843868686612105565b915061385082600361310d565b600154604080517f583ca3dd000000000000000000000000000000000000000000000000000000008152600160a060020a039283166004820152602481018590529185166044830152517370edf62a31c67116e2c1abdd16721dcefbd40b7c9163583ca3dd916064808301926020929190829003018186803b1580156138d557600080fd5b505af41580156138e9573d6000803e3d6000fd5b505050506040513d60208110156138ff57600080fd5b5051905080151561395a576040805160e560020a62461bcd02815260206004820181905260248201527f53656e6465722063616e206e6f742063616e63656c206f66666572206f662030604482015290519081900360640190fd5b600154604080517f84fd164b000000000000000000000000000000000000000000000000000000008152600160a060020a03928316600482015260248101859052918516604483015260006064830181905290517370edf62a31c67116e2c1abdd16721dcefbd40b7c926384fd164b926084808301939192829003018186803b1580156139e657600080fd5b505af41580156139fa573d6000803e3d6000fd5b5050505050949350505050565b613a12816004613247565b6001547370edf62a31c67116e2c1abdd16721dcefbd40b7c90636430435190600160a060020a031683613a4487613b6c565b86516040805163ffffffff871660e060020a028152600160a060020a0395861660048201526024810194909452919093166044830152606482019290925290516084808301926000929190829003018186803b158015613aa357600080fd5b505af4158015613ab7573d6000803e3d6000fd5b50506001547370edf62a31c67116e2c1abdd16721dcefbd40b7c925063643043519150600160a060020a031683613aed87613601565b60208701516040805163ffffffff871660e060020a028152600160a060020a0395861660048201526024810194909452919093166044830152606482019290925290516084808301926000929190829003018186803b158015613b4f57600080fd5b505af4158015613b63573d6000803e3d6000fd5b50505050505050565b60008160016133e9565b604080518082018252906002908290803883395091929150505600a165627a7a72305820df5d282251da892bb5bd4c981514810000e1f5e7fc6d2bc4fb98136f3ba215cc0029

Constructor Arguments (ABI-Encoded and is the last bytes of the Contract Creation Code above)

0000000000000000000000007a690e2f34cf4277a15733d926926f39810635a7000000000000000000000000a40a4959b20f565d371ef8967604c76560896c64000000000000000000000000df7b14d1101e22d502234240385dd72f05cfc0d2

-----Decoded View---------------
Arg [0] : storageAddress (address): 0x7A690e2F34cF4277A15733d926926f39810635a7
Arg [1] : _paymentHolder (address): 0xa40a4959B20F565D371Ef8967604c76560896C64
Arg [2] : _courtAddress (address): 0xDf7B14D1101e22d502234240385dd72f05cfc0D2

-----Encoded View---------------
3 Constructor Arguments found :
Arg [0] : 0000000000000000000000007a690e2f34cf4277a15733d926926f39810635a7
Arg [1] : 000000000000000000000000a40a4959b20f565d371ef8967604c76560896c64
Arg [2] : 000000000000000000000000df7b14d1101e22d502234240385dd72f05cfc0d2


Libraries Used

EscrowConfigLib : 0x37ca21783f23ac3455c97deea6484ae4a2571835Unverified

Swarm Source

bzzr://df5d282251da892bb5bd4c981514810000e1f5e7fc6d2bc4fb98136f3ba215cc

Block Transaction Difficulty Gas Used Reward
View All Blocks Produced

Block Uncle Number Difficulty Gas Used Reward
View All Uncles
Loading...
Loading
Loading...
Loading

Validator Index Block Amount
View All Withdrawals

Transaction Hash Block Value Eth2 PubKey Valid
View All Deposits
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.