Skip to content

Deploy Arbitrum goerli for usdc native #1976

Deploy Arbitrum goerli for usdc native

Deploy Arbitrum goerli for usdc native #1976

GitHub Actions / Unit Tests succeeded Jul 12, 2023 in 1s

Unit Tests ✅

Tests passed successfully

✅ test-results.json

817 tests were completed in 890s with 812 passed, 0 failed and 5 skipped.

Test suite Passed Failed Skipped Time
plugins/deployment_manager/test/AliasesTest.ts 1✅ 4ms
plugins/deployment_manager/test/CacheTest.ts 6✅ 5ms
plugins/deployment_manager/test/ContractMapTest.ts 2✅ 158ms
plugins/deployment_manager/test/DeploymentManagerTest.ts 17✅ 1⚪ 152s
plugins/deployment_manager/test/DeployTest.ts 2✅ 228ms
plugins/deployment_manager/test/EnactedTest.ts 6✅ 6ms
plugins/deployment_manager/test/MigrationTest.ts 3✅ 1ms
plugins/deployment_manager/test/RelationConfigTest.ts 13✅ 2ms
plugins/deployment_manager/test/RootsTest.ts 1✅ 1ms
plugins/deployment_manager/test/SpiderTest.ts 1✅ 994ms
plugins/deployment_manager/test/VerifyArgsTest.ts 1✅ 148ms
test/absorb-test.ts 8✅ 1⚪ 13s
test/accrue-test.ts 9✅ 10s
test/allow-by-sig-test.ts 12✅ 650ms
test/allow-test.ts 6✅ 4s
test/approve-this-test.ts 8✅ 5s
test/asset-info-test.ts 4✅ 4s
test/balance-test.ts 3✅ 2s
test/base-tracking-accrued-test.ts 6✅ 5s
test/bridges/base-bridge-receiver-test.ts 13✅ 3s
test/bridges/sweepable-bridge-receiver-test.ts 5✅ 1s
test/bulker-test.ts 31✅ 25s
test/buy-collateral-test.ts 9✅ 1⚪ 7s
test/comet-ext-test.ts 3✅ 168ms
test/configurator-test.ts 39✅ 47s
test/constant-price-feed-test.ts 3✅ 123ms
test/constructor-test.ts 8✅ 4s
test/erc20-test.ts 16✅ 12s
test/fauceteer-test.ts 3✅ 716ms
test/governor-simple-test.ts 2✅ 178ms
test/interest-rate-test.ts 3✅ 2s
test/is-borrow-collateralized-test.ts 6✅ 4s
test/is-liquidatable-test.ts 7✅ 4s
test/liquidation/liquidation-bot-script.ts 8✅ 110s
test/liquidation/liquidation-bot-test.ts 6✅ 12s
test/pause-guardian-test.ts 9✅ 7s
test/price-feed-test.ts 3✅ 2s
test/quote-collateral-test.ts 5✅ 2s
test/reserves-test.ts 3✅ 2s
test/rewards-test.ts 408✅ 359s
test/sanity-test.ts 1✅ 1⚪ 1s
test/scaling-price-feed-test.ts 11✅ 1s
test/supply-test.ts 18✅ 1⚪ 15s
test/tracking-index-bounds-test.ts 8✅ 6s
test/transfer-test.ts 20✅ 16s
test/update-assets-in-test.ts 6✅ 6s
test/wbtc-price-feed.ts 13✅ 2s
test/withdraw-reserves-test.ts 5✅ 4s
test/withdraw-test.ts 23✅ 18s
test/wsteth-price-feed.ts 8✅ 978ms

✅ plugins/deployment_manager/test/AliasesTest.ts

Aliases
  ✅ gets and sets aliases

✅ plugins/deployment_manager/test/CacheTest.ts

Cache
  ✅ read and store values in-memory
  ✅ read and store values in-memory rel
  ✅ read and store values to disk
  ✅ read and store values to disk rel
Cache getFilePath
  ✅ returns proper rel path
Cache map
  ✅ read and store values in-memory rel

✅ plugins/deployment_manager/test/ContractMapTest.ts

ContractMap storeBuildFile/getBuildFile
  ✅ gets what it stores
  ✅ stores deploys in the right place

✅ plugins/deployment_manager/test/DeploymentManagerTest.ts

DeploymentManager _deployBuild
  ✅ should deployBuild succesfully
DeploymentManager contract
  ✅ should get contract succesfully
DeploymentManager contracts
  ✅ should get contracts succesfully
DeploymentManager deploy
  ✅ should deploy succesfully
DeploymentManager generateMigration
  ✅ should generate expected migration
DeploymentManager import
  ⚪ should import succesfully
DeploymentManager putAlias
  ✅ should update contract cache
DeploymentManager spider
  ✅ should spider succesfully
DeploymentManager storeArtifact & readArtifact
  ✅ should store and retrieve a given artifact
DeploymentManager verifyContracts
  ✅ should verify contracts successfully
Import
  ✅ imports from Etherscan
  ✅ loads from cache
  ✅ stores in cache
MigrationTemplate
  ✅ should fail if already exists
  ✅ should write to cache
  ✅ test a simple template
Verify via artifacts
  ✅ verify from artifacts [success]
Verify via buildfile
  ✅ verify from build file

✅ plugins/deployment_manager/test/DeployTest.ts

Deploy
  ✅ deploy
  ✅ deployBuild

✅ plugins/deployment_manager/test/EnactedTest.ts

Enacted
  ✅ handles existing enacted
  ✅ handles existing enacted with trailing comment
  ✅ handles existing enacted without trailing comma
  ✅ handles existing enacted without trailing comma with trailing comment
  ✅ handles no trailing comma
  ✅ writes enacted to migration

✅ plugins/deployment_manager/test/MigrationTest.ts

Migration
  ✅ loads a simple migration
  ✅ returns proper artifact file spec
  ✅ test a simple migration

✅ plugins/deployment_manager/test/RelationConfigTest.ts

RelationConfig
  ✅ gets relations config from base and rel
RelationConfig aliasTemplateKey
  ✅ returns alias template
RelationConfig getFieldKey
  ✅ simple alias
  ✅ simple alias config
  ✅ simple getter
RelationConfig readAlias
  ✅ simple alias
  ✅ simple dot-alias
  ✅ simple fn
RelationConfig readField
  ✅ fn call multi
  ✅ fn call single
  ✅ simple key multi
  ✅ simple key single
  ✅ slot key

✅ plugins/deployment_manager/test/RootsTest.ts

Roots
  ✅ gets and sets roots

✅ plugins/deployment_manager/test/SpiderTest.ts

Spider
  ✅ runs valid spider

✅ plugins/deployment_manager/test/VerifyArgsTest.ts

VerifyArgs
  ✅ gets, sets, and deletes verify args

✅ test/absorb-test.ts

