| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244 |
- // SPDX-License-Identifier: MIT
- pragma solidity >= 0.8.0;
- library Math {
- function max(uint256 a, uint256 b) internal pure returns (uint256) {
- return a >= b ? a : b;
- }
- function min(uint256 a, uint256 b) internal pure returns (uint256) {
- return a < b ? a : b;
- }
- function average(uint256 a, uint256 b) internal pure returns (uint256) {
- // (a + b) / 2 can overflow, so we distribute
- return (a / 2) + (b / 2) + ((a % 2 + b % 2) / 2);
- }
- }
- library SafeMath {
- function add(uint256 a, uint256 b) internal pure returns (uint256) {
- uint256 c = a + b;
- require(c >= a, "SafeMath: addition overflow");
- return c;
- }
- function sub(uint256 a, uint256 b) internal pure returns (uint256) {
- return sub(a, b, "SafeMath: subtraction overflow");
- }
- function sub(uint256 a, uint256 b, string memory errorMessage) internal pure returns (uint256) {
- require(b <= a, errorMessage);
- uint256 c = a - b;
- return c;
- }
- function mul(uint256 a, uint256 b) internal pure returns (uint256) {
- if (a == 0) {
- return 0;
- }
- uint256 c = a * b;
- require(c / a == b, "SafeMath: multiplication overflow");
- return c;
- }
- function div(uint256 a, uint256 b) internal pure returns (uint256) {
- return div(a, b, "SafeMath: division by zero");
- }
- function div(uint256 a, uint256 b, string memory errorMessage) internal pure returns (uint256) {
- require(b > 0, errorMessage);
- uint256 c = a / b;
- return c;
- }
- function mod(uint256 a, uint256 b) internal pure returns (uint256) {
- return mod(a, b, "SafeMath: modulo by zero");
- }
- function mod(uint256 a, uint256 b, string memory errorMessage) internal pure returns (uint256) {
- require(b != 0, errorMessage);
- return a % b;
- }
- }
- library Address {
- function isContract(address account) internal view returns (bool) {
- uint256 size;
- assembly {size := extcodesize(account)}
- return size > 0;
- }
- function sendValue(address payable recipient, uint256 amount) internal {
- require(address(this).balance >= amount, "Address: insufficient balance");
- (bool success,) = recipient.call{value : amount}("");
- require(success, "Address: unable to send value, recipient may have reverted");
- }
- function functionCall(address target, bytes memory data) internal returns (bytes memory) {
- return functionCall(target, data, "Address: low-level call failed");
- }
- function functionCall(address target, bytes memory data, string memory errorMessage) internal returns (bytes memory) {
- return _functionCallWithValue(target, data, 0, errorMessage);
- }
- function functionCallWithValue(address target, bytes memory data, uint256 value) internal returns (bytes memory) {
- return functionCallWithValue(target, data, value, "Address: low-level call with value failed");
- }
- function functionCallWithValue(address target, bytes memory data, uint256 value, string memory errorMessage) internal returns (bytes memory) {
- require(address(this).balance >= value, "Address: insufficient balance for call");
- return _functionCallWithValue(target, data, value, errorMessage);
- }
- function _functionCallWithValue(address target, bytes memory data, uint256 weiValue, string memory errorMessage) private returns (bytes memory) {
- require(isContract(target), "Address: call to non-contract");
- (bool success, bytes memory returndata) = target.call{value : weiValue}(data);
- if (success) {
- return returndata;
- } else {
- if (returndata.length > 0) {
- assembly {
- let returndata_size := mload(returndata)
- revert(add(32, returndata), returndata_size)
- }
- } else {
- revert(errorMessage);
- }
- }
- }
- }
- library SafeERC20 {
- using SafeMath for uint256;
- using Address for address;
- function safeTransfer(IERC20 token, address to, uint256 value) internal {
- _callOptionalReturn(token, abi.encodeWithSelector(token.transfer.selector, to, value));
- }
- function safeTransferFrom(IERC20 token, address from, address to, uint256 value) internal {
- _callOptionalReturn(token, abi.encodeWithSelector(token.transferFrom.selector, from, to, value));
- }
- function safeApprove(IERC20 token, address spender, uint256 value) internal {
- require((value == 0) || (token.allowance(address(this), spender) == 0),
- "SafeERC20: approve from non-zero to non-zero allowance"
- );
- _callOptionalReturn(token, abi.encodeWithSelector(token.approve.selector, spender, value));
- }
- function safeIncreaseAllowance(IERC20 token, address spender, uint256 value) internal {
- uint256 newAllowance = token.allowance(address(this), spender).add(value);
- _callOptionalReturn(token, abi.encodeWithSelector(token.approve.selector, spender, newAllowance));
- }
- function safeDecreaseAllowance(IERC20 token, address spender, uint256 value) internal {
- uint256 newAllowance = token.allowance(address(this), spender).sub(value, "SafeERC20: decreased allowance below zero");
- _callOptionalReturn(token, abi.encodeWithSelector(token.approve.selector, spender, newAllowance));
- }
- function _callOptionalReturn(IERC20 token, bytes memory data) private {
- bytes memory returndata = address(token).functionCall(data, "SafeERC20: low-level call failed");
- if (returndata.length > 0) {// Return data is optional
- require(abi.decode(returndata, (bool)), "SafeERC20: ERC20 operation did not succeed");
- }
- }
- }
- interface IPair {
- function totalSupply() external view returns (uint256);
- function balanceOf(address account) external view returns (uint256);
- function getReserves() external view returns (uint112 reserve0, uint112 reserve1, uint32 blockTimestampLast);
- function getAmountOut(uint amountIn, uint reserveIn, uint reserveOut) external pure returns (uint amountOut);
- }
- interface IRouter {
- function factory() external pure returns (address);
- function WETH() external pure returns (address);
- function addLiquidity(
- address tokenA,
- address tokenB,
- uint amountADesired,
- uint amountBDesired,
- uint amountAMin,
- uint amountBMin,
- address to,
- uint deadline
- ) external returns (uint amountA, uint amountB, uint liquidity);
- function addLiquidityETH(
- address token,
- uint amountTokenDesired,
- uint amountTokenMin,
- uint amountETHMin,
- address to,
- uint deadline
- ) external payable returns (uint amountToken, uint amountETH, uint liquidity);
- function removeLiquidity(
- address tokenA,
- address tokenB,
- uint liquidity,
- uint amountAMin,
- uint amountBMin,
- address to,
- uint deadline
- ) external returns (uint amountA, uint amountB);
- function removeLiquidityETH(
- address token,
- uint liquidity,
- uint amountTokenMin,
- uint amountETHMin,
- address to,
- uint deadline
- ) external returns (uint amountToken, uint amountETH);
- function removeLiquidityWithPermit(
- address tokenA,
- address tokenB,
- uint liquidity,
- uint amountAMin,
- uint amountBMin,
- address to,
- uint deadline,
- bool approveMax, uint8 v, bytes32 r, bytes32 s
- ) external returns (uint amountA, uint amountB);
- function removeLiquidityETHWithPermit(
- address token,
- uint liquidity,
- uint amountTokenMin,
- uint amountETHMin,
- address to,
- uint deadline,
- bool approveMax, uint8 v, bytes32 r, bytes32 s
- ) external returns (uint amountToken, uint amountETH);
- function swapExactTokensForTokens(
- uint amountIn,
- uint amountOutMin,
- address[] calldata path,
- address to,
- uint deadline
- ) external returns (uint[] memory amounts);
- function swapTokensForExactTokens(
- uint amountOut,
- uint amountInMax,
- address[] calldata path,
- address to,
- uint deadline
- ) external returns (uint[] memory amounts);
- function swapExactETHForTokens(uint amountOutMin, address[] calldata path, address to, uint deadline)
- external
- payable
- returns (uint[] memory amounts);
- function swapTokensForExactETH(uint amountOut, uint amountInMax, address[] calldata path, address to, uint deadline)
- external
- returns (uint[] memory amounts);
- function swapExactTokensForETH(uint amountIn, uint amountOutMin, address[] calldata path, address to, uint deadline)
- external
- returns (uint[] memory amounts);
- function swapETHForExactTokens(uint amountOut, address[] calldata path, address to, uint deadline)
- external
- payable
- returns (uint[] memory amounts);
- function quote(uint amountA, uint reserveA, uint reserveB) external pure returns (uint amountB);
- function getAmountOut(uint amountIn, uint reserveIn, uint reserveOut) external pure returns (uint amountOut);
- function getAmountIn(uint amountOut, uint reserveIn, uint reserveOut) external pure returns (uint amountIn);
- function getAmountsOut(uint amountIn, address[] calldata path) external view returns (uint[] memory amounts);
- function getAmountsIn(uint amountOut, address[] calldata path) external view returns (uint[] memory amounts);
- }
- interface IERC20 {
- function decimals() external view returns (uint256);
- function totalSupply() external view returns (uint256);
- function balanceOf(address account) external view returns (uint256);
- function transfer(address recipient, uint256 amount) external returns (bool);
- function allowance(address owner, address spender) external view returns (uint256);
- function approve(address spender, uint256 amount) external returns (bool);
- function transferFrom(address sender, address recipient, uint256 amount) external returns (bool);
- event Transfer(address indexed from, address indexed to, uint256 value);
- event Approval(address indexed owner, address indexed spender, uint256 value);
- }
|