Skip to content
Open
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
26 changes: 26 additions & 0 deletions .github/workflows/nodejs.yml
Original file line number Diff line number Diff line change
@@ -0,0 +1,26 @@
name: Node CI

on: [push]

jobs:
build:

runs-on: ubuntu-latest

strategy:
matrix:
node-version: [8.x, 10.x, 12.x]

steps:
- uses: actions/checkout@v1
- name: Use Node.js ${{ matrix.node-version }}
uses: actions/setup-node@v1
with:
node-version: ${{ matrix.node-version }}
- name: npm install, build, and test
run: |
npm ci
npm run build --if-present
npm test
env:
CI: true
50 changes: 31 additions & 19 deletions contracts/wrappers/SetStepFunctionWrapper.sol
Original file line number Diff line number Diff line change
Expand Up @@ -3,17 +3,18 @@ pragma solidity ^0.4.18;
import "../ERC20Interface.sol";
import "../Withdrawable.sol";


interface SetStepFunctionInterface {
function setImbalanceStepFunction(
ERC20 token,
int[] xBuy,
int[] yBuy,
int[] xSell,
int[] ySell
) public;
function setImbalanceStepFunction(
ERC20 token,
int[] xBuy,
int[] yBuy,
int[] xSell,
int[] ySell
) public;
}

