Add delta allowance, approve sets explicit value
This commit is contained in:
parent
166302ef49
commit
4f1bd36c12
@ -1,7 +1,9 @@
|
|||||||
- 0.1.2
|
- 0.2.0
|
||||||
* Add token burn function
|
* Add token burn function
|
||||||
* Fix gas leak when calculating decay on period change
|
* Fix gas leak when calculating decay on period change
|
||||||
* Remove all but SingleNocap contract in make install
|
* Remove all but SingleNocap contract in make install
|
||||||
|
* Make approve explicitly set value
|
||||||
|
* Add increaseAllowance and decreaseAllowance methods
|
||||||
- 0.1.1
|
- 0.1.1
|
||||||
* Settable demurrage steps for apply demurrage cli tool
|
* Settable demurrage steps for apply demurrage cli tool
|
||||||
- 0.1.0
|
- 0.1.0
|
||||||
|
File diff suppressed because one or more lines are too long
File diff suppressed because one or more lines are too long
@ -117,6 +117,34 @@ class DemurrageToken(ERC20):
|
|||||||
return DemurrageToken.__bytecode[name]
|
return DemurrageToken.__bytecode[name]
|
||||||
|
|
||||||
|
|
||||||
|
def increase_allowance(self, contract_address, sender_address, address, value, tx_format=TxFormat.JSONRPC):
|
||||||
|
enc = ABIContractEncoder()
|
||||||
|
enc.method('increaseAllowance')
|
||||||
|
enc.typ(ABIContractType.ADDRESS)
|
||||||
|
enc.typ(ABIContractType.UINT256)
|
||||||
|
enc.address(address)
|
||||||
|
enc.uint256(value)
|
||||||
|
data = enc.get()
|
||||||
|
tx = self.template(sender_address, contract_address, use_nonce=True)
|
||||||
|
tx = self.set_code(tx, data)
|
||||||
|
tx = self.finalize(tx, tx_format)
|
||||||
|
return tx
|
||||||
|
|
||||||
|
|
||||||
|
def decrease_allowance(self, contract_address, sender_address, address, value, tx_format=TxFormat.JSONRPC):
|
||||||
|
enc = ABIContractEncoder()
|
||||||
|
enc.method('decreaseAllowance')
|
||||||
|
enc.typ(ABIContractType.ADDRESS)
|
||||||
|
enc.typ(ABIContractType.UINT256)
|
||||||
|
enc.address(address)
|
||||||
|
enc.uint256(value)
|
||||||
|
data = enc.get()
|
||||||
|
tx = self.template(sender_address, contract_address, use_nonce=True)
|
||||||
|
tx = self.set_code(tx, data)
|
||||||
|
tx = self.finalize(tx, tx_format)
|
||||||
|
return tx
|
||||||
|
|
||||||
|
|
||||||
def add_minter(self, contract_address, sender_address, address, tx_format=TxFormat.JSONRPC):
|
def add_minter(self, contract_address, sender_address, address, tx_format=TxFormat.JSONRPC):
|
||||||
enc = ABIContractEncoder()
|
enc = ABIContractEncoder()
|
||||||
enc.method('addMinter')
|
enc.method('addMinter')
|
||||||
|
@ -1,6 +1,6 @@
|
|||||||
[metadata]
|
[metadata]
|
||||||
name = erc20-demurrage-token
|
name = erc20-demurrage-token
|
||||||
version = 0.1.2
|
version = 0.2.0
|
||||||
description = ERC20 token with redistributed continual demurrage
|
description = ERC20 token with redistributed continual demurrage
|
||||||
author = Louis Holbrook
|
author = Louis Holbrook
|
||||||
author_email = dev@holbrook.no
|
author_email = dev@holbrook.no
|
||||||
|
@ -276,7 +276,52 @@ class TestBasic(TestDemurrageDefault):
|
|||||||
r = self.rpc.do(o)
|
r = self.rpc.do(o)
|
||||||
self.assertEqual(r['status'], 1)
|
self.assertEqual(r['status'], 1)
|
||||||
|
|
||||||
|
|
||||||
|
def test_approve(self):
|
||||||
|
nonce_oracle = RPCNonceOracle(self.accounts[0], self.rpc)
|
||||||
|
c = DemurrageToken(self.chain_spec, signer=self.signer, nonce_oracle=nonce_oracle)
|
||||||
|
(tx_hash, o) = c.approve(self.address, self.accounts[0], self.accounts[1], 500)
|
||||||
|
self.rpc.do(o)
|
||||||
|
o = receipt(tx_hash)
|
||||||
|
r = self.rpc.do(o)
|
||||||
|
self.assertEqual(r['status'], 1)
|
||||||
|
|
||||||
|
(tx_hash, o) = c.approve(self.address, self.accounts[0], self.accounts[1], 600)
|
||||||
|
self.rpc.do(o)
|
||||||
|
o = receipt(tx_hash)
|
||||||
|
r = self.rpc.do(o)
|
||||||
|
self.assertEqual(r['status'], 0)
|
||||||
|
|
||||||
|
(tx_hash, o) = c.approve(self.address, self.accounts[0], self.accounts[1], 0)
|
||||||
|
self.rpc.do(o)
|
||||||
|
o = receipt(tx_hash)
|
||||||
|
r = self.rpc.do(o)
|
||||||
|
self.assertEqual(r['status'], 1)
|
||||||
|
|
||||||
|
(tx_hash, o) = c.approve(self.address, self.accounts[0], self.accounts[1], 600)
|
||||||
|
self.rpc.do(o)
|
||||||
|
o = receipt(tx_hash)
|
||||||
|
r = self.rpc.do(o)
|
||||||
|
self.assertEqual(r['status'], 1)
|
||||||
|
|
||||||
|
(tx_hash, o) = c.increase_allowance(self.address, self.accounts[0], self.accounts[1], 200)
|
||||||
|
self.rpc.do(o)
|
||||||
|
o = receipt(tx_hash)
|
||||||
|
r = self.rpc.do(o)
|
||||||
|
self.assertEqual(r['status'], 1)
|
||||||
|
|
||||||
|
(tx_hash, o) = c.decrease_allowance(self.address, self.accounts[0], self.accounts[1], 800)
|
||||||
|
self.rpc.do(o)
|
||||||
|
o = receipt(tx_hash)
|
||||||
|
r = self.rpc.do(o)
|
||||||
|
self.assertEqual(r['status'], 1)
|
||||||
|
|
||||||
|
(tx_hash, o) = c.approve(self.address, self.accounts[0], self.accounts[1], 42)
|
||||||
|
self.rpc.do(o)
|
||||||
|
o = receipt(tx_hash)
|
||||||
|
r = self.rpc.do(o)
|
||||||
|
self.assertEqual(r['status'], 1)
|
||||||
|
|
||||||
|
|
||||||
def test_transfer_from(self):
|
def test_transfer_from(self):
|
||||||
nonce_oracle = RPCNonceOracle(self.accounts[0], self.rpc)
|
nonce_oracle = RPCNonceOracle(self.accounts[0], self.rpc)
|
||||||
|
@ -425,14 +425,45 @@ contract DemurrageTokenSingleCap {
|
|||||||
function approve(address _spender, uint256 _value) public returns (bool) {
|
function approve(address _spender, uint256 _value) public returns (bool) {
|
||||||
uint256 baseValue;
|
uint256 baseValue;
|
||||||
|
|
||||||
|
if (allowance[msg.sender][_spender] > 0) {
|
||||||
|
require(_value == 0, 'ZERO_FIRST');
|
||||||
|
}
|
||||||
|
|
||||||
changePeriod();
|
changePeriod();
|
||||||
|
|
||||||
baseValue = toBaseAmount(_value);
|
baseValue = toBaseAmount(_value);
|
||||||
allowance[msg.sender][_spender] += baseValue;
|
allowance[msg.sender][_spender] = baseValue;
|
||||||
emit Approval(msg.sender, _spender, _value);
|
emit Approval(msg.sender, _spender, _value);
|
||||||
return true;
|
return true;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// Reduce allowance by amount
|
||||||
|
function decreaseAllowance(address _spender, uint256 _value) public returns (bool) {
|
||||||
|
uint256 baseValue;
|
||||||
|
|
||||||
|
baseValue = toBaseAmount(_value);
|
||||||
|
require(allowance[msg.sender][_spender] <= baseValue);
|
||||||
|
|
||||||
|
changePeriod();
|
||||||
|
|
||||||
|
allowance[msg.sender][_spender] -= baseValue;
|
||||||
|
emit Approval(msg.sender, _spender, allowance[msg.sender][_spender]);
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
|
||||||
|
// Increase allowance by amount
|
||||||
|
function increaseAllowance(address _spender, uint256 _value) public returns (bool) {
|
||||||
|
uint256 baseValue;
|
||||||
|
|
||||||
|
changePeriod();
|
||||||
|
|
||||||
|
baseValue = toBaseAmount(_value);
|
||||||
|
|
||||||
|
allowance[msg.sender][_spender] += baseValue;
|
||||||
|
emit Approval(msg.sender, _spender, allowance[msg.sender][_spender]);
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
|
||||||
// Implements ERC20, triggers tax and/or redistribution
|
// Implements ERC20, triggers tax and/or redistribution
|
||||||
function transfer(address _to, uint256 _value) public returns (bool) {
|
function transfer(address _to, uint256 _value) public returns (bool) {
|
||||||
uint256 baseValue;
|
uint256 baseValue;
|
||||||
|
Reference in New Issue
Block a user