mirror of
git://holbrook.no/erc20-demurrage-token
synced 2024-12-03 12:16:47 +01:00
Truncate approve request out of value bounds
This commit is contained in:
parent
d7051b26c0
commit
a40385a5a0
File diff suppressed because one or more lines are too long
File diff suppressed because one or more lines are too long
@ -1,6 +1,6 @@
|
|||||||
[metadata]
|
[metadata]
|
||||||
name = erc20-demurrage-token
|
name = erc20-demurrage-token
|
||||||
version = 0.5.5
|
version = 0.5.6
|
||||||
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
|
||||||
|
@ -308,6 +308,30 @@ class TestBasic(TestDemurrageDefault):
|
|||||||
self.assertEqual(r['status'], 1)
|
self.assertEqual(r['status'], 1)
|
||||||
|
|
||||||
|
|
||||||
|
def test_approve_max(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], int.from_bytes(b'\xff' * 32, byteorder='big'))
|
||||||
|
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], 0)
|
||||||
|
self.rpc.do(o)
|
||||||
|
o = receipt(tx_hash)
|
||||||
|
r = self.rpc.do(o)
|
||||||
|
self.assertEqual(r['status'], 1)
|
||||||
|
|
||||||
|
self.backend.time_travel(self.start_time + (60 * 60 * 24 * 365 * 10))
|
||||||
|
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], int.from_bytes(b'\xff' * 32, byteorder='big'))
|
||||||
|
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)
|
||||||
c = DemurrageToken(self.chain_spec, signer=self.signer, nonce_oracle=nonce_oracle)
|
c = DemurrageToken(self.chain_spec, signer=self.signer, nonce_oracle=nonce_oracle)
|
||||||
|
@ -6,6 +6,8 @@ import "aux/ABDKMath64x64.sol";
|
|||||||
|
|
||||||
contract DemurrageTokenSingleNocap {
|
contract DemurrageTokenSingleNocap {
|
||||||
|
|
||||||
|
uint256 constant VALUE_LIMIT = 1 << 63;
|
||||||
|
|
||||||
struct redistributionItem {
|
struct redistributionItem {
|
||||||
uint32 period;
|
uint32 period;
|
||||||
uint72 value;
|
uint72 value;
|
||||||
@ -597,7 +599,14 @@ contract DemurrageTokenSingleNocap {
|
|||||||
|
|
||||||
changePeriod();
|
changePeriod();
|
||||||
|
|
||||||
|
// dex code will attempt uint256max approve, but contract cannot handle that size
|
||||||
|
// truncate to biggest possible value
|
||||||
|
if (_value <= VALUE_LIMIT) {
|
||||||
baseValue = toBaseAmount(_value);
|
baseValue = toBaseAmount(_value);
|
||||||
|
} else {
|
||||||
|
baseValue = VALUE_LIMIT;
|
||||||
|
}
|
||||||
|
|
||||||
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;
|
||||||
|
Loading…
Reference in New Issue
Block a user