absorb
  ✅ absorbs 1 account and pays out the absorber
  ✅ absorbs 2 accounts and pays out the absorber
  ✅ absorbs 3 accounts with collateral and pays out the absorber
  ✅ absorbs an account with more than enough collateral to still cover debt
  ✅ reverts if absorb is paused
  ✅ reverts if an account is not underwater
  ⚪ reverts if collateral asset value overflows base balance
  ✅ reverts if total borrows underflows
  ✅ updates assetsIn for liquidated account

✅ test/accrue-test.ts

accrue
  ✅ accrue initially succeeds and has the right parameters
  ✅ accrues correctly with no time elapsed
  ✅ accrues correctly with time elapsed and less than min rewards
  ✅ accrues correctly with time elapsed and more than min rewards
  ✅ fails if baseMinForRewards = 0
  ✅ overflows if baseMinRewards is set too low and accrues no interest
  ✅ reverts on overflows
  ✅ supports up to the maximum timestamp then breaks
accrueAccount
  ✅ has no effect when called on an address with no protocol activity

✅ test/allow-by-sig-test.ts

allowBySig
  ✅ authorizes with a valid signature
  ✅ fails if expiry argument is altered
  ✅ fails if isAllowed argument is altered
  ✅ fails if manager argument is altered
  ✅ fails if nonce argument is altered
  ✅ fails if owner argument is altered
  ✅ fails if owner is zero address
  ✅ fails if s is too high
  ✅ fails if signature contains invalid nonce
  ✅ fails if signature expiry has passed
  ✅ fails if v not in {27,28}
  ✅ rejects a repeated message

✅ test/allow-test.ts

allow
  ✅ allows a user to authorize a manager
  ✅ allows a user to rescind authorization
  ✅ isAllowed defaults to false
hasPermission
  ✅ is false by default for others
  ✅ is true for self
  ✅ is true when user is allowed

✅ test/approve-this-test.ts

approveThis asset is Comet
  ✅ allows governor to authorize a manager
  ✅ allows governor to rescind authorization
  ✅ isAllowed defaults to false
  ✅ reverts if not called by governor
approveThis asset is non-Comet ERC20
  ✅ allows governor to authorize a manager
  ✅ allows governor to rescind authorization
  ✅ isAllowed defaults to false
  ✅ reverts if not called by governor

✅ test/asset-info-test.ts

asset info
  ✅ initializes protocol
  ✅ reverts if collateral factors are out of range
  ✅ reverts if index is greater than numAssets
  ✅ reverts if too many assets are passed

✅ test/balance-test.ts

borrowBalanceOf
  ✅ returns 0 when principal amount is positive
  ✅ returns borrow amount (when principal amount is negative)
totalBorrow
  ✅ has correct totalBorrow

✅ test/base-tracking-accrued-test.ts

baseTrackingAccrued
  ✅ accrues correctly when base token has more than 6 decimals
  ✅ acrrues at a greater number of decimals, but preserves 6
  ✅ increases baseTrackingAccrued on borrow
  ✅ rounds down to zero for values below 6 decimal places
  ✅ supply updates baseTrackingAccrued to 6 decimal value
  ✅ updates with precision up to 6 decimal places

✅ test/bridges/base-bridge-receiver-test.ts

BaseBridgeReceiver
  ✅ cannot be reinitialized
  ✅ executeProposal > executes the proposal
  ✅ executeProposal > reverts if proposal is already executed
  ✅ executeProposal > reverts if proposal is expired
  ✅ initializing sets values
  ✅ is initialized with empty storage values
  ✅ processMessage > queues transactions and stores a proposal
  ✅ processMessage > reverts for bad data
  ✅ processMessage > reverts for repeated transactions
  ✅ processMessage > reverts if messageSender is not govTimelock
  ✅ reverts on initialize if local timelock admin is not the bridge receiver
  ✅ state > reverts for proposal id = 0
  ✅ state > reverts if proposal id is greater than proposalCount

✅ test/bridges/sweepable-bridge-receiver-test.ts

SweepableBridgeReceiver
  ✅ reverts if sweepNativeToken is called by non-admin
  ✅ reverts if sweepToken is called by address other than local timelock
  ✅ sweeps native token
  ✅ sweeps non-standard ERC20 token
  ✅ sweeps standard ERC20 token

✅ test/bulker-test.ts

bulker
  ✅ claim rewards
  ✅ reverts on supply asset if no permission granted to bulker
  ✅ reverts on transfer asset if no permission granted to bulker
  ✅ reverts on withdraw asset if no permission granted to bulker
  ✅ reverts on withdraw native token if no permission granted to bulker
  ✅ supply base asset
  ✅ supply collateral asset
  ✅ supply collateral asset to a different account
  ✅ supply native token
  ✅ supply native token refunds unused native token
  ✅ supply native token with insufficient native token
  ✅ supplyNativeToken with max base
  ✅ supplyNativeToken with max collateral should revert
  ✅ transfer base asset
  ✅ transfer collateral asset
  ✅ withdraw base asset
  ✅ withdraw collateral asset
  ✅ withdraw collateral asset to a different account
  ✅ withdraw native token
  ✅ withdrawNativeToken max base
  ✅ withdrawNativeToken max collateral reverts
bulker admin functions
  ✅ revert if transferAdmin called by non-admin
  ✅ revert if transferAdmin to zero address
  ✅ reverts if sweepNativeToken is called by non-admin
  ✅ reverts if sweepToken is called by non-admin
  ✅ sweep native token
  ✅ sweep non-standard ERC20 token
  ✅ sweep standard ERC20 token
  ✅ transferAdmin
bulker multiple actions
  ✅ supply collateral + borrow base asset
  ✅ supply native token to multiple accounts

✅ test/buy-collateral-test.ts

buyCollateral
  ✅ allows buying collateral when reserves < 0 and target reserves is 0
  ✅ allows buying collateral when reserves < target reserves
  ⚪ buys the correct amount in a fee-like situation
  ✅ can buy any excess collateral which does not belong to users
  ✅ reverts if buy is paused
  ✅ reverts if not enough collateral to buy
  ✅ reverts if reserves are above target reserves
  ✅ reverts if slippage is too high
  ✅ reverts if trying to buy collateral which belongs to users
buyCollateral reentrancy
  ✅ is not broken by reentrancy supply 

✅ test/comet-ext-test.ts

CometExt
  ✅ returns collateralBalance (in units of the collateral asset)
  ✅ returns factor scale
  ✅ returns price scale

✅ test/configurator-test.ts

configurator
  ✅ deploys Comet
  ✅ deploys Comet from ProxyAdmin
  ✅ e2e governance actions from timelock
  ✅ reverts if deploy is called from non-governor
  ✅ reverts if initialized more than once
  ✅ reverts if initializing the implementation contract
configurator configuration setters
  ✅ adds asset and deploys Comet with new configuration
  ✅ reverts if setter is called from non-governor
  ✅ reverts if updating a non-existent asset
  ✅ reverts when setting bad Configuration for a Comet proxy with an existing configuration
  ✅ reverts when setting Configuration and changing baseToken for a Comet proxy with an existing configuration
  ✅ reverts when setting Configuration and changing trackingIndexScale for a Comet proxy with an existing configuration
  ✅ sets baseBorrowMin and deploys Comet with new configuration
  ✅ sets baseMinForRewards and deploys Comet with new configuration
  ✅ sets baseTokenPriceFeed and deploys Comet with new configuration
  ✅ sets baseTrackingBorrowSpeed and deploys Comet with new configuration
  ✅ sets baseTrackingSupplySpeed and deploys Comet with new configuration
  ✅ sets borrowKink and deploys Comet with new configuration
  ✅ sets borrowPerYearInterestRateBase and deploys Comet with new configuration
  ✅ sets borrowPerYearInterestRateSlopeHigh and deploys Comet with new configuration
  ✅ sets borrowPerYearInterestRateSlopeLow and deploys Comet with new configuration
  ✅ sets Configuration for a Comet proxy with an existing configuration
  ✅ sets Configuration for a new Comet proxy
  ✅ sets extensionDelegate and deploys Comet with new configuration
  ✅ sets factory and deploys Comet using new factory
  ✅ sets governor and deploys Comet with new configuration
  ✅ sets pauseGuardian and deploys Comet with new configuration
  ✅ sets storeFrontPriceFactor and deploys Comet with new configuration
  ✅ sets supplyKink and deploys Comet with new configuration
  ✅ sets supplyPerYearInterestRateBase and deploys Comet with new configuration
  ✅ sets supplyPerYearInterestRateSlopeHigh and deploys Comet with new configuration
  ✅ sets supplyPerYearInterestRateSlopeLow and deploys Comet with new configuration
  ✅ sets targetReserves and deploys Comet with new configuration
  ✅ updates asset and deploys Comet with new configuration
  ✅ updates asset borrowCollateralFactor and deploys Comet with new configuration
  ✅ updates asset liquidateCollateralFactor and deploys Comet with new configuration
  ✅ updates asset liquidationFactor and deploys Comet with new configuration
  ✅ updates asset priceFeed and deploys Comet with new configuration
  ✅ updates asset supplyCap and deploys Comet with new configuration

✅ test/constant-price-feed-test.ts

constant price feed latestRoundData
  ✅ returns constant price for 18 decimals
  ✅ returns constant price for 8 decimals
  ✅ returns expected roundId, startedAt, updatedAt and answeredInRound values

✅ test/constructor-test.ts

constructor
  ✅ is not possible to create a perSecondInterestRateSlopeLow above FACTOR_SCALE
  ✅ reverts if asset has a price feed that does not have 8 decimals
  ✅ reverts if base token has fewer than 6 decimals
  ✅ reverts if base token has more than 18 decimals
  ✅ reverts if baseTokenPriceFeed does not have 8 decimals
  ✅ reverts if initializeStorage is called after initialization
  ✅ sets the baseBorrowMin
  ✅ verifies asset scales

✅ test/erc20-test.ts

erc20
  ✅ has correct decimals
  ✅ has correct name
  ✅ has correct symbol
  ✅ has correct totalSupply
  ✅ performs ERC20 transfer of base
erc20 allowance
  ✅ returns 0 when spender does not have permission for user
  ✅ returns unint256.max when spender has permission for user
erc20 approve
  ✅ reverts when user approves for value that is not 0 or uint256.max
  ✅ sets isAllowed=false when user passes 0
  ✅ sets isAllowed=true when user approves address for uint256 max
erc20 balanceOf
  ✅ returns 0 (when principal amount is negative)
  ✅ returns presentValue of principal (when principal is positive)
erc20 transferFrom
  ✅ performs ERC20 transferFrom of base with approval
  ✅ performs ERC20 transferFrom when user transfers their own funds
  ✅ reverts ERC20 transferFrom with revoked approval
  ✅ reverts ERC20 transferFrom without approval

✅ test/fauceteer-test.ts

Fauceteer
  ✅ issues .01% of balance of requested asset to requester
  ✅ limits each address to one request per asset per day
  ✅ throws an error if balance of asset is 0

✅ test/governor-simple-test.ts

GovernorSimple
  ✅ adds a new admin
  ✅ removes an existing admin

✅ test/interest-rate-test.ts

interest rates
  ✅ when 0 utilization
  ✅ when above kink utilization
  ✅ when below kink utilization

✅ test/is-borrow-collateralized-test.ts

isBorrowCollateralized
  ✅ changes when the underlying asset price changes
  ✅ defaults to true
  ✅ is false when user owes principal
  ✅ is true when user is owed principal
  ✅ is true when value of collateral is greater than principal owed
  ✅ takes borrow collateral factor into account when valuing collateral

✅ test/is-liquidatable-test.ts

isLiquidatable
  ✅ changes when the underlying asset price changes
  ✅ defaults to false
  ✅ is false when collateral can cover the borrowed principal
  ✅ is false when user is owed principal
  ✅ is true when the collateral cannot cover the borrowed principal
  ✅ is true when user owes principal
  ✅ takes liquidateCollateralFactor into account when comparing principal to collateral

✅ test/liquidation/liquidation-bot-script.ts

Liquidation Bot arbitragePurchaseableCollateral
  ✅ buys all collateral when available
  ✅ buys collateral when available
  ✅ hasPurchaseableCollateral ignores dust collateral
Liquidation Bot liquidateUnderwaterBorrowers
  ✅ liquidates an underwater borrower of comp
  ✅ liquidates an underwater borrower of link
  ✅ liquidates an underwater borrower of uni
  ✅ liquidates an underwater borrower of wbtc
  ✅ liquidates an underwater borrower of weth

✅ test/liquidation/liquidation-bot-test.ts

Liquidator
  ✅ Should execute COMP flash swap with profit
  ✅ Should execute LINK flash swap with profit
  ✅ Should execute UNI flash swap with profit
  ✅ Should execute WBTC flash swap with profit
  ✅ Should execute WETH flash swap with profit
  ✅ Should init liquidator

✅ test/pause-guardian-test.ts

Pause Guardian
  ✅ Should pause absorb
  ✅ Should pause buy
  ✅ Should pause supply
  ✅ Should pause transfer
  ✅ Should pause when called by governor
  ✅ Should pause when called by pause guardian
  ✅ Should pause withdraw
  ✅ Should revert if not called by governor or pause guardian
  ✅ Should unpause

✅ test/price-feed-test.ts

getPrice
  ✅ returns price data for assets, with 8 decimals
  ✅ reverts if given a bad priceFeed address
  ✅ reverts if price feed returns negative value

✅ test/quote-collateral-test.ts

