@@ -4,6 +4,7 @@ const KyberNetwork = artifacts.require('KyberNetwork.sol')
44const KyberStorage = artifacts . require ( 'KyberStorage.sol' )
55const MatchingEngine = artifacts . require ( 'KyberMatchingEngine.sol' )
66const TestToken = artifacts . require ( 'Token.sol' )
7+ const NoPayableFallback = artifacts . require ( 'NoPayableFallback.sol' )
78
89const Helper = require ( '../helper.js' )
910const nwHelper = require ( './networkHelper.js' )
@@ -61,7 +62,7 @@ contract('EmergencyKyberFeeHandler', function (accounts) {
6162
6263 describe ( 'test set network' , async ( ) => {
6364 let newNetwork = accounts [ 3 ]
64- before ( 'init emergencyFeeHandler' , async ( ) => {
65+ beforeEach ( 'init emergencyFeeHandler' , async ( ) => {
6566 feeHandler = await EmergencyKyberFeeHandler . new ( admin , network , rewardBps , rebateBps , burnBps )
6667 } )
6768
@@ -76,6 +77,9 @@ contract('EmergencyKyberFeeHandler', function (accounts) {
7677 it ( 'should success and emit events' , async ( ) => {
7778 let txResult = await feeHandler . setNetworkContract ( newNetwork , { from : admin } )
7879 await expectEvent ( txResult , 'KyberNetworkUpdated' , { kyberNetwork : newNetwork } )
80+ // not update event if network contract is unchanged
81+ txResult = await feeHandler . setNetworkContract ( newNetwork , { from : admin } )
82+ await expectEvent . notEmitted ( txResult , 'KyberNetworkUpdated' )
7983 } )
8084 } )
8185
@@ -192,11 +196,10 @@ contract('EmergencyKyberFeeHandler', function (accounts) {
192196 } )
193197
194198 describe ( 'test validate condition' , async ( ) => {
199+ let platformFee = new BN ( 10 ) . pow ( new BN ( 17 ) )
200+ let networkFee = new BN ( 10 ) . pow ( new BN ( 18 ) )
201+ let fee = platformFee . add ( networkFee )
195202 it ( 'test only network call handleFee' , async ( ) => {
196- let platformFee = new BN ( 10 ) . pow ( new BN ( 17 ) )
197- let fee = new BN ( 10 ) . pow ( new BN ( 18 ) )
198- let networkFee = fee . sub ( platformFee )
199-
200203 await expectRevert (
201204 feeHandler . handleFees (
202205 ethAddress ,
@@ -215,9 +218,6 @@ contract('EmergencyKyberFeeHandler', function (accounts) {
215218 } )
216219
217220 it ( 'test calculateAndRecordFeeData only call by feehandler' , async ( ) => {
218- let platformFee = new BN ( 10 ) . pow ( new BN ( 17 ) )
219- let networkFee = new BN ( 10 ) . pow ( new BN ( 18 ) )
220-
221221 try {
222222 await feeHandler . calculateAndRecordFeeData (
223223 platformWallet ,
@@ -235,10 +235,6 @@ contract('EmergencyKyberFeeHandler', function (accounts) {
235235
236236 it ( 'test revert if token is not eth' , async ( ) => {
237237 testToken = await TestToken . new ( 'test' , 'KNC' , 18 )
238- let platformFee = new BN ( 10 ) . pow ( new BN ( 17 ) )
239- let fee = new BN ( 10 ) . pow ( new BN ( 18 ) )
240- let networkFee = fee . sub ( platformFee )
241-
242238 await expectRevert (
243239 feeHandler . handleFees (
244240 testToken . address ,
@@ -248,22 +244,72 @@ contract('EmergencyKyberFeeHandler', function (accounts) {
248244 platformFee ,
249245 networkFee ,
250246 {
251- from : admin ,
247+ from : network ,
252248 value : fee
253249 }
254250 ) ,
255- 'only kyberNetwork '
251+ 'token not eth '
256252 )
257253 } )
254+
255+ it ( 'test revert if msg.value is different from total platformFee and networkFee' , async ( ) => {
256+ await expectRevert (
257+ feeHandler . handleFees (
258+ ethAddress ,
259+ rebateWallets ,
260+ rebateBpsPerWallet ,
261+ platformWallet ,
262+ platformFee ,
263+ networkFee ,
264+ {
265+ from : network ,
266+ value : zeroBN
267+ }
268+ ) ,
269+ 'msg.value not equal to total fees'
270+ )
271+ } )
272+
273+ it ( 'test should record handle fee failed if rebatewallet is zero' , async ( ) => {
274+ let txResult = await feeHandler . handleFees (
275+ ethAddress ,
276+ [ zeroAddress , zeroAddress ] ,
277+ rebateBpsPerWallet ,
278+ platformWallet ,
279+ platformFee ,
280+ networkFee ,
281+ {
282+ from : network ,
283+ value : fee
284+ }
285+ )
286+ await expectEvent ( txResult , 'HandleFeeFailed' )
287+ } )
288+
289+ it ( 'test should record handle fee failed if total rebate bps > BPS' , async ( ) => {
290+ let txResult = await feeHandler . handleFees (
291+ ethAddress ,
292+ rebateWallets ,
293+ [ new BN ( 5000 ) , new BN ( 5001 ) ] ,
294+ platformWallet ,
295+ platformFee ,
296+ networkFee ,
297+ {
298+ from : network ,
299+ value : fee
300+ }
301+ )
302+ await expectEvent ( txResult , 'HandleFeeFailed' )
303+ } )
258304 } )
259305 } )
260306
261307 describe ( 'test withdraw and claimPlatformFee function' , async ( ) => {
262- let availableFee
263- let totalBalance
264- let platformFee
265308 before ( 'create new feehandler' , async ( ) => {
266309 feeHandler = await EmergencyKyberFeeHandler . new ( admin , network , rewardBps , rebateBps , burnBps )
310+ } )
311+
312+ async function createHandleFee ( platformWallet ) {
267313 platformFee = new BN ( 10 ) . pow ( new BN ( 17 ) )
268314 totalBalance = new BN ( 10 ) . pow ( new BN ( 18 ) )
269315 await feeHandler . handleFees (
@@ -278,18 +324,29 @@ contract('EmergencyKyberFeeHandler', function (accounts) {
278324 value : totalBalance
279325 }
280326 )
281- availableFee = totalBalance . sub ( platformFee )
282- } )
327+ }
283328
284329 it ( 'test withdraw revert if not admin' , async ( ) => {
285- await expectRevert ( feeHandler . withdraw ( user , availableFee , { from : network } ) , 'only admin' )
330+ await createHandleFee ( platformWallet )
331+ await expectRevert ( feeHandler . withdraw ( user , new BN ( 1 ) , { from : network } ) , 'only admin' )
286332 } )
287333
288- it ( 'test withdraw revert if not admin' , async ( ) => {
289- await expectRevert ( feeHandler . withdraw ( user , totalBalance , { from : admin } ) , 'amount > available funds' )
334+ it ( 'test withdraw revert if withdraw more than availableBalance' , async ( ) => {
335+ await createHandleFee ( platformWallet )
336+ totalPlatformFee = await feeHandler . totalPlatformFeeWei ( )
337+ totalBalance = await Helper . getBalancePromise ( feeHandler . address )
338+ availableFee = totalBalance . sub ( totalPlatformFee )
339+ await expectRevert (
340+ feeHandler . withdraw ( user , availableFee . add ( new BN ( 1 ) ) , { from : admin } ) ,
341+ 'amount > available funds'
342+ )
290343 } )
291344
292345 it ( 'test withdraw success' , async ( ) => {
346+ await createHandleFee ( platformWallet )
347+ totalPlatformFee = await feeHandler . totalPlatformFeeWei ( )
348+ totalBalance = await Helper . getBalancePromise ( feeHandler . address )
349+ availableFee = totalBalance . sub ( totalPlatformFee )
293350 let initialBalance = await Helper . getBalancePromise ( user )
294351 let txResult = await feeHandler . withdraw ( user , availableFee , { from : admin } )
295352 expectEvent ( txResult , 'EtherWithdraw' , {
@@ -300,8 +357,10 @@ contract('EmergencyKyberFeeHandler', function (accounts) {
300357 } )
301358
302359 it ( 'test claimPlatformFee success' , async ( ) => {
360+ await createHandleFee ( platformWallet )
303361 let initialBalance = await Helper . getBalancePromise ( platformWallet )
304362 let initialTotalPlatformFee = await feeHandler . totalPlatformFeeWei ( )
363+ let platformFee = await feeHandler . feePerPlatformWallet ( platformWallet )
305364 let txResult = await feeHandler . claimPlatformFee ( platformWallet )
306365 expectEvent ( txResult , 'PlatformFeePaid' , {
307366 platformWallet : platformWallet ,
@@ -318,6 +377,18 @@ contract('EmergencyKyberFeeHandler', function (accounts) {
318377 )
319378 await expectRevert ( feeHandler . claimPlatformFee ( platformWallet ) , 'no fee to claim' )
320379 } )
380+
381+ it ( 'reverts if platform wallet is non-payable contract' , async ( ) => {
382+ let platformWallet = await NoPayableFallback . new ( )
383+ await createHandleFee ( platformWallet . address )
384+ await expectRevert ( feeHandler . claimPlatformFee ( platformWallet . address ) , 'platform fee transfer failed' )
385+ } )
386+
387+ it ( 'reverts if withdraw to non-payable contract' , async ( ) => {
388+ let sendTo = await NoPayableFallback . new ( )
389+ await createHandleFee ( platformWallet )
390+ await expectRevert ( feeHandler . withdraw ( sendTo . address , new BN ( 1 ) , { from : admin } ) , 'withdraw transfer failed' )
391+ } )
321392 } )
322393
323394 it ( 'should revert with not implemented method from IKyberFeeHandler' , async ( ) => {
0 commit comments