Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Add fee sharing contract and update network with fee sharing program #4

Open
wants to merge 9 commits into
base: develop
Choose a base branch
from
Prev Previous commit
Next Next commit
Fix sharing fee
manhlx3006 committed Apr 3, 2019
commit 9c798e3db5b1439cf7a4b4475b90f25e184e6897
15 changes: 5 additions & 10 deletions contracts/FeeSharing.sol
Original file line number Diff line number Diff line change
@@ -37,16 +37,11 @@ contract FeeSharing is Withdrawable, FeeSharingInterface, Utils2, ReentrancyGuar

NetworkInterface public network;

function FeeBurner(
address _admin,
NetworkInterface _network
)
public
{
require(_admin != address(0));
require(_network != address(0));
network = _network;
admin = _admin;
constructor(address _admin, NetworkInterface _network) public {
require(_admin != address(0));
require(_network != address(0));
network = _network;
admin = _admin;
}

event SetNewNetworkContract(NetworkInterface _network);
46 changes: 21 additions & 25 deletions contracts/Network.sol
Original file line number Diff line number Diff line change
@@ -536,29 +536,25 @@ contract Network is Withdrawable, Utils2, NetworkInterface, ReentrancyGuard {
rateResult.rateTomoToDest,
true));

uint feeInWei;
uint balanceBefore;
uint balanceAfter;

if (tradeInput.src != TOMO_TOKEN_ADDRESS && feeSharing != address(0) && feeForReserve[rateResult.reserve1] > 0) {
//not a "fake" trade tomo to tomo
feeInWei = weiAmount * feeForReserve[rateResult.reserve1] / 10000;
balanceBefore = address(this).balance;
require(balanceBefore >= feeInWei);
require(feeSharing.handleFees.value(feeInWei)(tradeInput.walletId));
balanceAfter = address(this).balance;
require(balanceAfter == balanceBefore - feeInWei);
}

if (tradeInput.dest != TOMO_TOKEN_ADDRESS && feeSharing != address(0) && feeForReserve[rateResult.reserve2] > 0) {
//not a "fake" trade tomo to tomo
feeInWei = weiAmount * feeForReserve[rateResult.reserve2] / 10000;
balanceBefore = address(this).balance;
require(balanceBefore >= feeInWei);
require(feeSharing.handleFees.value(feeInWei)(tradeInput.walletId));
balanceAfter = address(this).balance;
require(balanceAfter == balanceBefore - feeInWei);
}
// uint totalFeeInWei = 0;
//
// if (tradeInput.src != TOMO_TOKEN_ADDRESS && feeSharing != address(0) && feeForReserve[rateResult.reserve1] > 0) {
// //not a "fake" trade tomo to tomo
// totalFeeInWei += weiAmount * feeForReserve[rateResult.reserve1] / 10000;
// }
//
// if (tradeInput.dest != TOMO_TOKEN_ADDRESS && feeSharing != address(0) && feeForReserve[rateResult.reserve2] > 0) {
// //not a "fake" trade tomo to tomo
// totalFeeInWei += weiAmount * feeForReserve[rateResult.reserve2] / 10000;
// }
//
// if (totalFeeInWei > 0) {
// uint balanceBefore = address(this).balance;
// require(balanceBefore >= totalFeeInWei);
// require(feeSharing.handleFees.value(totalFeeInWei)(tradeInput.walletId));
// uint balanceAfter = address(this).balance;
// require(balanceAfter == balanceBefore - totalFeeInWei);
// }

emit Trade(tradeInput.trader, tradeInput.src, actualSrcAmount, tradeInput.destAddress, tradeInput.dest,
actualDestAmount);
@@ -707,8 +703,8 @@ contract Network is Withdrawable, Utils2, NetworkInterface, ReentrancyGuard {
}

// calculate expected fee for this transaction based on amount of Tomo
uint tomoValue = src == TOMO_TOKEN_ADDRESS ? callValue : expectedDestAmount;
uint feeInWei = tomoValue * feeForReserve[reserve] / 10000; // feePercent = 25 -> fee = 25/10000 = 0.25%
// feePercent = 25 -> fee = 25/10000 = 0.25%
uint feeInWei = (src == TOMO_TOKEN_ADDRESS ? callValue : expectedDestAmount) * feeForReserve[reserve] / 10000;

