Address: 0xB5c68a77ec2d7ea4E7599cc167164Bd79E4d58eF
Balance (XRP): 0 XRP
Bytecode: 0x6080604052600436106100f35760003560e01c80634d2301cc1161008a578063a8b0574e11610059578063a8b0574e1461022f578063bce38bd71461024a578063c3077fa91461025d578063ee82ac5e1461027057600080fd5b80634d2301cc146101ce57806372425d9d146101f657806382ad56cb1461020957806386d516e81461021c57600080fd5b80633408e470116100c65780633408e47014610173578063399542e9146101865780633e64a696146101a857806342cbb15c146101bb57600080fd5b80630f28c97d146100f8578063174dea711461011a578063252dba421461013a57806327e86d6e1461015b575b600080fd5b34801561010457600080fd5b50425b6040519081526020015b60405180910390f35b61012d6101283660046109a4565b61028f565b6040516101119190610a9a565b61014d6101483660046109a4565b610483565b604051610111929190610ab4565b34801561016757600080fd5b50436000190140610107565b34801561017f57600080fd5b5046610107565b610199610194366004610b1e565b6105fd565b60405161011193929190610b78565b3480156101b457600080fd5b5048610107565b3480156101c757600080fd5b5043610107565b3480156101da57600080fd5b506101076101e9366004610ba0565b6001600160a01b03163190565b34801561020257600080fd5b5044610107565b61012d6102173660046109a4565b610618565b34801561022857600080fd5b5045610107565b34801561023b57600080fd5b50604051418152602001610111565b61012d610258366004610b1e565b6107a0565b61019961026b3660046109a4565b610939565b34801561027c57600080fd5b5061010761028b366004610bc9565b4090565b60606000828067ffffffffffffffff8111156102ad576102ad610be2565b6040519080825280602002602001820160405280156102f357816020015b6040805180820190915260008152606060208201528152602001906001900390816102cb5790505b5092503660005b8281101561042557600085828151811061031657610316610bf8565b6020026020010151905087878381811061033257610332610bf8565b90506020028101906103449190610c0e565b60408101359586019590935061035d6020850185610ba0565b6001600160a01b0316816103746060870187610c2e565b604051610382929190610c75565b60006040518083038185875af1925050503d80600081146103bf576040519150601f19603f3d011682016040523d82523d6000602084013e6103c4565b606091505b50602080850191909152901515808452908501351761041b5762461bcd60e51b600052602060045260176024527f4d756c746963616c6c333a2063616c6c206661696c656400000000000000000060445260846000fd5b50506001016102fa565b5082341461047a5760405162461bcd60e51b815260206004820152601a60248201527f4d756c746963616c6c333a2076616c7565206d69736d6174636800000000000060448201526064015b60405180910390fd5b50505092915050565b436060828067ffffffffffffffff8111156104a0576104a0610be2565b6040519080825280602002602001820160405280156104d357816020015b60608152602001906001900390816104be5790505b5091503660005b828110156105f35760008787838181106104f6576104f6610bf8565b90506020028101906105089190610c85565b92506105176020840184610ba0565b6001600160a01b031661052d6020850185610c2e565b60405161053b929190610c75565b6000604051808303816000865af19150503d8060008114610578576040519150601f19603f3d011682016040523d82523d6000602084013e61057d565b606091505b5086848151811061059057610590610bf8565b60209081029190910101529050806105ea5760405162461bcd60e51b815260206004820152601760248201527f4d756c746963616c6c333a2063616c6c206661696c65640000000000000000006044820152606401610471565b506001016104da565b5050509250929050565b438040606061060d8686866107a0565b905093509350939050565b6060818067ffffffffffffffff81111561063457610634610be2565b60405190808252806020026020018201604052801561067a57816020015b6040805180820190915260008152606060208201528152602001906001900390816106525790505b5091503660005b8281101561047a57600084828151811061069d5761069d610bf8565b602002602001015190508686838181106106b9576106b9610bf8565b90506020028101906106cb9190610c9b565b92506106da6020840184610ba0565b6001600160a01b03166106f06040850185610c2e565b6040516106fe929190610c75565b6000604051808303816000865af19150503d806000811461073b576040519150601f19603f3d011682016040523d82523d6000602084013e610740565b606091505b5060208084019190915290151580835290840135176107975762461bcd60e51b600052602060045260176024527f4d756c746963616c6c333a2063616c6c206661696c656400000000000000000060445260646000fd5b50600101610681565b6060818067ffffffffffffffff8111156107bc576107bc610be2565b60405190808252806020026020018201604052801561080257816020015b6040805180820190915260008152606060208201528152602001906001900390816107da5790505b5091503660005b8281101561092f57600084828151811061082557610825610bf8565b6020026020010151905086868381811061084157610841610bf8565b90506020028101906108539190610c85565b92506108626020840184610ba0565b6001600160a01b03166108786020850185610c2e565b604051610886929190610c75565b6000604051808303816000865af19150503d80600081146108c3576040519150601f19603f3d011682016040523d82523d6000602084013e6108c8565b606091505b5060208301521515815287156109265780516109265760405162461bcd60e51b815260206004820152601760248201527f4d756c746963616c6c333a2063616c6c206661696c65640000000000000000006044820152606401610471565b50600101610809565b5050509392505050565b600080606061094a600186866105fd565b919790965090945092505050565b60008083601f84011261096a57600080fd5b50813567ffffffffffffffff81111561098257600080fd5b6020830191508360208260051b850101111561099d57600080fd5b9250929050565b600080602083850312156109b757600080fd5b823567ffffffffffffffff8111156109ce57600080fd5b6109da85828601610958565b90969095509350505050565b6000815180845260005b81811015610a0c576020818501810151868301820152016109f0565b506000602082860101526020601f19601f83011685010191505092915050565b600082825180855260208086019550808260051b84010181860160005b84811015610a8d57858303601f1901895281518051151584528401516040858501819052610a79818601836109e6565b9a86019a9450505090830190600101610a49565b5090979650505050505050565b602081526000610aad6020830184610a2c565b9392505050565b600060408201848352602060408185015281855180845260608601915060608160051b870101935082870160005b82811015610b1057605f19888703018452610afe8683516109e6565b95509284019290840190600101610ae2565b509398975050505050505050565b600080600060408486031215610b3357600080fd5b83358015158114610b4357600080fd5b9250602084013567ffffffffffffffff811115610b5f57600080fd5b610b6b86828701610958565b9497909650939450505050565b838152826020820152606060408201526000610b976060830184610a2c565b95945050505050565b600060208284031215610bb257600080fd5b81356001600160a01b0381168114610aad57600080fd5b600060208284031215610bdb57600080fd5b5035919050565b634e487b7160e01b600052604160045260246000fd5b634e487b7160e01b600052603260045260246000fd5b60008235607e19833603018112610c2457600080fd5b9190910192915050565b6000808335601e19843603018112610c4557600080fd5b83018035915067ffffffffffffffff821115610c6057600080fd5b60200191503681900382131561099d57600080fd5b8183823760009101908152919050565b60008235603e19833603018112610c2457600080fd5b60008235605e19833603018112610c2457600080fdfea264697066735822122086d9b6851d4981b12ff4077c63fe7632b16d0ad49c0f275e4172638187f723df64736f6c63430008110033
Multicall3.sol
// SPDX-License-Identifier: MIT pragma solidity 0.8.17; /// @title Multicall3 /// @notice Aggregate results from multiple function calls /// @dev Multicall & Multicall2 backwards-compatible /// @dev Aggregate methods are marked `payable` to save 24 gas per call /// @author Michael Elliot <mike@makerdao.com> /// @author Joshua Levine <joshua@makerdao.com> /// @author Nick Johnson <arachnid@notdot.net> /// @author Andreas Bigger <andreas@nascent.xyz> /// @author Matt Solomon <matt@mattsolomon.dev> contract Multicall3 { struct Call { address target; bytes callData; } struct Call3 { address target; bool allowFailure; bytes callData; } struct Call3Value { address target; bool allowFailure; uint256 value; bytes callData; } struct Result { bool success; bytes returnData; } /// @notice Backwards-compatible call aggregation with Multicall /// @param calls An array of Call structs /// @return blockNumber The block number where the calls were executed /// @return returnData An array of bytes containing the responses function aggregate( Call[] calldata calls ) public payable returns (uint256 blockNumber, bytes[] memory returnData) { blockNumber = block.number; uint256 length = calls.length; returnData = new bytes[](length); Call calldata call; for (uint256 i = 0; i < length; ) { bool success; call = calls[i]; (success, returnData[i]) = call.target.call(call.callData); require(success, "Multicall3: call failed"); unchecked { ++i; } } } /// @notice Backwards-compatible with Multicall2 /// @notice Aggregate calls without requiring success /// @param requireSuccess If true, require all calls to succeed /// @param calls An array of Call structs /// @return returnData An array of Result structs function tryAggregate( bool requireSuccess, Call[] calldata calls ) public payable returns (Result[] memory returnData) { uint256 length = calls.length; returnData = new Result[](length); Call calldata call; for (uint256 i = 0; i < length; ) { Result memory result = returnData[i]; call = calls[i]; (result.success, result.returnData) = call.target.call( call.callData ); if (requireSuccess) require(result.success, "Multicall3: call failed"); unchecked { ++i; } } } /// @notice Backwards-compatible with Multicall2 /// @notice Aggregate calls and allow failures using tryAggregate /// @param calls An array of Call structs /// @return blockNumber The block number where the calls were executed /// @return blockHash The hash of the block where the calls were executed /// @return returnData An array of Result structs function tryBlockAndAggregate( bool requireSuccess, Call[] calldata calls ) public payable returns ( uint256 blockNumber, bytes32 blockHash, Result[] memory returnData ) { blockNumber = block.number; blockHash = blockhash(block.number); returnData = tryAggregate(requireSuccess, calls); } /// @notice Backwards-compatible with Multicall2 /// @notice Aggregate calls and allow failures using tryAggregate /// @param calls An array of Call structs /// @return blockNumber The block number where the calls were executed /// @return blockHash The hash of the block where the calls were executed /// @return returnData An array of Result structs function blockAndAggregate( Call[] calldata calls ) public payable returns ( uint256 blockNumber, bytes32 blockHash, Result[] memory returnData ) { (blockNumber, blockHash, returnData) = tryBlockAndAggregate( true, calls ); } /// @notice Aggregate calls, ensuring each returns success if required /// @param calls An array of Call3 structs /// @return returnData An array of Result structs function aggregate3( Call3[] calldata calls ) public payable returns (Result[] memory returnData) { uint256 length = calls.length; returnData = new Result[](length); Call3 calldata calli; for (uint256 i = 0; i < length; ) { Result memory result = returnData[i]; calli = calls[i]; (result.success, result.returnData) = calli.target.call( calli.callData ); assembly { // Revert if the call fails and failure is not allowed // `allowFailure := calldataload(add(calli, 0x20))` and `success := mload(result)` if iszero(or(calldataload(add(calli, 0x20)), mload(result))) { // set "Error(string)" signature: bytes32(bytes4(keccak256("Error(string)"))) mstore( 0x00, 0x08c379a000000000000000000000000000000000000000000000000000000000 ) // set data offset mstore( 0x04, 0x0000000000000000000000000000000000000000000000000000000000000020 ) // set length of revert string mstore( 0x24, 0x0000000000000000000000000000000000000000000000000000000000000017 ) // set revert string: bytes32(abi.encodePacked("Multicall3: call failed")) mstore( 0x44, 0x4d756c746963616c6c333a2063616c6c206661696c6564000000000000000000 ) revert(0x00, 0x64) } } unchecked { ++i; } } } /// @notice Aggregate calls with a msg value /// @notice Reverts if msg.value is less than the sum of the call values /// @param calls An array of Call3Value structs /// @return returnData An array of Result structs function aggregate3Value( Call3Value[] calldata calls ) public payable returns (Result[] memory returnData) { uint256 valAccumulator; uint256 length = calls.length; returnData = new Result[](length); Call3Value calldata calli; for (uint256 i = 0; i < length; ) { Result memory result = returnData[i]; calli = calls[i]; uint256 val = calli.value; // Humanity will be a Type V Kardashev Civilization before this overflows - andreas // ~ 10^25 Wei in existence << ~ 10^76 size uint fits in a uint256 unchecked { valAccumulator += val; } (result.success, result.returnData) = calli.target.call{value: val}( calli.callData ); assembly { // Revert if the call fails and failure is not allowed // `allowFailure := calldataload(add(calli, 0x20))` and `success := mload(result)` if iszero(or(calldataload(add(calli, 0x20)), mload(result))) { // set "Error(string)" signature: bytes32(bytes4(keccak256("Error(string)"))) mstore( 0x00, 0x08c379a000000000000000000000000000000000000000000000000000000000 ) // set data offset mstore( 0x04, 0x0000000000000000000000000000000000000000000000000000000000000020 ) // set length of revert string mstore( 0x24, 0x0000000000000000000000000000000000000000000000000000000000000017 ) // set revert string: bytes32(abi.encodePacked("Multicall3: call failed")) mstore( 0x44, 0x4d756c746963616c6c333a2063616c6c206661696c6564000000000000000000 ) revert(0x00, 0x84) } } unchecked { ++i; } } // Finally, make sure the msg.value = SUM(call[0...i].value) require(msg.value == valAccumulator, "Multicall3: value mismatch"); } /// @notice Returns the block hash for the given block number /// @param blockNumber The block number function getBlockHash( uint256 blockNumber ) public view returns (bytes32 blockHash) { blockHash = blockhash(blockNumber); } /// @notice Returns the block number function getBlockNumber() public view returns (uint256 blockNumber) { blockNumber = block.number; } /// @notice Returns the block coinbase function getCurrentBlockCoinbase() public view returns (address coinbase) { coinbase = block.coinbase; } /// @notice Returns the block difficulty function getCurrentBlockDifficulty() public view returns (uint256 difficulty) { difficulty = block.difficulty; } /// @notice Returns the block gas limit function getCurrentBlockGasLimit() public view returns (uint256 gaslimit) { gaslimit = block.gaslimit; } /// @notice Returns the block timestamp function getCurrentBlockTimestamp() public view returns (uint256 timestamp) { timestamp = block.timestamp; } /// @notice Returns the (ETH) balance of a given address function getEthBalance(address addr) public view returns (uint256 balance) { balance = addr.balance; } /// @notice Returns the block hash of the last block function getLastBlockHash() public view returns (bytes32 blockHash) { unchecked { blockHash = blockhash(block.number - 1); } } /// @notice Gets the base fee of the given block /// @notice Can revert if the BASEFEE opcode is not implemented by the given chain function getBasefee() public view returns (uint256 basefee) { basefee = block.basefee; } /// @notice Returns the chain id function getChainId() public view returns (uint256 chainid) { chainid = block.chainid; } }
Gas Token: