diff --git a/contracts/MoatResolver.sol b/contracts/MoatResolver.sol index 6d970d9..23f6fd1 100644 --- a/contracts/MoatResolver.sol +++ b/contracts/MoatResolver.sol @@ -32,18 +32,8 @@ contract Registry { contract FeeDetail is Registry { uint public fees; - bool public feeBool; - - function getFees() public view returns(uint, bool) { - return (fees, feeBool); - } - - function enableFees() public onlyAdmin { - feeBool = true; - } - - function disableFees() public onlyAdmin { - feeBool = false; + function setFees(uint cut) public onlyAdmin { // 200 means 0.5% + fees = cut; } } @@ -55,7 +45,7 @@ contract MoatResolver is FeeDetail { constructor(address rAddr, uint cut) public { // 200 means 0.5% registryAddress = rAddr; - fees = cut; + setFees(cut); } function collectToken(address tokenAddress, uint amount) public onlyAdmin { diff --git a/contracts/protocols/MoatKyber.sol b/contracts/protocols/MoatKyber.sol index 41f52ca..1009af5 100644 --- a/contracts/protocols/MoatKyber.sol +++ b/contracts/protocols/MoatKyber.sol @@ -1,5 +1,4 @@ -// IMPORTANT CHECK - how decimal works on tokens with less than 18 decimals and accordingly store in our MoatAsset DB -// directly use kyber network address instead of getAddress(kyber) +// error with OMG fee collection pragma solidity ^0.4.24; @@ -7,12 +6,17 @@ interface token { function approve(address spender, uint256 value) external returns (bool); function transfer(address receiver, uint amount) external returns (bool); function balanceOf(address who) external returns(uint256); + function transferFrom(address from, address to, uint amount) external returns (bool); } interface AddressRegistry { function getAddr(string name) external returns(address); } +interface Resolver { + function fees() external returns(uint); +} + interface Kyber { function trade( address src, @@ -30,11 +34,13 @@ contract Registry { address public registryAddress; - modifier onlyResolver() { - require( - msg.sender == getAddress("resolver"), - "Permission Denied" - ); + modifier onlyUserOrResolver(address trader) { + if (msg.sender != trader) { + require( + msg.sender == getAddress("resolver"), + "Permission Denied" + ); + } _; } @@ -57,27 +63,70 @@ contract Registry { contract Trade is Registry { + event KyberTrade( + address src, + uint srcAmt, + address dest, + uint destAmt, + address beneficiary, + uint fees, + uint slipRate, + address affiliate + ); + address eth = 0xeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeee; function executeTrade( - uint weiAmt, + address trader, address src, address dest, uint srcAmt, - uint slipRate, - address walletId - ) public onlyResolver returns (uint destAmt) + uint slipRate + ) public payable onlyUserOrResolver(trader) returns (uint destAmt) { + + if (src != eth) { + token tokenFunctions = token(src); + tokenFunctions.transferFrom(msg.sender, address(this), srcAmt); + } + + uint fees = deductFees(src, srcAmt); + Kyber kyberFunctions = Kyber(getAddress("kyber")); - destAmt = kyberFunctions.trade.value(weiAmt)( + destAmt = kyberFunctions.trade.value(msg.value)( + src, + srcAmt - fees, + dest, + msg.sender, + 2**256 - 1, + slipRate, + getAddress("admin") + ); + + emit KyberTrade( src, srcAmt, dest, - getAddress("resolver"), - 2**256 - 1, + destAmt, + msg.sender, + fees, slipRate, - walletId + getAddress("admin") ); + + } + + function deductFees(address src, uint volume) public returns(uint fees) { + Resolver moatRes = Resolver(getAddress("kyber")); + fees = volume/moatRes.fees(); + if (fees > 0) { + if (src == eth) { + getAddress("admin").transfer(fees); + } else { + token tokenFunctions = token(src); + tokenFunctions.transfer(getAddress("admin"), fees); + } + } } function allowKyber(address[] tokenArr) public {