quoteCollateral
  ✅ does not overflow for large amounts
  ✅ properly calculates price without truncating integer during intermediate calculations
  ✅ quotes the collateral at market price when storeFrontPriceFactor is 0%
  ✅ quotes the collateral correctly for a positive base amount
  ✅ quotes the collateral correctly for a zero base amount

✅ test/reserves-test.ts

getReserves
  ✅ calculates 0 reserves
  ✅ calculates negative reserves
  ✅ calculates positive reserves

✅ test/rewards-test.ts

CometRewards claim + supply
  ✅ can construct and claim rewards for owner with downscale
  ✅ can construct and claim rewards for owner with same scale
  ✅ can construct and claim rewards for owner with upscale
  ✅ does not overpay when claiming more than once
  ✅ fails if comet instance is already configured
  ✅ fails if comet instance is not configured
  ✅ fails if not enough rewards in the pool to transfer
CometRewards claimTo + borrow
  ✅ can construct and claim rewards to target with downscale
  ✅ can construct and claim rewards to target with same scale
  ✅ can construct and claim rewards to target with upscale
  ✅ does not allow claiming more than once
  ✅ fails if caller is not permitted to claim rewards for owner
  ✅ fails if comet instance is not configured
  ✅ fails if not enough rewards in the pool to transfer
CometRewards getRewardOwed
  ✅ can construct and calculate rewards for owner with downscale
  ✅ can construct and calculate rewards for owner with same scale
  ✅ can construct and calculate rewards for owner with upscale
  ✅ fails if comet instance is not configured
  ✅ returns 0 owed if user already claimed
CometRewards setRewardConfig
  ✅ allows governor to set rewards token with downscale
  ✅ allows governor to set rewards token with same scale
  ✅ allows governor to set rewards token with upscale
  ✅ does not allow anyone but governor to set config
CometRewards setRewardsClaimed
  ✅ allows governor to set rewards claimed
  ✅ can be used to zero out retroactive rewards for users
  ✅ does not allow anyone but governor to set rewards claimed
  ✅ reverts if addresses and claimedAmounts have different lengths
CometRewards transferGovernor
  ✅ allows governor to transfer governor
  ✅ does not allow anyone but governor to transfer governor
CometRewards with multiplier 0.00000888 claim + supply
  ✅ can construct and claim rewards for owner with downscale
  ✅ can construct and claim rewards for owner with downscale with small rescale factor
  ✅ can construct and claim rewards for owner with same scale
  ✅ can construct and claim rewards for owner with upscale
  ✅ can construct and claim rewards for owner with upscale with small rescale factor
  ✅ does not overpay when claiming more than once
  ✅ fails if comet instance is already configured
  ✅ fails if comet instance is not configured
  ✅ fails if not enough rewards in the pool to transfer
CometRewards with multiplier 0.00000888 claimTo + borrow
  ✅ can construct and claim rewards to target with downscale
  ✅ can construct and claim rewards to target with same scale
  ✅ can construct and claim rewards to target with upscale
  ✅ does not allow claiming more than once
  ✅ fails if caller is not permitted to claim rewards for owner
  ✅ fails if comet instance is not configured
  ✅ fails if not enough rewards in the pool to transfer
CometRewards with multiplier 0.00000888 getRewardOwed
  ✅ can construct and calculate rewards for owner with downscale
  ✅ can construct and calculate rewards for owner with downscale with small rescale factor
  ✅ can construct and calculate rewards for owner with same scale
  ✅ can construct and calculate rewards for owner with upscale
  ✅ can construct and calculate rewards for owner with upscale with small rescale factor
  ✅ fails if comet instance is not configured
  ✅ returns 0 owed if user already claimed
CometRewards with multiplier 0.00000888 setRewardConfig
  ✅ allows governor to set rewards token with downscale
  ✅ allows governor to set rewards token with downscale with small rescale factor
  ✅ allows governor to set rewards token with same scale
  ✅ allows governor to set rewards token with upscale
  ✅ allows governor to set rewards token with upscale with small rescale factor
  ✅ does not allow anyone but governor to set config
CometRewards with multiplier 0.000015 claim + supply
  ✅ can construct and claim rewards for owner with downscale
  ✅ can construct and claim rewards for owner with downscale with small rescale factor
  ✅ can construct and claim rewards for owner with same scale
  ✅ can construct and claim rewards for owner with upscale
  ✅ can construct and claim rewards for owner with upscale with small rescale factor
  ✅ does not overpay when claiming more than once
  ✅ fails if comet instance is already configured
  ✅ fails if comet instance is not configured
  ✅ fails if not enough rewards in the pool to transfer
CometRewards with multiplier 0.000015 claimTo + borrow
  ✅ can construct and claim rewards to target with downscale
  ✅ can construct and claim rewards to target with same scale
  ✅ can construct and claim rewards to target with upscale
  ✅ does not allow claiming more than once
  ✅ fails if caller is not permitted to claim rewards for owner
  ✅ fails if comet instance is not configured
  ✅ fails if not enough rewards in the pool to transfer
CometRewards with multiplier 0.000015 getRewardOwed
  ✅ can construct and calculate rewards for owner with downscale
  ✅ can construct and calculate rewards for owner with downscale with small rescale factor
  ✅ can construct and calculate rewards for owner with same scale
  ✅ can construct and calculate rewards for owner with upscale
  ✅ can construct and calculate rewards for owner with upscale with small rescale factor
  ✅ fails if comet instance is not configured
  ✅ returns 0 owed if user already claimed
CometRewards with multiplier 0.000015 setRewardConfig
  ✅ allows governor to set rewards token with downscale
  ✅ allows governor to set rewards token with downscale with small rescale factor
  ✅ allows governor to set rewards token with same scale
  ✅ allows governor to set rewards token with upscale
  ✅ allows governor to set rewards token with upscale with small rescale factor
  ✅ does not allow anyone but governor to set config
CometRewards with multiplier 0.00355 claim + supply
  ✅ can construct and claim rewards for owner with downscale
  ✅ can construct and claim rewards for owner with downscale with small rescale factor
  ✅ can construct and claim rewards for owner with same scale
  ✅ can construct and claim rewards for owner with upscale
  ✅ can construct and claim rewards for owner with upscale with small rescale factor
  ✅ does not overpay when claiming more than once
  ✅ fails if comet instance is already configured
  ✅ fails if comet instance is not configured
  ✅ fails if not enough rewards in the pool to transfer
CometRewards with multiplier 0.00355 claimTo + borrow
  ✅ can construct and claim rewards to target with downscale
  ✅ can construct and claim rewards to target with same scale
  ✅ can construct and claim rewards to target with upscale
  ✅ does not allow claiming more than once
  ✅ fails if caller is not permitted to claim rewards for owner
  ✅ fails if comet instance is not configured
  ✅ fails if not enough rewards in the pool to transfer
