More Info
Private Name Tags
ContractCreator
Multi Chain
Multichain Addresses
3 addresses found via
Latest 25 from a total of 472,748 transactions
Transaction Hash |
Method
|
Block
|
From
|
To
|
Value | ||||
---|---|---|---|---|---|---|---|---|---|
Create Escrow | 16504879 | 237 days 14 hrs ago | IN | 0.135 ETH | 0.00360015 | ||||
Create Escrow | 12714383 | 817 days 19 hrs ago | IN | 0.02982 ETH | 0.00013981 | ||||
Create Escrow | 12714374 | 817 days 19 hrs ago | IN | 0.02982 ETH | 0.00013981 | ||||
Create Escrow | 12709056 | 818 days 15 hrs ago | IN | 0.03379 ETH | 0.00013971 | ||||
Create Escrow | 12626199 | 831 days 12 hrs ago | IN | 0.12 ETH | 0.00091227 | ||||
Create Escrow | 12626199 | 831 days 12 hrs ago | IN | 0.12 ETH | 0.00091227 | ||||
Create Escrow | 12626199 | 831 days 12 hrs ago | IN | 0.1239 ETH | 0.00013986 | ||||
Batch Relay | 12188691 | 899 days 3 hrs ago | IN | 0 ETH | 0.00558522 | ||||
Batch Relay | 12024887 | 924 days 8 hrs ago | IN | 0 ETH | 0.01409244 | ||||
Batch Relay | 12002531 | 927 days 19 hrs ago | IN | 0 ETH | 0.00551228 | ||||
Batch Relay | 11988447 | 930 days ago | IN | 0 ETH | 0.00409926 | ||||
Resolve Dispute | 11952271 | 935 days 13 hrs ago | IN | 0 ETH | 0.00353326 | ||||
Withdraw Fees | 11883798 | 946 days 2 hrs ago | IN | 0 ETH | 0.0056016 | ||||
Batch Relay | 11872326 | 947 days 20 hrs ago | IN | 0 ETH | 0.00708857 | ||||
Batch Relay | 11827512 | 954 days 17 hrs ago | IN | 0 ETH | 0.0169561 | ||||
Batch Relay | 11815244 | 956 days 15 hrs ago | IN | 0 ETH | 0.00575946 | ||||
Batch Relay | 11814837 | 956 days 16 hrs ago | IN | 0 ETH | 0.00516488 | ||||
Create Escrow | 11814773 | 956 days 16 hrs ago | IN | 2.10923 ETH | 0.00773654 | ||||
Batch Relay | 11804734 | 958 days 5 hrs ago | IN | 0 ETH | 0.00831744 | ||||
Batch Relay | 11804009 | 958 days 8 hrs ago | IN | 0 ETH | 0.00715704 | ||||
Batch Relay | 11798772 | 959 days 3 hrs ago | IN | 0 ETH | 0.01681358 | ||||
Batch Relay | 11792907 | 960 days 1 hr ago | IN | 0 ETH | 0.00886759 | ||||
Batch Relay | 11787545 | 960 days 21 hrs ago | IN | 0 ETH | 0.01248194 | ||||
Batch Relay | 11785504 | 961 days 4 hrs ago | IN | 0 ETH | 0.00946711 | ||||
Create Escrow | 11783841 | 961 days 11 hrs ago | IN | 6.8 ETH | 0.00494115 |
Latest 25 internal transactions (View All)
Parent Txn Hash | Block | From | To | Value | ||
---|---|---|---|---|---|---|
12024887 | 924 days 8 hrs ago | 0.02056977 ETH | ||||
12002531 | 927 days 19 hrs ago | 0.63611506 ETH | ||||
11952271 | 935 days 13 hrs ago | 3.54559454 ETH | ||||
11883798 | 946 days 2 hrs ago | 40 ETH | ||||
11827512 | 954 days 17 hrs ago | 0.13415597 ETH | ||||
11814837 | 956 days 16 hrs ago | 2.07972784 ETH | ||||
11804734 | 958 days 5 hrs ago | 0.0364433 ETH | ||||
11804009 | 958 days 8 hrs ago | 0.77215901 ETH | ||||
11798772 | 959 days 3 hrs ago | 0.16621034 ETH | ||||
11792907 | 960 days 1 hr ago | 6.1844743 ETH | ||||
11787545 | 960 days 21 hrs ago | 0.58654481 ETH | ||||
11783756 | 961 days 11 hrs ago | 6.7948016 ETH | ||||
11779355 | 962 days 3 hrs ago | 0.15090463 ETH | ||||
11777099 | 962 days 12 hrs ago | 0.24203181 ETH | ||||
11776278 | 962 days 15 hrs ago | 0.02932502 ETH | ||||
11775745 | 962 days 17 hrs ago | 0.06980662 ETH | ||||
11775510 | 962 days 17 hrs ago | 0.11802695 ETH | ||||
11771772 | 963 days 7 hrs ago | 0.03975814 ETH | ||||
11769978 | 963 days 14 hrs ago | 0.63098094 ETH | ||||
11768950 | 963 days 18 hrs ago | 0.39837326 ETH | ||||
11768932 | 963 days 18 hrs ago | 0.24434055 ETH | ||||
11763901 | 964 days 12 hrs ago | 8.92539202 ETH | ||||
11763818 | 964 days 13 hrs ago | 0.25672466 ETH | ||||
11762431 | 964 days 18 hrs ago | 0.02441767 ETH | ||||
11759383 | 965 days 5 hrs ago | 0.12670043 ETH |
Loading...
Loading
Contract Name:
LocalEthereumEscrows
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-06-03 */ pragma solidity ^0.4.24; contract Token { function transfer(address _to, uint _value) public returns (bool success); function transferFrom(address _from, address _to, uint _value) public returns (bool success); function approve(address _spender, uint _value) public returns (bool success); } /// @title localethereum.com /// @author localethereum.com contract LocalEthereumEscrows { /*********************** + Global settings + ***********************/ // Address of the arbitrator (currently always localethereum staff) address public arbitrator; // Address of the owner (who can withdraw collected fees) address public owner; // Address of the relayer (who is allowed to forward signed instructions from parties) address public relayer; uint32 public requestCancellationMinimumTime; // Cumulative balance of collected fees uint256 public feesAvailableForWithdraw; /*********************** + Instruction types + ***********************/ // Called when the buyer marks payment as sent. Locks funds in escrow uint8 constant INSTRUCTION_SELLER_CANNOT_CANCEL = 0x01; // Buyer cancelling uint8 constant INSTRUCTION_BUYER_CANCEL = 0x02; // Seller cancelling uint8 constant INSTRUCTION_SELLER_CANCEL = 0x03; // Seller requesting to cancel. Begins a window for buyer to object uint8 constant INSTRUCTION_SELLER_REQUEST_CANCEL = 0x04; // Seller releasing funds to the buyer uint8 constant INSTRUCTION_RELEASE = 0x05; // Either party permitting the arbitrator to resolve a dispute uint8 constant INSTRUCTION_RESOLVE = 0x06; /*********************** + Events + ***********************/ event Created(bytes32 indexed _tradeHash); event SellerCancelDisabled(bytes32 indexed _tradeHash); event SellerRequestedCancel(bytes32 indexed _tradeHash); event CancelledBySeller(bytes32 indexed _tradeHash); event CancelledByBuyer(bytes32 indexed _tradeHash); event Released(bytes32 indexed _tradeHash); event DisputeResolved(bytes32 indexed _tradeHash); struct Escrow { // So we know the escrow exists bool exists; // This is the timestamp in whic hthe seller can cancel the escrow after. // It has two special values: // 0 : Permanently locked by the buyer (i.e. marked as paid; the seller can never cancel) // 1 : The seller can only request to cancel, which will change this value to a timestamp. // This option is avaialble for complex trade terms such as cash-in-person where a // payment window is inappropriate uint32 sellerCanCancelAfter; // Cumulative cost of gas incurred by the relayer. This amount will be refunded to the owner // in the way of fees once the escrow has completed uint128 totalGasFeesSpentByRelayer; } // Mapping of active trades. The key here is a hash of the trade proprties mapping (bytes32 => Escrow) public escrows; modifier onlyOwner() { require(msg.sender == owner, "Must be owner"); _; } modifier onlyArbitrator() { require(msg.sender == arbitrator, "Must be arbitrator"); _; } /// @notice Initialize the contract. constructor() public { owner = msg.sender; arbitrator = msg.sender; relayer = msg.sender; requestCancellationMinimumTime = 2 hours; } /// @notice Create and fund a new escrow. /// @param _tradeID The unique ID of the trade, generated by localethereum.com /// @param _seller The selling party /// @param _buyer The buying party /// @param _value The amount of the escrow, exclusive of the fee /// @param _fee Localethereum's commission in 1/10000ths /// @param _paymentWindowInSeconds The time in seconds from escrow creation that the seller can cancel after /// @param _expiry This transaction must be created before this time /// @param _v Signature "v" component /// @param _r Signature "r" component /// @param _s Signature "s" component function createEscrow( bytes16 _tradeID, address _seller, address _buyer, uint256 _value, uint16 _fee, uint32 _paymentWindowInSeconds, uint32 _expiry, uint8 _v, bytes32 _r, bytes32 _s ) payable external { // The trade hash is created by tightly-concatenating and hashing properties of the trade. // This hash becomes the identifier of the escrow, and hence all these variables must be // supplied on future contract calls bytes32 _tradeHash = keccak256(abi.encodePacked(_tradeID, _seller, _buyer, _value, _fee)); // Require that trade does not already exist require(!escrows[_tradeHash].exists, "Trade already exists"); // A signature (v, r and s) must come from localethereum to open an escrow bytes32 _invitationHash = keccak256(abi.encodePacked( _tradeHash, _paymentWindowInSeconds, _expiry )); require(recoverAddress(_invitationHash, _v, _r, _s) == relayer, "Must be relayer"); // These signatures come with an expiry stamp require(block.timestamp < _expiry, "Signature has expired"); // Check transaction value against signed _value and make sure is not 0 require(msg.value == _value && msg.value > 0, "Incorrect ether sent"); uint32 _sellerCanCancelAfter = _paymentWindowInSeconds == 0 ? 1 : uint32(block.timestamp) + _paymentWindowInSeconds; // Add the escrow to the public mapping escrows[_tradeHash] = Escrow(true, _sellerCanCancelAfter, 0); emit Created(_tradeHash); } uint16 constant GAS_doResolveDispute = 36100; /// @notice Called by the arbitrator to resolve a dispute. Requires a signature from either party. /// @param _tradeID Escrow "tradeID" parameter /// @param _seller Escrow "seller" parameter /// @param _buyer Escrow "buyer" parameter /// @param _value Escrow "value" parameter /// @param _fee Escrow "fee parameter /// @param _v Signature "v" component /// @param _r Signature "r" component /// @param _s Signature "s" component /// @param _buyerPercent What % should be distributed to the buyer (this is usually 0 or 100) function resolveDispute( bytes16 _tradeID, address _seller, address _buyer, uint256 _value, uint16 _fee, uint8 _v, bytes32 _r, bytes32 _s, uint8 _buyerPercent ) external onlyArbitrator { address _signature = recoverAddress(keccak256(abi.encodePacked( _tradeID, INSTRUCTION_RESOLVE )), _v, _r, _s); require(_signature == _buyer || _signature == _seller, "Must be buyer or seller"); Escrow memory _escrow; bytes32 _tradeHash; (_escrow, _tradeHash) = getEscrowAndHash(_tradeID, _seller, _buyer, _value, _fee); require(_escrow.exists, "Escrow does not exist"); require(_buyerPercent <= 100, "_buyerPercent must be 100 or lower"); uint256 _totalFees = _escrow.totalGasFeesSpentByRelayer + (GAS_doResolveDispute * uint128(tx.gasprice)); require(_value - _totalFees <= _value, "Overflow error"); // Prevent underflow feesAvailableForWithdraw += _totalFees; // Add the the pot for localethereum to withdraw delete escrows[_tradeHash]; emit DisputeResolved(_tradeHash); if (_buyerPercent > 0) _buyer.transfer((_value - _totalFees) * _buyerPercent / 100); if (_buyerPercent < 100) _seller.transfer((_value - _totalFees) * (100 - _buyerPercent) / 100); } /// @notice Release ether in escrow to the buyer. Direct call option. /// @param _tradeID Escrow "tradeID" parameter /// @param _seller Escrow "seller" parameter /// @param _buyer Escrow "buyer" parameter /// @param _value Escrow "value" parameter /// @param _fee Escrow "fee parameter /// @return bool function release( bytes16 _tradeID, address _seller, address _buyer, uint256 _value, uint16 _fee ) external returns (bool){ require(msg.sender == _seller, "Must be seller"); return doRelease(_tradeID, _seller, _buyer, _value, _fee, 0); } /// @notice Disable the seller from cancelling (i.e. "mark as paid"). Direct call option. /// @param _tradeID Escrow "tradeID" parameter /// @param _seller Escrow "seller" parameter /// @param _buyer Escrow "buyer" parameter /// @param _value Escrow "value" parameter /// @param _fee Escrow "fee parameter /// @return bool function disableSellerCancel( bytes16 _tradeID, address _seller, address _buyer, uint256 _value, uint16 _fee ) external returns (bool) { require(msg.sender == _buyer, "Must be buyer"); return doDisableSellerCancel(_tradeID, _seller, _buyer, _value, _fee, 0); } /// @notice Cancel the escrow as a buyer. Direct call option. /// @param _tradeID Escrow "tradeID" parameter /// @param _seller Escrow "seller" parameter /// @param _buyer Escrow "buyer" parameter /// @param _value Escrow "value" parameter /// @param _fee Escrow "fee parameter /// @return bool function buyerCancel( bytes16 _tradeID, address _seller, address _buyer, uint256 _value, uint16 _fee ) external returns (bool) { require(msg.sender == _buyer, "Must be buyer"); return doBuyerCancel(_tradeID, _seller, _buyer, _value, _fee, 0); } /// @notice Cancel the escrow as a seller. Direct call option. /// @param _tradeID Escrow "tradeID" parameter /// @param _seller Escrow "seller" parameter /// @param _buyer Escrow "buyer" parameter /// @param _value Escrow "value" parameter /// @param _fee Escrow "fee parameter /// @return bool function sellerCancel( bytes16 _tradeID, address _seller, address _buyer, uint256 _value, uint16 _fee ) external returns (bool) { require(msg.sender == _seller, "Must be seller"); return doSellerCancel(_tradeID, _seller, _buyer, _value, _fee, 0); } /// @notice Request to cancel as a seller. Direct call option. /// @param _tradeID Escrow "tradeID" parameter /// @param _seller Escrow "seller" parameter /// @param _buyer Escrow "buyer" parameter /// @param _value Escrow "value" parameter /// @param _fee Escrow "fee parameter /// @return bool function sellerRequestCancel( bytes16 _tradeID, address _seller, address _buyer, uint256 _value, uint16 _fee ) external returns (bool) { require(msg.sender == _seller, "Must be seller"); return doSellerRequestCancel(_tradeID, _seller, _buyer, _value, _fee, 0); } /// @notice Relay multiple signed instructions from parties of escrows. /// @param _tradeID List of _tradeID values /// @param _seller List of _seller values /// @param _buyer List of _buyer values /// @param _value List of _value values /// @param _fee List of _fee values /// @param _maximumGasPrice List of _maximumGasPrice values /// @param _v List of signature "v" components /// @param _r List of signature "r" components /// @param _s List of signature "s" components /// @param _instructionByte List of _instructionByte values /// @return bool List of results uint16 constant GAS_batchRelayBaseCost = 28500; function batchRelay( bytes16[] _tradeID, address[] _seller, address[] _buyer, uint256[] _value, uint16[] _fee, uint128[] _maximumGasPrice, uint8[] _v, bytes32[] _r, bytes32[] _s, uint8[] _instructionByte ) public returns (bool[]) { bool[] memory _results = new bool[](_tradeID.length); uint128 _additionalGas = uint128(msg.sender == relayer ? GAS_batchRelayBaseCost / _tradeID.length : 0); for (uint8 i=0; i<_tradeID.length; i++) { _results[i] = relay( _tradeID[i], _seller[i], _buyer[i], _value[i], _fee[i], _maximumGasPrice[i], _v[i], _r[i], _s[i], _instructionByte[i], _additionalGas ); } return _results; } /// @notice Withdraw fees collected by the contract. Only the owner can call this. /// @param _to Address to withdraw fees in to /// @param _amount Amount to withdraw function withdrawFees(address _to, uint256 _amount) onlyOwner external { // This check also prevents underflow require(_amount <= feesAvailableForWithdraw, "Amount is higher than amount available"); feesAvailableForWithdraw -= _amount; _to.transfer(_amount); } /// @notice Set the arbitrator to a new address. Only the owner can call this. /// @param _newArbitrator Address of the replacement arbitrator function setArbitrator(address _newArbitrator) onlyOwner external { arbitrator = _newArbitrator; } /// @notice Change the owner to a new address. Only the owner can call this. /// @param _newOwner Address of the replacement owner function setOwner(address _newOwner) onlyOwner external { owner = _newOwner; } /// @notice Change the relayer to a new address. Only the owner can call this. /// @param _newRelayer Address of the replacement relayer function setRelayer(address _newRelayer) onlyOwner external { relayer = _newRelayer; } /// @notice Change the requestCancellationMinimumTime. Only the owner can call this. /// @param _newRequestCancellationMinimumTime Replacement function setRequestCancellationMinimumTime( uint32 _newRequestCancellationMinimumTime ) onlyOwner external { requestCancellationMinimumTime = _newRequestCancellationMinimumTime; } /// @notice Send ERC20 tokens away. This function allows the owner to withdraw stuck ERC20 tokens. /// @param _tokenContract Token contract /// @param _transferTo Recipient /// @param _value Value function transferToken( Token _tokenContract, address _transferTo, uint256 _value ) onlyOwner external { _tokenContract.transfer(_transferTo, _value); } /// @notice Send ERC20 tokens away. This function allows the owner to withdraw stuck ERC20 tokens. /// @param _tokenContract Token contract /// @param _transferTo Recipient /// @param _transferFrom Sender /// @param _value Value function transferTokenFrom( Token _tokenContract, address _transferTo, address _transferFrom, uint256 _value ) onlyOwner external { _tokenContract.transferFrom(_transferTo, _transferFrom, _value); } /// @notice Send ERC20 tokens away. This function allows the owner to withdraw stuck ERC20 tokens. /// @param _tokenContract Token contract /// @param _spender Spender address /// @param _value Value function approveToken( Token _tokenContract, address _spender, uint256 _value ) onlyOwner external { _tokenContract.approve(_spender, _value); } /// @notice Relay a signed instruction from a party of an escrow. /// @param _tradeID Escrow "tradeID" parameter /// @param _seller Escrow "seller" parameter /// @param _buyer Escrow "buyer" parameter /// @param _value Escrow "value" parameter /// @param _fee Escrow "fee parameter /// @param _maximumGasPrice Maximum gas price permitted for the relayer (set by the instructor) /// @param _v Signature "v" component /// @param _r Signature "r" component /// @param _s Signature "s" component /// @param _additionalGas Additional gas to be deducted after this operation /// @return bool function relay( bytes16 _tradeID, address _seller, address _buyer, uint256 _value, uint16 _fee, uint128 _maximumGasPrice, uint8 _v, bytes32 _r, bytes32 _s, uint8 _instructionByte, uint128 _additionalGas ) private returns (bool) { address _relayedSender = getRelayedSender( _tradeID, _instructionByte, _maximumGasPrice, _v, _r, _s ); if (_relayedSender == _buyer) { // Buyer's instructions: if (_instructionByte == INSTRUCTION_SELLER_CANNOT_CANCEL) { // Disable seller from cancelling return doDisableSellerCancel(_tradeID, _seller, _buyer, _value, _fee, _additionalGas); } else if (_instructionByte == INSTRUCTION_BUYER_CANCEL) { // Cancel return doBuyerCancel(_tradeID, _seller, _buyer, _value, _fee, _additionalGas); } } else if (_relayedSender == _seller) { // Seller's instructions: if (_instructionByte == INSTRUCTION_RELEASE) { // Release return doRelease(_tradeID, _seller, _buyer, _value, _fee, _additionalGas); } else if (_instructionByte == INSTRUCTION_SELLER_CANCEL) { // Cancel return doSellerCancel(_tradeID, _seller, _buyer, _value, _fee, _additionalGas); } else if (_instructionByte == INSTRUCTION_SELLER_REQUEST_CANCEL){ // Request to cancel return doSellerRequestCancel(_tradeID, _seller, _buyer, _value, _fee, _additionalGas); } } else { require(msg.sender == _seller, "Unrecognised party"); return false; } } /// @notice Increase the amount of gas to be charged later on completion of an escrow /// @param _tradeHash Trade hash /// @param _gas Gas cost function increaseGasSpent(bytes32 _tradeHash, uint128 _gas) private { escrows[_tradeHash].totalGasFeesSpentByRelayer += _gas * uint128(tx.gasprice); } /// @notice Transfer the value of an escrow, minus the fees, minus the gas costs incurred by relay /// @param _to Recipient address /// @param _value Value of the transfer /// @param _totalGasFeesSpentByRelayer Total gas fees spent by the relayer /// @param _fee Commission in 1/10000ths function transferMinusFees( address _to, uint256 _value, uint128 _totalGasFeesSpentByRelayer, uint16 _fee ) private { uint256 _totalFees = (_value * _fee / 10000) + _totalGasFeesSpentByRelayer; // Prevent underflow if(_value - _totalFees > _value) { return; } // Add fees to the pot for localethereum to withdraw feesAvailableForWithdraw += _totalFees; _to.transfer(_value - _totalFees); } uint16 constant GAS_doRelease = 46588; /// @notice Release escrow to the buyer. This completes it and removes it from the mapping. /// @param _tradeID Escrow "tradeID" parameter /// @param _seller Escrow "seller" parameter /// @param _buyer Escrow "buyer" parameter /// @param _value Escrow "value" parameter /// @param _fee Escrow "fee parameter /// @param _additionalGas Additional gas to be deducted after this operation /// @return bool function doRelease( bytes16 _tradeID, address _seller, address _buyer, uint256 _value, uint16 _fee, uint128 _additionalGas ) private returns (bool) { Escrow memory _escrow; bytes32 _tradeHash; (_escrow, _tradeHash) = getEscrowAndHash(_tradeID, _seller, _buyer, _value, _fee); if (!_escrow.exists) return false; uint128 _gasFees = _escrow.totalGasFeesSpentByRelayer + (msg.sender == relayer ? (GAS_doRelease + _additionalGas ) * uint128(tx.gasprice) : 0 ); delete escrows[_tradeHash]; emit Released(_tradeHash); transferMinusFees(_buyer, _value, _gasFees, _fee); return true; } uint16 constant GAS_doDisableSellerCancel = 28944; /// @notice Prevents the seller from cancelling an escrow. Used to "mark as paid" by the buyer. /// @param _tradeID Escrow "tradeID" parameter /// @param _seller Escrow "seller" parameter /// @param _buyer Escrow "buyer" parameter /// @param _value Escrow "value" parameter /// @param _fee Escrow "fee parameter /// @param _additionalGas Additional gas to be deducted after this operation /// @return bool function doDisableSellerCancel( bytes16 _tradeID, address _seller, address _buyer, uint256 _value, uint16 _fee, uint128 _additionalGas ) private returns (bool) { Escrow memory _escrow; bytes32 _tradeHash; (_escrow, _tradeHash) = getEscrowAndHash(_tradeID, _seller, _buyer, _value, _fee); if (!_escrow.exists) return false; if(_escrow.sellerCanCancelAfter == 0) return false; escrows[_tradeHash].sellerCanCancelAfter = 0; emit SellerCancelDisabled(_tradeHash); if (msg.sender == relayer) { increaseGasSpent(_tradeHash, GAS_doDisableSellerCancel + _additionalGas); } return true; } uint16 constant GAS_doBuyerCancel = 46255; /// @notice Cancels the trade and returns the ether to the seller. Can only be called the buyer. /// @param _tradeID Escrow "tradeID" parameter /// @param _seller Escrow "seller" parameter /// @param _buyer Escrow "buyer" parameter /// @param _value Escrow "value" parameter /// @param _fee Escrow "fee parameter /// @param _additionalGas Additional gas to be deducted after this operation /// @return bool function doBuyerCancel( bytes16 _tradeID, address _seller, address _buyer, uint256 _value, uint16 _fee, uint128 _additionalGas ) private returns (bool) { Escrow memory _escrow; bytes32 _tradeHash; (_escrow, _tradeHash) = getEscrowAndHash(_tradeID, _seller, _buyer, _value, _fee); if (!_escrow.exists) { return false; } uint128 _gasFees = _escrow.totalGasFeesSpentByRelayer + (msg.sender == relayer ? (GAS_doBuyerCancel + _additionalGas ) * uint128(tx.gasprice) : 0 ); delete escrows[_tradeHash]; emit CancelledByBuyer(_tradeHash); transferMinusFees(_seller, _value, _gasFees, 0); return true; } uint16 constant GAS_doSellerCancel = 46815; /// @notice Returns the ether in escrow to the seller. Called by the seller. Sometimes unavailable. /// @param _tradeID Escrow "tradeID" parameter /// @param _seller Escrow "seller" parameter /// @param _buyer Escrow "buyer" parameter /// @param _value Escrow "value" parameter /// @param _fee Escrow "fee parameter /// @param _additionalGas Additional gas to be deducted after this operation /// @return bool function doSellerCancel( bytes16 _tradeID, address _seller, address _buyer, uint256 _value, uint16 _fee, uint128 _additionalGas ) private returns (bool) { Escrow memory _escrow; bytes32 _tradeHash; (_escrow, _tradeHash) = getEscrowAndHash(_tradeID, _seller, _buyer, _value, _fee); if (!_escrow.exists) { return false; } if(_escrow.sellerCanCancelAfter <= 1 || _escrow.sellerCanCancelAfter > block.timestamp) { return false; } uint128 _gasFees = _escrow.totalGasFeesSpentByRelayer + (msg.sender == relayer ? (GAS_doSellerCancel + _additionalGas ) * uint128(tx.gasprice) : 0 ); delete escrows[_tradeHash]; emit CancelledBySeller(_tradeHash); transferMinusFees(_seller, _value, _gasFees, 0); return true; } uint16 constant GAS_doSellerRequestCancel = 29507; /// @notice Request to cancel. Used if the buyer is unresponsive. Begins a countdown timer. /// @param _tradeID Escrow "tradeID" parameter /// @param _seller Escrow "seller" parameter /// @param _buyer Escrow "buyer" parameter /// @param _value Escrow "value" parameter /// @param _fee Escrow "fee parameter /// @param _additionalGas Additional gas to be deducted after this operation /// @return bool function doSellerRequestCancel( bytes16 _tradeID, address _seller, address _buyer, uint256 _value, uint16 _fee, uint128 _additionalGas ) private returns (bool) { // Called on unlimited payment window trades where the buyer is not responding Escrow memory _escrow; bytes32 _tradeHash; (_escrow, _tradeHash) = getEscrowAndHash(_tradeID, _seller, _buyer, _value, _fee); if (!_escrow.exists) { return false; } if(_escrow.sellerCanCancelAfter != 1) { return false; } escrows[_tradeHash].sellerCanCancelAfter = uint32(block.timestamp) + requestCancellationMinimumTime; emit SellerRequestedCancel(_tradeHash); if (msg.sender == relayer) { increaseGasSpent(_tradeHash, GAS_doSellerRequestCancel + _additionalGas); } return true; } /// @notice Get the sender of the signed instruction. /// @param _tradeID Identifier of the trade /// @param _instructionByte Identifier of the instruction /// @param _maximumGasPrice Maximum gas price permitted by the sender /// @param _v Signature "v" component /// @param _r Signature "r" component /// @param _s Signature "s" component /// @return address function getRelayedSender( bytes16 _tradeID, uint8 _instructionByte, uint128 _maximumGasPrice, uint8 _v, bytes32 _r, bytes32 _s ) view private returns (address) { bytes32 _hash = keccak256(abi.encodePacked( _tradeID, _instructionByte, _maximumGasPrice )); if(tx.gasprice > _maximumGasPrice) { return; } return recoverAddress(_hash, _v, _r, _s); } /// @notice Hashes the values and returns the matching escrow object and trade hash. /// @dev Returns an empty escrow struct and 0 _tradeHash if not found. /// @param _tradeID Escrow "tradeID" parameter /// @param _seller Escrow "seller" parameter /// @param _buyer Escrow "buyer" parameter /// @param _value Escrow "value" parameter /// @param _fee Escrow "fee parameter /// @return Escrow function getEscrowAndHash( bytes16 _tradeID, address _seller, address _buyer, uint256 _value, uint16 _fee ) view private returns (Escrow, bytes32) { bytes32 _tradeHash = keccak256(abi.encodePacked( _tradeID, _seller, _buyer, _value, _fee )); return (escrows[_tradeHash], _tradeHash); } /// @notice Returns an empty escrow struct and 0 _tradeHash if not found. /// @param _h Data to be hashed /// @param _v Signature "v" component /// @param _r Signature "r" component /// @param _s Signature "s" component /// @return address function recoverAddress( bytes32 _h, uint8 _v, bytes32 _r, bytes32 _s ) private pure returns (address) { bytes memory _prefix = "\x19Ethereum Signed Message:\n32"; bytes32 _prefixedHash = keccak256(abi.encodePacked(_prefix, _h)); return ecrecover(_prefixedHash, _v, _r, _s); } }
Contract Security Audit
- No Contract Security Audit Submitted- Submit Audit Here
[{"constant":false,"inputs":[{"name":"_newRequestCancellationMinimumTime","type":"uint32"}],"name":"setRequestCancellationMinimumTime","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":false,"inputs":[{"name":"_newOwner","type":"address"}],"name":"setOwner","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":false,"inputs":[{"name":"_tradeID","type":"bytes16"},{"name":"_seller","type":"address"},{"name":"_buyer","type":"address"},{"name":"_value","type":"uint256"},{"name":"_fee","type":"uint16"},{"name":"_v","type":"uint8"},{"name":"_r","type":"bytes32"},{"name":"_s","type":"bytes32"},{"name":"_buyerPercent","type":"uint8"}],"name":"resolveDispute","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":false,"inputs":[{"name":"_tradeID","type":"bytes16"},{"name":"_seller","type":"address"},{"name":"_buyer","type":"address"},{"name":"_value","type":"uint256"},{"name":"_fee","type":"uint16"}],"name":"buyerCancel","outputs":[{"name":"","type":"bool"}],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":true,"inputs":[{"name":"","type":"bytes32"}],"name":"escrows","outputs":[{"name":"exists","type":"bool"},{"name":"sellerCanCancelAfter","type":"uint32"},{"name":"totalGasFeesSpentByRelayer","type":"uint128"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":false,"inputs":[{"name":"_tradeID","type":"bytes16"},{"name":"_seller","type":"address"},{"name":"_buyer","type":"address"},{"name":"_value","type":"uint256"},{"name":"_fee","type":"uint16"}],"name":"sellerCancel","outputs":[{"name":"","type":"bool"}],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":true,"inputs":[],"name":"requestCancellationMinimumTime","outputs":[{"name":"","type":"uint32"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":false,"inputs":[{"name":"_tradeID","type":"bytes16"},{"name":"_seller","type":"address"},{"name":"_buyer","type":"address"},{"name":"_value","type":"uint256"},{"name":"_fee","type":"uint16"}],"name":"disableSellerCancel","outputs":[{"name":"","type":"bool"}],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":false,"inputs":[{"name":"_newRelayer","type":"address"}],"name":"setRelayer","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":false,"inputs":[{"name":"_tradeID","type":"bytes16"},{"name":"_seller","type":"address"},{"name":"_buyer","type":"address"},{"name":"_value","type":"uint256"},{"name":"_fee","type":"uint16"}],"name":"sellerRequestCancel","outputs":[{"name":"","type":"bool"}],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":true,"inputs":[],"name":"arbitrator","outputs":[{"name":"","type":"address"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[],"name":"relayer","outputs":[{"name":"","type":"address"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[],"name":"owner","outputs":[{"name":"","type":"address"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":false,"inputs":[{"name":"_tradeID","type":"bytes16[]"},{"name":"_seller","type":"address[]"},{"name":"_buyer","type":"address[]"},{"name":"_value","type":"uint256[]"},{"name":"_fee","type":"uint16[]"},{"name":"_maximumGasPrice","type":"uint128[]"},{"name":"_v","type":"uint8[]"},{"name":"_r","type":"bytes32[]"},{"name":"_s","type":"bytes32[]"},{"name":"_instructionByte","type":"uint8[]"}],"name":"batchRelay","outputs":[{"name":"","type":"bool[]"}],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":false,"inputs":[{"name":"_to","type":"address"},{"name":"_amount","type":"uint256"}],"name":"withdrawFees","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":false,"inputs":[{"name":"_newArbitrator","type":"address"}],"name":"setArbitrator","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":false,"inputs":[{"name":"_tokenContract","type":"address"},{"name":"_spender","type":"address"},{"name":"_value","type":"uint256"}],"name":"approveToken","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":true,"inputs":[],"name":"feesAvailableForWithdraw","outputs":[{"name":"","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":false,"inputs":[{"name":"_tokenContract","type":"address"},{"name":"_transferTo","type":"address"},{"name":"_transferFrom","type":"address"},{"name":"_value","type":"uint256"}],"name":"transferTokenFrom","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":false,"inputs":[{"name":"_tradeID","type":"bytes16"},{"name":"_seller","type":"address"},{"name":"_buyer","type":"address"},{"name":"_value","type":"uint256"},{"name":"_fee","type":"uint16"}],"name":"release","outputs":[{"name":"","type":"bool"}],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":false,"inputs":[{"name":"_tradeID","type":"bytes16"},{"name":"_seller","type":"address"},{"name":"_buyer","type":"address"},{"name":"_value","type":"uint256"},{"name":"_fee","type":"uint16"},{"name":"_paymentWindowInSeconds","type":"uint32"},{"name":"_expiry","type":"uint32"},{"name":"_v","type":"uint8"},{"name":"_r","type":"bytes32"},{"name":"_s","type":"bytes32"}],"name":"createEscrow","outputs":[],"payable":true,"stateMutability":"payable","type":"function"},{"constant":false,"inputs":[{"name":"_tokenContract","type":"address"},{"name":"_transferTo","type":"address"},{"name":"_value","type":"uint256"}],"name":"transferToken","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"inputs":[],"payable":false,"stateMutability":"nonpayable","type":"constructor"},{"anonymous":false,"inputs":[{"indexed":true,"name":"_tradeHash","type":"bytes32"}],"name":"Created","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"name":"_tradeHash","type":"bytes32"}],"name":"SellerCancelDisabled","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"name":"_tradeHash","type":"bytes32"}],"name":"SellerRequestedCancel","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"name":"_tradeHash","type":"bytes32"}],"name":"CancelledBySeller","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"name":"_tradeHash","type":"bytes32"}],"name":"CancelledByBuyer","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"name":"_tradeHash","type":"bytes32"}],"name":"Released","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"name":"_tradeHash","type":"bytes32"}],"name":"DisputeResolved","type":"event"}]
Contract Creation Code
608060405234801561001057600080fd5b506001805433600160a060020a03199182168117909255600080548216831781556002805490921690921760a060020a63ffffffff021916751c20000000000000000000000000000000000000000017905561243090819061007290396000f30060806040526004361061010e5763ffffffff60e060020a60003504166305b64993811461011357806313af40351461013357806324943c7d146101545780632cc9636c146101a75780632d83549c146101f957806335adc0c51461023f57806357938b2a1461027d5780635c810f09146102ab5780636548e9bc146102e95780636b4078371461030a5780636cc6cde1146103485780638406c079146103795780638da5cb5b1461038e5780638eb4e0ad146103a3578063ad3b1b4714610649578063b0eefabe1461066d578063da3e33971461068e578063de5785d5146106b8578063e5994905146106df578063e9600f121461070f578063f1e03d671461074d578063f5537ede1461079b575b600080fd5b34801561011f57600080fd5b5061013163ffffffff600435166107c5565b005b34801561013f57600080fd5b50610131600160a060020a036004351661085d565b34801561016057600080fd5b506101316001608060020a031960043516600160a060020a036024358116906044351660643561ffff6084351660ff60a43581169060c4359060e4359061010435166108dc565b3480156101b357600080fd5b506101e56001608060020a031960043516600160a060020a036024358116906044351660643561ffff60843516610ce9565b604080519115158252519081900360200190f35b34801561020557600080fd5b50610211600435610d64565b60408051931515845263ffffffff90921660208401526001608060020a031682820152519081900360600190f35b34801561024b57600080fd5b506101e56001608060020a031960043516600160a060020a036024358116906044351660643561ffff60843516610d99565b34801561028957600080fd5b50610292610e0a565b6040805163ffffffff9092168252519081900360200190f35b3480156102b757600080fd5b506101e56001608060020a031960043516600160a060020a036024358116906044351660643561ffff60843516610e2e565b3480156102f557600080fd5b50610131600160a060020a0360043516610e9f565b34801561031657600080fd5b506101e56001608060020a031960043516600160a060020a036024358116906044351660643561ffff60843516610f1e565b34801561035457600080fd5b5061035d610f8f565b60408051600160a060020a039092168252519081900360200190f35b34801561038557600080fd5b5061035d610f9e565b34801561039a57600080fd5b5061035d610fad565b3480156103af57600080fd5b50604080516020600480358082013583810280860185019096528085526105f995369593946024949385019291829185019084908082843750506040805187358901803560208181028481018201909552818452989b9a998901989297509082019550935083925085019084908082843750506040805187358901803560208181028481018201909552818452989b9a998901989297509082019550935083925085019084908082843750506040805187358901803560208181028481018201909552818452989b9a998901989297509082019550935083925085019084908082843750506040805187358901803560208181028481018201909552818452989b9a998901989297509082019550935083925085019084908082843750506040805187358901803560208181028481018201909552818452989b9a998901989297509082019550935083925085019084908082843750506040805187358901803560208181028481018201909552818452989b9a998901989297509082019550935083925085019084908082843750506040805187358901803560208181028481018201909552818452989b9a998901989297509082019550935083925085019084908082843750506040805187358901803560208181028481018201909552818452989b9a998901989297509082019550935083925085019084908082843750506040805187358901803560208181028481018201909552818452989b9a998901989297509082019550935083925085019084908082843750949750610fbc9650505050505050565b60408051602080825283518183015283519192839290830191858101910280838360005b8381101561063557818101518382015260200161061d565b505050509050019250505060405180910390f35b34801561065557600080fd5b50610131600160a060020a036004351660243561117e565b34801561067957600080fd5b50610131600160a060020a0360043516611292565b34801561069a57600080fd5b50610131600160a060020a0360043581169060243516604435611311565b3480156106c457600080fd5b506106cd6113f5565b60408051918252519081900360200190f35b3480156106eb57600080fd5b50610131600160a060020a03600435811690602435811690604435166064356113fb565b34801561071b57600080fd5b506101e56001608060020a031960043516600160a060020a036024358116906044351660643561ffff608435166114f1565b6101316001608060020a031960043516600160a060020a036024358116906044351660643561ffff6084351663ffffffff60a43581169060c4351660ff60e435166101043561012435611562565b3480156107a757600080fd5b50610131600160a060020a036004358116906024351660443561195c565b600154600160a060020a03163314610815576040805160e560020a62461bcd02815260206004820152600d60248201526000805160206123e5833981519152604482015290519081900360640190fd5b6002805463ffffffff909216740100000000000000000000000000000000000000000277ffffffff000000000000000000000000000000000000000019909216919091179055565b600154600160a060020a031633146108ad576040805160e560020a62461bcd02815260206004820152600d60248201526000805160206123e5833981519152604482015290519081900360640190fd5b6001805473ffffffffffffffffffffffffffffffffffffffff1916600160a060020a0392909216919091179055565b60006108e66123c4565b600080548190600160a060020a0316331461094b576040805160e560020a62461bcd02815260206004820152601260248201527f4d7573742062652061726269747261746f720000000000000000000000000000604482015290519081900360640190fd5b604080516001608060020a03198f166020808301919091527f06000000000000000000000000000000000000000000000000000000000000006030830152825160118184030181526031909201928390528151610a0193918291908401908083835b602083106109cc5780518252601f1990920191602091820191016109ad565b6001836020036101000a0380198251168184511680821785525050505050509050019150506040518091039020898989611a0f565b93508a600160a060020a031684600160a060020a03161480610a3457508b600160a060020a031684600160a060020a0316145b1515610a8a576040805160e560020a62461bcd02815260206004820152601760248201527f4d757374206265206275796572206f722073656c6c6572000000000000000000604482015290519081900360640190fd5b610a978d8d8d8d8d611b70565b815191945092501515610af4576040805160e560020a62461bcd02815260206004820152601560248201527f457363726f7720646f6573206e6f742065786973740000000000000000000000604482015290519081900360640190fd5b606460ff86161115610b76576040805160e560020a62461bcd02815260206004820152602260248201527f5f627579657250657263656e74206d75737420626520313030206f72206c6f7760448201527f6572000000000000000000000000000000000000000000000000000000000000606482015290519081900360840190fd5b5060408201513a618d0402016001608060020a0316808a038a1015610be5576040805160e560020a62461bcd02815260206004820152600e60248201527f4f766572666c6f77206572726f72000000000000000000000000000000000000604482015290519081900360640190fd5b6003805482019055600082815260046020526040808220805474ffffffffffffffffffffffffffffffffffffffffff191690555183917f65e0c7182ce84cd9087c1b07dc4b65875578877b885848e4be19ee312f2c3d3191a260008560ff161115610c8b57604051600160a060020a038c1690606460ff8816848e03020480156108fc02916000818181858888f19350505050158015610c89573d6000803e3d6000fd5b505b60648560ff161015610cda57604051600160a060020a038d1690606487810360ff16848e03020480156108fc02916000818181858888f19350505050158015610cd8573d6000803e3d6000fd5b505b50505050505050505050505050565b600033600160a060020a03851614610d4b576040805160e560020a62461bcd02815260206004820152600d60248201527f4d75737420626520627579657200000000000000000000000000000000000000604482015290519081900360640190fd5b610d5a86868686866000611cb4565b9695505050505050565b60046020526000908152604090205460ff811690610100810463ffffffff16906501000000000090046001608060020a031683565b600033600160a060020a03861614610dfb576040805160e560020a62461bcd02815260206004820152600e60248201527f4d7573742062652073656c6c6572000000000000000000000000000000000000604482015290519081900360640190fd5b610d5a86868686866000611d7f565b60025474010000000000000000000000000000000000000000900463ffffffff1681565b600033600160a060020a03851614610e90576040805160e560020a62461bcd02815260206004820152600d60248201527f4d75737420626520627579657200000000000000000000000000000000000000604482015290519081900360640190fd5b610d5a86868686866000611e69565b600154600160a060020a03163314610eef576040805160e560020a62461bcd02815260206004820152600d60248201526000805160206123e5833981519152604482015290519081900360640190fd5b6002805473ffffffffffffffffffffffffffffffffffffffff1916600160a060020a0392909216919091179055565b600033600160a060020a03861614610f80576040805160e560020a62461bcd02815260206004820152600e60248201527f4d7573742062652073656c6c6572000000000000000000000000000000000000604482015290519081900360640190fd5b610d5a86868686866000611f25565b600054600160a060020a031681565b600254600160a060020a031681565b600154600160a060020a031681565b6060806000808d51604051908082528060200260200182016040528015610fed578160200160208202803883390190505b50600254909350600160a060020a0316331461100a57600061101a565b8d51616f5481151561101857fe5b045b9150600090505b8d518160ff16101561116c576111448e8260ff1681518110151561104157fe5b906020019060200201518e8360ff1681518110151561105c57fe5b906020019060200201518e8460ff1681518110151561107757fe5b906020019060200201518e8560ff1681518110151561109257fe5b906020019060200201518e8660ff168151811015156110ad57fe5b906020019060200201518e8760ff168151811015156110c857fe5b906020019060200201518e8860ff168151811015156110e357fe5b906020019060200201518e8960ff168151811015156110fe57fe5b906020019060200201518e8a60ff1681518110151561111957fe5b906020019060200201518e8b60ff1681518110151561113457fe5b906020019060200201518c612007565b838260ff1681518110151561115557fe5b911515602092830290910190910152600101611021565b50909c9b505050505050505050505050565b600154600160a060020a031633146111ce576040805160e560020a62461bcd02815260206004820152600d60248201526000805160206123e5833981519152604482015290519081900360640190fd5b60035481111561124e576040805160e560020a62461bcd02815260206004820152602660248201527f416d6f756e7420697320686967686572207468616e20616d6f756e742061766160448201527f696c61626c650000000000000000000000000000000000000000000000000000606482015290519081900360840190fd5b600380548290039055604051600160a060020a0383169082156108fc029083906000818181858888f1935050505015801561128d573d6000803e3d6000fd5b505050565b600154600160a060020a031633146112e2576040805160e560020a62461bcd02815260206004820152600d60248201526000805160206123e5833981519152604482015290519081900360640190fd5b6000805473ffffffffffffffffffffffffffffffffffffffff1916600160a060020a0392909216919091179055565b600154600160a060020a03163314611361576040805160e560020a62461bcd02815260206004820152600d60248201526000805160206123e5833981519152604482015290519081900360640190fd5b82600160a060020a031663095ea7b383836040518363ffffffff1660e060020a0281526004018083600160a060020a0316600160a060020a0316815260200182815260200192505050602060405180830381600087803b1580156113c457600080fd5b505af11580156113d8573d6000803e3d6000fd5b505050506040513d60208110156113ee57600080fd5b5050505050565b60035481565b600154600160a060020a0316331461144b576040805160e560020a62461bcd02815260206004820152600d60248201526000805160206123e5833981519152604482015290519081900360640190fd5b604080517f23b872dd000000000000000000000000000000000000000000000000000000008152600160a060020a0385811660048301528481166024830152604482018490529151918616916323b872dd916064808201926020929091908290030181600087803b1580156114bf57600080fd5b505af11580156114d3573d6000803e3d6000fd5b505050506040513d60208110156114e957600080fd5b505050505050565b600033600160a060020a03861614611553576040805160e560020a62461bcd02815260206004820152600e60248201527f4d7573742062652073656c6c6572000000000000000000000000000000000000604482015290519081900360640190fd5b610d5a86868686866000612151565b604080516001608060020a03198c166020808301919091526c01000000000000000000000000600160a060020a03808e16820260308501528c16026044830152605882018a90527e0100000000000000000000000000000000000000000000000000000000000061ffff8a160260788301528251605a818403018152607a90920192839052815160009384938493909282918401908083835b6020831061161a5780518252601f1990920191602091820191016115fb565b51815160209384036101000a6000190180199092169116179052604080519290940182900390912060008181526004909252929020549196505060ff161591506116b09050576040805160e560020a62461bcd02815260206004820152601460248201527f547261646520616c726561647920657869737473000000000000000000000000604482015290519081900360640190fd5b60408051602080820186905260e060020a63ffffffff808d168202848601528b1602604483015282516028818403018152604890920192839052815191929182918401908083835b602083106117175780518252601f1990920191602091820191016116f8565b5181516020939093036101000a60001901801990911692169190911790526040519201829003909120600254909550600160a060020a031692506117619150849050888888611a0f565b600160a060020a0316146117bf576040805160e560020a62461bcd02815260206004820152600f60248201527f4d7573742062652072656c617965720000000000000000000000000000000000604482015290519081900360640190fd5b63ffffffff8716421061181c576040805160e560020a62461bcd02815260206004820152601560248201527f5369676e61747572652068617320657870697265640000000000000000000000604482015290519081900360640190fd5b893414801561182b5750600034115b1515611881576040805160e560020a62461bcd02815260206004820152601460248201527f496e636f72726563742065746865722073656e74000000000000000000000000604482015290519081900360640190fd5b63ffffffff88161561189557874201611898565b60015b604080516060810182526001815263ffffffff808416602080840191825260008486018181528a8252600490925285812094518554935192516001608060020a0316650100000000000274ffffffffffffffffffffffffffffffff000000000019939095166101000264ffffffff001991151560ff199095169490941716929092171691909117909155905191925084917f102d25c49d33fcdb8976a3f2744e0785c98d9e43b88364859e6aec4ae82eff5c9190a250505050505050505050505050565b600154600160a060020a031633146119ac576040805160e560020a62461bcd02815260206004820152600d60248201526000805160206123e5833981519152604482015290519081900360640190fd5b82600160a060020a031663a9059cbb83836040518363ffffffff1660e060020a0281526004018083600160a060020a0316600160a060020a0316815260200182815260200192505050602060405180830381600087803b1580156113c457600080fd5b604080518082018252601c8082527f19457468657265756d205369676e6564204d6573736167653a0a33320000000060208084019182529351600094859385938b939092019182918083835b60208310611a7a5780518252601f199092019160209182019101611a5b565b51815160209384036101000a600019018019909216911617905292019384525060408051808503815293820190819052835193945092839250908401908083835b60208310611ada5780518252601f199092019160209182019101611abb565b51815160209384036101000a600019018019909216911617905260408051929094018290038220600080845283830180875282905260ff8e1684870152606084018d9052608084018c905294519097506001965060a080840196509194601f19820194509281900390910191865af1158015611b5a573d6000803e3d6000fd5b5050604051601f19015198975050505050505050565b611b786123c4565b604080516001608060020a031988166020808301919091526c01000000000000000000000000600160a060020a03808a16820260308501528816026044830152605882018690527e0100000000000000000000000000000000000000000000000000000000000061ffff86160260788301528251605a818403018152607a909201928390528151600093849392909182918401908083835b60208310611c2f5780518252601f199092019160209182019101611c10565b518151602093840361010090810a6000190180199093169290911691909117909152604080519390950183900383206000818152600484528690206060850187525460ff81161515855291820463ffffffff16928401929092526501000000000090046001608060020a0316938201939093529c919b50909950505050505050505050565b6000611cbe6123c4565b600080611cce8a8a8a8a8a611b70565b815191945092501515611ce45760009350611d72565b600254600160a060020a03163314611cfd576000611d05565b61b4af85013a025b60408085015160008581526004602052828120805474ffffffffffffffffffffffffffffffffffffffffff1916905591519201925083917fd9b627ddaa414e8e6c82366cc9c179f6281d73968827cc17038a56852e28ac8b9190a2611d6d8988836000612205565b600193505b5050509695505050505050565b6000611d896123c4565b600080611d998a8a8a8a8a611b70565b815191945092501515611daf5760009350611d72565b6001836020015163ffffffff16111580611dd2575042836020015163ffffffff16115b15611de05760009350611d72565b600254600160a060020a03163314611df9576000611e01565b61b6df85013a025b60408085015160008581526004602052828120805474ffffffffffffffffffffffffffffffffffffffffff1916905591519201925083917f366d2b4e6cc37ecebb3d7d41df6d581634fd8137412710a1e086e4ca4656bb589190a2611d6d8988836000612205565b6000611e736123c4565b6000611e828989898989611b70565b815191935091501515611e985760009250611f19565b602082015163ffffffff161515611eb25760009250611f19565b600081815260046020526040808220805464ffffffff00191690555182917fe95fa7985c7585e90dab2dc46470726468662be06f67d79a31a5012e4bc0edeb91a2600254600160a060020a0316331415611f1457611f14816171108601612269565b600192505b50509695505050505050565b6000611f2f6123c4565b6000611f3e8989898989611b70565b815191935091501515611f545760009250611f19565b816020015163ffffffff166001141515611f715760009250611f19565b60025460008281526004602052604080822080544263ffffffff740100000000000000000000000000000000000000009096048616019094166101000264ffffffff001990941693909317909255905182917f43e76a2687c7b12792086e4c776772be26c4d6a7041115f446cbc22ccada08ab91a2600254600160a060020a0316331415611f1457611f14816173438601612269565b6000806120188d858a8a8a8a6122bb565b90508a600160a060020a031681600160a060020a031614156120745760ff8416600114156120555761204e8d8d8d8d8d88611e69565b9150612141565b60ff84166002141561206f5761204e8d8d8d8d8d88611cb4565b612141565b8b600160a060020a031681600160a060020a031614156120dc5760ff8416600514156120a85761204e8d8d8d8d8d88612151565b60ff8416600314156120c25761204e8d8d8d8d8d88611d7f565b60ff84166004141561206f5761204e8d8d8d8d8d88611f25565b33600160a060020a038d161461213c576040805160e560020a62461bcd02815260206004820152601260248201527f556e7265636f676e697365642070617274790000000000000000000000000000604482015290519081900360640190fd5b600091505b509b9a5050505050505050505050565b600061215b6123c4565b60008061216b8a8a8a8a8a611b70565b8151919450925015156121815760009350611d72565b600254600160a060020a0316331461219a5760006121a2565b61b5fc85013a025b60408085015160008581526004602052828120805474ffffffffffffffffffffffffffffffffffffffffff1916905591519201925083917f6eec2dd2382427616d4ea7ef183b16091feac4e2e63c8b55f25215f132df8d149190a2611d6d888883895b61271061ffff82168402046001608060020a0383160180840384101561222a576113ee565b6003805482019055604051600160a060020a0386169082860380156108fc02916000818181858888f193505050501580156114e9573d6000803e3d6000fd5b600091825260046020526040909120805474ffffffffffffffffffffffffffffffff00000000001981163a90930265010000000000918290046001608060020a03908116919091011602919091179055565b604080516001608060020a031988166020808301919091527f010000000000000000000000000000000000000000000000000000000000000060ff89160260308301527001000000000000000000000000000000006001608060020a038816026031830152825160218184030181526041909201928390528151600093849392909182918401908083835b602083106123655780518252601f199092019160209182019101612346565b6001836020036101000a03801982511681845116808217855250505050505090500191505060405180910390209050856001608060020a03163a11156123aa576123b9565b6123b681868686611a0f565b91505b509695505050505050565b60408051606081018252600080825260208201819052918101919091529056004d757374206265206f776e657200000000000000000000000000000000000000a165627a7a72305820654333d3912b8c3728a12e74d8df8495a94933ffd9a94d7e32ed95bc0ab7b6830029
Deployed Bytecode
0x60806040526004361061010e5763ffffffff60e060020a60003504166305b64993811461011357806313af40351461013357806324943c7d146101545780632cc9636c146101a75780632d83549c146101f957806335adc0c51461023f57806357938b2a1461027d5780635c810f09146102ab5780636548e9bc146102e95780636b4078371461030a5780636cc6cde1146103485780638406c079146103795780638da5cb5b1461038e5780638eb4e0ad146103a3578063ad3b1b4714610649578063b0eefabe1461066d578063da3e33971461068e578063de5785d5146106b8578063e5994905146106df578063e9600f121461070f578063f1e03d671461074d578063f5537ede1461079b575b600080fd5b34801561011f57600080fd5b5061013163ffffffff600435166107c5565b005b34801561013f57600080fd5b50610131600160a060020a036004351661085d565b34801561016057600080fd5b506101316001608060020a031960043516600160a060020a036024358116906044351660643561ffff6084351660ff60a43581169060c4359060e4359061010435166108dc565b3480156101b357600080fd5b506101e56001608060020a031960043516600160a060020a036024358116906044351660643561ffff60843516610ce9565b604080519115158252519081900360200190f35b34801561020557600080fd5b50610211600435610d64565b60408051931515845263ffffffff90921660208401526001608060020a031682820152519081900360600190f35b34801561024b57600080fd5b506101e56001608060020a031960043516600160a060020a036024358116906044351660643561ffff60843516610d99565b34801561028957600080fd5b50610292610e0a565b6040805163ffffffff9092168252519081900360200190f35b3480156102b757600080fd5b506101e56001608060020a031960043516600160a060020a036024358116906044351660643561ffff60843516610e2e565b3480156102f557600080fd5b50610131600160a060020a0360043516610e9f565b34801561031657600080fd5b506101e56001608060020a031960043516600160a060020a036024358116906044351660643561ffff60843516610f1e565b34801561035457600080fd5b5061035d610f8f565b60408051600160a060020a039092168252519081900360200190f35b34801561038557600080fd5b5061035d610f9e565b34801561039a57600080fd5b5061035d610fad565b3480156103af57600080fd5b50604080516020600480358082013583810280860185019096528085526105f995369593946024949385019291829185019084908082843750506040805187358901803560208181028481018201909552818452989b9a998901989297509082019550935083925085019084908082843750506040805187358901803560208181028481018201909552818452989b9a998901989297509082019550935083925085019084908082843750506040805187358901803560208181028481018201909552818452989b9a998901989297509082019550935083925085019084908082843750506040805187358901803560208181028481018201909552818452989b9a998901989297509082019550935083925085019084908082843750506040805187358901803560208181028481018201909552818452989b9a998901989297509082019550935083925085019084908082843750506040805187358901803560208181028481018201909552818452989b9a998901989297509082019550935083925085019084908082843750506040805187358901803560208181028481018201909552818452989b9a998901989297509082019550935083925085019084908082843750506040805187358901803560208181028481018201909552818452989b9a998901989297509082019550935083925085019084908082843750506040805187358901803560208181028481018201909552818452989b9a998901989297509082019550935083925085019084908082843750949750610fbc9650505050505050565b60408051602080825283518183015283519192839290830191858101910280838360005b8381101561063557818101518382015260200161061d565b505050509050019250505060405180910390f35b34801561065557600080fd5b50610131600160a060020a036004351660243561117e565b34801561067957600080fd5b50610131600160a060020a0360043516611292565b34801561069a57600080fd5b50610131600160a060020a0360043581169060243516604435611311565b3480156106c457600080fd5b506106cd6113f5565b60408051918252519081900360200190f35b3480156106eb57600080fd5b50610131600160a060020a03600435811690602435811690604435166064356113fb565b34801561071b57600080fd5b506101e56001608060020a031960043516600160a060020a036024358116906044351660643561ffff608435166114f1565b6101316001608060020a031960043516600160a060020a036024358116906044351660643561ffff6084351663ffffffff60a43581169060c4351660ff60e435166101043561012435611562565b3480156107a757600080fd5b50610131600160a060020a036004358116906024351660443561195c565b600154600160a060020a03163314610815576040805160e560020a62461bcd02815260206004820152600d60248201526000805160206123e5833981519152604482015290519081900360640190fd5b6002805463ffffffff909216740100000000000000000000000000000000000000000277ffffffff000000000000000000000000000000000000000019909216919091179055565b600154600160a060020a031633146108ad576040805160e560020a62461bcd02815260206004820152600d60248201526000805160206123e5833981519152604482015290519081900360640190fd5b6001805473ffffffffffffffffffffffffffffffffffffffff1916600160a060020a0392909216919091179055565b60006108e66123c4565b600080548190600160a060020a0316331461094b576040805160e560020a62461bcd02815260206004820152601260248201527f4d7573742062652061726269747261746f720000000000000000000000000000604482015290519081900360640190fd5b604080516001608060020a03198f166020808301919091527f06000000000000000000000000000000000000000000000000000000000000006030830152825160118184030181526031909201928390528151610a0193918291908401908083835b602083106109cc5780518252601f1990920191602091820191016109ad565b6001836020036101000a0380198251168184511680821785525050505050509050019150506040518091039020898989611a0f565b93508a600160a060020a031684600160a060020a03161480610a3457508b600160a060020a031684600160a060020a0316145b1515610a8a576040805160e560020a62461bcd02815260206004820152601760248201527f4d757374206265206275796572206f722073656c6c6572000000000000000000604482015290519081900360640190fd5b610a978d8d8d8d8d611b70565b815191945092501515610af4576040805160e560020a62461bcd02815260206004820152601560248201527f457363726f7720646f6573206e6f742065786973740000000000000000000000604482015290519081900360640190fd5b606460ff86161115610b76576040805160e560020a62461bcd02815260206004820152602260248201527f5f627579657250657263656e74206d75737420626520313030206f72206c6f7760448201527f6572000000000000000000000000000000000000000000000000000000000000606482015290519081900360840190fd5b5060408201513a618d0402016001608060020a0316808a038a1015610be5576040805160e560020a62461bcd02815260206004820152600e60248201527f4f766572666c6f77206572726f72000000000000000000000000000000000000604482015290519081900360640190fd5b6003805482019055600082815260046020526040808220805474ffffffffffffffffffffffffffffffffffffffffff191690555183917f65e0c7182ce84cd9087c1b07dc4b65875578877b885848e4be19ee312f2c3d3191a260008560ff161115610c8b57604051600160a060020a038c1690606460ff8816848e03020480156108fc02916000818181858888f19350505050158015610c89573d6000803e3d6000fd5b505b60648560ff161015610cda57604051600160a060020a038d1690606487810360ff16848e03020480156108fc02916000818181858888f19350505050158015610cd8573d6000803e3d6000fd5b505b50505050505050505050505050565b600033600160a060020a03851614610d4b576040805160e560020a62461bcd02815260206004820152600d60248201527f4d75737420626520627579657200000000000000000000000000000000000000604482015290519081900360640190fd5b610d5a86868686866000611cb4565b9695505050505050565b60046020526000908152604090205460ff811690610100810463ffffffff16906501000000000090046001608060020a031683565b600033600160a060020a03861614610dfb576040805160e560020a62461bcd02815260206004820152600e60248201527f4d7573742062652073656c6c6572000000000000000000000000000000000000604482015290519081900360640190fd5b610d5a86868686866000611d7f565b60025474010000000000000000000000000000000000000000900463ffffffff1681565b600033600160a060020a03851614610e90576040805160e560020a62461bcd02815260206004820152600d60248201527f4d75737420626520627579657200000000000000000000000000000000000000604482015290519081900360640190fd5b610d5a86868686866000611e69565b600154600160a060020a03163314610eef576040805160e560020a62461bcd02815260206004820152600d60248201526000805160206123e5833981519152604482015290519081900360640190fd5b6002805473ffffffffffffffffffffffffffffffffffffffff1916600160a060020a0392909216919091179055565b600033600160a060020a03861614610f80576040805160e560020a62461bcd02815260206004820152600e60248201527f4d7573742062652073656c6c6572000000000000000000000000000000000000604482015290519081900360640190fd5b610d5a86868686866000611f25565b600054600160a060020a031681565b600254600160a060020a031681565b600154600160a060020a031681565b6060806000808d51604051908082528060200260200182016040528015610fed578160200160208202803883390190505b50600254909350600160a060020a0316331461100a57600061101a565b8d51616f5481151561101857fe5b045b9150600090505b8d518160ff16101561116c576111448e8260ff1681518110151561104157fe5b906020019060200201518e8360ff1681518110151561105c57fe5b906020019060200201518e8460ff1681518110151561107757fe5b906020019060200201518e8560ff1681518110151561109257fe5b906020019060200201518e8660ff168151811015156110ad57fe5b906020019060200201518e8760ff168151811015156110c857fe5b906020019060200201518e8860ff168151811015156110e357fe5b906020019060200201518e8960ff168151811015156110fe57fe5b906020019060200201518e8a60ff1681518110151561111957fe5b906020019060200201518e8b60ff1681518110151561113457fe5b906020019060200201518c612007565b838260ff1681518110151561115557fe5b911515602092830290910190910152600101611021565b50909c9b505050505050505050505050565b600154600160a060020a031633146111ce576040805160e560020a62461bcd02815260206004820152600d60248201526000805160206123e5833981519152604482015290519081900360640190fd5b60035481111561124e576040805160e560020a62461bcd02815260206004820152602660248201527f416d6f756e7420697320686967686572207468616e20616d6f756e742061766160448201527f696c61626c650000000000000000000000000000000000000000000000000000606482015290519081900360840190fd5b600380548290039055604051600160a060020a0383169082156108fc029083906000818181858888f1935050505015801561128d573d6000803e3d6000fd5b505050565b600154600160a060020a031633146112e2576040805160e560020a62461bcd02815260206004820152600d60248201526000805160206123e5833981519152604482015290519081900360640190fd5b6000805473ffffffffffffffffffffffffffffffffffffffff1916600160a060020a0392909216919091179055565b600154600160a060020a03163314611361576040805160e560020a62461bcd02815260206004820152600d60248201526000805160206123e5833981519152604482015290519081900360640190fd5b82600160a060020a031663095ea7b383836040518363ffffffff1660e060020a0281526004018083600160a060020a0316600160a060020a0316815260200182815260200192505050602060405180830381600087803b1580156113c457600080fd5b505af11580156113d8573d6000803e3d6000fd5b505050506040513d60208110156113ee57600080fd5b5050505050565b60035481565b600154600160a060020a0316331461144b576040805160e560020a62461bcd02815260206004820152600d60248201526000805160206123e5833981519152604482015290519081900360640190fd5b604080517f23b872dd000000000000000000000000000000000000000000000000000000008152600160a060020a0385811660048301528481166024830152604482018490529151918616916323b872dd916064808201926020929091908290030181600087803b1580156114bf57600080fd5b505af11580156114d3573d6000803e3d6000fd5b505050506040513d60208110156114e957600080fd5b505050505050565b600033600160a060020a03861614611553576040805160e560020a62461bcd02815260206004820152600e60248201527f4d7573742062652073656c6c6572000000000000000000000000000000000000604482015290519081900360640190fd5b610d5a86868686866000612151565b604080516001608060020a03198c166020808301919091526c01000000000000000000000000600160a060020a03808e16820260308501528c16026044830152605882018a90527e0100000000000000000000000000000000000000000000000000000000000061ffff8a160260788301528251605a818403018152607a90920192839052815160009384938493909282918401908083835b6020831061161a5780518252601f1990920191602091820191016115fb565b51815160209384036101000a6000190180199092169116179052604080519290940182900390912060008181526004909252929020549196505060ff161591506116b09050576040805160e560020a62461bcd02815260206004820152601460248201527f547261646520616c726561647920657869737473000000000000000000000000604482015290519081900360640190fd5b60408051602080820186905260e060020a63ffffffff808d168202848601528b1602604483015282516028818403018152604890920192839052815191929182918401908083835b602083106117175780518252601f1990920191602091820191016116f8565b5181516020939093036101000a60001901801990911692169190911790526040519201829003909120600254909550600160a060020a031692506117619150849050888888611a0f565b600160a060020a0316146117bf576040805160e560020a62461bcd02815260206004820152600f60248201527f4d7573742062652072656c617965720000000000000000000000000000000000604482015290519081900360640190fd5b63ffffffff8716421061181c576040805160e560020a62461bcd02815260206004820152601560248201527f5369676e61747572652068617320657870697265640000000000000000000000604482015290519081900360640190fd5b893414801561182b5750600034115b1515611881576040805160e560020a62461bcd02815260206004820152601460248201527f496e636f72726563742065746865722073656e74000000000000000000000000604482015290519081900360640190fd5b63ffffffff88161561189557874201611898565b60015b604080516060810182526001815263ffffffff808416602080840191825260008486018181528a8252600490925285812094518554935192516001608060020a0316650100000000000274ffffffffffffffffffffffffffffffff000000000019939095166101000264ffffffff001991151560ff199095169490941716929092171691909117909155905191925084917f102d25c49d33fcdb8976a3f2744e0785c98d9e43b88364859e6aec4ae82eff5c9190a250505050505050505050505050565b600154600160a060020a031633146119ac576040805160e560020a62461bcd02815260206004820152600d60248201526000805160206123e5833981519152604482015290519081900360640190fd5b82600160a060020a031663a9059cbb83836040518363ffffffff1660e060020a0281526004018083600160a060020a0316600160a060020a0316815260200182815260200192505050602060405180830381600087803b1580156113c457600080fd5b604080518082018252601c8082527f19457468657265756d205369676e6564204d6573736167653a0a33320000000060208084019182529351600094859385938b939092019182918083835b60208310611a7a5780518252601f199092019160209182019101611a5b565b51815160209384036101000a600019018019909216911617905292019384525060408051808503815293820190819052835193945092839250908401908083835b60208310611ada5780518252601f199092019160209182019101611abb565b51815160209384036101000a600019018019909216911617905260408051929094018290038220600080845283830180875282905260ff8e1684870152606084018d9052608084018c905294519097506001965060a080840196509194601f19820194509281900390910191865af1158015611b5a573d6000803e3d6000fd5b5050604051601f19015198975050505050505050565b611b786123c4565b604080516001608060020a031988166020808301919091526c01000000000000000000000000600160a060020a03808a16820260308501528816026044830152605882018690527e0100000000000000000000000000000000000000000000000000000000000061ffff86160260788301528251605a818403018152607a909201928390528151600093849392909182918401908083835b60208310611c2f5780518252601f199092019160209182019101611c10565b518151602093840361010090810a6000190180199093169290911691909117909152604080519390950183900383206000818152600484528690206060850187525460ff81161515855291820463ffffffff16928401929092526501000000000090046001608060020a0316938201939093529c919b50909950505050505050505050565b6000611cbe6123c4565b600080611cce8a8a8a8a8a611b70565b815191945092501515611ce45760009350611d72565b600254600160a060020a03163314611cfd576000611d05565b61b4af85013a025b60408085015160008581526004602052828120805474ffffffffffffffffffffffffffffffffffffffffff1916905591519201925083917fd9b627ddaa414e8e6c82366cc9c179f6281d73968827cc17038a56852e28ac8b9190a2611d6d8988836000612205565b600193505b5050509695505050505050565b6000611d896123c4565b600080611d998a8a8a8a8a611b70565b815191945092501515611daf5760009350611d72565b6001836020015163ffffffff16111580611dd2575042836020015163ffffffff16115b15611de05760009350611d72565b600254600160a060020a03163314611df9576000611e01565b61b6df85013a025b60408085015160008581526004602052828120805474ffffffffffffffffffffffffffffffffffffffffff1916905591519201925083917f366d2b4e6cc37ecebb3d7d41df6d581634fd8137412710a1e086e4ca4656bb589190a2611d6d8988836000612205565b6000611e736123c4565b6000611e828989898989611b70565b815191935091501515611e985760009250611f19565b602082015163ffffffff161515611eb25760009250611f19565b600081815260046020526040808220805464ffffffff00191690555182917fe95fa7985c7585e90dab2dc46470726468662be06f67d79a31a5012e4bc0edeb91a2600254600160a060020a0316331415611f1457611f14816171108601612269565b600192505b50509695505050505050565b6000611f2f6123c4565b6000611f3e8989898989611b70565b815191935091501515611f545760009250611f19565b816020015163ffffffff166001141515611f715760009250611f19565b60025460008281526004602052604080822080544263ffffffff740100000000000000000000000000000000000000009096048616019094166101000264ffffffff001990941693909317909255905182917f43e76a2687c7b12792086e4c776772be26c4d6a7041115f446cbc22ccada08ab91a2600254600160a060020a0316331415611f1457611f14816173438601612269565b6000806120188d858a8a8a8a6122bb565b90508a600160a060020a031681600160a060020a031614156120745760ff8416600114156120555761204e8d8d8d8d8d88611e69565b9150612141565b60ff84166002141561206f5761204e8d8d8d8d8d88611cb4565b612141565b8b600160a060020a031681600160a060020a031614156120dc5760ff8416600514156120a85761204e8d8d8d8d8d88612151565b60ff8416600314156120c25761204e8d8d8d8d8d88611d7f565b60ff84166004141561206f5761204e8d8d8d8d8d88611f25565b33600160a060020a038d161461213c576040805160e560020a62461bcd02815260206004820152601260248201527f556e7265636f676e697365642070617274790000000000000000000000000000604482015290519081900360640190fd5b600091505b509b9a5050505050505050505050565b600061215b6123c4565b60008061216b8a8a8a8a8a611b70565b8151919450925015156121815760009350611d72565b600254600160a060020a0316331461219a5760006121a2565b61b5fc85013a025b60408085015160008581526004602052828120805474ffffffffffffffffffffffffffffffffffffffffff1916905591519201925083917f6eec2dd2382427616d4ea7ef183b16091feac4e2e63c8b55f25215f132df8d149190a2611d6d888883895b61271061ffff82168402046001608060020a0383160180840384101561222a576113ee565b6003805482019055604051600160a060020a0386169082860380156108fc02916000818181858888f193505050501580156114e9573d6000803e3d6000fd5b600091825260046020526040909120805474ffffffffffffffffffffffffffffffff00000000001981163a90930265010000000000918290046001608060020a03908116919091011602919091179055565b604080516001608060020a031988166020808301919091527f010000000000000000000000000000000000000000000000000000000000000060ff89160260308301527001000000000000000000000000000000006001608060020a038816026031830152825160218184030181526041909201928390528151600093849392909182918401908083835b602083106123655780518252601f199092019160209182019101612346565b6001836020036101000a03801982511681845116808217855250505050505090500191505060405180910390209050856001608060020a03163a11156123aa576123b9565b6123b681868686611a0f565b91505b509695505050505050565b60408051606081018252600080825260208201819052918101919091529056004d757374206265206f776e657200000000000000000000000000000000000000a165627a7a72305820654333d3912b8c3728a12e74d8df8495a94933ffd9a94d7e32ed95bc0ab7b6830029
Swarm Source
bzzr://654333d3912b8c3728a12e74d8df8495a94933ffd9a94d7e32ed95bc0ab7b683
Loading...
Loading
Loading...
Loading
Make sure to use the "Vote Down" button for any spammy posts, and the "Vote Up" for interesting conversations.
[ 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.