Source Code
Overview
ETH Balance
0 ETH
ETH Value
$0.00Latest 8 internal transactions
Advanced mode:
| Parent Transaction Hash | Block | From | To | |||
|---|---|---|---|---|---|---|
| 3806170 | 326 days ago | Contract Creation | 0 ETH | |||
| 3805868 | 326 days ago | Contract Creation | 0 ETH | |||
| 3797464 | 327 days ago | Contract Creation | 0 ETH | |||
| 3789777 | 327 days ago | Contract Creation | 0 ETH | |||
| 138985 | 383 days ago | Contract Creation | 0 ETH | |||
| 138985 | 383 days ago | Contract Creation | 0 ETH | |||
| 138985 | 383 days ago | Contract Creation | 0 ETH | |||
| 138985 | 383 days ago | Contract Creation | 0 ETH |
Cross-Chain Transactions
Loading...
Loading
This contract may be a proxy contract. Click on More Options and select Is this a proxy? to confirm and enable the "Read as Proxy" & "Write as Proxy" tabs.
Contract Name:
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
}Contract Security Audit
- No Contract Security Audit Submitted- Submit Audit Here
Contract ABI
API[{"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
Loading...
Loading
Net Worth in USD
$0.00
Net Worth in ETH
0
Multichain Portfolio | 35 Chains
| Chain | Token | Portfolio % | Price | Amount | Value |
|---|
Loading...
Loading
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.