UNPKG

@sushiswap/sushiswap

Version:
39 lines (38 loc) 4.12 kB
{ "language": "Solidity", "sources": { "contracts/Multicall2.sol": { "content": "// SPDX-License-Identifier: MIT\n\npragma solidity >=0.5.0;\npragma experimental ABIEncoderV2;\n\n/// @title Multicall2 - Aggregate results from multiple read-only function calls\n/// @author Michael Elliot <mike@makerdao.com>\n/// @author Joshua Levine <joshua@makerdao.com>\n/// @author Nick Johnson <arachnid@notdot.net>\n\ncontract Multicall2 {\n struct Call {\n address target;\n bytes callData;\n }\n struct Result {\n bool success;\n bytes returnData;\n }\n\n function aggregate(Call[] memory calls)\n public\n returns (uint256 blockNumber, bytes[] memory returnData)\n {\n blockNumber = block.number;\n returnData = new bytes[](calls.length);\n for (uint256 i = 0; i < calls.length; i++) {\n (bool success, bytes memory ret) =\n calls[i].target.call(calls[i].callData);\n require(success, \"Multicall aggregate: call failed\");\n returnData[i] = ret;\n }\n }\n\n function blockAndAggregate(Call[] memory calls)\n public\n returns (\n uint256 blockNumber,\n bytes32 blockHash,\n Result[] memory returnData\n )\n {\n (blockNumber, blockHash, returnData) = tryBlockAndAggregate(\n true,\n calls\n );\n }\n\n function getBlockHash(uint256 blockNumber)\n public\n view\n returns (bytes32 blockHash)\n {\n blockHash = blockhash(blockNumber);\n }\n\n function getBlockNumber() public view returns (uint256 blockNumber) {\n blockNumber = block.number;\n }\n\n function getCurrentBlockCoinbase() public view returns (address coinbase) {\n coinbase = block.coinbase;\n }\n\n function getCurrentBlockDifficulty()\n public\n view\n returns (uint256 difficulty)\n {\n difficulty = block.difficulty;\n }\n\n function getCurrentBlockGasLimit() public view returns (uint256 gaslimit) {\n gaslimit = block.gaslimit;\n }\n\n function getCurrentBlockTimestamp()\n public\n view\n returns (uint256 timestamp)\n {\n timestamp = block.timestamp;\n }\n\n function getEthBalance(address addr) public view returns (uint256 balance) {\n balance = addr.balance;\n }\n\n function getLastBlockHash() public view returns (bytes32 blockHash) {\n blockHash = blockhash(block.number - 1);\n }\n\n function tryAggregate(bool requireSuccess, Call[] memory calls)\n public\n returns (Result[] memory returnData)\n {\n returnData = new Result[](calls.length);\n for (uint256 i = 0; i < calls.length; i++) {\n (bool success, bytes memory ret) =\n calls[i].target.call(calls[i].callData);\n\n if (requireSuccess) {\n require(success, \"Multicall2 aggregate: call failed\");\n }\n\n returnData[i] = Result(success, ret);\n }\n }\n\n function tryBlockAndAggregate(bool requireSuccess, Call[] memory calls)\n public\n returns (\n uint256 blockNumber,\n bytes32 blockHash,\n Result[] memory returnData\n )\n {\n blockNumber = block.number;\n blockHash = blockhash(block.number);\n returnData = tryAggregate(requireSuccess, calls);\n }\n}\n" } }, "settings": { "optimizer": { "enabled": true, "runs": 200 }, "outputSelection": { "*": { "*": [ "abi", "evm.bytecode", "evm.deployedBytecode", "evm.methodIdentifiers", "metadata", "devdoc", "userdoc", "storageLayout", "evm.gasEstimates" ], "": ["ast"] } }, "metadata": { "useLiteralContent": true }, "libraries": { "": { "__CACHE_BREAKER__": "0x00000000d41867734bbee4c6863d9255b2b06ac1" } } } }