Transaction Hash:
Block:
21164455 at Nov-11-2024 12:30:59 PM +UTC
Transaction Fee:
0.003915719983107966 ETH
$7.94
Gas Used:
170,318 Gas / 22.990640937 Gwei
Emitted Events:
241 |
WETH9.Deposit( dst=[Receiver] DooarSwapV2Router02, wad=2000000000000000 )
|
242 |
WETH9.Transfer( src=[Receiver] DooarSwapV2Router02, dst=0x9c2DC3D5ffcEcF61312C5F4C00660695B32fB3D1, wad=2000000000000000 )
|
243 |
FiatTokenProxy.0xddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef( 0xddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef, 0x0000000000000000000000009c2dc3d5ffcecf61312c5f4c00660695b32fb3d1, 0x000000000000000000000000aeaca8c32039a466fb32bde6f566130a1f49d21e, 00000000000000000000000000000000000000000000000000000000005ff136 )
|
244 |
0x9c2dc3d5ffcecf61312c5f4c00660695b32fb3d1.0x1c411e9a96e071241c2f21f7726b17ae89e3cab4c78be50e062b03a9fffbbad1( 0x1c411e9a96e071241c2f21f7726b17ae89e3cab4c78be50e062b03a9fffbbad1, 000000000000000000000000000000000000000000000000000000cb5e13285f, 00000000000000000000000000000000000000000000000ee9287d9263542934 )
|
245 |
0x9c2dc3d5ffcecf61312c5f4c00660695b32fb3d1.0xd78ad95fa46c994b6551d0da85fc275fe613ce37657fb8d5e3d130840159d822( 0xd78ad95fa46c994b6551d0da85fc275fe613ce37657fb8d5e3d130840159d822, 0x00000000000000000000000053e0e51b5ed9202110d7ecd637a4581db8b9879f, 0x000000000000000000000000aeaca8c32039a466fb32bde6f566130a1f49d21e, 0000000000000000000000000000000000000000000000000000000000000000, 00000000000000000000000000000000000000000000000000071afd498d0000, 00000000000000000000000000000000000000000000000000000000005ff136, 0000000000000000000000000000000000000000000000000000000000000000 )
|
246 |
GreenMetaverseToken.Transfer( from=0xAeAca8C32039A466FB32Bde6F566130A1f49D21e, to=[Sender] 0xcb292d6df9b343f9cc333c4b98d7a89d67df8bd7, value=4229368711 )
|
247 |
0xaeaca8c32039a466fb32bde6f566130a1f49d21e.0x1c411e9a96e071241c2f21f7726b17ae89e3cab4c78be50e062b03a9fffbbad1( 0x1c411e9a96e071241c2f21f7726b17ae89e3cab4c78be50e062b03a9fffbbad1, 000000000000000000000000000000000000000000000000000000c9b067468d, 0000000000000000000000000000000000000000000000000002174a79549260 )
|
248 |
0xaeaca8c32039a466fb32bde6f566130a1f49d21e.0xd78ad95fa46c994b6551d0da85fc275fe613ce37657fb8d5e3d130840159d822( 0xd78ad95fa46c994b6551d0da85fc275fe613ce37657fb8d5e3d130840159d822, 0x00000000000000000000000053e0e51b5ed9202110d7ecd637a4581db8b9879f, 0x000000000000000000000000cb292d6df9b343f9cc333c4b98d7a89d67df8bd7, 00000000000000000000000000000000000000000000000000000000005ff136, 0000000000000000000000000000000000000000000000000000000000000000, 0000000000000000000000000000000000000000000000000000000000000000, 00000000000000000000000000000000000000000000000000000000fc170b87 )
|
Account State Difference:
Address | Before | After | State Difference | ||
---|---|---|---|---|---|
0x4838B106...B0BAD5f97
Miner
| (Titan Builder) | 13.277195956244959051 Eth | 13.277857038432447571 Eth | 0.00066108218748852 | |
0x9c2DC3D5...5B32fB3D1 | |||||
0xA0b86991...E3606eB48 | |||||
0xAeAca8C3...A1f49D21e | |||||
0xC02aaA39...83C756Cc2 | 2,905,019.313277661710057774 Eth | 2,905,019.315277661710057774 Eth | 0.002 | ||
0xcB292D6d...d67dF8BD7 |
0.014153213403572549 Eth
Nonce: 35
|
0.008237493420464583 Eth
Nonce: 36
| 0.005915719983107966 | ||
0xe3c408BD...2954ff740 |
Execution Trace
ETH 0.002
DooarSwapV2Router02.swapExactETHForTokens( amountOutMin=4208221867, path=[0xC02aaA39b223FE8D0A0e5C4F27eAD9083C756Cc2, 0xA0b86991c6218b36c1d19D4a2e9Eb0cE3606eB48, 0xe3c408BD53c31C085a1746AF401A4042954ff740], to=0xcB292D6dF9B343f9CC333C4b98d7A89d67dF8BD7, deadline=1731328846 ) => ( amounts=[2000000000000000, 6287670, 4229368711] )
-
0x9c2dc3d5ffcecf61312c5f4c00660695b32fb3d1.STATICCALL( )
-
0xaeaca8c32039a466fb32bde6f566130a1f49d21e.STATICCALL( )
- ETH 0.002
WETH9.CALL( )
-
WETH9.transfer( dst=0x9c2DC3D5ffcEcF61312C5F4C00660695B32fB3D1, wad=2000000000000000 ) => ( True )
0x9c2dc3d5ffcecf61312c5f4c00660695b32fb3d1.022c0d9f( )
FiatTokenProxy.a9059cbb( )
-
FiatTokenV2_2.transfer( to=0xAeAca8C32039A466FB32Bde6F566130A1f49D21e, value=6287670 ) => ( True )
-
FiatTokenProxy.70a08231( )
-
FiatTokenV2_2.balanceOf( account=0x9c2DC3D5ffcEcF61312C5F4C00660695B32fB3D1 ) => ( 873456674911 )
-
-
WETH9.balanceOf( 0x9c2DC3D5ffcEcF61312C5F4C00660695B32fB3D1 ) => ( 275055233509524515124 )
0xaeaca8c32039a466fb32bde6f566130a1f49d21e.022c0d9f( )
-
GreenMetaverseToken.transfer( to=0xcB292D6dF9B343f9CC333C4b98d7A89d67dF8BD7, amount=4229368711 ) => ( True )
FiatTokenProxy.70a08231( )
-
FiatTokenV2_2.balanceOf( account=0xAeAca8C32039A466FB32Bde6F566130A1f49D21e ) => ( 866247984781 )
-
-
GreenMetaverseToken.balanceOf( account=0xAeAca8C32039A466FB32Bde6F566130A1f49D21e ) => ( 588558584025696 )
-
File 1 of 5: DooarSwapV2Router02
File 2 of 5: WETH9
File 3 of 5: FiatTokenProxy
File 4 of 5: GreenMetaverseToken
File 5 of 5: FiatTokenV2_2
1{"DooarSwapV2Library.sol":{"content":"pragma solidity \u003e=0.5.0;\n\nimport \u0027../IDooarSwapV2Pair.sol\u0027;\n\nimport \"./SafeMath.sol\";\n\nlibrary DooarSwapV2Library {\n using SafeMath for uint;\n\n // returns sorted token addresses, used to handle return values from pairssorted in this order\n function sortTokens(address tokenA, address tokenB) internal pure returns (address token0, address token1) {\nrequire(tokenA != tokenB, \u0027DooarSwapV2Library: IDENTICAL_ADDRESSES\u0027);\n (token0, token1) = tokenA \u003c tokenB ? (tokenA, tokenB): (tokenB, tokenA);\n require(token0 != address(0), \u0027DooarSwapV2Library: ZERO_ADDRESS\u0027);\n }\n\n // calculates the CREATE2address for a pair without making any external calls\n function pairFor(address factory, address tokenA, address tokenB) internal pure returns(address pair) {\n (address token0, address token1) = sortTokens(tokenA, tokenB);\n pair = address(uint(keccak256(abi.encodePacked(\nhex\u0027ff\u0027,\n factory,\n keccak256(abi.encodePacked(token0, token1)),\nhex\u00278810cdfaaaa2c6c56fdebd83b2c9e7cc71e3ef06ec0c62e029c6476ff05136da\u0027 // init code hash\n ))));\n }\n\n // fetches andsorts the reserves for a pair\n function getReserves(address factory, address tokenA, address tokenB) internal view returns (uint reserveA, uintreserveB) {\n (address token0,) = sortTokens(tokenA, tokenB);\n (uint reserve0, uint reserve1,) = IDooarSwapV2Pair(pairFor(factory,tokenA, tokenB)).getReserves();\n (reserveA, reserveB) = tokenA == token0 ? (reserve0, reserve1) : (reserve1, reserve0);\n }\n\n //given some amount of an asset and pair reserves, returns an equivalent amount of the other asset\n function quote(uint amountA, uint reserveA,uint reserveB) internal pure returns (uint amountB) {\n require(amountA \u003e 0, \u0027DooarSwapV2Library: INSUFFICIENT_AMOUNT\u0027);\nrequire(reserveA \u003e 0 \u0026\u0026 reserveB \u003e 0, \u0027DooarSwapV2Library: INSUFFICIENT_LIQUIDITY\u0027);\n amountB = amountA.mul(reserveB) / reserveA;\n }\n\n // given an input amount of an asset and pair reserves, returns the maximum output amount of the otherasset\n function getAmountOut(uint amountIn, uint reserveIn, uint reserveOut) internal pure returns (uint amountOut) {\n require(amountIn\u003e 0, \u0027DooarSwapV2Library: INSUFFICIENT_INPUT_AMOUNT\u0027);\n require(reserveIn \u003e 0 \u0026\u0026 reserveOut \u003e 0,\u0027DooarSwapV2Library: INSUFFICIENT_LIQUIDITY\u0027);\n uint amountInWithFee = amountIn.mul(99);\n uint numerator =amountInWithFee.mul(reserveOut);\n uint denominator = reserveIn.mul(100).add(amountInWithFee);\n amountOut = numerator / denominator;\n }\n\n // given an output amount of an asset and pair reserves, returns a required input amount of the other asset\n functiongetAmountIn(uint amountOut, uint reserveIn, uint reserveOut) internal pure returns (uint amountIn) {\n require(amountOut \u003e 0,\u0027DooarSwapV2Library: INSUFFICIENT_OUTPUT_AMOUNT\u0027);\n require(reserveIn \u003e 0 \u0026\u0026 reserveOut \u003e 0,\u0027DooarSwapV2Library: INSUFFICIENT_LIQUIDITY\u0027);\n uint numerator = reserveIn.mul(amountOut).mul(100);\n uint denominator =reserveOut.sub(amountOut).mul(99);\n amountIn = (numerator / denominator).add(1);\n }\n\n // performs chained getAmountOutcalculations on any number of pairs\n function getAmountsOut(address factory, uint amountIn, address[] memory path) internal view returns(uint[] memory amounts) {\n require(path.length \u003e= 2, \u0027DooarSwapV2Library: INVALID_PATH\u0027);\n amounts = new uint[](path.length);\n amounts[0] = amountIn;\n for (uint i; i \u003c path.length - 1; i++) {\n (uint reserveIn, uint reserveOut) =getReserves(factory, path[i], path[i + 1]);\n amounts[i + 1] = getAmountOut(amounts[i], reserveIn, reserveOut);\n }\n }\n\n// performs chained getAmountIn calculations on any number of pairs\n function getAmountsIn(address factory, uint amountOut, address[] memorypath) internal view returns (uint[] memory amounts) {\n require(path.length \u003e= 2, \u0027DooarSwapV2Library: INVALID_PATH\u0027);\namounts = new uint[](path.length);\n amounts[amounts.length - 1] = amountOut;\n for (uint i = path.length - 1; i \u003e 0; i--){\n (uint reserveIn, uint reserveOut) = getReserves(factory, path[i - 1], path[i]);\n amounts[i - 1] = getAmountIn(amounts[i], reserveIn, reserveOut);\n }\n }\n}"},"DooarSwapV2Router02.sol":{"content":"pragma solidity =0.6.6;\n\nimport \u0027./IDooarSwapV2Factory.sol\u0027;\nimport \u0027./TransferHelper.sol\u0027;\n\nimport \u0027./IDooarSwapV2Router02.sol\u0027;\nimport \u0027./DooarSwapV2Library.sol\u0027;\nimport \u0027./SafeMath.sol\u0027;\nimport \u0027./IERC20.sol\u0027;\nimport \u0027./IWETH.sol\u0027;\n\ncontractDooarSwapV2Router02 is IDooarSwapV2Router02 {\n using SafeMath for uint;\n\n address public immutable override factory;\n address publicimmutable override WETH;\n\n modifier ensure(uint deadline) {\n require(deadline \u003e= block.timestamp, \u0027DooarSwapV2Router:EXPIRED\u0027);\n _;\n }\n\n constructor(address _factory, address _WETH) public {\n factory = _factory;\n WETH = _WETH;\n }\n\n receive() external payable {\n assert(msg.sender == WETH); // only accept ETH via fallback from the WETH contract\n }\n\n// **** ADD LIQUIDITY ****\n function _addLiquidity(\n address tokenA,\n address tokenB,\n uint amountADesired,\nuint amountBDesired,\n uint amountAMin,\n uint amountBMin\n ) internal virtual returns (uint amountA, uint amountB) {\n //create the pair if it doesn\u0027t exist yet\n if (IDooarSwapV2Factory(factory).getPair(tokenA, tokenB) == address(0)) {\nIDooarSwapV2Factory(factory).createPair(tokenA, tokenB);\n }\n (uint reserveA, uint reserveB) = DooarSwapV2Library.getReserves(factory, tokenA, tokenB);\n if (reserveA == 0 \u0026\u0026 reserveB == 0) {\n (amountA, amountB) = (amountADesired,amountBDesired);\n } else {\n uint amountBOptimal = DooarSwapV2Library.quote(amountADesired, reserveA, reserveB);\n if(amountBOptimal \u003c= amountBDesired) {\n require(amountBOptimal \u003e= amountBMin, \u0027DooarSwapV2Router:INSUFFICIENT_B_AMOUNT\u0027);\n (amountA, amountB) = (amountADesired, amountBOptimal);\n } else {\n uintamountAOptimal = DooarSwapV2Library.quote(amountBDesired, reserveB, reserveA);\n assert(amountAOptimal \u003c= amountADesired);\nrequire(amountAOptimal \u003e= amountAMin, \u0027DooarSwapV2Router: INSUFFICIENT_A_AMOUNT\u0027);\n (amountA, amountB)= (amountAOptimal, amountBDesired);\n }\n }\n }\n function addLiquidity(\n address tokenA,\n address tokenB,\n uint amountADesired,\n uint amountBDesired,\n uint amountAMin,\n uint amountBMin,\n address to,\nuint deadline\n ) external virtual override ensure(deadline) returns (uint amountA, uint amountB, uint liquidity) {\n (amountA, amountB)= _addLiquidity(tokenA, tokenB, amountADesired, amountBDesired, amountAMin, amountBMin);\n address pair = DooarSwapV2Library.pairFor(factory, tokenA, tokenB);\n TransferHelper.safeTransferFrom(tokenA, msg.sender, pair, amountA);\n TransferHelper.safeTransferFrom(tokenB,msg.sender, pair, amountB);\n liquidity = IDooarSwapV2Pair(pair).mint(to);\n }\n function addLiquidityETH(\n address token,\nuint amountTokenDesired,\n uint amountTokenMin,\n uint amountETHMin,\n address to,\n uint deadline\n )external virtual override payable ensure(deadline) returns (uint amountToken, uint amountETH, uint liquidity) {\n (amountToken, amountETH) =_addLiquidity(\n token,\n WETH,\n amountTokenDesired,\n msg.value,\n amountTokenMin,\namountETHMin\n );\n address pair = DooarSwapV2Library.pairFor(factory, token, WETH);\n TransferHelper.safeTransferFrom(token, msg.sender, pair, amountToken);\n IWETH(WETH).deposit{value: amountETH}();\n assert(IWETH(WETH).transfer(pair, amountETH));\nliquidity = IDooarSwapV2Pair(pair).mint(to);\n // refund dust eth, if any\n if (msg.value \u003e amountETH) TransferHelper.safeTransferETH(msg.sender, msg.value - amountETH);\n }\n\n // **** REMOVE LIQUIDITY ****\n function removeLiquidity(\n addresstokenA,\n address tokenB,\n uint liquidity,\n uint amountAMin,\n uint amountBMin,\n address to,\n uintdeadline\n ) public virtual override ensure(deadline) returns (uint amountA, uint amountB) {\n address pair = DooarSwapV2Library.pairFor(factory, tokenA, tokenB);\n IDooarSwapV2Pair(pair).transferFrom(msg.sender, pair, liquidity); // send liquidity to pair\n (uintamount0, uint amount1) = IDooarSwapV2Pair(pair).burn(to);\n (address token0,) = DooarSwapV2Library.sortTokens(tokenA, tokenB);\n(amountA, amountB) = tokenA == token0 ? (amount0, amount1) : (amount1, amount0);\n require(amountA \u003e= amountAMin,\u0027DooarSwapV2Router: INSUFFICIENT_A_AMOUNT\u0027);\n require(amountB \u003e= amountBMin, \u0027DooarSwapV2Router:INSUFFICIENT_B_AMOUNT\u0027);\n }\n function removeLiquidityETH(\n address token,\n uint liquidity,\n uintamountTokenMin,\n uint amountETHMin,\n address to,\n uint deadline\n ) public virtual override ensure(deadline) returns(uint amountToken, uint amountETH) {\n (amountToken, amountETH) = removeLiquidity(\n token,\n WETH,\nliquidity,\n amountTokenMin,\n amountETHMin,\n address(this),\n deadline\n );\nTransferHelper.safeTransfer(token, to, amountToken);\n IWETH(WETH).withdraw(amountETH);\n TransferHelper.safeTransferETH(to,amountETH);\n }\n function removeLiquidityWithPermit(\n address tokenA,\n address tokenB,\n uint liquidity,\nuint amountAMin,\n uint amountBMin,\n address to,\n uint deadline,\n bool approveMax, uint8 v, bytes32 r, bytes32 s\n) external virtual override returns (uint amountA, uint amountB) {\n address pair = DooarSwapV2Library.pairFor(factory, tokenA, tokenB);\nuint value = approveMax ? uint(-1) : liquidity;\n IDooarSwapV2Pair(pair).permit(msg.sender, address(this), value, deadline, v, r, s);\n (amountA, amountB) = removeLiquidity(tokenA, tokenB, liquidity, amountAMin, amountBMin, to, deadline);\n }\n functionremoveLiquidityETHWithPermit(\n address token,\n uint liquidity,\n uint amountTokenMin,\n uint amountETHMin,\naddress to,\n uint deadline,\n bool approveMax, uint8 v, bytes32 r, bytes32 s\n ) external virtual override returns (uintamountToken, uint amountETH) {\n address pair = DooarSwapV2Library.pairFor(factory, token, WETH);\n uint value = approveMax ? uint(-1) : liquidity;\n IDooarSwapV2Pair(pair).permit(msg.sender, address(this), value, deadline, v, r, s);\n (amountToken, amountETH) =removeLiquidityETH(token, liquidity, amountTokenMin, amountETHMin, to, deadline);\n }\n\n // **** REMOVE LIQUIDITY (supporting fee-on-transfer tokens) ****\n function removeLiquidityETHSupportingFeeOnTransferTokens(\n address token,\n uint liquidity,\nuint amountTokenMin,\n uint amountETHMin,\n address to,\n uint deadline\n ) public virtual override ensure(deadline)returns (uint amountETH) {\n (, amountETH) = removeLiquidity(\n token,\n WETH,\n liquidity,\namountTokenMin,\n amountETHMin,\n address(this),\n deadline\n );\n TransferHelper.safeTransfer(token, to, IERC20(token).balanceOf(address(this)));\n IWETH(WETH).withdraw(amountETH);\n TransferHelper.safeTransferETH(to, amountETH);\n}\n function removeLiquidityETHWithPermitSupportingFeeOnTransferTokens(\n address token,\n uint liquidity,\n uintamountTokenMin,\n uint amountETHMin,\n address to,\n uint deadline,\n bool approveMax, uint8 v, bytes32 r, bytes32 s\n) external virtual override returns (uint amountETH) {\n address pair = DooarSwapV2Library.pairFor(factory, token, WETH);\n uintvalue = approveMax ? uint(-1) : liquidity;\n IDooarSwapV2Pair(pair).permit(msg.sender, address(this), value, deadline, v, r, s);\namountETH = removeLiquidityETHSupportingFeeOnTransferTokens(\n token, liquidity, amountTokenMin, amountETHMin, to, deadline\n);\n }\n\n // **** SWAP ****\n // requires the initial amount to have already been sent to the first pair\n function _swap(uint[]memory amounts, address[] memory path, address _to) internal virtual {\n for (uint i; i \u003c path.length - 1; i++) {\n (addressinput, address output) = (path[i], path[i + 1]);\n (address token0,) = DooarSwapV2Library.sortTokens(input, output);\n uintamountOut = amounts[i + 1];\n (uint amount0Out, uint amount1Out) = input == token0 ? (uint(0), amountOut) : (amountOut, uint(0));\naddress to = i \u003c path.length - 2 ? DooarSwapV2Library.pairFor(factory, output, path[i + 2]) : _to;\n IDooarSwapV2Pair(DooarSwapV2Library.pairFor(factory, input, output)).swap(\n amount0Out, amount1Out, to, new bytes(0)\n );\n }\n}\n function swapExactTokensForTokens(\n uint amountIn,\n uint amountOutMin,\n address[] calldata path,\n addressto,\n uint deadline\n ) external virtual override ensure(deadline) returns (uint[] memory amounts) {\n amounts =DooarSwapV2Library.getAmountsOut(factory, amountIn, path);\n require(amounts[amounts.length - 1] \u003e= amountOutMin,\u0027DooarSwapV2Router: INSUFFICIENT_OUTPUT_AMOUNT\u0027);\n TransferHelper.safeTransferFrom(\n path[0], msg.sender,DooarSwapV2Library.pairFor(factory, path[0], path[1]), amounts[0]\n );\n _swap(amounts, path, to);\n }\n functionswapTokensForExactTokens(\n uint amountOut,\n uint amountInMax,\n address[] calldata path,\n address to,\n uintdeadline\n ) external virtual override ensure(deadline) returns (uint[] memory amounts) {\n amounts = DooarSwapV2Library.getAmountsIn(factory, amountOut, path);\n require(amounts[0] \u003c= amountInMax, \u0027DooarSwapV2Router: EXCESSIVE_INPUT_AMOUNT\u0027);\nTransferHelper.safeTransferFrom(\n path[0], msg.sender, DooarSwapV2Library.pairFor(factory, path[0], path[1]), amounts[0]\n );\n_swap(amounts, path, to);\n }\n function swapExactETHForTokens(uint amountOutMin, address[] calldata path, address to, uint deadline)\n external\n virtual\n override\n payable\n ensure(deadline)\n returns (uint[] memory amounts)\n {\nrequire(path[0] == WETH, \u0027DooarSwapV2Router: INVALID_PATH\u0027);\n amounts = DooarSwapV2Library.getAmountsOut(factory, msg.value, path);\n require(amounts[amounts.length - 1] \u003e= amountOutMin, \u0027DooarSwapV2Router: INSUFFICIENT_OUTPUT_AMOUNT\u0027);\nIWETH(WETH).deposit{value: amounts[0]}();\n assert(IWETH(WETH).transfer(DooarSwapV2Library.pairFor(factory, path[0], path[1]),amounts[0]));\n _swap(amounts, path, to);\n }\n function swapTokensForExactETH(uint amountOut, uint amountInMax, address[] calldatapath, address to, uint deadline)\n external\n virtual\n override\n ensure(deadline)\n returns (uint[] memoryamounts)\n {\n require(path[path.length - 1] == WETH, \u0027DooarSwapV2Router: INVALID_PATH\u0027);\n amounts = DooarSwapV2Library.getAmountsIn(factory, amountOut, path);\n require(amounts[0] \u003c= amountInMax, \u0027DooarSwapV2Router: EXCESSIVE_INPUT_AMOUNT\u0027);\nTransferHelper.safeTransferFrom(\n path[0], msg.sender, DooarSwapV2Library.pairFor(factory, path[0], path[1]), amounts[0]\n);\n _swap(amounts, path, address(this));\n IWETH(WETH).withdraw(amounts[amounts.length - 1]);\n TransferHelper.safeTransferETH(to, amounts[amounts.length - 1]);\n }\n function swapExactTokensForETH(uint amountIn, uint amountOutMin, address[] calldatapath, address to, uint deadline)\n external\n virtual\n override\n ensure(deadline)\n returns (uint[] memoryamounts)\n {\n require(path[path.length - 1] == WETH, \u0027DooarSwapV2Router: INVALID_PATH\u0027);\n amounts = DooarSwapV2Library.getAmountsOut(factory, amountIn, path);\n require(amounts[amounts.length - 1] \u003e= amountOutMin, \u0027DooarSwapV2Router:INSUFFICIENT_OUTPUT_AMOUNT\u0027);\n TransferHelper.safeTransferFrom(\n path[0], msg.sender, DooarSwapV2Library.pairFor(factory,path[0], path[1]), amounts[0]\n );\n _swap(amounts, path, address(this));\n IWETH(WETH).withdraw(amounts[amounts.length - 1]);\n TransferHelper.safeTransferETH(to, amounts[amounts.length - 1]);\n }\n function swapETHForExactTokens(uint amountOut, address[]calldata path, address to, uint deadline)\n external\n virtual\n override\n payable\n ensure(deadline)\nreturns (uint[] memory amounts)\n {\n require(path[0] == WETH, \u0027DooarSwapV2Router: INVALID_PATH\u0027);\n amounts =DooarSwapV2Library.getAmountsIn(factory, amountOut, path);\n require(amounts[0] \u003c= msg.value, \u0027DooarSwapV2Router:EXCESSIVE_INPUT_AMOUNT\u0027);\n IWETH(WETH).deposit{value: amounts[0]}();\n assert(IWETH(WETH).transfer(DooarSwapV2Library.pairFor(factory, path[0], path[1]), amounts[0]));\n _swap(amounts, path, to);\n // refund dust eth, if any\n if (msg.value \u003eamounts[0]) TransferHelper.safeTransferETH(msg.sender, msg.value - amounts[0]);\n }\n\n // **** SWAP (supporting fee-on-transfer tokens)****\n // requires the initial amount to have already been sent to the first pair\n function _swapSupportingFeeOnTransferTokens(address[]memory path, address _to) internal virtual {\n for (uint i; i \u003c path.length - 1; i++) {\n (address input, address output) =(path[i], path[i + 1]);\n (address token0,) = DooarSwapV2Library.sortTokens(input, output);\n IDooarSwapV2Pair pair =IDooarSwapV2Pair(DooarSwapV2Library.pairFor(factory, input, output));\n uint amountInput;\n uint amountOutput;\n {// scope to avoid stack too deep errors\n (uint reserve0, uint reserve1,) = pair.getReserves();\n (uint reserveInput, uintreserveOutput) = input == token0 ? (reserve0, reserve1) : (reserve1, reserve0);\n amountInput = IERC20(input).balanceOf(address(pair)).sub(reserveInput);\n amountOutput = DooarSwapV2Library.getAmountOut(amountInput, reserveInput, reserveOutput);\n }\n(uint amount0Out, uint amount1Out) = input == token0 ? (uint(0), amountOutput) : (amountOutput, uint(0));\n address to = i \u003cpath.length - 2 ? DooarSwapV2Library.pairFor(factory, output, path[i + 2]) : _to;\n pair.swap(amount0Out, amount1Out, to, new bytes(0));\n }\n }\n function swapExactTokensForTokensSupportingFeeOnTransferTokens(\n uint amountIn,\n uint amountOutMin,\naddress[] calldata path,\n address to,\n uint deadline\n ) external virtual override ensure(deadline) {\nTransferHelper.safeTransferFrom(\n path[0], msg.sender, DooarSwapV2Library.pairFor(factory, path[0], path[1]), amountIn\n );\nuint balanceBefore = IERC20(path[path.length - 1]).balanceOf(to);\n _swapSupportingFeeOnTransferTokens(path, to);\n require(\nIERC20(path[path.length - 1]).balanceOf(to).sub(balanceBefore) \u003e= amountOutMin,\n \u0027DooarSwapV2Router:INSUFFICIENT_OUTPUT_AMOUNT\u0027\n );\n }\n function swapExactETHForTokensSupportingFeeOnTransferTokens(\n uint amountOutMin,\naddress[] calldata path,\n address to,\n uint deadline\n )\n external\n virtual\n override\npayable\n ensure(deadline)\n {\n require(path[0] == WETH, \u0027DooarSwapV2Router: INVALID_PATH\u0027);\n uint amountIn =msg.value;\n IWETH(WETH).deposit{value: amountIn}();\n assert(IWETH(WETH).transfer(DooarSwapV2Library.pairFor(factory, path[0],path[1]), amountIn));\n uint balanceBefore = IERC20(path[path.length - 1]).balanceOf(to);\n _swapSupportingFeeOnTransferTokens(path,to);\n require(\n IERC20(path[path.length - 1]).balanceOf(to).sub(balanceBefore) \u003e= amountOutMin,\n\u0027DooarSwapV2Router: INSUFFICIENT_OUTPUT_AMOUNT\u0027\n );\n }\n function swapExactTokensForETHSupportingFeeOnTransferTokens(\nuint amountIn,\n uint amountOutMin,\n address[] calldata path,\n address to,\n uint deadline\n )\nexternal\n virtual\n override\n ensure(deadline)\n {\n require(path[path.length - 1] == WETH,\u0027DooarSwapV2Router: INVALID_PATH\u0027);\n TransferHelper.safeTransferFrom(\n path[0], msg.sender, DooarSwapV2Library.pairFor(factory, path[0], path[1]), amountIn\n );\n _swapSupportingFeeOnTransferTokens(path, address(this));\n uint amountOut= IERC20(WETH).balanceOf(address(this));\n require(amountOut \u003e= amountOutMin, \u0027DooarSwapV2Router: INSUFFICIENT_OUTPUT_AMOUNT\u0027);\n IWETH(WETH).withdraw(amountOut);\n TransferHelper.safeTransferETH(to, amountOut);\n }\n\n // **** LIBRARY FUNCTIONS ****\nfunction quote(uint amountA, uint reserveA, uint reserveB) public pure virtual override returns (uint amountB) {\n returnDooarSwapV2Library.quote(amountA, reserveA, reserveB);\n }\n\n function getAmountOut(uint amountIn, uint reserveIn, uint reserveOut)\npublic\n pure\n virtual\n override\n returns (uint amountOut)\n {\n return DooarSwapV2Library.getAmountOut(amountIn, reserveIn, reserveOut);\n }\n\n function getAmountIn(uint amountOut, uint reserveIn, uint reserveOut)\n public\npure\n virtual\n override\n returns (uint amountIn)\n {\n return DooarSwapV2Library.getAmountIn(amountOut, reserveIn, reserveOut);\n }\n\n function getAmountsOut(uint amountIn, address[] memory path)\n public\n view\n virtual\noverride\n returns (uint[] memory amounts)\n {\n return DooarSwapV2Library.getAmountsOut(factory, amountIn, path);\n }\n\nfunction getAmountsIn(uint amountOut, address[] memory path)\n public\n view\n virtual\n override\n returns(uint[] memory amounts)\n {\n return DooarSwapV2Library.getAmountsIn(factory, amountOut, path);\n }\n}"},"IDooarSwapV2Factory.sol":{"content":"pragma solidity \u003e=0.5.0;\n\ninterface IDooarSwapV2Factory {\n event PairCreated(address indexed token0, address indexed token1, address pair, uint);\n\n function feeTo() external view returns (address);\n function feeToSetter() external view returns (address);\n\nfunction getPair(address tokenA, address tokenB) external view returns (address pair);\n function allPairs(uint) external view returns (addresspair);\n function allPairsLength() external view returns (uint);\n\n function createPair(address tokenA, address tokenB) external returns(address pair);\n\n function setFeeTo(address) external;\n function setFeeToSetter(address) external;\n}"},"IDooarSwapV2Pair.sol":{"content":"pragma solidity \u003e=0.5.0;\n\ninterface IDooarSwapV2Pair {\n event Approval(address indexed owner, address indexed spender, uint value);\nevent Transfer(address indexed from, address indexed to, uint value);\n\n function name() external pure returns (string memory);\nfunction symbol() external pure returns (string memory);\n function decimals() external pure returns (uint8);\n function totalSupply()external view returns (uint);\n function balanceOf(address owner) external view returns (uint);\n function allowance(address owner, addressspender) external view returns (uint);\n\n function approve(address spender, uint value) external returns (bool);\n function transfer(addressto, uint value) external returns (bool);\n function transferFrom(address from, address to, uint value) external returns (bool);\n\n functionDOMAIN_SEPARATOR() external view returns (bytes32);\n function PERMIT_TYPEHASH() external pure returns (bytes32);\n function nonces(addressowner) external view returns (uint);\n\n function permit(address owner, address spender, uint value, uint deadline, uint8 v, bytes32 r, bytes32s) external;\n\n event Mint(address indexed sender, uint amount0, uint amount1);\n event Burn(address indexed sender, uint amount0, uintamount1, address indexed to);\n event Swap(\n address indexed sender,\n uint amount0In,\n uint amount1In,\n uintamount0Out,\n uint amount1Out,\n address indexed to\n );\n event Sync(uint112 reserve0, uint112 reserve1);\n\n functionMINIMUM_LIQUIDITY() external pure returns (uint);\n function factory() external view returns (address);\n function token0() external viewreturns (address);\n function token1() external view returns (address);\n function getReserves() external view returns (uint112 reserve0,uint112 reserve1, uint32 blockTimestampLast);\n function price0CumulativeLast() external view returns (uint);\n function price1CumulativeLast() external view returns (uint);\n function kLast() external view returns (uint);\n\n function mint(address to) external returns (uintliquidity);\n function burn(address to) external returns (uint amount0, uint amount1);\n function swap(uint amount0Out, uint amount1Out,address to, bytes calldata data) external;\n function skim(address to) external;\n function sync() external;\n\n function initialize(address, address) external;\n}"},"IDooarSwapV2Router01.sol":{"content":"pragma solidity \u003e=0.6.2;\n\ninterface IDooarSwapV2Router01 {\nfunction factory() external pure returns (address);\n function WETH() external pure returns (address);\n\n function addLiquidity(\naddress tokenA,\n address tokenB,\n uint amountADesired,\n uint amountBDesired,\n uint amountAMin,\n uintamountBMin,\n address to,\n uint deadline\n ) external returns (uint amountA, uint amountB, uint liquidity);\n functionaddLiquidityETH(\n address token,\n uint amountTokenDesired,\n uint amountTokenMin,\n uint amountETHMin,\naddress to,\n uint deadline\n ) external payable returns (uint amountToken, uint amountETH, uint liquidity);\n functionremoveLiquidity(\n address tokenA,\n address tokenB,\n uint liquidity,\n uint amountAMin,\n uint amountBMin,\naddress to,\n uint deadline\n ) external returns (uint amountA, uint amountB);\n function removeLiquidityETH(\n addresstoken,\n uint liquidity,\n uint amountTokenMin,\n uint amountETHMin,\n address to,\n uint deadline\n )external returns (uint amountToken, uint amountETH);\n function removeLiquidityWithPermit(\n address tokenA,\n address tokenB,\nuint liquidity,\n uint amountAMin,\n uint amountBMin,\n address to,\n uint deadline,\n bool approveMax,uint8 v, bytes32 r, bytes32 s\n ) external returns (uint amountA, uint amountB);\n function removeLiquidityETHWithPermit(\n addresstoken,\n uint liquidity,\n uint amountTokenMin,\n uint amountETHMin,\n address to,\n uint deadline,\nbool approveMax, uint8 v, bytes32 r, bytes32 s\n ) external returns (uint amountToken, uint amountETH);\n function swapExactTokensForTokens(\n uint amountIn,\n uint amountOutMin,\n address[] calldata path,\n address to,\n uint deadline\n ) externalreturns (uint[] memory amounts);\n function swapTokensForExactTokens(\n uint amountOut,\n uint amountInMax,\n address[]calldata path,\n address to,\n uint deadline\n ) external returns (uint[] memory amounts);\n function swapExactETHForTokens(uint amountOutMin, address[] calldata path, address to, uint deadline)\n external\n payable\n returns (uint[] memory amounts);\n function swapTokensForExactETH(uint amountOut, uint amountInMax, address[] calldata path, address to, uint deadline)\n external\nreturns (uint[] memory amounts);\n function swapExactTokensForETH(uint amountIn, uint amountOutMin, address[] calldata path, address to,uint deadline)\n external\n returns (uint[] memory amounts);\n function swapETHForExactTokens(uint amountOut, address[] calldatapath, address to, uint deadline)\n external\n payable\n returns (uint[] memory amounts);\n\n function quote(uint amountA,uint reserveA, uint reserveB) external pure returns (uint amountB);\n function getAmountOut(uint amountIn, uint reserveIn, uint reserveOut)external pure returns (uint amountOut);\n function getAmountIn(uint amountOut, uint reserveIn, uint reserveOut) external pure returns (uintamountIn);\n function getAmountsOut(uint amountIn, address[] calldata path) external view returns (uint[] memory amounts);\n functiongetAmountsIn(uint amountOut, address[] calldata path) external view returns (uint[] memory amounts);\n}"},"IDooarSwapV2Router02.sol":{"content":"pragma solidity \u003e=0.6.2;\n\nimport \u0027./IDooarSwapV2Router01.sol\u0027;\n\ninterface IDooarSwapV2Router02 is IDooarSwapV2Router01 {\nfunction removeLiquidityETHSupportingFeeOnTransferTokens(\n address token,\n uint liquidity,\n uint amountTokenMin,\nuint amountETHMin,\n address to,\n uint deadline\n ) external returns (uint amountETH);\n functionremoveLiquidityETHWithPermitSupportingFeeOnTransferTokens(\n address token,\n uint liquidity,\n uint amountTokenMin,\nuint amountETHMin,\n address to,\n uint deadline,\n bool approveMax, uint8 v, bytes32 r, bytes32 s\n ) external returns(uint amountETH);\n\n function swapExactTokensForTokensSupportingFeeOnTransferTokens(\n uint amountIn,\n uint amountOutMin,\naddress[] calldata path,\n address to,\n uint deadline\n ) external;\n functionswapExactETHForTokensSupportingFeeOnTransferTokens(\n uint amountOutMin,\n address[] calldata path,\n address to,\nuint deadline\n ) external payable;\n function swapExactTokensForETHSupportingFeeOnTransferTokens(\n uint amountIn,\n uintamountOutMin,\n address[] calldata path,\n address to,\n uint deadline\n ) external;\n}"},"IERC20.sol":{"content":"pragmasolidity \u003e=0.5.0;\n\ninterface IERC20 {\n event Approval(address indexed owner, address indexed spender, uint value);\n event Transfer(address indexed from, address indexed to, uint value);\n\n function name() external view returns (string memory);\n function symbol()external view returns (string memory);\n function decimals() external view returns (uint8);\n function totalSupply() external view returns(uint);\n function balanceOf(address owner) external view returns (uint);\n function allowance(address owner, address spender) external viewreturns (uint);\n\n function approve(address spender, uint value) external returns (bool);\n function transfer(address to, uint value)external returns (bool);\n function transferFrom(address from, address to, uint value) external returns (bool);\n}"},"IWETH.sol":{"content":"pragma solidity \u003e=0.5.0;\n\ninterface IWETH {\n function deposit() external payable;\n function transfer(address to, uint value)external returns (bool);\n function withdraw(uint) external;\n}"},"SafeMath.sol":{"content":"pragma solidity =0.6.6;\n\n// a library forperforming overflow-safe math, courtesy of DappHub (https://github.com/dapphub/ds-math)\n\nlibrary SafeMath {\n function add(uint x, uint y)internal pure returns (uint z) {\n require((z = x + y) \u003e= x, \u0027ds-math-add-overflow\u0027);\n }\n\n function sub(uint x, uinty) internal pure returns (uint z) {\n require((z = x - y) \u003c= x, \u0027ds-math-sub-underflow\u0027);\n }\n\n function mul(uint x,uint y) internal pure returns (uint z) {\n require(y == 0 || (z = x * y) / y == x, \u0027ds-math-mul-overflow\u0027);\n }\n}"},"TransferHelper.sol":{"content":"// SPDX-License-Identifier: GPL-3.0-or-later\n\npragma solidity \u003e=0.6.0;\n\n// helper methods forinteracting with ERC20 tokens and sending ETH that do not consistently return true/false\nlibrary TransferHelper {\n function safeApprove(\naddress token,\n address to,\n uint256 value\n ) internal {\n // bytes4(keccak256(bytes(\u0027approve(address,uint256)\u0027)));\n (bool success, bytes memory data) = token.call(abi.encodeWithSelector(0x095ea7b3, to, value));\n require(\nsuccess \u0026\u0026 (data.length == 0 || abi.decode(data, (bool))),\n \u0027TransferHelper::safeApprove: approve failed\u0027\n);\n }\n\n function safeTransfer(\n address token,\n address to,\n uint256 value\n ) internal {\n // bytes4(keccak256(bytes(\u0027transfer(address,uint256)\u0027)));\n (bool success, bytes memory data) = token.call(abi.encodeWithSelector(0xa9059cbb, to, value));\n require(\n success \u0026\u0026 (data.length == 0 || abi.decode(data, (bool))),\n\u0027TransferHelper::safeTransfer: transfer failed\u0027\n );\n }\n\n function safeTransferFrom(\n address token,\naddress from,\n address to,\n uint256 value\n ) internal {\n // bytes4(keccak256(bytes(\u0027transferFrom(address,address,uint256)\u0027)));\n (bool success, bytes memory data) = token.call(abi.encodeWithSelector(0x23b872dd, from, to, value));\n require(\n success \u0026\u0026 (data.length == 0 || abi.decode(data, (bool))),\n \u0027TransferHelper::transferFrom: transferFromfailed\u0027\n );\n }\n\n function safeTransferETH(address to, uint256 value) internal {\n (bool success, ) = to.call{value:value}(new bytes(0));\n require(success, \u0027TransferHelper::safeTransferETH: ETH transfer failed\u0027);\n }\n}"}}
File 2 of 5: WETH9
12345678910111213141516// Copyright (C) 2015, 2016, 2017 Dapphub// This program is free software: you can redistribute it and/or modify// it under the terms of the GNU General Public License as published by// the Free Software Foundation, either version 3 of the License, or// (at your option) any later version.// This program is distributed in the hope that it will be useful,// but WITHOUT ANY WARRANTY; without even the implied warranty of// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the// GNU General Public License for more details.// You should have received a copy of the GNU General Public License// along with this program. If not, see <http://www.gnu.org/licenses/>.pragma solidity ^0.4.18;
File 3 of 5: FiatTokenProxy
12345678910111213141516pragma solidity ^0.4.24;// File: zos-lib/contracts/upgradeability/Proxy.sol/*** @title Proxy* @dev Implements delegation of calls to other contracts, with proper* forwarding of return values and bubbling of failures.* It defines a fallback function that delegates all calls to the address* returned by the abstract _implementation() internal function.*/contract Proxy {/*** @dev Fallback function.* Implemented entirely in `_fallback`.*/
File 4 of 5: GreenMetaverseToken
12345678910111213141516// contracts/GreenMetaverseToken.sol// SPDX-License-Identifier: MITpragma solidity ^0.8.0;import "@openzeppelin/contracts/token/ERC20/ERC20.sol";import "@openzeppelin/contracts/token/ERC20/extensions/ERC20Burnable.sol";import "@openzeppelin/contracts/access/Ownable.sol";/*** Green Metaverse Token* @author STEPN*/contract GreenMetaverseToken is ERC20, ERC20Burnable, Ownable {constructor() ERC20("GreenMetaverseToken", "GMT") {}function mint(address to, uint256 amount) public onlyOwner {_mint(to, amount);}function decimals() public view virtual override returns (uint8) {
File 5 of 5: FiatTokenV2_2
12345678910111213141516/*** SPDX-License-Identifier: Apache-2.0** Copyright (c) 2023, Circle Internet Financial, LLC.** Licensed under the Apache License, Version 2.0 (the "License");* you may not use this file except in compliance with the License.* You may obtain a copy of the License at** http://www.apache.org/licenses/LICENSE-2.0** Unless required by applicable law or agreed to in writing, software* distributed under the License is distributed on an "AS IS" BASIS,* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.* See the License for the specific language governing permissions and* limitations under the License.