Source Code
Overview
ETH Balance
0 ETH
Eth Value
$0.00| Transaction Hash |
Method
|
Block
|
From
|
|
To
|
||||
|---|---|---|---|---|---|---|---|---|---|
Latest 1 internal transaction
Advanced mode:
| Parent Transaction Hash | Method | Block |
From
|
|
To
|
||
|---|---|---|---|---|---|---|---|
| 0x60806040 | 20094161 | 652 days ago | Contract Creation | 0 ETH |
Loading...
Loading
Loading...
Loading
Cross-Chain Transactions
Loading...
Loading
This contract may be a proxy contract. Click on More Options and select Is this a proxy? to confirm and enable the "Read as Proxy" & "Write as Proxy" tabs.
Contract Name:
DestinyFactory
Compiler Version
v0.8.25+commit.b61c2a91
Optimization Enabled:
Yes with 200 runs
Other Settings:
cancun EvmVersion
Contract Source Code (Solidity Standard Json-Input format)
/*=======================================================================================================================
# .. #
# :: #
# !! #
# .77. #
# ~77~ #
# .7777. #
# !7777! #
# ^777777^ #
# ^77777777^ #
# ^777!~~!777^ #
# ^7777!::!7777^ #
# .~77777! !77777~. #
# :!77777!: :!77777!: #
# ~777777!^ ^!777777~ #
# :!7777777^ ^7777777!: #
# :!77777777: :77777777!: #
# :!77777777!. .!77777777!: #
# .^!77777777!^ ^!77777777!^. #
# :~7777777777^. .. .^7777777777~: #
# .^!777777777!^. ^^ .^!777777777!^. #
# .:~!777777777!~: :77: :~!777777777!~:. #
# .:^!7777777777!~: ^7777^ :~!7777777777!^:. #
# ..:^~!77777777!!~^:. .^!777777!^. .:^~!!77777777!~^:.. #
# ...::^^~!!77777777~~^^:.. .:^!777777777777!^:. ..:^^~~77777777!!~^^::... #
# ...::^^~!!77777777~~^^:.. .:^!777777777777!^:. ..:^^~~77777777!!~^^::... #
# ..:^~!77777777!!~^:. .^!777777!^. .:^~!!77777777!~^:.. #
# .:^!7777777777!~: ^7777^ :~!7777777777!^:. #
# .:~!777777777!~: :77: :~!777777777!~:. #
# .^!777777777!^. ^^ .^!777777777!^. #
# :~7777777777^. .. .^7777777777~: #
# .^!77777777!^ ^!77777777!^. #
# :!77777777!. .!77777777!: #
# :!77777777: :77777777!: #
# :!7777777^ ^7777777!: #
# ~777777!^ ^!777777~ #
# :!77777!: :!77777!: #
# .~77777! !77777~. #
# ^7777!::!7777^ #
# ^777!~~!777^ #
# ^77777777^ #
# ^777777^ #
# !7777! #
# .7777. #
# ~77~ #
# .77. #
# !! #
# :: #
# .. #
# #
/*=======================================================================================================================
# #
# ██████╗ ███████╗███████╗████████╗██╗███╗ ██╗██╗ ██╗████████╗███████╗███╗ ███╗██████╗ ██╗ ███████╗ #
# ██╔══██╗██╔════╝██╔════╝╚══██╔══╝██║████╗ ██║╚██╗ ██╔╝╚══██╔══╝██╔════╝████╗ ████║██╔══██╗██║ ██╔════╝ #
# ██║ ██║█████╗ ███████╗ ██║ ██║██╔██╗ ██║ ╚████╔╝ ██║ █████╗ ██╔████╔██║██████╔╝██║ █████╗ #
# ██║ ██║██╔══╝ ╚════██║ ██║ ██║██║╚██╗██║ ╚██╔╝ ██║ ██╔══╝ ██║╚██╔╝██║██╔═══╝ ██║ ██╔══╝ #
# ██████╔╝███████╗███████║ ██║ ██║██║ ╚████║ ██║ ██║ ███████╗██║ ╚═╝ ██║██║ ███████╗███████╗ #
# ╚═════╝ ╚══════╝╚══════╝ ╚═╝ ╚═╝╚═╝ ╚═══╝ ╚═╝ ╚═╝ ╚══════╝╚═╝ ╚═╝╚═╝ ╚══════╝╚══════╝ #
# #
=========================================================================================================================
# __ __ __ #
# / \ | o _ ._ _ o _. / \ _ _ | _|_ _ | _. / \ o _ o #
# | (|/ |< | \/ (_) | | | | \/ (_| | (|/ _> (_) | |_ (_ | (_| \/ | (|/ >< | /_ | #
# \__ / / \__ / \__ #
# __ __ __ #
# / \ _ _. o ._ _ / \ _| _. ._ / \ _ o _ _. _| _. #
# | (|/ _> |_| \/ |_| (_| | | | (_| | (|/ (_| |_| \/ |_| >< |_| (_| | | | (|/ (_ | (_ (_| (_| (_| #
# \__ / | _| \__ / \__ #
# __ __ __ __ #
# / \ o o _. ._ _ / \ ._ _ _ / \ | o / \ |_ _. ._ | _. #
# | (|/ | | (_| | | \/ |_| (/_ | (|/ |_| | | | (_) | (|/ |_| | | | (|/ | | (_| | |_| |< (_| #
# \__ _| / \__ \__ \__ #
# #
#=======================================================================================================================*/
// SPDX-License-Identifier: LGPL-3.0-only
pragma solidity ^0.8.19;
//common
import {IDestinyFactory} from "factory/interfaces/IDestinyFactory.sol";
import {DeployType} from "factory/enum/DeployType.sol";
import {ProxyType} from "factory/enum/ProxyType.sol";
import {CodeType} from "factory/enum/CodeType.sol";
import {Lib_DestinyFactory} from "factory/libraries/Lib_DestinyFactory.sol";
import {IOwnershipValidator} from "interfaces/IOwnershipValidator.sol";
import {Module} from "struct/Module.sol";
import {BytesLib_3} from "libraries/BytesLib_3.sol";
//proxies
import {DestinyTempleV7ShadowProxy} from "proxies/shadow/DestinyTempleV7ShadowProxy.sol";
import {DestinyTempleV7BeaconProxy} from "proxies/beacon/DestinyTempleV7BeaconProxy.sol";
import {DestinyTempleV7DiamondProxy} from "proxies/diamond/DestinyTempleV7DiamondProxy.sol";
import {ERC1967UpgradeableBeacon} from "proxies/beacon/ERC1967UpgradeableBeacon.sol";
import {ERC1967UpgradeableBeaconProxy} from "proxies/beacon/ERC1967UpgradeableBeaconProxy.sol";
import {ERC1967UniversalUpgradableProxy} from "proxies/uups/ERC1967UniversalUpgradableProxy.sol";
/**
>>>EIP-6780:自毁将发送所有以太(wei),但不删除账户,除非其在部署的同一交易中使用;
>>>更新:仍然使用所有权分离-Create3模式,但为[最小[存在检查自毁创建者]合约(Creator)]增加字节码检查.
>>>理由:其他EVM兼容链可能不会实施EIP-6780.
>>>当在主网[解离]终端代理合约时,合约将不会被删除,但在其他EVM兼容链上,合约可能被删除.
>>>[最小[存在检查自毁创建者]合约(Creator)]将检查合约是否存在以决定是否跳过合约部署并直接以终端代理合约为受益人自毁.
>>>这可以保证无论链是否实施EIP-6780提案,工厂合约的行为相同.
* @title 最小[存在检查自毁创建者]合约(Creator)
* @author kiyomiya.eth
* NOTE: 此合约将在被调用时
2.预计算部署目的地,检查其字节码大小,若不为0则跳过3
3.通过[create][nonce:1]创建合约,数据起始位置[0x00],数据大小[calldatasize()]
4.自毁并发送所有以太币至部署目的地.
>>>此合约不返回创建的合约地址,因为其已被SELFDESTRUCT弹出栈,应当自行计算.
////////////////////////////////////////////////////////////////////////////////////////////////
RUNTIMECODE
PC NAME OPCODE DATA STACK OP
//在内存中存储'd694${creator自身地址}01'(地址与nonce1RLP编码结果)
0000 PUSH1 60 01 01 入栈 01
0002 PUSH1 60 15 15 01 入栈 0
0004 MSTORE 52 出栈 15 01 |将[01]存储到内存位置[0x15]
0005 ADDRESS 30 creator 入栈 creator |加载自身地址入栈
0006 PUSH1 60 14 14 creator 入栈 14
0008 MSTORE 52 出栈 14 creator |将[creator]存储到内存位置[0x14]
0009 PUSH2 61 d694 d694 入栈 d694
000c RETURNDATASIZE 3d 入栈 0b
000d MSTORE 52 出栈 0 d694 |将[d964]存储到内存位置[0x0b]
60016015523060145261d6943d52
//计算create地址
000e PUSH1 60 17 17 入栈 17
0010 PUSH1 60 12 12 17 入栈 12
0012 SHA3 20 hash 出栈 12 17 |入栈 hash |从内存位置[0x12]读取其后[0x17]字节数据进行keccak256哈希运算
//转换为地址
0013 PUSH1 60 60 60 hash 入栈 60
0015 SHL 1b shl_hash 出栈 60 hash |入栈 shl_hash |将[hash]左移[0x60]位
0016 PUSH1 60 60 60 shl_hash 入栈 60
0018 SHR 1c addr 出栈 60 shl_hash |入栈 addr |将[shl_hash]右移[0x60]位
0019 DUP1 80 addr addr 入栈 addr |复制栈中[第一个]元素[addr]入栈
//判断addr的字节码大小是否为0
001a EXTCODESIZE 3b codesize addr 出栈 addr |入栈 codesize |加载地址[addr]的字节码大小入栈
001b PUSH1 60 27 27 codesize addr 入栈 27
001d JUMPI 57 addr>>> 出栈 27 codesize |若[codesize]不为0(false)则跳转至第[0x27]个操作码,否则继续执行
//若addr的字节码为0则部署合约
001e POP 50 出栈 addr |弹出栈顶元素
001f CALLDATASIZE 36 cds 入栈 cds |加载调用数据长度入栈
0020 RETURNDATASIZE 3d 0 cds 入栈 rds |加载返回数据长度[0x00]入栈
0021 RETURNDATASIZE 3d 0 0 cds 入栈 rds |加载返回数据长度[0x00]入栈
0022 CALLDATACOPY 37 出栈 0 0 cds |从调用数据索引[0x00]处复制[cds]长度到内存位置[0x00]
0023 CALLDATASIZE 36 cds 入栈 cds |加载调用数据长度入栈
0024 RETURNDATASIZE 3d 0 cds 入栈 rds |加载返回数据长度[0x00]入栈
0025 CALLVALUE 34 val 0 cds 入栈 val |加载调用发送的wei入栈
0026 CREATE f0 createAddr 出栈 val 0 cds |入栈 createAddr|使用内存位置[0x00],长度[cds]的字节码创建合约并发送[val]wei,输出创建地址
//否则直接自毁
0027 JUMPDEST 5b addr 标记跳转目的地
0028 SELFDESTRUCT ff 出栈 addr |停止执行,标记销毁合约并在整个交易结束后执行,强制向[addr]发送所有以太币(wei),不触发其回退函数
////////////////////////////////////////////////////////////////////////////////////////////////
CREATIONCODE
PC NAME OPCODE DATA STACK OP
0000 PUSH9 68 rtc2 rtc2 入栈 rtc2[3d3d37363d34f05bff]
0001 PUSH1 60 09 09 rtc2 入栈 09
0002 MSTORE 52 出栈 09 rtc1 |将[rtc1]存储到内存位置[0x09]
0000 PUSH32 7f rtc1 rtc1 入栈 rtc1[60016015523060145261d6943d526017601e2060601b60601c803b6027575036]
0001 RETURNDATASIZE 3d 0 rtc1 入栈 0
0002 MSTORE 52 出栈 0 rtc1 |将[rtc1]存储到内存位置[0x00]
0004 PUSH1 60 29 29 入栈 29
0003 RETURNDATASIZE 3d 0 29 入栈 0
0026 RETURN f3 出栈 0 29 |返回内存位置[0x00]长度[0x29]的数据 |此作为运行时字节码
////////////////////////////////////////////////////////////////////////////////////////////////
RUNTIMECODE
0x
60016015523060145261d6943d526017601e2060601b60601c803b60275750363d3d37363d34f05bff
////////////////////////////////////////////////////////////////////////////////////////////////
CREATIONCODE
0x
683d3d37363d34f05bff6009527f60016015523060145261d6943d526017601e2060601b60601c803b60275750363d5260293df3
////////////////////////////////////////////////////////////////////////////////////////////////
//更新-所有权验证现在由工厂合约完成
>>>Sepolia测试交易
>>>部署[DestinyFactory]
https://sepolia.etherscan.io/tx/0x5cf8d7beba87ee6d9c20bd60dbeaee0bdafef22f7b72dc85279057b11c8596ac
>>>调用[DestinyFactory]选择[create3]方式部署[测试合约]
>>>其会使用[create2]部署[Creator]合约并调用[Creator]通过[create]部署[测试合约(另一个[Creator])]
https://sepolia.etherscan.io/tx/0x394e65ba2166c94744cbddb67430672f353cd9b08f5e2866b81d4b7e74cda11c
>>>此时[Creator]合约自毁,测试合约未自毁
>>>再次调用[DestinyFactory]选择[create3]方式部署[测试合约]
>>>其会重新召集[Creator]合约,[Creator]合约会检查到[测试合约]未自毁(字节码大小不为0),跳过部署而直接自毁,交易成功
https://sepolia.etherscan.io/tx/0x972c6b27c3a8ddcd37191bf9950bdf6a4c2d5a5128b52007ae86babc4e6bc237
>>>直接调用[测试合约](Creator),其(部署一个合约后)自毁
https://sepolia.etherscan.io/tx/0xcab1457cacedc9b2a81b1f5bab1264eeb73767d98555ad9ce3da34951162bc64
>>>再次使用相同数据调用[DestinyFactory]选择[create3]方式部署[测试合约]
>>>其会使用[create2]部署[Creator]合约,[Creator]合约会检查到[测试合约]已自毁(字节码大小为0)并通过[create]重新召集[测试合约]并自毁
https://sepolia.etherscan.io/tx/0x74ac536be2c6b18748f20b88402ca229fecc3f6f20ec9327f486a4e3df8a0648
>>>可以看到,[Creator]与[测试合约]部署在确定的地址上,随后[Creator]合约自毁,而无论[测试合约](在生产中为终端合约)是否能够自毁,用户都能重新部署并自毁[Creator]合约
>>>调用[DestinyFactory]在一笔交易中(如果链未实施EIP-6780提案则可以在不同的交易中)在相同的地址上重新部署[任意合约代码]
>>>需要通过所有权验证
////////////////////////////////////////////////////////////////////////////////////////////////
*/
contract DestinyFactory is IDestinyFactory{
bytes private constant CREATOR_CREATIONCODE = hex"683d3d37363d34f05bff6009527f60016015523060145261d6943d526017601e2060601b60601c803b60275750363d5260293df3";
constructor() payable {
Lib_DestinyFactory.storage_DestinyFactory().nonce = 1;
}
//create3专用
function verifyOwnership
(
address verifyContract,
bytes memory verifyData
)
public
{
address validator = Lib_DestinyFactory.storage_DestinyFactory()._verifyContract[msg.sender];
if(validator == address(0) && verifyContract != address(0)) validator = verifyContract;
//只在验证合约不是0时进行
if(validator != address(0)) {
(bool s ,bytes memory r) = validator.call(abi.encodeCall(IOwnershipValidator.verifyOwnership,(verifyData)));
require(s,"DestinyFactory:verifyOwnership Failed!");
if(verifyContract != address(this)) {
Lib_DestinyFactory.storage_DestinyFactory()._verifyContract[msg.sender] = verifyContract;
emit ValidatorChanged(verifyContract);
}
}
}
function init(address addr,bytes memory initData) private returns(address) {
if(initData.length > 0) {
(bool s,) = addr.call(initData);
if(!s) revert("DestinyFactory:init fail");
}
return addr;
}
function create
(
bytes memory creationCode
)
private
returns(address addr)
{
assembly{ addr := create(callvalue(),add(creationCode,0x20),mload(creationCode)) }
}
function create2
(
bytes32 salt,
bytes memory creationCode
)
private
returns(address addr)
{
assembly { addr := create2(callvalue(),add(creationCode,0x20),mload(creationCode),salt) }
if(keccak256(creationCode) == keccak256(CREATOR_CREATIONCODE)) revert("Disable create2 deploy creator!");
}
function create3
(
bytes32 salt,
address verifyContract,
bytes memory verifyData,
bytes memory creationCode
)
private
returns(address addr)
{
bytes memory creatorCreationCode = CREATOR_CREATIONCODE;
(,address preDeployCreatorAddr) = create2Addr(salt,creatorCreationCode);
//creator必须被reinit,因为nonce必须为初始值
if(preDeployCreatorAddr.code.length > 0) revert("DestinyFactory:creator deployed!");
//部署creator
address creator;
assembly { creator := create2(callvalue(),add(creatorCreationCode,0x20),mload(creatorCreationCode),salt) }
(,addr) = createAddr(creator,uint256(1));
//验证所有权
Lib_DestinyFactory.Storage_DestinyFactory storage ls = Lib_DestinyFactory.storage_DestinyFactory();
address validator = ls._verifyContract[addr];
if(validator == address(0) && verifyContract != address(0)) validator = verifyContract;
//只在验证合约不是0时进行
if(validator != address(0)) {
(bool s ,bytes memory r) = validator.call(abi.encodeCall(IOwnershipValidator.verifyOwnership,(verifyData)));
require(s,"DestinyFactory:verifyOwnership Failed!");
//通过后,设置新验证合约
if(verifyContract != address(this)) {
ls._verifyContract[msg.sender] = verifyContract;
}
}
//调用creator部署creationCode
creator.call{value:msg.value}(creationCode);
emit Deployed(creator);
}
function createAddr(address _creator, uint256 _nonce)
private
pure
returns (address creator,address addr)
{
creator=_creator;
/// @solidity memory-safe-assembly
assembly {
for {} 1 {} {
// The integer zero is treated as an empty byte string,
// and as a result it only has a length prefix, 0x80,
// computed via `0x80 + 0`.
// A one-byte integer in the [0x00, 0x7f] range uses its
// own value as a length prefix,
// there is no additional `0x80 + length` prefix that precedes it.
if iszero(gt(_nonce, 0x7f)) {
mstore(0x00, _creator)
// Using `mstore8` instead of `or` naturally cleans
// any dirty upper bits of `_creator`.
mstore8(0x0b, 0x94)
mstore8(0x0a, 0xd6)
// `shl` 7 is equivalent to multiplying by 0x80.
mstore8(0x20, or(shl(7, iszero(_nonce)), _nonce))
addr := keccak256(0x0a, 0x17)
break
}
let i := 8
// Just use a loop to generalize all the way with minimal bytecode size.
for {} shr(i, _nonce) { i := add(i, 8) } {}
// `shr` 3 is equivalent to dividing by 8.
i := shr(3, i)
// Store in descending slot sequence to overlap the values correctly.
mstore(i, _nonce)
mstore(0x00, shl(8, _creator))
mstore8(0x1f, add(0x80, i))
mstore8(0x0a, 0x94)
mstore8(0x09, add(0xd6, i))
addr := keccak256(0x09, add(0x17, i))
break
}
}
}
function create2Addr
(
bytes32 salt,
bytes memory creationCode
)
private
view
returns (
address creator,
address addr
)
{
creator = address(this);
addr = address(
uint160(
uint256(
keccak256(
abi.encodePacked(
bytes1(0xff),
address(this),
salt,
keccak256(creationCode)
)
)
)
)
);
}
function create3Addr
(
bytes32 salt
)
private
view
returns (
address creator,
address addr
)
{
(,creator) = create2Addr(salt,CREATOR_CREATIONCODE);
(,addr) = createAddr(creator,uint256(1));
}
////////////////////////////////////////////////////////////////////////////////////////////////
function createDestinyTempleV7ShadowProxy
(
bytes memory params
)
private
returns(address addr)
{
(address destinyTempleV7Beacon) = abi.decode(params,(address));
addr = create(
abi.encodePacked(
type(DestinyTempleV7ShadowProxy).creationCode,
abi.encode(destinyTempleV7Beacon)
)
);
}
function createDestinyTempleV7BeaconProxy
(
bytes memory params
)
private
returns(address addr)
{
(address destinyTempleV7Beacon) = abi.decode(params,(address));
addr = create(
abi.encodePacked(
type(DestinyTempleV7BeaconProxy).creationCode,
abi.encode(destinyTempleV7Beacon)
)
);
}
function createDestinyTempleV7DiamondProxy
(
bytes memory params
)
private
returns(address addr)
{
(Module[] memory mods) = abi.decode(params,(Module[]));
addr = create(
abi.encodePacked(
type(DestinyTempleV7DiamondProxy).creationCode,
abi.encode(abi.encode(mods))
)
);
}
function createERC1967UpgradeableBeacon
(
bytes memory params
)
private
returns(address addr)
{
(
address admin,
address implementedAddr
) = abi.decode(params,(address,address));
addr = create(
abi.encodePacked(
type(ERC1967UpgradeableBeacon).creationCode,
abi.encode(admin,implementedAddr)
)
);
}
function createERC1967UpgradeableBeaconProxy
(
bytes memory params
)
private
returns(address addr)
{
(
address admin,
address upgradeableBeaconAddr
) = abi.decode(params,(address,address));
addr = create(
abi.encodePacked(
type(ERC1967UpgradeableBeaconProxy).creationCode,
abi.encode(admin,upgradeableBeaconAddr)
)
);
}
function createERC1967UniversalUpgradableProxy
(
bytes memory params
)
private
returns(address addr)
{
(address implementedAddr) = abi.decode(params,(address));
addr = create(
abi.encodePacked(
type(ERC1967UniversalUpgradableProxy).creationCode,
abi.encode(implementedAddr)
)
);
}
function createERC1167MinimalProxy
(
bytes memory params
)
private
returns(address addr)
{
(address implementedAddr) = abi.decode(params,(address));
addr = create(
getERC1167MinimalProxyCreationCode(implementedAddr)
);
}
function createERC7511MinimalProxy
(
bytes memory params
)
private
returns(address addr)
{
(address implementedAddr) = abi.decode(params,(address));
addr = create(
getERC7511MinimalProxyCreationCode(implementedAddr)
);
}
function createDeploy
(
bytes memory creationCodeAndConstructorParameters_abiEncoded
)
private
returns(address addr)
{
addr = create(
creationCodeAndConstructorParameters_abiEncoded
);
}
////////////////////////////////////////////////////////////////////////////////////////////////
function create2DestinyTempleV7ShadowProxy
(
bytes memory params
)
private
returns(address addr)
{
(
bytes32 salt,
address destinyTempleV7Beacon
) = abi.decode(params,(bytes32,address));
addr = create2(
salt,
abi.encodePacked(
type(DestinyTempleV7ShadowProxy).creationCode,
abi.encode(destinyTempleV7Beacon)
)
);
}
function create2DestinyTempleV7BeaconProxy
(
bytes memory params
)
private
returns(address addr)
{
(
bytes32 salt,
address destinyTempleV7Beacon
) = abi.decode(params,(bytes32,address));
addr = create2(
salt,
abi.encodePacked(
type(DestinyTempleV7BeaconProxy).creationCode,
abi.encode(destinyTempleV7Beacon)
)
);
}
function create2DestinyTempleV7DiamondProxy
(
bytes memory params
)
private
returns(address addr)
{
(
bytes32 salt,
Module[] memory mods
) = abi.decode(params,(bytes32,Module[]));
addr = create2(
salt,
abi.encodePacked(
type(DestinyTempleV7DiamondProxy).creationCode,
abi.encode(abi.encode(mods))
)
);
}
function create2ERC1967UpgradeableBeacon
(
bytes memory params
)
private
returns(address addr)
{
(
bytes32 salt,
address admin,
address implementedAddr
) = abi.decode(params,(bytes32,address,address));
addr = create2(
salt,
abi.encodePacked(
type(ERC1967UpgradeableBeacon).creationCode,
abi.encode(admin,implementedAddr)
)
);
}
function create2ERC1967UpgradeableBeaconProxy
(
bytes memory params
)
private
returns(address addr)
{
(
bytes32 salt,
address admin,
address upgradeableBeaconAddr
) = abi.decode(params,(bytes32,address,address));
addr = create2(
salt,
abi.encodePacked(
type(ERC1967UpgradeableBeaconProxy).creationCode,
abi.encode(admin,upgradeableBeaconAddr)
)
);
}
function create2ERC1967UniversalUpgradableProxy
(
bytes memory params
)
private
returns(address addr)
{
(
bytes32 salt,
address implementedAddr
) = abi.decode(params,(bytes32,address));
addr = create2(
salt,
abi.encodePacked(
type(ERC1967UniversalUpgradableProxy).creationCode,
abi.encode(implementedAddr)
)
);
}
function create2ERC1167MinimalProxy
(
bytes memory params
)
private
returns(address addr)
{
(
bytes32 salt,
address implementedAddr
) = abi.decode(params,(bytes32,address));
addr = create2(
salt,
getERC1167MinimalProxyCreationCode(implementedAddr)
);
}
function create2ERC7511MinimalProxy
(
bytes memory params
)
private
returns(address addr)
{
(
bytes32 salt,
address implementedAddr
) = abi.decode(params,(bytes32,address));
addr = create2(
salt,
getERC7511MinimalProxyCreationCode(implementedAddr)
);
}
function create2Deploy
(
bytes memory params
)
private
returns(address addr)
{
(
bytes32 salt,
bytes memory creationCodeAndConstructorParameters_abiEncoded
) = abi.decode(params,(bytes32,bytes));
addr = create2(
salt,
creationCodeAndConstructorParameters_abiEncoded
);
}
////////////////////////////////////////////////////////////////////////////////////////////////
function create3DestinyTempleV7ShadowProxy
(
bytes memory params
)
private
returns(address addr)
{
(
bytes32 salt,
address verifyContract,
bytes memory verifyData,
address destinyTempleV7Beacon
) = abi.decode(
params,
(
bytes32,
address,
bytes,
address
)
);
addr = create3(
salt,
verifyContract,
verifyData,
abi.encodePacked(
type(DestinyTempleV7ShadowProxy).creationCode,
abi.encode(destinyTempleV7Beacon)
)
);
}
function create3DestinyTempleV7BeaconProxy
(
bytes memory params
)
private
returns(address addr)
{
(
bytes32 salt,
address verifyContract,
bytes memory verifyData,
address destinyTempleV7Beacon
) = abi.decode(
params,
(
bytes32,
address,
bytes,
address
)
);
addr = create3(
salt,
verifyContract,
verifyData,
abi.encodePacked(
type(DestinyTempleV7BeaconProxy).creationCode,
abi.encode(destinyTempleV7Beacon)
)
);
}
function create3DestinyTempleV7DiamondProxy
(
bytes memory params
)
private
returns(address addr)
{
(
bytes32 salt,
address verifyContract,
bytes memory verifyData,
Module[] memory mods
) = abi.decode(
params,
(
bytes32,
address,
bytes,
Module[]
)
);
addr = create3(
salt,
verifyContract,
verifyData,
abi.encodePacked(
type(DestinyTempleV7DiamondProxy).creationCode,
abi.encode(abi.encode(mods))
)
);
}
function create3ERC1967UpgradeableBeacon
(
bytes memory params
)
private
returns(address addr)
{
(
bytes32 salt,
address verifyContract,
bytes memory verifyData,
address admin,
address implementedAddr
) = abi.decode(
params,
(
bytes32,
address,
bytes,
address,
address
)
);
addr = create3(
salt,
verifyContract,
verifyData,
abi.encodePacked(
type(ERC1967UpgradeableBeacon).creationCode,
abi.encode(admin,implementedAddr)
)
);
}
function create3ERC1967UpgradeableBeaconProxy
(
bytes memory params
)
private
returns(address addr)
{
(
bytes32 salt,
address verifyContract,
bytes memory verifyData,
address admin,
address implementedAddr
) = abi.decode(
params,
(
bytes32,
address,
bytes,
address,
address
)
);
addr = create3(
salt,
verifyContract,
verifyData,
abi.encodePacked(
type(ERC1967UpgradeableBeacon).creationCode,
abi.encode(admin,implementedAddr)
)
);
}
function create3ERC1967UniversalUpgradableProxy
(
bytes memory params
)
private
returns(address addr)
{
(
bytes32 salt,
address verifyContract,
bytes memory verifyData,
address implementedAddr
) = abi.decode(
params,
(
bytes32,
address,
bytes,
address
)
);
addr = create3(
salt,
verifyContract,
verifyData,
abi.encodePacked(
type(ERC1967UniversalUpgradableProxy).creationCode,
abi.encode(implementedAddr)
)
);
}
function create3ERC1167MinimalProxy
(
bytes memory params
)
private
returns(address addr)
{
(
bytes32 salt,
address verifyContract,
bytes memory verifyData,
address implementedAddr
) = abi.decode(
params,
(
bytes32,
address,
bytes,
address
)
);
addr = create3(
salt,
verifyContract,
verifyData,
abi.encodePacked(
getERC1167MinimalProxyCreationCode(implementedAddr)
)
);
}
function create3ERC7511MinimalProxy
(
bytes memory params
)
private
returns(address addr)
{
(
bytes32 salt,
address verifyContract,
bytes memory verifyData,
address implementedAddr
) = abi.decode(
params,
(
bytes32,
address,
bytes,
address
)
);
addr = create3(
salt,
verifyContract,
verifyData,
abi.encodePacked(
getERC7511MinimalProxyCreationCode(implementedAddr)
)
);
}
function create3Deploy
(
bytes memory params
)
private
returns(address addr)
{
(
bytes32 salt,
address verifyContract,
bytes memory verifyData,
bytes memory creationCodeAndConstructorParameters_abiEncoded
) = abi.decode(
params,
(
bytes32,
address,
bytes,
bytes
)
);
addr = create3(
salt,
verifyContract,
verifyData,
creationCodeAndConstructorParameters_abiEncoded
);
}
////////////////////////////////////////////////////////////////////////////////////////////////
function create2DestinyTempleV7ShadowProxyAddr
(
bytes memory params
)
private
view
returns(
address creator,
address addr
)
{
(
bytes32 salt,
address destinyTempleV7Beacon
) = abi.decode(params,(bytes32,address));
(creator,addr) = create2Addr(
salt,
abi.encodePacked(
type(DestinyTempleV7ShadowProxy).creationCode,
abi.encode(destinyTempleV7Beacon)
)
);
}
function create2DestinyTempleV7BeaconProxyAddr
(
bytes memory params
)
private
view
returns(
address creator,
address addr
)
{
(
bytes32 salt,
address destinyTempleV7Beacon
) = abi.decode(params,(bytes32,address));
(creator,addr) = create2Addr(
salt,
abi.encodePacked(
type(DestinyTempleV7BeaconProxy).creationCode,
abi.encode(destinyTempleV7Beacon)
)
);
}
function create2DestinyTempleV7DiamondProxyAddr
(
bytes memory params
)
private
view
returns(
address creator,
address addr
)
{
(
bytes32 salt,
Module[] memory mods
) = abi.decode(params,(bytes32,Module[]));
(creator,addr) = create2Addr(
salt,
abi.encodePacked(
type(DestinyTempleV7DiamondProxy).creationCode,
abi.encode(abi.encode(mods))
)
);
}
function create2ERC1967UpgradeableBeaconAddr
(
bytes memory params
)
private
view
returns(
address creator,
address addr
)
{
(
bytes32 salt,
address admin,
address implementedAddr
) = abi.decode(params,(bytes32,address,address));
(creator,addr) = create2Addr(
salt,
abi.encodePacked(
type(ERC1967UpgradeableBeacon).creationCode,
abi.encode(admin,implementedAddr)
)
);
}
function create2ERC1967UpgradeableBeaconProxyAddr
(
bytes memory params
)
private
view
returns(
address creator,
address addr
)
{
(
bytes32 salt,
address admin,
address upgradeableBeaconAddr
) = abi.decode(params,(bytes32,address,address));
(creator,addr) = create2Addr(
salt,
abi.encodePacked(
type(ERC1967UpgradeableBeaconProxy).creationCode,
abi.encode(admin,upgradeableBeaconAddr)
)
);
}
function create2ERC1967UniversalUpgradableProxyAddr
(
bytes memory params
)
private
view
returns(
address creator,
address addr
)
{
(
bytes32 salt,
address implementedAddr
) = abi.decode(params,(bytes32,address));
(creator,addr) = create2Addr(
salt,
abi.encodePacked(
type(ERC1967UniversalUpgradableProxy).creationCode,
abi.encode(implementedAddr)
)
);
}
function create2ERC1167MinimalProxyAddr
(
bytes memory params
)
private
view
returns(
address creator,
address addr
)
{
(
bytes32 salt,
address implementedAddr
) = abi.decode(params,(bytes32,address));
(creator,addr) = create2Addr(
salt,
getERC1167MinimalProxyCreationCode(implementedAddr)
);
}
function create2ERC7511MinimalProxyAddr
(
bytes memory params
)
private
view
returns(
address creator,
address addr
)
{
(
bytes32 salt,
address implementedAddr
) = abi.decode(params,(bytes32,address));
(creator,addr) = create2Addr(
salt,
getERC7511MinimalProxyCreationCode(implementedAddr)
);
}
function create2DeployAddr
(
bytes memory params
)
private
view
returns(
address creator,
address addr
)
{
(
bytes32 salt,
bytes memory creationCodeAndConstructorParameters_abiEncoded
) = abi.decode(params,(bytes32,bytes));
(creator,addr) = create2Addr(
salt,
creationCodeAndConstructorParameters_abiEncoded
);
}
////////////////////////////////////////////////////////////////////////////////////////////////
function deploy
(
DeployType deployType,
ProxyType proxyType,
address callbackAddr,
bytes memory initData,
bytes memory params
)
external
payable
returns(address addr)
{
addr = (deployType == DeployType.Create3)
? (
(proxyType == ProxyType.DestinyTempleV7ShadowProxy)
? create3DestinyTempleV7ShadowProxy(params)
: (proxyType == ProxyType.DestinyTempleV7BeaconProxy)
? create3DestinyTempleV7BeaconProxy(params)
: (proxyType == ProxyType.DestinyTempleV7DiamondProxy)
? create3DestinyTempleV7DiamondProxy(params)
: (proxyType == ProxyType.ERC1967UpgradeableBeacon)
? create3ERC1967UpgradeableBeacon(params)
: (proxyType == ProxyType.ERC1967UpgradeableBeaconProxy)
? create3ERC1967UpgradeableBeaconProxy(params)
: (proxyType == ProxyType.ERC1967UniversalUpgradableProxy)
? create3ERC1967UniversalUpgradableProxy(params)
: (proxyType == ProxyType.ERC1167MinimalProxy)
? create3ERC1167MinimalProxy(params)
: (proxyType == ProxyType.ERC7511MinimalProxy)
? create3ERC7511MinimalProxy(params)
: create3Deploy(params)
)
: (deployType == DeployType.Create2)
? (
(proxyType == ProxyType.DestinyTempleV7ShadowProxy)
? create2DestinyTempleV7ShadowProxy(params)
: (proxyType == ProxyType.DestinyTempleV7BeaconProxy)
? create2DestinyTempleV7BeaconProxy(params)
: (proxyType == ProxyType.DestinyTempleV7DiamondProxy)
? create2DestinyTempleV7DiamondProxy(params)
: (proxyType == ProxyType.ERC1967UpgradeableBeacon)
? create2ERC1967UpgradeableBeacon(params)
: (proxyType == ProxyType.ERC1967UpgradeableBeaconProxy)
? create2ERC1967UpgradeableBeaconProxy(params)
: (proxyType == ProxyType.ERC1967UniversalUpgradableProxy)
? create2ERC1967UniversalUpgradableProxy(params)
: (proxyType == ProxyType.ERC1167MinimalProxy)
? create2ERC1167MinimalProxy(params)
: (proxyType == ProxyType.ERC7511MinimalProxy)
? create2ERC7511MinimalProxy(params)
: create2Deploy(params)
)
: (
(proxyType == ProxyType.DestinyTempleV7ShadowProxy)
? createDestinyTempleV7ShadowProxy(params)
: (proxyType == ProxyType.DestinyTempleV7BeaconProxy)
? createDestinyTempleV7BeaconProxy(params)
: (proxyType == ProxyType.DestinyTempleV7DiamondProxy)
? createDestinyTempleV7DiamondProxy(params)
: (proxyType == ProxyType.ERC1967UpgradeableBeacon)
? createERC1967UpgradeableBeacon(params)
: (proxyType == ProxyType.ERC1967UpgradeableBeaconProxy)
? createERC1967UpgradeableBeaconProxy(params)
: (proxyType == ProxyType.ERC1967UniversalUpgradableProxy)
? createERC1967UniversalUpgradableProxy(params)
: (proxyType == ProxyType.ERC1167MinimalProxy)
? createERC1167MinimalProxy(params)
: (proxyType == ProxyType.ERC7511MinimalProxy)
? createERC7511MinimalProxy(params)
: createDeploy(params)
)
;
if(addr.code.length == 0) revert("DestinyFactory:deploy failed!");
init(addr,initData);
if(callbackAddr != address(0)){
(bool s,)=callbackAddr.call(abi.encodeWithSignature("destinyDeployed(address,uint8,uint8,bytes,bytes)",addr,deployType,proxyType,initData,params));
if(!s) revert("DestinyFactory:callback failed!");
}
emit Deployed(addr);
emit Nonce(Lib_DestinyFactory.storage_DestinyFactory().nonce);
unchecked{ ++Lib_DestinyFactory.storage_DestinyFactory().nonce; }
}
function deployAddr
(
DeployType deployType,
ProxyType proxyType,
bytes memory params,
bytes32 salt,
uint256 nonce
)
public
view
returns(
address creator,
address addr
)
{
(creator,addr) = (deployType == DeployType.Create3)
? create3Addr(salt)
: (deployType == DeployType.Create)
? createAddr(
address(this),
nonce > 0 ? nonce : Lib_DestinyFactory.storage_DestinyFactory().nonce
)
: (
(proxyType == ProxyType.DestinyTempleV7ShadowProxy)
? create2DestinyTempleV7ShadowProxyAddr(params)
: (proxyType == ProxyType.DestinyTempleV7BeaconProxy)
? create2DestinyTempleV7BeaconProxyAddr(params)
: (proxyType == ProxyType.DestinyTempleV7DiamondProxy)
? create2DestinyTempleV7DiamondProxyAddr(params)
: (proxyType == ProxyType.ERC1967UpgradeableBeacon)
? create2ERC1967UpgradeableBeaconAddr(params)
: (proxyType == ProxyType.ERC1967UpgradeableBeaconProxy)
? create2ERC1967UpgradeableBeaconProxyAddr(params)
: (proxyType == ProxyType.ERC1967UniversalUpgradableProxy)
? create2ERC1967UniversalUpgradableProxyAddr(params)
: (proxyType == ProxyType.ERC1167MinimalProxy)
? create2ERC1167MinimalProxyAddr(params)
: (proxyType == ProxyType.ERC7511MinimalProxy)
? create2ERC7511MinimalProxyAddr(params)
: create2DeployAddr(params)
)
;
}
function deployCode
(
ProxyType proxyType,
CodeType codeType,
bytes memory constructorParametersABI_Encoded
)
external
pure
returns(bytes memory code)
{
code = (proxyType == ProxyType.DestinyTempleV7ShadowProxy)
? (
(codeType == CodeType.CreationCode)
? abi.encodePacked(
type(DestinyTempleV7ShadowProxy).creationCode,
constructorParametersABI_Encoded
)
: type(DestinyTempleV7ShadowProxy).runtimeCode
)
: (proxyType == ProxyType.DestinyTempleV7BeaconProxy)
? (
(codeType == CodeType.CreationCode)
? abi.encodePacked(
type(DestinyTempleV7BeaconProxy).creationCode,
constructorParametersABI_Encoded
)
: type(DestinyTempleV7BeaconProxy).runtimeCode
)
: (proxyType == ProxyType.DestinyTempleV7DiamondProxy)
? (
(codeType == CodeType.CreationCode)
? abi.encodePacked(
type(DestinyTempleV7DiamondProxy).creationCode,
abi.encode(constructorParametersABI_Encoded)
)
: type(DestinyTempleV7DiamondProxy).runtimeCode
)
: (proxyType == ProxyType.ERC1967UpgradeableBeacon)
? (
(codeType == CodeType.CreationCode)
? abi.encodePacked(
type(ERC1967UpgradeableBeacon).creationCode,
abi.encode(constructorParametersABI_Encoded)
)
: type(ERC1967UpgradeableBeacon).runtimeCode
)
: (proxyType == ProxyType.ERC1967UpgradeableBeaconProxy)
? (
(codeType == CodeType.CreationCode)
? abi.encodePacked(
type(ERC1967UpgradeableBeaconProxy).creationCode,
abi.encode(constructorParametersABI_Encoded)
)
: type(ERC1967UpgradeableBeaconProxy).runtimeCode
)
: (proxyType == ProxyType.ERC1967UniversalUpgradableProxy)
? (
(codeType == CodeType.CreationCode)
? abi.encodePacked(
type(ERC1967UniversalUpgradableProxy).creationCode,
abi.encode(constructorParametersABI_Encoded)
)
: type(ERC1967UniversalUpgradableProxy).runtimeCode
)
: (proxyType == ProxyType.ERC1167MinimalProxy)
? (
(codeType == CodeType.CreationCode)
? getERC1167MinimalProxyCreationCode(BytesLib_3.toAddress(constructorParametersABI_Encoded,0))
: getERC1167MinimalProxyRuntimeCode(BytesLib_3.toAddress(constructorParametersABI_Encoded,0))
)
: (proxyType == ProxyType.ERC7511MinimalProxy)
? (
(codeType == CodeType.CreationCode)
? getERC7511MinimalProxyCreationCode(BytesLib_3.toAddress(constructorParametersABI_Encoded,0))
: getERC7511MinimalProxyRuntimeCode(BytesLib_3.toAddress(constructorParametersABI_Encoded,0))
)
: (
constructorParametersABI_Encoded
)
;
}
function getERC1167MinimalProxyCreationCode
(
address implementedAddr
)
private
pure
returns(bytes memory code)
{
code = abi.encodePacked(hex"3d602d80600a3d3981f3",hex"363d3d373d3d3d363d73",implementedAddr,hex"5af43d82803e903d91602b57fd5bf3");
}
function getERC1167MinimalProxyRuntimeCode
(
address implementedAddr
)
private
pure
returns(bytes memory code)
{
code = abi.encodePacked(hex"363d3d373d3d3d363d73",implementedAddr,hex"5af43d82803e903d91602b57fd5bf3");
}
function getERC7511MinimalProxyCreationCode
(
address implementedAddr
)
private
pure
returns(bytes memory code)
{
code = abi.encodePacked(hex"602c8060095f395ff3",hex"365f5f375f5f365f73",implementedAddr,hex"5af43d5f5f3e5f3d91602a57fd5bf3");
}
function getERC7511MinimalProxyRuntimeCode
(
address implementedAddr
)
private
pure
returns(bytes memory code)
{
code = abi.encodePacked(hex"365f5f375f5f365f73",implementedAddr,hex"5af43d5f5f3e5f3d91602a57fd5bf3");
}
}
/*=======================================================================================================================
# __ __ __ #
# / \ | o _ ._ _ o _. / \ _ _ | _|_ _ | _. / \ o _ o #
# | (|/ |< | \/ (_) | | | | \/ (_| | (|/ _> (_) | |_ (_ | (_| \/ | (|/ >< | /_ | #
# \__ / / \__ / \__ #
# __ __ __ #
# / \ _ _. o ._ _ / \ _| _. ._ / \ _ o _ _. _| _. #
# | (|/ _> |_| \/ |_| (_| | | | (_| | (|/ (_| |_| \/ |_| >< |_| (_| | | | (|/ (_ | (_ (_| (_| (_| #
# \__ / | _| \__ / \__ #
# __ __ __ __ #
# / \ o o _. ._ _ / \ ._ _ _ / \ | o / \ |_ _. ._ | _. #
# | (|/ | | (_| | | \/ |_| (/_ | (|/ |_| | | | (_) | (|/ |_| | | | (|/ | | (_| | |_| |< (_| #
# \__ _| / \__ \__ \__ #
# #
/*======================================================================================================================*
# #
# ██████╗ ███████╗███████╗████████╗██╗███╗ ██╗██╗ ██╗████████╗███████╗███╗ ███╗██████╗ ██╗ ███████╗ #
# ██╔══██╗██╔════╝██╔════╝╚══██╔══╝██║████╗ ██║╚██╗ ██╔╝╚══██╔══╝██╔════╝████╗ ████║██╔══██╗██║ ██╔════╝ #
# ██║ ██║█████╗ ███████╗ ██║ ██║██╔██╗ ██║ ╚████╔╝ ██║ █████╗ ██╔████╔██║██████╔╝██║ █████╗ #
# ██║ ██║██╔══╝ ╚════██║ ██║ ██║██║╚██╗██║ ╚██╔╝ ██║ ██╔══╝ ██║╚██╔╝██║██╔═══╝ ██║ ██╔══╝ #
# ██████╔╝███████╗███████║ ██║ ██║██║ ╚████║ ██║ ██║ ███████╗██║ ╚═╝ ██║██║ ███████╗███████╗ #
# ╚═════╝ ╚══════╝╚══════╝ ╚═╝ ╚═╝╚═╝ ╚═══╝ ╚═╝ ╚═╝ ╚══════╝╚═╝ ╚═╝╚═╝ ╚══════╝╚══════╝ #
# #
*=======================================================================================================================*
# .. #
# :: #
# !! #
# .77. #
# ~77~ #
# .7777. #
# !7777! #
# ^777777^ #
# ^77777777^ #
# ^777!~~!777^ #
# ^7777!::!7777^ #
# .~77777! !77777~. #
# :!77777!: :!77777!: #
# ~777777!^ ^!777777~ #
# :!7777777^ ^7777777!: #
# :!77777777: :77777777!: #
# :!77777777!. .!77777777!: #
# .^!77777777!^ ^!77777777!^. #
# :~7777777777^. .. .^7777777777~: #
# .^!777777777!^. ^^ .^!777777777!^. #
# .:~!777777777!~: :77: :~!777777777!~:. #
# .:^!7777777777!~: ^7777^ :~!7777777777!^:. #
# ..:^~!77777777!!~^:. .^!777777!^. .:^~!!77777777!~^:.. #
# ...::^^~!!77777777~~^^:.. .:^!777777777777!^:. ..:^^~~77777777!!~^^::... #
# ...::^^~!!77777777~~^^:.. .:^!777777777777!^:. ..:^^~~77777777!!~^^::... #
# ..:^~!77777777!!~^:. .^!777777!^. .:^~!!77777777!~^:.. #
# .:^!7777777777!~: ^7777^ :~!7777777777!^:. #
# .:~!777777777!~: :77: :~!777777777!~:. #
# .^!777777777!^. ^^ .^!777777777!^. #
# :~7777777777^. .. .^7777777777~: #
# .^!77777777!^ ^!77777777!^. #
# :!77777777!. .!77777777!: #
# :!77777777: :77777777!: #
# :!7777777^ ^7777777!: #
# ~777777!^ ^!777777~ #
# :!77777!: :!77777!: #
# .~77777! !77777~. #
# ^7777!::!7777^ #
# ^777!~~!777^ #
# ^77777777^ #
# ^777777^ #
# !7777! #
# .7777. #
# ~77~ #
# .77. #
# !! #
# :: #
# .. #
# #
========================================================================================================================*/// SPDX-License-Identifier: LGPL-3.0-only
pragma solidity ^0.8.19;
import {DeployType} from "factory/enum/DeployType.sol";
import {ProxyType} from "factory/enum/ProxyType.sol";
import {CodeType} from "factory/enum/CodeType.sol";
interface IDestinyFactory {
event Deployed(address addr);
event Nonce(uint256 nonce);
event ValidatorChanged(address newValidator);
function verifyOwnership(address verifyContract,bytes memory verifyData ) external;
function deployAddr(DeployType deployType,ProxyType proxyType,bytes memory params,bytes32 salt,uint256 nonce) external view returns(address creator,address addr);
function deploy(DeployType deployType,ProxyType proxyType,address callbackAddr,bytes memory initData,bytes memory params) external payable returns(address addr);
function deployCode(ProxyType proxyType,CodeType codeType,bytes memory constructorParametersABI_Encoded) external pure returns(bytes memory code);
}// SPDX-License-Identifier: LGPL-3.0-only
pragma solidity ^0.8.19;
enum DeployType {
Create3,
Create2,
Create
}// SPDX-License-Identifier: LGPL-3.0-only
pragma solidity ^0.8.19;
enum ProxyType {
DestinyTempleV7ShadowProxy,
DestinyTempleV7BeaconProxy,
DestinyTempleV7DiamondProxy,
ERC1967UpgradeableBeacon,
ERC1967UpgradeableBeaconProxy,
ERC1967UniversalUpgradableProxy,
ERC1167MinimalProxy,
ERC7511MinimalProxy,
Contract
}// SPDX-License-Identifier: LGPL-3.0-only
pragma solidity ^0.8.19;
enum CodeType {
CreationCode,
RuntimeCode
}// SPDX-License-Identifier: LGPL-3.0-only
pragma solidity ^0.8.19;
library Lib_DestinyFactory {
//storage>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>
bytes32 internal constant STORAGE_SLOT_DESTINYFACTORY = bytes32(uint256(keccak256("STORAGE_SLOT_DESTINYFACTORY"))-7);
struct Storage_DestinyFactory {
uint256 nonce;
mapping(address => address) _verifyContract;
}
function storage_DestinyFactory() internal pure returns (Storage_DestinyFactory storage s) {
bytes32 solt = STORAGE_SLOT_DESTINYFACTORY;
assembly {
s.slot := solt
}
}
}// SPDX-License-Identifier: LGPL-3.0-only
pragma solidity ^0.8.19;
interface IOwnershipValidator {
function DESTINYTEMPLE_OWNERSHIP_STATE_CONTRACT_1() external view returns(address);
function DESTINYEXECUTOR_OWNERSHIP_STATE_CONTRACT_2() external view returns(address);
function OWNERSHIP_OWNERSHIP_STATE_CONTRACT_3() external view returns(address);
function verifyOwnership(bytes memory verifyData) external;
}// SPDX-License-Identifier: LGPL-3.0-only
pragma solidity ^0.8.19;
struct Module {
address addr;
bytes4[] selectors;
}// SPDX-License-Identifier: LGPL-3.0-only
/*
* @title Solidity Bytes Arrays Utils
* @author Gonçalo Sá <goncalo.sa@consensys.net>
*
* @dev Bytes tightly packed arrays utility library for ethereum contracts written in Solidity.
* The library lets you concatenate, slice and type cast bytes arrays both in memory and storage.
*/
pragma solidity ^0.8.19;
library BytesLib_3 {
function toAddress(bytes memory _bytes, uint256 _start) internal pure returns (address) {
require(_bytes.length >= _start + 20, "toAddress_outOfBounds");
address tempAddress;
assembly {
tempAddress := div(mload(add(add(_bytes, 0x20), _start)), 0x1000000000000000000000000)
}
return tempAddress;
}
}// SPDX-License-Identifier: LGPL-3.0-only
pragma solidity ^0.8.19;
contract DestinyTempleV7ShadowProxy {
constructor (address addr) payable {
assembly {
sstore(0x3418148758b1f9e91a7d35447272be5d6ae049a7e84e742f66587a44d93e29cb,addr)
sstore(0x3418148758b1f9e91a7d35447272be5d6ae049a7e84e742f66587a44d93e29cc,addr)
}
}
fallback() external payable {
assembly {
mstore(0x00,0x00)
calldatacopy(0x04,0x00,0x04)
pop(staticcall(gas(),sload(0x3418148758b1f9e91a7d35447272be5d6ae049a7e84e742f66587a44d93e29cb),0x00,0x24,0x08,0x20))
let addr := mload(0x08)
if iszero(addr) {
calldatacopy(0x00,0x00,0x04)
mstore(0x20,0xd337f855a71558e35b1ec3d991eab0dfca9dba8c925272bac802632b4e45f57b)
addr := sload(keccak256(0x00,0x40))
if iszero(addr) {
mstore(0x00,0x08c379a000000000000000000000000000000000000000000000000000000000)
mstore(0x04,0x0000000000000000000000000000000000000000000000000000000000000020)
mstore(0x24,0x000000000000000000000000000000000000000000000000000000000000001e)
mstore(0x44,0x44657374696e793a204d6f64756c6520343034206e6f7420666f756e64210000)
revert(0x00,0x64)
}
}
calldatacopy(0x00,0x00,calldatasize())
let r := delegatecall(gas(),addr,0x00,calldatasize(),0x00,0x00)
returndatacopy(0x00,0x00,returndatasize())
switch r
case 0x00 {
revert(0x00,returndatasize())
}
default {
return(0x00,returndatasize())
}
}
}
}// SPDX-License-Identifier: LGPL-3.0-only
pragma solidity ^0.8.19;
contract DestinyTempleV7BeaconProxy {
constructor (address addr) payable {
assembly {
sstore(0x3418148758b1f9e91a7d35447272be5d6ae049a7e84e742f66587a44d93e29cb,addr)
sstore(0x3418148758b1f9e91a7d35447272be5d6ae049a7e84e742f66587a44d93e29cc,address())
}
}
fallback() external payable {
assembly {
mstore(0x00,0x00)
calldatacopy(0x04,0x00,0x04)
pop(staticcall(gas(),sload(0x3418148758b1f9e91a7d35447272be5d6ae049a7e84e742f66587a44d93e29cb),0x00,0x24,0x08,0x20))
let addr := mload(0x08)
if iszero(addr) {
calldatacopy(0x00,0x00,0x04)
mstore(0x20,0xd337f855a71558e35b1ec3d991eab0dfca9dba8c925272bac802632b4e45f57b)
addr := sload(keccak256(0x00,0x40))
if iszero(addr) {
mstore(0x00,0x08c379a000000000000000000000000000000000000000000000000000000000)
mstore(0x04,0x0000000000000000000000000000000000000000000000000000000000000020)
mstore(0x24,0x000000000000000000000000000000000000000000000000000000000000001e)
mstore(0x44,0x44657374696e793a204d6f64756c6520343034206e6f7420666f756e64210000)
revert(0x00,0x64)
}
}
calldatacopy(0x00,0x00,calldatasize())
let r := delegatecall(gas(),addr,0x00,calldatasize(),0x00,0x00)
returndatacopy(0x00,0x00,returndatasize())
switch r
case 0x00 {
revert(0x00,returndatasize())
}
default {
return(0x00,returndatasize())
}
}
}
}// SPDX-License-Identifier: LGPL-3.0-only
pragma solidity ^0.8.19;
contract DestinyTempleV7DiamondProxy {
constructor(bytes memory mods) payable {
assembly {
for { let i := 0x00 } lt(i, mload(0xe0)) { i := add(i,0x01) } {
for { let j := 0x00 } lt(j, mload(add(0x140,mload(add(0x100,mul(0x20,i)))))) { j := add(j,0x01) } {
mstore(mload(0x40),mload(add(add(add(0x140,mload(add(0x100,mul(0x20,i)))),0x20),mul(j,0x20))))
mstore(add(mload(0x40),0x20), 0xd337f855a71558e35b1ec3d991eab0dfca9dba8c925272bac802632b4e45f57b)
sstore(keccak256(mload(0x40),0x40),mload(add(0x100,mload(add(0x100,mul(0x20,i))))))
}
}
sstore(0x3418148758b1f9e91a7d35447272be5d6ae049a7e84e742f66587a44d93e29cb,address())
sstore(0x3418148758b1f9e91a7d35447272be5d6ae049a7e84e742f66587a44d93e29cc,address())
}
}
fallback() external payable {
assembly {
calldatacopy(0x00,0x00,0x04)
mstore(0x20,0xd337f855a71558e35b1ec3d991eab0dfca9dba8c925272bac802632b4e45f57b)
let addr := sload(keccak256(0x00,0x40))
if iszero(addr) {
mstore(0x00,0x08c379a000000000000000000000000000000000000000000000000000000000)
mstore(0x04,0x0000000000000000000000000000000000000000000000000000000000000020)
mstore(0x24,0x000000000000000000000000000000000000000000000000000000000000001e)
mstore(0x44,0x44657374696e793a204d6f64756c6520343034206e6f7420666f756e64210000)
revert(0x00,0x64)
}
calldatacopy(0x00,0x00,calldatasize())
let r := delegatecall(gas(),addr,0x00,calldatasize(),0x00,0x00)
returndatacopy(0x00,0x00,returndatasize())
switch r
case 0x00 {
revert(0x00,returndatasize())
}
default {
return(0x00,returndatasize())
}
}
}
receive() external payable {}
}// SPDX-License-Identifier: LGPL-3.0-only
pragma solidity ^0.8.19;
contract ERC1967UpgradeableBeacon {
event AdminChanged(address previousAdmin, address newAdmin);
event Upgraded(address indexed implementation);
constructor(address admin, address implementedAddr) payable {
assembly {
sstore(0xb53127684a568b3173ae13b9f8a6016e243e63b6e8ee1178d6a717850b5d6103,admin)
sstore(0x360894a13ba1a3210667c828492db98dca3e2076cc3735a920a3ca505d382bbc,implementedAddr)
}
}
function upgrade(address newImplementedAddr) external {
assembly {
if iszero(eq(caller(),sload(0xb53127684a568b3173ae13b9f8a6016e243e63b6e8ee1178d6a717850b5d6103))) {
revert(0x00, 0x00)
}
sstore(0x360894a13ba1a3210667c828492db98dca3e2076cc3735a920a3ca505d382bbc, newImplementedAddr)
}
emit Upgraded(newImplementedAddr);
}
function setAdmin(address newAdmin) external {
address oldAdmin;
assembly {
oldAdmin := sload(0xb53127684a568b3173ae13b9f8a6016e243e63b6e8ee1178d6a717850b5d6103)
if iszero(eq(caller(),oldAdmin)) {
revert(0x00, 0x00)
}
sstore(0xb53127684a568b3173ae13b9f8a6016e243e63b6e8ee1178d6a717850b5d6103, newAdmin)
}
emit AdminChanged(oldAdmin,newAdmin);
}
function implementation() external view returns(address) {
assembly {
mstore(0x00,sload(0x360894a13ba1a3210667c828492db98dca3e2076cc3735a920a3ca505d382bbc))
return(0x00, 0x20)
}
}
}// SPDX-License-Identifier: LGPL-3.0-only
pragma solidity ^0.8.19;
contract ERC1967UpgradeableBeaconProxy {
event AdminChanged(address previousAdmin, address newAdmin);
event BeaconUpgraded(address indexed beacon);
constructor(address admin,address upgradeableBeaconAddr) payable {
assembly {
sstore(0xb53127684a568b3173ae13b9f8a6016e243e63b6e8ee1178d6a717850b5d6103,admin)
sstore(0xa3f0ad74e5423aebfd80d3ef4346578335a9a72aeaee59ff6cb3582b35133d50,upgradeableBeaconAddr)
}
}
function upgrade(address newBeacon) external {
assembly {
if iszero(eq(caller(),sload(0xb53127684a568b3173ae13b9f8a6016e243e63b6e8ee1178d6a717850b5d6103))) {
revert(0x00, 0x00)
}
sstore(0xa3f0ad74e5423aebfd80d3ef4346578335a9a72aeaee59ff6cb3582b35133d50, newBeacon)
}
emit BeaconUpgraded(newBeacon);
}
function setAdmin(address newAdmin) external {
address oldAdmin;
assembly {
oldAdmin := sload(0xb53127684a568b3173ae13b9f8a6016e243e63b6e8ee1178d6a717850b5d6103)
if iszero(eq(caller(),oldAdmin)) {
revert(0x00, 0x00)
}
sstore(0xb53127684a568b3173ae13b9f8a6016e243e63b6e8ee1178d6a717850b5d6103, newAdmin)
}
emit AdminChanged(oldAdmin,newAdmin);
}
fallback() external payable {
assembly {
mstore(0x00,0x5c60da1b)
let implementedAddr := staticcall(gas(),sload(0xa3f0ad74e5423aebfd80d3ef4346578335a9a72aeaee59ff6cb3582b35133d50),0x00,0x04,0x00,0x00)
calldatacopy(0x00, 0x00, calldatasize())
let result := delegatecall(gas(),implementedAddr,0x00,calldatasize(),0x00,0x00)
returndatacopy(0x00, 0x00, returndatasize())
switch result
case 0x00 {
revert(0x00, returndatasize())
}
default {
return(0x00, returndatasize())
}
}
}
}// SPDX-License-Identifier: LGPL-3.0-only
pragma solidity ^0.8.19;
contract ERC1967UniversalUpgradableProxy {
constructor(address implementedAddr) payable {
assembly{
sstore(0x360894a13ba1a3210667c828492db98dca3e2076cc3735a920a3ca505d382bbc,implementedAddr)
}
}
fallback() external payable {
assembly {
calldatacopy(0x00,0x00,calldatasize())
let r := delegatecall(gas(),sload(0x360894a13ba1a3210667c828492db98dca3e2076cc3735a920a3ca505d382bbc),0x00,calldatasize(),0x00,0x00)
returndatacopy(0x00,0x00,returndatasize())
switch r
case 0x00 {
revert(0x00,returndatasize())
}
default {
return(0x00,returndatasize())
}
}
}
}{
"remappings": [
"ds-test/=lib/forge-std/lib/ds-test/src/",
"forge-std/=lib/forge-std/src/",
"interfaces/=src/interfaces/",
"libraries/=src/libraries/",
"constant/=src/constant/",
"enum/=src/enum/",
"struct/=src/struct/",
"freeFunctions/=src/freeFunctions/",
"ownershipState/=src/ownershipState/",
"ownership/=src/ownershipState/ownership/",
"DestinyExecutor/=src/tokens/DestinyExecutor/",
"modules/=src/modules/",
"Integrated_2/=src/modules/Integrated_2/",
"ECDSA_2/=src/modules/Integrated_2/ECDSA_2/",
"Reserve_2/=src/modules/Integrated_2/Reserve_2/",
"GenesisIntegrated/=src/modules/GenesisIntegrated/",
"Initialize/=src/modules/Initialize/",
"Disable/=src/modules/GenesisIntegrated/Disable/",
"Dissociate/=src/modules/GenesisIntegrated/Dissociate/",
"ECDSA/=src/modules/GenesisIntegrated/ECDSA/",
"ERC712/=src/modules/GenesisIntegrated/ERC712/",
"Fallback/=src/modules/GenesisIntegrated/Fallback/",
"ERC1271/=src/modules/GenesisIntegrated/Fallback/ERC1271/",
"Receiver/=src/modules/GenesisIntegrated/Fallback/Receiver/",
"FlashLoan/=src/modules/GenesisIntegrated/Fallback/FlashLoan/",
"GuardManager/=src/modules/GenesisIntegrated/GuardManager/",
"ModuleManager/=src/modules/GenesisIntegrated/ModuleManager/",
"Permit/=src/modules/GenesisIntegrated/Permit/",
"Reserve/=src/modules/GenesisIntegrated/Reserve/",
"StorageAccessible/=src/modules/GenesisIntegrated/StorageAccessible/",
"Twitter/=src/modules/GenesisIntegrated/Twitter/",
"guards/=src/guards/",
"PraetorianGuard/=src/guards/PraetorianGuard/",
"TimeLockGuard/=src/guards/TimeLockGuard/",
"DissociateGuard/=src/guards/DissociateGuard/",
"permit/=src/permit/",
"tokens/=src/tokens/",
"proxies/=src/proxies/",
"factory/=src/factory/",
"test_DestinyFactory/=test/test_DestinyFactory/",
"test_guards/=test/test_guards/",
"test_modules/=test/test_modules/",
"test_proxies/=test/test_proxies/",
"test_tokens/=test/test_tokens/",
"test_utils/=test/test_utils/"
],
"optimizer": {
"enabled": true,
"runs": 200
},
"metadata": {
"useLiteralContent": false,
"bytecodeHash": "ipfs",
"appendCBOR": true
},
"outputSelection": {
"*": {
"*": [
"evm.bytecode",
"evm.deployedBytecode",
"devdoc",
"userdoc",
"metadata",
"abi"
]
}
},
"evmVersion": "cancun",
"viaIR": false,
"libraries": {}
}Contract Security Audit
- No Contract Security Audit Submitted- Submit Audit Here
Contract ABI
API[{"inputs":[],"stateMutability":"payable","type":"constructor"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"address","name":"addr","type":"address"}],"name":"Deployed","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"uint256","name":"nonce","type":"uint256"}],"name":"Nonce","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"address","name":"newValidator","type":"address"}],"name":"ValidatorChanged","type":"event"},{"inputs":[{"internalType":"enum DeployType","name":"deployType","type":"uint8"},{"internalType":"enum ProxyType","name":"proxyType","type":"uint8"},{"internalType":"address","name":"callbackAddr","type":"address"},{"internalType":"bytes","name":"initData","type":"bytes"},{"internalType":"bytes","name":"params","type":"bytes"}],"name":"deploy","outputs":[{"internalType":"address","name":"addr","type":"address"}],"stateMutability":"payable","type":"function"},{"inputs":[{"internalType":"enum DeployType","name":"deployType","type":"uint8"},{"internalType":"enum ProxyType","name":"proxyType","type":"uint8"},{"internalType":"bytes","name":"params","type":"bytes"},{"internalType":"bytes32","name":"salt","type":"bytes32"},{"internalType":"uint256","name":"nonce","type":"uint256"}],"name":"deployAddr","outputs":[{"internalType":"address","name":"creator","type":"address"},{"internalType":"address","name":"addr","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"enum ProxyType","name":"proxyType","type":"uint8"},{"internalType":"enum CodeType","name":"codeType","type":"uint8"},{"internalType":"bytes","name":"constructorParametersABI_Encoded","type":"bytes"}],"name":"deployCode","outputs":[{"internalType":"bytes","name":"code","type":"bytes"}],"stateMutability":"pure","type":"function"},{"inputs":[{"internalType":"address","name":"verifyContract","type":"address"},{"internalType":"bytes","name":"verifyData","type":"bytes"}],"name":"verifyOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"}]Contract Creation Code
60806040526001600c6011565b556060565b5f80603c60077f8fc89b1793e5d3153375a09940e56c9a1019f9ef47f9952fbe41180570601c386042565b92915050565b81810381811115603c57634e487b7160e01b5f52601160045260245ffd5b613c958061006d5f395ff3fe60806040526004361061003e575f3560e01c80633b714a0a14610042578063ade34be514610063578063d65652d514610098578063eb10f3ca146100d7575b5f80fd5b34801561004d575f80fd5b5061006161005c366004611ef3565b610102565b005b34801561006e575f80fd5b5061008261007d366004611f52565b610295565b60405161008f9190611fde565b60405180910390f35b3480156100a3575f80fd5b506100b76100b2366004611ffe565b6105f2565b604080516001600160a01b0393841681529290911660208301520161008f565b6100ea6100e5366004612068565b610778565b6040516001600160a01b03909116815260200161008f565b5f61010b610cdc565b335f90815260019190910160205260409020546001600160a01b031690508015801561013f57506001600160a01b03831615155b156101475750815b6001600160a01b03811615610290575f80826001600160a01b0316846040516024016101739190611fde565b60408051601f198184030181529181526020820180516001600160e01b0316637dfc7b0360e11b179052516101a89190612110565b5f604051808303815f865af19150503d805f81146101e1576040519150601f19603f3d011682016040523d82523d5f602084013e6101e6565b606091505b5091509150816102115760405162461bcd60e51b81526004016102089061211b565b60405180910390fd5b6001600160a01b038516301461028d578461022a610cdc565b335f908152600191909101602090815260409182902080546001600160a01b0319166001600160a01b03948516179055905191871682527f0d3a3dda2c3164bbc4898485ffa0b984c414d664538d3b99df23202077f72c9b910160405180910390a15b50505b505050565b60605f8460088111156102aa576102aa612161565b146105805760018460088111156102c3576102c3612161565b146105265760028460088111156102dc576102dc612161565b146104f05760038460088111156102f5576102f5612161565b146104ba57600484600881111561030e5761030e612161565b1461048457600584600881111561032757610327612161565b146103e157600684600881111561034057610340612161565b146103a557600784600881111561035957610359612161565b1461036457816105ea565b5f83600181111561037757610377612161565b146103935761038e610389835f610d0f565b610d73565b6105ea565b61038e6103a0835f610d0f565b610dcf565b5f8360018111156103b8576103b8612161565b146103cf5761038e6103ca835f610d0f565b610e2b565b61038e6103dc835f610d0f565b610e76565b5f8360018111156103f4576103f4612161565b146104205760405161040860208201611d5f565b601f1982820381018352601f909101166040526105ea565b60405161042f60208201611d6b565b601f1982820381018352601f909101166040819052610452908490602001611fde565b60408051601f19818403018152908290526104709291602001612175565b6040516020818303038152906040526105ea565b5f83600181111561049757610497612161565b146104ab5760405161040860208201611d77565b60405161042f60208201611d84565b5f8360018111156104cd576104cd612161565b146104e15760405161040860208201611d91565b60405161042f60208201611d9e565b5f83600181111561050357610503612161565b146105175760405161040860208201611dab565b60405161042f60208201611db7565b5f83600181111561053957610539612161565b1461054d5760405161040860208201611dc4565b60405161055c60208201611dd1565b601f1982820381018352601f90910116604081905261047091908490602001612175565b5f83600181111561059357610593612161565b146105a75760405161040860208201611dde565b6040516105b660208201611deb565b601f1982820381018352601f9091011660408190526105da91908490602001612175565b6040516020818303038152906040525b949350505050565b5f808087600281111561060757610607612161565b1461076157600287600281111561062057610620612161565b14610742575f86600881111561063857610638612161565b1461073957600186600881111561065157610651612161565b1461073057600286600881111561066a5761066a612161565b1461072757600386600881111561068357610683612161565b1461071e57600486600881111561069c5761069c612161565b146107155760058660088111156106b5576106b5612161565b1461070c5760068660088111156106ce576106ce612161565b146107035760078660088111156106e7576106e7612161565b146106fa576106f585610ed4565b61076a565b6106f585610f06565b6106f585610f34565b6106f585610f5d565b6106f585610fe5565b6106f585611058565b6106f58561108b565b6106f5856110fb565b6106f58561112b565b6106f5305f851161075b57610755610cdc565b5461115b565b8461115b565b61076a846111ca565b909890975095505050505050565b5f8086600281111561078c5761078c612161565b146109df5760018660028111156107a5576107a5612161565b146108c7575f8560088111156107bd576107bd612161565b146108be5760018560088111156107d6576107d6612161565b146108b55760028560088111156107ef576107ef612161565b146108ac57600385600881111561080857610808612161565b146108a357600485600881111561082157610821612161565b1461089a57600585600881111561083a5761083a612161565b1461089157600685600881111561085357610853612161565b1461088857600785600881111561086c5761086c612161565b1461087f5761087a82611206565b610aee565b61087a82611210565b61087a82611240565b61087a82611264565b61087a826112e7565b61087a82611348565b61087a82611376565b61087a826113e1565b61087a8261140c565b5f8560088111156108da576108da612161565b146109d65760018560088111156108f3576108f3612161565b146109cd57600285600881111561090c5761090c612161565b146109c457600385600881111561092557610925612161565b146109bb57600485600881111561093e5761093e612161565b146109b257600585600881111561095757610957612161565b146109a957600685600881111561097057610970612161565b146109a057600785600881111561098957610989612161565b146109975761087a82611437565b61087a8261145c565b61087a82611489565b61087a826114b1565b61087a82611538565b61087a826115a6565b61087a826115d8565b61087a82611647565b61087a82611676565b5f8560088111156109f2576109f2612161565b14610ae5576001856008811115610a0b57610a0b612161565b14610adc576002856008811115610a2457610a24612161565b14610ad3576003856008811115610a3d57610a3d612161565b14610aca576004856008811115610a5657610a56612161565b14610aca576005856008811115610a6f57610a6f612161565b14610ac1576006856008811115610a8857610a88612161565b14610ab8576007856008811115610aa157610aa1612161565b14610aaf5761087a826116a5565b61087a826116dc565b61087a82611730565b61087a82611760565b61087a826117db565b61087a82611853565b61087a826118ca565b610aee82611901565b9050806001600160a01b03163b5f03610b495760405162461bcd60e51b815260206004820152601d60248201527f44657374696e79466163746f72793a6465706c6f79206661696c6564210000006044820152606401610208565b610b538184611938565b506001600160a01b03841615610c4d575f846001600160a01b03168288888787604051602401610b87959493929190612189565b60408051601f198184030181529181526020820180516001600160e01b031663022d35b760e31b17905251610bbc9190612110565b5f604051808303815f865af19150503d805f8114610bf5576040519150601f19603f3d011682016040523d82523d5f602084013e610bfa565b606091505b5050905080610c4b5760405162461bcd60e51b815260206004820152601f60248201527f44657374696e79466163746f72793a63616c6c6261636b206661696c656421006044820152606401610208565b505b6040516001600160a01b03821681527ff40fcec21964ffb566044d083b4073f29f7f7929110ea19e1b3ebe375d89055e9060200160405180910390a17fe335c04c904a95df658ab3e6bb90e9f8f42b8d7b0dd1c5ec3c3000eff7562bc3610cb2610cdc565b5460405190815260200160405180910390a1610ccc610cdc565b8054600101905595945050505050565b5f80610d0960077f8fc89b1793e5d3153375a09940e56c9a1019f9ef47f9952fbe41180570601c38612208565b92915050565b5f610d1b82601461221b565b83511015610d635760405162461bcd60e51b8152602060048201526015602482015274746f416464726573735f6f75744f66426f756e647360581b6044820152606401610208565b500160200151600160601b900490565b60405168365f5f375f5f365f7360b81b6020820152606082811b6001600160601b03191660298301526e5af43d5f5f3e5f3d91602a57fd5bf360881b603d83015290604c015b6040516020818303038152906040529050919050565b60405168602c8060095f395ff360b81b602082015268365f5f375f5f365f7360b81b6029820152606082811b6001600160601b03191660328301526e5af43d5f5f3e5f3d91602a57fd5bf360881b604683015290605501610db9565b60405169363d3d373d3d3d363d7360b01b6020820152606082811b6001600160601b031916602a8301526e5af43d82803e903d91602b57fd5bf360881b603e83015290604d01610db9565b604051693d602d80600a3d3981f360b01b602082015269363d3d373d3d3d363d7360b01b602a820152606082811b6001600160601b03191660348301526e5af43d82803e903d91602b57fd5bf360881b604883015290605701610db9565b5f805f8084806020019051810190610eec919061227b565b91509150610efa82826119f2565b90969095509350505050565b5f805f8084806020019051810190610f1e91906122b4565b91509150610efa82610f2f83610dcf565b6119f2565b5f805f8084806020019051810190610f4c91906122b4565b91509150610efa82610f2f83610e76565b5f805f8084806020019051810190610f7591906122b4565b91509150610efa8260405180602001610f8d90611d6b565b601f1982820381018352601f9091011660408181526001600160a01b0386166020830152015b60408051601f1981840301815290829052610fd19291602001612175565b6040516020818303038152906040526119f2565b5f805f805f85806020019051810190610ffe91906122e2565b92509250925061104b836040518060200161101890611d84565b601f1982820381018352601f9091011660408181526001600160a01b038781166020840152861690820152606001610fb3565b9097909650945050505050565b5f805f805f8580602001905181019061107191906122e2565b92509250925061104b836040518060200161101890611d9e565b5f805f80848060200190518101906110a3919061247b565b91509150610efa82604051806020016110bb90611db7565b601f1982820381018352601f9091011660408190526110de9085906020016124b4565b60408051601f1981840301815290829052610fb391602001611fde565b5f805f808480602001905181019061111391906122b4565b91509150610efa8260405180602001610f8d90611dd1565b5f805f808480602001905181019061114391906122b4565b91509150610efa8260405180602001610f8d90611deb565b815f607f831161118757835f526094600b5360d6600a5382831560071b17602053506017600a206111c3565b60085b83811c1561119a5760080161118a565b60031c838152600885901b5f5260808101601f536094600a538060d60160095360170160092090505b9250929050565b5f806111ee83604051806060016040528060348152602001613c2c603491396119f2565b92506111fd905082600161115b565b92949293505050565b5f610d0982611a49565b5f80828060200190518101906112269190612565565b905061123961123482610dcf565b611a49565b9392505050565b5f80828060200190518101906112569190612565565b905061123961123482610e76565b5f808280602001905181019061127a9190612565565b90506112396040518060200161128f90611d6b565b601f1982820381018352601f9091011660408181526001600160a01b0385166020830152015b60408051601f19818403018152908290526112d39291602001612175565b604051602081830303815290604052611a49565b5f805f838060200190518101906112fe9190612580565b915091506105ea6040518060200161131590611d84565b601f1982820381018352601f9091011660408181526001600160a01b0386811660208401528516908201526060016112b5565b5f805f8380602001905181019061135f9190612580565b915091506105ea6040518060200161131590611d9e565b5f808280602001905181019061138c91906125ad565b9050611239604051806020016113a190611db7565b601f1982820381018352601f9091011660408190526113c49084906020016124b4565b60408051601f19818403018152908290526112b591602001611fde565b5f80828060200190518101906113f79190612565565b90506112396040518060200161128f90611dd1565b5f80828060200190518101906114229190612565565b90506112396040518060200161128f90611deb565b5f805f8380602001905181019061144e919061227b565b915091506105ea8282611a58565b5f805f8380602001905181019061147391906122b4565b915091506105ea8261148483610dcf565b611a58565b5f805f838060200190518101906114a091906122b4565b915091506105ea8261148483610e76565b5f805f838060200190518101906114c891906122b4565b915091506105ea82604051806020016114e090611d6b565b601f1982820381018352601f9091011660408181526001600160a01b0386166020830152015b60408051601f19818403018152908290526115249291602001612175565b604051602081830303815290604052611a58565b5f805f808480602001905181019061155091906122e2565b92509250925061159d836040518060200161156a90611d84565b601f1982820381018352601f9091011660408181526001600160a01b038781166020840152861690820152606001611506565b95945050505050565b5f805f80848060200190518101906115be91906122e2565b92509250925061159d836040518060200161156a90611d9e565b5f805f838060200190518101906115ef919061247b565b915091506105ea826040518060200161160790611db7565b601f1982820381018352601f90910116604081905261162a9085906020016124b4565b60408051601f198184030181529082905261150691602001611fde565b5f805f8380602001905181019061165e91906122b4565b915091506105ea82604051806020016114e090611dd1565b5f805f8380602001905181019061168d91906122b4565b915091506105ea82604051806020016114e090611deb565b5f805f805f858060200190518101906116be91906125de565b93509350935093506116d284848484611ad9565b9695505050505050565b5f805f805f858060200190518101906116f59190612659565b93509350935093506116d284848461170c85610dcf565b60405160200161171c9190612110565b604051602081830303815290604052611ad9565b5f805f805f858060200190518101906117499190612659565b93509350935093506116d284848461170c85610e76565b5f805f805f858060200190518101906117799190612659565b93509350935093506116d28484846040518060200161179790611d6b565b601f1982820381018352601f9091011660408181526001600160a01b0388166020830152015b60408051601f198184030181529082905261171c9291602001612175565b5f805f805f80868060200190518101906117f591906126c1565b945094509450945094506118488585856040518060200161181590611d9e565b601f1982820381018352601f9091011660408181526001600160a01b0389811660208401528816908201526060016117bd565b979650505050505050565b5f805f805f8580602001905181019061186c919061273e565b93509350935093506116d28484846040518060200161188a90611db7565b601f1982820381018352601f9091011660408190526118ad9087906020016124b4565b60408051601f19818403018152908290526117bd91602001611fde565b5f805f805f858060200190518101906118e39190612659565b93509350935093506116d28484846040518060200161179790611dd1565b5f805f805f8580602001905181019061191a9190612659565b93509350935093506116d28484846040518060200161179790611deb565b80515f90156119eb575f836001600160a01b03168360405161195a9190612110565b5f604051808303815f865af19150503d805f8114611993576040519150601f19603f3d011682016040523d82523d5f602084013e611998565b606091505b50509050806119e95760405162461bcd60e51b815260206004820152601860248201527f44657374696e79466163746f72793a696e6974206661696c00000000000000006044820152606401610208565b505b5090919050565b8051602091820120604080516001600160f81b03198185015230606081901b6001600160601b0319166021830152603582019590955260558082019390935281518082039093018352607501905280519101209091565b5f81516020830134f092915050565b5f8282516020840134f59050604051806060016040528060348152602001613c2c6034913980519060200120828051906020012003610d095760405162461bcd60e51b815260206004820152601f60248201527f44697361626c652063726561746532206465706c6f792063726561746f7221006044820152606401610208565b5f80604051806060016040528060348152602001613c2c6034913990505f611b0187836119f2565b9150506001600160a01b0381163b15611b5c5760405162461bcd60e51b815260206004820181905260248201527f44657374696e79466163746f72793a63726561746f72206465706c6f796564216044820152606401610208565b5f8783516020850134f59050611b7381600161115b565b94505f9050611b80610cdc565b6001600160a01b038087165f9081526001830160205260409020549192501680158015611bb557506001600160a01b03891615155b15611bbd5750875b6001600160a01b03811615611cbb575f80826001600160a01b03168a604051602401611be99190611fde565b60408051601f198184030181529181526020820180516001600160e01b0316637dfc7b0360e11b17905251611c1e9190612110565b5f604051808303815f865af19150503d805f8114611c57576040519150601f19603f3d011682016040523d82523d5f602084013e611c5c565b606091505b509150915081611c7e5760405162461bcd60e51b81526004016102089061211b565b6001600160a01b038b163014611cb857335f908152600185016020526040902080546001600160a01b0319166001600160a01b038d161790555b50505b826001600160a01b03163488604051611cd49190612110565b5f6040518083038185875af1925050503d805f8114611d0e576040519150601f19603f3d011682016040523d82523d5f602084013e611d13565b606091505b50506040516001600160a01b03851681527ff40fcec21964ffb566044d083b4073f29f7f7929110ea19e1b3ebe375d89055e915060200160405180910390a15050505050949350505050565b6078806127ae83390190565b60f58061282683390190565b6102398061291b83390190565b6102f780612b5483390190565b61023a80612e4b83390190565b6102f88061308583390190565b60cd8061337d83390190565b61028f8061344a83390190565b610104806136d983390190565b6101a5806137dd83390190565b6101048061398283390190565b6101a680613a8683390190565b6001600160a01b0381168114611e0c575f80fd5b50565b634e487b7160e01b5f52604160045260245ffd5b604080519081016001600160401b0381118282101715611e4557611e45611e0f565b60405290565b604051601f8201601f191681016001600160401b0381118282101715611e7357611e73611e0f565b604052919050565b5f6001600160401b03821115611e9357611e93611e0f565b50601f01601f191660200190565b5f82601f830112611eb0575f80fd5b8135611ec3611ebe82611e7b565b611e4b565b818152846020838601011115611ed7575f80fd5b816020850160208301375f918101602001919091529392505050565b5f8060408385031215611f04575f80fd5b8235611f0f81611df8565b915060208301356001600160401b03811115611f29575f80fd5b611f3585828601611ea1565b9150509250929050565b803560098110611f4d575f80fd5b919050565b5f805f60608486031215611f64575f80fd5b611f6d84611f3f565b9250602084013560028110611f80575f80fd5b915060408401356001600160401b03811115611f9a575f80fd5b611fa686828701611ea1565b9150509250925092565b5f81518084528060208401602086015e5f602082860101526020601f19601f83011685010191505092915050565b602081525f6112396020830184611fb0565b803560038110611f4d575f80fd5b5f805f805f60a08688031215612012575f80fd5b61201b86611ff0565b945061202960208701611f3f565b935060408601356001600160401b03811115612043575f80fd5b61204f88828901611ea1565b9598949750949560608101359550608001359392505050565b5f805f805f60a0868803121561207c575f80fd5b61208586611ff0565b945061209360208701611f3f565b935060408601356120a381611df8565b925060608601356001600160401b03808211156120be575f80fd5b6120ca89838a01611ea1565b935060808801359150808211156120df575f80fd5b506120ec88828901611ea1565b9150509295509295909350565b5f81518060208401855e5f93019283525090919050565b5f61123982846120f9565b60208082526026908201527f44657374696e79466163746f72793a7665726966794f776e657273686970204660408201526561696c65642160d01b606082015260800190565b634e487b7160e01b5f52602160045260245ffd5b5f6105ea61218383866120f9565b846120f9565b6001600160a01b03861681525f600386106121a6576121a6612161565b856020830152600985106121bc576121bc612161565b84604083015260a060608301526121d660a0830185611fb0565b82810360808401526121e88185611fb0565b98975050505050505050565b634e487b7160e01b5f52601160045260245ffd5b81810381811115610d0957610d096121f4565b80820180821115610d0957610d096121f4565b5f82601f83011261223d575f80fd5b815161224b611ebe82611e7b565b81815284602083860101111561225f575f80fd5b8160208501602083015e5f918101602001919091529392505050565b5f806040838503121561228c575f80fd5b8251915060208301516001600160401b038111156122a8575f80fd5b611f358582860161222e565b5f80604083850312156122c5575f80fd5b8251915060208301516122d781611df8565b809150509250929050565b5f805f606084860312156122f4575f80fd5b83519250602084015161230681611df8565b604085015190925061231781611df8565b809150509250925092565b5f6001600160401b0382111561233a5761233a611e0f565b5060051b60200190565b5f82601f830112612353575f80fd5b81516020612363611ebe83612322565b828152600592831b8501820192828201919087851115612381575f80fd5b8387015b8581101561246e5780516001600160401b03808211156123a3575f80fd5b908901906040828c03601f19018113156123bb575f80fd5b6123c3611e23565b888401516123d081611df8565b815283820151838111156123e2575f80fd5b8085019450508c603f8501126123f6575f80fd5b888401519250612408611ebe84612322565b83815292861b8401820192898101908e851115612423575f80fd5b948301945b8486101561245957855193506001600160e01b031984168414612449575f80fd5b838252948a0194908a0190612428565b828b0152508752505050928401928401612385565b5090979650505050505050565b5f806040838503121561248c575f80fd5b8251915060208301516001600160401b038111156124a8575f80fd5b611f3585828601612344565b5f60208083018184528085518083526040925060408601915060408160051b8701018488015f5b8381101561255757888303603f19018552815180516001600160a01b031684528701518784018790528051878501819052908801905f9060608601905b808310156125425783516001600160e01b0319168252928a019260019290920191908a0190612518565b509689019694505050908601906001016124db565b509098975050505050505050565b5f60208284031215612575575f80fd5b815161123981611df8565b5f8060408385031215612591575f80fd5b825161259c81611df8565b60208401519092506122d781611df8565b5f602082840312156125bd575f80fd5b81516001600160401b038111156125d2575f80fd5b6105ea84828501612344565b5f805f80608085870312156125f1575f80fd5b84519350602085015161260381611df8565b60408601519093506001600160401b038082111561261f575f80fd5b61262b8883890161222e565b93506060870151915080821115612640575f80fd5b5061264d8782880161222e565b91505092959194509250565b5f805f806080858703121561266c575f80fd5b84519350602085015161267e81611df8565b60408601519093506001600160401b03811115612699575f80fd5b6126a58782880161222e565b92505060608501516126b681611df8565b939692955090935050565b5f805f805f60a086880312156126d5575f80fd5b8551945060208601516126e781611df8565b60408701519094506001600160401b03811115612702575f80fd5b61270e8882890161222e565b935050606086015161271f81611df8565b608087015190925061273081611df8565b809150509295509295909350565b5f805f8060808587031215612751575f80fd5b84519350602085015161276381611df8565b60408601519093506001600160401b038082111561277f575f80fd5b61278b8883890161222e565b935060608701519150808211156127a0575f80fd5b5061264d8782880161234456fe6080604052365f80375f80365f7f360894a13ba1a3210667c828492db98dca3e2076cc3735a920a3ca505d382bbc545af43d5f803e808015603e573d5ff35b3d5ffdfea26469706673582212203865e7b18a71a3eb7a449ca94cb0b27eb52e26caaa068aad34930d717910a80564736f6c6343000819003360806040526040516100f53803806100f58339810160408190526020916046565b7f360894a13ba1a3210667c828492db98dca3e2076cc3735a920a3ca505d382bbc556071565b5f602082840312156055575f80fd5b81516001600160a01b0381168114606a575f80fd5b9392505050565b60788061007d5f395ff3fe6080604052365f80375f80365f7f360894a13ba1a3210667c828492db98dca3e2076cc3735a920a3ca505d382bbc545af43d5f803e808015603e573d5ff35b3d5ffdfea26469706673582212203865e7b18a71a3eb7a449ca94cb0b27eb52e26caaa068aad34930d717910a80564736f6c63430008190033608060405260043610610028575f3560e01c80630900f0101461007a578063704b6c0214610099575b635c60da1b5f525f8060045f7fa3f0ad74e5423aebfd80d3ef4346578335a9a72aeaee59ff6cb3582b35133d50545afa365f80375f80365f845af490503d5f803e808015610074573d5ff35b3d5ffd5b005b348015610085575f80fd5b506100786100943660046101d6565b6100b8565b3480156100a4575f80fd5b506100786100b33660046101d6565b61013e565b7fb53127684a568b3173ae13b9f8a6016e243e63b6e8ee1178d6a717850b5d61035433146100e4575f80fd5b7fa3f0ad74e5423aebfd80d3ef4346578335a9a72aeaee59ff6cb3582b35133d508190556040516001600160a01b038216907f1cf3b03a6cf19fa2baba4df148e9dcabedea7f8a5c07840e207e5c089be95d3e905f90a250565b7fb53127684a568b3173ae13b9f8a6016e243e63b6e8ee1178d6a717850b5d61035433811461016b575f80fd5b7fb53127684a568b3173ae13b9f8a6016e243e63b6e8ee1178d6a717850b5d6103829055604080516001600160a01b038084168252841660208201527f7e644d79422f17c01e4894b5f4f588d331ebfa28653d42ae832dc59e38c9798f910160405180910390a15050565b5f602082840312156101e6575f80fd5b81356001600160a01b03811681146101fc575f80fd5b939250505056fea2646970667358221220d1a00185ea5353a0df281429b9539e3e097cfaa88624d3e2867d1600498e4dff64736f6c6343000819003360806040526040516102f73803806102f78339810160408190526020916085565b7fb53127684a568b3173ae13b9f8a6016e243e63b6e8ee1178d6a717850b5d6103919091557fa3f0ad74e5423aebfd80d3ef4346578335a9a72aeaee59ff6cb3582b35133d505560b1565b80516001600160a01b03811681146080575f80fd5b919050565b5f80604083850312156095575f80fd5b609c83606b565b915060a860208401606b565b90509250929050565b610239806100be5f395ff3fe608060405260043610610028575f3560e01c80630900f0101461007a578063704b6c0214610099575b635c60da1b5f525f8060045f7fa3f0ad74e5423aebfd80d3ef4346578335a9a72aeaee59ff6cb3582b35133d50545afa365f80375f80365f845af490503d5f803e808015610074573d5ff35b3d5ffd5b005b348015610085575f80fd5b506100786100943660046101d6565b6100b8565b3480156100a4575f80fd5b506100786100b33660046101d6565b61013e565b7fb53127684a568b3173ae13b9f8a6016e243e63b6e8ee1178d6a717850b5d61035433146100e4575f80fd5b7fa3f0ad74e5423aebfd80d3ef4346578335a9a72aeaee59ff6cb3582b35133d508190556040516001600160a01b038216907f1cf3b03a6cf19fa2baba4df148e9dcabedea7f8a5c07840e207e5c089be95d3e905f90a250565b7fb53127684a568b3173ae13b9f8a6016e243e63b6e8ee1178d6a717850b5d61035433811461016b575f80fd5b7fb53127684a568b3173ae13b9f8a6016e243e63b6e8ee1178d6a717850b5d6103829055604080516001600160a01b038084168252841660208201527f7e644d79422f17c01e4894b5f4f588d331ebfa28653d42ae832dc59e38c9798f910160405180910390a15050565b5f602082840312156101e6575f80fd5b81356001600160a01b03811681146101fc575f80fd5b939250505056fea2646970667358221220d1a00185ea5353a0df281429b9539e3e097cfaa88624d3e2867d1600498e4dff64736f6c63430008190033608060405234801561000f575f80fd5b506004361061003f575f3560e01c80630900f010146100435780635c60da1b14610058578063704b6c021461007c575b5f80fd5b6100566100513660046101d7565b61008f565b005b610060610115565b6040516001600160a01b03909116815260200160405180910390f35b61005661008a3660046101d7565b61013f565b7fb53127684a568b3173ae13b9f8a6016e243e63b6e8ee1178d6a717850b5d61035433146100bb575f80fd5b7f360894a13ba1a3210667c828492db98dca3e2076cc3735a920a3ca505d382bbc8190556040516001600160a01b038216907fbc7cd75a20ee27fd9adebab32041f755214dbc6bffa90cc0225b39da2e5c2d3b905f90a250565b5f7f360894a13ba1a3210667c828492db98dca3e2076cc3735a920a3ca505d382bbc545f5260205ff35b7fb53127684a568b3173ae13b9f8a6016e243e63b6e8ee1178d6a717850b5d61035433811461016c575f80fd5b7fb53127684a568b3173ae13b9f8a6016e243e63b6e8ee1178d6a717850b5d6103829055604080516001600160a01b038084168252841660208201527f7e644d79422f17c01e4894b5f4f588d331ebfa28653d42ae832dc59e38c9798f910160405180910390a15050565b5f602082840312156101e7575f80fd5b81356001600160a01b03811681146101fd575f80fd5b939250505056fea26469706673582212206c603c6fffefb9570bd5408bca3f7b35d3fb8c3635348e3f848b4ee5ec33a5b664736f6c6343000819003360806040526040516102f83803806102f88339810160408190526020916085565b7fb53127684a568b3173ae13b9f8a6016e243e63b6e8ee1178d6a717850b5d6103919091557f360894a13ba1a3210667c828492db98dca3e2076cc3735a920a3ca505d382bbc5560b1565b80516001600160a01b03811681146080575f80fd5b919050565b5f80604083850312156095575f80fd5b609c83606b565b915060a860208401606b565b90509250929050565b61023a806100be5f395ff3fe608060405234801561000f575f80fd5b506004361061003f575f3560e01c80630900f010146100435780635c60da1b14610058578063704b6c021461007c575b5f80fd5b6100566100513660046101d7565b61008f565b005b610060610115565b6040516001600160a01b03909116815260200160405180910390f35b61005661008a3660046101d7565b61013f565b7fb53127684a568b3173ae13b9f8a6016e243e63b6e8ee1178d6a717850b5d61035433146100bb575f80fd5b7f360894a13ba1a3210667c828492db98dca3e2076cc3735a920a3ca505d382bbc8190556040516001600160a01b038216907fbc7cd75a20ee27fd9adebab32041f755214dbc6bffa90cc0225b39da2e5c2d3b905f90a250565b5f7f360894a13ba1a3210667c828492db98dca3e2076cc3735a920a3ca505d382bbc545f5260205ff35b7fb53127684a568b3173ae13b9f8a6016e243e63b6e8ee1178d6a717850b5d61035433811461016c575f80fd5b7fb53127684a568b3173ae13b9f8a6016e243e63b6e8ee1178d6a717850b5d6103829055604080516001600160a01b038084168252841660208201527f7e644d79422f17c01e4894b5f4f588d331ebfa28653d42ae832dc59e38c9798f910160405180910390a15050565b5f602082840312156101e7575f80fd5b81356001600160a01b03811681146101fd575f80fd5b939250505056fea26469706673582212206c603c6fffefb9570bd5408bca3f7b35d3fb8c3635348e3f848b4ee5ec33a5b664736f6c63430008190033608060405236600a57005b60045f80377fd337f855a71558e35b1ec3d991eab0dfca9dba8c925272bac802632b4e45f57b60205260405f20548060785762461bcd60e51b5f526020600452601e6024527f44657374696e793a204d6f64756c6520343034206e6f7420666f756e6421000060445260645ffd5b365f80375f80365f845af490503d5f803e8080156093573d5ff35b3d5ffdfea2646970667358221220298b47807eeab7e6551ef056f5c4dae3490faa2dfd2320034a3bbdaf1cce5d1564736f6c63430008190033608060405260405161028f38038061028f8339810160408190526100229161010c565b5f5b60e0518110156100ab575f5b600561010083821b81018051806101400151851061005157505050506100a2565b6101609385901b019290920151604080519190915280517fd337f855a71558e35b1ec3d991eab0dfca9dba8c925272bac802632b4e45f57b6020909101529151015181519190912055600101610030565b50600101610024565b50307f3418148758b1f9e91a7d35447272be5d6ae049a7e84e742f66587a44d93e29cb55307f3418148758b1f9e91a7d35447272be5d6ae049a7e84e742f66587a44d93e29cc55506101b6565b634e487b7160e01b5f52604160045260245ffd5b5f6020828403121561011c575f80fd5b81516001600160401b0380821115610132575f80fd5b818401915084601f830112610145575f80fd5b815181811115610157576101576100f8565b604051601f8201601f19908116603f0116810190838211818310171561017f5761017f6100f8565b81604052828152876020848701011115610197575f80fd5b8260208601602083015e5f928101602001929092525095945050505050565b60cd806101c25f395ff3fe608060405236600a57005b60045f80377fd337f855a71558e35b1ec3d991eab0dfca9dba8c925272bac802632b4e45f57b60205260405f20548060785762461bcd60e51b5f526020600452601e6024527f44657374696e793a204d6f64756c6520343034206e6f7420666f756e6421000060445260645ffd5b365f80375f80365f845af490503d5f803e8080156093573d5ff35b3d5ffdfea2646970667358221220298b47807eeab7e6551ef056f5c4dae3490faa2dfd2320034a3bbdaf1cce5d1564736f6c6343000819003360806040525f805260045f6004376020600860245f7f3418148758b1f9e91a7d35447272be5d6ae049a7e84e742f66587a44d93e29cb545afa506008518060af5760045f8037507fd337f855a71558e35b1ec3d991eab0dfca9dba8c925272bac802632b4e45f57b60205260405f20548060af5762461bcd60e51b5f526020600452601e6024527f44657374696e793a204d6f64756c6520343034206e6f7420666f756e6421000060445260645ffd5b365f80375f80365f845af490503d5f803e80801560ca573d5ff35b3d5ffdfea2646970667358221220dcc00c9af50e14d34131b0fe806cec288679f6a7d99538f0f6f60bef05ebecfa64736f6c6343000819003360806040526040516101a53803806101a58339810160408190526020916069565b7f3418148758b1f9e91a7d35447272be5d6ae049a7e84e742f66587a44d93e29cb55307f3418148758b1f9e91a7d35447272be5d6ae049a7e84e742f66587a44d93e29cc556094565b5f602082840312156078575f80fd5b81516001600160a01b0381168114608d575f80fd5b9392505050565b610104806100a15f395ff3fe60806040525f805260045f6004376020600860245f7f3418148758b1f9e91a7d35447272be5d6ae049a7e84e742f66587a44d93e29cb545afa506008518060af5760045f8037507fd337f855a71558e35b1ec3d991eab0dfca9dba8c925272bac802632b4e45f57b60205260405f20548060af5762461bcd60e51b5f526020600452601e6024527f44657374696e793a204d6f64756c6520343034206e6f7420666f756e6421000060445260645ffd5b365f80375f80365f845af490503d5f803e80801560ca573d5ff35b3d5ffdfea2646970667358221220dcc00c9af50e14d34131b0fe806cec288679f6a7d99538f0f6f60bef05ebecfa64736f6c6343000819003360806040525f805260045f6004376020600860245f7f3418148758b1f9e91a7d35447272be5d6ae049a7e84e742f66587a44d93e29cb545afa506008518060af5760045f8037507fd337f855a71558e35b1ec3d991eab0dfca9dba8c925272bac802632b4e45f57b60205260405f20548060af5762461bcd60e51b5f526020600452601e6024527f44657374696e793a204d6f64756c6520343034206e6f7420666f756e6421000060445260645ffd5b365f80375f80365f845af490503d5f803e80801560ca573d5ff35b3d5ffdfea2646970667358221220e7bcd350f7a434240fc1cad87ab8180ac6b29a3a3406d746e798af3d37ed77d764736f6c6343000819003360806040526040516101a63803806101a6833981016040819052602091606a565b7f3418148758b1f9e91a7d35447272be5d6ae049a7e84e742f66587a44d93e29cb8190557f3418148758b1f9e91a7d35447272be5d6ae049a7e84e742f66587a44d93e29cc556095565b5f602082840312156079575f80fd5b81516001600160a01b0381168114608e575f80fd5b9392505050565b610104806100a25f395ff3fe60806040525f805260045f6004376020600860245f7f3418148758b1f9e91a7d35447272be5d6ae049a7e84e742f66587a44d93e29cb545afa506008518060af5760045f8037507fd337f855a71558e35b1ec3d991eab0dfca9dba8c925272bac802632b4e45f57b60205260405f20548060af5762461bcd60e51b5f526020600452601e6024527f44657374696e793a204d6f64756c6520343034206e6f7420666f756e6421000060445260645ffd5b365f80375f80365f845af490503d5f803e80801560ca573d5ff35b3d5ffdfea2646970667358221220e7bcd350f7a434240fc1cad87ab8180ac6b29a3a3406d746e798af3d37ed77d764736f6c63430008190033683d3d37363d34f05bff6009527f60016015523060145261d6943d526017601e2060601b60601c803b60275750363d5260293df3a2646970667358221220e6d00bffe980b8bc55720dcdbac7564ea1a6bd5f841b0297e38e8d5e32fe2b8464736f6c63430008190033
Deployed Bytecode
0x60806040526004361061003e575f3560e01c80633b714a0a14610042578063ade34be514610063578063d65652d514610098578063eb10f3ca146100d7575b5f80fd5b34801561004d575f80fd5b5061006161005c366004611ef3565b610102565b005b34801561006e575f80fd5b5061008261007d366004611f52565b610295565b60405161008f9190611fde565b60405180910390f35b3480156100a3575f80fd5b506100b76100b2366004611ffe565b6105f2565b604080516001600160a01b0393841681529290911660208301520161008f565b6100ea6100e5366004612068565b610778565b6040516001600160a01b03909116815260200161008f565b5f61010b610cdc565b335f90815260019190910160205260409020546001600160a01b031690508015801561013f57506001600160a01b03831615155b156101475750815b6001600160a01b03811615610290575f80826001600160a01b0316846040516024016101739190611fde565b60408051601f198184030181529181526020820180516001600160e01b0316637dfc7b0360e11b179052516101a89190612110565b5f604051808303815f865af19150503d805f81146101e1576040519150601f19603f3d011682016040523d82523d5f602084013e6101e6565b606091505b5091509150816102115760405162461bcd60e51b81526004016102089061211b565b60405180910390fd5b6001600160a01b038516301461028d578461022a610cdc565b335f908152600191909101602090815260409182902080546001600160a01b0319166001600160a01b03948516179055905191871682527f0d3a3dda2c3164bbc4898485ffa0b984c414d664538d3b99df23202077f72c9b910160405180910390a15b50505b505050565b60605f8460088111156102aa576102aa612161565b146105805760018460088111156102c3576102c3612161565b146105265760028460088111156102dc576102dc612161565b146104f05760038460088111156102f5576102f5612161565b146104ba57600484600881111561030e5761030e612161565b1461048457600584600881111561032757610327612161565b146103e157600684600881111561034057610340612161565b146103a557600784600881111561035957610359612161565b1461036457816105ea565b5f83600181111561037757610377612161565b146103935761038e610389835f610d0f565b610d73565b6105ea565b61038e6103a0835f610d0f565b610dcf565b5f8360018111156103b8576103b8612161565b146103cf5761038e6103ca835f610d0f565b610e2b565b61038e6103dc835f610d0f565b610e76565b5f8360018111156103f4576103f4612161565b146104205760405161040860208201611d5f565b601f1982820381018352601f909101166040526105ea565b60405161042f60208201611d6b565b601f1982820381018352601f909101166040819052610452908490602001611fde565b60408051601f19818403018152908290526104709291602001612175565b6040516020818303038152906040526105ea565b5f83600181111561049757610497612161565b146104ab5760405161040860208201611d77565b60405161042f60208201611d84565b5f8360018111156104cd576104cd612161565b146104e15760405161040860208201611d91565b60405161042f60208201611d9e565b5f83600181111561050357610503612161565b146105175760405161040860208201611dab565b60405161042f60208201611db7565b5f83600181111561053957610539612161565b1461054d5760405161040860208201611dc4565b60405161055c60208201611dd1565b601f1982820381018352601f90910116604081905261047091908490602001612175565b5f83600181111561059357610593612161565b146105a75760405161040860208201611dde565b6040516105b660208201611deb565b601f1982820381018352601f9091011660408190526105da91908490602001612175565b6040516020818303038152906040525b949350505050565b5f808087600281111561060757610607612161565b1461076157600287600281111561062057610620612161565b14610742575f86600881111561063857610638612161565b1461073957600186600881111561065157610651612161565b1461073057600286600881111561066a5761066a612161565b1461072757600386600881111561068357610683612161565b1461071e57600486600881111561069c5761069c612161565b146107155760058660088111156106b5576106b5612161565b1461070c5760068660088111156106ce576106ce612161565b146107035760078660088111156106e7576106e7612161565b146106fa576106f585610ed4565b61076a565b6106f585610f06565b6106f585610f34565b6106f585610f5d565b6106f585610fe5565b6106f585611058565b6106f58561108b565b6106f5856110fb565b6106f58561112b565b6106f5305f851161075b57610755610cdc565b5461115b565b8461115b565b61076a846111ca565b909890975095505050505050565b5f8086600281111561078c5761078c612161565b146109df5760018660028111156107a5576107a5612161565b146108c7575f8560088111156107bd576107bd612161565b146108be5760018560088111156107d6576107d6612161565b146108b55760028560088111156107ef576107ef612161565b146108ac57600385600881111561080857610808612161565b146108a357600485600881111561082157610821612161565b1461089a57600585600881111561083a5761083a612161565b1461089157600685600881111561085357610853612161565b1461088857600785600881111561086c5761086c612161565b1461087f5761087a82611206565b610aee565b61087a82611210565b61087a82611240565b61087a82611264565b61087a826112e7565b61087a82611348565b61087a82611376565b61087a826113e1565b61087a8261140c565b5f8560088111156108da576108da612161565b146109d65760018560088111156108f3576108f3612161565b146109cd57600285600881111561090c5761090c612161565b146109c457600385600881111561092557610925612161565b146109bb57600485600881111561093e5761093e612161565b146109b257600585600881111561095757610957612161565b146109a957600685600881111561097057610970612161565b146109a057600785600881111561098957610989612161565b146109975761087a82611437565b61087a8261145c565b61087a82611489565b61087a826114b1565b61087a82611538565b61087a826115a6565b61087a826115d8565b61087a82611647565b61087a82611676565b5f8560088111156109f2576109f2612161565b14610ae5576001856008811115610a0b57610a0b612161565b14610adc576002856008811115610a2457610a24612161565b14610ad3576003856008811115610a3d57610a3d612161565b14610aca576004856008811115610a5657610a56612161565b14610aca576005856008811115610a6f57610a6f612161565b14610ac1576006856008811115610a8857610a88612161565b14610ab8576007856008811115610aa157610aa1612161565b14610aaf5761087a826116a5565b61087a826116dc565b61087a82611730565b61087a82611760565b61087a826117db565b61087a82611853565b61087a826118ca565b610aee82611901565b9050806001600160a01b03163b5f03610b495760405162461bcd60e51b815260206004820152601d60248201527f44657374696e79466163746f72793a6465706c6f79206661696c6564210000006044820152606401610208565b610b538184611938565b506001600160a01b03841615610c4d575f846001600160a01b03168288888787604051602401610b87959493929190612189565b60408051601f198184030181529181526020820180516001600160e01b031663022d35b760e31b17905251610bbc9190612110565b5f604051808303815f865af19150503d805f8114610bf5576040519150601f19603f3d011682016040523d82523d5f602084013e610bfa565b606091505b5050905080610c4b5760405162461bcd60e51b815260206004820152601f60248201527f44657374696e79466163746f72793a63616c6c6261636b206661696c656421006044820152606401610208565b505b6040516001600160a01b03821681527ff40fcec21964ffb566044d083b4073f29f7f7929110ea19e1b3ebe375d89055e9060200160405180910390a17fe335c04c904a95df658ab3e6bb90e9f8f42b8d7b0dd1c5ec3c3000eff7562bc3610cb2610cdc565b5460405190815260200160405180910390a1610ccc610cdc565b8054600101905595945050505050565b5f80610d0960077f8fc89b1793e5d3153375a09940e56c9a1019f9ef47f9952fbe41180570601c38612208565b92915050565b5f610d1b82601461221b565b83511015610d635760405162461bcd60e51b8152602060048201526015602482015274746f416464726573735f6f75744f66426f756e647360581b6044820152606401610208565b500160200151600160601b900490565b60405168365f5f375f5f365f7360b81b6020820152606082811b6001600160601b03191660298301526e5af43d5f5f3e5f3d91602a57fd5bf360881b603d83015290604c015b6040516020818303038152906040529050919050565b60405168602c8060095f395ff360b81b602082015268365f5f375f5f365f7360b81b6029820152606082811b6001600160601b03191660328301526e5af43d5f5f3e5f3d91602a57fd5bf360881b604683015290605501610db9565b60405169363d3d373d3d3d363d7360b01b6020820152606082811b6001600160601b031916602a8301526e5af43d82803e903d91602b57fd5bf360881b603e83015290604d01610db9565b604051693d602d80600a3d3981f360b01b602082015269363d3d373d3d3d363d7360b01b602a820152606082811b6001600160601b03191660348301526e5af43d82803e903d91602b57fd5bf360881b604883015290605701610db9565b5f805f8084806020019051810190610eec919061227b565b91509150610efa82826119f2565b90969095509350505050565b5f805f8084806020019051810190610f1e91906122b4565b91509150610efa82610f2f83610dcf565b6119f2565b5f805f8084806020019051810190610f4c91906122b4565b91509150610efa82610f2f83610e76565b5f805f8084806020019051810190610f7591906122b4565b91509150610efa8260405180602001610f8d90611d6b565b601f1982820381018352601f9091011660408181526001600160a01b0386166020830152015b60408051601f1981840301815290829052610fd19291602001612175565b6040516020818303038152906040526119f2565b5f805f805f85806020019051810190610ffe91906122e2565b92509250925061104b836040518060200161101890611d84565b601f1982820381018352601f9091011660408181526001600160a01b038781166020840152861690820152606001610fb3565b9097909650945050505050565b5f805f805f8580602001905181019061107191906122e2565b92509250925061104b836040518060200161101890611d9e565b5f805f80848060200190518101906110a3919061247b565b91509150610efa82604051806020016110bb90611db7565b601f1982820381018352601f9091011660408190526110de9085906020016124b4565b60408051601f1981840301815290829052610fb391602001611fde565b5f805f808480602001905181019061111391906122b4565b91509150610efa8260405180602001610f8d90611dd1565b5f805f808480602001905181019061114391906122b4565b91509150610efa8260405180602001610f8d90611deb565b815f607f831161118757835f526094600b5360d6600a5382831560071b17602053506017600a206111c3565b60085b83811c1561119a5760080161118a565b60031c838152600885901b5f5260808101601f536094600a538060d60160095360170160092090505b9250929050565b5f806111ee83604051806060016040528060348152602001613c2c603491396119f2565b92506111fd905082600161115b565b92949293505050565b5f610d0982611a49565b5f80828060200190518101906112269190612565565b905061123961123482610dcf565b611a49565b9392505050565b5f80828060200190518101906112569190612565565b905061123961123482610e76565b5f808280602001905181019061127a9190612565565b90506112396040518060200161128f90611d6b565b601f1982820381018352601f9091011660408181526001600160a01b0385166020830152015b60408051601f19818403018152908290526112d39291602001612175565b604051602081830303815290604052611a49565b5f805f838060200190518101906112fe9190612580565b915091506105ea6040518060200161131590611d84565b601f1982820381018352601f9091011660408181526001600160a01b0386811660208401528516908201526060016112b5565b5f805f8380602001905181019061135f9190612580565b915091506105ea6040518060200161131590611d9e565b5f808280602001905181019061138c91906125ad565b9050611239604051806020016113a190611db7565b601f1982820381018352601f9091011660408190526113c49084906020016124b4565b60408051601f19818403018152908290526112b591602001611fde565b5f80828060200190518101906113f79190612565565b90506112396040518060200161128f90611dd1565b5f80828060200190518101906114229190612565565b90506112396040518060200161128f90611deb565b5f805f8380602001905181019061144e919061227b565b915091506105ea8282611a58565b5f805f8380602001905181019061147391906122b4565b915091506105ea8261148483610dcf565b611a58565b5f805f838060200190518101906114a091906122b4565b915091506105ea8261148483610e76565b5f805f838060200190518101906114c891906122b4565b915091506105ea82604051806020016114e090611d6b565b601f1982820381018352601f9091011660408181526001600160a01b0386166020830152015b60408051601f19818403018152908290526115249291602001612175565b604051602081830303815290604052611a58565b5f805f808480602001905181019061155091906122e2565b92509250925061159d836040518060200161156a90611d84565b601f1982820381018352601f9091011660408181526001600160a01b038781166020840152861690820152606001611506565b95945050505050565b5f805f80848060200190518101906115be91906122e2565b92509250925061159d836040518060200161156a90611d9e565b5f805f838060200190518101906115ef919061247b565b915091506105ea826040518060200161160790611db7565b601f1982820381018352601f90910116604081905261162a9085906020016124b4565b60408051601f198184030181529082905261150691602001611fde565b5f805f8380602001905181019061165e91906122b4565b915091506105ea82604051806020016114e090611dd1565b5f805f8380602001905181019061168d91906122b4565b915091506105ea82604051806020016114e090611deb565b5f805f805f858060200190518101906116be91906125de565b93509350935093506116d284848484611ad9565b9695505050505050565b5f805f805f858060200190518101906116f59190612659565b93509350935093506116d284848461170c85610dcf565b60405160200161171c9190612110565b604051602081830303815290604052611ad9565b5f805f805f858060200190518101906117499190612659565b93509350935093506116d284848461170c85610e76565b5f805f805f858060200190518101906117799190612659565b93509350935093506116d28484846040518060200161179790611d6b565b601f1982820381018352601f9091011660408181526001600160a01b0388166020830152015b60408051601f198184030181529082905261171c9291602001612175565b5f805f805f80868060200190518101906117f591906126c1565b945094509450945094506118488585856040518060200161181590611d9e565b601f1982820381018352601f9091011660408181526001600160a01b0389811660208401528816908201526060016117bd565b979650505050505050565b5f805f805f8580602001905181019061186c919061273e565b93509350935093506116d28484846040518060200161188a90611db7565b601f1982820381018352601f9091011660408190526118ad9087906020016124b4565b60408051601f19818403018152908290526117bd91602001611fde565b5f805f805f858060200190518101906118e39190612659565b93509350935093506116d28484846040518060200161179790611dd1565b5f805f805f8580602001905181019061191a9190612659565b93509350935093506116d28484846040518060200161179790611deb565b80515f90156119eb575f836001600160a01b03168360405161195a9190612110565b5f604051808303815f865af19150503d805f8114611993576040519150601f19603f3d011682016040523d82523d5f602084013e611998565b606091505b50509050806119e95760405162461bcd60e51b815260206004820152601860248201527f44657374696e79466163746f72793a696e6974206661696c00000000000000006044820152606401610208565b505b5090919050565b8051602091820120604080516001600160f81b03198185015230606081901b6001600160601b0319166021830152603582019590955260558082019390935281518082039093018352607501905280519101209091565b5f81516020830134f092915050565b5f8282516020840134f59050604051806060016040528060348152602001613c2c6034913980519060200120828051906020012003610d095760405162461bcd60e51b815260206004820152601f60248201527f44697361626c652063726561746532206465706c6f792063726561746f7221006044820152606401610208565b5f80604051806060016040528060348152602001613c2c6034913990505f611b0187836119f2565b9150506001600160a01b0381163b15611b5c5760405162461bcd60e51b815260206004820181905260248201527f44657374696e79466163746f72793a63726561746f72206465706c6f796564216044820152606401610208565b5f8783516020850134f59050611b7381600161115b565b94505f9050611b80610cdc565b6001600160a01b038087165f9081526001830160205260409020549192501680158015611bb557506001600160a01b03891615155b15611bbd5750875b6001600160a01b03811615611cbb575f80826001600160a01b03168a604051602401611be99190611fde565b60408051601f198184030181529181526020820180516001600160e01b0316637dfc7b0360e11b17905251611c1e9190612110565b5f604051808303815f865af19150503d805f8114611c57576040519150601f19603f3d011682016040523d82523d5f602084013e611c5c565b606091505b509150915081611c7e5760405162461bcd60e51b81526004016102089061211b565b6001600160a01b038b163014611cb857335f908152600185016020526040902080546001600160a01b0319166001600160a01b038d161790555b50505b826001600160a01b03163488604051611cd49190612110565b5f6040518083038185875af1925050503d805f8114611d0e576040519150601f19603f3d011682016040523d82523d5f602084013e611d13565b606091505b50506040516001600160a01b03851681527ff40fcec21964ffb566044d083b4073f29f7f7929110ea19e1b3ebe375d89055e915060200160405180910390a15050505050949350505050565b6078806127ae83390190565b60f58061282683390190565b6102398061291b83390190565b6102f780612b5483390190565b61023a80612e4b83390190565b6102f88061308583390190565b60cd8061337d83390190565b61028f8061344a83390190565b610104806136d983390190565b6101a5806137dd83390190565b6101048061398283390190565b6101a680613a8683390190565b6001600160a01b0381168114611e0c575f80fd5b50565b634e487b7160e01b5f52604160045260245ffd5b604080519081016001600160401b0381118282101715611e4557611e45611e0f565b60405290565b604051601f8201601f191681016001600160401b0381118282101715611e7357611e73611e0f565b604052919050565b5f6001600160401b03821115611e9357611e93611e0f565b50601f01601f191660200190565b5f82601f830112611eb0575f80fd5b8135611ec3611ebe82611e7b565b611e4b565b818152846020838601011115611ed7575f80fd5b816020850160208301375f918101602001919091529392505050565b5f8060408385031215611f04575f80fd5b8235611f0f81611df8565b915060208301356001600160401b03811115611f29575f80fd5b611f3585828601611ea1565b9150509250929050565b803560098110611f4d575f80fd5b919050565b5f805f60608486031215611f64575f80fd5b611f6d84611f3f565b9250602084013560028110611f80575f80fd5b915060408401356001600160401b03811115611f9a575f80fd5b611fa686828701611ea1565b9150509250925092565b5f81518084528060208401602086015e5f602082860101526020601f19601f83011685010191505092915050565b602081525f6112396020830184611fb0565b803560038110611f4d575f80fd5b5f805f805f60a08688031215612012575f80fd5b61201b86611ff0565b945061202960208701611f3f565b935060408601356001600160401b03811115612043575f80fd5b61204f88828901611ea1565b9598949750949560608101359550608001359392505050565b5f805f805f60a0868803121561207c575f80fd5b61208586611ff0565b945061209360208701611f3f565b935060408601356120a381611df8565b925060608601356001600160401b03808211156120be575f80fd5b6120ca89838a01611ea1565b935060808801359150808211156120df575f80fd5b506120ec88828901611ea1565b9150509295509295909350565b5f81518060208401855e5f93019283525090919050565b5f61123982846120f9565b60208082526026908201527f44657374696e79466163746f72793a7665726966794f776e657273686970204660408201526561696c65642160d01b606082015260800190565b634e487b7160e01b5f52602160045260245ffd5b5f6105ea61218383866120f9565b846120f9565b6001600160a01b03861681525f600386106121a6576121a6612161565b856020830152600985106121bc576121bc612161565b84604083015260a060608301526121d660a0830185611fb0565b82810360808401526121e88185611fb0565b98975050505050505050565b634e487b7160e01b5f52601160045260245ffd5b81810381811115610d0957610d096121f4565b80820180821115610d0957610d096121f4565b5f82601f83011261223d575f80fd5b815161224b611ebe82611e7b565b81815284602083860101111561225f575f80fd5b8160208501602083015e5f918101602001919091529392505050565b5f806040838503121561228c575f80fd5b8251915060208301516001600160401b038111156122a8575f80fd5b611f358582860161222e565b5f80604083850312156122c5575f80fd5b8251915060208301516122d781611df8565b809150509250929050565b5f805f606084860312156122f4575f80fd5b83519250602084015161230681611df8565b604085015190925061231781611df8565b809150509250925092565b5f6001600160401b0382111561233a5761233a611e0f565b5060051b60200190565b5f82601f830112612353575f80fd5b81516020612363611ebe83612322565b828152600592831b8501820192828201919087851115612381575f80fd5b8387015b8581101561246e5780516001600160401b03808211156123a3575f80fd5b908901906040828c03601f19018113156123bb575f80fd5b6123c3611e23565b888401516123d081611df8565b815283820151838111156123e2575f80fd5b8085019450508c603f8501126123f6575f80fd5b888401519250612408611ebe84612322565b83815292861b8401820192898101908e851115612423575f80fd5b948301945b8486101561245957855193506001600160e01b031984168414612449575f80fd5b838252948a0194908a0190612428565b828b0152508752505050928401928401612385565b5090979650505050505050565b5f806040838503121561248c575f80fd5b8251915060208301516001600160401b038111156124a8575f80fd5b611f3585828601612344565b5f60208083018184528085518083526040925060408601915060408160051b8701018488015f5b8381101561255757888303603f19018552815180516001600160a01b031684528701518784018790528051878501819052908801905f9060608601905b808310156125425783516001600160e01b0319168252928a019260019290920191908a0190612518565b509689019694505050908601906001016124db565b509098975050505050505050565b5f60208284031215612575575f80fd5b815161123981611df8565b5f8060408385031215612591575f80fd5b825161259c81611df8565b60208401519092506122d781611df8565b5f602082840312156125bd575f80fd5b81516001600160401b038111156125d2575f80fd5b6105ea84828501612344565b5f805f80608085870312156125f1575f80fd5b84519350602085015161260381611df8565b60408601519093506001600160401b038082111561261f575f80fd5b61262b8883890161222e565b93506060870151915080821115612640575f80fd5b5061264d8782880161222e565b91505092959194509250565b5f805f806080858703121561266c575f80fd5b84519350602085015161267e81611df8565b60408601519093506001600160401b03811115612699575f80fd5b6126a58782880161222e565b92505060608501516126b681611df8565b939692955090935050565b5f805f805f60a086880312156126d5575f80fd5b8551945060208601516126e781611df8565b60408701519094506001600160401b03811115612702575f80fd5b61270e8882890161222e565b935050606086015161271f81611df8565b608087015190925061273081611df8565b809150509295509295909350565b5f805f8060808587031215612751575f80fd5b84519350602085015161276381611df8565b60408601519093506001600160401b038082111561277f575f80fd5b61278b8883890161222e565b935060608701519150808211156127a0575f80fd5b5061264d8782880161234456fe6080604052365f80375f80365f7f360894a13ba1a3210667c828492db98dca3e2076cc3735a920a3ca505d382bbc545af43d5f803e808015603e573d5ff35b3d5ffdfea26469706673582212203865e7b18a71a3eb7a449ca94cb0b27eb52e26caaa068aad34930d717910a80564736f6c6343000819003360806040526040516100f53803806100f58339810160408190526020916046565b7f360894a13ba1a3210667c828492db98dca3e2076cc3735a920a3ca505d382bbc556071565b5f602082840312156055575f80fd5b81516001600160a01b0381168114606a575f80fd5b9392505050565b60788061007d5f395ff3fe6080604052365f80375f80365f7f360894a13ba1a3210667c828492db98dca3e2076cc3735a920a3ca505d382bbc545af43d5f803e808015603e573d5ff35b3d5ffdfea26469706673582212203865e7b18a71a3eb7a449ca94cb0b27eb52e26caaa068aad34930d717910a80564736f6c63430008190033608060405260043610610028575f3560e01c80630900f0101461007a578063704b6c0214610099575b635c60da1b5f525f8060045f7fa3f0ad74e5423aebfd80d3ef4346578335a9a72aeaee59ff6cb3582b35133d50545afa365f80375f80365f845af490503d5f803e808015610074573d5ff35b3d5ffd5b005b348015610085575f80fd5b506100786100943660046101d6565b6100b8565b3480156100a4575f80fd5b506100786100b33660046101d6565b61013e565b7fb53127684a568b3173ae13b9f8a6016e243e63b6e8ee1178d6a717850b5d61035433146100e4575f80fd5b7fa3f0ad74e5423aebfd80d3ef4346578335a9a72aeaee59ff6cb3582b35133d508190556040516001600160a01b038216907f1cf3b03a6cf19fa2baba4df148e9dcabedea7f8a5c07840e207e5c089be95d3e905f90a250565b7fb53127684a568b3173ae13b9f8a6016e243e63b6e8ee1178d6a717850b5d61035433811461016b575f80fd5b7fb53127684a568b3173ae13b9f8a6016e243e63b6e8ee1178d6a717850b5d6103829055604080516001600160a01b038084168252841660208201527f7e644d79422f17c01e4894b5f4f588d331ebfa28653d42ae832dc59e38c9798f910160405180910390a15050565b5f602082840312156101e6575f80fd5b81356001600160a01b03811681146101fc575f80fd5b939250505056fea2646970667358221220d1a00185ea5353a0df281429b9539e3e097cfaa88624d3e2867d1600498e4dff64736f6c6343000819003360806040526040516102f73803806102f78339810160408190526020916085565b7fb53127684a568b3173ae13b9f8a6016e243e63b6e8ee1178d6a717850b5d6103919091557fa3f0ad74e5423aebfd80d3ef4346578335a9a72aeaee59ff6cb3582b35133d505560b1565b80516001600160a01b03811681146080575f80fd5b919050565b5f80604083850312156095575f80fd5b609c83606b565b915060a860208401606b565b90509250929050565b610239806100be5f395ff3fe608060405260043610610028575f3560e01c80630900f0101461007a578063704b6c0214610099575b635c60da1b5f525f8060045f7fa3f0ad74e5423aebfd80d3ef4346578335a9a72aeaee59ff6cb3582b35133d50545afa365f80375f80365f845af490503d5f803e808015610074573d5ff35b3d5ffd5b005b348015610085575f80fd5b506100786100943660046101d6565b6100b8565b3480156100a4575f80fd5b506100786100b33660046101d6565b61013e565b7fb53127684a568b3173ae13b9f8a6016e243e63b6e8ee1178d6a717850b5d61035433146100e4575f80fd5b7fa3f0ad74e5423aebfd80d3ef4346578335a9a72aeaee59ff6cb3582b35133d508190556040516001600160a01b038216907f1cf3b03a6cf19fa2baba4df148e9dcabedea7f8a5c07840e207e5c089be95d3e905f90a250565b7fb53127684a568b3173ae13b9f8a6016e243e63b6e8ee1178d6a717850b5d61035433811461016b575f80fd5b7fb53127684a568b3173ae13b9f8a6016e243e63b6e8ee1178d6a717850b5d6103829055604080516001600160a01b038084168252841660208201527f7e644d79422f17c01e4894b5f4f588d331ebfa28653d42ae832dc59e38c9798f910160405180910390a15050565b5f602082840312156101e6575f80fd5b81356001600160a01b03811681146101fc575f80fd5b939250505056fea2646970667358221220d1a00185ea5353a0df281429b9539e3e097cfaa88624d3e2867d1600498e4dff64736f6c63430008190033608060405234801561000f575f80fd5b506004361061003f575f3560e01c80630900f010146100435780635c60da1b14610058578063704b6c021461007c575b5f80fd5b6100566100513660046101d7565b61008f565b005b610060610115565b6040516001600160a01b03909116815260200160405180910390f35b61005661008a3660046101d7565b61013f565b7fb53127684a568b3173ae13b9f8a6016e243e63b6e8ee1178d6a717850b5d61035433146100bb575f80fd5b7f360894a13ba1a3210667c828492db98dca3e2076cc3735a920a3ca505d382bbc8190556040516001600160a01b038216907fbc7cd75a20ee27fd9adebab32041f755214dbc6bffa90cc0225b39da2e5c2d3b905f90a250565b5f7f360894a13ba1a3210667c828492db98dca3e2076cc3735a920a3ca505d382bbc545f5260205ff35b7fb53127684a568b3173ae13b9f8a6016e243e63b6e8ee1178d6a717850b5d61035433811461016c575f80fd5b7fb53127684a568b3173ae13b9f8a6016e243e63b6e8ee1178d6a717850b5d6103829055604080516001600160a01b038084168252841660208201527f7e644d79422f17c01e4894b5f4f588d331ebfa28653d42ae832dc59e38c9798f910160405180910390a15050565b5f602082840312156101e7575f80fd5b81356001600160a01b03811681146101fd575f80fd5b939250505056fea26469706673582212206c603c6fffefb9570bd5408bca3f7b35d3fb8c3635348e3f848b4ee5ec33a5b664736f6c6343000819003360806040526040516102f83803806102f88339810160408190526020916085565b7fb53127684a568b3173ae13b9f8a6016e243e63b6e8ee1178d6a717850b5d6103919091557f360894a13ba1a3210667c828492db98dca3e2076cc3735a920a3ca505d382bbc5560b1565b80516001600160a01b03811681146080575f80fd5b919050565b5f80604083850312156095575f80fd5b609c83606b565b915060a860208401606b565b90509250929050565b61023a806100be5f395ff3fe608060405234801561000f575f80fd5b506004361061003f575f3560e01c80630900f010146100435780635c60da1b14610058578063704b6c021461007c575b5f80fd5b6100566100513660046101d7565b61008f565b005b610060610115565b6040516001600160a01b03909116815260200160405180910390f35b61005661008a3660046101d7565b61013f565b7fb53127684a568b3173ae13b9f8a6016e243e63b6e8ee1178d6a717850b5d61035433146100bb575f80fd5b7f360894a13ba1a3210667c828492db98dca3e2076cc3735a920a3ca505d382bbc8190556040516001600160a01b038216907fbc7cd75a20ee27fd9adebab32041f755214dbc6bffa90cc0225b39da2e5c2d3b905f90a250565b5f7f360894a13ba1a3210667c828492db98dca3e2076cc3735a920a3ca505d382bbc545f5260205ff35b7fb53127684a568b3173ae13b9f8a6016e243e63b6e8ee1178d6a717850b5d61035433811461016c575f80fd5b7fb53127684a568b3173ae13b9f8a6016e243e63b6e8ee1178d6a717850b5d6103829055604080516001600160a01b038084168252841660208201527f7e644d79422f17c01e4894b5f4f588d331ebfa28653d42ae832dc59e38c9798f910160405180910390a15050565b5f602082840312156101e7575f80fd5b81356001600160a01b03811681146101fd575f80fd5b939250505056fea26469706673582212206c603c6fffefb9570bd5408bca3f7b35d3fb8c3635348e3f848b4ee5ec33a5b664736f6c63430008190033608060405236600a57005b60045f80377fd337f855a71558e35b1ec3d991eab0dfca9dba8c925272bac802632b4e45f57b60205260405f20548060785762461bcd60e51b5f526020600452601e6024527f44657374696e793a204d6f64756c6520343034206e6f7420666f756e6421000060445260645ffd5b365f80375f80365f845af490503d5f803e8080156093573d5ff35b3d5ffdfea2646970667358221220298b47807eeab7e6551ef056f5c4dae3490faa2dfd2320034a3bbdaf1cce5d1564736f6c63430008190033608060405260405161028f38038061028f8339810160408190526100229161010c565b5f5b60e0518110156100ab575f5b600561010083821b81018051806101400151851061005157505050506100a2565b6101609385901b019290920151604080519190915280517fd337f855a71558e35b1ec3d991eab0dfca9dba8c925272bac802632b4e45f57b6020909101529151015181519190912055600101610030565b50600101610024565b50307f3418148758b1f9e91a7d35447272be5d6ae049a7e84e742f66587a44d93e29cb55307f3418148758b1f9e91a7d35447272be5d6ae049a7e84e742f66587a44d93e29cc55506101b6565b634e487b7160e01b5f52604160045260245ffd5b5f6020828403121561011c575f80fd5b81516001600160401b0380821115610132575f80fd5b818401915084601f830112610145575f80fd5b815181811115610157576101576100f8565b604051601f8201601f19908116603f0116810190838211818310171561017f5761017f6100f8565b81604052828152876020848701011115610197575f80fd5b8260208601602083015e5f928101602001929092525095945050505050565b60cd806101c25f395ff3fe608060405236600a57005b60045f80377fd337f855a71558e35b1ec3d991eab0dfca9dba8c925272bac802632b4e45f57b60205260405f20548060785762461bcd60e51b5f526020600452601e6024527f44657374696e793a204d6f64756c6520343034206e6f7420666f756e6421000060445260645ffd5b365f80375f80365f845af490503d5f803e8080156093573d5ff35b3d5ffdfea2646970667358221220298b47807eeab7e6551ef056f5c4dae3490faa2dfd2320034a3bbdaf1cce5d1564736f6c6343000819003360806040525f805260045f6004376020600860245f7f3418148758b1f9e91a7d35447272be5d6ae049a7e84e742f66587a44d93e29cb545afa506008518060af5760045f8037507fd337f855a71558e35b1ec3d991eab0dfca9dba8c925272bac802632b4e45f57b60205260405f20548060af5762461bcd60e51b5f526020600452601e6024527f44657374696e793a204d6f64756c6520343034206e6f7420666f756e6421000060445260645ffd5b365f80375f80365f845af490503d5f803e80801560ca573d5ff35b3d5ffdfea2646970667358221220dcc00c9af50e14d34131b0fe806cec288679f6a7d99538f0f6f60bef05ebecfa64736f6c6343000819003360806040526040516101a53803806101a58339810160408190526020916069565b7f3418148758b1f9e91a7d35447272be5d6ae049a7e84e742f66587a44d93e29cb55307f3418148758b1f9e91a7d35447272be5d6ae049a7e84e742f66587a44d93e29cc556094565b5f602082840312156078575f80fd5b81516001600160a01b0381168114608d575f80fd5b9392505050565b610104806100a15f395ff3fe60806040525f805260045f6004376020600860245f7f3418148758b1f9e91a7d35447272be5d6ae049a7e84e742f66587a44d93e29cb545afa506008518060af5760045f8037507fd337f855a71558e35b1ec3d991eab0dfca9dba8c925272bac802632b4e45f57b60205260405f20548060af5762461bcd60e51b5f526020600452601e6024527f44657374696e793a204d6f64756c6520343034206e6f7420666f756e6421000060445260645ffd5b365f80375f80365f845af490503d5f803e80801560ca573d5ff35b3d5ffdfea2646970667358221220dcc00c9af50e14d34131b0fe806cec288679f6a7d99538f0f6f60bef05ebecfa64736f6c6343000819003360806040525f805260045f6004376020600860245f7f3418148758b1f9e91a7d35447272be5d6ae049a7e84e742f66587a44d93e29cb545afa506008518060af5760045f8037507fd337f855a71558e35b1ec3d991eab0dfca9dba8c925272bac802632b4e45f57b60205260405f20548060af5762461bcd60e51b5f526020600452601e6024527f44657374696e793a204d6f64756c6520343034206e6f7420666f756e6421000060445260645ffd5b365f80375f80365f845af490503d5f803e80801560ca573d5ff35b3d5ffdfea2646970667358221220e7bcd350f7a434240fc1cad87ab8180ac6b29a3a3406d746e798af3d37ed77d764736f6c6343000819003360806040526040516101a63803806101a6833981016040819052602091606a565b7f3418148758b1f9e91a7d35447272be5d6ae049a7e84e742f66587a44d93e29cb8190557f3418148758b1f9e91a7d35447272be5d6ae049a7e84e742f66587a44d93e29cc556095565b5f602082840312156079575f80fd5b81516001600160a01b0381168114608e575f80fd5b9392505050565b610104806100a25f395ff3fe60806040525f805260045f6004376020600860245f7f3418148758b1f9e91a7d35447272be5d6ae049a7e84e742f66587a44d93e29cb545afa506008518060af5760045f8037507fd337f855a71558e35b1ec3d991eab0dfca9dba8c925272bac802632b4e45f57b60205260405f20548060af5762461bcd60e51b5f526020600452601e6024527f44657374696e793a204d6f64756c6520343034206e6f7420666f756e6421000060445260645ffd5b365f80375f80365f845af490503d5f803e80801560ca573d5ff35b3d5ffdfea2646970667358221220e7bcd350f7a434240fc1cad87ab8180ac6b29a3a3406d746e798af3d37ed77d764736f6c63430008190033683d3d37363d34f05bff6009527f60016015523060145261d6943d526017601e2060601b60601c803b60275750363d5260293df3a2646970667358221220e6d00bffe980b8bc55720dcdbac7564ea1a6bd5f841b0297e38e8d5e32fe2b8464736f6c63430008190033
Loading...
Loading
Loading...
Loading
Net Worth in USD
$0.00
Net Worth in ETH
0
Multichain Portfolio | 33 Chains
| Chain | Token | Portfolio % | Price | Amount | Value |
|---|
Loading...
Loading
Loading...
Loading
Loading...
Loading
[ 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.