reorder ERC20 functions, clean up naming

This commit is contained in:
Noah Zinsmeister
2020-01-22 13:14:55 -05:00
parent ea5e63c427
commit 1a4837bffa
6 changed files with 30 additions and 30 deletions

View File

@ -18,14 +18,12 @@ contract UniswapV2ERC20 is IUniswapV2ERC20 {
bytes32 public constant PERMIT_TYPEHASH = 0x6e71edae12b1b97f4d1f60370fef10105fa2faae0126114a169c64845d6126c9;
mapping (address => uint) public nonces;
event Transfer(address indexed from, address indexed to, uint value);
event Approval(address indexed owner, address indexed spender, uint value);
event Transfer(address indexed from, address indexed to, uint value);
constructor() public {
uint chainId;
assembly { // solium-disable-line security/no-inline-assembly
chainId := chainid()
}
assembly { chainId := chainid() }
DOMAIN_SEPARATOR = keccak256(abi.encode(
keccak256("EIP712Domain(string name,string version,uint256 chainId,address verifyingContract)"),
keccak256(bytes(name)),
@ -41,12 +39,6 @@ contract UniswapV2ERC20 is IUniswapV2ERC20 {
emit Transfer(address(0), to, value);
}
function _transfer(address from, address to, uint value) private {
balanceOf[from] = balanceOf[from].sub(value);
balanceOf[to] = balanceOf[to].add(value);
emit Transfer(from, to, value);
}
function _burn(address from, uint value) internal {
balanceOf[from] = balanceOf[from].sub(value);
totalSupply = totalSupply.sub(value);
@ -58,9 +50,10 @@ contract UniswapV2ERC20 is IUniswapV2ERC20 {
emit Approval(owner, spender, value);
}
function transfer(address to, uint value) external returns (bool) {
_transfer(msg.sender, to, value);
return true;
function _transfer(address from, address to, uint value) private {
balanceOf[from] = balanceOf[from].sub(value);
balanceOf[to] = balanceOf[to].add(value);
emit Transfer(from, to, value);
}
function approve(address spender, uint value) external returns (bool) {
@ -68,6 +61,11 @@ contract UniswapV2ERC20 is IUniswapV2ERC20 {
return true;
}
function transfer(address to, uint value) external returns (bool) {
_transfer(msg.sender, to, value);
return true;
}
function transferFrom(address from, address to, uint value) external returns (bool) {
if (allowance[from][msg.sender] != uint(-1)) {
allowance[from][msg.sender] = allowance[from][msg.sender].sub(value);
@ -81,17 +79,17 @@ contract UniswapV2ERC20 is IUniswapV2ERC20 {
)
external
{
require(nonce == nonces[owner]++, "ERC20: INVALID_NONCE");
require(deadline >= block.timestamp, "ERC20: EXPIRED"); // solium-disable-line security/no-block-members
require(v == 27 || v == 28, "ERC20: INVALID_V");
require(s <= 0x7fffffffffffffffffffffffffffffff5d576e7357a4501ddfe92f46681b20a0, "ERC20: INVALID_S");
require(nonce == nonces[owner]++, "UniswapV2ERC20: INVALID_NONCE");
require(deadline >= block.timestamp, "UniswapV2ERC20: EXPIRED");
require(v == 27 || v == 28, "UniswapV2ERC20: INVALID_V");
require(s <= 0x7fffffffffffffffffffffffffffffff5d576e7357a4501ddfe92f46681b20a0, "UniswapV2ERC20: INVALID_S");
bytes32 digest = keccak256(abi.encodePacked(
"\x19\x01",
DOMAIN_SEPARATOR,
keccak256(abi.encode(PERMIT_TYPEHASH, owner, spender, value, nonce, deadline))
));
address recoveredAddress = ecrecover(digest, v, r, s);
require(recoveredAddress != address(0) && recoveredAddress == owner, "ERC20: INVALID_SIGNATURE");
require(recoveredAddress != address(0) && recoveredAddress == owner, "UniswapV2ERC20: INVALID_SIGNATURE");
_approve(owner, spender, value);
}
}

View File

@ -1,8 +1,8 @@
pragma solidity =0.5.16;
interface IERC20 {
event Transfer(address indexed from, address indexed to, uint value);
event Approval(address indexed owner, address indexed spender, uint value);
event Transfer(address indexed from, address indexed to, uint value);
function name() external view returns (string memory);
function symbol() external view returns (string memory);
@ -11,7 +11,7 @@ interface IERC20 {
function balanceOf(address owner) external view returns (uint);
function allowance(address owner, address spender) external view returns (uint);
function transfer(address to, uint value) external returns (bool);
function approve(address spender, uint value) external returns (bool);
function transfer(address to, uint value) external returns (bool);
function transferFrom(address from, address to, uint value) external returns (bool);
}

View File

@ -1,8 +1,8 @@
pragma solidity =0.5.16;
interface IUniswapV2ERC20 {
event Transfer(address indexed from, address indexed to, uint value);
event Approval(address indexed owner, address indexed spender, uint value);
event Transfer(address indexed from, address indexed to, uint value);
function name() external view returns (string memory);
function symbol() external view returns (string memory);
@ -10,13 +10,15 @@ interface IUniswapV2ERC20 {
function totalSupply() external view returns (uint);
function balanceOf(address owner) external view returns (uint);
function allowance(address owner, address spender) external view returns (uint);
function approve(address spender, uint value) external returns (bool);
function transfer(address to, uint value) external returns (bool);
function transferFrom(address from, address to, uint value) external returns (bool);
function DOMAIN_SEPARATOR() external view returns (bytes32);
function PERMIT_TYPEHASH() external pure returns (bytes32);
function nonces(address owner) external view returns (uint);
function transfer(address to, uint value) external returns (bool);
function approve(address spender, uint value) external returns (bool);
function transferFrom(address from, address to, uint value) external returns (bool);
function permit(
address owner, address spender, uint value, uint nonce, uint expiration, uint8 v, bytes32 r, bytes32 s
)

View File

@ -2,7 +2,7 @@ pragma solidity =0.5.16;
import "../UniswapV2ERC20.sol";
contract GenericERC20 is UniswapV2ERC20 {
contract ERC20 is UniswapV2ERC20 {
constructor(uint _totalSupply) public {
if (_totalSupply > 0) _mint(msg.sender, _totalSupply);
}

View File

@ -7,7 +7,7 @@ import { ecsign } from 'ethereumjs-util'
import { expandTo18Decimals, getApprovalDigest } from './shared/utilities'
import GenericERC20 from '../build/GenericERC20.json'
import ERC20 from '../build/ERC20.json'
chai.use(solidity)
@ -24,7 +24,7 @@ describe('UniswapV2ERC20 via GenericERC20', () => {
let token: Contract
beforeEach(async () => {
token = await deployContract(wallet, GenericERC20, [TOTAL_SUPPLY])
token = await deployContract(wallet, ERC20, [TOTAL_SUPPLY])
})
it('name, symbol, decimals, totalSupply, balanceOf, DOMAIN_SEPARATOR, PERMIT_TYPEHASH', async () => {

View File

@ -4,7 +4,7 @@ import { deployContract } from 'ethereum-waffle'
import { expandTo18Decimals } from './utilities'
import GenericERC20 from '../../build/GenericERC20.json'
import ERC20 from '../../build/ERC20.json'
import UniswapV2Factory from '../../build/UniswapV2Factory.json'
import UniswapV2Exchange from '../../build/UniswapV2Exchange.json'
@ -26,8 +26,8 @@ interface ExchangeFixture extends FactoryFixture {
export async function exchangeFixture(provider: Web3Provider, [wallet]: Wallet[]): Promise<ExchangeFixture> {
const { factory } = await factoryFixture(provider, [wallet])
const tokenA = await deployContract(wallet, GenericERC20, [expandTo18Decimals(10000)])
const tokenB = await deployContract(wallet, GenericERC20, [expandTo18Decimals(10000)])
const tokenA = await deployContract(wallet, ERC20, [expandTo18Decimals(10000)])
const tokenB = await deployContract(wallet, ERC20, [expandTo18Decimals(10000)])
await factory.createExchange(tokenA.address, tokenB.address)
const exchangeAddress = await factory.getExchange(tokenA.address, tokenB.address)