From 76d1890ea5294b80418260662ae8747792babe7f Mon Sep 17 00:00:00 2001 From: Fabiano Nascimento Date: Thu, 19 Nov 2020 10:33:20 -0300 Subject: [PATCH] Adding tests powered by solidity-test --- contracts/proxy4tests/DoubleCurveToken.sol | 14 ++ package-lock.json | 52 ++++---- test/ConvergentBetaTest.js | 72 +++++++++++ test/DoubleCurveTokenProxyTest.js | 88 +++++++++++++ test/DoubleCurveTokenTest.js | 144 +++++++++++++++++++++ 5 files changed, 340 insertions(+), 30 deletions(-) create mode 100644 contracts/proxy4tests/DoubleCurveToken.sol create mode 100644 test/ConvergentBetaTest.js create mode 100644 test/DoubleCurveTokenProxyTest.js create mode 100644 test/DoubleCurveTokenTest.js diff --git a/contracts/proxy4tests/DoubleCurveToken.sol b/contracts/proxy4tests/DoubleCurveToken.sol new file mode 100644 index 0000000..f22936d --- /dev/null +++ b/contracts/proxy4tests/DoubleCurveToken.sol @@ -0,0 +1,14 @@ +import "../DoubleCurveToken.sol"; + +contract ProxyDoubleCurveToken is DoubleCurveToken { + + function testsolveForY(uint256 _x) public view returns (uint256 ){ + return solveForY(_x); + } + + function testcurveIntegral(uint256 _toX) public view returns (uint256 ){ + return curveIntegral(_toX); + } + + +} \ No newline at end of file diff --git a/package-lock.json b/package-lock.json index 4faccf3..7279dc0 100644 --- a/package-lock.json +++ b/package-lock.json @@ -1854,14 +1854,12 @@ "integrity": "sha1-jZWCAsftuq6Dlwf7pvCf8ydgYhA=", "dev": true, "requires": { - "ethereumjs-abi": "git+https://github.com/ethereumjs/ethereumjs-abi.git#d84a96796079c8595a0c78accd1e7709f2277215", "ethereumjs-util": "^5.1.1" }, "dependencies": { "ethereumjs-abi": { "version": "git+https://github.com/ethereumjs/ethereumjs-abi.git#d84a96796079c8595a0c78accd1e7709f2277215", - "from": "git+https://github.com/ethereumjs/ethereumjs-abi.git", - "dev": true, + "from": "git+https://github.com/ethereumjs/ethereumjs-abi.git#d84a96796079c8595a0c78accd1e7709f2277215", "requires": { "bn.js": "^4.10.0", "ethereumjs-util": "^5.0.0" @@ -5447,7 +5445,6 @@ "resolved": "https://registry.npmjs.org/web3/-/web3-0.20.6.tgz", "integrity": "sha1-PpcwauAk+yThCj11yIQwJWIhUSA=", "requires": { - "bignumber.js": "git+https://github.com/frozeman/bignumber.js-nolookahead.git#57692b3ecfc98bbdd6b3a516cb2353652ea49934", "crypto-js": "^3.1.4", "utf8": "^2.1.1", "xhr2": "*", @@ -5456,7 +5453,7 @@ "dependencies": { "bignumber.js": { "version": "git+https://github.com/frozeman/bignumber.js-nolookahead.git#57692b3ecfc98bbdd6b3a516cb2353652ea49934", - "from": "git+https://github.com/frozeman/bignumber.js-nolookahead.git" + "from": "git+https://github.com/frozeman/bignumber.js-nolookahead.git#57692b3ecfc98bbdd6b3a516cb2353652ea49934" } } } @@ -5556,7 +5553,6 @@ "resolved": "https://registry.npmjs.org/web3/-/web3-0.20.6.tgz", "integrity": "sha1-PpcwauAk+yThCj11yIQwJWIhUSA=", "requires": { - "bignumber.js": "git+https://github.com/frozeman/bignumber.js-nolookahead.git#57692b3ecfc98bbdd6b3a516cb2353652ea49934", "crypto-js": "^3.1.4", "utf8": "^2.1.1", "xhr2": "*", @@ -5565,7 +5561,7 @@ "dependencies": { "bignumber.js": { "version": "git+https://github.com/frozeman/bignumber.js-nolookahead.git#57692b3ecfc98bbdd6b3a516cb2353652ea49934", - "from": "git+https://github.com/frozeman/bignumber.js-nolookahead.git" + "from": "git+https://github.com/frozeman/bignumber.js-nolookahead.git#57692b3ecfc98bbdd6b3a516cb2353652ea49934" } } } @@ -5608,7 +5604,6 @@ "resolved": "https://registry.npmjs.org/web3/-/web3-0.20.6.tgz", "integrity": "sha1-PpcwauAk+yThCj11yIQwJWIhUSA=", "requires": { - "bignumber.js": "git+https://github.com/frozeman/bignumber.js-nolookahead.git#57692b3ecfc98bbdd6b3a516cb2353652ea49934", "crypto-js": "^3.1.4", "utf8": "^2.1.1", "xhr2": "*", @@ -5617,7 +5612,7 @@ "dependencies": { "bignumber.js": { "version": "git+https://github.com/frozeman/bignumber.js-nolookahead.git#57692b3ecfc98bbdd6b3a516cb2353652ea49934", - "from": "git+https://github.com/frozeman/bignumber.js-nolookahead.git" + "from": "git+https://github.com/frozeman/bignumber.js-nolookahead.git#57692b3ecfc98bbdd6b3a516cb2353652ea49934" } } } @@ -6130,7 +6125,6 @@ "lodash": "^4.17.11", "oboe": "2.1.4", "url-parse": "1.4.4", - "websocket": "git://github.com/frozeman/WebSocket-Node.git#6c72925e3f8aaaea8dc8450f97627e85263999f2", "xhr2-cookies": "1.1.0" }, "dependencies": { @@ -6139,10 +6133,28 @@ "resolved": "https://registry.npmjs.org/@types/node/-/node-10.12.26.tgz", "integrity": "sha512-nMRqS+mL1TOnIJrL6LKJcNZPB8V3eTfRo9FQA2b5gDvrHurC8XbSA86KNe0dShlEL7ReWJv/OU9NL7Z0dnqWTg==" }, + "debug": { + "version": "2.6.9", + "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz", + "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==", + "requires": { + "ms": "2.0.0" + } + }, "lodash": { "version": "4.17.11", "resolved": "https://registry.npmjs.org/lodash/-/lodash-4.17.11.tgz", "integrity": "sha512-cQKh8igo5QUhZ7lg38DYWAxMvjSAKG0A8wGSVimP07SIUEK2UO+arSRKbRZWtelMtN5V0Hkwh5ryOto/SshYIg==" + }, + "websocket": { + "version": "git://github.com/frozeman/WebSocket-Node.git#6c72925e3f8aaaea8dc8450f97627e85263999f2", + "from": "git://github.com/frozeman/WebSocket-Node.git#6c72925e3f8aaaea8dc8450f97627e85263999f2", + "requires": { + "debug": "^2.2.0", + "nan": "^2.3.3", + "typedarray-to-buffer": "^3.1.2", + "yaeti": "^0.0.6" + } } } }, @@ -6195,26 +6207,6 @@ } } }, - "websocket": { - "version": "git://github.com/frozeman/WebSocket-Node.git#6c72925e3f8aaaea8dc8450f97627e85263999f2", - "from": "git://github.com/frozeman/WebSocket-Node.git#browserifyCompatible", - "requires": { - "debug": "^2.2.0", - "nan": "^2.3.3", - "typedarray-to-buffer": "^3.1.2", - "yaeti": "^0.0.6" - }, - "dependencies": { - "debug": { - "version": "2.6.9", - "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz", - "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==", - "requires": { - "ms": "2.0.0" - } - } - } - }, "whatwg-fetch": { "version": "2.0.4", "resolved": "https://registry.npmjs.org/whatwg-fetch/-/whatwg-fetch-2.0.4.tgz", diff --git a/test/ConvergentBetaTest.js b/test/ConvergentBetaTest.js new file mode 100644 index 0000000..c05c2fb --- /dev/null +++ b/test/ConvergentBetaTest.js @@ -0,0 +1,72 @@ +const truffleAssert = require('truffle-assertions'); +const Account = artifacts.require('Account'); +const ConvergentBeta = artifacts.require('ConvergentBeta'); +const DoubleCurveToken = artifacts.require('DoubleCurveToken'); +const GasPriceOracle = artifacts.require('GasPriceOracle'); +const MockERC20 = artifacts.require('MockERC20'); +const SafeMath = artifacts.require( + 'openzeppelin-eth/contracts/math/SafeMath.sol', +); +const Ownable = artifacts.require( + 'openzeppelin-eth/contracts/ownership/Ownable.sol', +); +const ERC20 = artifacts.require( + 'openzeppelin-eth/contracts/token/ERC20/ERC20.sol', +); +const ERC20Detailed = artifacts.require( + 'openzeppelin-eth/contracts/token/ERC20/ERC20Detailed.sol', +); +const AddressUtils = artifacts.require( + 'openzeppelin-solidity/contracts/AddressUtils.sol', +); +const Initializable = artifacts.require('zos-lib/contracts/Initializable.sol'); +const AdminUpgradeabilityProxy = artifacts.require( + 'zos-lib/contracts/upgradeability/AdminUpgradeabilityProxy.sol', +); +const UpgradeabilityProxy = artifacts.require( + 'zos-lib/contracts/upgradeability/UpgradeabilityProxy.sol', +); + +contract('ConvergentBeta', (accounts) => { + let trace = false; + let contractAddressUtils = null; + let contractSafeMath = null; + let contractOwnable = null; + let contractInitializable = null; + let contractERC20Detailed = null; + let contractERC20 = null; + let contractAdminUpgradeabilityProxy = null; + let contractUpgradeabilityProxy = null; + let contractConvergentBeta = null; + let contractGasPriceOracle = null; + let contractDoubleCurveToken = null; + let contractAccount = null; + let contractMockERC20 = null; + beforeEach(async () => { + contractAddressUtils = await AddressUtils.new({from: accounts[0]}); + contractSafeMath = await SafeMath.new({from: accounts[0]}); + contractOwnable = await Ownable.new({from: accounts[0]}); + contractInitializable = await Initializable.new({from: accounts[0]}); + ERC20.link('SafeMath', contractSafeMath.address); + contractERC20 = await ERC20.new({from: accounts[0]}); + contractConvergentBeta = await ConvergentBeta.new({from: accounts[0]}); + contractGasPriceOracle = await GasPriceOracle.new({from: accounts[0]}); + DoubleCurveToken.link('SafeMath', contractSafeMath.address); + contractDoubleCurveToken = await DoubleCurveToken.new({from: accounts[0]}); + contractAccount = await Account.new({from: accounts[0]}); + contractMockERC20 = await MockERC20.new(96, {from: accounts[7]}); + }); + + it('Should fail setBaseAccount(address) when NOT comply with: _newBaseAccount != 0x0000000000000000000000000000000000000000', async () => { + await contractConvergentBeta.methods[ + 'initialize(address,address)' + ](accounts[8], accounts[0], {from: accounts[0]}); + let result = await truffleAssert.fails( + contractConvergentBeta.setBaseAccount( + '0x0000000000000000000000000000000000000000', + {from: accounts[0]}, + ), + 'revert', + ); + }); +}); diff --git a/test/DoubleCurveTokenProxyTest.js b/test/DoubleCurveTokenProxyTest.js new file mode 100644 index 0000000..e728e53 --- /dev/null +++ b/test/DoubleCurveTokenProxyTest.js @@ -0,0 +1,88 @@ +const truffleAssert = require('truffle-assertions'); +const Account = artifacts.require('Account'); +const ConvergentBeta = artifacts.require('ConvergentBeta'); +const DoubleCurveToken = artifacts.require('DoubleCurveToken'); +const GasPriceOracle = artifacts.require('GasPriceOracle'); +const MockERC20 = artifacts.require('MockERC20'); +const SafeMath = artifacts.require( + 'openzeppelin-eth/contracts/math/SafeMath.sol', +); +const Ownable = artifacts.require( + 'openzeppelin-eth/contracts/ownership/Ownable.sol', +); +const ERC20 = artifacts.require( + 'openzeppelin-eth/contracts/token/ERC20/ERC20.sol', +); +const ERC20Detailed = artifacts.require( + 'openzeppelin-eth/contracts/token/ERC20/ERC20Detailed.sol', +); +const AddressUtils = artifacts.require( + 'openzeppelin-solidity/contracts/AddressUtils.sol', +); +const Initializable = artifacts.require('zos-lib/contracts/Initializable.sol'); +const AdminUpgradeabilityProxy = artifacts.require( + 'zos-lib/contracts/upgradeability/AdminUpgradeabilityProxy.sol', +); +const UpgradeabilityProxy = artifacts.require( + 'zos-lib/contracts/upgradeability/UpgradeabilityProxy.sol', +); +const ProxyDoubleCurveToken = artifacts.require('ProxyDoubleCurveToken'); + +contract('contractProxyDoubleCurveToken', (accounts) => { + let contractProxyDoubleCurveToken = null; + let trace = false; + let contractAddressUtils = null; + let contractSafeMath = null; + let contractOwnable = null; + let contractInitializable = null; + let contractERC20Detailed = null; + let contractERC20 = null; + let contractAdminUpgradeabilityProxy = null; + let contractUpgradeabilityProxy = null; + let contractConvergentBeta = null; + let contractGasPriceOracle = null; + let contractDoubleCurveToken = null; + let contractAccount = null; + let contractMockERC20 = null; + beforeEach(async () => { + contractAddressUtils = await AddressUtils.new({from: accounts[0]}); + contractSafeMath = await SafeMath.new({from: accounts[0]}); + contractOwnable = await Ownable.new({from: accounts[0]}); + contractInitializable = await Initializable.new({from: accounts[0]}); + ERC20.link('SafeMath', contractSafeMath.address); + contractERC20 = await ERC20.new({from: accounts[0]}); + contractConvergentBeta = await ConvergentBeta.new({from: accounts[0]}); + contractGasPriceOracle = await GasPriceOracle.new({from: accounts[0]}); + DoubleCurveToken.link('SafeMath', contractSafeMath.address); + contractDoubleCurveToken = await DoubleCurveToken.new({from: accounts[0]}); + contractAccount = await Account.new({from: accounts[0]}); + contractMockERC20 = await MockERC20.new(96, {from: accounts[7]}); + ProxyDoubleCurveToken.link('SafeMath', contractSafeMath.address); + contractProxyDoubleCurveToken = await ProxyDoubleCurveToken.new({ + from: accounts[0], + }); + }); + + it('Should fail testsolveForY(uint256) when NOT comply with: slopeD > 0', async () => { + await contractProxyDoubleCurveToken.methods[ + 'initialize(address,address,uint256,uint256,uint256,uint256,uint256,uint256,string,string,address)' + ]( + contractDoubleCurveToken.address, + accounts[0], + 18, + 0, + 11, + 3, + 10001, + 17, + 'RevertWithReason', + 'bouncer', + contractGasPriceOracle.address, + {from: accounts[0]}, + ); + let result = await truffleAssert.fails( + contractProxyDoubleCurveToken.testsolveForY(1337, {from: accounts[0]}), + 'revert', + ); + }); +}); diff --git a/test/DoubleCurveTokenTest.js b/test/DoubleCurveTokenTest.js new file mode 100644 index 0000000..3993614 --- /dev/null +++ b/test/DoubleCurveTokenTest.js @@ -0,0 +1,144 @@ +const truffleAssert = require('truffle-assertions'); +const Account = artifacts.require('Account'); +const ConvergentBeta = artifacts.require('ConvergentBeta'); +const DoubleCurveToken = artifacts.require('DoubleCurveToken'); +const GasPriceOracle = artifacts.require('GasPriceOracle'); +const MockERC20 = artifacts.require('MockERC20'); +const SafeMath = artifacts.require( + 'openzeppelin-eth/contracts/math/SafeMath.sol', +); +const Ownable = artifacts.require( + 'openzeppelin-eth/contracts/ownership/Ownable.sol', +); +const ERC20 = artifacts.require( + 'openzeppelin-eth/contracts/token/ERC20/ERC20.sol', +); +const ERC20Detailed = artifacts.require( + 'openzeppelin-eth/contracts/token/ERC20/ERC20Detailed.sol', +); +const AddressUtils = artifacts.require( + 'openzeppelin-solidity/contracts/AddressUtils.sol', +); +const Initializable = artifacts.require('zos-lib/contracts/Initializable.sol'); +const AdminUpgradeabilityProxy = artifacts.require( + 'zos-lib/contracts/upgradeability/AdminUpgradeabilityProxy.sol', +); +const UpgradeabilityProxy = artifacts.require( + 'zos-lib/contracts/upgradeability/UpgradeabilityProxy.sol', +); + +contract('DoubleCurveToken', (accounts) => { + let trace = false; + let contractAddressUtils = null; + let contractSafeMath = null; + let contractOwnable = null; + let contractInitializable = null; + let contractERC20Detailed = null; + let contractERC20 = null; + let contractAdminUpgradeabilityProxy = null; + let contractUpgradeabilityProxy = null; + let contractConvergentBeta = null; + let contractGasPriceOracle = null; + let contractDoubleCurveToken = null; + let contractAccount = null; + let contractMockERC20 = null; + beforeEach(async () => { + contractAddressUtils = await AddressUtils.new({from: accounts[0]}); + if (trace) console.log('SUCESSO: AddressUtils.new({from: accounts[0]}'); + contractSafeMath = await SafeMath.new({from: accounts[0]}); + if (trace) console.log('SUCESSO: SafeMath.new({from: accounts[0]}'); + contractOwnable = await Ownable.new({from: accounts[0]}); + if (trace) console.log('SUCESSO: Ownable.new({from: accounts[0]}'); + contractInitializable = await Initializable.new({from: accounts[0]}); + if (trace) console.log('SUCESSO: Initializable.new({from: accounts[0]}'); + ERC20.link('SafeMath', contractSafeMath.address); + contractERC20 = await ERC20.new({from: accounts[0]}); + if (trace) console.log('SUCESSO: ERC20.new({from: accounts[0]}'); + contractConvergentBeta = await ConvergentBeta.new({from: accounts[0]}); + if (trace) console.log('SUCESSO: ConvergentBeta.new({from: accounts[0]}'); + contractGasPriceOracle = await GasPriceOracle.new({from: accounts[0]}); + if (trace) console.log('SUCESSO: GasPriceOracle.new({from: accounts[0]}'); + DoubleCurveToken.link('SafeMath', contractSafeMath.address); + contractDoubleCurveToken = await DoubleCurveToken.new({from: accounts[0]}); + if (trace) console.log('SUCESSO: DoubleCurveToken.new({from: accounts[0]}'); + contractAccount = await Account.new({from: accounts[0]}); + if (trace) console.log('SUCESSO: Account.new({from: accounts[0]}'); + contractMockERC20 = await MockERC20.new(96, {from: accounts[7]}); + if (trace) console.log('SUCESSO: MockERC20.new(96,{from:accounts[7]}'); + }); + + it('Should fail withdraw() when NOT comply with: contributions > 0', async () => { + await contractDoubleCurveToken.methods[ + 'initialize(address,address,uint256,uint256,uint256,uint256,uint256,uint256,string,string,address)' + ]( + '0x0000000000000000000000000000000000000000', + accounts[8], + 1337, + 2014223715, + 1, + 256, + 66, + 2014223715, + 'bouncer', + 'IsLibrary', + contractGasPriceOracle.address, + {from: accounts[0]}, + ); + await contractGasPriceOracle.methods['initialize(uint256)'](19, { + from: accounts[0], + }); + await contractDoubleCurveToken.buy(2014223715, 255, { + from: accounts[0], + gasPrice: 18, + }); + let result = await truffleAssert.fails( + contractDoubleCurveToken.withdraw({from: accounts[0]}), + 'revert', + ); + }); + + it('Should fail amountToReserve(uint256) when NOT comply with: spreadD > 0', async () => { + await contractDoubleCurveToken.methods[ + 'initialize(address,address,uint256,uint256,uint256,uint256,uint256,uint256,string,string,address)' + ]( + contractDoubleCurveToken.address, + accounts[0], + 97, + 9, + 255, + 4038714810, + 0, + 5, + 'bouncer', + 'Example', + contractGasPriceOracle.address, + {from: accounts[0]}, + ); + let result = await truffleAssert.fails( + contractDoubleCurveToken.amountToReserve(4038714811, {from: accounts[0]}), + 'revert', + ); + }); + it('Should fail currentPrice() when NOT comply with: slopeD > 0', async () => { + await contractDoubleCurveToken.methods[ + 'initialize(address,address,uint256,uint256,uint256,uint256,uint256,uint256,string,string,address)' + ]( + contractAccount.address, + accounts[4], + 95, + 0, + 10, + 1336, + 97, + 10000, + 'IsLibrary', + '\x19Ethereum Signed Message:\n32', + contractGasPriceOracle.address, + {from: accounts[0]}, + ); + let result = await truffleAssert.fails( + contractDoubleCurveToken.currentPrice({from: accounts[0]}), + 'revert', + ); + }); +});