Overview
S Balance
0 S
S Value
$0.00More Info
Private Name Tags
ContractCreator
Latest 25 internal transactions (View All)
Loading...
Loading
Contract Name:
FBTCFactory
Compiler Version
v0.8.20+commit.a1b79de6
Optimization Enabled:
Yes with 20000 runs
Other Settings:
london EvmVersion
Contract Source Code (Solidity Standard Json-Input format)
// SPDX-License-Identifier: UNLICENSED pragma solidity ^0.8.20; /** * @title FBTC Smart Contract Factory * @dev Inspired by https://github.com/pcaversaccio/createx */ contract FBTCFactory { event ContractDeployed( address indexed _contract, address indexed _deployer ); enum DeployType { Create2, Create2WithSender, Create3, Create3WithSender } function _guardSalt( address sender, bytes32 salt, uint256 tag ) internal pure returns (bytes32) { return keccak256(abi.encode(sender, salt, tag)); } function deployCreate2( bytes32 salt, bytes memory initCode, bool _private ) internal returns (address _contract) { address sender = _private ? msg.sender : address(0); salt = _guardSalt(sender, salt, 2); assembly { _contract := create2(0, add(initCode, 0x20), mload(initCode), salt) } require(_contract != address(0), "Create2 failed"); emit ContractDeployed(_contract, msg.sender); } function deployCreate3( bytes32 salt, bytes memory initCode, bool _private ) internal returns (address _contract) { address sender = _private ? msg.sender : address(0); bytes32 finalSalt = _guardSalt(sender, salt, 3); bytes memory proxyChildBytecode = hex"67_36_3d_3d_37_36_3d_34_f0_3d_52_60_08_60_18_f3"; address proxy; assembly { proxy := create2( 0, add(proxyChildBytecode, 32), mload(proxyChildBytecode), finalSalt ) } require(proxy != address(0), "Create3 proxy failed"); (bool success, bytes memory _retData) = proxy.call(initCode); if (!success) { assembly { let size := mload(_retData) revert(add(32, _retData), size) } } _contract = getCreate3Address(salt, sender); require(_contract.code.length > 0, "Create3 failed"); emit ContractDeployed(_contract, msg.sender); } function deploy( DeployType typ, bytes32 salt, bytes memory initCode ) public returns (address _contract) { if (typ == DeployType.Create2) { _contract = deployCreate2(salt, initCode, false); } else if (typ == DeployType.Create2WithSender) { _contract = deployCreate2(salt, initCode, true); } else if (typ == DeployType.Create3) { _contract = deployCreate3(salt, initCode, false); } else if (typ == DeployType.Create3WithSender) { _contract = deployCreate3(salt, initCode, true); } } function deployAndInit( DeployType typ, bytes32 salt, bytes calldata initCode, bytes calldata callData ) public returns (address _contract) { _contract = deploy(typ, salt, initCode); (bool success, bytes memory _retData) = _contract.call(callData); if (!success) { assembly { let size := mload(_retData) revert(add(32, _retData), size) } } } function getCreate2Address( bytes32 salt, address sender, bytes calldata initCode ) public view returns (address _contract) { bytes32 initCodeHash = keccak256(initCode); address deployer = address(this); salt = _guardSalt(sender, salt, 2); assembly { let ptr := mload(0x40) mstore(add(ptr, 0x40), initCodeHash) mstore(add(ptr, 0x20), salt) mstore(ptr, deployer) let start := add(ptr, 0x0b) mstore8(start, 0xff) _contract := keccak256(start, 85) } } function getCreate3Address( bytes32 salt, address sender ) public view returns (address _contract) { address deployer = address(this); salt = _guardSalt(sender, salt, 3); assembly { let ptr := mload(0x40) mstore(0x00, deployer) mstore8(0x0b, 0xff) mstore(0x20, salt) mstore( 0x40, hex"21_c3_5d_be_1b_34_4a_24_88_cf_33_21_d6_ce_54_2f_8e_9f_30_55_44_ff_09_e4_99_3a_62_31_9a_49_7c_1f" ) mstore(0x14, keccak256(0x0b, 0x55)) mstore(0x40, ptr) mstore(0x00, 0xd694) mstore8(0x34, 0x01) _contract := keccak256(0x1e, 0x17) } } function getAddress( DeployType typ, bytes32 salt, address sender, bytes calldata initCode ) external view returns (address _contract) { if (typ == DeployType.Create2) { _contract = getCreate2Address(salt, address(0), initCode); } else if (typ == DeployType.Create2WithSender) { _contract = getCreate2Address(salt, sender, initCode); } else if (typ == DeployType.Create3) { _contract = getCreate3Address(salt, address(0)); } else if (typ == DeployType.Create3WithSender) { _contract = getCreate3Address(salt, sender); } } }
{ "remappings": [ "ds-test/=lib/forge-std/lib/ds-test/src/", "forge-std/=lib/forge-std/src/" ], "optimizer": { "enabled": true, "runs": 20000 }, "metadata": { "useLiteralContent": false, "bytecodeHash": "ipfs", "appendCBOR": true }, "outputSelection": { "*": { "*": [ "evm.bytecode", "evm.deployedBytecode", "devdoc", "userdoc", "metadata", "abi" ] } }, "evmVersion": "london", "viaIR": true, "libraries": {} }
Contract Security Audit
- No Contract Security Audit Submitted- Submit Audit Here
[{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"_contract","type":"address"},{"indexed":true,"internalType":"address","name":"_deployer","type":"address"}],"name":"ContractDeployed","type":"event"},{"inputs":[{"internalType":"enum FBTCFactory.DeployType","name":"typ","type":"uint8"},{"internalType":"bytes32","name":"salt","type":"bytes32"},{"internalType":"bytes","name":"initCode","type":"bytes"}],"name":"deploy","outputs":[{"internalType":"address","name":"_contract","type":"address"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"enum FBTCFactory.DeployType","name":"typ","type":"uint8"},{"internalType":"bytes32","name":"salt","type":"bytes32"},{"internalType":"bytes","name":"initCode","type":"bytes"},{"internalType":"bytes","name":"callData","type":"bytes"}],"name":"deployAndInit","outputs":[{"internalType":"address","name":"_contract","type":"address"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"enum FBTCFactory.DeployType","name":"typ","type":"uint8"},{"internalType":"bytes32","name":"salt","type":"bytes32"},{"internalType":"address","name":"sender","type":"address"},{"internalType":"bytes","name":"initCode","type":"bytes"}],"name":"getAddress","outputs":[{"internalType":"address","name":"_contract","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"bytes32","name":"salt","type":"bytes32"},{"internalType":"address","name":"sender","type":"address"},{"internalType":"bytes","name":"initCode","type":"bytes"}],"name":"getCreate2Address","outputs":[{"internalType":"address","name":"_contract","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"bytes32","name":"salt","type":"bytes32"},{"internalType":"address","name":"sender","type":"address"}],"name":"getCreate3Address","outputs":[{"internalType":"address","name":"_contract","type":"address"}],"stateMutability":"view","type":"function"}]
Contract Creation Code
6080806040523461001657610b40908161001c8239f35b600080fdfe6080604052600436101561001257600080fd5b6000803560e01c9081632f0791d51461006a57508063456276b714610065578063a0354b7114610060578063d4fadcad1461005b5763e6eb7a291461005657600080fd5b6104d1565b610463565b6102ff565b61021e565b346101935760807ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc360112610193576100a1610196565b602435916100ad6101aa565b906064359367ffffffffffffffff851161018f576100d26101179536906004016101f0565b939092946100df81610537565b8061011b5750506100f09350610a4b565b60405173ffffffffffffffffffffffffffffffffffffffff90911681529081906020820190565b0390f35b61012781939293610537565b6001810361013f575061013a9450610a85565b6100f0565b61014e91945080929350610537565b6002810361016257505061013a9150610aa6565b80610171600392949394610537565b1461017e575b50506100f0565b6101889250610b01565b8280610177565b5080fd5b80fd5b6004359060048210156101a557565b600080fd5b6044359073ffffffffffffffffffffffffffffffffffffffff821682036101a557565b6024359073ffffffffffffffffffffffffffffffffffffffff821682036101a557565b9181601f840112156101a55782359167ffffffffffffffff83116101a557602083818601950101116101a557565b346101a55760807ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc3601126101a557610255610196565b67ffffffffffffffff6044358181116101a5576102769036906004016101f0565b92906064359283116101a5576102af600093926102a561029b869536906004016101f0565b949097369161042c565b9060243590610570565b938160405192839283378101838152039082855af1906102cd6108c9565b91156102f65760405173ffffffffffffffffffffffffffffffffffffffff919091168152602090f35b50805190602001fd5b346101a55760407ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc3601126101a557602061034361033b6101cd565b600435610b01565b73ffffffffffffffffffffffffffffffffffffffff60405191168152f35b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b6080810190811067ffffffffffffffff8211176103ac57604052565b610361565b90601f7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0910116810190811067ffffffffffffffff8211176103ac57604052565b67ffffffffffffffff81116103ac57601f017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe01660200190565b929192610438826103f2565b9161044660405193846103b1565b8294818452818301116101a5578281602093846000960137010152565b346101a55760607ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc3601126101a55761049a610196565b60443567ffffffffffffffff81116101a557366023820112156101a5576020916102a561034392369060248160040135910161042c565b346101a55760607ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc3601126101a5576105086101cd565b60443567ffffffffffffffff81116101a55760209161052e6103439236906004016101f0565b91600435610a85565b6004111561054157565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602160045260246000fd5b92919060009360009061058281610537565b8061059757505061059492935061074f565b90565b6105a081610537565b600181036105b5575050610594929350610696565b6105be81610537565b600281036105d357505061059492935061095e565b806105e360039295949395610537565b146105ed57505050565b909180809495506105fe83336107df565b61060661081a565b60208151910183f59373ffffffffffffffffffffffffffffffffffffffff946106328682161515610864565b82602083519301915af16106446108c9565b901561068e5750610656903390610b01565b91610663833b15156108f9565b7f33c981baba081f8fd2c52ac6ad1ea95b6814b4376640f55689051f6584729688339284169180a390565b805190602001fd5b6106a0903361077f565b906020815191016000f59073ffffffffffffffffffffffffffffffffffffffff821680156106f15733907f33c981baba081f8fd2c52ac6ad1ea95b6814b4376640f55689051f6584729688600080a3565b60646040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152600e60248201527f43726561746532206661696c65640000000000000000000000000000000000006044820152fd5b6106a0905b6040516020810191600083526040820152600260608201526060815261077981610390565b51902090565b906040519073ffffffffffffffffffffffffffffffffffffffff60208301931683526040820152600260608201526060815261077981610390565b6040516020810191600083526040820152600360608201526060815261077981610390565b906040519073ffffffffffffffffffffffffffffffffffffffff60208301931683526040820152600360608201526060815261077981610390565b604051906040820182811067ffffffffffffffff8211176103ac57604052601082527f67363d3d37363d34f03d5260086018f3000000000000000000000000000000006020830152565b1561086b57565b60646040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601460248201527f437265617465332070726f7879206661696c65640000000000000000000000006044820152fd5b3d156108f4573d906108da826103f2565b916108e860405193846103b1565b82523d6000602084013e565b606090565b1561090057565b60646040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152600e60248201527f43726561746533206661696c65640000000000000000000000000000000000006044820152fd5b9190610969836107ba565b92602061097461081a565b805195600096879384930183f59373ffffffffffffffffffffffffffffffffffffffff946109a58682161515610864565b82602083519301915af16109b76108c9565b901561068e57506109c7906107ba565b6040519030855260ff600b536020527f21c35dbe1b344a2488cf3321d6ce542f8e9f305544ff09e4993a62319a497c1f6040526055600b2060145260405261d694835260016034536017601e2092610a21843b15156108f9565b7f33c981baba081f8fd2c52ac6ad1ea95b6814b4376640f55689051f6584729688339285169180a3565b610a6b610a5e600b93605595369161042c565b6020815191012091610754565b60405191604083015260208201523081520160ff81532090565b610a6b90610a99600b94605596369161042c565b602081519101209261077f565b610aaf906107ba565b604051903060005260ff600b536020527f21c35dbe1b344a2488cf3321d6ce542f8e9f305544ff09e4993a62319a497c1f6040526055600b2060145260405261d69460005260016034536017601e2090565b610aaf916107df56fea2646970667358221220b121f3e14f898537ca2202ce97f1e6988c154b29105d210f287d0d88c632249d64736f6c63430008140033
Deployed Bytecode
0x6080604052600436101561001257600080fd5b6000803560e01c9081632f0791d51461006a57508063456276b714610065578063a0354b7114610060578063d4fadcad1461005b5763e6eb7a291461005657600080fd5b6104d1565b610463565b6102ff565b61021e565b346101935760807ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc360112610193576100a1610196565b602435916100ad6101aa565b906064359367ffffffffffffffff851161018f576100d26101179536906004016101f0565b939092946100df81610537565b8061011b5750506100f09350610a4b565b60405173ffffffffffffffffffffffffffffffffffffffff90911681529081906020820190565b0390f35b61012781939293610537565b6001810361013f575061013a9450610a85565b6100f0565b61014e91945080929350610537565b6002810361016257505061013a9150610aa6565b80610171600392949394610537565b1461017e575b50506100f0565b6101889250610b01565b8280610177565b5080fd5b80fd5b6004359060048210156101a557565b600080fd5b6044359073ffffffffffffffffffffffffffffffffffffffff821682036101a557565b6024359073ffffffffffffffffffffffffffffffffffffffff821682036101a557565b9181601f840112156101a55782359167ffffffffffffffff83116101a557602083818601950101116101a557565b346101a55760807ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc3601126101a557610255610196565b67ffffffffffffffff6044358181116101a5576102769036906004016101f0565b92906064359283116101a5576102af600093926102a561029b869536906004016101f0565b949097369161042c565b9060243590610570565b938160405192839283378101838152039082855af1906102cd6108c9565b91156102f65760405173ffffffffffffffffffffffffffffffffffffffff919091168152602090f35b50805190602001fd5b346101a55760407ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc3601126101a557602061034361033b6101cd565b600435610b01565b73ffffffffffffffffffffffffffffffffffffffff60405191168152f35b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b6080810190811067ffffffffffffffff8211176103ac57604052565b610361565b90601f7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0910116810190811067ffffffffffffffff8211176103ac57604052565b67ffffffffffffffff81116103ac57601f017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe01660200190565b929192610438826103f2565b9161044660405193846103b1565b8294818452818301116101a5578281602093846000960137010152565b346101a55760607ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc3601126101a55761049a610196565b60443567ffffffffffffffff81116101a557366023820112156101a5576020916102a561034392369060248160040135910161042c565b346101a55760607ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc3601126101a5576105086101cd565b60443567ffffffffffffffff81116101a55760209161052e6103439236906004016101f0565b91600435610a85565b6004111561054157565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602160045260246000fd5b92919060009360009061058281610537565b8061059757505061059492935061074f565b90565b6105a081610537565b600181036105b5575050610594929350610696565b6105be81610537565b600281036105d357505061059492935061095e565b806105e360039295949395610537565b146105ed57505050565b909180809495506105fe83336107df565b61060661081a565b60208151910183f59373ffffffffffffffffffffffffffffffffffffffff946106328682161515610864565b82602083519301915af16106446108c9565b901561068e5750610656903390610b01565b91610663833b15156108f9565b7f33c981baba081f8fd2c52ac6ad1ea95b6814b4376640f55689051f6584729688339284169180a390565b805190602001fd5b6106a0903361077f565b906020815191016000f59073ffffffffffffffffffffffffffffffffffffffff821680156106f15733907f33c981baba081f8fd2c52ac6ad1ea95b6814b4376640f55689051f6584729688600080a3565b60646040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152600e60248201527f43726561746532206661696c65640000000000000000000000000000000000006044820152fd5b6106a0905b6040516020810191600083526040820152600260608201526060815261077981610390565b51902090565b906040519073ffffffffffffffffffffffffffffffffffffffff60208301931683526040820152600260608201526060815261077981610390565b6040516020810191600083526040820152600360608201526060815261077981610390565b906040519073ffffffffffffffffffffffffffffffffffffffff60208301931683526040820152600360608201526060815261077981610390565b604051906040820182811067ffffffffffffffff8211176103ac57604052601082527f67363d3d37363d34f03d5260086018f3000000000000000000000000000000006020830152565b1561086b57565b60646040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601460248201527f437265617465332070726f7879206661696c65640000000000000000000000006044820152fd5b3d156108f4573d906108da826103f2565b916108e860405193846103b1565b82523d6000602084013e565b606090565b1561090057565b60646040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152600e60248201527f43726561746533206661696c65640000000000000000000000000000000000006044820152fd5b9190610969836107ba565b92602061097461081a565b805195600096879384930183f59373ffffffffffffffffffffffffffffffffffffffff946109a58682161515610864565b82602083519301915af16109b76108c9565b901561068e57506109c7906107ba565b6040519030855260ff600b536020527f21c35dbe1b344a2488cf3321d6ce542f8e9f305544ff09e4993a62319a497c1f6040526055600b2060145260405261d694835260016034536017601e2092610a21843b15156108f9565b7f33c981baba081f8fd2c52ac6ad1ea95b6814b4376640f55689051f6584729688339285169180a3565b610a6b610a5e600b93605595369161042c565b6020815191012091610754565b60405191604083015260208201523081520160ff81532090565b610a6b90610a99600b94605596369161042c565b602081519101209261077f565b610aaf906107ba565b604051903060005260ff600b536020527f21c35dbe1b344a2488cf3321d6ce542f8e9f305544ff09e4993a62319a497c1f6040526055600b2060145260405261d69460005260016034536017601e2090565b610aaf916107df56fea2646970667358221220b121f3e14f898537ca2202ce97f1e6988c154b29105d210f287d0d88c632249d64736f6c63430008140033
Loading...
Loading
Loading...
Loading
Multichain Portfolio | 30 Chains
Chain | Token | Portfolio % | Price | Amount | Value |
---|
[ Download: CSV Export ]
[ Download: CSV Export ]
A contract address hosts a smart contract, which is a set of code stored on the blockchain that runs when predetermined conditions are met. Learn more about addresses in our Knowledge Base.