Testing
Testing work load can be unlimited if we don't think carefully about that. This is why we create this testing documentation, so we can communicate through different teams. People from different backgrounds can review and give us feed back. It also give the users the confidence about our code quality.
The document list the high level of testing ideas, sometime written in form of pseudo code. It is structured by components in our smartcontracts. Each item is numbered so we can easily indentify the case when we communicate. Each paragraph's title will match exactly the test name in our source code.
1. MathLibrary
Math library implement all math operations, from fundamental as simple division or multiplication to the sophisticated fee calculations, discount factor calculation ..etc. We implement all calculations in this library so all other smart contracts are not exposed to math security issues, they just used the formulas, functions implemented in this library.
1.1. multiply
multiply implement a simple arithmetic math operation A*B
1.1.1. multiply overflow
We find a max number MM, and we test
- MM*1 = 1*MM
- (MM+1)*1 and 1*(MM+1) should overflow
- test [\sqrt{MM}-1]*[\sqrt{MM}-1] should not overflow and give exact result
- find two numbers A, B so that A*B == B*A == MM. Then (A+1)*B and A*(B+1) should overflow. Hint A and B should be close to [\sqrt{MM}-1]
1.1.2. multiply zero
For a random number, multiply with zero should return zero
1.1.3. multiply commutativity
Generate two random numbers A,B \leq (\sqrt{MM}-1), and test A*B==B*A, and should return exact result
1.2. divide
divide implement a simple arithmetic math operation A/B
1.2.1. divide zero
Divide by zero should throw error
1.2.2. max divisor
We find a max number MD, and we test
- 1/MD return decent result
- 1/(MD+1) should throw an error
If MD=MAXUINT256-1, then it's perfect
1.2.3. divide very small number
We find a max number MD, and we test
- \frac{1}{\frac{1}{MD}} return result ok
- \frac{1}{\frac{1}{MD+1}} should throw error or overflow
1.2.4. perfect division
For the normal cases, with numbers are all in bound with previous test, generate random numbers A, B and C=A*B
- test C/A=B and C/B=A
1.2.5. divide precision lost
As we expect our math operations are good for all numbers within the range uint128. Given A=MAXUINT128-1
- calculate R=A*(1/A) and compare relative error, i.e abs(R-A)/A. Hard code some epsilon and make sure the relative error is less then this value
- do the same thing for MAXUINT96, MAXUINT64, MAXUINT32, to get the idea how the error behaves
1.2.6. divide precision lost (randomized)
Again this test is similar to the previous one, but randomized. Test for all configurations MAXUINT128, MAXUINT96, MAXUINT64, MAXUINT32
Example for a single case MAXUINT128 :
- Generate two random numbers A, B, within the range [1,MAXUINT128-1]
- calculate R=B*(A/B) and compare relative error, i.e abs(R-A)/A. The relative error should be lower or equal to the hardcoded error found previously when we consider divide 1
Note : we don't need to do many random iteration, just one time randomized is enough. But make sure to print out the inputs and result, reason test failed, when there are errors, so we can reproduce and debug. Think about what informations we need to reproduce the failed test.
1.3. portion
1.3.1. portion is invalid
We test if portion is invalid in case of portion result greater than or equal 1.
1.3.2. portion is valid
We test if portion is valid in case of portion result less than 1.
1.3.3. portion and total amoun are very large numbers
We test if there are overflow in case of multiplication large number.
1.4. earlyFeeRate
1.4.1. day is invalid
We test if day of fee rate is invalid in case day greater than or equal 42.
1.4.2. day is valid
We test if day of fee rate is invalid.
1.4.3. day equal 42
We test if there are abnormal cases in case of day equal 42.
1.5. discountValueIncludingFeeDelta
1.5.1. s is very large number and P is very small number
We test if there are overflow in case of s divide P.
1.5.2. s is very small number and P is very large number
We test if there are overflow in case of s divide P.
1.5.3. P is zero
We test if there are cases of P is zero, should catch error Division by zero.
1.6. discountValueExcludingFeeDelta
1.6.1. amount, productOfInterestRate, feeRate are very large numbers
We test if there are overflow in case of amount, productOfInterestRate, feeRate are very large numbers.
2. AuctionManager
2.1. constructor
2.1.1. CashTestToken address
We test if Auction Manager deployed, then deployed Cash Token address is registered to Auction Manager.
2.1.2. Token420 address
We test if Auction Manager deployed, then deployed Token420 address is registered to Auction Manager.
2.1.3. Treasury Manager address
We test if Auction Manager deployed, then deployed Treasury Manager address is registered to Auction Manager.
2.1.4. Register Auction Manager in Treasury
We test if Auction Manager deployed, then Auction Manager address has registered to Treasury.
2.2. registerDaoManager
2.2.1. DAO Manager has been registered
We test if DAO Manager has been registered, then throw error DaoManager has been registered.
2.2.2. DAO Manager has not registered yet
We test if DAO Manager still be ZERO address, then can register.
2.3. deposit
2.3.1. deposit CASH move from user account to Auction Manager
We test if user deposit CASH, then cash transfer from user account to Auction Manager.
2.3.2. deposit amount zero causes revert
We test if user deposit 0, then the transaction will be reverted.
2.4. withdraw
2.4.1. single user withdraw maximum token emission when deposit of previous auction is equal to softFloorDeposit
We test if user deposit of previous auction is equal to softFloorDeposit, then user can withdraw maximum token emission.
2.4.2. single user withdraw maximum token emission when deposit of previous auction is more than softFloorDeposit
We test if user deposit of previous auction is more than softFloorDeposit, then user can withdraw maximum token emission.
2.4.3. single user withdraw less than maximum token emission when deposit of previous auction is less than softFloorDeposit
We test if user deposit of previous auction is less than softFloorDeposit, then user can withdraw less than maximum token emission.
2.4.4. single user withdraw in extreme case when they deposit 1 (10^(-18))
We test if user deposit of previous auction is equal to 1 (10^{-18)}), then user can withdraw token.
2.4.5. Should throw error No token to withdraw when user did not deposit
We test if user did not deposit of previous auction, then throw the error when user withdraw token.
2.5. withdrawableTokenAmountOf
2.5.1. correct withdrawable token amount after auction inflation
We test if the withdrawable token amount is updated correctly after daily inflation of auction.
2.5.2. correct withdrawable token amount after deposit
We test if the withdrawable token amount is updated correctly after the user deposits.
2.5.3. correct withdrawable token amount after token withdrawal
We test if the withdrawable token amount is updated correctly after the user withdraws.
2.5.4. correct withdrawable token amount after deposit and withdrawal in a same auction
We test if the withdrawable token amount is updated correctly after the user deposits and withdraws in a same auction.
2.6. initializeSoftFloorPrice
2.6.1. Only Dao Manager can be called
We test if caller is not Dao Manager, then throw error Permission: Unauthorized.
2.6.2. Init soft floor price successfully
We test if caller is Dao Manager can call initializeSoftFloorPrice successfully
3. DaoManager
3.1. construction
3.1.1. Token420 address
We test if DaoManager deployed, then deployed Token420 address is registered to Dao Manager.
3.1.2. Auction Manager address
We test if DaoManager deployed, then deployed Auction Manager address is registered to Dao Manager.
3.1.3. Mirror Pool address
We test if DaoManager deployed, then deployed Mirror Pool address is registered to Dao Manager.
3.1.4. Staking Pool address
We test if DaoManager deployed, then deployed Staking Pool address is registered to Dao Manager.
3.1.5. Treasury Manager address
We test if DaoManager deployed, then deployed Treasury Manager address is registered to Dao Manager.
3.1.6. register Dao Manager address
We test if DaoManager deployed, then DAO register DAO Manager address to Token420, Auction Manager, Mirror Pool, Staking Pool and Treasury Manager successfully.
3.1.7. Initial migration status
We test if DaoManager deployed, the DAO's status of isGoingToMigrate, isBlockedForMigration and emissionTerminated are false.
3.1.8. Initial auction day
We test if DaoManager deployed, the DAO's first day count should be 1.
3.1.9. Admin is deployer account
We test if DaoManager deployed, the DAO's admin is the one who deploy.
3.1.10. Initial auction information
We test if DaoManager deployed, AuctionManager is updated with correct softFloorPrice and maximumEmission.
3.1.11. Whitelist address is zero address
We test if DaoManager deployed:
- Whitelist address is ZERO address.
- lastTriggerNextAuction is equal deployed timestamp.
3.1.12. Whitelist address is NOT zero address
We test if DaoManager deployed:
- Whitelist address is NOT ZERO address.
- lastTriggerNextAuction is equal Whitelist expiration D2 timestamp.
3.2. burn
3.2.1. Caller is not Treasury Manager
We test if caller is not Treasury Manager, then throw error.
3.2.2. Treasury Manager burn exceed amount
We test if Treasury Manager burn exceed amount, then throw error.
3.2.3. Treasury Manager can burn
We test if Treasury Manager burn with valid amount, then these token will be destroyed.
3.3. nextAuction
3.3.1. Caller nextAuction success
We test if caller is not Dao Admin, then
- Auction ID will be added 1.
3.3.2. auction current total deposit greater than 0
We test if auction current total deposit greater than 0, then
- Token balance of
Auction ManagerandMirror Poolwill be added 100,000 token. - Auction ID will be added 1.
3.3.3. auction current total deposit equal 0
We test if auction current total deposit equal 0, then
- Token balance of
Auction ManagerandMirror Poolwill not added 100,000 token. - Auction ID will be added 1.
3.3.4. staking pool is empty
We test if staking pool is empty, then productOfInterestRate of Staking Pool will be reset to 1.
3.3.5. staking pool is not empty and token total supply is not less than current auctionEmission
We test if staking pool is not empty and token total supply is not less than current auctionEmission, then token balance of Staking Pool will added 220,000 token reward.
3.3.6. Staking pool is not empty and token total supply is less than current auctionEmission
We test if staking pool is not empty and token total supply is less than current auctionEmission, then token balance of Staking Pool will be added exactly token reward amount equal current token total supply.
3.3.7. next day is less than or equal staking fee convergent day
We test if next day is less than or equal staking fee convergent day, then Staking fee rate will be updated incrementally.
3.3.8. next day is greater than staking fee convergent day
We test if next day is greater than staking fee convergent day, then Staking fee rate will be set to base fee rate.
3.3.9. Invalid trigger nextAuction without whitelist on test net
We test after deploying DAO Manager to test net with Auction duration is 1 hour = 3600 second. We test:
- Dao Manager trigger nextAuction well.
- Skip EVM timestamp with
minimum skip time = 3599second, Dao Manager trigger nextAuction well. - Skip EVM timestamp with
skip time = minimum skip time - 1 = 3598second, Dao Manager trigger nextAuction failed.
3.3.10. Invalid trigger nextAuction without whitelist on main net
We test after deploying DAO Manager to main net with Auction duration is 23 hour 50 minutes = 85800 second. We test:
- Dao Manager trigger nextAuction well.
- Skip EVM timestamp with
minimum skip time = 85799second, Dao Manager trigger nextAuction well. - Skip EVM timestamp with
skip time = minimum skip time - 1 = 85798second, Dao Manager trigger nextAuction failed.
3.3.11. Invalid trigger nextAuction with whitelist before whitelist finish
We test after deploying DAO Manager to main net with Auction duration is 23 hour 50 minutes = 85800 second. We test:
- Dao Manager trigger nextAuction failed after deploying.
- Skip EVM timestamp to Whitelist expiration timestamp - 1, Dao Manager trigger nextAuction failed.
- Then, Dao Manager trigger nextAuction well.
3.4. prepareForMigration
3.4.1. migration and emissionTerminated status
After calling prepareForMigration, the system should be at the prepare-to-migrate state.
When a nextAuction is called, then the system is totally freezed
3.5. transferAdministration
3.5.1. Caller is not DAO admin
We test if caller is not Admin then throw error Unauthorized.
3.5.2. Should throw error Invalid admin address
We test if calls transferAdministration with account that equal zero-address or current admin address then throw error Invalid admin address.
3.5.3. Transfer adminship successffuly
We test if caller transferAdministration with account that is different from zero-address or current admin address, admin will be assigned correctly.
4. CashTestToken
4.1. construction
4.1.1. total supply 200M stable cash coin
We test if Cash Token deployed, total supply of stable Cash coin is 200M.
4.1.2. balance 100M for each test account
We test if Cash token admin pregenerate tokens and distributes to testing accounts at construct time, then cash balance of each account equal 100,000,000.
4.1.3. Cash decimals
We test if Cash token admin pregenerate tokens and distributes to testing accounts at construct time, then cash decimals is 6.
4.2. deployment
4.2.1. Treasury Manager hold Cash Token
We test if TreasuryManager deployed, then deployed Cash Token address is registered to Treasury Manager.
4.2.2. Auction Manager hold Cash Token
We test if Auction Manager deployed, then deployed Cash Token address is registered to Auction Manager.
5. MirrorPool
5.1. construction
5.1.1. Token420 address
We test if Mirror Pool deployed, then deployed Token420 address is registered to Mirror Pool.
5.2. registerDaoManager
5.2.1. DAO Manager has been registered
We test if DAO Manager has been registered, then throw error DaoManager has been registered.
5.2.2. DAO Manager has not registered yet
We test if DAO Manager still be ZERO address, then can register.
5.3. fetchToken
5.3.1. Caller is not DAO Manager
We test if caller is not DAO Manager then throw error.
5.3.2. Dao Manager can fetch token and split the token pie
We test if Dao Manager can fetch token that minted by DAO manager and the fetched token amount accordingly to the defined percentages
5.4. assignDevMktShareOwner
5.4.1. owner is deployer before any assignment
We test if the devMktShareOwner is zero-address before any assignDevMktShareOwner transaction is executed.
5.4.2. assign successfully an ordinary address
We test if dao calls assignDevMktShareOwner the first time with an address different from zero-address, devMktShareOwner will be assigned correctly.
5.4.3. re-assign successfully an ordinary address
We test if dao calls assignDevMktShareOwner with an address different from zero-address when the owner has already been assigned, devMktShareOwner will be assigned correctly.
5.4.4. assign unsuccessfully zero-address
We test if dao calls assignDevMktShareOwner with zero-address will cause revert.
5.4.5. assign unsuccessfully from sender different from admin
We test if an address different from admin calls assignDevMktShareOwner will cause revert
5.5. withdrawDevMktShare
5.5.1. withdraw unsuccessfully from sender different from the owner
We test if an address different from devMktShareOwner calls withdrawDevMktShare will cause revert.
5.5.2. withdraw unsuccessfully amount exceeding the share
We test if devMktShareOwner calls withdrawDevMktShare with the amount exceeding devMktShare will cause revert.
5.5.3. withdraw successfully
We test if devMktShareOwner calls withdrawDevMktShare with a valid amount, devMktShare will decrease correctly and cash balance of devMktShareOwner will increase correctly.
5.6. refundDevMktShare
5.6.1. refund unsuccessfully from sender different from the owner
We test if an address different from devMktShareOwner calls refundDevMktShare will cause revert.
5.6.2. refund successfully
We test if devMktShareOwner calls refundDevMktShare, devMktShare will increase correctly and cash balance of devMktShareOwner will increase correctly.
5.7. assignEarlySupShareOwner
5.7.1. owner is deployer before any assignment
We test if the earlySupShareOwner is zero-address before any assignEarlySupShareOwner transaction is executed.
5.7.2. assign successfully an ordinary address
We test if dao calls assignEarlySupShareOwner the first time with an address different from zero-address, earlySupShareOwner will be assigned correctly.
5.7.3. re-assign successfully an ordinary address
We test if dao calls assignEarlySupShareOwner with an address different from zero-address when the owner has already been assigned, earlySupShareOwner will be assigned correctly.
5.7.4. assign unsuccessfully zero-address
We test if dao calls assignEarlySupShareOwner with zero-address will cause revert.
5.7.5. assign unsuccessfully from sender different from admin
We test if an address different from admin calls assignEarlySupShareOwner will cause revert
5.8. withdrawEarlySupShare
5.8.1. withdraw unsuccessfully from sender different from the owner
We test if an address different from earlySupShareOwner calls withdrawEarlySupShare will cause revert.
5.8.2. withdraw unsuccessfully amount exceeding the share
We test if earlySupShareOwner calls withdrawEarlySupShare with the amount exceeding earlySupShare will cause revert.
5.8.3. withdraw successfully
We test if earlySupShareOwner calls withdrawEarlySupShare with a valid amount, earlySupShare will decrease correctly and cash balance of earlySupShareOwner will increase correctly.
5.9. refundEarlySupShare
5.9.1. refund unsuccessfully from sender different from the owner
We test if an address different from earlySupShareOwner calls refundEarlySupShare will cause revert.
5.9.2. refund successfully
We test if earlySupShareOwner calls refundEarlySupShare, earlySupShare will increase correctly and cash balance of earlySupShareOwner will increase correctly.
5.10. assignRsvShareOwner
5.10.1. owner is deployer before any assignment
We test if the rsvShareOwner is zero-address before any assignRsvShareOwner transaction is executed.
5.10.2. assign successfully an ordinary address
We test if dao calls assignRsvShareOwner the first time with an address different from zero-address, rsvShareOwner will be assigned correctly.
5.10.3. re-assign successfully an ordinary address
We test if dao calls assignRsvShareOwner with an address different from zero-address when the owner has already been assigned, rsvShareOwner will be assigned correctly.
5.10.4. assign unsuccessfully zero-address
We test if dao calls assignRsvShareOwner with zero-address will cause revert.
5.10.5. assign unsuccessfully from sender different from admin
We test if an address different from admin calls assignRsvShareOwner will cause revert
5.11. withdrawRsvShare
5.11.1. withdraw unsuccessfully from sender different from the owner
We test if an address different from rsvShareOwner calls withdrawRsvShare will cause revert.
5.11.2. withdraw unsuccessfully amount exceeding the share
We test if rsvShareOwner calls withdrawRsvShare with the amount exceeding rsvShare will cause revert.
5.11.3. withdraw successfully
We test if rsvShareOwner calls withdrawRsvShare with a valid amount, rsvShare will decrease correctly and cash balance of rsvShareOwner will increase correctly.
5.12. refundRsvShare
5.12.1. refund unsuccessfully from sender different from the owner
We test if an address different from rsvShareOwner calls refundRsvShare will cause revert.
5.12.2. refund successfully
We test if rsvShareOwner calls refundRsvShare, rsvShare will increase correctly and cash balance of rsvShareOwner will increase correctly.
5.13. stakeFromRsvShare
5.13.1. stake unsuccessfully from sender different from owner
We test if an address different from rsvShareOwner calls stakeFromRsvShare will cause revert.
5.13.2. stake unsuccessfully amount exceeding the share
We test if rsvShareOwner calls stakeFromRsvShare with the amount exceeding rsvShare will cause revert.
5.13.3. stake successfully
We test if rsvShareOwner calls stakeFromRsvShare with a valid amount, rsvShare and tokenS420 balance of MirrorPool will change correctly.
5.14. unstakeToRsvShare
5.14.1. unstake unsuccessfully from sender different from owner
We test if an address different from rsvShareOwner calls stakeToRsvShare will cause revert.
5.14.2. unstake unsuccessfully amount exceeding s420 balance
We test if rsvShareOwner calls stakeToRsvShare with the amount exceeding tokenS420 balance of MirrorPool will cause revert.
5.14.3. unstake successfully
We test if rsvShareOwner calls stakeToRsvShare with a valid amount, rsvShare and tokenS420 balance of MirrorPool will change correctly.
5.15. withdrawRsvShareStake
5.15.1. withdraw unsuccessfully from sender different from owner
We test if an address different from rsvShareOwner calls withdrawRsvShareStake will cause revert.
5.15.2. withdraw unsuccessfully amount exceeding s420 balance
We test if rsvShareOwner calls withdrawRsvShareStake with the amount exceeding tokenS420 balance of MirrorPool will cause revert.
5.15.3. withdraw successfully
We test if rsvShareOwner calls withdrawRsvShareStake with a valid amount, tokenS420 balances of MirrorPool and rsvShareOwner will change correctly.
6. StakingPool
6.1. construction
6.1.1. Token420 and TokenS420 address
We test if StakingPool deployed, then deployed Token420 address and TokenS420 address are registered to StakingPool.
6.2. registerDaoManager
6.2.1. DAO Manager has been registered
We test if DAO Manager has been registered, then throw error DaoManager has been registered.
6.2.2. DAO Manager has not registered yet
We test if DAO Manager still be ZERO address, then can register.
6.3. resetproductOfInterestRate
6.3.1. Caller is not Dao Manager
We test if DAO Manager has been registered, then throw error Only DaoManager can trigger resetproductOfInterestRate.
6.3.2. Reset productOfInterestRate when staking amount is empty
We test if staking amount is empty, then productOfInterestRate reset to be 1..
6.4. updateStakingInfo
6.4.1. Caller is not Dao Manager
We test if DAO Manager has been registered, then throw error Transaction reverted without a reason string.
6.4.2. Converges early and stays stable lately
We test if
- We test if converges
early, then staking fee rate will be updated incrementally. - We test if converges
stays stable lately, then staking fee rate will be reset to be base fee rate.
6.5. stake
6.5.1. Invalid stake amount
We test if user stakes amount is 0, then throw error Invalid stake amount.
6.5.2. User stakes 100,000
We test if user stakes 100,000, check
- totalCapital
- discountValueIncludingFee
- discountValueExcludingFee
- penalizedCapital
- capitalExcludingFee
- productOfInterestRate
6.5.3. User stakes 2 times, 100,000 for each time
We test if user stakes 2 times with 100,000 each time, check
- totalCapital
- discountValueIncludingFee
- discountValueExcludingFee
- penalizedCapital
- capitalExcludingFee
- productOfInterestRate
6.5.4. TODO: Multiple user stakes multiple times
We test if there are multiple user stakes multiple times.
6.6. unstake
6.6.1. Invalid unstake amount
We test if user unstakes exceed staked token amount, then throw error Invalid unstake amount.
6.6.2. User only unstakes part of the tokens
We test if user only unstakes part of the tokens, then check
- totalCapital
- discountValueIncludingFee
- discountValueExcludingFee
- penalizedCapital
- capitalExcludingFee
- productOfInterestRate
6.6.3. User unstakes all
We test if user unstakes all unstakes part of the tokens, then check
- totalCapital
- discountValueIncludingFee
- discountValueExcludingFee
- penalizedCapital
- capitalExcludingFee
- productOfInterestRate reset to be
1
6.6.4. TODO: Multiple user unstakes part of the tokens
We test if there are multiple user unstakes part of the tokens.
6.6.5. TODO: Multiple user unstakes all staked tokens
We test if there are multiple user unstakes all staked tokens.
6.7. totalStake
6.7.1. totalStake remains the same after tokens transferred to the Staking Pool without staking
We test if when some tokens are transferred to the Staking Pool not through stake method, the totalStake should remain the same.
7. Token420
7.1. construction
7.1.1. Token name
We test if Token420 deployed, then deployed token name is Token420.
7.1.2. Token symbol
We test if Token420 deployed, then deployed token symbol is 420D.
7.2. registerDaoManager
7.2.1. DAO Manager has been registered
We test if DAO Manager has been registered, then throw error DAO Manager has been registered.
7.2.2. DAO Manager has not registered yet
We test if DAO Manager still be ZERO address, then can register.
7.3. mint
7.3.1. DAO Manager can mint token
We test if DAO Manager can mint token with given amount.
7.3.2. Caller is not DAO Manager
We test if Caller is not DAO Manager, then then throw error.
7.4. burn
7.4.1. DAO Manager can burn token
We test if DAO Manager can burn token with given amount.
7.4.2. Caller is not DAO Manager
We test if Caller is not DAO Manager, then then throw error.
7.4.3. Burn amount exceeds balance
We test if burn amount exceeds balance, then throw error ERC20: burn amount exceeds balance.
8. TreasuryManager
8.1. construction
8.1.1. CashTestToken address
We test if Treasury Manager deployed, then deployed Cash Token address is registered to Treasury Manager.
8.1.2. Token420 address
We test if Treasury Manager deployed, then deployed Token420 address is registered to Treasury Manager.
8.1.3. lock until
We test if Treasury Manager deployed, then lock until is 0.
8.2. registerDaoManager
8.2.1. DAO Manager has been registered
We test if DAO Manager has been registered, then throw error DAO Manager has been registered.
8.2.2. DAO Manager has not registered yet
We test if DAO Manager still be ZERO address, then can register.
8.3. registerAuctionManager
8.3.1. Auction Manager has been registered
We test if Auction Manager has been registered, then throw error AuctionManager has been registered.
8.3.2. Auction Manager has not registered yet
We test if Auction Manager still be ZERO address, then can register.
8.4. fetchCash
8.4.1. Caller is not Auction Manager
We test if Caller is not Auction Manager, then then throw error.
8.4.2. Auction Manager can fetch and split the cash pie
We test if Auction Manager can fetch and split the cash pie for
- Asset Fund (
60%). - Insurance Fund (
30%). - Operation Fund (
10%).
8.5. Claim cash back
8.5.1. Claim is locked
We test if current auction day less than or equal claim lock until, then TreasuryManager throw error Claim is locked
8.5.2. Claim back success
We test if user can claim cash back in simple auction case (TreasuryManager only hold one user's cash), then TreasuryManager burn their token.
8.6. lockUpTo
8.6.1. Only admin can lockUpTo
We test if caller is not Dao Manager admin, then throw error Only admin can lockUpTo.
8.6.2. new lockTerm equal current auction day
We test if newLockUntil <= currentAuctionDay, then throw error Invalid lock until auction day.
8.6.3. new lockTerm less and equal old lockTerm
We test if newLockUntil <= oldLockUntil, then throw error Invalid lock until auction day.
8.6.4. lockUpTo success
We test if newLockUntil:
- newLockUntil > currentAuctionDay
- newLockUntil != oldLockUntil
Then lockUpTo should lock success.
8.7. assignAssetFundOwner
8.7.1. owner is deployer before any assignment
We test if the assetFundOwner is zero-address before any assignAssetFundOwner transaction is executed.
8.7.2. assign successfully an ordinary address
We test if dao calls assignAssetFundOwner the first time with an address different from zero-address, assetFundOwner will be assigned correctly.
8.7.3. re-assign successfully an ordinary address
We test if dao calls assignAssetFundOwner with an address different from zero-address when the owner has already been assigned, assetFundOwner will be assigned correctly.
8.7.4. assign unsuccessfully zero-address
We test if dao calls assignAssetFundOwner with zero-address will cause revert.
8.7.5. assign unsuccessfully from sender different from admin
We test if an address different from admin calls assignAssetFundOwner will cause revert
8.8. withdrawAssetFund
8.8.1. withdraw unsuccessfully from sender different from the owner
We test if an address different from assetFundOwner calls withdrawAssetFund will cause revert.
8.8.2. withdraw unsuccessfully amount exceeding the fund
We test if assetFundOwner calls withdrawAssetFund with the amount exceeding assetFund will cause revert.
8.8.3. withdraw successfully
We test if assetFundOwner calls withdrawAssetFund with a valid amount, assetFund will decrease correctly and cash balance of assetFundOwner will increase correctly.
8.9. refundAssetFund
8.9.1. refund unsuccessfully from sender different from the owner
We test if an address different from assetFundOwner calls refundAssetFund will cause revert.
8.9.2. refund successfully
We test if assetFundOwner calls refundAssetFund, assetFund will increase correctly and cash balance of assetFundOwner will increase correctly.
8.10. assignInsuranceFundOwner
8.10.1. owner is deployer before any assignment
We test if the insuranceFundOwner is zero-address before any assignInsuranceFundOwner transaction is executed.
8.10.2. assign successfully an ordinary address
We test if dao calls assignInsuranceFundOwner the first time with an address different from zero-address, insuranceFundOwner will be assigned correctly.
8.10.3. re-assign successfully an ordinary address
We test if dao calls assignInsuranceFundOwner with an address different from zero-address when the owner has already been assigned, insuranceFundOwner will be assigned correctly.
8.10.4. assign unsuccessfully zero-address
We test if dao calls assignInsuranceFundOwner with zero-address will cause revert.
8.10.5. assign unsuccessfully from sender different from admin
We test if an address different from admin calls assignInsuranceFundOwner will cause revert
8.11. withdrawInsuranceFund
8.11.1. withdraw unsuccessfully from sender different from the owner
We test if an address different from insuranceFundOwner calls withdrawInsuranceFund will cause revert.
8.11.2. withdraw unsuccessfully amount exceeding the fund
We test if insuranceFundOwner calls withdrawInsuranceFund with the amount exceeding insuranceFund will cause revert.
8.11.3. withdraw successfully
We test if insuranceFundOwner calls withdrawInsuranceFund with a valid amount, insuranceFund will decrease correctly and cash balance of insuranceFundOwner will increase correctly.
8.12. refundInsuranceFund
8.12.1. refund unsuccessfully from sender different from the owner
We test if an address different from insuranceFundOwner calls refundInsuranceFund will cause revert.
8.12.2. refund successfully
We test if insuranceFundOwner calls refundInsuranceFund, insuranceFund will increase correctly and cash balance of insuranceFundOwner will increase correctly.
8.13. assignOperationFundOwner
8.13.1. owner is deployer before any assignment
We test if the operationFundOwner is zero-address before any assignOperationFundOwner transaction is executed.
8.13.2. assign successfully an ordinary address
We test if dao calls assignOperationFundOwner the first time with an address different from zero-address, operationFundOwner will be assigned correctly.
8.13.3. re-assign successfully an ordinary address
We test if dao calls assignOperationFundOwner with an address different from zero-address when the owner has already been assigned, operationFundOwner will be assigned correctly.
8.13.4. assign unsuccessfully zero-address
We test if dao calls assignOperationFundOwner with zero-address will cause revert.
8.13.5. assign unsuccessfully from sender different from admin
We test if an address different from admin calls assignOperationFundOwner will cause revert
8.14. withdrawOperationFund
8.14.1. withdraw unsuccessfully from sender different from the owner
We test if an address different from operationFundOwner calls withdrawOperationFund will cause revert.
8.14.2. withdraw unsuccessfully amount exceeding the fund
We test if operationFundOwner calls withdrawOperationFund with the amount exceeding operationFund will cause revert.
8.14.3. withdraw successfully
We test if operationFundOwner calls withdrawOperationFund with a valid amount, operationFund will decrease correctly and cash balance of operationFundOwner will increase correctly.
8.15. refundOperationFund
8.15.1. refund unsuccessfully from sender different from the owner
We test if an address different from operationFundOwner calls refundOperationFund will cause revert.
8.15.2. refund successfully
We test if operationFundOwner calls refundOperationFund, operationFund will increase correctly and cash balance of operationFundOwner will increase correctly.
9. Fixed
9.1. one
9.1.1. scaling factor Q=2^128
We test return value of one is equal 2^{128}, we call return value is Q.
Q = 0x100000000000000000000000000000000
= 340282366920938463463374607431768211456
9.1.2. fixedToInt(one()) = 1
We convert fixedToInt from Fixed(1), it should return 1.
9.1.3. intToFixed(1) = one()
We convert intToFixed from 1, the result should equal Fixed.one().
9.1.4. one() * one() = one()
We test Fixed.one() * Fixed.one() = Fixed.one()
9.1.5. Fixed one multiplication invariant
Generate a random big uint A < 2^{64}, convert it to Fixed to get a random Fixed.
9.2. Fixed conversion
9.2.1. intToFixed(0)=0
For Fixed(A) = 0, converting Fixed(A) to uint number should return 0.
9.2.2. intToFixed(1)=2^128
For Fixed(A) = 2^{128}, converting Fixed(A) to uint number should return 1 and vice versa.
9.2.3. uint256(intToFixed(A)) should divide 2^128
For uint256 random number, it should divide 2^{128} success.
9.2.4. intToFixed(2^128) overflow
For A = Q, converting A to Fixed number should overflow.
9.2.5. fixedToInt(intToFixed(random)) conversion
Generate a random bigInt A < 2^{128-1}, convert it to Fixed, then convert it back to int, should get the back the initial generated bigInt
9.2.6. fixedToInt(0)
For a Fixed number with value is 0, convert it from Fixed to int should return 0.
9.2.7. fixedToInt([2^128-1])=0
For a Fixed number with value is 2^{128-1}, convert it from Fixed to int should return 0.
9.2.8. fixedToInt([2^128])=1
For a Fixed number with value is 2^{128}, convert it from Fixed to int should return 1.
9.3. add(Fixed, Fixed)
9.3.1. add( Fixed([2^256-1]), Fixed([1]) ) should overflow
For two Fixed number [A] = 2^{256-1} and [B] = 1, then [A] + [B] should throw overflow.
9.3.2. add([A],[B]) = add([B],[A])
For two random Fixed number [A] and [B], then we test:
$$ [A] + [B] = [B] + [A] $$.
9.3.3. add([A],[0]) = [A]
For random Fixed number [A], then we test:
$$ [A] + [0] = [A] $$.
9.3.4. add([A],[B]) overflow if A+B>=2^256
For random Fixed number [A] < 10^{32} and [B] = 2^{256} - [A], we test [A] + [B] and [B] + [A] should throw overflow.
9.4. subtract(Fixed, Fixed)
9.4.1. subtract([A], [0]) = [A]
For a random Fixed number [A] < 10^{32}, we test:
9.4.2. subtract([A], [A]) = [0]
For a random Fixed number [A] < 10^{32}, we test:
9.4.3. subtract([A], [A+1]) should revert
For a random Fixed number [A] < 10^{32}, we test:
should throw error oveflow.
9.5. multiply(Fixed, Fixed)
9.5.1. multiply([A],[0]) = [0]
For two Fixed numbers [A] = 10^{32} (random), [B]= 0, we test:
9.5.2. multiply([A],one) = [A]
For two Fixed numbers [A] = 10^{32} (random), [B] = 2^{128}, we test:
9.5.3. multiply([A],[B]) = multiply([B],[A])
For random two Fixed numbers [A] = 10^{12}, [B] = 10^{12}, we test:
9.5.4. multiply(intToFixed(2^128-1),one) should pass
- For random uint A = 2^{128} - 1 and
Fixednumber [B] = 2^{128}, we test IntToFixed(A) * [B] should return exact result.
9.5.5. multiply(intToFixed(2^64),intToFixed(2^64)) should overflow
For random two uint numbers A = 2^{64}, B = 2^{64}, we test:
- IntToFixed(A) * IntToFixed(B) should
overflow.
9.5.6. multiply(Fixed([2^128+1]),Fixed([2^256-1])) should overflow
For two Fixed numbers [A] = 2^{128} + 1, [B] = 2^{256} -1, we test:
- [A] * [B] should
overflow.
9.5.7. multiply(intToFixed(AA),intToFixed(BB)) = intToFixed(AA*BB)
For random two uint numbers AA = 2, BB = 2, we test
IntToFixed(AA) * IntToFixed(BB) = IntToFixed(AA*BB)
9.5.8. Should multiply success in basic case
For two uint numbers A = 2, B = 5, we test:
9.5.9. Should multiply success in edge case
-
For an uint numbers MM = Q - 1 = 2^{128} - 1, we test MM * 1 = 1 * MM should return exact result.
-
For two uint numbers A = 2^{64} - 1, B = 2^{64} + 1, we test A * B should return exact result.
9.5.10. Should throw overflow
For two uint numbers A = 2^{64} - 1, B = 2^{64} + 1, we test:
- (A + 1) * B should
overflow. - A * (B + 1) should
overflow.
9.6. multiply(Fixed, uint)
9.6.1. multiply([A],0) = [0]
For random Fixed numbers [A] = 10^{32}, uint number B = 0, we test:
9.6.2. multiply([A],1) = [A]
For random Fixed number [A] = 10^{32}, uint number B = 1, we test:
9.6.3. multiply([A],B) = multiply([B],A)
For random two uint numbers A = 10^{12}, B = 10^{12}, we test:
9.6.4. multiply(intToFixed(2^128-1),one) should pass
- For two uint numbers A = 2^{128} - 1, B = 1, we test IntToFixed(A) * B should return exact result.
9.6.5. multiply(intToFixed(2^64),2^64) should overflow
For two uint numbers A = 2^{64}, B = 2^{64}, we test:
- IntToFixed(A) * B should
overflow. - IntToFixed(A - 1) * (B + 2) should
overflow.
9.6.6. multiply(Fixed([2^256]),1)) should overflow
For Fixed number [A] = 2^{256} and uint number B = 1, we test:
- [A] * B should
overflow. - [(A - 1)] * (B + 1) should
overflow.
9.7. multiplyTruncating(Fixed, uint)
9.7.1. multiplyTruncating([A],0) = 0
For random Fixed number [A] = 10^{32} and uint number B = 0, we test:
9.7.2. multiplyTruncating([A],1) = A
For random Fixed number [A] = 10^{32} and uint number B = 1, we test:
9.7.3. multiplyTruncating([A],B) = multiplyTruncating([B],A)
For random two uint numbers A = 10^{12}, B = 10^{12}, we test:
9.7.4. multiplyTruncating(intToFixed(2^128-1),one) should pass
- For two uint numbers A = 2^{128} - 1, B = 1, we test IntToFixed(A) * B should return exact result.
9.7.5. multiplyTruncating(Fixed([2^128]),2^256)) should overflow
For Fixed number [A] = 2^{128} and uint number B = 2^{256}, we test:
- [A] * B should
overflow. - [(A - 1)] * B should
overflow.
9.7.6. multiplyTruncating(Fixed([2^256]),1)) should overflow
For Fixed number [A] = 2^{256} and uint number B = 1, we test:
- [A] * B should
overflow. - [(A - 1)] * (B + 1) should
overflow.
9.8. divide(Fixed, Fixed)
9.8.1. divide([A],[0]) should throw error Division by zero
For two Fixed numbers [A] = 10^{32} (random), [B] = 0, we test:
- [A] / [B] should throw error
Division by zero.
9.8.2. divide([A],one) = [A]
For two Fixed numbers [A] = 10^{32} (random), [B] = 2^128, we test:
9.8.3. divide([A],[B]) should pass
For random two Fixed numbers [A] = 2, [B] = 2, we test [A] / [B] should return exact result.
9.8.4. divide(intToFixed(2^128-1),one) should pass
- For uint numbers A = 2^{128} - 1 and
Fixed[B] = 2^{128}, we test IntToFixed(A) / [B] should return exact result.
9.8.5. divide(Fixed([2^256-1]),one) should pass
For random two uint numbers [A] = 2^{256} -1, [B] = 2^{128}, we test [A] / [B] should return exact result.
9.8.6. divide(intToFixed(2^64),intToFixed(1 / 2^64)) should overflow
For random two uint numbers A = 2^{64}, B = 1 / 2^{64}, we test:
- IntToFixed(A) / IntToFixed(B) should
overflow.
9.8.7. Should throw error Division by zero
For two uint numbers A < 2^{128} - 1, B = 0, we test A / B should throw error Division by zero.
9.8.8. Should perfect division
For three uint numbers A = 5, B = 2 and C = 10, we test:
9.8.9. Should division success in edge case
For two uint number A = 2^128 - 1, B = 1. We test A / B should return exact result.
9.9. divide(uint, uint)
9.9.1. divide(A,0) should throw error Division by zero
For two uint numbers A = 2 (random), B = 0, we test:
- A / B should throw error
Division by zero.
9.9.2. divide(A,1) = [A]
For two uint numbers A = 2 (random), B = 1, we test:
9.9.3. divide(A,B) should pass
For random two uint numbers A = 2, B = 2, We test A / B should return exact result.
9.9.4. divide(2^128-1,one) should pass
- For random two uint numbers A = 2^{128} - 1, B = 1, we test A / B should return exact result.
9.9.5. Should throw error Division by zero
For two uint numbers A < 2^{128} - 1, B = 0, we test A / B should throw error Division by zero.
9.9.6. Should perfect division
For three uint numbers A = 5, B = 2 and C = 10, we test:
9.9.7. Should throw overflow
For two uint numbers A = 2^{128}, B = 1, we test A / B should throw error overflow.
9.10. divide(Fixed, uint)
9.10.1. divide([A],0) should throw error Division by zero
For random Fixed number [A] = 10^{12} (random), uint number B = 0, we test:
- [A] / B should throw error
Division by zero.
9.10.2. divide([A],1) = [A]
For random Fixed number [A] = 10^{12} (random), uint number B = 1, we test:
9.10.3. divide([A],B) should pass
For random Fixed number [A] = 10^{12}, uint number B = 2, We test [A] / B should return exact result.
9.10.4. divide(intToFixed(2^128-1),1) should pass
- For random two uint numbers A = 2^{128} - 1, B = 1, we test IntToFixed(A) / B should return exact result.
9.10.5. divide(Fixed([2^256-1]),1) should pass
For random Fixed numbers [A] = 2^{256} - 1, uint number B = 1, we test [A] / B should return exact result.
9.10.6. Should divide success
For three uint numbers A = 5, B = 2 and C = 10, we test:
9.10.7. Should throw error division by zero
For two uint numbers A < 2^{128} - 1, B = 0, we test A / B should throw error Division by zero.
9.10.8. Should division success in edge case
For two uint numbers A < 2^{128} - 1, B = 1, we test A / B should give exact result.
10.TokenS420
10.1. construction
10.1.1. Token name
We test if TokenS420 deployed, then deployed token name is TokenS420.
10.1.2. Token symbol
We test if TokenS420 deployed, then deployed token symbol is TokenS420.
10.2. registerStakingPool
10.2.1. Staking Pool has been registered
We test if Staking Pool has been registered, then throw error Staking Pool has been registered.
10.2.2. Staking Pool has not registered yet
We test if Staking Pool has been registered, then check Staking Pool address.
10.3. totalSupply
10.3.1. Calculate totalSupply correctly
We test total supply of the tokens.
10.4. balanceOf
10.4.1. Calculate balance correctly
We test balance of the tokens.
10.5. mint discount factor
10.5.1. Fail for not Staking Pool
We test if caller is not Staking Pool then throw error.
10.5.2. Mint exactly
We test if Staking Pool can mint token with given amount.
10.6. burn
10.6.1. Fail for not Staking Pool
We test if caller is not Staking Pool then throw error.
10.6.2. Burn exactly
We test if Staking Pool can burn token with given amount.
10.6.3. Burn more than balance
We test if Staking Pool can burn token amount more than balance.
10.7. transfer
10.7.1. Transfer successfully
We test if can transfer token with given amount.
11. Auction Manager Case
11.1. Day 1 total deposit is greater than soft floor deposit then user withdraws
We test if user deposit more than softFloorDeposit, then user calls withdraw to collect tokens of day 1.
11.2. Day 2 total deposit is less than soft floor deposit then user withdraws
We test if user deposit less than softFloorDeposit, then user calls withdraw to collect tokens of day 2.
11.3. Day 3 total deposit is greater than soft floor deposit but user does not withdraw
We test if user deposit more than softFloorDeposit, then user doesn't collect tokens of day 3.
11.4. Day 4 total deposit is equal to soft floor deposit then user withdraws
We test if user deposit equal to softFloorDeposit, then user calls withdraw to collect tokens of day 3 and 4.
11.5. Day 5 total deposit is less than soft floor deposit but user does not withdraw
We test if user deposit less than softFloorDeposit, then user doesn't collect tokens of day 5.
11.6. Day 6 total deposit is less than soft floor deposit then user withdraws
We test if user deposit less than softFloorDeposit, then user calls withdraw to collect tokens of day 5 and 6.
11.7. Day 7 total deposit is greater than soft floor deposit but user does not withdraw
We test if user deposit more than softFloorDeposit, then user doesn't collect tokens of day 7.
11.8. Day 8 total deposit is less than soft floor deposit but user does not withdraw
We test if user deposit less than softFloorDeposit, then user doesn't collect tokens of day 8.
11.9. Day 9 total deposit is equal to soft floor deposit then user withdraws
We test if user deposit equal to softFloorDeposit, then user calls withdraw to collect tokens of day 7, 8, and 9.
12. Staking Case
12.1. Day 2 stake token success
We test if user stake 1 token, we check:
- productOfInterestRate
- balance420D
- totalSupply
- poolBalance
- convertedCapital
- balanceS420D
12.2. Day 3 unstake part 1 of token
We test if user unstake 1 token, we check:
- chargedFee
- balance420D
- totalSupply
- poolBalance
- convertedCapital
- balanceS420D
12.3. Day 3 unstake part 2 of token
We test if user unstake 2 token, we check:
- chargedFee
- balance420D
- totalSupply
- poolBalance
- convertedCapital
- balanceS420D
12.4. Day 3 unstake part 3 of token
We test if user unstake 3 token, we check:
- chargedFee
- balance420D
- totalSupply
- poolBalance
- convertedCapital
- balanceS420D
12.5. Day 4 stake token success
We test if user stake 1 token, we check:
- productOfInterestRate
- balance420D
- totalSupply
- poolBalance
- convertedCapital
- balanceS420D
12.6. Day 5 unstake part 1 of token
We test if user unstake 1 token, we check:
- chargedFee
- balance420D
- totalSupply
- poolBalance
- convertedCapital
- balanceS420D
12.7. Day 5 unstake part 2 of token
We test if user unstake 2 token, we check:
- chargedFee
- balance420D
- totalSupply
- poolBalance
- convertedCapital
- balanceS420D
12.8. Day 5 unstake part 3 of token
We test if user unstake 3 token, we check:
- chargedFee
- balance420D
- totalSupply
- poolBalance
- convertedCapital
- balanceS420D
12.9. Day 6 check total supply and balance token
We test if user do nothing, we check:
- productOfInterestRate
- totalSupply
- poolBalance
- convertedCapital
- balanceS420D
12.10. Day 7 check total supply and balance token
We test if user do nothing, we check:
- productOfInterestRate
- totalSupply
- poolBalance
- convertedCapital
- balanceS420D
12.11. Day 8 check total supply and balance token
We test if user do nothing, we check:
- productOfInterestRate
- totalSupply
- poolBalance
- convertedCapital
- balanceS420D
12.12. Day 9 check total supply and balance token
We test if user do nothing, we check:
- productOfInterestRate
- totalSupply
- poolBalance
- convertedCapital
- balanceS420D
12.13. Day 10 unstake all token
We test if user unstake all token, we check:
- chargedFee
- balance420D
- totalSupply
- poolBalance
- convertedCapital
- balanceS420D
13. Treasury Case
13.1. Day 1 auction total deposit is greater than 0 then user do NOT claim token
We test if user deposit and auction total deposit is greater than 0, then user can withdraw token but do NOT claim token, we check:
- cash_balance_treasury_before
- cash_balance_treasury_after
13.2. Day 2 auction total deposit is equal 0 and treasury do NOT receive cash
We test if user deposit and auction total deposit is equal 0 and treasury do NOT receive cash, we check:
- cash_balance_treasury_before
- cash_balance_treasury_after
13.3. Day 3 auction total deposit is greater than 0 then user 1 do NOT withdraw token but buy back
We test if user deposit and auction total deposit is greater than 0, then user do NOT withdraw token but user claim token, we check:
- token_total
- cash_balance_treasury_before
- cash_balance_treasury_after
- cash_IFund
- cash_AFund
- token_ubalance
- cash_move_to_user
- cash_move_from_treasury
13.4. Day 4 auction total deposit is greater than 0 then withdraw and claim all token for user 1,3,5,7,9
We test if user deposit and auction total deposit is greater than 0 then user withdraw token and claim token, we check:
- token_total
- cash_balance_treasury_before
- cash_balance_treasury_after
- cash_IFund
- cash_AFund
- token_ubalance
- cash_move_to_user
- cash_move_from_treasury
13.5. Day 5 auction total deposit is equal 0 then user 2 claim token
We test if user deposit and auction total deposit is equal 0 then user 2 claim token, we check:
- token_total
- cash_balance_treasury_before
- cash_balance_treasury_after
- cash_IFund
- cash_AFund
- token_ubalance
- cash_move_to_user
- cash_move_from_treasury
13.6. Day 6 auction total deposit is greater than 0 but user 2 do NOT withdraw token
We test if user deposit and total deposit is greater than 0 then user 2 claim token, throw exception Unable to calculate withdrawal parts.
13.7. Day 7 auction total deposit is equal 0 and treasury do NOT receive cash and user do NOT claim
We test if user deposit and auction total deposit is equal 0 and treasury do NOT receive cash, we check:
- cash_balance_treasury_before
- cash_balance_treasury_after
13.8. Day 8 auction total deposit is greater than 0 then withdraw token and claim token for user 1..9
We test if user deposit and auction total deposit is greater than 0 then user withdraw token and claim token, we check:
- token_total
- cash_balance_treasury_before
- cash_balance_treasury_after
- cash_IFund
- cash_AFund
- token_ubalance
- cash_move_to_user
- cash_move_from_treasury
14. Migration
14.1. Update and Migration permission
We test how the entire system migration process.
- Admin first call DaoManager prepareForMigration. At this time, users still can bid to auction and stake, unstake and all other normal activities
-
Admin then call DaoManager for nextAuction. At this time :
- No one can bid to auction or stake/unstake
- Users still can do other operations : claim past auctions, buyBack
-
We clone all the contract V1 to the new one V2 (copy all its state and move all its funds)
-
Admin call to replace DaoManagerV2 and StakingPoolV2. At this time
- Existing users should see their 420 tokens unchanged
- Their might be changes in their s420 tokens, but it shouldn't be empty
- Users having s420 can unstake
- User start to bid to auction, stake, unstake as normal again
- User can buyBack
This test doesn't check the number precisions. It just check that the migration process is well migrated to the new one. It also check at certain step, the corresponding functionalities are blocked as expected
15. Complex Staking Case
15.1. Day 2 user 3-6 stakes
We test if multiple user only stakes tokens, then check
- totalSupply
- balance420D
- poolBalance
- convertedCapital
- balanceS420D
- productOfInterestRate
15.2. Day 3 user 3-5 stakes
We test if multiple user only stakes tokens, then check
- totalSupply
- balance420D
- poolBalance
- convertedCapital
- balanceS420D
- productOfInterestRate
15.3. Day 4 user 3-6 stakes
We test if multiple user only stakes tokens, then check
- totalSupply
- balance420D
- poolBalance
- convertedCapital
- balanceS420D
- productOfInterestRate
15.4. Day 5 user do not stakes
We test if multiple user do not stakes stakes tokens, then check
- totalSupply
- balance420D
- poolBalance
- convertedCapital
- balanceS420D
- productOfInterestRate
15.5. Day 6 user 3-6 stakes
We test if multiple user stakes stakes tokens, then check
- totalSupply
- balance420D
- poolBalance
- convertedCapital
- balanceS420D
- productOfInterestRate
15.6. Day 7 user 3-6 unstakes part of the tokens
We test if multiple user only unstakes part of the tokens, then check
- totalSupply
- balance420D
- poolBalance
- convertedCapital
- balanceS420D
- productOfInterestRate
15.7. Day 8 user 3,4,5 unstakes all
We test if multiple user 3,4,5 unstakes all tokens, then check
- totalSupply
- balance420D
- poolBalance
- convertedCapital
- balanceS420D
- productOfInterestRate
15.8. Day 9 user 6 do not unstakes
We test if user 6 do not unstakes tokens, then check
- totalSupply
- balance420D
- poolBalance
- convertedCapital
- balanceS420D
- productOfInterestRate
15.9. Day 10 user 6 unstakes all
We test if multiple user 6 unstakes all tokens, then check
- totalSupply
- balance420D
- poolBalance
- convertedCapital
- balanceS420D
- productOfInterestRate
16. Auction Manager Case V2
16.1. Day 1 total deposit is greater than soft floor deposit then user withdraws
We test if user deposit more than softFloorDeposit, then user calls withdraw to collect tokens of day 1.
16.2. Day 2 total deposit is less than soft floor deposit then user withdraws
We test if user deposit less than softFloorDeposit, then user calls withdraw to collect tokens of day 2.
16.3. Day 3 total deposit is greater than soft floor deposit but user does not withdraw
We test if user deposit more than softFloorDeposit, then user doesn't collect tokens of day 3.
16.4. Day 4 total deposit is equal to soft floor deposit then user withdraws
We test if user deposit equal to softFloorDeposit, then user calls withdraw to collect tokens of day 3 and 4.
16.5. Day 5 total deposit is less than soft floor deposit but user does not withdraw
We test if user deposit less than softFloorDeposit, then user doesn't collect tokens of day 5.
16.6. Day 6 migration V2
We migrate DAO from V1 to V2.
16.7. Day 6 total deposit is less than soft floor deposit then user withdraws
We test if user deposit less than softFloorDeposit, then user calls withdraw to collect tokens of day 5 and 6.
16.8. Day 7 total deposit is greater than soft floor deposit but user does not withdraw
We test if user deposit more than softFloorDeposit, then user doesn't collect tokens of day 7.
16.9. Day 8 total deposit is less than soft floor deposit but user does not withdraw
We test if user deposit less than softFloorDeposit, then user doesn't collect tokens of day 8.
16.10. Day 9 total deposit is equal to soft floor deposit then user withdraws
We test if user deposit equal to softFloorDeposit, then user calls withdraw to collect tokens of day 7, 8, and 9.
17. Staking Case V2
17.1. Day 2 stake token success
We test if user stake 1 token, we check:
- productOfInterestRate
- balance420D
- totalSupply
- poolBalance
- convertedCapital
- balanceS420D
17.2. Day 3 unstake part 1 of token
We test if user unstake 1 token, we check:
- chargedFee
- balance420D
- totalSupply
- poolBalance
- convertedCapital
- balanceS420D
17.3. Day 3 unstake part 2 of token
We test if user unstake 2 token, we check:
- chargedFee
- balance420D
- totalSupply
- poolBalance
- convertedCapital
- balanceS420D
17.4. Day 3 unstake part 3 of token
We test if user unstake 3 token, we check:
- chargedFee
- balance420D
- totalSupply
- poolBalance
- convertedCapital
- balanceS420D
17.5. Day 4 stake token success
We test if user stake 1 token, we check:
- productOfInterestRate
- balance420D
- totalSupply
- poolBalance
- convertedCapital
- balanceS420D
17.6. Day 5 migration V2
We migrate DAO from V1 to V2.
17.7. Day 5 unstake part 1 of token
We test if user unstake 1 token, we check:
- chargedFee
- balance420D
- totalSupply
- poolBalance
- convertedCapital
- balanceS420D
17.8. Day 5 unstake part 2 of token
We test if user unstake 2 token, we check:
- chargedFee
- balance420D
- totalSupply
- poolBalance
- convertedCapital
- balanceS420D
17.9. Day 5 unstake part 3 of token
We test if user unstake 3 token, we check:
- chargedFee
- balance420D
- totalSupply
- poolBalance
- convertedCapital
- balanceS420D
17.10. Day 6 check total supply and balance token
We test if user do nothing, we check:
- productOfInterestRate
- totalSupply
- poolBalance
- convertedCapital
- balanceS420D
17.11. Day 7 check total supply and balance token
We test if user do nothing, we check:
- productOfInterestRate
- totalSupply
- poolBalance
- convertedCapital
- balanceS420D
17.12. Day 8 check total supply and balance token
We test if user do nothing, we check:
- productOfInterestRate
- totalSupply
- poolBalance
- convertedCapital
- balanceS420D
17.13. Day 9 check total supply and balance token
We test if user do nothing, we check:
- productOfInterestRate
- totalSupply
- poolBalance
- convertedCapital
- balanceS420D
17.14. Day 10 unstake all token
We test if user unstake all token, we check:
- chargedFee
- balance420D
- totalSupply
- poolBalance
- convertedCapital
- balanceS420D
18. Treasury Case V2
18.1. Day 1 auction total deposit is greater than 0 then user do NOT claim token
We test if user deposit and auction total deposit is greater than 0, then user can withdraw token but do NOT claim token, we check:
- cash_balance_treasury_before
- cash_balance_treasury_after
18.2. Day 2 auction total deposit is equal 0 and treasury do NOT receive cash
We test if user deposit and auction total deposit is equal 0 and treasury do NOT receive cash, we check:
- cash_balance_treasury_before
- cash_balance_treasury_after
18.3. Day 3 auction total deposit is greater than 0 then user 1 do NOT withdraw token but claim token
We test if user deposit and auction total deposit is greater than 0, then user do NOT withdraw token but user claim token, we check:
- token_total
- cash_balance_treasury_before
- cash_balance_treasury_after
- cash_IFund
- cash_AFund
- token_ubalance
- cash_move_to_user
- cash_move_from_treasury
18.4. Day 4 auction total deposit is greater than 0 then migration V2 and withdraw token
We test if user deposit and auction total deposit is greater than 0 then migrate DAO V1 to V2.
18.5. Day 5 claim all token for user 1,3,5,7,9
We test if user deposit and auction total deposit is greater than 0 then user withdraw token and claim token, we check:
- token_total
- cash_balance_treasury_before
- cash_balance_treasury_after
- cash_IFund
- cash_AFund
- token_ubalance
- cash_move_to_user
- cash_move_from_treasury
18.6. Day 6 auction total deposit is equal 0 then user 2 claim token
We test if user deposit and auction total deposit is equal 0 then user 2 claim token, we check:
- token_total
- cash_balance_treasury_before
- cash_balance_treasury_after
- cash_IFund
- cash_AFund
- token_ubalance
- cash_move_to_user
- cash_move_from_treasury
18.7. Day 7 auction total deposit is greater than 0 then user 2 do NOT withdraw token
We test if user deposit and auction total deposit is equal 0 then user 2 claim token, throw exception Unable to calculate withdrawal parts.
18.8. Day 8 auction total deposit is equal 0 and treasury do NOT receive cash and user do NOT claim
We test if user deposit and auction total deposit is equal 0 and treasury do NOT receive cash, we check:
- cash_balance_treasury_before
- cash_balance_treasury_after
18.9. Day 9 auction total deposit is greater than 0 then withdraw token and claim token for user 1..9
We test if user deposit and auction total deposit is greater than 0 then user withdraw token and claim token, we check:
- token_total
- cash_balance_treasury_before
- cash_balance_treasury_after
- cash_IFund
- cash_AFund
- token_ubalance
- cash_move_to_user
- cash_move_from_treasury
19. Complex Staking Case V2
19.1. Day 2 user 3-6 stakes
We test if multiple user only stakes tokens, then check
- totalSupply
- balance420D
- poolBalance
- convertedCapital
- balanceS420D
- productOfInterestRate
19.2. Day 3 user 3-5 stakes
We test if multiple user only stakes tokens, then check
- totalSupply
- balance420D
- poolBalance
- convertedCapital
- balanceS420D
- productOfInterestRate
19.3. Day 4 user 3-6 stakes
We test if multiple user only stakes tokens, then check
- totalSupply
- balance420D
- poolBalance
- convertedCapital
- balanceS420D
- productOfInterestRate
19.4. Day 5 migration V2
We migrate DAO from V1 to V2.
19.5. Day 5 user do not stakes
We test if multiple user do not stakes stakes tokens, then check
- totalSupply
- balance420D
- poolBalance
- convertedCapital
- balanceS420D
- productOfInterestRate
19.6. Day 6 user 3-6 stakes
We test if multiple user stakes stakes tokens, then check
- totalSupply
- balance420D
- poolBalance
- convertedCapital
- balanceS420D
- productOfInterestRate
19.7. Day 7 user 3-6 unstakes part of the tokens
We test if multiple user only unstakes part of the tokens, then check
- totalSupply
- balance420D
- poolBalance
- convertedCapital
- balanceS420D
- productOfInterestRate
19.8. Day 8 user 3,4,5 unstakes all
We test if multiple user 3,4,5 unstakes all tokens, then check
- totalSupply
- balance420D
- poolBalance
- convertedCapital
- balanceS420D
- productOfInterestRate
19.9. Day 9 user 6 do not unstakes
We test if user 6 do not unstakes tokens, then check
- totalSupply
- balance420D
- poolBalance
- convertedCapital
- balanceS420D
- productOfInterestRate
19.10. Day 10 user 6 unstakes all
We test if multiple user 6 unstakes all tokens, then check
- totalSupply
- balance420D
- poolBalance
- convertedCapital
- balanceS420D
- productOfInterestRate
21. WhiteList
21.1. constructor
21.1.1. correct admin
We test when WhiteList is deployed, whether admin is the address of the deployer.
21.1.2. correct cash
We test when WhiteList is deployed, whether cash is the correct ERC-20 token we use.
21.1.3. correct token
We test when WhiteList is deployed, whether token is contract Token420.
21.1.4. correct expirationD2
We test when WhiteList is deployed, whether expirationD2 is equal to the deploying timestamp plus the durationD1 and the durationD2 we have deployed.
21.1.5. correct dao address
We test when WhiteList is deployed, whether dao is the address of the deployer.
21.1.6. correct balance token
We test when WhiteList is deployed, whether balance token of the deployer.
21.1.7. correct tokenPrice
We test when WhiteList is deployed, whether tokenPrice is the correct value we have deployed.
21.2. registerUsers
21.2.1. registerUsers successfully
We test if admin calls registerUsers before expirationD2 with a valid list of addresses, those addresses should be registered.
21.2.2. registerUsers failed from sender different from admin
We test if an address different from admin calls registerUsers will cause revert.
21.2.3. registerUsers failed when list user empty
We test if admin calls registerUsers with list of addresses is empty will cause revert.
21.2.4. registerUsers failed when user is zero address
We test if admin calls registerUsers with a list of addresses that has a user is zero address will cause revert.
21.2.5. registerUsers failed when add duplicated user
We test if admin calls registerUsers with a list of addresses that has a user duplicated within the list or with registered user will cause revert.
21.3. removeUsers
21.3.1. removeUsers successfully
We test if admin calls removeUsers before expirationD2 with a valid list of addresses, those addresses should be registered.
21.3.2. removeUsers failed from sender different from admin
We test if an address different from admin calls removeUsers will cause revert.
21.3.3. removeUsers failed when list user empty
We test if admin calls removeUsers with list of addresses is empty will cause revert.
21.3.4. removeUsers failed when user is deposit
We test if admin calls removeUsers after expirationD2 will cause revert.
21.4. buy
21.4.1. buy successfully
We test if a member calls buy successfully before deadline with amounts that don't exceed depositLimit in total.
21.4.2. throw error when user not in whitelist before expiration date 1
We test if a member calls buy when user is not in whitelist and timestamp less than expirationD1 will cause revert.
21.4.3. throw error when buy more than whitelist max amount
We test if a member calls buy when amount is greater than WHITELIST_MAX_USD will cause revert.
21.4.4. throw error when buy amount is 0
We test if a member calls buy when amount is 0 will cause revert.
21.4.5. throw error when buy more than whitelist max token amount
We test if a member calls buy after timestamp expirationD1 when token is greater than WHITELIST_TOKEN_AMOUNT will cause revert.
21.4.6. throw error after expirationD2
We test if a member calls buy after expirationD2 will cause revert.
21.5. withdrawCash
21.5.1. withdrawCash successfully
We test if admin calls withdrawCash successfully.
21.5.2. withdrawCash unsuccessfully from sender different from admin
We test if an address different from admin calls withdrawCash will cause revert.
21.5.3. withdrawCash unsuccessfully when there is no cash to withdraw
We test if members cannot call withdrawCash when there is no cash to withdraw.
21.6. closeAndTransferToTreasury
21.6.1. closeAndTransferToTreasury successfully
We test if admin calls closeAndTransferToTreasury successfully.
21.6.2. closeAndTransferToTreasury unsuccessfully from sender different from admin
We test if an address different from admin calls closeAndTransferToTreasury will cause revert.
21.6.3. closeAndTransferToTreasury unsuccessfully when after expirationD2
We test if admin calls closeAndTransferToTreasury with expirationD2 greater than curent time will cause revert.
21.6.4. closeAndTransferToTreasury unsuccessfully when there is no cash to withdraw
We test if members cannot call closeAndTransferToTreasury when there is no cash to withdraw.
21.7. closeAndTransferToAccount
21.7.1. closeAndTransferToAccount successfully
We test if admin calls closeAndTransferToAccount successfully.
21.7.2. closeAndTransferToAccount unsuccessfully from sender different from admin
We test if an address different from admin calls closeAndTransferToAccount will cause revert.
21.7.3. closeAndTransferToAccount unsuccessfully when after expirationD2
We test if admin calls closeAndTransferToAccount with expirationD2 less than curent time will cause revert.
21.7.4. closeAndTransferToAccount unsuccessfully when there is no cash to withdraw
We test if members cannot call closeAndTransferToAccount when there is no cash to withdraw.
22. WhiteList Staking
22.1. stake
22.1.1. User white list stakes in day 0
We test when WhiteList is deployed, we check token reward of user in day 1.
23. WhiteList AuctionManager
23.1. withdraw
23.1.1. single user withdraw maximum token emission when deposit of previous auction is equal to init softFloorDeposit
We test if user deposit of previous auction is equal to softFloorDeposit, then user can withdraw maximum token emission.
23.1.2. single user withdraw maximum token emission when deposit of previous auction is more than init softFloorDeposit
We test if user deposit of previous auction is more than softFloorDeposit, then user can withdraw maximum token emission.
23.1.3. single user withdraw less than maximum token emission when deposit of previous auction is less than init softFloorDeposit
We test if user deposit of previous auction is less than softFloorDeposit, then user can withdraw less than maximum token emission.
23.1.4. single user withdraw in extreme case when they deposit 1 (10^(-18))
We test if user deposit of previous auction is equal to 1 (10^{-18)}), then user can withdraw token.
23.2. withdrawableTokenAmountOf
23.2.1. correct withdrawable token amount after auction inflation
We test if the withdrawable token amount is updated correctly after daily inflation of auction.
23.2.2. correct withdrawable token amount after deposit
We test if the withdrawable token amount is updated correctly after the user deposits.
23.2.3. correct withdrawable token amount after token withdrawal
We test if the withdrawable token amount is updated correctly after the user withdraws.
23.2.4. correct withdrawable token amount after deposit and withdrawal in a same auction
We test if the withdrawable token amount is updated correctly after the user deposits and withdraws in a same auction.
24. EarlySupporterPool
24.1. construction
24.1.1. Token address
We test if EarlySupporterPool deployed, then deployed Token address is registered to Early Supporter Pool.
24.1.2. Mirror address
We test if EarlySupporterPool deployed, then deployed Mirror address is registered to Early Supporter Pool.
24.2. updateAdmin
24.2.1. Should catch error Permission: Unauthorized
We test if an address different from admin calls updateAdmin will cause revert.
24.2.2. Should catch error Invalid new admin address
We test if the parameters address is 1 zero address or current admin address will cause revert.
24.2.3. updateAdmin successfully
We test if the address admin is updated correctly after calls updateAdmin.
24.3. fetch
24.3.1. fetch token successfully
We test if totalFetched is updated correctly after after calls fetch.
24.4. register
24.4.1. Should catch error Permission: Unauthorized
We test if an address different from admin calls register will cause revert.
24.4.2. Should catch error Empty argument prohibited
We check if the address list is empty will cause revert.
24.4.3. Should catch error Inconsistent lengths
We check if the number of elements in the address list is different from the number of elements in the weight list will cause revert.
24.4.4. Should catch error Weights has been initialized
We check if total weights has been initialized will cause revert..
24.4.5. Should catch error Excessive weights
We check if the weight exceeds 100 will cause revert.
24.4.6. Should catch error Invalid investor address
We check if the investor address is Zero address or Admin address will cause revert.
24.4.7. Should catch error Weight must be greater than 0
We check if the weight is equal 0 will cause revert.
24.4.8. register successfully
We test if the weight of address is updated correctly after calls register.
24.5. moveOwnership
24.5.1. Should catch error Weight must be greater than 0
We check if transfer weight equal 0, will cause revert.
24.5.2. Should catch error Excessive tranferable weight
We test if the address transfer exceeds their weight will cause revert.
24.5.3. Move successfully with empty Mirror Pool
We test if mirror pool is empty, the weight of address is transfered correctly after calls moveOwnership.
24.5.4. Move successfully with none empty Mirror Pool
We test if mirror pool is not empty, the weight of address is transfered correctly after calls moveOwnership.
24.6. claim
24.6.1. claim successfully simple case
We test if the token amount is updated correctly after calls claim.
24.6.2. claim successfully complex case
We check if the token amount over several days are updated correctly after calling claim.
25. MultiSend
25.1. deployment
25.1.1. correct owner
We test when MultiSend is deployed, owner is deployer address
25.1.2. correct 420 token
We test when MultiSend is deployed, 420 token address set exactly
25.1.3. correct s420 token
We test when MultiSend is deployed, s420 token address set exactly
25.1.4. correct minFeeFree
We test when MultiSend is deployed, minFeeFree is equal to 0
25.1.5. correct feePercent
We test when MultiSend is deployed, feePercent is equal to 0
25.2. multisendTokenERC20
25.2.1. The receiver list is empty
We test if receiver list is empty, then throw error MultiSend: The receiver list is empty.
25.2.2. Inconsistent lengths
We test if the length of receiver list and balances list is not matched, then throw error MultiSend: Inconsistent lengths.
25.2.3. Send token 420 or s420 successfully without fee
We test if sender send token 420 or s420 tokens, then contract will NOT received any token fee.
25.2.4. Send other token successfully without fee
We test if sender send tokens that different from 420 and s420 token, then contract will NOT received any token fee in 3 following cases:
- Do not set min fee free and fee percent yet.
- Total 420 + s420 balance of sender greater than min fee free and fee percent is 10%
- Total 420 + s420 balance of sender less than min fee free but fee percent is 0%
25.2.5. Send other token successfully with fee
We test if sender send tokens that different from 420 and s420 token, then contract will received 5% token fee when min fee free greater than total 420 + s420 balance and fee percent is 5%
25.3. multisendNative
25.3.1. The receiver list is empty
We test if receiver list is empty, then throw error MultiSend: The receiver list is empty.
25.3.2. Inconsistent lengths
We test if the length of receiver list and balances list is not matched, then throw error MultiSend: Inconsistent lengths.
25.3.3. Send successfully without fee
We test if sender send native token without fee in 3 following cases:
- Do not set min fee free and fee percent yet.
- Total 420 + s420 balance of sender greater than min fee free and fee percent is 10%
- Total 420 + s420 balance of sender less than min fee free but fee percent is 0%
25.3.4. Send successfully with fee
We test if sender send native tokens, then contract will received 5% fee when min fee free greater than total 420 + s420 balance of sender and fee percent is 5%
25.3.5. Insufficient funds
We test if sender send native tokens, require native token is less than total send and fee, will throw error MultiSend: Insufficient funds.
25.4. claimFeeTokenERC20
25.4.1. Claim token successfully
We test if there are tokens exist in contract, owner can withdraw it.
25.5. claimNative
25.5.1. Claim token successfully
We test if there are ETH exist in contract, owner can withdraw it.
25.6. setMinFeeFree
25.6.1. caller is not the owner
We test if not the owner set minFeeFree, then throw error Ownable: caller is not the owner.
25.6.2. Set successfully
We test if the owner set minFeeFree, then set minFeeFree will successfully.
25.7. setFeePercent
25.7.1. caller is not the owner
We test if not the owner set feePercent, then throw error Ownable: caller is not the owner.
25.7.2. Invalid fee percentage
We test if the owner set feePercent with value greater than 100%, then throw error MultiSend: Invalid fee percentage.
25.7.3. Set successfully
We test if the owner set feePercent, then set feePercent will successfully.
26. OpPusher
26.1. construction
26.1.1. Admin address
We test when OpPusher is deployed, admin is deployer address
26.1.2. Mirror address
We test when OpPusher is deployed, Mirror Pool contract address is exactly
26.1.3. Treasury address
We test when OpPusher is deployed, Treasury contract address is exactly
26.1.4. Cold wallet addresses
We test when OpPusher is deployed, token cold wallet and cash cold wallet are Zero address
26.2. updateAdmin
26.2.1. Should catch error Permission: Unauthorized
We test if an address different from admin calls updateAdmin will cause revert.
26.2.2. Should catch error Invalid admin address
We test if the parameters address is Zero address or current admin address will cause revert.
26.2.3. updateAdmin successfully
We test if the address admin is updated correctly after calls updateAdmin.
26.3. setTokenColdWallet
26.3.1. Should catch error Permission: Unauthorized
We test if an address different from admin calls setTokenColdWallet will cause revert.
26.3.2. Should catch error Invalid address
We test if new wallet address is Zero address or current wallet address will cause revert.
26.3.3. Set successfully
We test if new wallet address is not Zero address or current wallet address will success
26.4. setCashColdWallet
26.4.1. Should catch error Permission: Unauthorized
We test if an address different from admin calls setCashColdWallet will cause revert.
26.4.2. Should catch error Invalid address
We test if new wallet address is Zero address or current wallet address will cause revert.
26.4.3. Set successfully
We test if new wallet address is not Zero address or current wallet address will success
26.5. push
26.5.1. No tokens and cashes were pushed when cold wallets is not set yet
We test if cold wallets is not set yet, no tokens and cashes were pushed. In other words, token or cash balance of cold wallets is 0
26.5.2. tokens and cashes were pushed when cold wallets were set
We test if cold wallets is set well, tokens and cashes were pushed to cold wallets. In other words, token or cash balance of cold wallets is greater than 0
26.6. pushTest
26.6.1. No tokens and cashes were pushed when cold wallets is not set yet
We test if cold wallets is not set yet, no tokens and cashes were pushed. In other words, token or cash balance of cold wallets is 0
26.6.2. tokens and cashes were pushed when cold wallets were set
We test if cold wallets is set well, tokens and cashes were pushed to cold wallets. In other words, token or cash balance of cold wallets is greater than 0
26.6.3. tokens and cashes were pushed a little bit when cold wallets were set
We test if cold wallets is set well, tokens and cashes were pushed a little bit to cold wallets. In other words, token or cash balance of cold wallets is greater than 0
results matching ""
No results matching ""
If you still have any questions, feel free to reach the 420 DAO team in the discord or telegram channel