Transaction Hash:
Block:
18752023 at Dec-09-2023 11:45:11 PM +UTC
Transaction Fee:
0.010028929437432626 ETH
$25.33
Gas Used:
297,658 Gas / 33.692793197 Gwei
Emitted Events:
129 |
0xa9d1e08c7793af67e9d92fe308d5697fb81d3e43.0xdc386723e55a1ab06e0a64036ce7bb4fd1e1aea21f6def62d2d577e9d12f9dfc( 0xdc386723e55a1ab06e0a64036ce7bb4fd1e1aea21f6def62d2d577e9d12f9dfc, 0x00000000000000000000000076f948e5f13b9a84a81e5681df8682bbf524805e, 000000000000000000000000000000000000000000000000000aa87bee538000, 0000000000000000000000000000000000000000000000000000000000000008, 0000000000000000000000000000000000000000000000000000000000000060, 0000000000000000000000000000000000000000000000000000000000000019, 6e6f20726561736f6e20737472696e672070726f766964656400000000000000 )
|
Account State Difference:
Address | Before | After | State Difference | ||
---|---|---|---|---|---|
0x057d3865...D4546e4a0 | 0.03721591 Eth | 0.04636975 Eth | 0.00915384 | ||
0x16FBdDdc...2f6c0D866 | 0.001569229655010466 Eth | 0.011048889655010466 Eth | 0.00947966 | ||
0x1aB5B6f0...2bE6c0A29 | 0.000542511626498385 Eth | 0.001786772 Eth | 0.001244260373501615 | ||
0x2851e564...BA3C850A3 | 0.000094637831358 Eth | 0.001406607831358 Eth | 0.00131197 | ||
0x3460e432...8E829AAFf | 0.000000009886328498 Eth | 0.040989789886328498 Eth | 0.04098978 | ||
0x4a13a91b...E407A7ce0 | 0.004230230130727443 Eth | 0.021965140130727443 Eth | 0.01773491 | ||
0x4AeCD069...cBAC1d730 | 0.00813435 Eth | 0.02415124 Eth | 0.01601689 | ||
0x4ce6646C...39e288601 | 0.04082795 Eth | 0.07506141 Eth | 0.03423346 | ||
0x5192F11A...403b8e35b | 0.000908999784018072 Eth | 0.00191987625 Eth | 0.001010876465981928 | ||
0x5caEC831...a0a32Ccb1 | 0.000072634212861 Eth | 0.106999114212861 Eth | 0.10692648 | ||
0x66A2e872...4504Ac241 | 0.067222874 Eth | 0.091353904 Eth | 0.02413103 | ||
0x67fF0883...437b5EC51 | 0.031180410340097207 Eth | 0.040216310340097207 Eth | 0.0090359 | ||
0x7830c87C...31FA86F43 | (Coinbase: Deposit) |
50.489753961096278519 Eth
Nonce: 1102488
|
50.479725031658845893 Eth
Nonce: 1102489
| 0.010028929437432626 | |
0x792138F6...35A87719F | 0.000456743380695 Eth | 0.008048153380695 Eth | 0.00759141 | ||
0x7dbd132F...60Be3A31F | 0 Eth | 0.08854403 Eth | 0.08854403 | ||
0x92D09022...616Fa5B57 | 0.04750743 Eth | 0.0548359 Eth | 0.00732847 | ||
0xA9D1e08C...FB81d3E43 | (Coinbase 10) | 3,981.333725527486967725 Eth | 3,980.423548685600888963 Eth | 0.910176841886078762 | |
0xb4b2C320...3eAEE626b
Miner
| (Fee Recipient: 0xb4b2...26b) | 64.603015014445089924 Eth | 64.603312672445089924 Eth | 0.000297658 | |
0xc6b8E559...ABEebB90B | 0.017282053362248303 Eth | 0.071574063362248303 Eth | 0.05429201 | ||
0xc7550303...A850B9630 | 0.001283178876802335 Eth | 0.002499975 Eth | 0.001216796123197665 | ||
0xD3b836c6...677985D81 | 0.05196215 Eth | 0.05361469 Eth | 0.00165254 | ||
0xd40344Ac...F5d5A5b6a | 0.000868905420361454 Eth | 0.00227155375 Eth | 0.001402648329638546 | ||
0xd45dD802...A65D3CB0a | 0.49084609 Eth | 0.5306397 Eth | 0.03979361 | ||
0xd6691183...f89990F15 | 0.040193841560510479 Eth | 0.454283701560510479 Eth | 0.41408986 | ||
0xD9c64D13...B1C8D2777 | 0.00135869668742835 Eth | 0.00250059 Eth | 0.00114189331257165 | ||
0xE1C69049...8Dd04A725 | 0.000269190888792 Eth | 0.005269190888792 Eth | 0.005 | ||
0xE8d3FbB2...F1E2b7860 | 0.000834856968812642 Eth | 0.00250206425 Eth | 0.001667207281187358 | ||
0xeB7Bd94a...E67643674 | 0.07372446 Eth | 0.08891177 Eth | 0.01518731 |
Execution Trace
Coinbase 10.1a1da075( )
- ETH 0.001010876465981928
0x5192f11a7819b80b4b62ea26fa8efe3403b8e35b.CALL( )
- ETH 0.00114189331257165
0xd9c64d135e92c8d5ad689dd10ce25e6b1c8d2777.CALL( )
- ETH 0.001216796123197665
0xc7550303b504ea6d43acb85fb31ecc9a850b9630.CALL( )
- ETH 0.001244260373501615
0x1ab5b6f0c4ca58bff5408e3abcafff82be6c0a29.CALL( )
- ETH 0.00131197
0x2851e564c4496e90a6b56b10d119b43ba3c850a3.CALL( )
- ETH 0.001402648329638546
0xd40344ac5031aa3a8760e534c5ad93ef5d5a5b6a.CALL( )
- ETH 0.00165254
0xd3b836c6ffbbdda173a9a7e913f7647677985d81.CALL( )
- ETH 0.001667207281187358
0xe8d3fbb273ffb6a5c56f22f47bcdee6f1e2b7860.CALL( )
- ETH 0.003
TWCloneFactory.CALL( )
- ETH 0.005
0xe1c69049f06ac861cb2639581509c598dd04a725.CALL( )
- ETH 0.00732847
0x92d09022fc59f0451f41faea5d9c0f7616fa5b57.CALL( )
- ETH 0.00759141
0x792138f66269d2bbadf8e5e6f0a89d935a87719f.CALL( )
- ETH 0.0090359
0x67ff088307095b805a8ed8f3813efd2437b5ec51.CALL( )
- ETH 0.00915384
0x057d386501e38ddfffab1dcc192bc38d4546e4a0.CALL( )
- ETH 0.00947966
0x16fbdddc81a614f7caf76cfe44f1d822f6c0d866.CALL( )
- ETH 0.01518731
0xeb7bd94adc984f688fca9e797308330e67643674.CALL( )
- ETH 0.01601689
0x4aecd069220531aa684f9614499e6d4cbac1d730.CALL( )
- ETH 0.01773491
0x4a13a91bd6657aea42462d27e9cf68ee407a7ce0.CALL( )
- ETH 0.02413103
0x66a2e8721f0b01bba6fd590a6c037ed4504ac241.CALL( )
- ETH 0.03423346
0x4ce6646c625e3656643792d532708c139e288601.CALL( )
- ETH 0.03979361
0xd45dd802b1740aead92d1fcb01e4367a65d3cb0a.CALL( )
- ETH 0.04098978
0x3460e43273c95c48739ddc7213eeea78e829aaff.CALL( )
- ETH 0.05429201
0xc6b8e559f846659dd765ba0a34a87f3abeebb90b.CALL( )
- ETH 0.08854403
0x7dbd132fc2ec8f9f12f9e4dfa5a50f260be3a31f.CALL( )
- ETH 0.10692648
0x5caec831a9b57f4e170fd81b6fa32b6a0a32ccb1.CALL( )
- ETH 0.41408986
0xd6691183aca082b87f046fab6a9ecfcf89990f15.CALL( )
// SPDX-License-Identifier: Apache-2.0 pragma solidity ^0.8.11; /// @author thirdweb // $$\\ $$\\ $$\\ $$\\ $$\\ // $$ | $$ | \\__| $$ | $$ | // $$$$$$\\ $$$$$$$\\ $$\\ $$$$$$\\ $$$$$$$ |$$\\ $$\\ $$\\ $$$$$$\\ $$$$$$$\\ // \\_$$ _| $$ __$$\\ $$ |$$ __$$\\ $$ __$$ |$$ | $$ | $$ |$$ __$$\\ $$ __$$\\ // $$ | $$ | $$ |$$ |$$ | \\__|$$ / $$ |$$ | $$ | $$ |$$$$$$$$ |$$ | $$ | // $$ |$$\\ $$ | $$ |$$ |$$ | $$ | $$ |$$ | $$ | $$ |$$ ____|$$ | $$ | // \\$$$$ |$$ | $$ |$$ |$$ | \\$$$$$$$ |\\$$$$$\\$$$$ |\\$$$$$$$\\ $$$$$$$ | // \\____/ \\__| \\__|\\__|\\__| \\_______| \\_____\\____/ \\_______|\\_______/ import "./extension/interface/IContractFactory.sol"; import "@openzeppelin/contracts/metatx/ERC2771Context.sol"; import "@openzeppelin/contracts/utils/Multicall.sol"; import "@openzeppelin/contracts/proxy/Clones.sol"; contract TWCloneFactory is Multicall, ERC2771Context, IContractFactory { /// @dev Emitted when a proxy is deployed. event ProxyDeployed(address indexed implementation, address proxy, address indexed deployer); constructor(address _trustedForwarder) ERC2771Context(_trustedForwarder) {} /// @dev Deploys a proxy that points to the given implementation. function deployProxyByImplementation( address _implementation, bytes memory _data, bytes32 _salt ) public override returns (address deployedProxy) { bytes32 salthash = keccak256(abi.encodePacked(_msgSender(), _salt)); deployedProxy = Clones.cloneDeterministic(_implementation, salthash); emit ProxyDeployed(_implementation, deployedProxy, _msgSender()); if (_data.length > 0) { // slither-disable-next-line unused-return Address.functionCall(deployedProxy, _data); } } function _msgSender() internal view virtual override returns (address sender) { return ERC2771Context._msgSender(); } function _msgData() internal view virtual override returns (bytes calldata) { return ERC2771Context._msgData(); } } // SPDX-License-Identifier: Apache-2.0 pragma solidity ^0.8.0; /// @author thirdweb interface IContractFactory { /** * @notice Deploys a proxy that points to that points to the given implementation. * * @param implementation Address of the implementation to point to. * * @param data Additional data to pass to the proxy constructor or any other data useful during deployement. * @param salt Salt to use for the deterministic address generation. */ function deployProxyByImplementation( address implementation, bytes memory data, bytes32 salt ) external returns (address); } // SPDX-License-Identifier: MIT // OpenZeppelin Contracts (last updated v4.7.0) (metatx/ERC2771Context.sol) pragma solidity ^0.8.9; import "../utils/Context.sol"; /** * @dev Context variant with ERC2771 support. */ abstract contract ERC2771Context is Context { /// @custom:oz-upgrades-unsafe-allow state-variable-immutable address private immutable _trustedForwarder; /// @custom:oz-upgrades-unsafe-allow constructor constructor(address trustedForwarder) { _trustedForwarder = trustedForwarder; } function isTrustedForwarder(address forwarder) public view virtual returns (bool) { return forwarder == _trustedForwarder; } function _msgSender() internal view virtual override returns (address sender) { if (isTrustedForwarder(msg.sender)) { // The assembly code is more direct than the Solidity version using `abi.decode`. /// @solidity memory-safe-assembly assembly { sender := shr(96, calldataload(sub(calldatasize(), 20))) } } else { return super._msgSender(); } } function _msgData() internal view virtual override returns (bytes calldata) { if (isTrustedForwarder(msg.sender)) { return msg.data[:msg.data.length - 20]; } else { return super._msgData(); } } } // SPDX-License-Identifier: MIT // OpenZeppelin Contracts (last updated v4.7.0) (proxy/Clones.sol) pragma solidity ^0.8.0; /** * @dev https://eips.ethereum.org/EIPS/eip-1167[EIP 1167] is a standard for * deploying minimal proxy contracts, also known as "clones". * * > To simply and cheaply clone contract functionality in an immutable way, this standard specifies * > a minimal bytecode implementation that delegates all calls to a known, fixed address. * * The library includes functions to deploy a proxy using either `create` (traditional deployment) or `create2` * (salted deterministic deployment). It also includes functions to predict the addresses of clones deployed using the * deterministic method. * * _Available since v3.4._ */ library Clones { /** * @dev Deploys and returns the address of a clone that mimics the behaviour of `implementation`. * * This function uses the create opcode, which should never revert. */ function clone(address implementation) internal returns (address instance) { /// @solidity memory-safe-assembly assembly { let ptr := mload(0x40) mstore(ptr, 0x3d602d80600a3d3981f3363d3d373d3d3d363d73000000000000000000000000) mstore(add(ptr, 0x14), shl(0x60, implementation)) mstore(add(ptr, 0x28), 0x5af43d82803e903d91602b57fd5bf30000000000000000000000000000000000) instance := create(0, ptr, 0x37) } require(instance != address(0), "ERC1167: create failed"); } /** * @dev Deploys and returns the address of a clone that mimics the behaviour of `implementation`. * * This function uses the create2 opcode and a `salt` to deterministically deploy * the clone. Using the same `implementation` and `salt` multiple time will revert, since * the clones cannot be deployed twice at the same address. */ function cloneDeterministic(address implementation, bytes32 salt) internal returns (address instance) { /// @solidity memory-safe-assembly assembly { let ptr := mload(0x40) mstore(ptr, 0x3d602d80600a3d3981f3363d3d373d3d3d363d73000000000000000000000000) mstore(add(ptr, 0x14), shl(0x60, implementation)) mstore(add(ptr, 0x28), 0x5af43d82803e903d91602b57fd5bf30000000000000000000000000000000000) instance := create2(0, ptr, 0x37, salt) } require(instance != address(0), "ERC1167: create2 failed"); } /** * @dev Computes the address of a clone deployed using {Clones-cloneDeterministic}. */ function predictDeterministicAddress( address implementation, bytes32 salt, address deployer ) internal pure returns (address predicted) { /// @solidity memory-safe-assembly assembly { let ptr := mload(0x40) mstore(ptr, 0x3d602d80600a3d3981f3363d3d373d3d3d363d73000000000000000000000000) mstore(add(ptr, 0x14), shl(0x60, implementation)) mstore(add(ptr, 0x28), 0x5af43d82803e903d91602b57fd5bf3ff00000000000000000000000000000000) mstore(add(ptr, 0x38), shl(0x60, deployer)) mstore(add(ptr, 0x4c), salt) mstore(add(ptr, 0x6c), keccak256(ptr, 0x37)) predicted := keccak256(add(ptr, 0x37), 0x55) } } /** * @dev Computes the address of a clone deployed using {Clones-cloneDeterministic}. */ function predictDeterministicAddress(address implementation, bytes32 salt) internal view returns (address predicted) { return predictDeterministicAddress(implementation, salt, address(this)); } } // SPDX-License-Identifier: MIT // OpenZeppelin Contracts (last updated v4.7.0) (utils/Address.sol) pragma solidity ^0.8.1; /** * @dev Collection of functions related to the address type */ library Address { /** * @dev Returns true if `account` is a contract. * * [IMPORTANT] * ==== * It is unsafe to assume that an address for which this function returns * false is an externally-owned account (EOA) and not a contract. * * Among others, `isContract` will return false for the following * types of addresses: * * - an externally-owned account * - a contract in construction * - an address where a contract will be created * - an address where a contract lived, but was destroyed * ==== * * [IMPORTANT] * ==== * You shouldn't rely on `isContract` to protect against flash loan attacks! * * Preventing calls from contracts is highly discouraged. It breaks composability, breaks support for smart wallets * like Gnosis Safe, and does not provide security since it can be circumvented by calling from a contract * constructor. * ==== */ function isContract(address account) internal view returns (bool) { // This method relies on extcodesize/address.code.length, which returns 0 // for contracts in construction, since the code is only stored at the end // of the constructor execution. return account.code.length > 0; } /** * @dev Replacement for Solidity's `transfer`: sends `amount` wei to * `recipient`, forwarding all available gas and reverting on errors. * * https://eips.ethereum.org/EIPS/eip-1884[EIP1884] increases the gas cost * of certain opcodes, possibly making contracts go over the 2300 gas limit * imposed by `transfer`, making them unable to receive funds via * `transfer`. {sendValue} removes this limitation. * * https://diligence.consensys.net/posts/2019/09/stop-using-soliditys-transfer-now/[Learn more]. * * IMPORTANT: because control is transferred to `recipient`, care must be * taken to not create reentrancy vulnerabilities. Consider using * {ReentrancyGuard} or the * https://solidity.readthedocs.io/en/v0.5.11/security-considerations.html#use-the-checks-effects-interactions-pattern[checks-effects-interactions pattern]. */ 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"); } /** * @dev Performs a Solidity function call using a low level `call`. A * plain `call` is an unsafe replacement for a function call: use this * function instead. * * If `target` reverts with a revert reason, it is bubbled up by this * function (like regular Solidity function calls). * * Returns the raw returned data. To convert to the expected return value, * use https://solidity.readthedocs.io/en/latest/units-and-global-variables.html?highlight=abi.decode#abi-encoding-and-decoding-functions[`abi.decode`]. * * Requirements: * * - `target` must be a contract. * - calling `target` with `data` must not revert. * * _Available since v3.1._ */ function functionCall(address target, bytes memory data) internal returns (bytes memory) { return functionCall(target, data, "Address: low-level call failed"); } /** * @dev Same as {xref-Address-functionCall-address-bytes-}[`functionCall`], but with * `errorMessage` as a fallback revert reason when `target` reverts. * * _Available since v3.1._ */ function functionCall( address target, bytes memory data, string memory errorMessage ) internal returns (bytes memory) { return functionCallWithValue(target, data, 0, errorMessage); } /** * @dev Same as {xref-Address-functionCall-address-bytes-}[`functionCall`], * but also transferring `value` wei to `target`. * * Requirements: * * - the calling contract must have an ETH balance of at least `value`. * - the called Solidity function must be `payable`. * * _Available since v3.1._ */ 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"); } /** * @dev Same as {xref-Address-functionCallWithValue-address-bytes-uint256-}[`functionCallWithValue`], but * with `errorMessage` as a fallback revert reason when `target` reverts. * * _Available since v3.1._ */ 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"); require(isContract(target), "Address: call to non-contract"); (bool success, bytes memory returndata) = target.call{value: value}(data); return verifyCallResult(success, returndata, errorMessage); } /** * @dev Same as {xref-Address-functionCall-address-bytes-}[`functionCall`], * but performing a static call. * * _Available since v3.3._ */ function functionStaticCall(address target, bytes memory data) internal view returns (bytes memory) { return functionStaticCall(target, data, "Address: low-level static call failed"); } /** * @dev Same as {xref-Address-functionCall-address-bytes-string-}[`functionCall`], * but performing a static call. * * _Available since v3.3._ */ function functionStaticCall( address target, bytes memory data, string memory errorMessage ) internal view returns (bytes memory) { require(isContract(target), "Address: static call to non-contract"); (bool success, bytes memory returndata) = target.staticcall(data); return verifyCallResult(success, returndata, errorMessage); } /** * @dev Same as {xref-Address-functionCall-address-bytes-}[`functionCall`], * but performing a delegate call. * * _Available since v3.4._ */ function functionDelegateCall(address target, bytes memory data) internal returns (bytes memory) { return functionDelegateCall(target, data, "Address: low-level delegate call failed"); } /** * @dev Same as {xref-Address-functionCall-address-bytes-string-}[`functionCall`], * but performing a delegate call. * * _Available since v3.4._ */ function functionDelegateCall( address target, bytes memory data, string memory errorMessage ) internal returns (bytes memory) { require(isContract(target), "Address: delegate call to non-contract"); (bool success, bytes memory returndata) = target.delegatecall(data); return verifyCallResult(success, returndata, errorMessage); } /** * @dev Tool to verifies that a low level call was successful, and revert if it wasn't, either by bubbling the * revert reason using the provided one. * * _Available since v4.3._ */ function verifyCallResult( bool success, bytes memory returndata, string memory errorMessage ) internal pure returns (bytes memory) { if (success) { return returndata; } else { // Look for revert reason and bubble it up if present if (returndata.length > 0) { // The easiest way to bubble the revert reason is using memory via assembly /// @solidity memory-safe-assembly assembly { let returndata_size := mload(returndata) revert(add(32, returndata), returndata_size) } } else { revert(errorMessage); } } } } // SPDX-License-Identifier: MIT // OpenZeppelin Contracts v4.4.1 (utils/Context.sol) pragma solidity ^0.8.0; /** * @dev Provides information about the current execution context, including the * sender of the transaction and its data. While these are generally available * via msg.sender and msg.data, they should not be accessed in such a direct * manner, since when dealing with meta-transactions the account sending and * paying for execution may not be the actual sender (as far as an application * is concerned). * * This contract is only required for intermediate, library-like contracts. */ abstract contract Context { function _msgSender() internal view virtual returns (address) { return msg.sender; } function _msgData() internal view virtual returns (bytes calldata) { return msg.data; } } // SPDX-License-Identifier: MIT // OpenZeppelin Contracts (last updated v4.5.0) (utils/Multicall.sol) pragma solidity ^0.8.0; import "./Address.sol"; /** * @dev Provides a function to batch together multiple calls in a single external call. * * _Available since v4.1._ */ abstract contract Multicall { /** * @dev Receives and executes a batch of function calls on this contract. */ function multicall(bytes[] calldata data) external virtual returns (bytes[] memory results) { results = new bytes[](data.length); for (uint256 i = 0; i < data.length; i++) { results[i] = Address.functionDelegateCall(address(this), data[i]); } return results; } }