mirror of
git://holbrook.no/erc20-demurrage-token
synced 2024-11-05 10:06:45 +01:00
Merge branch 'master' of gitlab.com:grassrootseconomics/sarafu-token
This commit is contained in:
commit
65b51bc2a1
52
README.md
52
README.md
@ -1,26 +1,51 @@
|
|||||||
# RedistributedDemurrageToken
|
# RedistributedDemurrageToken
|
||||||
|
|
||||||
|
## Use Case
|
||||||
|
* Network / Basic Income Token
|
||||||
|
* 100 Sarafu is distributed to anyone in Kenya after user validation by the owner of a faucet which mints new Sarafu.
|
||||||
|
* Validated users are those that validate their phone number in Kenya.
|
||||||
|
* A monthly Sarafu holding tax (demurrage) of 2% is deducted from users
|
||||||
|
* Each month (after a number of blocks) the total amount tax is distributed evenly out to _active_ users.
|
||||||
|
* any single transaction by a user is considered _active_ (heartbeat) (possibly add minimum size of heartbeat in constructor (TODO))
|
||||||
|
* This is meant to result in a disincentivization to hold (hodl) the Sarafu token and increase its usage as a medium of exchange rather than a store of value.
|
||||||
|
* This token can be added to liquidity pools with other ERC20 tokens and or Community Inclusion Currencies (CICs) - and thereby act as a central network token and connect various tokens and CICs together.
|
||||||
|
|
||||||
|
|
||||||
|
## Variables
|
||||||
|
|
||||||
|
* Inputs to Constructor (Set only once during contract deployment can't be changed )
|
||||||
|
* `Demurrage` aka Decay amount: A percentage of token supply that will be charged once per - aka `period` and evenly redistributed to _active_ users
|
||||||
|
* Demurrage Period (blocks)- aka `period`: The number of blocks (equivalent to a time frame) over which a new Holding Fee is applied and redistributed.
|
||||||
|
* Inflated Balance: The inflated balance of each user is stored for bookkeeping.
|
||||||
|
* Number of Decimals: Resolution on token (TODO) (Default 6)
|
||||||
|
* Minimum Activity Volume: (TODO) the minimum transaction amount to be considered active
|
||||||
|
* Sink Token Address: Rounding errors and if no one trades the tax goes to this address
|
||||||
|
|
||||||
|
|
||||||
## Ownership
|
## Ownership
|
||||||
|
|
||||||
* Contract creator is owner
|
* Contract creator is owner
|
||||||
* Ownership can be transferred (also to ownership void contract)
|
* Ownership can be transferred (also to ownership void contract "no more changes can be made")
|
||||||
|
|
||||||
|
|
||||||
## Mint
|
## Mint
|
||||||
|
|
||||||
* Owner can add minters
|
* Owner can add minters
|
||||||
- A faucet contract would be a minter
|
- A faucet contract would be a minter and choose the amount of tokens to mint and distribute to new _validated_ users.
|
||||||
|
- The interface says the amount and is at the caller's discretion per contract call. _validation_ is outside of this contract.
|
||||||
* Minters can mint any amount
|
* Minters can mint any amount
|
||||||
|
|
||||||
|
|
||||||
## Demurrage
|
## Demurrage
|
||||||
|
* Holding Tax (`demurrage`) is applied when a **mint** or **transfer** is triggered for first time/block in a new `period`; (it can also be triggered explicitly)
|
||||||
* Decay amount (ppm) and period (blocks) is set at deploy time.
|
|
||||||
- Cannot be changed
|
|
||||||
* Tax is applied when a **mint** or **transfer** is triggered for first time in new period;
|
|
||||||
- Supply _stays the same_.
|
- Supply _stays the same_.
|
||||||
- Updates `demurrageModiifer` which represents an exponential decay step.
|
- Updates `demurrageModifier` which represents the accumulated tax value and is an exponential decay step (of size `demurrage`) for each `period`
|
||||||
|
- `demurrageModifier = (1-demurrage)^period`
|
||||||
|
- e.g. a `demurrage` of 2% at a `period` of 0 would be give a `demurrageModifier= (1-0.02)^0 = 1-1 = 0`.
|
||||||
|
- e.g. a `demurrage` of 2% at a `period` of 1 would be give a `demurrageModifier = (1-0.02)^1 = 0.98`.
|
||||||
|
- e.g. a `demurrage` of 2% at a `period` of 2 would be give a `demurrageModifier = (1-0.02)^2 = 0.9604`.
|
||||||
* All client-facing values (_balance output_ , _transfer inputs_) are adjusted with `demurrageModifier`.
|
* All client-facing values (_balance output_ , _transfer inputs_) are adjusted with `demurrageModifier`.
|
||||||
|
- e.g. `_balance output_ = user_balance - user_balance * demurrageModifier`
|
||||||
* Edge case: `approve` call, which may be called on either side of a period.
|
* Edge case: `approve` call, which may be called on either side of a period.
|
||||||
|
|
||||||
|
|
||||||
@ -28,14 +53,15 @@
|
|||||||
|
|
||||||
* One redistribution entry is added to storage for each period;
|
* One redistribution entry is added to storage for each period;
|
||||||
- When `mint` is triggered, the new totalsupply is stored to the entry
|
- When `mint` is triggered, the new totalsupply is stored to the entry
|
||||||
- When `transfer` is triggered, and the account did not yet participate in the period, the entry's participant count is incremented.
|
- When `transfer` is triggered, and the account did not yet participate in the `period`, the entry's participant count is incremented.
|
||||||
* Account must have "participated" in a period to be redistribution beneficiary.
|
* Account must have "participated" in a period to be redistribution beneficiary.
|
||||||
* Redistribution is applied when an account triggers a **transfer** for the first time in a new period;
|
* Redistribution is applied when an account triggers a **transfer** for the first time in a new period;
|
||||||
- Check if have participated in period.
|
- Check if user has participated in `period`. (_active_ user heartbeat)
|
||||||
- Balance is increased by `(total supply at end of period * demurrage modifier ) / number of participants`
|
- Each _active_ user balance is increased by `(total supply at end of period * demurrageModifier ) / number_of_active_participants` via minting
|
||||||
- Participation field is zeroed out.
|
- Participation field is zeroed out for that user.
|
||||||
* Fractions must be rounded down (TODO)
|
* Fractions must be rounded down (TODO)
|
||||||
- Remainder is "dust" and should be sent to a dedicated "sink" address (TODO)
|
- Remainder is "dust" and should be sent to a dedicated "sink" token address (TODO)
|
||||||
|
- If no one is _active_ all taxes go to the same sink address
|
||||||
|
|
||||||
|
|
||||||
## Data structures
|
## Data structures
|
||||||
@ -48,7 +74,7 @@
|
|||||||
- bits 000-055: period
|
- bits 000-055: period
|
||||||
- bits 056-215: supply
|
- bits 056-215: supply
|
||||||
- bits 216-253: participant count
|
- bits 216-253: participant count
|
||||||
- bits 254: Set if invidiual redistribution amounts are fractions (TODO)
|
- bits 254: Set if individual redistribution amounts are fractions (TODO)
|
||||||
- bits 255: Set if "dust" has been transferred to sink (TODO)
|
- bits 255: Set if "dust" has been transferred to sink (TODO)
|
||||||
|
|
||||||
|
|
||||||
|
Loading…
Reference in New Issue
Block a user