CometRewards with multiplier 0.00355 getRewardOwed
  ✅ can construct and calculate rewards for owner with downscale
  ✅ can construct and calculate rewards for owner with downscale with small rescale factor
  ✅ can construct and calculate rewards for owner with same scale
  ✅ can construct and calculate rewards for owner with upscale
  ✅ can construct and calculate rewards for owner with upscale with small rescale factor
  ✅ fails if comet instance is not configured
  ✅ returns 0 owed if user already claimed
CometRewards with multiplier 0.00355 setRewardConfig
  ✅ allows governor to set rewards token with downscale
  ✅ allows governor to set rewards token with downscale with small rescale factor
  ✅ allows governor to set rewards token with same scale
  ✅ allows governor to set rewards token with upscale
  ✅ allows governor to set rewards token with upscale with small rescale factor
  ✅ does not allow anyone but governor to set config
CometRewards with multiplier 0.01 claim + supply
  ✅ can construct and claim rewards for owner with downscale
  ✅ can construct and claim rewards for owner with downscale with small rescale factor
  ✅ can construct and claim rewards for owner with same scale
  ✅ can construct and claim rewards for owner with upscale
  ✅ can construct and claim rewards for owner with upscale with small rescale factor
  ✅ does not overpay when claiming more than once
  ✅ fails if comet instance is already configured
  ✅ fails if comet instance is not configured
  ✅ fails if not enough rewards in the pool to transfer
CometRewards with multiplier 0.01 claimTo + borrow
  ✅ can construct and claim rewards to target with downscale
  ✅ can construct and claim rewards to target with same scale
  ✅ can construct and claim rewards to target with upscale
  ✅ does not allow claiming more than once
  ✅ fails if caller is not permitted to claim rewards for owner
  ✅ fails if comet instance is not configured
  ✅ fails if not enough rewards in the pool to transfer
CometRewards with multiplier 0.01 getRewardOwed
  ✅ can construct and calculate rewards for owner with downscale
  ✅ can construct and calculate rewards for owner with downscale with small rescale factor
  ✅ can construct and calculate rewards for owner with same scale
  ✅ can construct and calculate rewards for owner with upscale
  ✅ can construct and calculate rewards for owner with upscale with small rescale factor
  ✅ fails if comet instance is not configured
  ✅ returns 0 owed if user already claimed
CometRewards with multiplier 0.01 setRewardConfig
  ✅ allows governor to set rewards token with downscale
  ✅ allows governor to set rewards token with downscale with small rescale factor
  ✅ allows governor to set rewards token with same scale
  ✅ allows governor to set rewards token with upscale
  ✅ allows governor to set rewards token with upscale with small rescale factor
  ✅ does not allow anyone but governor to set config
CometRewards with multiplier 0.0598 claim + supply
  ✅ can construct and claim rewards for owner with downscale
  ✅ can construct and claim rewards for owner with downscale with small rescale factor
  ✅ can construct and claim rewards for owner with same scale
  ✅ can construct and claim rewards for owner with upscale
  ✅ can construct and claim rewards for owner with upscale with small rescale factor
  ✅ does not overpay when claiming more than once
  ✅ fails if comet instance is already configured
  ✅ fails if comet instance is not configured
  ✅ fails if not enough rewards in the pool to transfer
CometRewards with multiplier 0.0598 claimTo + borrow
  ✅ can construct and claim rewards to target with downscale
  ✅ can construct and claim rewards to target with same scale
  ✅ can construct and claim rewards to target with upscale
  ✅ does not allow claiming more than once
  ✅ fails if caller is not permitted to claim rewards for owner
  ✅ fails if comet instance is not configured
  ✅ fails if not enough rewards in the pool to transfer
CometRewards with multiplier 0.0598 getRewardOwed
  ✅ can construct and calculate rewards for owner with downscale
  ✅ can construct and calculate rewards for owner with downscale with small rescale factor
  ✅ can construct and calculate rewards for owner with same scale
  ✅ can construct and calculate rewards for owner with upscale
  ✅ can construct and calculate rewards for owner with upscale with small rescale factor
  ✅ fails if comet instance is not configured
  ✅ returns 0 owed if user already claimed
CometRewards with multiplier 0.0598 setRewardConfig
  ✅ allows governor to set rewards token with downscale
  ✅ allows governor to set rewards token with downscale with small rescale factor
  ✅ allows governor to set rewards token with same scale
  ✅ allows governor to set rewards token with upscale
  ✅ allows governor to set rewards token with upscale with small rescale factor
  ✅ does not allow anyone but governor to set config
CometRewards with multiplier 0.12345 claim + supply
  ✅ can construct and claim rewards for owner with downscale
  ✅ can construct and claim rewards for owner with downscale with small rescale factor
  ✅ can construct and claim rewards for owner with same scale
  ✅ can construct and claim rewards for owner with upscale
  ✅ can construct and claim rewards for owner with upscale with small rescale factor
  ✅ does not overpay when claiming more than once
  ✅ fails if comet instance is already configured
  ✅ fails if comet instance is not configured
  ✅ fails if not enough rewards in the pool to transfer
CometRewards with multiplier 0.12345 claimTo + borrow
  ✅ can construct and claim rewards to target with downscale
  ✅ can construct and claim rewards to target with same scale
  ✅ can construct and claim rewards to target with upscale
  ✅ does not allow claiming more than once
  ✅ fails if caller is not permitted to claim rewards for owner
  ✅ fails if comet instance is not configured
  ✅ fails if not enough rewards in the pool to transfer
CometRewards with multiplier 0.12345 getRewardOwed
  ✅ can construct and calculate rewards for owner with downscale
  ✅ can construct and calculate rewards for owner with downscale with small rescale factor
  ✅ can construct and calculate rewards for owner with same scale
  ✅ can construct and calculate rewards for owner with upscale
  ✅ can construct and calculate rewards for owner with upscale with small rescale factor
  ✅ fails if comet instance is not configured
  ✅ returns 0 owed if user already claimed
CometRewards with multiplier 0.12345 setRewardConfig
  ✅ allows governor to set rewards token with downscale
  ✅ allows governor to set rewards token with downscale with small rescale factor
  ✅ allows governor to set rewards token with same scale
  ✅ allows governor to set rewards token with upscale
  ✅ allows governor to set rewards token with upscale with small rescale factor
  ✅ does not allow anyone but governor to set config
CometRewards with multiplier 0.55 claim + supply
  ✅ can construct and claim rewards for owner with downscale
  ✅ can construct and claim rewards for owner with downscale with small rescale factor
  ✅ can construct and claim rewards for owner with same scale
  ✅ can construct and claim rewards for owner with upscale
  ✅ can construct and claim rewards for owner with upscale with small rescale factor
  ✅ does not overpay when claiming more than once
  ✅ fails if comet instance is already configured
  ✅ fails if comet instance is not configured
  ✅ fails if not enough rewards in the pool to transfer
