pragma solidity ^0.4.18;
library SafeMath
{
function mul(uint256 a, uint256 b) internal pure
returns (uint256)
{
uint256 c = a * b;
assert(a == 0 || c / a == b);
return c;
}
function div(uint256 a, uint256 b) internal pure
returns (uint256)
{
// assert(b > 0); // Solidity automatically throws when dividing by 0
uint256 c = a / b;
// assert(a == b * c + a % b); // There is no case in which this doesn't hold
return c;
}
function sub(uint256 a, uint256 b) internal pure
returns (uint256)
{
assert(b <= a);
return a - b;
}
function add(uint256 a, uint256 b) internal pure
returns (uint256)
{
uint256 c = a + b;
assert(c >= a);
return c;
}
}
/**
* @title Ownable
* @dev The Ownable contract has an owner address, and provides basic authorization control
* functions, this simplifies the implementation of "user permissions".
*/
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.
*/
function Ownable() 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;
}
}
interface tokenRecipient
{
function receiveApproval(address _from, uint256 _value, address _token, bytes _extraData) external;
}
contract TokenERC20 is Ownable
{
using SafeMath for uint;
// Public variables of the token
string public name;
string public symbol;
uint256 public decimals = 18;
uint256 DEC = 10 ** uint256(decimals);
uint256 public totalSupply;
uint256 public avaliableSupply;
uint256 public buyPrice = 1000000000000000000 wei;
// This creates an array with all balances
mapping (address => uint256) public balanceOf;
mapping (address => mapping (address => uint256)) public allowance;
// This generates a public event on the blockchain that will notify clients
event Transfer(address indexed from, address indexed to, uint256 value);
event Burn(address indexed from, uint256 value);
event Approval(address indexed _owner, address indexed _spender, uint256 _value);
/**
* Constrctor function
*
* Initializes contract with initial supply tokens to the creator of the contract
*/
function TokenERC20(
uint256 initialSupply,
string tokenName,
string tokenSymbol
) public
{
totalSupply = initialSupply.mul(DEC); // Update total supply with the decimal amount
balanceOf[this] = totalSupply; // Give the creator all initial tokens
avaliableSupply = balanceOf[this]; // Show how much tokens on contract
name = tokenName; // Set the name for display purposes
symbol = tokenSymbol; // Set the symbol for display purposes
}
/**
* Internal transfer, only can be called by this contract
*
* @param _from - address of the contract
* @param _to - address of the investor
* @param _value - tokens for the investor
*/
function _transfer(address _from, address _to, uint256 _value) internal
{
// Prevent transfer to 0x0 address. Use burn() instead
require(_to != 0x0);
// Check if the sender has enough
require(balanceOf[_from] >= _value);
// Check for overflows
require(balanceOf[_to].add(_value) > balanceOf[_to]);
// Save this for an assertion in the future
uint previousBalances = balanceOf[_from].add(balanceOf[_to]);
// Subtract from the sender
balanceOf[_from] = balanceOf[_from].sub(_value);
// Add the same to the recipient
balanceOf[_to] = balanceOf[_to].add(_value);
emit Transfer(_from, _to, _value);
// Asserts are used to use static analysis to find bugs in your code. They should never fail
assert(balanceOf[_from].add(balanceOf[_to]) == previousBalances);
}
/**
* Transfer tokens
*
* Send `_value` tokens to `_to` from your account
*
* @param _to The address of the recipient
* @param _value the amount to send
*/
function transfer(address _to, uint256 _value) public
{
_transfer(msg.sender, _to, _value);
}
/**
* Transfer tokens from other address
*
* Send `_value` tokens to `_to` in behalf of `_from`
*
* @param _from The address of the sender
* @param _to The address of the recipient
* @param _value the amount to send
*/
function transferFrom(address _from, address _to, uint256 _value) public
returns (bool success)
{
require(_value <= allowance[_from][msg.sender]); // Check allowance
allowance[_from][msg.sender] = allowance[_from][msg.sender].sub(_value);
_transfer(_from, _to, _value);
return true;
}
/**
* Set allowance for other address
*
* Allows `_spender` to spend no more than `_value` tokens in your behalf
*
* @param _spender The address authorized to spend
* @param _value the max amount they can spend
*/
function approve(address _spender, uint256 _value) public
returns (bool success)
{
allowance[msg.sender][_spender] = _value;
return true;
}
/**
* Set allowance for other address and notify
*
* Allows `_spender` to spend no more than `_value` tokens in your behalf, and then ping the contract about it
*
* @param _spender The address authorized to spend
* @param _value the max amount they can spend
* @param _extraData some extra information to send to the approved contract
*/
function approveAndCall(address _spender, uint256 _value, bytes _extraData) public onlyOwner
returns (bool success)
{
tokenRecipient spender = tokenRecipient(_spender);
if (approve(_spender, _value)) {
spender.receiveApproval(msg.sender, _value, this, _extraData);
return true;
}
}
/**
* approve should be called when allowed[_spender] == 0. To increment
* allowed value is better to use this function to avoid 2 calls (and wait until
* the first transaction is mined)
* From MonolithDAO Token.sol
*/
function increaseApproval (address _spender, uint _addedValue) public
returns (bool success)
{
allowance[msg.sender][_spender] = allowance[msg.sender][_spender].add(_addedValue);
emit Approval(msg.sender, _spender, allowance[msg.sender][_spender]);
return true;
}
function decreaseApproval (address _spender, uint _subtractedValue) public
returns (bool success)
{
uint oldValue = allowance[msg.sender][_spender];
if (_subtractedValue > oldValue) {
allowance[msg.sender][_spender] = 0;
} else {
allowance[msg.sender][_spender] = oldValue.sub(_subtractedValue);
}
emit Approval(msg.sender, _spender, allowance[msg.sender][_spender]);
return true;
}
/**
* Destroy tokens
*
* Remove `_value` tokens from the system irreversibly
*
* @param _value the amount of money to burn
*/
function burn(uint256 _value) public onlyOwner
returns (bool success)
{
require(balanceOf[msg.sender] >= _value); // Check if the sender has enough
balanceOf[msg.sender] = balanceOf[msg.sender].sub(_value); // Subtract from the sender
totalSupply = totalSupply.sub(_value); // Updates totalSupply
avaliableSupply = avaliableSupply.sub(_value);
emit Burn(msg.sender, _value);
return true;
}
/**
* Destroy tokens from other account
*
* Remove `_value` tokens from the system irreversibly on behalf of `_from`.
*
* @param _from the address of the sender
* @param _value the amount of money to burn
*/
function burnFrom(address _from, uint256 _value) public onlyOwner
returns (bool success)
{
require(balanceOf[_from] >= _value); // Check if the targeted balance is enough
require(_value <= allowance[_from][msg.sender]); // Check allowance
balanceOf[_from] = balanceOf[_from].sub(_value); // Subtract from the targeted balance
allowance[_from][msg.sender] = allowance[_from][msg.sender].sub(_value); // Subtract from the sender's allowance
totalSupply = totalSupply.sub(_value); // Update totalSupply
avaliableSupply = avaliableSupply.sub(_value);
emit Burn(_from, _value);
return true;
}
}
contract ERC20Extending is TokenERC20
{
using SafeMath for uint;
/**
* Function for transfer ethereum from contract to any address
*
* @param _to - address of the recipient
* @param amount - ethereum
*/
function transferEthFromContract(address _to, uint256 amount) public onlyOwner
{
_to.transfer(amount);
}
/**
* Function for transfer tokens from contract to any address
*
*/
function transferTokensFromContract(address _to, uint256 _value) public onlyOwner
{
avaliableSupply = avaliableSupply.sub(_value);
_transfer(this, _to, _value);
}
}
contract Pauseble is TokenERC20
{
event EPause();
event EUnpause();
bool public paused = true;
uint public startIcoDate = 0;
modifier whenNotPaused()
{
require(!paused);
_;
}
modifier whenPaused()
{
require(paused);
_;
}
function pause() public onlyOwner
{
paused = true;
emit EPause();
}
function pauseInternal() internal
{
paused = true;
emit EPause();
}
function unpause() public onlyOwner
{
paused = false;
emit EUnpause();
}
function unpauseInternal() internal
{
paused = false;
emit EUnpause();
}
}
contract StreamityCrowdsale is Pauseble
{
using SafeMath for uint;
uint public stage = 0;
event CrowdSaleFinished(string info);
struct Ico {
uint256 tokens; // Tokens in crowdsale
uint startDate; // Date when crowsale will be starting, after its starting that property will be the 0
uint endDate; // Date when crowdsale will be stop
uint8 discount; // Discount
uint8 discountFirstDayICO; // Discount. Only for first stage ico
}
Ico public ICO;
/**
* Expanding of the functionality
*
* @param _numerator - Numerator - value (10000)
* @param _denominator - Denominator - value (10000)
*
* example: price 1000 tokens by 1 ether = changeRate(1, 1000)
*/
function changeRate(uint256 _numerator, uint256 _denominator) public onlyOwner
returns (bool success)
{
if (_numerator == 0) _numerator = 1;
if (_denominator == 0) _denominator = 1;
buyPrice = (_numerator.mul(DEC)).div(_denominator);
return true;
}
/*
* Function show in contract what is now
*
*/
function crowdSaleStatus() internal constant
returns (string)
{
if (1 == stage) {
return "Pre-ICO";
} else if(2 == stage) {
return "ICO first stage";
} else if (3 == stage) {
return "ICO second stage";
} else if (4 >= stage) {
return "feature stage";
}
return "there is no stage at present";
}
/*
* Function for selling tokens in crowd time.
*
*/
function sell(address _investor, uint256 amount) internal
{
uint256 _amount = (amount.mul(DEC)).div(buyPrice);
if (1 == stage) {
_amount = _amount.add(withDiscount(_amount, ICO.discount));
}
else if (2 == stage)
{
if (now <= ICO.startDate + 1 days)
{
if (0 == ICO.discountFirstDayICO) {
ICO.discountFirstDayICO = 20;
}
_amount = _amount.add(withDiscount(_amount, ICO.discountFirstDayICO));
} else {
_amount = _amount.add(withDiscount(_amount, ICO.discount));
}
} else if (3 == stage) {
_amount = _amount.add(withDiscount(_amount, ICO.discount));
}
if (ICO.tokens < _amount)
{
emit CrowdSaleFinished(crowdSaleStatus());
pauseInternal();
revert();
}
ICO.tokens = ICO.tokens.sub(_amount);
avaliableSupply = avaliableSupply.sub(_amount);
_transfer(this, _investor, _amount);
}
/*
* Function for start crowdsale (any)
*
* @param _tokens - How much tokens will have the crowdsale - amount humanlike value (10000)
* @param _startDate - When crowdsale will be start - unix timestamp (1512231703 )
* @param _endDate - When crowdsale will be end - humanlike value (7) same as 7 days
* @param _discount - Discount for the crowd - humanlive value (7) same as 7 %
* @param _discount - Discount for the crowds first day - humanlive value (7) same as 7 %
*/
function startCrowd(uint256 _tokens, uint _startDate, uint _endDate, uint8 _discount, uint8 _discountFirstDayICO) public onlyOwner
{
require(_tokens * DEC <= avaliableSupply); // require to set correct tokens value for crowd
startIcoDate = _startDate;
ICO = Ico (_tokens * DEC, _startDate, _startDate + _endDate * 1 days , _discount, _discountFirstDayICO);
stage = stage.add(1);
unpauseInternal();
}
/**
* Function for web3js, should be call when somebody will buy tokens from website. This function only delegator.
*
* @param _investor - address of investor (who payed)
* @param _amount - ethereum
*/
function transferWeb3js(address _investor, uint256 _amount) external onlyOwner
{
sell(_investor, _amount);
}
/**
* Function for adding discount
*
*/
function withDiscount(uint256 _amount, uint _percent) internal pure
returns (uint256)
{
return (_amount.mul(_percent)).div(100);
}
}
contract StreamityContract is ERC20Extending, StreamityCrowdsale
{
using SafeMath for uint;
uint public weisRaised; // how many weis was raised on crowdsale
/* Streamity tokens Constructor */
function StreamityContract() public TokenERC20(130000000, "Streamity", "STM") {} //change before send !!!
/**
* Function payments handler
*
*/
function () public payable
{
assert(msg.value >= 1 ether / 10);
require(now >= ICO.startDate);
if (now >= ICO.endDate) {
pauseInternal();
emit CrowdSaleFinished(crowdSaleStatus());
}
if (0 != startIcoDate) {
if (now < startIcoDate) {
revert();
} else {
startIcoDate = 0;
}
}
if (paused == false) {
sell(msg.sender, msg.value);
weisRaised = weisRaised.add(msg.value);
}
}
}
/**
* @title Helps contracts guard agains reentrancy attacks.
* @author Remco Bloemen <remco@2π.com>
* @notice If you mark a function `nonReentrant`, you should also
* mark it `external`.
*/
contract ReentrancyGuard {
/**
* @dev We use a single lock for the whole contract.
*/
bool private reentrancy_lock = false;
/**
* @dev Prevents a contract from calling itself, directly or indirectly.
* @notice If you mark a function `nonReentrant`, you should also
* mark it `external`. Calling one nonReentrant function from
* another is not supported. Instead, you can implement a
* `private` function doing the actual work, and a `external`
* wrapper marked as `nonReentrant`.
*/
modifier nonReentrant() {
require(!reentrancy_lock);
reentrancy_lock = true;
_;
reentrancy_lock = false;
}
}
/**
* @title Eliptic curve signature operations
*
* @dev Based on https://gist.github.com/axic/5b33912c6f61ae6fd96d6c4a47afde6d
*/
library ECRecovery {
/**
* @dev Recover signer address from a message by using his signature
* @param hash bytes32 message, the hash is the signed message. What is recovered is the signer address.
* @param sig bytes signature, the signature is generated using web3.eth.sign()
*/
function recover(bytes32 hash, bytes sig) public pure returns (address) {
bytes32 r;
bytes32 s;
uint8 v;
//Check the signature length
if (sig.length != 65) {
return (address(0));
}
// Divide the signature in r, s and v variables
assembly {
r := mload(add(sig, 32))
s := mload(add(sig, 64))
v := byte(0, mload(add(sig, 96)))
}
// Version of signature should be 27 or 28, but 0 and 1 are also possible versions
if (v < 27) {
v += 27;
}
// If the version is correct return the signer address
if (v != 27 && v != 28) {
return (address(0));
} else {
return ecrecover(hash, v, r, s);
}
}
}
contract ContractToken {
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);
}
contract StreamityEscrow is Ownable, ReentrancyGuard {
using SafeMath for uint256;
using ECRecovery for bytes32;
uint8 constant public STATUS_NO_DEAL = 0x0;
uint8 constant public STATUS_DEAL_WAIT_CONFIRMATION = 0x01;
uint8 constant public STATUS_DEAL_APPROVE = 0x02;
uint8 constant public STATUS_DEAL_RELEASE = 0x03;
TokenERC20 public streamityContractAddress;
uint256 public availableForWithdrawal;
uint32 public requestCancelationTime;
mapping(bytes32 => Deal) public streamityTransfers;
function StreamityEscrow(address streamityContract) public {
require(streamityContract != 0x0);
requestCancelationTime = 2 hours;
streamityContractAddress = TokenERC20(streamityContract);
}
struct Deal {
uint256 value;
uint256 cancelTime;
address seller;
address buyer;
uint8 status;
uint256 commission;
bool isAltCoin;
}
event StartDealEvent(bytes32 _hashDeal, address _seller, address _buyer);
event ApproveDealEvent(bytes32 _hashDeal, address _seller, address _buyer);
event ReleasedEvent(bytes32 _hashDeal, address _seller, address _buyer);
event SellerCancelEvent(bytes32 _hashDeal, address _seller, address _buyer);
function pay(bytes32 _tradeID, address _seller, address _buyer, uint256 _value, uint256 _commission, bytes _sign)
external
payable
{
require(msg.value > 0);
require(msg.value == _value);
require(msg.value > _commission);
bytes32 _hashDeal = keccak256(_tradeID, _seller, _buyer, msg.value, _commission);
verifyDeal(_hashDeal, _sign);
startDealForUser(_hashDeal, _seller, _buyer, _commission, msg.value, false);
}
function () public payable {
availableForWithdrawal = availableForWithdrawal.add(msg.value);
}
function payAltCoin(bytes32 _tradeID, address _seller, address _buyer, uint256 _value, uint256 _commission, bytes _sign)
external
{
bytes32 _hashDeal = keccak256(_tradeID, _seller, _buyer, _value, _commission);
verifyDeal(_hashDeal, _sign);
bool result = streamityContractAddress.transferFrom(msg.sender, address(this), _value);
require(result == true);
startDealForUser(_hashDeal, _seller, _buyer, _commission, _value, true);
}
function verifyDeal(bytes32 _hashDeal, bytes _sign) private view {
require(_hashDeal.recover(_sign) == owner);
require(streamityTransfers[_hashDeal].status == STATUS_NO_DEAL);
}
function startDealForUser(bytes32 _hashDeal, address _seller, address _buyer, uint256 _commission, uint256 _value, bool isAltCoin)
private returns(bytes32)
{
Deal storage userDeals = streamityTransfers[_hashDeal];
userDeals.seller = _seller;
userDeals.buyer = _buyer;
userDeals.value = _value;
userDeals.commission = _commission;
userDeals.cancelTime = block.timestamp.add(requestCancelationTime);
userDeals.status = STATUS_DEAL_WAIT_CONFIRMATION;
userDeals.isAltCoin = isAltCoin;
emit StartDealEvent(_hashDeal, _seller, _buyer);
return _hashDeal;
}
function withdrawCommisionToAddress(address _to, uint256 _amount) external onlyOwner {
require(_amount <= availableForWithdrawal);
availableForWithdrawal = availableForWithdrawal.sub(_amount);
_to.transfer(_amount);
}
function withdrawCommisionToAddressAltCoin(address _to, uint256 _amount) external onlyOwner {
streamityContractAddress.transfer(_to, _amount);
}
function getStatusDeal(bytes32 _hashDeal) external view returns (uint8) {
return streamityTransfers[_hashDeal].status;
}
// _additionalComission is wei
uint256 constant GAS_releaseTokens = 60000;
function releaseTokens(bytes32 _hashDeal, uint256 _additionalGas)
external
nonReentrant
returns(bool)
{
Deal storage deal = streamityTransfers[_hashDeal];
if (deal.status == STATUS_DEAL_APPROVE) {
deal.status = STATUS_DEAL_RELEASE;
bool result = false;
if (deal.isAltCoin == false)
result = transferMinusComission(deal.buyer, deal.value, deal.commission.add((msg.sender == owner ? (GAS_releaseTokens.add(_additionalGas)).mul(tx.gasprice) : 0)));
else
result = transferMinusComissionAltCoin(streamityContractAddress, deal.buyer, deal.value, deal.commission);
if (result == false) {
deal.status = STATUS_DEAL_APPROVE;
return false;
}
emit ReleasedEvent(_hashDeal, deal.seller, deal.buyer);
delete streamityTransfers[_hashDeal];
return true;
}
return false;
}
function releaseTokensForce(bytes32 _hashDeal)
external onlyOwner
nonReentrant
returns(bool)
{
Deal storage deal = streamityTransfers[_hashDeal];
uint8 prevStatus = deal.status;
if (deal.status != STATUS_NO_DEAL) {
deal.status = STATUS_DEAL_RELEASE;
bool result = false;
if (deal.isAltCoin == false)
result = transferMinusComission(deal.buyer, deal.value, deal.commission);
else
result = transferMinusComissionAltCoin(streamityContractAddress, deal.buyer, deal.value, deal.commission);
if (result == false) {
deal.status = prevStatus;
return false;
}
emit ReleasedEvent(_hashDeal, deal.seller, deal.buyer);
delete streamityTransfers[_hashDeal];
return true;
}
return false;
}
uint256 constant GAS_cancelSeller = 30000;
function cancelSeller(bytes32 _hashDeal, uint256 _additionalGas)
external onlyOwner
nonReentrant
returns(bool)
{
Deal storage deal = streamityTransfers[_hashDeal];
if (deal.cancelTime > block.timestamp)
return false;
if (deal.status == STATUS_DEAL_WAIT_CONFIRMATION) {
deal.status = STATUS_DEAL_RELEASE;
bool result = false;
if (deal.isAltCoin == false)
result = transferMinusComission(deal.seller, deal.value, GAS_cancelSeller.add(_additionalGas).mul(tx.gasprice));
else
result = transferMinusComissionAltCoin(streamityContractAddress, deal.seller, deal.value, _additionalGas);
if (result == false) {
deal.status = STATUS_DEAL_WAIT_CONFIRMATION;
return false;
}
emit SellerCancelEvent(_hashDeal, deal.seller, deal.buyer);
delete streamityTransfers[_hashDeal];
return true;
}
return false;
}
function approveDeal(bytes32 _hashDeal)
external
onlyOwner
nonReentrant
returns(bool)
{
Deal storage deal = streamityTransfers[_hashDeal];
if (deal.status == STATUS_DEAL_WAIT_CONFIRMATION) {
deal.status = STATUS_DEAL_APPROVE;
emit ApproveDealEvent(_hashDeal, deal.seller, deal.buyer);
return true;
}
return false;
}
function transferMinusComission(address _to, uint256 _value, uint256 _commission)
private returns(bool)
{
uint256 _totalComission = _commission;
require(availableForWithdrawal.add(_totalComission) >= availableForWithdrawal); // Check for overflows
availableForWithdrawal = availableForWithdrawal.add(_totalComission);
_to.transfer(_value.sub(_totalComission));
return true;
}
function transferMinusComissionAltCoin(TokenERC20 _contract, address _to, uint256 _value, uint256 _commission)
private returns(bool)
{
uint256 _totalComission = _commission;
_contract.transfer(_to, _value.sub(_totalComission));
return true;
}
function setStreamityContractAddress(address newAddress)
external onlyOwner
{
streamityContractAddress = TokenERC20(newAddress);
}
// For other Tokens
function transferToken(ContractToken _tokenContract, address _transferTo, uint256 _value) onlyOwner external {
_tokenContract.transfer(_transferTo, _value);
}
function transferTokenFrom(ContractToken _tokenContract, address _transferTo, address _transferFrom, uint256 _value) onlyOwner external {
_tokenContract.transferFrom(_transferTo, _transferFrom, _value);
}
function approveToken(ContractToken _tokenContract, address _spender, uint256 _value) onlyOwner external {
_tokenContract.approve(_spender, _value);
}
}
{
"compilationTarget": {
"StreamityEscrow.sol": "StreamityEscrow"
},
"evmVersion": "byzantium",
"libraries": {},
"optimizer": {
"enabled": true,
"runs": 200
},
"remappings": []
}
[{"constant":false,"inputs":[{"name":"_hashDeal","type":"bytes32"},{"name":"_additionalGas","type":"uint256"}],"name":"releaseTokens","outputs":[{"name":"","type":"bool"}],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":true,"inputs":[],"name":"STATUS_NO_DEAL","outputs":[{"name":"","type":"uint8"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[],"name":"availableForWithdrawal","outputs":[{"name":"","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[{"name":"_hashDeal","type":"bytes32"}],"name":"getStatusDeal","outputs":[{"name":"","type":"uint8"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[],"name":"streamityContractAddress","outputs":[{"name":"","type":"address"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[{"name":"","type":"bytes32"}],"name":"streamityTransfers","outputs":[{"name":"value","type":"uint256"},{"name":"cancelTime","type":"uint256"},{"name":"seller","type":"address"},{"name":"buyer","type":"address"},{"name":"status","type":"uint8"},{"name":"commission","type":"uint256"},{"name":"isAltCoin","type":"bool"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[],"name":"STATUS_DEAL_RELEASE","outputs":[{"name":"","type":"uint8"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[],"name":"STATUS_DEAL_APPROVE","outputs":[{"name":"","type":"uint8"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":false,"inputs":[{"name":"_to","type":"address"},{"name":"_amount","type":"uint256"}],"name":"withdrawCommisionToAddressAltCoin","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":true,"inputs":[],"name":"owner","outputs":[{"name":"","type":"address"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":false,"inputs":[{"name":"_tradeID","type":"bytes32"},{"name":"_seller","type":"address"},{"name":"_buyer","type":"address"},{"name":"_value","type":"uint256"},{"name":"_commission","type":"uint256"},{"name":"_sign","type":"bytes"}],"name":"payAltCoin","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":false,"inputs":[{"name":"_hashDeal","type":"bytes32"}],"name":"releaseTokensForce","outputs":[{"name":"","type":"bool"}],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":false,"inputs":[{"name":"newAddress","type":"address"}],"name":"setStreamityContractAddress","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":false,"inputs":[{"name":"_to","type":"address"},{"name":"_amount","type":"uint256"}],"name":"withdrawCommisionToAddress","outputs":[],"payable":false,"stateMutability":"nonpayable","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":"_hashDeal","type":"bytes32"},{"name":"_additionalGas","type":"uint256"}],"name":"cancelSeller","outputs":[{"name":"","type":"bool"}],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":false,"inputs":[{"name":"_hashDeal","type":"bytes32"}],"name":"approveDeal","outputs":[{"name":"","type":"bool"}],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":true,"inputs":[],"name":"STATUS_DEAL_WAIT_CONFIRMATION","outputs":[{"name":"","type":"uint8"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":false,"inputs":[{"name":"newOwner","type":"address"}],"name":"transferOwnership","outputs":[],"payable":false,"stateMutability":"nonpayable","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"},{"constant":true,"inputs":[],"name":"requestCancelationTime","outputs":[{"name":"","type":"uint32"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":false,"inputs":[{"name":"_tradeID","type":"bytes32"},{"name":"_seller","type":"address"},{"name":"_buyer","type":"address"},{"name":"_value","type":"uint256"},{"name":"_commission","type":"uint256"},{"name":"_sign","type":"bytes"}],"name":"pay","outputs":[],"payable":true,"stateMutability":"payable","type":"function"},{"inputs":[{"name":"streamityContract","type":"address"}],"payable":false,"stateMutability":"nonpayable","type":"constructor"},{"payable":true,"stateMutability":"payable","type":"fallback"},{"anonymous":false,"inputs":[{"indexed":false,"name":"_hashDeal","type":"bytes32"},{"indexed":false,"name":"_seller","type":"address"},{"indexed":false,"name":"_buyer","type":"address"}],"name":"StartDealEvent","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"name":"_hashDeal","type":"bytes32"},{"indexed":false,"name":"_seller","type":"address"},{"indexed":false,"name":"_buyer","type":"address"}],"name":"ApproveDealEvent","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"name":"_hashDeal","type":"bytes32"},{"indexed":false,"name":"_seller","type":"address"},{"indexed":false,"name":"_buyer","type":"address"}],"name":"ReleasedEvent","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"name":"_hashDeal","type":"bytes32"},{"indexed":false,"name":"_seller","type":"address"},{"indexed":false,"name":"_buyer","type":"address"}],"name":"SellerCancelEvent","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"name":"previousOwner","type":"address"},{"indexed":true,"name":"newOwner","type":"address"}],"name":"OwnershipTransferred","type":"event"}]