Skip to content

Instantly share code, notes, and snippets.

@pipermerriam
Last active April 9, 2016 18:06
Show Gist options
  • Star 0 You must be signed in to star a gist
  • Fork 0 You must be signed in to fork a gist
  • Save pipermerriam/68ab56ad47358193a4d4ecf367f2e683 to your computer and use it in GitHub Desktop.
Save pipermerriam/68ab56ad47358193a4d4ecf367f2e683 to your computer and use it in GitHub Desktop.
[{"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"}]
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