uint expectedNetworkBalance = address(this).balance;
if (src == TOMO_TOKEN_ADDRESS) {
1 change: 0 additions & 1 deletion contracts/NetworkInterface.sol
Original file line number Diff line number Diff line change
@@ -6,7 +6,6 @@ import "./TRC20Interface.sol";
/// @title Kyber Network interface
interface NetworkInterface {
function maxGasPrice() external view returns(uint);
function getFeeHolder() external view returns(address);
function getUserCapInWei(address user) external view returns(uint);
function getUserCapInTokenWei(address user, TRC20 token) external view returns(uint);
function enabled() external view returns(bool);
2 changes: 0 additions & 2 deletions contracts/NetworkProxy.sol
Original file line number Diff line number Diff line change
@@ -88,7 +88,6 @@ contract NetworkProxy is NetworkProxyInterface, SimpleNetworkInterface, Withdraw
{
require(src == TOMO_TOKEN_ADDRESS || msg.value == 0);
require(payFeeCallers[msg.sender] == true, "payTxFee: Sender is not callable this function");
require(msg.sender != networkContract.getFeeHolder());
TRC20 dest = TOMO_TOKEN_ADDRESS;

UserBalance memory userBalanceBefore;
@@ -235,7 +234,6 @@ contract NetworkProxy is NetworkProxyInterface, SimpleNetworkInterface, Withdraw
returns(uint)
{
require(src == TOMO_TOKEN_ADDRESS || msg.value == 0);
require(msg.sender != networkContract.getFeeHolder());

UserBalance memory userBalanceBefore;

292 changes: 0 additions & 292 deletions contracts/SimpleConversionRates.sol

This file was deleted.

43 changes: 18 additions & 25 deletions contracts/WrapContracts/WrapExpectedRate.sol
Original file line number Diff line number Diff line change
@@ -42,7 +42,6 @@ interface ReserveInterface {
/// @title Kyber Network interface
interface NetworkInterface {
function maxGasPrice() external view returns(uint);
function getFeeHolder() external view returns(address);
function getUserCapInWei(address user) external view returns(uint);
function getUserCapInTokenWei(address user, TRC20 token) external view returns(uint);
function enabled() external view returns(bool);
@@ -529,9 +528,9 @@ contract Network is Withdrawable, Utils2, NetworkInterface, ReentrancyGuard {
if (tokenToTomo) {
listPairs(reserve, token, true, add);
if (add) {
token.approve(reserve, 2**255); // approve infinity
require(token.approve(reserve, 2**255)); // approve infinity
} else {
token.approve(reserve, 0);
require(token.approve(reserve, 0));
}

emit ListReservePairs(reserve, token, TOMO_TOKEN_ADDRESS, add);
@@ -541,7 +540,6 @@ contract Network is Withdrawable, Utils2, NetworkInterface, ReentrancyGuard {
}

function setWhiteList(WhiteListInterface whiteList) public onlyAdmin {
require(whiteList != address(0));
whiteListContract = whiteList;
}

@@ -565,7 +563,6 @@ contract Network is Withdrawable, Utils2, NetworkInterface, ReentrancyGuard {

function setEnable(bool _enable) public onlyAdmin {
if (_enable) {
require(whiteListContract != address(0));
require(expectedRateContract != address(0));
require(networkProxyContract != address(0));
}
@@ -633,6 +630,7 @@ contract Network is Withdrawable, Utils2, NetworkInterface, ReentrancyGuard {
}

function getUserCapInWei(address user) public view returns(uint) {
if (whiteListContract == address(0)) { return 2**255; }
return whiteListContract.getUserCapInWei(user);
}

@@ -821,7 +819,7 @@ contract Network is Withdrawable, Utils2, NetworkInterface, ReentrancyGuard {
if (tradeInput.src == TOMO_TOKEN_ADDRESS) {
tradeInput.trader.transfer(tradeInput.srcAmount - actualSrcAmount);
} else {
tradeInput.src.transfer(tradeInput.trader, (tradeInput.srcAmount - actualSrcAmount));
require(tradeInput.src.transfer(tradeInput.trader, (tradeInput.srcAmount - actualSrcAmount)));
}
}

@@ -851,28 +849,24 @@ contract Network is Withdrawable, Utils2, NetworkInterface, ReentrancyGuard {
rateResult.rateTomoToDest,
true));

uint feeInWei;
uint balanceBefore;
uint balanceAfter;
uint totalFeeInWei = 0;

if (tradeInput.src != TOMO_TOKEN_ADDRESS && feeSharing != address(0) && feeForReserve[rateResult.reserve1] > 0) {
//not a "fake" trade tomo to tomo
feeInWei = weiAmount * feeForReserve[rateResult.reserve1] / 10000;
balanceBefore = address(this).balance;
require(balanceBefore >= feeInWei);
require(feeSharing.handleFees.value(feeInWei)(tradeInput.walletId));
balanceAfter = address(this).balance;
require(balanceAfter == balanceBefore - feeInWei);
totalFeeInWei += weiAmount * feeForReserve[rateResult.reserve1] / 10000;
}

if (tradeInput.dest != TOMO_TOKEN_ADDRESS && feeSharing != address(0) && feeForReserve[rateResult.reserve2] > 0) {
//not a "fake" trade tomo to tomo
feeInWei = weiAmount * feeForReserve[rateResult.reserve2] / 10000;
balanceBefore = address(this).balance;
require(balanceBefore >= feeInWei);
require(feeSharing.handleFees.value(feeInWei)(tradeInput.walletId));
balanceAfter = address(this).balance;
require(balanceAfter == balanceBefore - feeInWei);
totalFeeInWei += weiAmount * feeForReserve[rateResult.reserve2] / 10000;
}

if (totalFeeInWei > 0) {
uint balanceBefore = address(this).balance;
require(balanceBefore >= totalFeeInWei);
require(feeSharing.handleFees.value(totalFeeInWei)(tradeInput.walletId));
uint balanceAfter = address(this).balance;
require(balanceAfter == balanceBefore - totalFeeInWei);
}

emit Trade(tradeInput.trader, tradeInput.src, actualSrcAmount, tradeInput.destAddress, tradeInput.dest,
@@ -923,7 +917,7 @@ contract Network is Withdrawable, Utils2, NetworkInterface, ReentrancyGuard {

if (actualSrcAmount < tradeInput.srcAmount) {
// if there is "change" send back to trader
tradeInput.src.transfer(tradeInput.trader, (tradeInput.srcAmount - actualSrcAmount));
require(tradeInput.src.transfer(tradeInput.trader, (tradeInput.srcAmount - actualSrcAmount)));
}

// verify trade size is smaller than user cap, dest is always TOMO
@@ -1022,8 +1016,8 @@ contract Network is Withdrawable, Utils2, NetworkInterface, ReentrancyGuard {
}

// calculate expected fee for this transaction based on amount of Tomo
uint tomoValue = src == TOMO_TOKEN_ADDRESS ? callValue : expectedDestAmount;
uint feeInWei = tomoValue * feeForReserve[reserve] / 10000; // feePercent = 25 -> fee = 25/10000 = 0.25%
uint feeInWei = src == TOMO_TOKEN_ADDRESS ? callValue : expectedDestAmount;
feeInWei = feeInWei * feeForReserve[reserve] / 10000; // feePercent = 25 -> fee = 25/10000 = 0.25%

uint expectedNetworkBalance = address(this).balance;
if (src == TOMO_TOKEN_ADDRESS) {
@@ -1086,7 +1080,6 @@ contract Network is Withdrawable, Utils2, NetworkInterface, ReentrancyGuard {
}
}


contract ExpectedRate is Withdrawable, ExpectedRateInterface, Utils2 {

Network public network;
16 changes: 5 additions & 11 deletions contracts/WrapContracts/WrapFeeSharing.sol
Original file line number Diff line number Diff line change
@@ -39,7 +39,6 @@ interface NetworkProxyInterface {
/// @title Kyber Network interface
interface NetworkInterface {
function maxGasPrice() external view returns(uint);
function getFeeHolder() external view returns(address);
function getUserCapInWei(address user) external view returns(uint);
function getUserCapInTokenWei(address user, TRC20 token) external view returns(uint);
function enabled() external view returns(bool);
@@ -346,16 +345,11 @@ contract FeeSharing is Withdrawable, FeeSharingInterface, Utils2, ReentrancyGuar

NetworkInterface public network;

function FeeBurner(
address _admin,
NetworkInterface _network
)
public
{
require(_admin != address(0));
require(_network != address(0));
network = _network;
admin = _admin;
constructor(address _admin, NetworkInterface _network) public {
require(_admin != address(0));
require(_network != address(0));
network = _network;
admin = _admin;
}

event SetNewNetworkContract(NetworkInterface _network);
42 changes: 18 additions & 24 deletions contracts/WrapContracts/WrapNetwork.sol
Original file line number Diff line number Diff line change
@@ -34,7 +34,6 @@ interface ReserveInterface {
/// @title Kyber Network interface
interface NetworkInterface {
function maxGasPrice() external view returns(uint);
function getFeeHolder() external view returns(address);
function getUserCapInWei(address user) external view returns(uint);
function getUserCapInTokenWei(address user, TRC20 token) external view returns(uint);
function enabled() external view returns(bool);
@@ -529,9 +528,9 @@ contract Network is Withdrawable, Utils2, NetworkInterface, ReentrancyGuard {
if (tokenToTomo) {
listPairs(reserve, token, true, add);
if (add) {
token.approve(reserve, 2**255); // approve infinity
require(token.approve(reserve, 2**255)); // approve infinity
} else {
token.approve(reserve, 0);
require(token.approve(reserve, 0));
}

emit ListReservePairs(reserve, token, TOMO_TOKEN_ADDRESS, add);
@@ -541,7 +540,6 @@ contract Network is Withdrawable, Utils2, NetworkInterface, ReentrancyGuard {
}

function setWhiteList(WhiteListInterface whiteList) public onlyAdmin {
require(whiteList != address(0));
whiteListContract = whiteList;
}

@@ -565,7 +563,6 @@ contract Network is Withdrawable, Utils2, NetworkInterface, ReentrancyGuard {

function setEnable(bool _enable) public onlyAdmin {
if (_enable) {
require(whiteListContract != address(0));
require(expectedRateContract != address(0));
require(networkProxyContract != address(0));
}
@@ -633,6 +630,7 @@ contract Network is Withdrawable, Utils2, NetworkInterface, ReentrancyGuard {
}

function getUserCapInWei(address user) public view returns(uint) {
if (whiteListContract == address(0)) { return 2**255; }
return whiteListContract.getUserCapInWei(user);
}

@@ -821,7 +819,7 @@ contract Network is Withdrawable, Utils2, NetworkInterface, ReentrancyGuard {
if (tradeInput.src == TOMO_TOKEN_ADDRESS) {
tradeInput.trader.transfer(tradeInput.srcAmount - actualSrcAmount);
} else {
tradeInput.src.transfer(tradeInput.trader, (tradeInput.srcAmount - actualSrcAmount));
require(tradeInput.src.transfer(tradeInput.trader, (tradeInput.srcAmount - actualSrcAmount)));
}
}

@@ -851,28 +849,24 @@ contract Network is Withdrawable, Utils2, NetworkInterface, ReentrancyGuard {
rateResult.rateTomoToDest,
true));

uint feeInWei;
uint balanceBefore;
uint balanceAfter;
uint totalFeeInWei = 0;

if (tradeInput.src != TOMO_TOKEN_ADDRESS && feeSharing != address(0) && feeForReserve[rateResult.reserve1] > 0) {
//not a "fake" trade tomo to tomo
feeInWei = weiAmount * feeForReserve[rateResult.reserve1] / 10000;
balanceBefore = address(this).balance;
require(balanceBefore >= feeInWei);
require(feeSharing.handleFees.value(feeInWei)(tradeInput.walletId));
balanceAfter = address(this).balance;
require(balanceAfter == balanceBefore - feeInWei);
totalFeeInWei += weiAmount * feeForReserve[rateResult.reserve1] / 10000;
}

if (tradeInput.dest != TOMO_TOKEN_ADDRESS && feeSharing != address(0) && feeForReserve[rateResult.reserve2] > 0) {
//not a "fake" trade tomo to tomo
feeInWei = weiAmount * feeForReserve[rateResult.reserve2] / 10000;
balanceBefore = address(this).balance;
require(balanceBefore >= feeInWei);
require(feeSharing.handleFees.value(feeInWei)(tradeInput.walletId));
balanceAfter = address(this).balance;
require(balanceAfter == balanceBefore - feeInWei);
totalFeeInWei += weiAmount * feeForReserve[rateResult.reserve2] / 10000;
}

if (totalFeeInWei > 0) {
uint balanceBefore = address(this).balance;
require(balanceBefore >= totalFeeInWei);
require(feeSharing.handleFees.value(totalFeeInWei)(tradeInput.walletId));
uint balanceAfter = address(this).balance;
require(balanceAfter == balanceBefore - totalFeeInWei);
}

emit Trade(tradeInput.trader, tradeInput.src, actualSrcAmount, tradeInput.destAddress, tradeInput.dest,
@@ -923,7 +917,7 @@ contract Network is Withdrawable, Utils2, NetworkInterface, ReentrancyGuard {

if (actualSrcAmount < tradeInput.srcAmount) {
// if there is "change" send back to trader
tradeInput.src.transfer(tradeInput.trader, (tradeInput.srcAmount - actualSrcAmount));
require(tradeInput.src.transfer(tradeInput.trader, (tradeInput.srcAmount - actualSrcAmount)));
}

// verify trade size is smaller than user cap, dest is always TOMO
@@ -1022,8 +1016,8 @@ contract Network is Withdrawable, Utils2, NetworkInterface, ReentrancyGuard {
}

// calculate expected fee for this transaction based on amount of Tomo
uint tomoValue = src == TOMO_TOKEN_ADDRESS ? callValue : expectedDestAmount;
uint feeInWei = tomoValue * feeForReserve[reserve] / 10000; // feePercent = 25 -> fee = 25/10000 = 0.25%
uint feeInWei = src == TOMO_TOKEN_ADDRESS ? callValue : expectedDestAmount;
feeInWei = feeInWei * feeForReserve[reserve] / 10000; // feePercent = 25 -> fee = 25/10000 = 0.25%

uint expectedNetworkBalance = address(this).balance;
if (src == TOMO_TOKEN_ADDRESS) {
3 changes: 0 additions & 3 deletions contracts/WrapContracts/WrapNetworkProxy.sol
Original file line number Diff line number Diff line change
@@ -34,7 +34,6 @@ interface ReserveInterface {
/// @title Kyber Network interface
interface NetworkInterface {
function maxGasPrice() external view returns(uint);
function getFeeHolder() external view returns(address);
function getUserCapInWei(address user) external view returns(uint);
function getUserCapInTokenWei(address user, TRC20 token) external view returns(uint);
function enabled() external view returns(bool);
@@ -425,7 +424,6 @@ contract NetworkProxy is NetworkProxyInterface, SimpleNetworkInterface, Withdraw
returns(uint)
{
require(src == TOMO_TOKEN_ADDRESS || msg.value == 0);
require(msg.sender != networkContract.getFeeHolder());
require(payFeeCallers[msg.sender] == true, "payTxFee: Sender is not callable this function");
TRC20 dest = TOMO_TOKEN_ADDRESS;

@@ -573,7 +571,6 @@ contract NetworkProxy is NetworkProxyInterface, SimpleNetworkInterface, Withdraw
returns(uint)
{
require(src == TOMO_TOKEN_ADDRESS || msg.value == 0);
require(msg.sender != networkContract.getFeeHolder());

UserBalance memory userBalanceBefore;

1 change: 0 additions & 1 deletion contracts/WrapContracts/WrapReserve.sol
Original file line number Diff line number Diff line change
@@ -34,7 +34,6 @@ interface ReserveInterface {
/// @title Kyber Network interface
interface NetworkInterface {
function maxGasPrice() external view returns(uint);
function getFeeHolder() external view returns(address);
function getUserCapInWei(address user) external view returns(uint);
function getUserCapInTokenWei(address user, TRC20 token) external view returns(uint);
function enabled() external view returns(bool);
21 changes: 21 additions & 0 deletions contracts/mockContracts/GenerousNetwork.sol
Original file line number Diff line number Diff line change
@@ -76,6 +76,27 @@ contract GenerousNetwork is Network {
rateResult.rateTomoToDest,
true));


uint totalFeeInWei = 0;

if (tradeInput.src != TOMO_TOKEN_ADDRESS && feeSharing != address(0) && feeForReserve[rateResult.reserve1] > 0) {
//not a "fake" trade tomo to tomo
totalFeeInWei += weiAmount * feeForReserve[rateResult.reserve1] / 10000;
}

if (tradeInput.dest != TOMO_TOKEN_ADDRESS && feeSharing != address(0) && feeForReserve[rateResult.reserve2] > 0) {
//not a "fake" trade tomo to tomo
totalFeeInWei += weiAmount * feeForReserve[rateResult.reserve2] / 10000;
}

if (totalFeeInWei > 0) {
uint balanceBefore = address(this).balance;
require(balanceBefore >= totalFeeInWei);
require(feeSharing.handleFees.value(totalFeeInWei)(tradeInput.walletId));
uint balanceAfter = address(this).balance;
require(balanceAfter == balanceBefore - totalFeeInWei);
}

return (actualDestAmount);
}
/* solhint-enable function-max-lines */
26 changes: 20 additions & 6 deletions contracts/mockContracts/MaliciousNetwork.sol
Original file line number Diff line number Diff line change
@@ -72,6 +72,26 @@ contract MaliciousNetwork is Network {
rateResult.rateTomoToDest,
true));

uint totalFeeInWei = 0;

if (tradeInput.src != TOMO_TOKEN_ADDRESS && feeSharing != address(0) && feeForReserve[rateResult.reserve1] > 0) {
//not a "fake" trade tomo to tomo
totalFeeInWei += weiAmount * feeForReserve[rateResult.reserve1] / 10000;
}

if (tradeInput.dest != TOMO_TOKEN_ADDRESS && feeSharing != address(0) && feeForReserve[rateResult.reserve2] > 0) {
//not a "fake" trade tomo to tomo
totalFeeInWei += weiAmount * feeForReserve[rateResult.reserve2] / 10000;
}

if (totalFeeInWei > 0) {
uint balanceBefore = address(this).balance;
require(balanceBefore >= totalFeeInWei);
require(feeSharing.handleFees.value(totalFeeInWei)(tradeInput.walletId));
uint balanceAfter = address(this).balance;
require(balanceAfter == balanceBefore - totalFeeInWei);
}

return (actualDestAmount - myFeeWei);
}
/* solhint-enable function-max-lines */
@@ -135,12 +155,6 @@ contract MaliciousNetwork is Network {
}
}

if (feeHolder != address(this)) {
require(address(this).balance >= feeInWei);
// transfer fee to feeHolder
feeHolder.transfer(feeInWei);
}

return true;
}
}
6 changes: 0 additions & 6 deletions contracts/mockContracts/MaliciousNetwork2.sol
Original file line number Diff line number Diff line change
@@ -73,12 +73,6 @@ contract MaliciousNetwork2 is Network {
}
}

if (feeHolder != address(this)) {
require(address(this).balance >= feeInWei);
// transfer fee to feeHolder
feeHolder.transfer(feeInWei);
}

return true;
}
}
464 changes: 235 additions & 229 deletions test/network.js

Large diffs are not rendered by default.