commit f75472fcf5f460f5743ffd844df9bea7cae4ab3c
parent 65a91cc44d7062e24deb14f541109404b8b9bd13
Author: lash <dev@holbrook.no>
Date:   Wed,  1 Mar 2023 12:01:32 +0000
Update readme for calculations and inputs
Diffstat:
2 files changed, 53 insertions(+), 44 deletions(-)
diff --git a/README.md b/README.md
@@ -32,63 +32,75 @@
 
 ## Mint
 
-* Owner can add minters and remove
-  - 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.
-* A minter can remove itself
-* Minters can mint any amount
+* Minters are called writers. Contract owner can add and remove writers.
+* A writer can remove itself
+* The interface says the amount and is at the caller's discretion per contract call. _validation_ is outside of this contract.
+* Writers can mint any amount. If supply cap is set, minting will be limited to this cap.
 
 
-## Demurrage
-* Holding Tax (`demurrage`) is applied when a **mint** or **transfer**; (it can also be triggered explicitly)
-  - Note that the token supply _stays the same_ but a virtual _balance output_ is created.
-  - Updates `demurrageModifier` which represents the accumulated tax value and is an exponential decay step (of size `demurrage`) for each minute that has passed.
-    - `demurrageModifier = (1-demurrage)^(minute_passed)` 
-      - e.g. a `demurrage` of 2% after the 1st minute would be give a `demurrageModifier = (1-0.02)^1 = 0.98`.
-      - e.g. a `demurrage` after the 2nd minute would be give a `demurrageModifier = (1-0.02)^2 = 0.9604`.
-* All client-facing values (_balance output_ , _transfer inputs_) are adjusted with `demurrageModifier`.
-  - e.g. `_balance output_ = user_balance - user_balance * demurrageModifier`
+## Input parameters
+
+The redistrbution period is passed to the contract in minutes. E.g. a redistribution period of one month would be approximately 43200 minutes.
+
+The demurrage level specified as the percentage of continuous growth per minute:
+
+`(1 - percentage) ^ (1 / period)`
+
+E.g. A demurrage of 2% monthly would be defined as:
+
+`(1 - 0.02) ^ (1 / 43200) ~ 0.99999953234484737109`
+
+The number must be provided to the contract as a 64x64 bit fixed-point number (where the integer part is 0).
+
+A script is included in the python package to publish the contract which takes the input as a percentage as parts-per-million and converts the correct input argument for the contract. The calculation can be found in the function `process_config_local` in `python/erc20_demurrage_token/runnable/publish.py`. It uses the python module [dexif](https://pypi.org/project/dexif/) to perform the fixed-point conversion.
+
+
+## Demurrage calculation
+
+The demurrage calculation inside the contract is done by the following formula, where `demurrageLevel` is the demurrage level input parameter of the contract:
+
+`newDemurrageModifier = currentDemurrageModifier * (e ^ (ln(demurrageLevel) * minutes))`
+
+Holding Tax (`demurrage`) is applied when a **mint** or **transfer**; (it can also be triggered explicitly)
+- Note that the token supply _stays the same_ but a virtual _balance output_ is created.
+- Updates `demurrageModifier` which represents the accumulated tax value and is an exponential decay step (of size `demurrage`) for each minute that has passed.
+
+
+All client-facing values (_balance output_ , _transfer inputs_) are adjusted with `demurrageModifier`.
+
+e.g. `_balance output_ = user_balance - user_balance * demurrageModifier`
 
 
 ## Redistribution
 
 * One redistribution entry is added to storage for each `period`;
-  - 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. 
-* 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`;
-  - Check if user has participated in `period`. (_active_ user heartbeat)
-  - Each _active_ user balance in the `period` is increased by `(total supply at end of period * demurrageModifier ) / number_of_active_participants` via minting
-  - Participation field is zeroed out for that user.
-* Fractions must be rounded down
-  - Remainder is "dust" and should be sent to a dedicated Sink Token Address.
-  - If no one is _active_ all taxes go to the Sink Token Address.
+* 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. 
+* Redistributed tokens are added to the balance of the _sink address_ given when the contract is published.
+* _sink address_ may be changed.
 
 
-## Data structures
+## Data representation
 
-* One word per `account`:
-  - bits 000-071: value
-  - bits 072-103: period
-  - bits 104-255: (Unused)
-* One word per `redistributions` period:
-  - bits 000-031: period
-  - bits 032-103: supply
-  - bits 104-139: participant count
-  - bits 140-159: demurrage modifier
-  - bits 160-254: (Unused)
-  - bits     255: Set if individual redistribution amounts are fractions
+Token parameters are truncated when calculating demurrage and redistribution:
 
-### Notes
+* Redistribution period: 32 bits
+* Token supply: 72 bits
+* Demurrage modifier: 64 bits
 
-Accumulated demurrage modifier in `demurrageModifier` is 128 bit, but will be _truncated_ do 20 bits in `redistributions`. The 128 bit resolution is to used to reduce the impact of fractional drift of the long-term accumulation of the demurrage modifier. However, the demurrage snapshot values used in `redistributions` are parts-per-million and can be fully contained within a 20-bit value.
+
+
+## Gas usage
+
+The token contract uses the [ADBKMath](https://github.com/abdk-consulting/abdk-libraries-solidity/blob/master/ABDKMath64x64.sol) library to calculate exponentials.
+
+Gas usage is constant regardless of the amount of time passed between each execution of demurrage and redistribution period calculations.
 
 
 ## QA
 
-* Basic python tests in place
-* How to determine and generate sufficient test vectors, and how to adapt them to scripts.
-* Audit sources?
+* Tests are implemented using the `chaintool` python package suite.
+
 
 ## Known issues
 
diff --git a/solidity/DemurrageTokenSingleNocap.sol b/solidity/DemurrageTokenSingleNocap.sol
@@ -706,9 +706,6 @@ contract DemurrageTokenSingleNocap {
 		if (_sum == 0x9493f8b2) { // EIP173
 			return true;
 		}
-		if (_sum == 0x37a47be4) { // OwnedAccepter
-			return true;
-		}
 		return false;
 	}
 }