CometRewards with multiplier 0.55 claimTo + borrow
  ✅ can construct and claim rewards to target with downscale
  ✅ can construct and claim rewards to target with same scale
  ✅ can construct and claim rewards to target with upscale
  ✅ does not allow claiming more than once
  ✅ fails if caller is not permitted to claim rewards for owner
  ✅ fails if comet instance is not configured
  ✅ fails if not enough rewards in the pool to transfer
CometRewards with multiplier 0.55 getRewardOwed
  ✅ can construct and calculate rewards for owner with downscale
  ✅ can construct and calculate rewards for owner with downscale with small rescale factor
  ✅ can construct and calculate rewards for owner with same scale
  ✅ can construct and calculate rewards for owner with upscale
  ✅ can construct and calculate rewards for owner with upscale with small rescale factor
  ✅ fails if comet instance is not configured
  ✅ returns 0 owed if user already claimed
CometRewards with multiplier 0.55 setRewardConfig
  ✅ allows governor to set rewards token with downscale
  ✅ allows governor to set rewards token with downscale with small rescale factor
  ✅ allows governor to set rewards token with same scale
  ✅ allows governor to set rewards token with upscale
  ✅ allows governor to set rewards token with upscale with small rescale factor
  ✅ does not allow anyone but governor to set config
CometRewards with multiplier 0.98765 claim + supply
  ✅ can construct and claim rewards for owner with downscale
  ✅ can construct and claim rewards for owner with downscale with small rescale factor
  ✅ can construct and claim rewards for owner with same scale
  ✅ can construct and claim rewards for owner with upscale
  ✅ can construct and claim rewards for owner with upscale with small rescale factor
  ✅ does not overpay when claiming more than once
  ✅ fails if comet instance is already configured
  ✅ fails if comet instance is not configured
  ✅ fails if not enough rewards in the pool to transfer
CometRewards with multiplier 0.98765 claimTo + borrow
  ✅ can construct and claim rewards to target with downscale
  ✅ can construct and claim rewards to target with same scale
  ✅ can construct and claim rewards to target with upscale
  ✅ does not allow claiming more than once
  ✅ fails if caller is not permitted to claim rewards for owner
  ✅ fails if comet instance is not configured
  ✅ fails if not enough rewards in the pool to transfer
CometRewards with multiplier 0.98765 getRewardOwed
  ✅ can construct and calculate rewards for owner with downscale
  ✅ can construct and calculate rewards for owner with downscale with small rescale factor
  ✅ can construct and calculate rewards for owner with same scale
  ✅ can construct and calculate rewards for owner with upscale
  ✅ can construct and calculate rewards for owner with upscale with small rescale factor
  ✅ fails if comet instance is not configured
  ✅ returns 0 owed if user already claimed
CometRewards with multiplier 0.98765 setRewardConfig
  ✅ allows governor to set rewards token with downscale
  ✅ allows governor to set rewards token with downscale with small rescale factor
  ✅ allows governor to set rewards token with same scale
  ✅ allows governor to set rewards token with upscale
  ✅ allows governor to set rewards token with upscale with small rescale factor
  ✅ does not allow anyone but governor to set config
CometRewards with multiplier 1.33333332 claim + supply
  ✅ can construct and claim rewards for owner with downscale
  ✅ can construct and claim rewards for owner with downscale with small rescale factor
  ✅ can construct and claim rewards for owner with same scale
  ✅ can construct and claim rewards for owner with upscale
  ✅ can construct and claim rewards for owner with upscale with small rescale factor
  ✅ does not overpay when claiming more than once
  ✅ fails if comet instance is already configured
  ✅ fails if comet instance is not configured
  ✅ fails if not enough rewards in the pool to transfer
CometRewards with multiplier 1.33333332 claimTo + borrow
  ✅ can construct and claim rewards to target with downscale
  ✅ can construct and claim rewards to target with same scale
  ✅ can construct and claim rewards to target with upscale
  ✅ does not allow claiming more than once
  ✅ fails if caller is not permitted to claim rewards for owner
  ✅ fails if comet instance is not configured
  ✅ fails if not enough rewards in the pool to transfer
CometRewards with multiplier 1.33333332 getRewardOwed
  ✅ can construct and calculate rewards for owner with downscale
  ✅ can construct and calculate rewards for owner with downscale with small rescale factor
  ✅ can construct and calculate rewards for owner with same scale
  ✅ can construct and calculate rewards for owner with upscale
  ✅ can construct and calculate rewards for owner with upscale with small rescale factor
  ✅ fails if comet instance is not configured
  ✅ returns 0 owed if user already claimed
CometRewards with multiplier 1.33333332 setRewardConfig
  ✅ allows governor to set rewards token with downscale
  ✅ allows governor to set rewards token with downscale with small rescale factor
  ✅ allows governor to set rewards token with same scale
  ✅ allows governor to set rewards token with upscale
  ✅ allows governor to set rewards token with upscale with small rescale factor
  ✅ does not allow anyone but governor to set config
CometRewards with multiplier 100 claim + supply
  ✅ can construct and claim rewards for owner with downscale
  ✅ can construct and claim rewards for owner with downscale with small rescale factor
  ✅ can construct and claim rewards for owner with same scale
  ✅ can construct and claim rewards for owner with upscale
  ✅ can construct and claim rewards for owner with upscale with small rescale factor
  ✅ does not overpay when claiming more than once
  ✅ fails if comet instance is already configured
  ✅ fails if comet instance is not configured
  ✅ fails if not enough rewards in the pool to transfer
CometRewards with multiplier 100 claimTo + borrow
  ✅ can construct and claim rewards to target with downscale
  ✅ can construct and claim rewards to target with same scale
  ✅ can construct and claim rewards to target with upscale
  ✅ does not allow claiming more than once
  ✅ fails if caller is not permitted to claim rewards for owner
  ✅ fails if comet instance is not configured
  ✅ fails if not enough rewards in the pool to transfer
CometRewards with multiplier 100 getRewardOwed
  ✅ can construct and calculate rewards for owner with downscale
  ✅ can construct and calculate rewards for owner with downscale with small rescale factor
  ✅ can construct and calculate rewards for owner with same scale
  ✅ can construct and calculate rewards for owner with upscale
  ✅ can construct and calculate rewards for owner with upscale with small rescale factor
  ✅ fails if comet instance is not configured
  ✅ returns 0 owed if user already claimed
CometRewards with multiplier 100 setRewardConfig
  ✅ allows governor to set rewards token with downscale
  ✅ allows governor to set rewards token with downscale with small rescale factor
  ✅ allows governor to set rewards token with same scale
  ✅ allows governor to set rewards token with upscale
  ✅ allows governor to set rewards token with upscale with small rescale factor
  ✅ does not allow anyone but governor to set config
