PowerToken

Git Source

Inherits: IPowerToken, EpochBasedInflationaryVoteToken

Author: M^0 Labs

State Variables

_AUCTION_PERIODS

The number of auction periods in an epoch.

uint40 internal constant _AUCTION_PERIODS = 100;

INITIAL_SUPPLY

Returns the initial supply of the token.

uint240 public constant INITIAL_SUPPLY = 1_000_000;

bootstrapToken

Returns the address of the token in which token balances and voting powers are bootstrapped.

address public immutable bootstrapToken;

standardGovernor

Returns the address of the Standard Governor.

address public immutable standardGovernor;

vault

Returns the address of the Vault.

address public immutable vault;

bootstrapEpoch

Returns the epoch from which token balances and voting powers are bootstrapped.

uint16 public immutable bootstrapEpoch;

_bootstrapSupply

The total supply of the bootstrap token at the bootstrap epoch.

uint240 internal immutable _bootstrapSupply;

_nextCashTokenStartingEpoch

The starting epoch of the next cash token.

uint16 internal _nextCashTokenStartingEpoch;

_cashToken

The address of the cash token required to buy from the token auction.

address internal _cashToken;

_nextCashToken

The address of the next cash token.

address internal _nextCashToken;

_nextTargetSupplyStartingEpoch

The starting epoch of the next target supply.

uint16 internal _nextTargetSupplyStartingEpoch;

_targetSupply

The current target supply of the token.

uint240 internal _targetSupply;

_nextTargetSupply

The next target supply of the token.

uint240 internal _nextTargetSupply = INITIAL_SUPPLY;

Functions

onlyStandardGovernor

Reverts if the caller is not the Standard Governor.

modifier onlyStandardGovernor();

constructor

Constructs a new Power Token contract.

constructor(address bootstrapToken_, address standardGovernor_, address cashToken_, address vault_)
    EpochBasedInflationaryVoteToken("Power by M^0", "POWER", 0, ONE / 10);

Parameters

buy

Allows a caller to buy amount tokens from the auction.

function buy(uint256 minAmount_, uint256 maxAmount_, address destination_, uint16 expiryEpoch_)
    external
    returns (uint240 amount_, uint256 cost_);

Parameters

Returns

markNextVotingEpochAsActive

Marks the next voting epoch as targeted for inflation.

function markNextVotingEpochAsActive() external onlyStandardGovernor;

markParticipation

Marks delegatee as having participated in the current epoch, thus receiving voting power inflation.

function markParticipation(address delegatee_) external onlyStandardGovernor;

Parameters

setNextCashToken

Queues the cash token that will take effect from the next epoch onward.

function setNextCashToken(address nextCashToken_) external onlyStandardGovernor;

Parameters

amountToAuction

Returns the amount of tokens that can be bought in the auction.

function amountToAuction() public view returns (uint240);

cashToken

Returns the address of the cash token required to buy from the token auction.

function cashToken() public view returns (address);

getCost

Returns the total cost, in cash token, of purchasing amount tokens from the auction.

function getCost(uint256 amount_) public view returns (uint256);

Parameters

Returns

targetSupply

Returns the target supply, which helps determine the amount of tokens up for auction.

*Auction curve:

  • During every auction period (1/100th of an epoch) the price starts at some "leftPoint" and decreases linearly, with time, to some "rightPoint" (which is half of that "leftPoint"). This is done by computing the weighted average between the "leftPoint" and "rightPoint" for the time remaining in the auction period.

  • For the next auction period, the new "leftPoint" is half of the previous period's "leftPoint" (which also equals the previous period's "rightPoint").

  • Combined, this results in the price decreasing by half every auction period at a macro level, but decreasing linearly at a micro-level during each period, without any jumps. Relative price computation:

  • Since the parameters of this auction are fixed forever (there are no mutable auction parameters and this is not an upgradeable contract), and the token supply is expected to increase relatively quickly and consistently, the result would be that the price Y for some Z% of the total supply would occur earlier and earlier in the auction.

  • Instead, the desired behavior is that after X seconds into the auction, there will be a price Y for some Z% of the total supply. In other words, it will always cost 572,662,306,133 cash tokens to buy 1% of the previous epoch's total supply with 5 days left in the auction period.

  • To achieve this, the price is instead computed per basis point of the last epoch's total supply.*

function targetSupply() public view returns (uint256);

_bootstrap

Bootstrap the account's balance and voting power from the bootstrap token.

function _bootstrap(address account_) internal;

Parameters

_delegate

Delegate voting power from delegator_ to newDelegatee_.

function _delegate(address delegator_, address newDelegatee_) internal override;

Parameters

_sync

Syncs account_ so that its balance Snap array in storage, reflects their unrealized inflation.

function _sync(address account_) internal override;

Parameters

_getBalance

Returns the balance of account_ plus any inflation that is unrealized before epoch_.

function _getBalance(address account_, uint16 epoch_) internal view override returns (uint240);

Parameters

Returns

_getBootstrapBalance

This is the portion of the initial supply commensurate with the account's portion of the bootstrap supply.

function _getBootstrapBalance(address account_, uint16 epoch_) internal view returns (uint240);

Parameters

Returns

_getTotalSupply

Returns the total supply at epoch_.

function _getTotalSupply(uint16 epoch_) internal view override returns (uint240);

Parameters

Returns

_getVotes

Returns the amount of votes of account_ plus any inflation that should be realized at epoch_.

function _getVotes(address account_, uint16 epoch_) internal view override returns (uint240);

Parameters

Returns

_getInternalOrBootstrap

Returns the amount of balance/votes for account_ at clock value epoch_.

function _getInternalOrBootstrap(
    address account_,
    uint16 epoch_,
    function(address, uint16) internal view returns (uint240) getter_
) internal view returns (uint240);

Parameters

Returns

_getLastSync

Returns the epoch of the last sync of account_ at or before epoch_.

function _getLastSync(address account_, uint16 epoch_) internal view override returns (uint16);

Parameters

Returns

_getTargetSupply

Returns the target supply of the token at the current epoch.

function _getTargetSupply() internal view returns (uint240);

_revertIfNotStandardGovernor

Reverts if the caller is not the Standard Governor.

function _revertIfNotStandardGovernor() internal view;

_divideUp

Helper function to calculate x / y, rounded up.

Inspired by USM (https://github.com/usmfum/USM/blob/master/contracts/WadMath.sol)

function _divideUp(uint256 x, uint256 y) internal pure returns (uint256 z);

Copyright 2024 M^0 Foundation