Overview
ETH Balance
0 ETH
Eth Value
$0.00More Info
Private Name Tags
ContractCreator
Latest 25 from a total of 89 transactions
Transaction Hash |
Method
|
Block
|
From
|
To
|
|||||
---|---|---|---|---|---|---|---|---|---|
Cancel Offer | 6825417 | 2273 days ago | IN | 0 ETH | 0.0003622 | ||||
Offer | 6825411 | 2273 days ago | IN | 0 ETH | 0.00059514 | ||||
Sign | 6825393 | 2273 days ago | IN | 0 ETH | 0.00078091 | ||||
Deposit | 6825389 | 2273 days ago | IN | 0.2 ETH | 0.00081621 | ||||
Cancel | 6825354 | 2273 days ago | IN | 0 ETH | 0.00048406 | ||||
Create Payment | 6825349 | 2273 days ago | IN | 0 ETH | 0.00058579 | ||||
Release | 6825014 | 2273 days ago | IN | 0 ETH | 0.0002597 | ||||
Release | 6824996 | 2273 days ago | IN | 0 ETH | 0.00061877 | ||||
Release | 6824947 | 2273 days ago | IN | 0 ETH | 0.00065413 | ||||
Deposit | 6824945 | 2273 days ago | IN | 0.0001 ETH | 0.00071646 | ||||
Cancel | 6824945 | 2273 days ago | IN | 0 ETH | 0.00062445 | ||||
Deposit | 6824936 | 2273 days ago | IN | 0.000102 ETH | 0.00075637 | ||||
Deposit | 6824929 | 2273 days ago | IN | 0.001 ETH | 0.00063438 | ||||
Sign | 6824928 | 2273 days ago | IN | 0 ETH | 0.0005244 | ||||
Create Payment | 6824911 | 2273 days ago | IN | 0 ETH | 0.00096332 | ||||
Sign | 6824900 | 2273 days ago | IN | 0 ETH | 0.00078033 | ||||
Deposit | 6824894 | 2273 days ago | IN | 0.0001 ETH | 0.00081564 | ||||
Create Payment | 6824874 | 2273 days ago | IN | 0 ETH | 0.00067401 | ||||
Sign | 6824855 | 2273 days ago | IN | 0 ETH | 0.00060255 | ||||
Create Payment | 6824794 | 2273 days ago | IN | 0 ETH | 0.00086659 | ||||
Create Payment | 6824779 | 2273 days ago | IN | 0 ETH | 0.00071205 | ||||
Release | 6824705 | 2273 days ago | IN | 0 ETH | 0.00071792 | ||||
Withdraw | 6824181 | 2273 days ago | IN | 0 ETH | 0.00100243 | ||||
Release | 6824163 | 2273 days ago | IN | 0 ETH | 0.00061877 | ||||
Deposit | 6824135 | 2273 days ago | IN | 0.02856 ETH | 0.00324162 |
Loading...
Loading
This contract contains unverified libraries: PaymentLib, EscrowConfigLib
This contract may be a proxy contract. Click on More Options and select Is this a proxy? to confirm and enable the "Read as Proxy" & "Write as Proxy" tabs.
Contract Source Code Verified (Exact Match)
Contract Name:
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
- No Contract Security Audit Submitted- Submit Audit Here
[{"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"}]
Contract Creation Code
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
PaymentLib : 0x70edf62a31c67116e2c1abdd16721dcefbd40b7cUnverifiedEscrowConfigLib : 0x37ca21783f23ac3455c97deea6484ae4a2571835Unverified
Swarm Source
bzzr://df5d282251da892bb5bd4c981514810000e1f5e7fc6d2bc4fb98136f3ba215cc
Loading...
Loading
Loading...
Loading
Multichain Portfolio | 31 Chains
Chain | Token | Portfolio % | Price | Amount | Value |
---|
Loading...
Loading
[ Download: CSV Export ]
[ Download: CSV Export ]
A contract address hosts a smart contract, which is a set of code stored on the blockchain that runs when predetermined conditions are met. Learn more about addresses in our Knowledge Base.