Comment on page
Contracts specs
- ✅ registers IContractMeta compatible contract and updates respective view methods - #addresses - #versions - #names - #latestVersion - #versionAddress
Access control
- ✅ allowed: operator (deployer)
- ✅ denied with FRB: random address
- ✅ allowed: protocol admin
Edge cases
- ✅ when new contract major version differs more, than on one reverts with INVA
- ✅ when new contract version lower or equal existing one reverts with INVA
- ✅ when contract has invalid version reverts with INVA
- ✅ when contract name is not alphanumeric reverts with INV
- ✅ when address is already registered reverts with DUP
- ✅ deploys a new contract
- ✅ imestamp timestamp equals #stageParams's block.timestamp + governanceDelay
- ✅ imestamp clears by #commitParams
- ✅ imestamp edge cases when nothing is set returns zero
- ✅ imestamp access control allowed: any address
Access control
- ✅ allowed: any address
Properties
- ✅ updates by #stageParams
- ✅ clears by #commitParams
- ✅ returns correct value
- ✅ s properties @property: updates when committed validator grant for a new address
- ✅ s properties @property: doesn't update when committed validator grant for an existing address
- ✅ s access control allowed: any address
- ✅ returns addresses that has the given permission set to true
Access control
- ✅ allowed: any address
Properties
- ✅ updates by #stagePermissionGrants + #commitPermissionGrants or #revokePermissions
- ✅ is not affected by forceAllowMask
- ✅ returns empty array on unknown permissionId
- ✅ checks if an address has all permissions set to true
Access control
- ✅ allowed: any address
Properties
- ✅ returns false on random address
- ✅ is not affected by staged permissions
- ✅ is affected by committed permissions
- ✅ returns true for any address when forceAllowMask is set to true
Edge cases
- ✅ on unknown permission id returns false
- ✅ returns correct value
- ✅ returns correct value
- ✅ returns correct value
- ✅ returns correct value
- ✅ returns correct value
- ✅ returns true for IProtocolGovernance interface (0xca11fe03)
- ✅ access control: allowed: any address
- ✅ edge cases: when contract does not support the given interface returns false
- ✅ emits ValidatorStaged event
Access control
- ✅ allowed: admin
- ✅ denied: deployer
- ✅ denied: random address
Edge cases
- ✅ when attempting to stage grant to zero address reverts with AZ when target has zero address
- ✅ when attempting to stage grant to zero address reverts with AZ when validator has zero address
- ✅ rolls back all staged validators
- ✅ emits AllStagedValidatorsRolledBack event
Access control
- ✅ allowed: admin
- ✅ denied: deployer
- ✅ denied: random address
- ✅ commits staged validators
- ✅ emits ValidatorCommitted event
Access control
- ✅ allowed: admin
- ✅ denied: deployer
- ✅ denied: random address
Edge cases
- ✅ when attempting to commit validator for zero address reverts with NULL
- ✅ when nothing is staged for the given address reverts with NULL
- ✅ when attempting to commit validator too early reverts with TS
- ✅ emits ValidatorCommitted event
Access control
- ✅ allowed: admin
- ✅ denied: deployer
- ✅ denied: random address
Properties
- ✅ commits all staged validators
- ✅ commits all staged validators after delay
Edge cases
- ✅ when attempting to commit a single validator too early does not commit validator
- ✅ when attempting to commit multiple validators too early does not commit these validators
- ✅ emits ValidatorRevoked event
Edge cases
- ✅ when attempting to revoke from zero address reverts with NULL
- ✅ rolls back all staged permission grants
- ✅ emits AllStagedPermissionGrantsRolledBack event
Access control
- ✅ allowed: admin
- ✅ denied: deployer
- ✅ denied: random address
- ✅ commits staged permission grants
- ✅ emits PermissionGrantsCommitted event
Access control
- ✅ allowed: admin
- ✅ denied: deployer
- ✅ denied: random address
Edge cases
- ✅ when attempting to commit permissions for zero address reverts with NULL
- ✅ when nothing is staged for the given address reverts with NULL
- ✅ when attempting to commit permissions too early reverts with TS
- ✅ emits PermissionGrantsCommitted event
Access control
- ✅ allowed: admin
- ✅ denied: deployer
- ✅ denied: random address
Properties
- ✅ commits all staged permission grants
- ✅ commits all staged permission grants after delay
Edge cases
- ✅ when attempting to commit a single permission too early does not commit permission
- ✅ when attempting to commit multiple permissions too early does not commit these permissions
- ✅ emits PermissionRevoked event
Edge cases
- ✅ when attempting to revoke from zero address reverts with NULL
- ✅ emits ParamsCommitted event
Access control
- ✅ allowed: protocol admin
- ✅ denied: deployer
- ✅ denied: random address
Edge cases
- ✅ when attempting to commit params too early reverts with TS
- ✅ when attempting to commit params without setting pending params reverts with NULL
- ✅ emits PermissionGrantsStaged event
Access control
- ✅ allowed: admin
- ✅ denied: deployer
- ✅ denied: random address
Edge cases
- ✅ when attempting to stage grant to zero address reverts with NULL
- ✅ emits ParamsStaged event
Access control
- ✅ allowed: admin
- ✅ denied: random address
Edge cases
- ✅ when given invalid params when maxTokensPerVault is zero reverts with NULL
- ✅ when given invalid params when governanceDelay is zero reverts with NULL
- ✅ when given invalid params when governanceDelay exceeds MAX_GOVERNANCE_DELAY reverts with LIMO
- ✅ when given invalid params when withdrawLimit less than MIN_WITHDRAW_LIMIT reverts with LIMO
- ✅ creates VaultRegistry
- ✅ initializes ProtocolGovernance address
- ✅ initializes ERC721 token name
- ✅ initializes ERC721 token symbol
- ✅ returns all registered vaults
- ✅ access control: allowed: any address
- ✅ ount returns the number of registered vaults
- ✅ ount access control: allowed: any address
- ✅ ount properties @property: when N new vaults have been registered, vaults count will be increased by N
- ✅ resolves Vault address by VaultRegistry NFT
- ✅ access control: allowed: any address
Edge cases
- ✅ when Vault NFT is not registered in VaultRegistry returns zero address
- ✅ resolves VaultRegistry NFT by Vault address
- ✅ access control: allowed: any address
Edge cases
- ✅ when Vault is not registered in VaultRegistry returns zero
- ✅ checks if token is locked (not transferable)
- ✅ access control: allowed: any address
Edge cases
- ✅ when VaultRegistry NFT is not registered in VaultRegistry returns false
- ✅ returns ProtocolGovernance address
- ✅ access control: allowed: any address
- ✅ returns ProtocolGovernance address staged for commit
- ✅ access control: allowed: any address
- ✅ imestamp returns timestamp after which #commitStagedProtocolGovernance can be called
- ✅ imestamp access control: allowed: any address
- ✅ imestamp edge cases when nothing is staged returns 0
- ✅ imestamp edge cases right after #commitStagedProtocolGovernance was called returns 0
Edge cases
- ✅ when nothing is staged returns zero address
- ✅ right after #commitStagedProtocolGovernance was called returns zero address
- ✅ returns timestamp after which #commitStagedProtocolGovernance can be called
- ✅ access control: allowed: any address
Edge cases
- ✅ when nothing is staged returns 0
- ✅ right after #commitStagedProtocolGovernance was called returns 0
- ✅ returns the number of registered vaults
- ✅ access control: allowed: any address
Properties
- ✅ when N new vaults have been registered, vaults count will be increased by N
- ✅ returns true if this contract supports a certain interface
- ✅ access control: allowed: any address
- ✅ edge cases: when contract does not support the given interface returns false
- ✅ binds minted ERC721 NFT to Vault address and transfers minted NFT to owner specified in args
- ✅ emits VaultRegistered event
- ✅ access control: allowed: any account with Register Vault permissions
- ✅ access control: denied: any other address
- ✅ access control: denied: protocol governance admin
Properties
- ✅ minted NFT equals to vaultRegistry#vaultsCount
Edge cases
- ✅ when address doesn't conform to IVault interface (IERC165) reverts with INVI
- ✅ when vault has already been registered reverts with DUP
- ✅ when owner address is zero reverts with AZ
- ✅ stages new ProtocolGovernance for commit
- ✅ sets the stagedProtocolGovernanceTimestamp after which #commitStagedProtocolGovernance can be called
- ✅ access control: allowed: ProtocolGovernance Admin
- ✅ access control: denied: any other address
- ✅ access control: denied: deployer
Edge cases
- ✅ when new ProtocolGovernance is a zero address reverts with AZ
- ✅ commits staged ProtocolGovernance
- ✅ resets staged ProtocolGovernanceTimestamp
- ✅ resets staged ProtocolGovernance
- ✅ access control: allowed: ProtocolGovernance Admin
- ✅ access control: denied: any other address
Edge cases
- ✅ when nothing is staged reverts with INIT
- ✅ when called before stagedProtocolGovernanceTimestamp reverts with TS
- ✅ when called before stagedProtocolGovernanceTimestamp reverts with TS
- ✅ locks NFT (disables any transfer)
- ✅ emits TokenLocked event
- ✅ access control: allowed: NFT owner
- ✅ access control: denied: any other address
- ✅ access control: denied: protocol admin
Edge cases
- ✅ when NFT has already been locked succeeds
- ✅ returns true if oracle is supported
- ✅ edge cases: when oracle is not supported returns false
- ✅ returns list of supported tokens
- ✅ returns true for ChainlinkOracle interface (0x8e3bd5d7)
- ✅ edge cases: when contract does not support the given interface returns false
- ✅ emits OraclesAdded event
- ✅ when oracles have set by addChainLinkOracles function returns prices
- ✅ edge cases: when arrays have different lengths reverts with INV
- ✅ edge cases: when sender has no admin righs reverts with FRB
- ✅ returns true for IUniV3Oracle interface (0x6d80125b)
- ✅ edge cases: when contract does not support the given interface returns false
- ✅ returns true for IUniV2Oracle interface (0x2748645e)
- ✅ edge cases: when contract does not support the given interface returns false
- ✅ returns true for IUniV3Oracle interface (0x2a3602d6)
- ✅ when contract does not support the given interface returns false
- ✅ when adding [weth, usdc] pools with fee = 500 adds pools
- ✅ when adding [weth, usdc] pools with fee = 3000 adds pools
- ✅ when adding [weth, usdc] pools with fee = 10000 does not return prices
- ✅ deploys a new contract
- ✅ creates a new strategy and initializes it
- ✅ pulls token amounts from fromVault to toVault
- ✅ performs a rebalance according to strategy params
- ✅ deploys a new contract
Edge cases
- ✅ when positionManager_ address is zero reverts with AZ
- ✅ when router_ address is zero passes
- ✅ returns average UniswapV3Pool price tick
- ✅ creates a new strategy and initializes it
Access control
- ✅ allowed: any address
Edge cases
- ✅ when tokens.length is not equal 2 reverts with INVL
- ✅ when erc20Vault vaultTokens do not match tokens_ reverts with INVA
- ✅ when moneyVault vaultTokens do not match tokens_ reverts with INVA
- ✅ when UniSwapV3 pool for tokens does not exist reverts with AZ
- ✅ performs a rebalance according to target ratios when token0/token1 ratio is greater than required
- ✅ performs a rebalance according to target ratios when token0/token1 ratio is less than required
Access control
- ✅ allowed: MStrategy admin
- ✅ allowed: MStrategy operator
- ✅ denied: any other address
Edge cases
- ✅ when absolute tick deviation >= oracle.maxTickDeviation reverts with INVA
- ✅ when tick is greater than tickMax - tickNeiborhood the upper bound of the interval is expanded by tickIncrease amount
- ✅ when tick is less than tickMin + tickNeiborhood the lower bound of the interval is expanded by tickIncrease amount
- ✅ when current tick has not deviated from the previous rebalance tick reverts with LIMU
- ✅ pulls token amounts from fromVault to toVault
Access control
- ✅ allowed: MStrategy admin
- ✅ denied: any other address
Edge cases
- ✅ when token pull amounts are 0 passes
- ✅ sets new params for oracle
- ✅ edge cases: when maxSlippageD is more than DENOMINATOR reverts with INVA
Access control
- ✅ allowed: MStrategy admin
- ✅ denied: any other address
- ✅ sets new ratio params
- ✅ edge cases: tickMin is greater than tickMax reverts with INVA
- ✅ edge cases: when erc20MoneyRatioD is more than DENOMINATOR reverts with INVA
- ✅ edge cases: when minErc20MoneyRatioDeviationD is more than DENOMINATOR reverts with INVA
Access control
- ✅ allowed: MStrategy admin
- ✅ denied: any other address
- ✅ works correctly
- ✅ creates contract