contract SetStepFunctionWrapper is Withdrawable {
contract SetStepFunctionWrapper2 is Withdrawable {
SetStepFunctionInterface public rateContract;
function SetStepFunctionWrapper(address admin, address operator) public {
addOperator(operator);
Expand All @@ -24,23 +25,34 @@ contract SetStepFunctionWrapper is Withdrawable {
rateContract = _contract;
}

function setImbalanceStepFunction(ERC20 token,
int[] xBuy,
int[] yBuy,
int[] xSell,
int[] ySell) public onlyOperator {
function setImbalanceStepFunction(
ERC20 token,
int[] xBuy,
int[] yBuy,
int[] xSell,
int[] ySell)
public onlyOperator
{
uint i;

// check all x for buy are positive and y are negative
// check all x for buy are positive
for( i = 0 ; i < xBuy.length ; i++ ) {
require(xBuy[i] >= 0 );
require(yBuy[i] <= 0 );
require(xBuy[i] >= 0 );
}

// check all y for buy are negative
for( i = 0 ; i < yBuy.length ; i++ ) {
require(yBuy[i] <= 0 );
}

// check all x for sell are negative and y are negative
// check all x for sell are negative
for( i = 0 ; i < xSell.length ; i++ ) {
require(xSell[i] <= 0 );
require(ySell[i] <= 0 );
require(xSell[i] <= 0 );
}

// check all y for sell are negative
for( i = 0 ; i < ySell.length ; i++ ) {
require(ySell[i] <= 0 );
}

rateContract.setImbalanceStepFunction(token,xBuy,yBuy,xSell,ySell);
Expand Down
18 changes: 10 additions & 8 deletions contractsV5/bridges/bancor/KyberBancorReserve.sol
Original file line number Diff line number Diff line change
Expand Up @@ -18,13 +18,15 @@ contract KyberBancorReserve is IKyberReserve, Withdrawable, Utils {
IBancorNetwork public bancorNetwork; // 0x0e936B11c2e7b601055e58c7E32417187aF4de4a

IERC20 public bancorEth; // 0xc0829421C1d260BD3cB3E0F06cfE2D52db2cE315
IERC20 public bancorETHBNT; // 0xb1CD6e4153B2a390Cf00A6556b0fC1458C4A5533
IERC20 public bancorToken; // 0x1F573D6Fb3F13d689FF844B4cE37794d79a7FF1C

constructor(
address _bancorNetwork,
address _kyberNetwork,
uint _feeBps,
address _bancorEth,
address _bancorETHBNT,
address _bancorToken,
address _admin
)
Expand All @@ -33,13 +35,15 @@ contract KyberBancorReserve is IKyberReserve, Withdrawable, Utils {
require(_bancorNetwork != address(0), "constructor: bancorNetwork address is missing");
require(_kyberNetwork != address(0), "constructor: kyberNetwork address is missing");
require(_bancorEth != address(0), "constructor: bancorEth address is missing");
require(_bancorETHBNT != address(0), "constructor: bancorETHBNT address is missing");
require(_bancorToken != address(0), "constructor: bancorToken address is missing");
require(_admin != address(0), "constructor: admin address is missing");
require(_feeBps < BPS, "constructor: fee is too big");

bancorNetwork = IBancorNetwork(_bancorNetwork);
bancorToken = IERC20(_bancorToken);
bancorEth = IERC20(_bancorEth);
bancorETHBNT = IERC20(_bancorETHBNT);

kyberNetwork = _kyberNetwork;
feeBps = _feeBps;
Expand Down Expand Up @@ -208,21 +212,19 @@ contract KyberBancorReserve is IKyberReserve, Withdrawable, Utils {
}

function getConversionPath(IERC20 src, IERC20 dest) public view returns(IERC20[] memory path) {
IERC20 bntToken = bancorToken;

if (src == bntToken) {
if (src == bancorToken) {
// trade from BNT to ETH
path = new IERC20[](3);
path[0] = bntToken;
path[1] = bntToken;
path[0] = bancorToken;
path[1] = bancorETHBNT;
path[2] = bancorEth;
return path;
} else if (dest == bntToken) {
} else if (dest == bancorToken) {
// trade from ETH to BNT
path = new IERC20[](3);
path[0] = bancorEth;
path[1] = bntToken;
path[2] = bntToken;
path[1] = bancorETHBNT;
path[2] = bancorToken;
return path;
}
}
Expand Down
12 changes: 7 additions & 5 deletions contractsV5/bridges/bancor/mock/MockBancorNetwork.sol
Original file line number Diff line number Diff line change
Expand Up @@ -7,14 +7,16 @@ import "../../../UtilsV5.sol";
contract MockBancorNetwork is IBancorNetwork, Utils {

IERC20 public bancorETH;
IERC20 public bancorETHBNT;
IERC20 public bancorBNT;

uint public rateEthToBnt;
uint public rateBntToETh;

constructor(address _bancorETH, address _bancorBNT) public {
constructor(address _bancorETH, address _bancorETHBNT, address _bancorBNT) public {
bancorETH = IERC20(_bancorETH);
bancorBNT = IERC20(_bancorBNT);
bancorETHBNT = IERC20(_bancorETHBNT);
}

function() external payable { }
Expand All @@ -27,15 +29,15 @@ contract MockBancorNetwork is IBancorNetwork, Utils {
function getReturnByPath(IERC20[] calldata _path, uint256 _amount) external view returns (uint256, uint256) {
require(_amount > 0);
if (_path.length != 3) { return (0, 0); }
if (_path[0] == bancorBNT && _path[1] == bancorBNT && _path[2] == bancorETH) {
if (_path[0] == bancorBNT && _path[1] == bancorETHBNT && _path[2] == bancorETH) {
// rate btn to eth
uint destAmount = calcDstQty(_amount, getDecimals(bancorBNT), ETH_DECIMALS, rateBntToETh);
if (destAmount > address(this).balance) {
return (0, 0);
}
return (destAmount, 0);
}
if (_path[0] == bancorETH && _path[1] == bancorBNT && _path[2] == bancorBNT) {
if (_path[0] == bancorETH && _path[1] == bancorETHBNT && _path[2] == bancorBNT) {
// rate eth to bnt
uint destAmount = calcDstQty(_amount, ETH_DECIMALS, getDecimals(bancorBNT), rateEthToBnt);
if (destAmount > bancorBNT.balanceOf(address(this))) {
Expand All @@ -55,7 +57,7 @@ contract MockBancorNetwork is IBancorNetwork, Utils {
) external payable returns (uint256) {
require(_path.length == 3);
// trade eth to bnt
require(_path[0] == bancorETH && _path[1] == bancorBNT && _path[2] == bancorBNT);
require(_path[0] == bancorETH && _path[1] == bancorETHBNT && _path[2] == bancorBNT);
require(msg.value == _amount && _amount > 0);
require(rateEthToBnt > 0);
uint destAmount = calcDstQty(_amount, ETH_DECIMALS, getDecimals(bancorBNT), rateEthToBnt);
Expand All @@ -74,7 +76,7 @@ contract MockBancorNetwork is IBancorNetwork, Utils {
) external returns (uint256) {
require(_path.length == 3);
// trade eth to bnt
require(_path[0] == bancorBNT && _path[1] == bancorBNT && _path[2] == bancorETH);
require(_path[0] == bancorBNT && _path[1] == bancorETHBNT && _path[2] == bancorETH);
// collect bnt
require(_amount > 0);
require(bancorBNT.transferFrom(msg.sender, address(this), _amount));
Expand Down
30 changes: 27 additions & 3 deletions test/v5/kyberBancorReserve.js
Original file line number Diff line number Diff line change
Expand Up @@ -42,13 +42,15 @@ contract('KyberBancorNetwork', function(accounts) {
user = accounts[4];

bancorEthToken = await TestToken.new("BancorETH", "BETH", tokenDecimal);
bancorETHBNTToken = await TestToken.new("BancorETHBNT", "BETHBNT", tokenDecimal);
bancorBntToken = await TestToken.new("BancorBNT", "BBNT", tokenDecimal);
bancorNetwork = await MockBancorNetwork.new(bancorEthToken.address, bancorBntToken.address);
bancorNetwork = await MockBancorNetwork.new(bancorEthToken.address, bancorETHBNTToken.address, bancorBntToken.address);
reserve = await KyberBancorReserve.new(
bancorNetwork.address,
network,
feeBps,
bancorEthToken.address,
bancorETHBNTToken.address,
bancorBntToken.address,
admin
);
Expand Down Expand Up @@ -142,13 +144,14 @@ contract('KyberBancorNetwork', function(accounts) {

it("Should test getConversionRate returns 0 when path is not correct", async function() {
let testNewToken = await TestToken.new("Test token", "TST", tokenDecimal);
let testBancorNetwork = await MockBancorNetwork.new(testNewToken.address, bancorBntToken.address);
let testBancorNetwork = await MockBancorNetwork.new(testNewToken.address, bancorBntToken.address, bancorBntToken.address);
let testReserve = await KyberBancorReserve.new(
testBancorNetwork.address,
network,
feeBps,
bancorEthToken.address,
bancorBntToken.address,
bancorBntToken.address,
admin
);
await testBancorNetwork.setExchangeRate(ethToBntRate, bntToEthRate);
Expand All @@ -160,12 +163,13 @@ contract('KyberBancorNetwork', function(accounts) {
rate = await testReserve.getConversionRate(bancorBntToken.address, ethAddress, amount, 0);
assert.equal(rate.valueOf(), 0, "rate should be 0 as path is incorrect");

testBancorNetwork = await MockBancorNetwork.new(bancorEthToken.address, testNewToken.address);
testBancorNetwork = await MockBancorNetwork.new(bancorEthToken.address, testNewToken.address, testNewToken.address);
testReserve = await KyberBancorReserve.new(
testBancorNetwork.address,
network,
feeBps,
bancorEthToken.address,
testNewToken.address,
bancorBntToken.address,
admin
);
Expand All @@ -187,6 +191,7 @@ contract('KyberBancorNetwork', function(accounts) {
network,
feeBps.valueOf(),
bancorEthToken.address,
bancorETHBNTToken.address,
bancorBntToken.address,
admin
);
Expand All @@ -200,6 +205,7 @@ contract('KyberBancorNetwork', function(accounts) {
zeroAddress,
feeBps.valueOf(),
bancorEthToken.address,
bancorETHBNTToken.address,
bancorBntToken.address,
admin
);
Expand All @@ -213,6 +219,7 @@ contract('KyberBancorNetwork', function(accounts) {
network,
feeBps.valueOf(),
zeroAddress,
bancorETHBNTToken.address,
bancorBntToken.address,
admin
);
Expand All @@ -226,6 +233,7 @@ contract('KyberBancorNetwork', function(accounts) {
network,
feeBps.valueOf(),
bancorEthToken.address,
bancorETHBNTToken.address,
zeroAddress,
admin
);
Expand All @@ -239,6 +247,21 @@ contract('KyberBancorNetwork', function(accounts) {
network,
feeBps.valueOf(),
bancorEthToken.address,
bancorETHBNTToken.address,
bancorBntToken.address,
zeroAddress
);
assert(false, "throw was expected in line above.")
} catch (e) {
assert(Helper.isRevertErrorMessage(e), "expected throw but got: " + e);
}
try {
_ = await KyberBancorReserve.new(
bancorNetwork.address,
network,
feeBps.valueOf(),
bancorEthToken.address,
zeroAddress.address,
bancorBntToken.address,
zeroAddress
);
Expand All @@ -251,6 +274,7 @@ contract('KyberBancorNetwork', function(accounts) {
network,
feeBps.valueOf(),
bancorEthToken.address,
bancorETHBNTToken.address,
bancorBntToken.address,
admin
);
Expand Down
10 changes: 8 additions & 2 deletions web3deployment/compileContracts.js
Original file line number Diff line number Diff line change
Expand Up @@ -4,7 +4,11 @@ const solc = require('solc');
const contractPath = path.join(__dirname, "../contracts/");
const input = {
"ConversionRates.sol" : fs.readFileSync(contractPath + 'reserves/fprConversionRate/ConversionRates.sol','utf8'),
"EnhancedStepFunctions.sol" : fs.readFileSync(contractPath + 'reserves/fprConversionRate/EnhancedStepFunctions.sol', 'utf8'),
"ConversionRatesInterface.sol" : fs.readFileSync(contractPath + 'ConversionRatesInterface.sol', 'utf8'),
"reserves/fprConversionRate/ConversionRates.sol" : fs.readFileSync(contractPath + 'reserves/fprConversionRate/ConversionRates.sol','utf8'),
"reserves/VolumeImbalanceRecorder.sol" : fs.readFileSync(contractPath + 'reserves/VolumeImbalanceRecorder.sol', 'utf8'),
"VolumeImbalanceRecorder.sol" : fs.readFileSync(contractPath + 'reserves/VolumeImbalanceRecorder.sol', 'utf8'),
"PermissionGroups.sol" : fs.readFileSync(contractPath + 'PermissionGroups.sol', 'utf8'),
"ERC20Interface.sol" : fs.readFileSync(contractPath + 'ERC20Interface.sol', 'utf8'),
"ExpectedRate.sol" : fs.readFileSync(contractPath + 'ExpectedRate.sol', 'utf8'),
Expand Down Expand Up @@ -35,13 +39,15 @@ const input = {
"Utils.sol" : fs.readFileSync(contractPath + 'Utils.sol', 'utf8'),
"Utils2.sol" : fs.readFileSync(contractPath + 'Utils2.sol', 'utf8'),
"Utils3.sol" : fs.readFileSync(contractPath + 'Utils3.sol', 'utf8'),
"VolumeImbalanceRecorder.sol" : fs.readFileSync(contractPath + 'reserves/VolumeImbalanceRecorder.sol', 'utf8'),
"Withdrawable.sol" : fs.readFileSync(contractPath + 'Withdrawable.sol', 'utf8'),
"WhiteList.sol" : fs.readFileSync(contractPath + 'WhiteList.sol', 'utf8'),
"WhiteListInterface.sol" : fs.readFileSync(contractPath + 'WhiteListInterface.sol', 'utf8'),
"WrapFeeBurner.sol" : fs.readFileSync(contractPath + 'wrappers/WrapFeeBurner.sol', 'utf8'),
"KyberUniswapReserve.sol" : fs.readFileSync(contractPath + 'reserves/bridgeReserves/uniswap/KyberUniswapReserve.sol', 'utf8'),
"WrapperBase.sol" : fs.readFileSync(contractPath + 'wrappers/WrapperBase.sol', 'utf8')
"WrapperBase.sol" : fs.readFileSync(contractPath + 'wrappers/WrapperBase.sol', 'utf8'),
"SetStepFunctionWrapper.sol" : fs.readFileSync(contractPath + 'wrappers/SetStepFunctionWrapper.sol', 'utf8'),
"WrapConversionRate.sol" : fs.readFileSync(contractPath + 'wrappers/WrapConversionRate.sol', 'utf8'),
"WrapReadTokenData.sol" : fs.readFileSync(contractPath + 'wrappers/WrapReadTokenData.sol', 'utf8')
};

module.exports.compileContracts = async function() {
Expand Down
12 changes: 8 additions & 4 deletions web3deployment/liquidityReserveDeployer.js
Original file line number Diff line number Diff line change
Expand Up @@ -72,7 +72,11 @@ async function sendTx(txObject) {
// don't wait for confirmation
signedTxs.push(signedTx.rawTransaction)
if (!dontSendTx) {
web3.eth.sendSignedTransaction(signedTx.rawTransaction, {from:sender});
try {
web3.eth.sendSignedTransaction(signedTx.rawTransaction, {from:sender});
} catch (e) {
console.error(e);
}
}
}

Expand Down Expand Up @@ -105,9 +109,9 @@ const input = {
"Utils.sol" : fs.readFileSync(contractPath + 'Utils.sol', 'utf8'),
"KyberReserveInterface.sol" : fs.readFileSync(contractPath + 'KyberReserveInterface.sol', 'utf8'),
"Withdrawable.sol" : fs.readFileSync(contractPath + 'Withdrawable.sol', 'utf8'),
"KyberReserve.sol" : fs.readFileSync(contractPath + 'KyberReserve.sol', 'utf8'),
"LiquidityConversionRates.sol" : fs.readFileSync(contractPath + 'LiquidityConversionRates.sol', 'utf8'),
"LiquidityFormula.sol" : fs.readFileSync(contractPath + 'LiquidityFormula.sol', 'utf8'),
"KyberReserve.sol" : fs.readFileSync(contractPath + 'reserves/KyberReserve.sol', 'utf8'),
"LiquidityConversionRates.sol" : fs.readFileSync(contractPath + '/reserves/aprConversionRate/LiquidityConversionRates.sol', 'utf8'),
"LiquidityFormula.sol" : fs.readFileSync(contractPath + '/reserves/aprConversionRate/LiquidityFormula.sol', 'utf8'),
};

let reserveAddress;
Expand Down
Loading