Transactions
Token Transfers
Tokens
Internal Transactions
Coin Balance History
Logs
Code
Read Contract
Read Proxy
Write Contract
Write Proxy
Warning! Contract bytecode has been changed and doesn't match the verified one. Therefore, interaction with this smart contract may be risky.
This contract has been verified via Sourcify.
View contract in Sourcify repository
- Contract name:
- InstaVault
- Optimization enabled
- true
- Compiler version
- v0.8.6+commit.11564f7e
- Optimization runs
- 200
- EVM Version
- berlin
- Verified at
- 2026-04-22T17:14:22.702114Z
Constructor Arguments
b53127684a568b3173ae13b9f8a6016e243e63b6e8ee1178d6a717850b5d6103360894a13ba1a3210667c828492db98dca3e2076cc3735a920a3ca505d382bbc00000000000000000000000085b40eb65e49eb61de78a3a989752249f8837fc500000000000000000000000071a990035d6126e520bbb939ea00dbf455a912e6
Arg [0] (address) : 0xf8a6016e243e63b6e8ee1178d6a717850b5d6103
Arg [1] (address) : 0x492db98dca3e2076cc3735a920a3ca505d382bbc
contracts/core/proxy/infiniteProxy.sol
// SPDX-License-Identifier: MIT
pragma solidity ^0.8.0;
import "../../infiniteProxy/proxy.sol";
contract InstaVault is Proxy {
constructor(address admin_, address dummyImplementation_)
Proxy(admin_, dummyImplementation_)
{}
}
/
// SPDX-License-Identifier: MIT
pragma solidity ^0.8.0;
contract Events {
event setAdminLog(address oldAdmin_, address newAdmin_);
event setDummyImplementationLog(
address oldDummyImplementation_,
address newDummyImplementation_
);
event setImplementationLog(address implementation_, bytes4[] sigs_);
event removeImplementationLog(address implementation_);
}
/
// SPDX-License-Identifier: MIT
pragma solidity ^0.8.0;
import "./events.sol";
/**
* @dev This abstract contract provides a fallback function that delegates all calls to another contract using the EVM
* instruction `delegatecall`.
*/
contract Internals is Events {
struct AddressSlot {
address value;
}
struct SigsSlot {
bytes4[] value;
}
/**
* @dev Storage slot with the admin of the contract.
* This is the keccak-256 hash of "eip1967.proxy.admin" subtracted by 1, and is
* validated in the constructor.
*/
bytes32 internal constant _ADMIN_SLOT =
0xb53127684a568b3173ae13b9f8a6016e243e63b6e8ee1178d6a717850b5d6103;
/**
* @dev Storage slot with the address of the current dummy-implementation.
* This is the keccak-256 hash of "eip1967.proxy.implementation" subtracted by 1, and is
* validated in the constructor.
*/
bytes32 internal constant _DUMMY_IMPLEMENTATION_SLOT =
0x360894a13ba1a3210667c828492db98dca3e2076cc3735a920a3ca505d382bbc;
/**
* @dev Returns the storage slot which stores the sigs array set for the implementation.
*/
function _getImplSigsSlot(address implementation_)
internal
pure
returns (bytes32)
{
return
keccak256(
abi.encode("eip1967.proxy.implementation", implementation_)
);
}
/**
* @dev Returns the storage slot which stores the implementation address for the function sig.
*/
function _getSigsImplSlot(bytes4 sig_) internal pure returns (bytes32) {
return keccak256(abi.encode("eip1967.proxy.implementation", sig_));
}
/**
* @dev Returns an `AddressSlot` with member `value` located at `slot`.
*/
function getAddressSlot(bytes32 slot_)
internal
pure
returns (AddressSlot storage _r)
{
assembly {
_r.slot := slot_
}
}
/**
* @dev Returns an `SigsSlot` with member `value` located at `slot`.
*/
function getSigsSlot(bytes32 slot_)
internal
pure
returns (SigsSlot storage _r)
{
assembly {
_r.slot := slot_
}
}
/**
* @dev Sets new implementation and adds mapping from implementation to sigs and sig to implementation.
*/
function _setImplementationSigs(
address implementation_,
bytes4[] memory sigs_
) internal {
require(sigs_.length != 0, "no-sigs");
bytes32 slot_ = _getImplSigsSlot(implementation_);
bytes4[] memory sigsCheck_ = getSigsSlot(slot_).value;
require(sigsCheck_.length == 0, "implementation-already-exist");
for (uint256 i = 0; i < sigs_.length; i++) {
bytes32 sigSlot_ = _getSigsImplSlot(sigs_[i]);
require(
getAddressSlot(sigSlot_).value == address(0),
"sig-already-exist"
);
getAddressSlot(sigSlot_).value = implementation_;
}
getSigsSlot(slot_).value = sigs_;
emit setImplementationLog(implementation_, sigs_);
}
/**
* @dev Removes implementation and the mappings corresponding to it.
*/
function _removeImplementationSigs(address implementation_) internal {
bytes32 slot_ = _getImplSigsSlot(implementation_);
bytes4[] memory sigs_ = getSigsSlot(slot_).value;
require(sigs_.length != 0, "implementation-not-exist");
for (uint256 i = 0; i < sigs_.length; i++) {
bytes32 sigSlot_ = _getSigsImplSlot(sigs_[i]);
delete getAddressSlot(sigSlot_).value;
}
delete getSigsSlot(slot_).value;
emit removeImplementationLog(implementation_);
}
/**
* @dev Returns bytes4[] sigs from implementation address. If implemenatation is not registered then returns empty array.
*/
function _getImplementationSigs(address implementation_)
internal
view
returns (bytes4[] memory)
{
bytes32 slot_ = _getImplSigsSlot(implementation_);
return getSigsSlot(slot_).value;
}
/**
* @dev Returns implementation address from bytes4 sig. If sig is not registered then returns address(0).
*/
function _getSigImplementation(bytes4 sig_)
internal
view
returns (address implementation_)
{
bytes32 slot_ = _getSigsImplSlot(sig_);
return getAddressSlot(slot_).value;
}
/**
* @dev Returns the current admin.
*/
function _getAdmin() internal view returns (address) {
return getAddressSlot(_ADMIN_SLOT).value;
}
/**
* @dev Returns the current dummy-implementation.
*/
function _getDummyImplementation() internal view returns (address) {
return getAddressSlot(_DUMMY_IMPLEMENTATION_SLOT).value;
}
/**
* @dev Stores a new address in the EIP1967 admin slot.
*/
function _setAdmin(address newAdmin_) internal {
address oldAdmin_ = _getAdmin();
require(
newAdmin_ != address(0),
"ERC1967: new admin is the zero address"
);
getAddressSlot(_ADMIN_SLOT).value = newAdmin_;
emit setAdminLog(oldAdmin_, newAdmin_);
}
/**
* @dev Stores a new address in the EIP1967 implementation slot.
*/
function _setDummyImplementation(address newDummyImplementation_) internal {
address oldDummyImplementation_ = _getDummyImplementation();
getAddressSlot(_DUMMY_IMPLEMENTATION_SLOT)
.value = newDummyImplementation_;
emit setDummyImplementationLog(
oldDummyImplementation_,
newDummyImplementation_
);
}
/**
* @dev Delegates the current call to `implementation`.
*
* This function does not return to its internall call site, it will return directly to the external caller.
*/
function _delegate(address implementation_) internal {
// solhint-disable-next-line no-inline-assembly
assembly {
// Copy msg.data. We take full control of memory in this inline assembly
// block because it will not return to Solidity code. We overwrite the
// Solidity scratch pad at memory position 0.
calldatacopy(0, 0, calldatasize())
// Call the implementation.
// out and outsize are 0 because we don't know the size yet.
let result := delegatecall(
gas(),
implementation_,
0,
calldatasize(),
0,
0
)
// Copy the returned data.
returndatacopy(0, 0, returndatasize())
switch result
// delegatecall returns 0 on error.
case 0 {
revert(0, returndatasize())
}
default {
return(0, returndatasize())
}
}
}
/**
* @dev Delegates the current call to the address returned by Implementations registry.
*
* This function does not return to its internall call site, it will return directly to the external caller.
*/
function _fallback(bytes4 sig_) internal {
address implementation_ = _getSigImplementation(sig_);
require(
implementation_ != address(0),
"Liquidity: Not able to find implementation_"
);
_delegate(implementation_);
}
}
contract AdminStuff is Internals {
/**
* @dev Only admin gaurd.
*/
modifier onlyAdmin() {
require(msg.sender == _getAdmin(), "not-the-admin");
_;
}
/**
* @dev Sets new admin.
*/
function setAdmin(address newAdmin_) external onlyAdmin {
_setAdmin(newAdmin_);
}
/**
* @dev Sets new dummy-implementation.
*/
function setDummyImplementation(address newDummyImplementation_)
external
onlyAdmin
{
_setDummyImplementation(newDummyImplementation_);
}
/**
* @dev Adds new implementation address.
*/
function addImplementation(address implementation_, bytes4[] calldata sigs_)
external
onlyAdmin
{
_setImplementationSigs(implementation_, sigs_);
}
/**
* @dev Removes an existing implementation address.
*/
function removeImplementation(address implementation_) external onlyAdmin {
_removeImplementationSigs(implementation_);
}
constructor(address admin_, address dummyImplementation_) {
_setAdmin(admin_);
_setDummyImplementation(dummyImplementation_);
}
}
abstract contract Proxy is AdminStuff {
constructor(address admin_, address dummyImplementation_)
AdminStuff(admin_, dummyImplementation_)
{}
/**
* @dev Returns admin's address.
*/
function getAdmin() external view returns (address) {
return _getAdmin();
}
/**
* @dev Returns dummy-implementations's address.
*/
function getDummyImplementation() external view returns (address) {
return _getDummyImplementation();
}
/**
* @dev Returns bytes4[] sigs from implementation address If not registered then returns empty array.
*/
function getImplementationSigs(address impl_)
external
view
returns (bytes4[] memory)
{
return _getImplementationSigs(impl_);
}
/**
* @dev Returns implementation address from bytes4 sig. If sig is not registered then returns address(0).
*/
function getSigsImplementation(bytes4 sig_)
external
view
returns (address)
{
return _getSigImplementation(sig_);
}
/**
* @dev Fallback function that delegates calls to the address returned by Implementations registry.
*/
fallback() external payable {
_fallback(msg.sig);
}
/**
* @dev Fallback function that delegates calls to the address returned by Implementations registry.
*/
receive() external payable {
if (msg.sig != 0x00000000) {
_fallback(msg.sig);
}
}
}
Compiler Settings
{"remappings":[],"optimizer":{"runs":200,"enabled":true},"metadata":{"bytecodeHash":"ipfs"},"libraries":{},"evmVersion":"berlin","compilationTarget":{"contracts/core/proxy/infiniteProxy.sol":"InstaVault"}}
Contract ABI
[{"type":"constructor","stateMutability":"nonpayable","inputs":[{"type":"address","name":"admin_","internalType":"address"},{"type":"address","name":"dummyImplementation_","internalType":"address"}]},{"type":"event","name":"removeImplementationLog","inputs":[{"type":"address","name":"implementation_","internalType":"address","indexed":false}],"anonymous":false},{"type":"event","name":"setAdminLog","inputs":[{"type":"address","name":"oldAdmin_","internalType":"address","indexed":false},{"type":"address","name":"newAdmin_","internalType":"address","indexed":false}],"anonymous":false},{"type":"event","name":"setDummyImplementationLog","inputs":[{"type":"address","name":"oldDummyImplementation_","internalType":"address","indexed":false},{"type":"address","name":"newDummyImplementation_","internalType":"address","indexed":false}],"anonymous":false},{"type":"event","name":"setImplementationLog","inputs":[{"type":"address","name":"implementation_","internalType":"address","indexed":false},{"type":"bytes4[]","name":"sigs_","internalType":"bytes4[]","indexed":false}],"anonymous":false},{"type":"fallback","stateMutability":"payable"},{"type":"function","stateMutability":"nonpayable","outputs":[],"name":"addImplementation","inputs":[{"type":"address","name":"implementation_","internalType":"address"},{"type":"bytes4[]","name":"sigs_","internalType":"bytes4[]"}]},{"type":"function","stateMutability":"view","outputs":[{"type":"address","name":"","internalType":"address"}],"name":"getAdmin","inputs":[]},{"type":"function","stateMutability":"view","outputs":[{"type":"address","name":"","internalType":"address"}],"name":"getDummyImplementation","inputs":[]},{"type":"function","stateMutability":"view","outputs":[{"type":"bytes4[]","name":"","internalType":"bytes4[]"}],"name":"getImplementationSigs","inputs":[{"type":"address","name":"impl_","internalType":"address"}]},{"type":"function","stateMutability":"view","outputs":[{"type":"address","name":"","internalType":"address"}],"name":"getSigsImplementation","inputs":[{"type":"bytes4","name":"sig_","internalType":"bytes4"}]},{"type":"function","stateMutability":"nonpayable","outputs":[],"name":"removeImplementation","inputs":[{"type":"address","name":"implementation_","internalType":"address"}]},{"type":"function","stateMutability":"nonpayable","outputs":[],"name":"setAdmin","inputs":[{"type":"address","name":"newAdmin_","internalType":"address"}]},{"type":"function","stateMutability":"nonpayable","outputs":[],"name":"setDummyImplementation","inputs":[{"type":"address","name":"newDummyImplementation_","internalType":"address"}]},{"type":"receive","stateMutability":"payable"}]
Contract Creation Code
0x60806040523480156200001157600080fd5b506040516200106138038062001061833981016040819052620000349162000208565b8181818162000043826200005a565b6200004e816200013e565b50505050505062000240565b600062000066620001b1565b90506001600160a01b038216620000d25760405162461bcd60e51b815260206004820152602660248201527f455243313936373a206e65772061646d696e20697320746865207a65726f206160448201526564647265737360d01b606482015260840160405180910390fd5b816000805160206200102183398151915280546001600160a01b0319166001600160a01b0392831617905560408051838316815291841660208301527fa2010e522d52edde51a4dcbc8241004a97a55844cfa6823ddabbb3cafe993a6291015b60405180910390a15050565b60006200014a620001d3565b9050816000805160206200104183398151915280546001600160a01b0319166001600160a01b0392831617905560408051838316815291841660208301527fa0dd191daed6af360e85495ba5fa09c213452c3cda2f13e995775d5756deda00910162000132565b6000600080516020620010218339815191525b546001600160a01b0316919050565b600060008051602062001041833981519152620001c4565b80516001600160a01b03811681146200020357600080fd5b919050565b600080604083850312156200021c57600080fd5b6200022783620001eb565b91506200023760208401620001eb565b90509250929050565b610dd180620002506000396000f3fe60806040526004361061007f5760003560e01c8063908bfe5e1161004e578063908bfe5e14610161578063a5fcc8bc14610176578063c39aa07d14610196578063f0c01b42146101b6576100ad565b806322175a32146100c25780636e9960c3146100e2578063704b6c021461011457806389396dc814610134576100ad565b366100ad576001600160e01b031960003516156100ab576100ab6000356001600160e01b0319166101d6565b005b6100ab6000356001600160e01b0319166101d6565b3480156100ce57600080fd5b506100ab6100dd366004610b34565b61025f565b3480156100ee57600080fd5b506100f76102a3565b6040516001600160a01b0390911681526020015b60405180910390f35b34801561012057600080fd5b506100ab61012f366004610b34565b6102b2565b34801561014057600080fd5b5061015461014f366004610b34565b6102f3565b60405161010b9190610c77565b34801561016d57600080fd5b506100f7610304565b34801561018257600080fd5b506100f7610191366004610bdc565b61030e565b3480156101a257600080fd5b506100ab6101b1366004610b34565b610319565b3480156101c257600080fd5b506100ab6101d1366004610b56565b61035a565b60006101e1826103d4565b90506001600160a01b0381166102525760405162461bcd60e51b815260206004820152602b60248201527f4c69717569646974793a204e6f742061626c6520746f2066696e6420696d706c60448201526a656d656e746174696f6e5f60a81b60648201526084015b60405180910390fd5b61025b816103f1565b5050565b610267610415565b6001600160a01b0316336001600160a01b0316146102975760405162461bcd60e51b815260040161024990610d35565b6102a081610448565b50565b60006102ad610415565b905090565b6102ba610415565b6001600160a01b0316336001600160a01b0316146102ea5760405162461bcd60e51b815260040161024990610d35565b6102a0816105c3565b60606102fe826106b1565b92915050565b60006102ad610742565b60006102fe826103d4565b610321610415565b6001600160a01b0316336001600160a01b0316146103515760405162461bcd60e51b815260040161024990610d35565b6102a08161076a565b610362610415565b6001600160a01b0316336001600160a01b0316146103925760405162461bcd60e51b815260040161024990610d35565b6103cf838383808060200260200160405190810160405280939291908181526020018383602002808284376000920191909152506107eb92505050565b505050565b6000806103e0836109ef565b546001600160a01b03169392505050565b3660008037600080366000845af43d6000803e808015610410573d6000f35b3d6000fd5b60007fb53127684a568b3173ae13b9f8a6016e243e63b6e8ee1178d6a717850b5d61035b546001600160a01b0316919050565b600061045382610a1f565b90506000818054604080516020808402820181019092528281529291908301828280156104cc57602002820191906000526020600020906000905b82829054906101000a900460e01b6001600160e01b0319168152602001906004019060208260030104928301926001038202915080841161048e5790505b505050505090508051600014156105255760405162461bcd60e51b815260206004820152601860248201527f696d706c656d656e746174696f6e2d6e6f742d657869737400000000000000006044820152606401610249565b60005b815181101561057657600061055583838151811061054857610548610d85565b60200260200101516109ef565b80546001600160a01b0319169055508061056e81610d5c565b915050610528565b50610582826000610a32565b6040516001600160a01b03841681527fd854fc630d6476d1ad6df14d295fdb83c1464a63cf75d456f14cd75353696ed39060200160405180910390a1505050565b60006105cd610415565b90506001600160a01b0382166106345760405162461bcd60e51b815260206004820152602660248201527f455243313936373a206e65772061646d696e20697320746865207a65726f206160448201526564647265737360d01b6064820152608401610249565b817fb53127684a568b3173ae13b9f8a6016e243e63b6e8ee1178d6a717850b5d610380546001600160a01b0319166001600160a01b0392831617905560408051838316815291841660208301527fa2010e522d52edde51a4dcbc8241004a97a55844cfa6823ddabbb3cafe993a6291015b60405180910390a15050565b606060006106be83610a1f565b90508080546040805160208084028201810190925282815292919083018282801561073557602002820191906000526020600020906000905b82829054906101000a900460e01b6001600160e01b031916815260200190600401906020826003010492830192600103820291508084116106f75790505b5050505050915050919050565b60007f360894a13ba1a3210667c828492db98dca3e2076cc3735a920a3ca505d382bbc610439565b6000610774610742565b9050817f360894a13ba1a3210667c828492db98dca3e2076cc3735a920a3ca505d382bbc80546001600160a01b0319166001600160a01b0392831617905560408051838316815291841660208301527fa0dd191daed6af360e85495ba5fa09c213452c3cda2f13e995775d5756deda0091016106a5565b80516108235760405162461bcd60e51b81526020600482015260076024820152666e6f2d7369677360c81b6044820152606401610249565b600061082e83610a1f565b90506000818054604080516020808402820181019092528281529291908301828280156108a757602002820191906000526020600020906000905b82829054906101000a900460e01b6001600160e01b031916815260200190600401906020826003010492830192600103820291508084116108695790505b5050505050905080516000146108ff5760405162461bcd60e51b815260206004820152601c60248201527f696d706c656d656e746174696f6e2d616c72656164792d6578697374000000006044820152606401610249565b60005b835181101561099d57600061092285838151811061054857610548610d85565b9050600081546001600160a01b0316146109725760405162461bcd60e51b81526020600482015260116024820152701cda59cb585b1c9958591e4b595e1a5cdd607a1b6044820152606401610249565b80546001600160a01b0319166001600160a01b0387161790558061099581610d5c565b915050610902565b50828281516109af9260200190610a57565b507f955f674d8fbada18242ae4d19f71c66ce496150270d0c82520ab4b40ce61d1af84846040516109e1929190610c4b565b60405180910390a150505050565b600081604051602001610a029190610ce1565b604051602081830303815290604052805190602001209050919050565b600081604051602001610a029190610c8a565b5080546000825560070160089004906000526020600020908101906102a09190610b03565b82805482825590600052602060002090600701600890048101928215610af35791602002820160005b83821115610ac157835183826101000a81548163ffffffff021916908360e01c02179055509260200192600401602081600301049283019260010302610a80565b8015610af15782816101000a81549063ffffffff0219169055600401602081600301049283019260010302610ac1565b505b50610aff929150610b03565b5090565b5b80821115610aff5760008155600101610b04565b80356001600160a01b0381168114610b2f57600080fd5b919050565b600060208284031215610b4657600080fd5b610b4f82610b18565b9392505050565b600080600060408486031215610b6b57600080fd5b610b7484610b18565b9250602084013567ffffffffffffffff80821115610b9157600080fd5b818601915086601f830112610ba557600080fd5b813581811115610bb457600080fd5b8760208260051b8501011115610bc957600080fd5b6020830194508093505050509250925092565b600060208284031215610bee57600080fd5b81356001600160e01b031981168114610b4f57600080fd5b600081518084526020808501945080840160005b83811015610c405781516001600160e01b03191687529582019590820190600101610c1a565b509495945050505050565b6001600160a01b0383168152604060208201819052600090610c6f90830184610c06565b949350505050565b602081526000610b4f6020830184610c06565b604081526000610cc760408301601c81527f656970313936372e70726f78792e696d706c656d656e746174696f6e00000000602082015260400190565b6001600160a01b0393909316602092909201919091525090565b604081526000610d1e60408301601c81527f656970313936372e70726f78792e696d706c656d656e746174696f6e00000000602082015260400190565b905063ffffffff60e01b8316602083015292915050565b6020808252600d908201526c3737ba16ba343296b0b236b4b760991b604082015260600190565b6000600019821415610d7e57634e487b7160e01b600052601160045260246000fd5b5060010190565b634e487b7160e01b600052603260045260246000fdfea264697066735822122008555c4a0a3da1af739b3f2cc93701c583da767f0f6208b71609ff03b7b37f7264736f6c63430008060033b53127684a568b3173ae13b9f8a6016e243e63b6e8ee1178d6a717850b5d6103360894a13ba1a3210667c828492db98dca3e2076cc3735a920a3ca505d382bbc00000000000000000000000085b40eb65e49eb61de78a3a989752249f8837fc500000000000000000000000071a990035d6126e520bbb939ea00dbf455a912e6
Deployed ByteCode
0x60806040526004361061007f5760003560e01c8063908bfe5e1161004e578063908bfe5e14610161578063a5fcc8bc14610176578063c39aa07d14610196578063f0c01b42146101b6576100ad565b806322175a32146100c25780636e9960c3146100e2578063704b6c021461011457806389396dc814610134576100ad565b366100ad576001600160e01b031960003516156100ab576100ab6000356001600160e01b0319166101d6565b005b6100ab6000356001600160e01b0319166101d6565b3480156100ce57600080fd5b506100ab6100dd366004610b34565b61025f565b3480156100ee57600080fd5b506100f76102a3565b6040516001600160a01b0390911681526020015b60405180910390f35b34801561012057600080fd5b506100ab61012f366004610b34565b6102b2565b34801561014057600080fd5b5061015461014f366004610b34565b6102f3565b60405161010b9190610c77565b34801561016d57600080fd5b506100f7610304565b34801561018257600080fd5b506100f7610191366004610bdc565b61030e565b3480156101a257600080fd5b506100ab6101b1366004610b34565b610319565b3480156101c257600080fd5b506100ab6101d1366004610b56565b61035a565b60006101e1826103d4565b90506001600160a01b0381166102525760405162461bcd60e51b815260206004820152602b60248201527f4c69717569646974793a204e6f742061626c6520746f2066696e6420696d706c60448201526a656d656e746174696f6e5f60a81b60648201526084015b60405180910390fd5b61025b816103f1565b5050565b610267610415565b6001600160a01b0316336001600160a01b0316146102975760405162461bcd60e51b815260040161024990610d35565b6102a081610448565b50565b60006102ad610415565b905090565b6102ba610415565b6001600160a01b0316336001600160a01b0316146102ea5760405162461bcd60e51b815260040161024990610d35565b6102a0816105c3565b60606102fe826106b1565b92915050565b60006102ad610742565b60006102fe826103d4565b610321610415565b6001600160a01b0316336001600160a01b0316146103515760405162461bcd60e51b815260040161024990610d35565b6102a08161076a565b610362610415565b6001600160a01b0316336001600160a01b0316146103925760405162461bcd60e51b815260040161024990610d35565b6103cf838383808060200260200160405190810160405280939291908181526020018383602002808284376000920191909152506107eb92505050565b505050565b6000806103e0836109ef565b546001600160a01b03169392505050565b3660008037600080366000845af43d6000803e808015610410573d6000f35b3d6000fd5b60007fb53127684a568b3173ae13b9f8a6016e243e63b6e8ee1178d6a717850b5d61035b546001600160a01b0316919050565b600061045382610a1f565b90506000818054604080516020808402820181019092528281529291908301828280156104cc57602002820191906000526020600020906000905b82829054906101000a900460e01b6001600160e01b0319168152602001906004019060208260030104928301926001038202915080841161048e5790505b505050505090508051600014156105255760405162461bcd60e51b815260206004820152601860248201527f696d706c656d656e746174696f6e2d6e6f742d657869737400000000000000006044820152606401610249565b60005b815181101561057657600061055583838151811061054857610548610d85565b60200260200101516109ef565b80546001600160a01b0319169055508061056e81610d5c565b915050610528565b50610582826000610a32565b6040516001600160a01b03841681527fd854fc630d6476d1ad6df14d295fdb83c1464a63cf75d456f14cd75353696ed39060200160405180910390a1505050565b60006105cd610415565b90506001600160a01b0382166106345760405162461bcd60e51b815260206004820152602660248201527f455243313936373a206e65772061646d696e20697320746865207a65726f206160448201526564647265737360d01b6064820152608401610249565b817fb53127684a568b3173ae13b9f8a6016e243e63b6e8ee1178d6a717850b5d610380546001600160a01b0319166001600160a01b0392831617905560408051838316815291841660208301527fa2010e522d52edde51a4dcbc8241004a97a55844cfa6823ddabbb3cafe993a6291015b60405180910390a15050565b606060006106be83610a1f565b90508080546040805160208084028201810190925282815292919083018282801561073557602002820191906000526020600020906000905b82829054906101000a900460e01b6001600160e01b031916815260200190600401906020826003010492830192600103820291508084116106f75790505b5050505050915050919050565b60007f360894a13ba1a3210667c828492db98dca3e2076cc3735a920a3ca505d382bbc610439565b6000610774610742565b9050817f360894a13ba1a3210667c828492db98dca3e2076cc3735a920a3ca505d382bbc80546001600160a01b0319166001600160a01b0392831617905560408051838316815291841660208301527fa0dd191daed6af360e85495ba5fa09c213452c3cda2f13e995775d5756deda0091016106a5565b80516108235760405162461bcd60e51b81526020600482015260076024820152666e6f2d7369677360c81b6044820152606401610249565b600061082e83610a1f565b90506000818054604080516020808402820181019092528281529291908301828280156108a757602002820191906000526020600020906000905b82829054906101000a900460e01b6001600160e01b031916815260200190600401906020826003010492830192600103820291508084116108695790505b5050505050905080516000146108ff5760405162461bcd60e51b815260206004820152601c60248201527f696d706c656d656e746174696f6e2d616c72656164792d6578697374000000006044820152606401610249565b60005b835181101561099d57600061092285838151811061054857610548610d85565b9050600081546001600160a01b0316146109725760405162461bcd60e51b81526020600482015260116024820152701cda59cb585b1c9958591e4b595e1a5cdd607a1b6044820152606401610249565b80546001600160a01b0319166001600160a01b0387161790558061099581610d5c565b915050610902565b50828281516109af9260200190610a57565b507f955f674d8fbada18242ae4d19f71c66ce496150270d0c82520ab4b40ce61d1af84846040516109e1929190610c4b565b60405180910390a150505050565b600081604051602001610a029190610ce1565b604051602081830303815290604052805190602001209050919050565b600081604051602001610a029190610c8a565b5080546000825560070160089004906000526020600020908101906102a09190610b03565b82805482825590600052602060002090600701600890048101928215610af35791602002820160005b83821115610ac157835183826101000a81548163ffffffff021916908360e01c02179055509260200192600401602081600301049283019260010302610a80565b8015610af15782816101000a81549063ffffffff0219169055600401602081600301049283019260010302610ac1565b505b50610aff929150610b03565b5090565b5b80821115610aff5760008155600101610b04565b80356001600160a01b0381168114610b2f57600080fd5b919050565b600060208284031215610b4657600080fd5b610b4f82610b18565b9392505050565b600080600060408486031215610b6b57600080fd5b610b7484610b18565b9250602084013567ffffffffffffffff80821115610b9157600080fd5b818601915086601f830112610ba557600080fd5b813581811115610bb457600080fd5b8760208260051b8501011115610bc957600080fd5b6020830194508093505050509250925092565b600060208284031215610bee57600080fd5b81356001600160e01b031981168114610b4f57600080fd5b600081518084526020808501945080840160005b83811015610c405781516001600160e01b03191687529582019590820190600101610c1a565b509495945050505050565b6001600160a01b0383168152604060208201819052600090610c6f90830184610c06565b949350505050565b602081526000610b4f6020830184610c06565b604081526000610cc760408301601c81527f656970313936372e70726f78792e696d706c656d656e746174696f6e00000000602082015260400190565b6001600160a01b0393909316602092909201919091525090565b604081526000610d1e60408301601c81527f656970313936372e70726f78792e696d706c656d656e746174696f6e00000000602082015260400190565b905063ffffffff60e01b8316602083015292915050565b6020808252600d908201526c3737ba16ba343296b0b236b4b760991b604082015260600190565b6000600019821415610d7e57634e487b7160e01b600052601160045260246000fd5b5060010190565b634e487b7160e01b600052603260045260246000fdfea264697066735822122008555c4a0a3da1af739b3f2cc93701c583da767f0f6208b71609ff03b7b37f7264736f6c63430008060033