Contract Specs

  • Purpose of contract is to:
  • should modify/add logic to MintBurnWrapper
  • prerequisites:
    • GoodDAO needs to register scheme on the sidechain (so it can call controller to mint)
  • Should implement the following methods
    • initialize(uint256 bpsPerDayMaxValue, address guardian)
    • setUpdateFrequency(uint256 timestampOrBlockNumber)
      • only avatar or guardian
    • addMinter(address minter, uint256 cap, uint256 max, uint32 bpsPerDay, bool withRewardsRole)
      • bpsPerDay is relevant for sendOrMint functionality, cap+max are limits for bridge and other minters. withRewardsRole, does this minter has permissions to call sendOrMint.
      • bpsPerDay is in basepoints ie 300 = 300/10000 = 0.03 = 3%
      • calculate nominal perDayDistributionLimit = _bpsPerDayDistributionLimit*G$Supply/10000
      • adds minter, dateUpdated(can be block), _bpsPerDayDistributionLimit and perDayDistributionLimit to the list of addresses that are allowed to mint
      • should only be updatable by Avatar or Guardian
      • should be able to call this multiple times to update _bpsPerDayDistributionLimit
      • should emit event
    • removeMinter(address _minter) // or add with 0
      • removes _minter
      • should emit event
    • balanceDebt()
      • only runs if(contractG$Balance>0 && mintingDebt>0)
      • burn: burned = min(contractG$Balance, mintingDebt)
      • mintingDebt -= burned
    • sendOrMint(uint256 _amount, address _to)
      • should verify sender is a minter
      • call balanceDebt()
      • should reset mintedToday[minter] if day passed
      • should send to _to: sentAmount = min(contractG$Balance, _amount)
      • should mint to _to mintedAmount = min(perDayDistributionLimit - distributedToday, _amount - sentAmount)
      • totalRewardsSent = sentAmount + mintedAmount
      • mintingDebt += mintedAmount
      • increase distributedToday[minter] with amount totalRewardsSent
      • if updateFrequency months passed or a updateFrequency months worth of blocks (depending if we keep blockUpdated or dateUpdated) then recalculate the perDayDistributionLimit according to current supply
      • should emit event
      • reentrancy guard + update then call pattern
      • return the totalRewardsSent
    • onTokenTransfer
      • support for a single token transfer to bridge via multichain without needing to approve token transfer first
    • burn/mint
      • support multichain router API