LPTokenERC20.sol 4.3 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134
  1. // SPDX-License-Identifier: BUSL-1.1
  2. pragma solidity 0.7.6;
  3. // libraries
  4. import "@openzeppelin/contracts/math/SafeMath.sol";
  5. contract LPTokenERC20 {
  6. using SafeMath for uint256;
  7. //---------------------------------------------------------------------------
  8. // CONSTANTS
  9. string public name;
  10. string public symbol;
  11. bytes32 public constant PERMIT_TYPEHASH = 0x6e71edae12b1b97f4d1f60370fef10105fa2faae0126114a169c64845d6126c9;
  12. // set in constructor
  13. bytes32 public DOMAIN_SEPARATOR;
  14. //---------------------------------------------------------------------------
  15. // VARIABLES
  16. uint256 public decimals;
  17. uint256 public totalSupply;
  18. mapping(address => uint256) public balanceOf;
  19. mapping(address => mapping(address => uint256)) public allowance;
  20. mapping(address => uint256) public nonces;
  21. //---------------------------------------------------------------------------
  22. // EVENTS
  23. event Approval(address indexed owner, address indexed spender, uint256 value);
  24. event Transfer(address indexed from, address indexed to, uint256 value);
  25. constructor(string memory _name, string memory _symbol) {
  26. name = _name;
  27. symbol = _symbol;
  28. uint256 chainId;
  29. assembly {
  30. chainId := chainid()
  31. }
  32. DOMAIN_SEPARATOR = keccak256(
  33. abi.encode(
  34. keccak256("EIP712Domain(string name,string version,uint256 chainId,address verifyingContract)"),
  35. keccak256(bytes(name)),
  36. keccak256(bytes("1")),
  37. chainId,
  38. address(this)
  39. )
  40. );
  41. }
  42. function _mint(address to, uint256 value) internal {
  43. totalSupply = totalSupply.add(value);
  44. balanceOf[to] = balanceOf[to].add(value);
  45. emit Transfer(address(0), to, value);
  46. }
  47. function _burn(address from, uint256 value) internal {
  48. balanceOf[from] = balanceOf[from].sub(value);
  49. totalSupply = totalSupply.sub(value);
  50. emit Transfer(from, address(0), value);
  51. }
  52. function _approve(
  53. address owner,
  54. address spender,
  55. uint256 value
  56. ) private {
  57. allowance[owner][spender] = value;
  58. emit Approval(owner, spender, value);
  59. }
  60. function _transfer(
  61. address from,
  62. address to,
  63. uint256 value
  64. ) private {
  65. balanceOf[from] = balanceOf[from].sub(value);
  66. balanceOf[to] = balanceOf[to].add(value);
  67. emit Transfer(from, to, value);
  68. }
  69. function approve(address spender, uint256 value) external returns (bool) {
  70. _approve(msg.sender, spender, value);
  71. return true;
  72. }
  73. function transfer(address to, uint256 value) external returns (bool) {
  74. _transfer(msg.sender, to, value);
  75. return true;
  76. }
  77. function transferFrom(
  78. address from,
  79. address to,
  80. uint256 value
  81. ) external returns (bool) {
  82. if (allowance[from][msg.sender] != uint256(-1)) {
  83. allowance[from][msg.sender] = allowance[from][msg.sender].sub(value);
  84. }
  85. _transfer(from, to, value);
  86. return true;
  87. }
  88. function increaseAllowance(address spender, uint256 addedValue) public virtual returns (bool) {
  89. _approve(msg.sender, spender, allowance[msg.sender][spender].add(addedValue));
  90. return true;
  91. }
  92. function decreaseAllowance(address spender, uint256 subtractedValue) public virtual returns (bool) {
  93. _approve(msg.sender, spender, allowance[msg.sender][spender].sub(subtractedValue, "ERC20: decreased allowance below zero"));
  94. return true;
  95. }
  96. function permit(
  97. address owner,
  98. address spender,
  99. uint256 value,
  100. uint256 deadline,
  101. uint8 v,
  102. bytes32 r,
  103. bytes32 s
  104. ) external {
  105. require(deadline >= block.timestamp, "Bridge: EXPIRED");
  106. bytes32 digest = keccak256(
  107. abi.encodePacked(
  108. "\x19\x01",
  109. DOMAIN_SEPARATOR,
  110. keccak256(abi.encode(PERMIT_TYPEHASH, owner, spender, value, nonces[owner]++, deadline))
  111. )
  112. );
  113. address recoveredAddress = ecrecover(digest, v, r, s);
  114. require(recoveredAddress != address(0) && recoveredAddress == owner, "Bridge: INVALID_SIGNATURE");
  115. _approve(owner, spender, value);
  116. }
  117. }