# Protocol Token

## 1. Summary <a href="#id-1-introduction-summary" id="id-1-introduction-summary"></a>

The protocol token is a [DsDelegateToken](https://github.com/reflexer-labs/ds-token/blob/master/src/delegate.sol) that provides logic for burning and authorized minting of new tokens as well as delegation capabilities.

## 2. Contract Variables & Functions <a href="#id-2-contract-details" id="id-2-contract-details"></a>

**Variables**

* `guy` - user address
* `wad` - a quantity of tokens, usually as a fixed point integer with 10^18 decimal places.
* `dst` - refers to the destination address.
* `name` - returns the name of the token - e.g. "MyToken".
* `symbol` - token symbol.
* `decimals` - returns the number of decimals the token uses.
* `totalSupply` - returns the total token supply.
* `balanceOf(usr: address)` - user balance
* `delegates(usr: address)` - a record of each account's delegate
* `checkpoints(usr: address`, `checkpoint: uint32)` - a record of vote checkpoints for each account, by index
* `numCheckpoints(usr: address)` - the number of checkpoints for each account
* `nonces(usr: address)` - a record of states for signing / validating signatures
* `allowance(src: address, dst: address)` - approvals
* `balanceOf(usr: address)` - returns the account balance of another account with *address \_owner*.
* `allowance(src: address, dst: address)`- returns the amount which *\_spender* is still allowed to withdraw from *\_owner*.
* `DOMAIN_TYPEHASH` - the EIP-712 typehash for the contract's domain
* `DELEGATION_TYPEHASH` - the EIP-712 typehash for the delegation struct used by the contract

**Functions**

* `mint(usr: address`, `amount: uint256)` - mint coins to an address
* `burn(usr: address`, `amount: uint256)` - burn at an address
* `push(usr: address`, `amount: uint256)` - transfer
* `pull(usr: address`, `amount: uint256)`- transfer from
* `move(src: address`, `dst: address`, `amount: uint256)` - transfer from
* `approve(usr: address`, `amount: uint256)` - allow pulls and moves
* `transfer(dst: address`, `amount: uint256)` - transfers coins from `msg.sender` to `dst`
* `delegate(delegatee: address)` - delegate votes from `msg.sender` to `delegatee`
* `delegateBySig(delegatee: address`, `nonce: uint256`, `expiry: uint256`, `v: uint8`, `r: bytes32`, `s: bytes32)` - delegates votes from signatory to `delegatee`
* `getCurrentVotes(account: address) external view returns (uint256)` - gets the current votes balance for `account`
* `getPriorVotes(account: address`, `blockNumber: uint256) public view returns (uint256)` - determine the prior number of votes for an account as of a block number

**Data Structures**

* `Checkpoint` - stores a checkpoint's data. Contains:
  * `fromBlock` - the block from which that amount of votes has been marked
  * `votes` - the amount of votes

**Events**

* `Mint` - emitted when new tokens are minted. Contains:
  * `guy` - the address for which the contract prints tokens
  * `wad` - the amount of tokens printed
* `Burn` - emitted when tokens are burned. Contains:
  * `guy` - the address whose tokens are burned
  * `wad` - the amount of tokens that were burned
* `DelegateChanged` - emitted when an address changes its delegate. Contains:
  * `delegator` - the address that changes its delegate
  * `fromDelegate` - the old delegate
  * `toDelegate` - the new delegate
* `DelegateVotesChanged` - emitted when a delegate account's vote balance changes. Contains:
  * `delegate` - the delegate account
  * `previousBalance` - the delegate's previous vote balance
  * `newBalance` - the delegate's new vote balance

## 3. Walkthrough <a href="#id-3-key-mechanisms-and-concepts" id="id-3-key-mechanisms-and-concepts"></a>

Along with the standard ERC20 token interface, the protocol token also has [DSAuth](https://github.com/reflexer-labs/ds-auth)-protected mint and burn functions.


---

# Agent Instructions: Querying This Documentation

If you need additional information that is not directly available in this page, you can query the documentation dynamically by asking a question.

Perform an HTTP GET request on the current page URL with the `ask` query parameter:

```
GET https://docs.reflexer.finance/system-contracts/token-module/protocol-token.md?ask=<question>
```

The question should be specific, self-contained, and written in natural language.
The response will contain a direct answer to the question and relevant excerpts and sources from the documentation.

Use this mechanism when the answer is not explicitly present in the current page, you need clarification or additional context, or you want to retrieve related documentation sections.
