Last active
April 9, 2016 18:06
-
-
Save pipermerriam/68ab56ad47358193a4d4ecf367f2e683 to your computer and use it in GitHub Desktop.
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
[{"constant":false,"inputs":[{"name":"numTokens","type":"uint256"}],"name":"fillOrder","outputs":[{"name":"","type":"bool"}],"type":"function"},{"constant":true,"inputs":[],"name":"owner","outputs":[{"name":"","type":"address"}],"type":"function"},{"constant":false,"inputs":[{"name":"_from","type":"address"},{"name":"numTokens","type":"uint256"}],"name":"fillOrder","outputs":[{"name":"","type":"bool"}],"type":"function"},{"constant":false,"inputs":[],"name":"cancel","outputs":[],"type":"function"},{"constant":false,"inputs":[{"name":"to","type":"address"}],"name":"transferOwnership","outputs":[],"type":"function"},{"inputs":[{"name":"_token","type":"address"},{"name":"_weiPerToken","type":"uint256"}],"type":"constructor"},{"anonymous":false,"inputs":[{"indexed":false,"name":"_from","type":"address"},{"indexed":false,"name":"numTokens","type":"uint256"}],"name":"OrderFilled","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"name":"from","type":"address"},{"indexed":true,"name":"to","type":"address"}],"name":"OwnershipTransfer","type":"event"}] |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
contract owned { | |
function owned() { | |
owner = msg.sender; | |
} | |
address public owner; | |
modifier onlyowner { if (msg.sender != owner) throw; _ } | |
event OwnershipTransfer(address indexed from, address indexed to); | |
function transferOwnership(address to) public onlyowner { | |
owner = to; | |
OwnershipTransfer(msg.sender, to); | |
} | |
} | |
// Token standard API | |
// https://github.com/ethereum/EIPs/issues/20 | |
contract ERC20 { | |
function totalSupply() constant returns (uint supply); | |
function balanceOf(address who) constant returns (uint value); | |
function allowance(address owner, address spender) constant returns (uint _allowance); | |
function transfer(address to, uint value) returns (bool ok); | |
function transferFrom(address from, address to, uint value) returns (bool ok); | |
function approve(address spender, uint value) returns (bool ok); | |
event Transfer(address indexed from, address indexed to, uint value); | |
event Approval(address indexed owner, address indexed spender, uint value); | |
} | |
contract Order is owned { | |
ERC20 token; | |
uint weiPerToken; | |
function Order(address _token, uint _weiPerToken) { | |
token = ERC20(_token); | |
weiPerToken = _weiPerToken; | |
} | |
function fillOrder(uint numTokens) public returns (bool) { | |
return fillOrder(msg.sender, numTokens); | |
} | |
function sendRobust(address to, uint value) internal { | |
if (!to.send(value)) { | |
if (!to.call.value(value)()) throw; | |
} | |
} | |
event OrderFilled(address _from, uint numTokens); | |
function fillOrder(address _from, uint numTokens) public returns (bool) { | |
if (this.balance < numTokens * weiPerToken) throw; | |
if (!token.transferFrom(_from, owner, numTokens)) return false; | |
sendRobust(_from, numTokens * weiPerToken); | |
OrderFilled(_from, numTokens); | |
return true; | |
} | |
function () { | |
// allow receipt of funds | |
if (msg.value > 0) return; | |
uint allowance = token.allowance(msg.sender, address(this)); | |
if (allowance > 0) { | |
if (this.balance < allowance * weiPerToken) { | |
fillOrder(msg.sender, this.balance / weiPerToken); | |
} else { | |
fillOrder(msg.sender, allowance); | |
} | |
} | |
} | |
function cancel() onlyowner { | |
selfdestruct(owner); | |
} | |
} |
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment