Source Code
Overview
ETH Balance
0 ETH
More Info
ContractCreator
Multichain Info
N/A
Latest 22 internal transactions
Parent Transaction Hash | Block | From | To | |||
---|---|---|---|---|---|---|
4163728 | 18 days ago | 0 ETH | ||||
4163728 | 18 days ago | 0 ETH | ||||
4163728 | 18 days ago | Contract Creation | 0 ETH | |||
4163728 | 18 days ago | 0 ETH | ||||
4163728 | 18 days ago | 0 ETH | ||||
4163109 | 18 days ago | 0 ETH | ||||
4163109 | 18 days ago | 0 ETH | ||||
4163109 | 18 days ago | Contract Creation | 0 ETH | |||
4163109 | 18 days ago | 0 ETH | ||||
4163109 | 18 days ago | 0 ETH | ||||
4156779 | 18 days ago | 0 ETH | ||||
4156779 | 18 days ago | 0 ETH | ||||
4156779 | 18 days ago | Contract Creation | 0 ETH | |||
4156779 | 18 days ago | 0 ETH | ||||
4156779 | 18 days ago | 0 ETH | ||||
4156779 | 18 days ago | Contract Creation | 0 ETH | |||
4156779 | 18 days ago | 0 ETH | ||||
4156779 | 18 days ago | 0 ETH | ||||
4156779 | 18 days ago | Contract Creation | 0 ETH | |||
4156779 | 18 days ago | 0 ETH | ||||
4156779 | 18 days ago | 0 ETH | ||||
4156779 | 18 days ago | Contract Creation | 0 ETH |
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 Source Code Verified (Exact Match)
Contract Name:
ERC1967Factory
Compiler Version
v0.8.28+commit.7893614a
ZkSolc Version
v1.5.7
Optimization Enabled:
Yes with Mode 3
Other Settings:
cancun EvmVersion
Contract Source Code (Solidity Standard Json-Input format)
// SPDX-License-Identifier: MIT pragma solidity ^0.8.4; import {ERC1967Proxy} from "./ERC1967Proxy.sol"; import {UpgradeableBeacon} from "./UpgradeableBeacon.sol"; import {ERC1967BeaconProxy} from "./ERC1967BeaconProxy.sol"; /// @notice A factory for deploying minimal ERC1967 proxies on ZKsync. /// @author Solady (https://github.com/vectorized/solady/blob/main/src/utils/ext/zksync/ERC1967Factory.sol) /// /// @dev This factory can be used in one of the following ways: /// 1. Deploying a fresh copy with each contract. /// Easier to test. In ZKsync VM, factory dependency bytecode is not included in the /// factory bytecode, so you do not need to worry too much about bytecode size limits. /// 2. Loading it from a storage variable which is set to the canonical address. /// See: ERC1967FactoryConstants.ADDRESS. /// /// This factory is crafted to be compatible with both ZKsync VM and regular EVM. /// This is so that when ZKsync achieves full EVM equivalence, /// this factory can still be used via the fresh copy per contract way. contract ERC1967Factory { /*´:°•.°+.*•´.*:˚.°*.˚•´.°:°•.°•.*•´.*:˚.°*.˚•´.°:°•.°+.*•´.*:*/ /* CUSTOM ERRORS */ /*.•°:°.´+˚.*°.˚:*.´•*.+°.•°:´*.´•*.•°.•°:°.´:•˚°.*°.˚:*.´+°.•*/ /// @dev The caller is not authorized to call the function. error Unauthorized(); /// @dev The proxy deployment failed. error DeploymentFailed(); /// @dev The upgrade failed. error UpgradeFailed(); /// @dev The salt does not start with the caller. error SaltDoesNotStartWithCaller(); /// @dev No initialization code hash exists for the instance hash. error NoInitCodeHashFound(); /*´:°•.°+.*•´.*:˚.°*.˚•´.°:°•.°•.*•´.*:˚.°*.˚•´.°:°•.°+.*•´.*:*/ /* EVENTS */ /*.•°:°.´+˚.*°.˚:*.´•*.+°.•°:´*.´•*.•°.•°:°.´:•˚°.*°.˚:*.´+°.•*/ /// @dev The admin of a `instance` has been changed. Applies to both proxies and beacons. event AdminChanged(address indexed instance, address indexed admin); /// @dev The implementation for `instance` has been upgraded. Applies to both proxies and beacons. event Upgraded(address indexed instance, address indexed implementation); /// @dev A proxy has been deployed. event ProxyDeployed( address indexed proxy, address indexed implementation, address indexed admin ); /// @dev A beacon has been deployed. event BeaconDeployed( address indexed beacon, address indexed implementation, address indexed admin ); /// @dev A beacon proxy has been deployed. event BeaconProxyDeployed(address indexed beaconProxy, address indexed beacon); /*´:°•.°+.*•´.*:˚.°*.˚•´.°:°•.°•.*•´.*:˚.°*.˚•´.°:°•.°+.*•´.*:*/ /* STORAGE */ /*.•°:°.´+˚.*°.˚:*.´•*.+°.•°:´*.´•*.•°.•°:°.´:•˚°.*°.˚:*.´+°.•*/ /// @dev The hash of the proxy. bytes32 public proxyHash; /// @dev The hash of the upgradeable beacon. bytes32 public beaconHash; /// @dev The hash of the beacon proxy. bytes32 public beaconProxyHash; /// @dev Whether to use the CREATE2 address prediction workflow for ZKsync VM. bool internal _useZKsyncCreate2Prediction; /// @dev Maps the instance hash to the initialization code hash. mapping(bytes32 => bytes32) internal _initCodeHashes; /*´:°•.°+.*•´.*:˚.°*.˚•´.°:°•.°•.*•´.*:˚.°*.˚•´.°:°•.°+.*•´.*:*/ /* CONSTRUCTOR */ /*.•°:°.´+˚.*°.˚:*.´•*.+°.•°:´*.´•*.•°.•°:°.´:•˚°.*°.˚:*.´+°.•*/ constructor() payable { bytes32 proxySalt = keccak256(abi.encode(address(this), bytes32("proxySalt"))); address proxyAddress = address(new ERC1967Proxy{salt: proxySalt}()); proxyHash = _extcodehash(proxyAddress); beaconHash = _extcodehash(address(new UpgradeableBeacon())); beaconProxyHash = _extcodehash(address(new ERC1967BeaconProxy())); if (_predictDeterministicAddressZKsync(proxyHash, proxySalt) == proxyAddress) { _useZKsyncCreate2Prediction = true; } else { _initCodeHashes[proxyHash] = keccak256(type(ERC1967Proxy).creationCode); _initCodeHashes[beaconHash] = keccak256(type(UpgradeableBeacon).creationCode); _initCodeHashes[beaconProxyHash] = keccak256(type(ERC1967BeaconProxy).creationCode); } } /*´:°•.°+.*•´.*:˚.°*.˚•´.°:°•.°•.*•´.*:˚.°*.˚•´.°:°•.°+.*•´.*:*/ /* ADMIN FUNCTIONS */ /*.•°:°.´+˚.*°.˚:*.´•*.+°.•°:´*.´•*.•°.•°:°.´:•˚°.*°.˚:*.´+°.•*/ /// @dev Returns the admin of the `instance`. /// Returns `address(0)` if `instance` is a beacon proxy. /// Works for both proxies and beacons. function adminOf(address instance) public view returns (address admin) { /// @solidity memory-safe-assembly assembly { admin := mul(sload(instance), gt(instance, 0xff)) } } /// @dev Sets the admin of the `instance`. /// The caller of this function must be the admin of `instance`. /// Works for both proxies and beacons. function changeAdmin(address instance, address admin) public { /// @solidity memory-safe-assembly assembly { if iszero(eq(sload(instance), caller())) { mstore(0x00, 0x82b42900) // `Unauthorized()`. revert(0x1c, 0x04) } sstore(instance, admin) } emit AdminChanged(instance, admin); } /*´:°•.°+.*•´.*:˚.°*.˚•´.°:°•.°•.*•´.*:˚.°*.˚•´.°:°•.°+.*•´.*:*/ /* UPGRADE FUNCTIONS */ /*.•°:°.´+˚.*°.˚:*.´•*.+°.•°:´*.´•*.•°.•°:°.´:•˚°.*°.˚:*.´+°.•*/ /// @dev Upgrades `instance` to point to `implementation`. /// The caller of this function must be the admin of `instance`. /// Works for both proxies and beacons. function upgrade(address instance, address implementation) public payable { upgradeAndCall(instance, implementation, _emptyData()); } /// @dev Upgrades `instance` to point to `implementation`. /// Then, calls it with abi encoded `data`. /// The caller of this function must be the admin of `instance`. /// Works for both proxies and beacons. function upgradeAndCall(address instance, address implementation, bytes calldata data) public payable { /// @solidity memory-safe-assembly assembly { if iszero(eq(sload(instance), caller())) { mstore(0x00, 0x82b42900) // `Unauthorized()`. revert(0x1c, 0x04) } let m := mload(0x40) mstore(m, implementation) calldatacopy(add(m, 0x20), data.offset, data.length) if iszero(call(gas(), instance, callvalue(), m, add(0x20, data.length), 0x00, 0x00)) { if iszero(returndatasize()) { mstore(0x00, 0x55299b49) // `UpgradeFailed()`. revert(0x1c, 0x04) } returndatacopy(0x00, 0x00, returndatasize()) revert(0x00, returndatasize()) } } emit Upgraded(instance, implementation); } /*´:°•.°+.*•´.*:˚.°*.˚•´.°:°•.°•.*•´.*:˚.°*.˚•´.°:°•.°+.*•´.*:*/ /* PROXY DEPLOYMENT */ /*.•°:°.´+˚.*°.˚:*.´•*.+°.•°:´*.´•*.•°.•°:°.´:•˚°.*°.˚:*.´+°.•*/ /// @dev Deploys a proxy for `implementation`, with `admin`, and returns its address. /// The value passed into this function will be forwarded to the proxu. function deployProxy(address implementation, address admin) public payable returns (address) { return deployProxyAndCall(implementation, admin, _emptyData()); } /// @dev Deploys a proxy for `implementation`, with `admin`, and returns its address. /// The value passed into this function will be forwarded to the proxu. /// Then, calls the proxy with abi encoded `data`. function deployProxyAndCall(address implementation, address admin, bytes calldata data) public payable returns (address) { return _deploy(0, uint160(implementation), uint160(admin), "", false, data); } /// @dev Deploys a proxy for `implementation`, with `admin`, `salt`, /// and returns its deterministic address. /// The value passed into this function will be forwarded to the proxy. function deployProxyDeterministic(address implementation, address admin, bytes32 salt) public payable returns (address) { return deployProxyDeterministicAndCall(implementation, admin, salt, _emptyData()); } /// @dev Deploys a proxy for `implementation`, with `admin`, `salt`, /// and returns its deterministic address. /// The value passed into this function will be forwarded to the proxy. /// Then, calls the proxy with abi encoded `data`. function deployProxyDeterministicAndCall( address implementation, address admin, bytes32 salt, bytes calldata data ) public payable returns (address) { return _deploy(0, uint160(implementation), uint160(admin), salt, true, data); } /*´:°•.°+.*•´.*:˚.°*.˚•´.°:°•.°•.*•´.*:˚.°*.˚•´.°:°•.°+.*•´.*:*/ /* BEACON DEPLOYMENT */ /*.•°:°.´+˚.*°.˚:*.´•*.+°.•°:´*.´•*.•°.•°:°.´:•˚°.*°.˚:*.´+°.•*/ /// @dev Deploys a beacon with `implementation` and `admin`, and returns its address. function deployBeacon(address implementation, address admin) public returns (address) { return _deploy(1, uint160(implementation), uint160(admin), "", false, _emptyData()); } /// @dev Deploys a beacon with `implementation` and `admin`, with `salt`, /// and returns its deterministic address. function deployBeaconDeterministic(address implementation, address admin, bytes32 salt) public payable returns (address) { return _deploy(1, uint160(implementation), uint160(admin), salt, true, _emptyData()); } /*´:°•.°+.*•´.*:˚.°*.˚•´.°:°•.°•.*•´.*:˚.°*.˚•´.°:°•.°+.*•´.*:*/ /* BEACON PROXY DEPLOYMENT */ /*.•°:°.´+˚.*°.˚:*.´•*.+°.•°:´*.´•*.•°.•°:°.´:•˚°.*°.˚:*.´+°.•*/ /// @dev Deploys a beacon proxy referring to `beacon`, and returns its address. /// The value passed into this function will be forwarded to the beacon proxy. function deployBeaconProxy(address beacon) public payable returns (address) { return deployBeaconProxyAndCall(beacon, _emptyData()); } /// @dev Deploys a beacon proxy referring to `beacon`, and returns its address. /// The value passed into this function will be forwarded to the beacon proxy. /// Then, calls the beacon proxy with abi encoded `data`. function deployBeaconProxyAndCall(address beacon, bytes calldata data) public payable returns (address) { return _deploy(2, uint160(beacon), 0, "", false, data); } /// @dev Deploys a beacon proxy referring to `beacon`, with `salt`, /// and returns its deterministic address. /// The value passed into this function will be forwarded to the beacon proxy. function deployBeaconProxyDeterministic(address beacon, bytes32 salt) public payable returns (address) { return deployBeaconProxyDeterministicAndCall(beacon, salt, _emptyData()); } /// @dev Deploys a beacon proxy referring to `beacon`, with `salt`, /// and returns its deterministic address. /// The value passed into this function will be forwarded to the beacon proxy. /// Then, calls the beacon proxy with abi encoded `data`. function deployBeaconProxyDeterministicAndCall( address beacon, bytes32 salt, bytes calldata data ) public payable returns (address) { return _deploy(2, uint160(beacon), 0, salt, true, data); } /*´:°•.°+.*•´.*:˚.°*.˚•´.°:°•.°•.*•´.*:˚.°*.˚•´.°:°•.°+.*•´.*:*/ /* PUBLIC HELPERS */ /*.•°:°.´+˚.*°.˚:*.´•*.+°.•°:´*.´•*.•°.•°:°.´:•˚°.*°.˚:*.´+°.•*/ /// @dev Returns the address of the instance deployed with `salt`. /// `instanceHash` is one of `proxyHash`, `beaconProxyHash`, `beaconHash`. function predictDeterministicAddress(bytes32 instanceHash, bytes32 salt) public view returns (address) { if (_useZKsyncCreate2Prediction) { return _predictDeterministicAddressZKsync(instanceHash, salt); } return _predictDeterministicAddressRegularEVM(instanceHash, salt); } /// @dev Returns the implementation of `instance`. /// If `instance` is not deployed, returns `address(0)`. function implementationOf(address instance) public view returns (address result) { bytes32 h = _extcodehash(instance); if (h == proxyHash || h == beaconProxyHash) { /// @solidity memory-safe-assembly assembly { let s := staticcall(gas(), instance, 0x00, 0x01, 0x00, 0x20) if iszero(and(gt(returndatasize(), 0x1f), s)) { revert(0x00, 0x00) } result := mload(0x00) } } else if (h == beaconHash) { /// @solidity memory-safe-assembly assembly { mstore(0x00, 0x5c60da1b) // `implementation()`. let s := staticcall(gas(), instance, 0x1c, 0x04, 0x00, 0x20) if iszero(and(gt(returndatasize(), 0x1f), s)) { revert(0x00, 0x00) } result := mload(0x00) } } } /*´:°•.°+.*•´.*:˚.°*.˚•´.°:°•.°•.*•´.*:˚.°*.˚•´.°:°•.°+.*•´.*:*/ /* INTERNAL HELPERS */ /*.•°:°.´+˚.*°.˚:*.´•*.+°.•°:´*.´•*.•°.•°:°.´:•˚°.*°.˚:*.´+°.•*/ /// @dev Validates the salt and returns it. function _validateSalt(bytes32 salt) internal view returns (bytes32) { /// @solidity memory-safe-assembly assembly { // If the salt does not start with the zero address or the caller. if iszero(or(iszero(shr(96, salt)), eq(caller(), shr(96, salt)))) { mstore(0x00, 0x2f634836) // `SaltDoesNotStartWithCaller()`. revert(0x1c, 0x04) } } return salt; } /// @dev Performs the deployment optionality to deploy deterministically with a `salt`. function _deploy( uint256 codeType, uint256 target, uint256 admin, bytes32 salt, bool useSalt, bytes calldata data ) internal returns (address instance) { if (codeType == 0) { instance = address( useSalt ? new ERC1967Proxy{salt: _validateSalt(salt)}() : new ERC1967Proxy() ); /// @solidity memory-safe-assembly assembly { sstore(instance, admin) } emit ProxyDeployed(instance, address(uint160(target)), address(uint160(admin))); } else if (codeType == 1) { instance = address( useSalt ? new UpgradeableBeacon{salt: _validateSalt(salt)}() : new UpgradeableBeacon() ); /// @solidity memory-safe-assembly assembly { sstore(instance, admin) } emit BeaconDeployed(instance, address(uint160(target)), address(uint160(admin))); } else { instance = address( useSalt ? new ERC1967BeaconProxy{salt: _validateSalt(salt)}() : new ERC1967BeaconProxy() ); emit BeaconProxyDeployed(instance, address(uint160(target))); } /// @solidity memory-safe-assembly assembly { // Revert if the creation fails. if iszero(instance) { mstore(0x00, 0x30116425) // `DeploymentFailed()`. revert(0x1c, 0x04) } // Make the initialization call. let m := mload(0x40) mstore(m, target) calldatacopy(add(m, 0x20), data.offset, data.length) if iszero(call(gas(), instance, callvalue(), m, add(0x20, data.length), 0x00, 0x00)) { // Revert with the `DeploymentFailed` selector if there is no error returndata. if iszero(returndatasize()) { mstore(0x00, 0x30116425) // `DeploymentFailed()`. revert(0x1c, 0x04) } // Otherwise, bubble up the returned error. returndatacopy(0x00, 0x00, returndatasize()) revert(0x00, returndatasize()) } } } /// @dev Returns the `extcodehash` of `instance`. function _extcodehash(address instance) internal view returns (bytes32 result) { /// @solidity memory-safe-assembly assembly { result := extcodehash(instance) } } /// @dev Helper function to return an empty bytes calldata. function _emptyData() internal pure returns (bytes calldata data) { /// @solidity memory-safe-assembly assembly { data.length := 0 } } /// @dev Returns the predicted `CREATE2` address on ZKsync VM. function _predictDeterministicAddressZKsync(bytes32 instanceHash, bytes32 salt) internal view returns (address predicted) { bytes32 prefix = keccak256("zksyncCreate2"); bytes32 emptyStringHash = keccak256(""); /// @solidity memory-safe-assembly assembly { // The following is `keccak256(abi.encode(...))`. let m := mload(0x40) mstore(m, prefix) mstore(add(m, 0x20), address()) mstore(add(m, 0x40), salt) mstore(add(m, 0x60), instanceHash) mstore(add(m, 0x80), emptyStringHash) predicted := keccak256(m, 0xa0) } } /// @dev Returns the predicted `CREATE2` address on regular EVM. function _predictDeterministicAddressRegularEVM(bytes32 instanceHash, bytes32 salt) internal view returns (address predicted) { bytes32 initCodeHash = _initCodeHashes[instanceHash]; /// @solidity memory-safe-assembly assembly { if iszero(initCodeHash) { mstore(0x00, 0xa3a58d1c) // `NoInitCodeHashFound()`. revert(0x1c, 0x04) } // The following is `keccak256(abi.encodePacked(...))`. mstore8(0x00, 0xff) // Write the prefix. mstore(0x35, initCodeHash) mstore(0x01, shl(96, address())) mstore(0x15, salt) predicted := keccak256(0x00, 0x55) mstore(0x35, 0) // Restore the overwritten part of the free memory pointer. } } }
// SPDX-License-Identifier: MIT pragma solidity ^0.8.4; /// @notice A sufficiently minimal ERC1967 proxy tailor-made for ZKsync. /// @author Solady (https://github.com/vectorized/solady/blob/main/src/utils/ext/zksync/ERC1967Proxy.sol) contract ERC1967Proxy { /*´:°•.°+.*•´.*:˚.°*.˚•´.°:°•.°•.*•´.*:˚.°*.˚•´.°:°•.°+.*•´.*:*/ /* EVENTS */ /*.•°:°.´+˚.*°.˚:*.´•*.+°.•°:´*.´•*.•°.•°:°.´:•˚°.*°.˚:*.´+°.•*/ /// @dev Emitted when the proxy's implementation is upgraded. event Upgraded(address indexed implementation); /// @dev `keccak256(bytes("Upgraded(address)"))`. uint256 private constant _UPGRADED_EVENT_SIGNATURE = 0xbc7cd75a20ee27fd9adebab32041f755214dbc6bffa90cc0225b39da2e5c2d3b; /*´:°•.°+.*•´.*:˚.°*.˚•´.°:°•.°•.*•´.*:˚.°*.˚•´.°:°•.°+.*•´.*:*/ /* STORAGE */ /*.•°:°.´+˚.*°.˚:*.´•*.+°.•°:´*.´•*.•°.•°:°.´:•˚°.*°.˚:*.´+°.•*/ /// @dev The ERC-1967 storage slot for the implementation in the proxy. /// `uint256(keccak256("eip1967.proxy.implementation")) - 1`. bytes32 internal constant _ERC1967_IMPLEMENTATION_SLOT = 0x360894a13ba1a3210667c828492db98dca3e2076cc3735a920a3ca505d382bbc; /// @dev The storage slot for the deployer. /// `uint256(keccak256("ERC1967Proxy.deployer")) - 1`. bytes32 internal constant _ERC1967_PROXY_DEPLOYER_SLOT = 0xc20b8dda59e1f49cae9bbc6c3744edc7900ba02880cd7b33b5b82a96197202ba; /*´:°•.°+.*•´.*:˚.°*.˚•´.°:°•.°•.*•´.*:˚.°*.˚•´.°:°•.°+.*•´.*:*/ /* CONSTRUCTOR */ /*.•°:°.´+˚.*°.˚:*.´•*.+°.•°:´*.´•*.•°.•°:°.´:•˚°.*°.˚:*.´+°.•*/ constructor() payable { /// @solidity memory-safe-assembly assembly { sstore(_ERC1967_PROXY_DEPLOYER_SLOT, caller()) } } /*´:°•.°+.*•´.*:˚.°*.˚•´.°:°•.°•.*•´.*:˚.°*.˚•´.°:°•.°+.*•´.*:*/ /* FALLBACK */ /*.•°:°.´+˚.*°.˚:*.´•*.+°.•°:´*.´•*.•°.•°:°.´:•˚°.*°.˚:*.´+°.•*/ fallback() external payable virtual { /// @solidity memory-safe-assembly assembly { mstore(0x40, 0) // Optimization trick to remove free memory pointer initialization. // For the special case of 1-byte calldata, return the implementation. if eq(calldatasize(), 1) { mstore(0x00, sload(_ERC1967_IMPLEMENTATION_SLOT)) return(0x00, 0x20) } // Deployer workflow. if eq(caller(), sload(_ERC1967_PROXY_DEPLOYER_SLOT)) { let newImplementation := calldataload(0x00) sstore(_ERC1967_IMPLEMENTATION_SLOT, newImplementation) if gt(calldatasize(), 0x20) { let n := sub(calldatasize(), 0x20) calldatacopy(0x00, 0x20, n) if iszero(delegatecall(gas(), newImplementation, 0x00, n, 0x00, 0x00)) { // Bubble up the revert if the call reverts. returndatacopy(0x00, 0x00, returndatasize()) revert(0x00, returndatasize()) } } // Emit the {Upgraded} event. log2(0x00, 0x00, _UPGRADED_EVENT_SIGNATURE, newImplementation) stop() // End the context. } // Perform the delegatecall. let implementation := sload(_ERC1967_IMPLEMENTATION_SLOT) calldatacopy(0x00, 0x00, calldatasize()) let s := delegatecall(gas(), implementation, 0x00, calldatasize(), 0x00, 0x00) returndatacopy(0x00, 0x00, returndatasize()) if iszero(s) { revert(0x00, returndatasize()) } return(0x00, returndatasize()) } } }
// SPDX-License-Identifier: MIT pragma solidity ^0.8.4; /// @notice A sufficiently minimal upgradeable beacon tailor-made for ZKsync. /// @author Solady (https://github.com/vectorized/solady/blob/main/src/utils/ext/zksync/UpgradeableBeacon.sol) contract UpgradeableBeacon { /*´:°•.°+.*•´.*:˚.°*.˚•´.°:°•.°•.*•´.*:˚.°*.˚•´.°:°•.°+.*•´.*:*/ /* EVENTS */ /*.•°:°.´+˚.*°.˚:*.´•*.+°.•°:´*.´•*.•°.•°:°.´:•˚°.*°.˚:*.´+°.•*/ /// @dev Emitted when the proxy's implementation is upgraded. event Upgraded(address indexed implementation); /// @dev `keccak256(bytes("Upgraded(address)"))`. uint256 private constant _UPGRADED_EVENT_SIGNATURE = 0xbc7cd75a20ee27fd9adebab32041f755214dbc6bffa90cc0225b39da2e5c2d3b; /*´:°•.°+.*•´.*:˚.°*.˚•´.°:°•.°•.*•´.*:˚.°*.˚•´.°:°•.°+.*•´.*:*/ /* STORAGE */ /*.•°:°.´+˚.*°.˚:*.´•*.+°.•°:´*.´•*.•°.•°:°.´:•˚°.*°.˚:*.´+°.•*/ /// @dev To store the implementation. uint256 private __implementation; /// @dev For upgrades / initialization. uint256 private __deployer; /*´:°•.°+.*•´.*:˚.°*.˚•´.°:°•.°•.*•´.*:˚.°*.˚•´.°:°•.°+.*•´.*:*/ /* CONSTRUCTOR */ /*.•°:°.´+˚.*°.˚:*.´•*.+°.•°:´*.´•*.•°.•°:°.´:•˚°.*°.˚:*.´+°.•*/ constructor() payable { __deployer = uint256(uint160(msg.sender)); } /*´:°•.°+.*•´.*:˚.°*.˚•´.°:°•.°•.*•´.*:˚.°*.˚•´.°:°•.°+.*•´.*:*/ /* UPGRADEABLE BEACON OPERATIONS */ /*.•°:°.´+˚.*°.˚:*.´•*.+°.•°:´*.´•*.•°.•°:°.´:•˚°.*°.˚:*.´+°.•*/ /// @dev Returns the implementation stored in the beacon. /// See: https://eips.ethereum.org/EIPS/eip-1967#beacon-contract-address function implementation() public view returns (address result) { /// @solidity memory-safe-assembly assembly { result := sload(__implementation.slot) } } fallback() external virtual { /// @solidity memory-safe-assembly assembly { mstore(0x40, 0) // Optimization trick to remove free memory pointer initialization. let newImplementation := calldataload(0x00) // Revert if the caller is not the deployer. We will still allow the implementation // to be set to an empty contract for simplicity. if iszero(eq(caller(), sload(__deployer.slot))) { revert(0x00, 0x00) } sstore(__implementation.slot, newImplementation) // Emit the {Upgraded} event. log2(0x00, 0x00, _UPGRADED_EVENT_SIGNATURE, newImplementation) } } }
// SPDX-License-Identifier: MIT pragma solidity ^0.8.4; /// @notice A sufficiently minimal ERC1967 beacon proxy tailor-made for ZKsync. /// @author Solady (https://github.com/vectorized/solady/blob/main/src/utils/ext/zksync/ERC1967BeaconProxy.sol) contract ERC1967BeaconProxy { /*´:°•.°+.*•´.*:˚.°*.˚•´.°:°•.°•.*•´.*:˚.°*.˚•´.°:°•.°+.*•´.*:*/ /* EVENTS */ /*.•°:°.´+˚.*°.˚:*.´•*.+°.•°:´*.´•*.•°.•°:°.´:•˚°.*°.˚:*.´+°.•*/ /// @dev Emitted when the proxy's beacon is upgraded. event BeaconUpgraded(address indexed beacon); /// @dev `keccak256(bytes("BeaconUpgraded(address)"))`. uint256 private constant _BEACON_UPGRADED_EVENT_SIGNATURE = 0x1cf3b03a6cf19fa2baba4df148e9dcabedea7f8a5c07840e207e5c089be95d3e; /*´:°•.°+.*•´.*:˚.°*.˚•´.°:°•.°•.*•´.*:˚.°*.˚•´.°:°•.°+.*•´.*:*/ /* STORAGE */ /*.•°:°.´+˚.*°.˚:*.´•*.+°.•°:´*.´•*.•°.•°:°.´:•˚°.*°.˚:*.´+°.•*/ /// @dev The ERC-1967 storage slot for the implementation in the proxy. /// `uint256(keccak256("eip1967.proxy.implementation")) - 1`. bytes32 internal constant _ERC1967_BEACON_SLOT = 0xa3f0ad74e5423aebfd80d3ef4346578335a9a72aeaee59ff6cb3582b35133d50; /// @dev The storage slot for the deployer. /// `uint256(keccak256("ERC1967BeaconProxy.deployer")) - 1`. bytes32 internal constant _ERC1967_BEACON_PROXY_DEPLOYER_SLOT = 0xabc1f855dddf3277214739f5a08d8b9db61505a97fd0c09e835a2d800705b3bc; /*´:°•.°+.*•´.*:˚.°*.˚•´.°:°•.°•.*•´.*:˚.°*.˚•´.°:°•.°+.*•´.*:*/ /* CONSTRUCTOR */ /*.•°:°.´+˚.*°.˚:*.´•*.+°.•°:´*.´•*.•°.•°:°.´:•˚°.*°.˚:*.´+°.•*/ constructor() payable { /// @solidity memory-safe-assembly assembly { sstore(_ERC1967_BEACON_PROXY_DEPLOYER_SLOT, caller()) } } /*´:°•.°+.*•´.*:˚.°*.˚•´.°:°•.°•.*•´.*:˚.°*.˚•´.°:°•.°+.*•´.*:*/ /* FALLBACK */ /*.•°:°.´+˚.*°.˚:*.´•*.+°.•°:´*.´•*.•°.•°:°.´:•˚°.*°.˚:*.´+°.•*/ fallback() external payable virtual { /// @solidity memory-safe-assembly assembly { mstore(0x40, 0) // Optimization trick to remove free memory pointer initialization. // For the special case of 1-byte calldata, return the implementation. if eq(calldatasize(), 1) { mstore(0x00, 0x5c60da1b) // `implementation()`. let s := staticcall(gas(), sload(_ERC1967_BEACON_SLOT), 0x1c, 0x04, 0x00, 0x20) if iszero(and(gt(returndatasize(), 0x1f), s)) { revert(0x00, 0x00) } return(0x00, 0x20) // Return the implementation. } // Deployer workflow. if eq(caller(), sload(_ERC1967_BEACON_PROXY_DEPLOYER_SLOT)) { sstore(_ERC1967_BEACON_SLOT, calldataload(0x00)) // Emit the {Upgraded} event. log2(0x00, 0x00, _BEACON_UPGRADED_EVENT_SIGNATURE, calldataload(0x00)) stop() // End the context. } // Query the beacon. mstore(0x00, 0x5c60da1b) // `implementation()`. let s := staticcall(gas(), sload(_ERC1967_BEACON_SLOT), 0x1c, 0x04, 0x00, 0x20) if iszero(and(gt(returndatasize(), 0x1f), s)) { revert(0x00, 0x00) } let implementation := mload(0x00) // Perform the delegatecall. calldatacopy(0x00, 0x00, calldatasize()) s := delegatecall(gas(), implementation, 0x00, calldatasize(), 0x00, 0x00) returndatacopy(0x00, 0x00, returndatasize()) if iszero(s) { revert(0x00, returndatasize()) } return(0x00, returndatasize()) } } }
{ "viaIR": false, "codegen": "yul", "remappings": [ "forge-std/=lib/forge-std/src/", "forge-zksync-std/=lib/forge-zksync-std/src/" ], "evmVersion": "cancun", "outputSelection": { "*": { "*": [ "abi", "metadata" ], "": [ "ast" ] } }, "optimizer": { "enabled": true, "mode": "3", "fallback_to_optimizing_for_size": false, "disable_system_request_memoization": true }, "metadata": {}, "libraries": {}, "enableEraVMExtensions": false, "forceEVMLA": false }
[{"inputs":[],"stateMutability":"payable","type":"constructor"},{"inputs":[],"name":"DeploymentFailed","type":"error"},{"inputs":[],"name":"NoInitCodeHashFound","type":"error"},{"inputs":[],"name":"SaltDoesNotStartWithCaller","type":"error"},{"inputs":[],"name":"Unauthorized","type":"error"},{"inputs":[],"name":"UpgradeFailed","type":"error"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"instance","type":"address"},{"indexed":true,"internalType":"address","name":"admin","type":"address"}],"name":"AdminChanged","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"beacon","type":"address"},{"indexed":true,"internalType":"address","name":"implementation","type":"address"},{"indexed":true,"internalType":"address","name":"admin","type":"address"}],"name":"BeaconDeployed","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"beaconProxy","type":"address"},{"indexed":true,"internalType":"address","name":"beacon","type":"address"}],"name":"BeaconProxyDeployed","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"proxy","type":"address"},{"indexed":true,"internalType":"address","name":"implementation","type":"address"},{"indexed":true,"internalType":"address","name":"admin","type":"address"}],"name":"ProxyDeployed","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"instance","type":"address"},{"indexed":true,"internalType":"address","name":"implementation","type":"address"}],"name":"Upgraded","type":"event"},{"inputs":[{"internalType":"address","name":"instance","type":"address"}],"name":"adminOf","outputs":[{"internalType":"address","name":"admin","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"beaconHash","outputs":[{"internalType":"bytes32","name":"","type":"bytes32"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"beaconProxyHash","outputs":[{"internalType":"bytes32","name":"","type":"bytes32"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"instance","type":"address"},{"internalType":"address","name":"admin","type":"address"}],"name":"changeAdmin","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"implementation","type":"address"},{"internalType":"address","name":"admin","type":"address"}],"name":"deployBeacon","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"implementation","type":"address"},{"internalType":"address","name":"admin","type":"address"},{"internalType":"bytes32","name":"salt","type":"bytes32"}],"name":"deployBeaconDeterministic","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"payable","type":"function"},{"inputs":[{"internalType":"address","name":"beacon","type":"address"}],"name":"deployBeaconProxy","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"payable","type":"function"},{"inputs":[{"internalType":"address","name":"beacon","type":"address"},{"internalType":"bytes","name":"data","type":"bytes"}],"name":"deployBeaconProxyAndCall","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"payable","type":"function"},{"inputs":[{"internalType":"address","name":"beacon","type":"address"},{"internalType":"bytes32","name":"salt","type":"bytes32"}],"name":"deployBeaconProxyDeterministic","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"payable","type":"function"},{"inputs":[{"internalType":"address","name":"beacon","type":"address"},{"internalType":"bytes32","name":"salt","type":"bytes32"},{"internalType":"bytes","name":"data","type":"bytes"}],"name":"deployBeaconProxyDeterministicAndCall","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"payable","type":"function"},{"inputs":[{"internalType":"address","name":"implementation","type":"address"},{"internalType":"address","name":"admin","type":"address"}],"name":"deployProxy","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"payable","type":"function"},{"inputs":[{"internalType":"address","name":"implementation","type":"address"},{"internalType":"address","name":"admin","type":"address"},{"internalType":"bytes","name":"data","type":"bytes"}],"name":"deployProxyAndCall","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"payable","type":"function"},{"inputs":[{"internalType":"address","name":"implementation","type":"address"},{"internalType":"address","name":"admin","type":"address"},{"internalType":"bytes32","name":"salt","type":"bytes32"}],"name":"deployProxyDeterministic","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"payable","type":"function"},{"inputs":[{"internalType":"address","name":"implementation","type":"address"},{"internalType":"address","name":"admin","type":"address"},{"internalType":"bytes32","name":"salt","type":"bytes32"},{"internalType":"bytes","name":"data","type":"bytes"}],"name":"deployProxyDeterministicAndCall","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"payable","type":"function"},{"inputs":[{"internalType":"address","name":"instance","type":"address"}],"name":"implementationOf","outputs":[{"internalType":"address","name":"result","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"bytes32","name":"instanceHash","type":"bytes32"},{"internalType":"bytes32","name":"salt","type":"bytes32"}],"name":"predictDeterministicAddress","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"proxyHash","outputs":[{"internalType":"bytes32","name":"","type":"bytes32"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"instance","type":"address"},{"internalType":"address","name":"implementation","type":"address"}],"name":"upgrade","outputs":[],"stateMutability":"payable","type":"function"},{"inputs":[{"internalType":"address","name":"instance","type":"address"},{"internalType":"address","name":"implementation","type":"address"},{"internalType":"bytes","name":"data","type":"bytes"}],"name":"upgradeAndCall","outputs":[],"stateMutability":"payable","type":"function"}]
Contract Creation Code
3cda33510000000000000000000000000000000000000000000000000000000000000000010002af85ebd661bd7f3893d0b1218242efe52e013b3489cb048c199f90be4900000000000000000000000000000000000000000000000000000000000000600000000000000000000000000000000000000000000000000000000000000000
Deployed Bytecode
0x0004000000000002000400000000000200000060041002700000025a03400197000300000031035500020000000103550000025a0040019d0000000100200190000000390000c13d0000008002000039000000400020043f000000040030008c000006eb0000413d000000000201043b000000e002200270000002720020009c000000740000a13d000002730020009c000000a40000213d0000027a0020009c0000014e0000a13d0000027b0020009c000001c80000613d0000027c0020009c000001cf0000613d0000027d0020009c000006eb0000c13d000000240030008c000006eb0000413d0000000401100370000000000101043b000400000001001d000002620010009c000006eb0000213d0000026701000041000000a40010043f00000000010004140000026602000041000000800020043f000000840000043f0000006002000039000000c40020043f000000e40000043f0000025a0010009c0000025a01008041000000c0011002100000029a011001c70000800602000039096209580000040f0000000100200190000003460000613d000000000101043b000000000001004b000003560000c13d000000030100036700000001020000310000034a0000013d0000000001000410000000a00010043f0000025b01000041000000c00010043f0000004001000039000000800010043f000000e001000039000000400010043f00000000010004140000025a0010009c0000025a01008041000000c0011002100000025c011001c700008010020000390962095d0000040f0000000100200190000006eb0000613d000000000401043b000000400100043d0000025d0010009c000000540000413d0000027001000041000000000010043f0000004101000039000000040010043f0000027101000041000009640001043000000024021000390000025e03000041000000000032043500000044021000390000000003000414000000600500003900000000005204350000025f0200004100000000002104350000000402100039000400000004001d0000000000420435000000640210003900000000000204350000025a0010009c0000025a0100804100000040011002100000025a0030009c0000025a03008041000000c002300210000000000121019f00000260011001c70000800602000039096209580000040f0000000100200190000000c70000613d000000000101043b000000000001004b0000011c0000c13d00000003010003670000000102000031000000cb0000013d000002800020009c000000eb0000a13d000002810020009c000001570000a13d000002820020009c000001fe0000613d000002830020009c000002040000613d000002840020009c000006eb0000c13d000000440030008c000006eb0000413d0000000402100370000000000202043b000400000002001d000002620020009c000006eb0000213d0000002401100370000000000101043b000002990010009c0000008d0000413d00000000020004110000006003100270000000000032004b0000017b0000c13d0000026702000041000000a40020043f00000000020004140000025f03000041000000800030043f000000840010043f0000006001000039000000c40010043f000000e40000043f0000025a0020009c0000025a02008041000000c0012002100000029a011001c70000800602000039096209580000040f00000001002001900000037a0000613d000000000101043b000000000001004b000003d80000c13d000000030100036700000001020000310000037e0000013d000002740020009c0000017f0000a13d000002750020009c0000020c0000613d000002760020009c0000025a0000613d000002770020009c000006eb0000c13d000000840030008c000006eb0000413d0000000402100370000000000202043b000400000002001d000002620020009c000006eb0000213d0000002402100370000000000202043b000300000002001d000002620020009c000006eb0000213d0000006401100370000000000101043b0000028c0010009c000006eb0000213d00000004011000390000000002030019096207820000040f00000044030000390000000203300367000000000303043b0000000004010019000000000502001900000004010000290000000302000029000002e50000013d000300000001035500000060021002700001025a0020019d0000025a02200197000002a8052001980000001f0620018f000000400300043d0000000004530019000000d60000613d000000000701034f0000000008030019000000007907043c0000000008980436000000000048004b000000d20000c13d000000000006004b000000e30000613d000000000151034f0000000305600210000000000604043300000000065601cf000000000656022f000000000101043b0000010005500089000000000151022f00000000015101cf000000000161019f00000000001404350000025a0020009c0000025a0200804100000060012002100000025a0030009c0000025a030080410000004002300210000000000112019f0000096400010430000002870020009c000001a90000213d0000028a0020009c000002790000613d0000028b0020009c000006eb0000c13d000000640030008c000006eb0000413d0000000402100370000000000202043b000400000002001d000002620020009c000006eb0000213d0000002402100370000000000202043b000300000002001d000002620020009c000006eb0000213d0000004401100370000000000101043b000002990010009c000001050000413d00000000020004110000006003100270000000000032004b0000017b0000c13d0000026502000041000000a40020043f00000000020004140000025f03000041000000800030043f000000840010043f0000006001000039000000c40010043f000000e40000043f0000025a0020009c0000025a02008041000000c0012002100000029a011001c70000800602000039096209580000040f0000000100200190000003fc0000613d000000000101043b000000000001004b0000046e0000c13d00000003010003670000000102000031000004000000013d000002610200004100000000002004430000026201100197000300000001001d000000040010044300000000010004140000025a0010009c0000025a01008041000000c00110021000000263011001c700008002020000390962095d0000040f0000000100200190000005160000613d000000000101043b000000000010041b000000400100043d000002640010009c0000004e0000213d00000024021000390000026503000041000000000032043500000044021000390000000003000414000000600400003900000000004204350000026602000041000000000021043500000064021000390000000000020435000000040210003900000000000204350000025a0010009c0000025a0100804100000040011002100000025a0030009c0000025a03008041000000c002300210000000000121019f00000260011001c70000800602000039096209580000040f0000000100200190000002ed0000613d000000000101043b000000000001004b000003100000c13d00000003010003670000000102000031000002f10000013d0000027e0020009c000002870000613d0000027f0020009c000006eb0000c13d0000000001000416000000000001004b000006eb0000c13d0000000201000039000002080000013d000002850020009c000002a90000613d000002860020009c000006eb0000c13d000000640030008c000006eb0000413d0000000402100370000000000202043b000400000002001d000002620020009c000006eb0000213d0000004402100370000000000202043b0000028c0020009c000006eb0000213d0000002304200039000000000034004b000006eb0000813d000200040020003d0000000204100360000000000404043b000300000004001d0000028c0040009c000006eb0000213d00000003022000290000002402200039000000000032004b000006eb0000213d0000002401100370000000000101043b000002990010009c000004940000413d00000000020004110000006003100270000000000032004b000004940000613d000002a701000041000000000010043f00000297010000410000096400010430000002780020009c000002b90000613d000002790020009c000006eb0000c13d000000240030008c000006eb0000413d0000000002000416000000000002004b000006eb0000c13d0000000401100370000000000101043b000400000001001d000002620010009c000006eb0000213d000002610100004100000000001004430000000401000029000000040010044300000000010004140000025a0010009c0000025a01008041000000c00110021000000263011001c700008002020000390962095d0000040f0000000100200190000005160000613d000000000101043b000000000200041a000000000021004b000001a20000613d0000000202000039000000000202041a000000000021004b0000040c0000c13d00000000010004140000000402000029000000040020008c000003af0000c13d00000001020000390000000103000031000003d10000013d000002880020009c000002df0000613d000002890020009c000006eb0000c13d000000440030008c000006eb0000413d0000000002000416000000000002004b000006eb0000c13d0000000402100370000000000502043b000002620050009c000006eb0000213d0000002401100370000000000601043b000002620060009c000006eb0000213d000000000105041a0000000002000411000000000021004b000003420000c13d000000000065041b00000000010004140000025a0010009c0000025a01008041000000c00110021000000291011001c70000800d020000390000000303000039000002a504000041000004cf0000013d0000000001000416000000000001004b000006eb0000c13d000000000100041a000000800010043f0000028f01000041000009630001042e000000440030008c000006eb0000413d0000000402100370000000000202043b000400000002001d000002620020009c000006eb0000213d0000002402100370000000000202043b0000028c0020009c000006eb0000213d0000002304200039000000000034004b000006eb0000813d000200040020003d0000000201100360000000000101043b000300000001001d0000028c0010009c000006eb0000213d00000003012000290000002401100039000000000031004b000006eb0000213d0000026701000041000000a40010043f00000000010004140000026602000041000000800020043f000000840000043f0000006002000039000000c40020043f000000e40000043f0000025a0010009c0000025a01008041000000c0011002100000029a011001c70000800602000039096209580000040f0000000100200190000004ab0000613d000000000101043b000000000001004b000005170000c13d00000003010003670000000102000031000004af0000013d00000000010300190962079c0000040f00000262011001970000026202200197096207bd0000040f000002e60000013d0000000001000416000000000001004b000006eb0000c13d0000000101000039000000000101041a000000800010043f0000028f01000041000009630001042e000000640030008c000006eb0000413d0000000402100370000000000202043b000400000002001d000002620020009c000006eb0000213d0000002402100370000000000202043b000300000002001d000002620020009c000006eb0000213d0000004402100370000000000502043b0000028c0050009c000006eb0000213d0000002302500039000000000032004b000006eb0000813d0000000404500039000000000241034f000000000202043b0000028c0020009c000006eb0000213d00000000052500190000002405500039000000000035004b000006eb0000213d0000000403000029000000000303041a0000000005000411000000000053004b000003420000c13d0000000303000029000000800030043f0000002003400039000000000331034f000002a8042001980000001f0520018f000000a0014000390000023b0000613d000000a006000039000000000703034f000000007807043c0000000006860436000000000016004b000002370000c13d000000000005004b000002480000613d000000000343034f0000000304500210000000000501043300000000054501cf000000000545022f000000000303043b0000010004400089000000000343022f00000000034301cf000000000353019f000000000031043500000000010004140000000403000029000000040030008c0000061f0000613d000000000300041600000020042000390000025a0010009c0000025a01008041000000c001100210000000000003004b000006110000c13d0000025a0040009c0000025a040080410000006002400210000000000121019f00000295011001c70000000402000029000006190000013d000000440030008c000006eb0000413d0000000402100370000000000202043b000400000002001d000002620020009c000006eb0000213d0000002401100370000000000101043b000300000001001d000002620010009c000006eb0000213d0000000405000029000000000105041a0000000002000411000000000021004b000003420000c13d0000000301000029000000800010043f0000000001000414000000040050008c000004c60000613d00000000030004160000025a0010009c0000025a01008041000000c001100210000000000003004b000004bb0000c13d0000028f011001c70000000002050019000004bf0000013d000000440030008c000006eb0000413d0000000402100370000000000402043b000002620040009c000006eb0000213d0000002401100370000000000201043b000002620020009c000006eb0000213d00000000010400190000000004000019096207bd0000040f000002e60000013d000000440030008c000006eb0000413d0000000002000416000000000002004b000006eb0000c13d0000000402100370000000000202043b0000002401100370000000000301043b0000000301000039000000000101041a000000ff00100190000002fd0000c13d000400000003001d000000000020043f0000000401000039000000200010043f00000000010004140000025a0010009c0000025a01008041000000c0011002100000026e011001c700008010020000390962095d0000040f0000000100200190000006eb0000613d000000000101043b000000000101041a000000000001004b0000038a0000c13d000002a301000041000000000010043f00000297010000410000096400010430000000240030008c000006eb0000413d0000000002000416000000000002004b000006eb0000c13d0000000401100370000000000101043b000002620010009c000006eb0000213d000000000201041a0000026202200197000000ff0010008c000000000200a019000000800020043f0000028f01000041000009630001042e000000440030008c000006eb0000413d0000000002000416000000000002004b000006eb0000c13d0000000402100370000000000202043b000400000002001d000002620020009c000006eb0000213d0000002401100370000000000101043b000300000001001d000002620010009c000006eb0000213d0000026501000041000000a40010043f00000000010004140000026602000041000000800020043f000000840000043f0000006002000039000000c40020043f000000e40000043f0000025a0010009c0000025a01008041000000c0011002100000029a011001c70000800602000039096209580000040f00000001002001900000039f0000613d000000000101043b000000000001004b0000041b0000c13d00000003010003670000000102000031000003a30000013d0000000001030019096207700000040f0000000004000031000002620110019700000262022001970000000005000019096208850000040f000000400200043d00000000001204350000025a0020009c0000025a0200804100000040012002100000028d011001c7000009630001042e000300000001035500000060021002700001025a0020019d0000025a02200197000002a8052001980000001f0620018f000000400300043d0000000004530019000000d60000613d000000000701034f0000000008030019000000007907043c0000000008980436000000000048004b000002f80000c13d000000d60000013d0000026901000041000000800010043f0000000001000410000000a00010043f000000c00030043f000000e00020043f0000026801000041000001000010043f00000000010004140000025a0010009c0000025a01008041000000c001100210000002a0011001c700008010020000390962095d0000040f0000000100200190000006eb0000613d000000000101043b000003d60000013d000002610200004100000000002004430000026201100197000000040010044300000000010004140000025a0010009c0000025a01008041000000c00110021000000263011001c700008002020000390962095d0000040f0000000100200190000005160000613d000000000101043b0000000102000039000000000012041b000000400100043d000002640010009c0000004e0000213d00000024021000390000026703000041000000000032043500000044021000390000000003000414000000600400003900000000004204350000026602000041000000000021043500000064021000390000000000020435000000040210003900000000000204350000025a0010009c0000025a0100804100000040011002100000025a0030009c0000025a03008041000000c002300210000000000121019f00000260011001c70000800602000039096209580000040f00000001002001900000045e0000613d000000000101043b000000000001004b000004da0000c13d00000003010003670000000102000031000004620000013d000002a401000041000000000010043f00000297010000410000096400010430000300000001035500000060021002700001025a0020019d0000025a02200197000002a8052001980000001f0620018f000000400300043d0000000004530019000000d60000613d000000000701034f0000000008030019000000007907043c0000000008980436000000000048004b000003510000c13d000000d60000013d00000000020004140000025a0020009c0000025a020080410000026205100197000000c00120021000000291011001c70000800d0200003900000003030000390000029c04000041000300000005001d0000000406000029096209580000040f0000000100200190000006eb0000613d0000000304000029000000000004004b000007540000613d000000400200043d000000040100002900000000001204350000000001000414000000040040008c000006340000613d00000000030004160000025a0020009c0000025a0200804100000040022002100000025a0010009c0000025a01008041000000c001100210000000000121019f000000000003004b000005aa0000c13d0000028d011001c70000000002040019000005ad0000013d000300000001035500000060021002700001025a0020019d0000025a02200197000002a8052001980000001f0620018f000000400300043d0000000004530019000000d60000613d000000000701034f0000000008030019000000007907043c0000000008980436000000000048004b000003850000c13d000000d60000013d000000000200043d000002a1022001c7000000000020043f000000350010043f00000000010004100000006001100210000000010010043f0000000401000029000000150010043f00000000010004140000025a0010009c0000025a01008041000000c001100210000002a2011001c700008010020000390962095d0000040f0000000100200190000006eb0000613d000000000101043b000000350000043f000003d60000013d000300000001035500000060021002700001025a0020019d0000025a02200197000002a8052001980000001f0620018f000000400300043d0000000004530019000000d60000613d000000000701034f0000000008030019000000007907043c0000000008980436000000000048004b000003aa0000c13d000000d60000013d0000025a0010009c0000025a01008041000000c00110021000000299011001c70962095d0000040f00000060031002700000025a03300197000000200030008c000000200400003900000000040340190000001f0540018f0000002004400190000003c20000613d000000000601034f0000000007000019000000006806043c0000000007870436000000000047004b000003be0000c13d000000000005004b000003cf0000613d000000000641034f0000000305500210000000000704043300000000075701cf000000000757022f000000000606043b0000010005500089000000000656022f00000000055601cf000000000575019f0000000000540435000100000003001f00030000000103550000000100200190000006eb0000613d0000001f0030008c000006eb0000a13d000000000100043d0000026201100197000002e60000013d00000000020004140000025a0020009c0000025a020080410000026205100197000000c00120021000000291011001c70000800d0200003900000003030000390000029c04000041000300000005001d0000000406000029096209580000040f0000000100200190000006eb0000613d0000000304000029000000000004004b000007540000613d000000400200043d000000040100002900000000001204350000000001000414000000040040008c000006340000613d00000000030004160000025a0020009c0000025a0200804100000040022002100000025a0010009c0000025a01008041000000c001100210000000000121019f000000000003004b000006290000c13d0000028d011001c700000003020000290000062d0000013d000300000001035500000060021002700001025a0020019d0000025a02200197000002a8052001980000001f0620018f000000400300043d0000000004530019000000d60000613d000000000701034f0000000008030019000000007907043c0000000008980436000000000048004b000004070000c13d000000d60000013d0000000102000039000000000302041a000000000031004b0000000001000019000002e60000c13d0000029801000041000000000010043f00000000010004140000000403000029000000040030008c0000055a0000c13d0000001c0100043d000000000010043f00000001030000310000057d0000013d00000262051001970000000307000029000000000075041b00000000010004140000025a0010009c0000025a01008041000000c00110021000000291011001c70000800d0200003900000004030000390000029b04000041000200000005001d0000000406000029096209580000040f0000000100200190000006eb0000613d0000000204000029000000000004004b000007540000613d000000400200043d000000040100002900000000001204350000000001000414000000040040008c000006340000613d0000025a0020009c0000025a0200804100000040022002100000025a0010009c0000025a01008041000000c001100210000000000121019f0000028d011001c70000000002040019096209580000040f000000020400002900000060031002700001025a0030019d00030000000103550000000100200190000006340000c13d0000025a02300198000007540000613d0000001f0420018f00000290032001980000044f0000613d000000000501034f0000000006000019000000005705043c0000000006760436000000000036004b0000044b0000c13d000000000004004b0000045c0000613d000000000131034f0000000304400210000000000503043300000000054501cf000000000545022f000000000101043b0000010004400089000000000141022f00000000014101cf000000000151019f000000000013043500000060012002100000096400010430000300000001035500000060021002700001025a0020019d0000025a02200197000002a8052001980000001f0620018f000000400300043d0000000004530019000000d60000613d000000000701034f0000000008030019000000007907043c0000000008980436000000000048004b000004690000c13d000000d60000013d00000262051001970000000307000029000000000075041b00000000010004140000025a0010009c0000025a01008041000000c00110021000000291011001c70000800d0200003900000004030000390000029b04000041000200000005001d0000000406000029096209580000040f0000000100200190000006eb0000613d0000000203000029000000000003004b000007540000613d000000400200043d000000040100002900000000001204350000000001000414000000040030008c000006f70000613d00000000030004160000025a0020009c0000025a0200804100000040022002100000025a0010009c0000025a01008041000000c001100210000000000121019f000000000003004b000006ed0000c13d0000028d011001c70000000202000029000006f10000013d0000026702000041000000a40020043f00000000020004140000025f03000041000000800030043f000000840010043f0000006001000039000000c40010043f000000e40000043f0000025a0020009c0000025a02008041000000c0012002100000029a011001c70000800602000039096209580000040f0000000100200190000005820000613d000000000101043b000000000001004b000005ce0000c13d00000003010003670000000102000031000005860000013d000300000001035500000060021002700001025a0020019d0000025a02200197000002a8052001980000001f0620018f000000400300043d0000000004530019000000d60000613d000000000701034f0000000008030019000000007907043c0000000008980436000000000048004b000004b60000c13d000000d60000013d0000028e011001c7000080090200003900000000040500190000000005000019096209580000040f000300000001035500000060031002700001025a0030019d00000001002001900000000405000029000004d40000613d00000000010004140000025a0010009c0000025a01008041000000c00110021000000291011001c70000800d02000039000000030300003900000292040000410000000306000029096209580000040f0000000100200190000006eb0000613d0000000001000019000009630001042e0000025a02300198000005920000c13d0000029601000041000000000010043f00000297010000410000096400010430000002610200004100000000002004430000026201100197000000040010044300000000010004140000025a0010009c0000025a01008041000000c00110021000000263011001c700008002020000390962095d0000040f0000000100200190000005160000613d000000000101043b0000000202000039000000000012041b000000400100043d0000008002100039000000000400041a00000268030000410000000000320435000000400210003900000004030000290000000000320435000000200210003900000000030004100000000000320435000002690200004100000000002104350000006002100039000400000004001d00000000004204350000025a0010009c0000025a01008041000000400110021000000000020004140000025a0020009c0000025a02008041000000c002200210000000000121019f0000026a011001c700008010020000390962095d0000040f0000000100200190000006eb0000613d000000000101043b0000026201100197000000030010006c0000066f0000c13d0000000301000039000000000201041a000002a90220019700040001002001c30000000402000029000000000021041b0000002001000039000001000010044300000120000004430000026f01000041000009630001042e000000000001042f00000000020004140000025a0020009c0000025a020080410000026205100197000000c00120021000000291011001c70000800d0200003900000003030000390000029c04000041000100000005001d0000000406000029096209580000040f0000000100200190000006eb0000613d000000010000006b000007540000613d000000400100043d000000040200002900000000052104360000000304000029000002a8034001980000001f0440018f0000000002350019000000020600002900000020066000390000000206600367000005370000613d000000000706034f000000007807043c0000000005850436000000000025004b000005330000c13d000000000004004b000005440000613d000000000336034f0000000304400210000000000502043300000000054501cf000000000545022f000000000303043b0000010004400089000000000343022f00000000034301cf000000000353019f000000000032043500000000020004140000000103000029000000040030008c0000074e0000613d0000000003000416000000030400002900000020044000390000025a0020009c0000025a02008041000000c0022002100000025a0010009c0000025a010080410000004001100210000000000003004b000007140000c13d0000025a0040009c0000025a040080410000006003400210000000000131019f000000000112019f00000001020000290000071e0000013d0000025a0010009c0000025a01008041000000c00110021000000297011001c700000000020300190962095d0000040f00000060031002700000025a03300197000000200030008c000000200400003900000000040340190000001f0540018f00000020044001900000056e0000613d000000000601034f0000000007000019000000006806043c0000000007870436000000000047004b0000056a0000c13d000000000005004b0000057b0000613d000000000641034f0000000305500210000000000704043300000000075701cf000000000757022f000000000606043b0000010005500089000000000656022f00000000055601cf000000000575019f0000000000540435000100000003001f00030000000103550000000100200190000006eb0000613d000000200030008c000003d50000813d000006eb0000013d000300000001035500000060021002700001025a0020019d0000025a02200197000002a8052001980000001f0620018f000000400300043d0000000004530019000000d60000613d000000000701034f0000000008030019000000007907043c0000000008980436000000000048004b0000058d0000c13d000000d60000013d0000001f0420018f00000290032001980000059b0000613d000000000501034f0000000006000019000000005705043c0000000006760436000000000036004b000005970000c13d000000000004004b000005a80000613d000000000131034f0000000304400210000000000503043300000000054501cf000000000545022f000000000101043b0000010004400089000000000141022f00000000014101cf000000000151019f0000000000130435000000600120021000000964000104300000029d011001c700008009020000390000000005000019096209580000040f000300000001035500000060031002700001025a0030019d00000001002001900000000304000029000006340000c13d0000025a02300198000007540000613d0000001f0420018f0000029003200198000005bf0000613d000000000501034f0000000006000019000000005705043c0000000006760436000000000036004b000005bb0000c13d000000000004004b000005cc0000613d000000000131034f0000000304400210000000000503043300000000054501cf000000000545022f000000000101043b0000010004400089000000000141022f00000000014101cf000000000151019f00000000001304350000006001200210000009640001043000000000020004140000025a0020009c0000025a020080410000026205100197000000c00120021000000291011001c70000800d0200003900000003030000390000029c04000041000100000005001d0000000406000029096209580000040f0000000100200190000006eb0000613d000000010000006b000007540000613d000000400100043d000000040200002900000000052104360000000304000029000002a8034001980000001f0440018f0000000002350019000000020600002900000020066000390000000206600367000005ee0000613d000000000706034f000000007807043c0000000005850436000000000025004b000005ea0000c13d000000000004004b000005fb0000613d000000000336034f0000000304400210000000000502043300000000054501cf000000000545022f000000000303043b0000010004400089000000000343022f00000000034301cf000000000353019f000000000032043500000000020004140000000103000029000000040030008c0000074e0000613d0000000003000416000000030400002900000020044000390000025a0020009c0000025a02008041000000c0022002100000025a0010009c0000025a010080410000004001100210000000000003004b0000073e0000c13d0000025a0040009c0000025a040080410000006003400210000000000131019f000000000112019f0000000102000029000007480000013d0000006004400210000002930440009a000002900020009c00000294040080410000000001410019000080090200003900000004040000290000000005000019096209580000040f000300000001035500000060031002700001025a0030019d00000001002001900000063b0000613d00000000010004140000025a0010009c0000025a01008041000000c00110021000000291011001c70000800d02000039000000030300003900000292040000410000000405000029000004ce0000013d0000029d011001c7000080090200003900000003040000290000000005000019096209580000040f000300000001035500000060031002700001025a0030019d00000001002001900000000304000029000006550000613d000000400100043d00000000004104350000025a0010009c0000025a0100804100000040011002100000028d011001c7000009630001042e0000025a02300198000004d60000613d0000001f0420018f0000029003200198000006460000613d000000000501034f0000000006000019000000005705043c0000000006760436000000000036004b000006420000c13d000000000004004b000006530000613d000000000131034f0000000304400210000000000503043300000000054501cf000000000545022f000000000101043b0000010004400089000000000141022f00000000014101cf000000000151019f0000000000130435000000600120021000000964000104300000025a02300198000007540000613d0000001f0420018f0000029003200198000006600000613d000000000501034f0000000006000019000000005705043c0000000006760436000000000036004b0000065c0000c13d000000000004004b0000066d0000613d000000000131034f0000000304400210000000000503043300000000054501cf000000000545022f000000000101043b0000010004400089000000000141022f00000000014101cf000000000151019f000000000013043500000060012002100000096400010430000000400100043d0000026b0010009c0000004e0000213d000000c002100039000000400020043f00000044021000390000025e030000410000000000320435000000840200003900000000002104350000026c0010009c0000026c01008041000000400110021000000000020004140000025a0020009c0000025a02008041000000c002200210000000000121019f0000026d0110009a00008010020000390962095d0000040f0000000100200190000006eb0000613d000000000101043b000300000001001d0000000401000029000000000010043f0000000401000039000000200010043f00000000010004140000025a0010009c0000025a01008041000000c0011002100000026e011001c700008010020000390962095d0000040f0000000100200190000006eb0000613d000000000101043b0000000302000029000000000021041b000000400100043d0000026b0010009c0000004e0000213d000000c002100039000000400020043f000000440210003900000265030000410000000000320435000000840200003900000000002104350000026c0010009c0000026c01008041000000400110021000000000020004140000025a0020009c0000025a02008041000000c002200210000000000121019f0000026d0110009a00008010020000390962095d0000040f0000000100200190000006eb0000613d000000000101043b000400000001001d0000000101000039000000000101041a000000000010043f0000000401000039000000200010043f00000000010004140000025a0010009c0000025a01008041000000c0011002100000026e011001c700008010020000390962095d0000040f0000000100200190000006eb0000613d000000000101043b0000000402000029000000000021041b000000400100043d0000026b0010009c0000004e0000213d000000c002100039000000400020043f000000440210003900000267030000410000000000320435000000840200003900000000002104350000026c0010009c0000026c01008041000000400110021000000000020004140000025a0020009c0000025a02008041000000c002200210000000000121019f0000026d0110009a00008010020000390962095d0000040f0000000100200190000006eb0000613d000000000101043b000400000001001d0000000201000039000000000101041a000000000010043f0000000401000039000000200010043f00000000010004140000025a0010009c0000025a01008041000000c0011002100000026e011001c700008010020000390962095d0000040f0000000100200190000006eb0000613d000000000101043b0000050f0000013d000000000100001900000964000104300000029d011001c7000080090200003900000002040000290000000005000019096209580000040f000300000001035500000060031002700001025a0030019d0000000100200190000006fa0000613d000000400100043d0000000202000029000007500000013d0000025a02300198000007540000613d0000001f0420018f0000029003200198000007050000613d000000000501034f0000000006000019000000005705043c0000000006760436000000000036004b000007010000c13d000000000004004b000007120000613d000000000131034f0000000304400210000000000503043300000000054501cf000000000545022f000000000101043b0000010004400089000000000141022f00000000014101cf000000000151019f00000000001304350000006001200210000009640001043000000060044002100000029e0440009a0000000305000029000002900050009c0000029f04008041000000000141019f0000000001210019000080090200003900000001040000290000000005000019096209580000040f000300000001035500000060031002700001025a0030019d00000001002001900000074e0000c13d0000025a02300198000007540000613d0000001f0420018f00000290032001980000072f0000613d000000000501034f0000000006000019000000005705043c0000000006760436000000000036004b0000072b0000c13d000000000004004b0000073c0000613d000000000131034f0000000304400210000000000503043300000000054501cf000000000545022f000000000101043b0000010004400089000000000141022f00000000014101cf000000000151019f00000000001304350000006001200210000009640001043000000060044002100000029e0440009a0000000305000029000002900050009c0000029f04008041000000000141019f0000000001210019000080090200003900000001040000290000000005000019096209580000040f000300000001035500000060031002700001025a0030019d0000000100200190000007520000613d000000400100043d00000001020000290000000000210435000006360000013d0000025a02300198000007580000c13d000002a601000041000000000010043f000002970100004100000964000104300000001f0420018f0000029003200198000007610000613d000000000501034f0000000006000019000000005705043c0000000006760436000000000036004b0000075d0000c13d000000000004004b0000076e0000613d000000000131034f0000000304400210000000000503043300000000054501cf000000000545022f000000000101043b0000010004400089000000000141022f00000000014101cf000000000151019f000000000013043500000060012002100000096400010430000002aa0010009c000007800000213d000000630010008c000007800000a13d00000002030003670000000401300370000000000101043b000002620010009c000007800000213d0000002402300370000000000202043b000002620020009c000007800000213d0000004403300370000000000303043b000000000001042d000000000100001900000964000104300000001f03100039000000000023004b0000000004000019000002ab04004041000002ab05200197000002ab03300197000000000653013f000000000053004b0000000003000019000002ab03002041000002ab0060009c000000000304c019000000000003004b0000079a0000613d0000000203100367000000000303043b0000028c0030009c0000079a0000213d00000020011000390000000004310019000000000024004b0000079a0000213d0000000002030019000000000001042d00000000010000190000096400010430000002aa0010009c000007bb0000213d000000630010008c000007bb0000a13d00000002030003670000000402300370000000000502043b000002620050009c000007bb0000213d0000002402300370000000000202043b000002620020009c000007bb0000213d0000004404300370000000000604043b0000028c0060009c000007bb0000213d0000002304600039000000000014004b000007bb0000813d0000000404600039000000000343034f000000000403043b0000028c0040009c000007bb0000213d00000024036000390000000006340019000000000016004b000007bb0000213d0000000001050019000000000001042d000000000100001900000964000104300005000000000002000200000004001d000100000003001d000300000002001d000500000001001d000000400100043d0000025d0010009c000008380000813d00000024021000390000025e03000041000000000032043500000044021000390000000003000414000000600400003900000000004204350000026602000041000000000021043500000064021000390000000000020435000000040210003900000000000204350000025a0010009c0000025a0100804100000040011002100000025a0030009c0000025a03008041000000c002300210000000000121019f00000260011001c70000800602000039096209580000040f00000001002001900000083e0000613d000000000101043b000000000001004b000008430000613d00000262051001970000000303000029000000000035041b00000000010004140000000502000029000002620620019700000262073001970000025a0010009c0000025a01008041000000c00110021000000291011001c70000800d020000390000000403000039000002ac04000041000400000005001d096209580000040f0000000100200190000008650000613d0000000409000029000000000009004b000000020a000029000008690000613d000000400100043d00000005020000290000000006210436000002a803a001980000001f04a0018f000000000236001900000001050000290000000205500367000008050000613d000000000705034f000000007807043c0000000006860436000000000026004b000008010000c13d000000000004004b000008120000613d000000000335034f0000000304400210000000000502043300000000054501cf000000000545022f000000000303043b0000010004400089000000000343022f00000000034301cf000000000353019f00000000003204350000000002000414000000040090008c000008360000613d00000000030004160000002004a000390000025a0020009c0000025a02008041000000c0022002100000025a0010009c0000025a010080410000004001100210000000000003004b000008290000613d00000060054002100000029e0550009a000002ad0040009c0000029f05008041000000000115019f00000000012100190000800902000039000000000409001900000000050000190000082f0000013d0000025a0040009c0000025a040080410000006003400210000000000131019f000000000112019f0000000002090019096209580000040f000300000001035500000060031002700001025a0030019d00000001002001900000000409000029000008670000613d0000000001090019000000000001042d0000027001000041000000000010043f0000004101000039000000040010043f00000271010000410000096400010430000300000001035500000060021002700001025a0020019d0000025a02200197000008450000013d00000003010003670000000102000031000002a8052001980000001f0620018f000000400300043d0000000004530019000008500000613d000000000701034f0000000008030019000000007907043c0000000008980436000000000048004b0000084c0000c13d000000000006004b0000085d0000613d000000000151034f0000000305600210000000000604043300000000065601cf000000000656022f000000000101043b0000010005500089000000000151022f00000000015101cf000000000161019f00000000001404350000025a0030009c0000025a0300804100000040013002100000025a0020009c0000025a020080410000006002200210000000000112019f0000096400010430000000000100001900000964000104300000025a023001980000086d0000c13d000002a601000041000000000010043f000002970100004100000964000104300000001f0420018f0000029003200198000008760000613d000000000501034f0000000006000019000000005705043c0000000006760436000000000036004b000008720000c13d000000000004004b000008830000613d000000000131034f0000000304400210000000000503043300000000054501cf000000000545022f000000000101043b0000010004400089000000000141022f00000000014101cf000000000151019f0000000000130435000000600120021000000964000104300005000000000002000300000002001d000500000001001d000002990030009c0000088e0000413d00000000010004110000006002300270000000000021004b000009060000c13d000100000004001d000200000005001d000000400100043d0000025d0010009c0000090a0000813d00000024021000390000025e04000041000000000042043500000044021000390000000004000414000000600500003900000000005204350000025f02000041000000000021043500000004021000390000000000320435000000640210003900000000000204350000025a0010009c0000025a0100804100000040011002100000025a0040009c0000025a04008041000000c002400210000000000121019f00000260011001c70000800602000039096209580000040f0000000100200190000009100000613d000000000101043b000000000001004b000009150000613d00000262051001970000000303000029000000000035041b00000000010004140000000502000029000002620620019700000262073001970000025a0010009c0000025a01008041000000c00110021000000291011001c70000800d020000390000000403000039000002ac04000041000400000005001d096209580000040f0000000100200190000009370000613d0000000409000029000000000009004b000000020a0000290000093b0000613d000000400100043d00000005020000290000000006210436000002a803a001980000001f04a0018f000000000236001900000001050000290000000205500367000008d30000613d000000000705034f000000007807043c0000000006860436000000000026004b000008cf0000c13d000000000004004b000008e00000613d000000000335034f0000000304400210000000000502043300000000054501cf000000000545022f000000000303043b0000010004400089000000000343022f00000000034301cf000000000353019f00000000003204350000000002000414000000040090008c000009040000613d00000000030004160000002004a000390000025a0020009c0000025a02008041000000c0022002100000025a0010009c0000025a010080410000004001100210000000000003004b000008f70000613d00000060054002100000029e0550009a000002ad0040009c0000029f05008041000000000115019f0000000001210019000080090200003900000000040900190000000005000019000008fd0000013d0000025a0040009c0000025a040080410000006003400210000000000131019f000000000112019f0000000002090019096209580000040f000300000001035500000060031002700001025a0030019d00000001002001900000000409000029000009390000613d0000000001090019000000000001042d000002a701000041000000000010043f000002970100004100000964000104300000027001000041000000000010043f0000004101000039000000040010043f00000271010000410000096400010430000300000001035500000060021002700001025a0020019d0000025a02200197000009170000013d00000003010003670000000102000031000002a8052001980000001f0620018f000000400300043d0000000004530019000009220000613d000000000701034f0000000008030019000000007907043c0000000008980436000000000048004b0000091e0000c13d000000000006004b0000092f0000613d000000000151034f0000000305600210000000000604043300000000065601cf000000000656022f000000000101043b0000010005500089000000000151022f00000000015101cf000000000161019f00000000001404350000025a0030009c0000025a0300804100000040013002100000025a0020009c0000025a020080410000006002200210000000000112019f0000096400010430000000000100001900000964000104300000025a023001980000093f0000c13d000002a601000041000000000010043f000002970100004100000964000104300000001f0420018f0000029003200198000009480000613d000000000501034f0000000006000019000000005705043c0000000006760436000000000036004b000009440000c13d000000000004004b000009550000613d000000000131034f0000000304400210000000000503043300000000054501cf000000000545022f000000000101043b0000010004400089000000000141022f00000000014101cf000000000151019f000000000013043500000060012002100000096400010430000000000001042f0000095b002104210000000102000039000000000001042d0000000002000019000000000001042d00000960002104230000000102000039000000000001042d0000000002000019000000000001042d0000096200000432000009630001042e000009640001043000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000ffffffff70726f787953616c7400000000000000000000000000000000000000000000000200000000000000000000000000000000000040000000a00000000000000000000000000000000000000000000000000000000000000000ffffffffffffff7c010000411ce9cfcdb9d2c72518551a5f8dad1fbe68e2e50eb9e44cd8e0d2ddaa3cda33511d41a8a5431b1770c5bc0ddd62e1cd30555d16659b89c0d60f4f9f570200000000000000000000000000000000000084000000000000000000000000e03fe177bb050a40ea1b3ecd64121a3fa063a94b6d404b2f45c64697555efe0e000000000000000000000000ffffffffffffffffffffffffffffffffffffffff0200000200000000000000000000000000000024000000000000000000000000000000000000000000000000000000000000000000000000ffffffffffffff7b01000019d7f34637ffda6a523c09e13458940fa828c48564ab17bcf60573f1659c4d535bdea7cd8a978f128b93471df48c7dbab89d703809115bdc118c235bfd0100004d425ac85452f9f73135adb876059808c90f3eac720fa2bfd44a887837c5d2460186f7233c927e7db2dcc703c0e500b653ca82273b7bfad8045d85a4702020dba91b30cc0006188af794c2fb30dd8520db7e2c088b7fc7c103c00ca49402000000000000000000000000000000000000a0000000000000000000000000000000000000000000000000000000000000000000000000ffffffffffffff3f00000000000000000000000000000000000000000000000000000000ffffffdffdffffffffffffffffffffffffffffffffffff7bffffffe00000000000000000020000000000000000000000000000000000004000000000000000000000000000000002000000000000000000000000000000400000010000000000000000004e487b71000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000024000000000000000000000000000000000000000000000000000000000000000000000000000000006d07dbf700000000000000000000000000000000000000000000000000000000881ff526000000000000000000000000000000000000000000000000000000009623609c000000000000000000000000000000000000000000000000000000009623609d0000000000000000000000000000000000000000000000000000000099a88ec400000000000000000000000000000000000000000000000000000000af1f33f700000000000000000000000000000000000000000000000000000000881ff527000000000000000000000000000000000000000000000000000000008b4872b800000000000000000000000000000000000000000000000000000000809cee2e00000000000000000000000000000000000000000000000000000000809cee2f00000000000000000000000000000000000000000000000000000000824e171900000000000000000000000000000000000000000000000000000000864f4b36000000000000000000000000000000000000000000000000000000006d07dbf80000000000000000000000000000000000000000000000000000000071c9f02f000000000000000000000000000000000000000000000000000000002abbef14000000000000000000000000000000000000000000000000000000003ed354d6000000000000000000000000000000000000000000000000000000003ed354d7000000000000000000000000000000000000000000000000000000004b5b26c100000000000000000000000000000000000000000000000000000000591fcbbc000000000000000000000000000000000000000000000000000000002abbef150000000000000000000000000000000000000000000000000000000032e6cf620000000000000000000000000000000000000000000000000000000015d243650000000000000000000000000000000000000000000000000000000015d24366000000000000000000000000000000000000000000000000000000001acfd02a000000000000000000000000000000000000000000000000000000000a6eafdd000000000000000000000000000000000000000000000000000000000e6ef578000000000000000000000000000000000000000000000000ffffffffffffffff00000000000000000000000000000000000000200000000000000000000000000200000000000000000000000000000000000020000000800000000000000000000000000000000000000000000000000000002000000080000000000000000000000000000000000000000000000000000000000000000000000000ffffffe002000000000000000000000000000000000000000000000000000000000000005d611f318680d00598bb735d61bacf0c514c6b50e1e5ad30040a4df2b12791c7fdffffffffffffffffffffffffffffffffffffffffffff80000000000000000002000000000000000000000000000000ffffffff00000080000000000000000000000000000000000000000000000000000000000000008000000000000000000000000000000000000000000000000000000000000000000000000055299b4900000000000000000000000000000000000000040000001c0000000000000000000000000000000000000000000000000000000000000000000000005c60da1b00000000000000000000000000000000000000010000000000000000000000000200000000000000000000000000000000000084000000800000000000000000f53ff7c8fa39204521b1e348ab2a7ad0397471eefade072522e79552bf633726fa8e336138457120a1572efbe25f72698abd5cca1c9be0bce42ad406ff350a2b0200000000000000000000000000000000000020000000000000000000000000fe0000000000000000000000000000000000000000000000000000000000000002000000000000000000000000000000ffffffff00000000000000000000000002000000000000000000000000000000000000a0000000800000000000000000ff00000000000000000000000000000000000000000000000000000000000000020000000000000000000000000000000000005500000000000000000000000000000000000000000000000000000000000000000000000000000000a3a58d1c0000000000000000000000000000000000000000000000000000000082b429007e644d79422f17c01e4894b5f4f588d331ebfa28653d42ae832dc59e38c9798f0000000000000000000000000000000000000000000000000000000030116425000000000000000000000000000000000000000000000000000000002f634836ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff007fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff80000000000000000000000000000000000000000000000000000000000000009e0862c4ebff2150fbbfd3f8547483f55bdec0c34fd977d3fccaa55d6c4ce78400000000000000000000000000000000000000000000000000000001000000005466f03d680a4bfc36038d5dfe2b8e36131638d778dd8cb579ab057c13a5a807
Loading...
Loading
Loading...
Loading
[ Download: CSV Export ]
[ Download: CSV Export ]
A contract address hosts a smart contract, which is a set of code stored on the blockchain that runs when predetermined conditions are met. Learn more about addresses in our Knowledge Base.