CometRewards with multiplier 23141 claim + supply
  ✅ can construct and claim rewards for owner with downscale
  ✅ can construct and claim rewards for owner with downscale with small rescale factor
  ✅ can construct and claim rewards for owner with same scale
  ✅ can construct and claim rewards for owner with upscale
  ✅ can construct and claim rewards for owner with upscale with small rescale factor
  ✅ does not overpay when claiming more than once
  ✅ fails if comet instance is already configured
  ✅ fails if comet instance is not configured
  ✅ fails if not enough rewards in the pool to transfer
CometRewards with multiplier 23141 claimTo + borrow
  ✅ can construct and claim rewards to target with downscale
  ✅ can construct and claim rewards to target with same scale
  ✅ can construct and claim rewards to target with upscale
  ✅ does not allow claiming more than once
  ✅ fails if caller is not permitted to claim rewards for owner
  ✅ fails if comet instance is not configured
  ✅ fails if not enough rewards in the pool to transfer
CometRewards with multiplier 23141 getRewardOwed
  ✅ can construct and calculate rewards for owner with downscale
  ✅ can construct and calculate rewards for owner with downscale with small rescale factor
  ✅ can construct and calculate rewards for owner with same scale
  ✅ can construct and calculate rewards for owner with upscale
  ✅ can construct and calculate rewards for owner with upscale with small rescale factor
  ✅ fails if comet instance is not configured
  ✅ returns 0 owed if user already claimed
CometRewards with multiplier 23141 setRewardConfig
  ✅ allows governor to set rewards token with downscale
  ✅ allows governor to set rewards token with downscale with small rescale factor
  ✅ allows governor to set rewards token with same scale
  ✅ allows governor to set rewards token with upscale
  ✅ allows governor to set rewards token with upscale with small rescale factor
  ✅ does not allow anyone but governor to set config
CometRewards with multiplier 5.79 claim + supply
  ✅ can construct and claim rewards for owner with downscale
  ✅ can construct and claim rewards for owner with downscale with small rescale factor
  ✅ can construct and claim rewards for owner with same scale
  ✅ can construct and claim rewards for owner with upscale
  ✅ can construct and claim rewards for owner with upscale with small rescale factor
  ✅ does not overpay when claiming more than once
  ✅ fails if comet instance is already configured
  ✅ fails if comet instance is not configured
  ✅ fails if not enough rewards in the pool to transfer
CometRewards with multiplier 5.79 claimTo + borrow
  ✅ can construct and claim rewards to target with downscale
  ✅ can construct and claim rewards to target with same scale
  ✅ can construct and claim rewards to target with upscale
  ✅ does not allow claiming more than once
  ✅ fails if caller is not permitted to claim rewards for owner
  ✅ fails if comet instance is not configured
  ✅ fails if not enough rewards in the pool to transfer
CometRewards with multiplier 5.79 getRewardOwed
  ✅ can construct and calculate rewards for owner with downscale
  ✅ can construct and calculate rewards for owner with downscale with small rescale factor
  ✅ can construct and calculate rewards for owner with same scale
  ✅ can construct and calculate rewards for owner with upscale
  ✅ can construct and calculate rewards for owner with upscale with small rescale factor
  ✅ fails if comet instance is not configured
  ✅ returns 0 owed if user already claimed
CometRewards with multiplier 5.79 setRewardConfig
  ✅ allows governor to set rewards token with downscale
  ✅ allows governor to set rewards token with downscale with small rescale factor
  ✅ allows governor to set rewards token with same scale
  ✅ allows governor to set rewards token with upscale
  ✅ allows governor to set rewards token with upscale with small rescale factor
  ✅ does not allow anyone but governor to set config
CometRewards with multiplier 598314321.512341 claim + supply
  ✅ can construct and claim rewards for owner with downscale
  ✅ can construct and claim rewards for owner with downscale with small rescale factor
  ✅ can construct and claim rewards for owner with same scale
  ✅ can construct and claim rewards for owner with upscale
  ✅ can construct and claim rewards for owner with upscale with small rescale factor
  ✅ does not overpay when claiming more than once
  ✅ fails if comet instance is already configured
  ✅ fails if comet instance is not configured
  ✅ fails if not enough rewards in the pool to transfer
CometRewards with multiplier 598314321.512341 claimTo + borrow
  ✅ can construct and claim rewards to target with downscale
  ✅ can construct and claim rewards to target with same scale
  ✅ can construct and claim rewards to target with upscale
  ✅ does not allow claiming more than once
  ✅ fails if caller is not permitted to claim rewards for owner
  ✅ fails if comet instance is not configured
  ✅ fails if not enough rewards in the pool to transfer
CometRewards with multiplier 598314321.512341 getRewardOwed
  ✅ can construct and calculate rewards for owner with downscale
  ✅ can construct and calculate rewards for owner with downscale with small rescale factor
  ✅ can construct and calculate rewards for owner with same scale
  ✅ can construct and calculate rewards for owner with upscale
  ✅ can construct and calculate rewards for owner with upscale with small rescale factor
  ✅ fails if comet instance is not configured
  ✅ returns 0 owed if user already claimed
CometRewards with multiplier 598314321.512341 setRewardConfig
  ✅ allows governor to set rewards token with downscale
  ✅ allows governor to set rewards token with downscale with small rescale factor
  ✅ allows governor to set rewards token with same scale
  ✅ allows governor to set rewards token with upscale
  ✅ allows governor to set rewards token with upscale with small rescale factor
  ✅ does not allow anyone but governor to set config
CometRewards withdrawToken
  ✅ allows governor to withdraw funds added
  ✅ does not allow anyone but governor to withdraw

✅ test/sanity-test.ts

getNow
  ✅ reverts if timestamp overflows
updateBaseBalance
  ⚪ accrues the right amount of rewards

✅ test/scaling-price-feed-test.ts

scaling price feed
  ✅ description is set properly
scaling price feed latestRoundData
  ✅ passes along roundId, startedAt, updatedAt and answeredInRound values from underlying price feed
  ✅ price (-1000000000), priceFeedDecimals (6) -> -100000000000
  ✅ price (-100000000000), priceFeedDecimals (8) -> -100000000000
  ✅ price (-1000000000000000000000), priceFeedDecimals (18) -> -100000000000
  ✅ price (100000000), priceFeedDecimals (6) -> 10000000000
  ✅ price (10000000000), priceFeedDecimals (8) -> 10000000000
  ✅ price (100000000000000000000), priceFeedDecimals (18) -> 10000000000
  ✅ price (123456000000), priceFeedDecimals (6) -> 12345600000000
  ✅ price (12345600000000), priceFeedDecimals (8) -> 12345600000000
  ✅ price (123456000000000000000000), priceFeedDecimals (18) -> 12345600000000

✅ test/supply-test.ts

supply
  ✅ reverts if supply is paused
  ✅ supplies to sender by default
supplyFrom
  ✅ reverts if `from` is specified and sender does not have permission
  ✅ reverts if supply is paused
  ✅ supplies from `from` if specified and sender has permission
