Lib.sol 10 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244
  1. // SPDX-License-Identifier: MIT
  2. pragma solidity >= 0.8.0;
  3. library Math {
  4. function max(uint256 a, uint256 b) internal pure returns (uint256) {
  5. return a >= b ? a : b;
  6. }
  7. function min(uint256 a, uint256 b) internal pure returns (uint256) {
  8. return a < b ? a : b;
  9. }
  10. function average(uint256 a, uint256 b) internal pure returns (uint256) {
  11. // (a + b) / 2 can overflow, so we distribute
  12. return (a / 2) + (b / 2) + ((a % 2 + b % 2) / 2);
  13. }
  14. }
  15. library SafeMath {
  16. function add(uint256 a, uint256 b) internal pure returns (uint256) {
  17. uint256 c = a + b;
  18. require(c >= a, "SafeMath: addition overflow");
  19. return c;
  20. }
  21. function sub(uint256 a, uint256 b) internal pure returns (uint256) {
  22. return sub(a, b, "SafeMath: subtraction overflow");
  23. }
  24. function sub(uint256 a, uint256 b, string memory errorMessage) internal pure returns (uint256) {
  25. require(b <= a, errorMessage);
  26. uint256 c = a - b;
  27. return c;
  28. }
  29. function mul(uint256 a, uint256 b) internal pure returns (uint256) {
  30. if (a == 0) {
  31. return 0;
  32. }
  33. uint256 c = a * b;
  34. require(c / a == b, "SafeMath: multiplication overflow");
  35. return c;
  36. }
  37. function div(uint256 a, uint256 b) internal pure returns (uint256) {
  38. return div(a, b, "SafeMath: division by zero");
  39. }
  40. function div(uint256 a, uint256 b, string memory errorMessage) internal pure returns (uint256) {
  41. require(b > 0, errorMessage);
  42. uint256 c = a / b;
  43. return c;
  44. }
  45. function mod(uint256 a, uint256 b) internal pure returns (uint256) {
  46. return mod(a, b, "SafeMath: modulo by zero");
  47. }
  48. function mod(uint256 a, uint256 b, string memory errorMessage) internal pure returns (uint256) {
  49. require(b != 0, errorMessage);
  50. return a % b;
  51. }
  52. }
  53. library Address {
  54. function isContract(address account) internal view returns (bool) {
  55. uint256 size;
  56. assembly {size := extcodesize(account)}
  57. return size > 0;
  58. }
  59. function sendValue(address payable recipient, uint256 amount) internal {
  60. require(address(this).balance >= amount, "Address: insufficient balance");
  61. (bool success,) = recipient.call{value : amount}("");
  62. require(success, "Address: unable to send value, recipient may have reverted");
  63. }
  64. function functionCall(address target, bytes memory data) internal returns (bytes memory) {
  65. return functionCall(target, data, "Address: low-level call failed");
  66. }
  67. function functionCall(address target, bytes memory data, string memory errorMessage) internal returns (bytes memory) {
  68. return _functionCallWithValue(target, data, 0, errorMessage);
  69. }
  70. function functionCallWithValue(address target, bytes memory data, uint256 value) internal returns (bytes memory) {
  71. return functionCallWithValue(target, data, value, "Address: low-level call with value failed");
  72. }
  73. function functionCallWithValue(address target, bytes memory data, uint256 value, string memory errorMessage) internal returns (bytes memory) {
  74. require(address(this).balance >= value, "Address: insufficient balance for call");
  75. return _functionCallWithValue(target, data, value, errorMessage);
  76. }
  77. function _functionCallWithValue(address target, bytes memory data, uint256 weiValue, string memory errorMessage) private returns (bytes memory) {
  78. require(isContract(target), "Address: call to non-contract");
  79. (bool success, bytes memory returndata) = target.call{value : weiValue}(data);
  80. if (success) {
  81. return returndata;
  82. } else {
  83. if (returndata.length > 0) {
  84. assembly {
  85. let returndata_size := mload(returndata)
  86. revert(add(32, returndata), returndata_size)
  87. }
  88. } else {
  89. revert(errorMessage);
  90. }
  91. }
  92. }
  93. }
  94. library SafeERC20 {
  95. using SafeMath for uint256;
  96. using Address for address;
  97. function safeTransfer(IERC20 token, address to, uint256 value) internal {
  98. _callOptionalReturn(token, abi.encodeWithSelector(token.transfer.selector, to, value));
  99. }
  100. function safeTransferFrom(IERC20 token, address from, address to, uint256 value) internal {
  101. _callOptionalReturn(token, abi.encodeWithSelector(token.transferFrom.selector, from, to, value));
  102. }
  103. function safeApprove(IERC20 token, address spender, uint256 value) internal {
  104. require((value == 0) || (token.allowance(address(this), spender) == 0),
  105. "SafeERC20: approve from non-zero to non-zero allowance"
  106. );
  107. _callOptionalReturn(token, abi.encodeWithSelector(token.approve.selector, spender, value));
  108. }
  109. function safeIncreaseAllowance(IERC20 token, address spender, uint256 value) internal {
  110. uint256 newAllowance = token.allowance(address(this), spender).add(value);
  111. _callOptionalReturn(token, abi.encodeWithSelector(token.approve.selector, spender, newAllowance));
  112. }
  113. function safeDecreaseAllowance(IERC20 token, address spender, uint256 value) internal {
  114. uint256 newAllowance = token.allowance(address(this), spender).sub(value, "SafeERC20: decreased allowance below zero");
  115. _callOptionalReturn(token, abi.encodeWithSelector(token.approve.selector, spender, newAllowance));
  116. }
  117. function _callOptionalReturn(IERC20 token, bytes memory data) private {
  118. bytes memory returndata = address(token).functionCall(data, "SafeERC20: low-level call failed");
  119. if (returndata.length > 0) {// Return data is optional
  120. require(abi.decode(returndata, (bool)), "SafeERC20: ERC20 operation did not succeed");
  121. }
  122. }
  123. }
  124. interface IPair {
  125. function totalSupply() external view returns (uint256);
  126. function balanceOf(address account) external view returns (uint256);
  127. function getReserves() external view returns (uint112 reserve0, uint112 reserve1, uint32 blockTimestampLast);
  128. function getAmountOut(uint amountIn, uint reserveIn, uint reserveOut) external pure returns (uint amountOut);
  129. }
  130. interface IRouter {
  131. function factory() external pure returns (address);
  132. function WETH() external pure returns (address);
  133. function addLiquidity(
  134. address tokenA,
  135. address tokenB,
  136. uint amountADesired,
  137. uint amountBDesired,
  138. uint amountAMin,
  139. uint amountBMin,
  140. address to,
  141. uint deadline
  142. ) external returns (uint amountA, uint amountB, uint liquidity);
  143. function addLiquidityETH(
  144. address token,
  145. uint amountTokenDesired,
  146. uint amountTokenMin,
  147. uint amountETHMin,
  148. address to,
  149. uint deadline
  150. ) external payable returns (uint amountToken, uint amountETH, uint liquidity);
  151. function removeLiquidity(
  152. address tokenA,
  153. address tokenB,
  154. uint liquidity,
  155. uint amountAMin,
  156. uint amountBMin,
  157. address to,
  158. uint deadline
  159. ) external returns (uint amountA, uint amountB);
  160. function removeLiquidityETH(
  161. address token,
  162. uint liquidity,
  163. uint amountTokenMin,
  164. uint amountETHMin,
  165. address to,
  166. uint deadline
  167. ) external returns (uint amountToken, uint amountETH);
  168. function removeLiquidityWithPermit(
  169. address tokenA,
  170. address tokenB,
  171. uint liquidity,
  172. uint amountAMin,
  173. uint amountBMin,
  174. address to,
  175. uint deadline,
  176. bool approveMax, uint8 v, bytes32 r, bytes32 s
  177. ) external returns (uint amountA, uint amountB);
  178. function removeLiquidityETHWithPermit(
  179. address token,
  180. uint liquidity,
  181. uint amountTokenMin,
  182. uint amountETHMin,
  183. address to,
  184. uint deadline,
  185. bool approveMax, uint8 v, bytes32 r, bytes32 s
  186. ) external returns (uint amountToken, uint amountETH);
  187. function swapExactTokensForTokens(
  188. uint amountIn,
  189. uint amountOutMin,
  190. address[] calldata path,
  191. address to,
  192. uint deadline
  193. ) external returns (uint[] memory amounts);
  194. function swapTokensForExactTokens(
  195. uint amountOut,
  196. uint amountInMax,
  197. address[] calldata path,
  198. address to,
  199. uint deadline
  200. ) external returns (uint[] memory amounts);
  201. function swapExactETHForTokens(uint amountOutMin, address[] calldata path, address to, uint deadline)
  202. external
  203. payable
  204. returns (uint[] memory amounts);
  205. function swapTokensForExactETH(uint amountOut, uint amountInMax, address[] calldata path, address to, uint deadline)
  206. external
  207. returns (uint[] memory amounts);
  208. function swapExactTokensForETH(uint amountIn, uint amountOutMin, address[] calldata path, address to, uint deadline)
  209. external
  210. returns (uint[] memory amounts);
  211. function swapETHForExactTokens(uint amountOut, address[] calldata path, address to, uint deadline)
  212. external
  213. payable
  214. returns (uint[] memory amounts);
  215. function quote(uint amountA, uint reserveA, uint reserveB) external pure returns (uint amountB);
  216. function getAmountOut(uint amountIn, uint reserveIn, uint reserveOut) external pure returns (uint amountOut);
  217. function getAmountIn(uint amountOut, uint reserveIn, uint reserveOut) external pure returns (uint amountIn);
  218. function getAmountsOut(uint amountIn, address[] calldata path) external view returns (uint[] memory amounts);
  219. function getAmountsIn(uint amountOut, address[] calldata path) external view returns (uint[] memory amounts);
  220. }
  221. interface IERC20 {
  222. function decimals() external view returns (uint256);
  223. function totalSupply() external view returns (uint256);
  224. function balanceOf(address account) external view returns (uint256);
  225. function transfer(address recipient, uint256 amount) external returns (bool);
  226. function allowance(address owner, address spender) external view returns (uint256);
  227. function approve(address spender, uint256 amount) external returns (bool);
  228. function transferFrom(address sender, address recipient, uint256 amount) external returns (bool);
  229. event Transfer(address indexed from, address indexed to, uint256 value);
  230. event Approval(address indexed owner, address indexed spender, uint256 value);
  231. }