erc20-demurrage-token

ERC20 token with redistributed continual demurrage
Log | Files | Refs | README

commit d795a77deb96e9b2dab9c03e622e8ac62c6025ce
parent ed9d9b3833156ee471eaae0296c4107a15abd4d4
Author: nolash <dev@holbrook.no>
Date:   Fri,  5 Feb 2021 08:45:44 +0100

Save highest two bits in redistribuction work for remainder handling

Diffstat:
Mpython/tests/test_basic.py | 10++++++++++
Msolidity/RedistributedDemurrageToken.sol | 7++++---
2 files changed, 14 insertions(+), 3 deletions(-)

diff --git a/python/tests/test_basic.py b/python/tests/test_basic.py @@ -56,12 +56,14 @@ class Test(unittest.TestCase): pass + @unittest.skip('test') def test_hello(self): self.assertEqual(self.contract.functions.actualPeriod().call(), 1) self.eth_tester.mine_blocks(PERIOD) self.assertEqual(self.contract.functions.actualPeriod().call(), 2) + @unittest.skip('test') def test_mint(self): tx_hash = self.contract.functions.mintTo(self.w3.eth.accounts[1], 1024).transact() r = self.w3.eth.getTransactionReceipt(tx_hash) @@ -86,6 +88,7 @@ class Test(unittest.TestCase): tx_hash = self.contract.functions.transfer(self.w3.eth.accounts[2], 500).transact({'from': self.w3.eth.accounts[1]}) r = self.w3.eth.getTransactionReceipt(tx_hash) self.assertEqual(r.status, 1) + logg.debug('tx {}'.format(r)) balance_alice = self.contract.functions.balanceOf(self.w3.eth.accounts[1]).call() self.assertEqual(balance_alice, 524) @@ -93,7 +96,12 @@ class Test(unittest.TestCase): balance_bob = self.contract.functions.balanceOf(self.w3.eth.accounts[2]).call() self.assertEqual(balance_bob, 500) + tx_hash = self.contract.functions.transfer(self.w3.eth.accounts[2], 500).transact({'from': self.w3.eth.accounts[1]}) + r = self.w3.eth.getTransactionReceipt(tx_hash) + self.assertEqual(r.status, 1) + logg.debug('tx {}'.format(r)) + @unittest.skip('test') def test_apply_tax(self): self.eth_tester.mine_blocks(PERIOD) tx_hash = self.contract.functions.applyTax().transact() @@ -108,6 +116,7 @@ class Test(unittest.TestCase): self.assertEqual(self.contract.functions.demurrageModifier().call(), 960400) + @unittest.skip('test') def test_tax_balance(self): tx_hash = self.contract.functions.mintTo(self.w3.eth.accounts[1], 1000).transact() r = self.w3.eth.getTransactionReceipt(tx_hash) @@ -122,6 +131,7 @@ class Test(unittest.TestCase): self.assertEqual(balance, 980) + @unittest.skip('test') def test_taxed_transfer(self): tx_hash = self.contract.functions.mintTo(self.w3.eth.accounts[1], 1000000).transact() r = self.w3.eth.getTransactionReceipt(tx_hash) diff --git a/solidity/RedistributedDemurrageToken.sol b/solidity/RedistributedDemurrageToken.sol @@ -2,6 +2,7 @@ pragma solidity > 0.6.11; // SPDX-License-Identifier: GPL-3.0-or-later +// TODO: assign bitmask values to contants contract RedistributedDemurrageToken { address public owner; @@ -15,7 +16,7 @@ contract RedistributedDemurrageToken { uint256 public taxLevel; // PPM uint256 public demurrageModifier; // PPM - bytes32[] public redistributions; // uint40(participants) | uint160(value) | uint56(period) + bytes32[] public redistributions; // uint1(usedDustSink) | uint1(isFractional) | uint38(participants) | uint160(value) | uint56(period) mapping (address => bytes32) account; // uint12(period) | uint160(value) mapping (address => bool) minter; @@ -121,7 +122,7 @@ contract RedistributedDemurrageToken { // Serializes the number of participants part of the redistribution word function toRedistributionParticipants(bytes32 redistribution) public pure returns (uint256) { - return uint256(redistribution & 0xffffffffff000000000000000000000000000000000000000000000000000000) >> 216; + return uint256(redistribution & 0x3fffffffff000000000000000000000000000000000000000000000000000000) >> 216; } // Client accessor to the redistributions array length @@ -148,7 +149,7 @@ contract RedistributedDemurrageToken { uint256 currentRedistribution; currentRedistribution = uint256(redistributions[redistributions.length-1]); - currentRedistribution &= 0xffffffffff0000000000000000000000000000000000000000ffffffffffffff; + currentRedistribution &= 0x3fffffffff0000000000000000000000000000000000000000ffffffffffffff; currentRedistribution |= totalSupply << 56; redistributions[redistributions.length-1] = bytes32(currentRedistribution);