supplyTo
  ✅ calculates base principal correctly
  ✅ does not emit Transfer for 0 mint
  ✅ prevents exceeding the supply cap via re-entrancy
  ✅ reverts if supply is paused
  ✅ reverts if supply max for a collateral asset
  ✅ reverts if supplying collateral exceeds the supply cap
  ✅ reverts if the asset is neither collateral nor base
  ✅ supplies 0 and does not revert when dstPrincipalNew < dstPrincipal
  ✅ supplies base from sender if the asset is base
  ✅ supplies collateral from sender if the asset is collateral
  ✅ supplies max base borrow balance (including accrued) from sender if the asset is base
  ⚪ supplies the correct amount in a fee-like situation
  ✅ supply max base should supply 0 if user has no borrow position
  ✅ user supply is same as total supply

✅ test/tracking-index-bounds-test.ts

total tracking index bounds base scale of 18
  ✅ lower bound hit on tracking borrow index
  ✅ lower bound hit on tracking supply index
  ✅ upper bound hit on tracking borrow index
  ✅ upper bound hit on tracking supply index
total tracking index bounds base scale of 6
  ✅ lower bound hit on tracking borrow index
  ✅ lower bound hit on tracking supply index
  ✅ upper bound hit on tracking borrow index
  ✅ upper bound hit on tracking supply index

✅ test/transfer-test.ts

transfer
  ✅ borrows base if collateralized
  ✅ calculates base principal correctly
  ✅ cant borrow less than the minimum
  ✅ does not emit Transfer if 0 mint/burn
  ✅ reverts if the asset is neither collateral nor base
  ✅ reverts if transfer is paused
  ✅ reverts if transfer max for a collateral asset
  ✅ reverts if transferring base results in an under collateralized borrow
  ✅ reverts if transferring collateral results in an under collateralized borrow
  ✅ reverts on self-transfer of base token
  ✅ reverts on self-transfer of collateral
  ✅ transfer max base should transfer 0 if user has a borrow position
  ✅ transfers base from sender if the asset is base
  ✅ transfers collateral from sender if the asset is collateral
  ✅ transfers max base balance (including accrued) from sender if the asset is base
transferFrom
  ✅ reverts if src is specified and sender does not have permission
  ✅ reverts if transfer is paused
  ✅ reverts on transfer of base token from address to itself
  ✅ reverts on transfer of collateral from address to itself
  ✅ transfers from src if specified and sender has permission

✅ test/update-assets-in-test.ts

updateAssetsIn
  ✅ adds asset to user's asset list when initialUserBalance=0 and finalUserBalance>0
  ✅ does not change state when both initialUserBalance and finalUserBalance > 0
  ✅ does not change state when both initialUserBalance and finalUserBalance are 0
  ✅ removes asset from asset list when initialUserBalance > 0 and finalUserBalance=0
  ✅ reverts for non-existent asset address
  ✅ works for up to 15 assets

✅ test/wbtc-price-feed.ts

WBTC price feed
  ✅ getters return correct values
  ✅ reverts if constructed with bad decimals
WBTC price feed latestRoundData
  ✅ passes along roundId, startedAt, updatedAt and answeredInRound values from BTC / USD price feed
  ✅ WBTCToBTCPrice (0), BTCToUSDPrice (0) -> 0
  ✅ WBTCToBTCPrice (0), BTCToUSDPrice (3000000000000) -> 0
  ✅ WBTCToBTCPrice (100000000), BTCToUSDPrice (0) -> 0
  ✅ WBTCToBTCPrice (100000000), BTCToUSDPrice (3000000000000) -> 3000000000000
  ✅ WBTCToBTCPrice (10000000000), BTCToUSDPrice (3000000000000) -> 300000000000000
  ✅ WBTCToBTCPrice (212345600), BTCToUSDPrice (3133312300000) -> 6653450803308
  ✅ WBTCToBTCPrice (50000000), BTCToUSDPrice (3000000000000) -> 1500000000000
  ✅ WBTCToBTCPrice (555000), BTCToUSDPrice (3000000000000) -> 16650000000
  ✅ WBTCToBTCPrice (98793700), BTCToUSDPrice (3194771623000) -> 3156233092911
  ✅ WBTCToBTCPrice (99990000), BTCToUSDPrice (3000000000000) -> 2999700000000

✅ test/withdraw-reserves-test.ts

withdrawReserves
  ✅ accounts for total supply base when calculating reserves
  ✅ reverts if called not by governor
  ✅ reverts if negative reserves
  ✅ reverts if not enough reserves are owned by protocol
  ✅ withdraws reserves from the protocol

✅ test/withdraw-test.ts

withdraw
  ✅ reverts if base withdraw amount is not collateralzed
  ✅ reverts if collateral withdraw amount is not collateralized
  ✅ reverts if withdraw amount is less than baseBorrowMin
  ✅ reverts if withdraw is paused
  ✅ withdraws to sender by default
withdraw reentrancy
  ✅ is not broken by malicious reentrancy transferFrom
  ✅ is not broken by malicious reentrancy withdrawFrom
withdrawFrom
  ✅ reverts if src is specified and sender does not have permission
  ✅ reverts if withdraw is paused
  ✅ withdraws from src if specified and sender has permission
withdrawTo
  ✅ borrows to withdraw if necessary/possible
  ✅ calculates base principal correctly
  ✅ does not emit Transfer for 0 burn
  ✅ reverts if the asset is neither collateral nor base
  ✅ reverts if withdraw is paused
  ✅ reverts if withdraw max for a collateral asset
  ✅ reverts if withdrawing base exceeds the total supply
  ✅ reverts if withdrawing collateral exceeds the total supply
  ✅ withdraw max base should withdraw 0 if user has a borrow position
  ✅ withdraws 0 but Comet Transfer event amount is 1
  ✅ withdraws base from sender if the asset is base
  ✅ withdraws collateral from sender if the asset is collateral
  ✅ withdraws max base balance (including accrued) from sender if the asset is base

✅ test/wsteth-price-feed.ts

wstETH price feed
  ✅ reverts if constructed with bad decimals
wstETH price feed latestRoundData
  ✅ passes along roundId, startedAt, updatedAt and answeredInRound values from stETH price feed
  ✅ stEthPrice (-1000000000000000000000), tokensPerStEth (800000000000000000) -> -125000000000
  ✅ stEthPrice (1000000000000000000000), tokensPerStEth (200000000000000000) -> 500000000000
  ✅ stEthPrice (1000000000000000000000), tokensPerStEth (500000000000000000) -> 200000000000
  ✅ stEthPrice (1000000000000000000000), tokensPerStEth (800000000000000000) -> 125000000000
  ✅ stEthPrice (1000000000000000000000), tokensPerStEth (900000000000000000) -> 111111111111
  ✅ stEthPrice (1300000000000000000000), tokensPerStEth (900000000000000000) -> 144444444444