123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134 |
- // SPDX-License-Identifier: BUSL-1.1
- pragma solidity 0.7.6;
- // libraries
- import "@openzeppelin/contracts/math/SafeMath.sol";
- contract LPTokenERC20 {
- using SafeMath for uint256;
- //---------------------------------------------------------------------------
- // CONSTANTS
- string public name;
- string public symbol;
- bytes32 public constant PERMIT_TYPEHASH = 0x6e71edae12b1b97f4d1f60370fef10105fa2faae0126114a169c64845d6126c9;
- // set in constructor
- bytes32 public DOMAIN_SEPARATOR;
- //---------------------------------------------------------------------------
- // VARIABLES
- uint256 public decimals;
- uint256 public totalSupply;
- mapping(address => uint256) public balanceOf;
- mapping(address => mapping(address => uint256)) public allowance;
- mapping(address => uint256) public nonces;
- //---------------------------------------------------------------------------
- // EVENTS
- event Approval(address indexed owner, address indexed spender, uint256 value);
- event Transfer(address indexed from, address indexed to, uint256 value);
- constructor(string memory _name, string memory _symbol) {
- name = _name;
- symbol = _symbol;
- uint256 chainId;
- assembly {
- chainId := chainid()
- }
- DOMAIN_SEPARATOR = keccak256(
- abi.encode(
- keccak256("EIP712Domain(string name,string version,uint256 chainId,address verifyingContract)"),
- keccak256(bytes(name)),
- keccak256(bytes("1")),
- chainId,
- address(this)
- )
- );
- }
- function _mint(address to, uint256 value) internal {
- totalSupply = totalSupply.add(value);
- balanceOf[to] = balanceOf[to].add(value);
- emit Transfer(address(0), to, value);
- }
- function _burn(address from, uint256 value) internal {
- balanceOf[from] = balanceOf[from].sub(value);
- totalSupply = totalSupply.sub(value);
- emit Transfer(from, address(0), value);
- }
- function _approve(
- address owner,
- address spender,
- uint256 value
- ) private {
- allowance[owner][spender] = value;
- emit Approval(owner, spender, value);
- }
- function _transfer(
- address from,
- address to,
- uint256 value
- ) private {
- balanceOf[from] = balanceOf[from].sub(value);
- balanceOf[to] = balanceOf[to].add(value);
- emit Transfer(from, to, value);
- }
- function approve(address spender, uint256 value) external returns (bool) {
- _approve(msg.sender, spender, value);
- return true;
- }
- function transfer(address to, uint256 value) external returns (bool) {
- _transfer(msg.sender, to, value);
- return true;
- }
- function transferFrom(
- address from,
- address to,
- uint256 value
- ) external returns (bool) {
- if (allowance[from][msg.sender] != uint256(-1)) {
- allowance[from][msg.sender] = allowance[from][msg.sender].sub(value);
- }
- _transfer(from, to, value);
- return true;
- }
- function increaseAllowance(address spender, uint256 addedValue) public virtual returns (bool) {
- _approve(msg.sender, spender, allowance[msg.sender][spender].add(addedValue));
- return true;
- }
- function decreaseAllowance(address spender, uint256 subtractedValue) public virtual returns (bool) {
- _approve(msg.sender, spender, allowance[msg.sender][spender].sub(subtractedValue, "ERC20: decreased allowance below zero"));
- return true;
- }
- function permit(
- address owner,
- address spender,
- uint256 value,
- uint256 deadline,
- uint8 v,
- bytes32 r,
- bytes32 s
- ) external {
- require(deadline >= block.timestamp, "Bridge: EXPIRED");
- bytes32 digest = keccak256(
- abi.encodePacked(
- "\x19\x01",
- DOMAIN_SEPARATOR,
- keccak256(abi.encode(PERMIT_TYPEHASH, owner, spender, value, nonces[owner]++, deadline))
- )
- );
- address recoveredAddress = ecrecover(digest, v, r, s);
- require(recoveredAddress != address(0) && recoveredAddress == owner, "Bridge: INVALID_SIGNATURE");
- _approve(owner, spender, value);
- }
- }
|