Source Code
Overview
ETH Balance
0 ETH
Eth Value
$0.00View more zero value Internal Transactions in Advanced View mode
Advanced mode:
Loading...
Loading
Cross-Chain Transactions
Loading...
Loading
This contract may be a proxy contract. Click on More Options and select Is this a proxy? to confirm and enable the "Read as Proxy" & "Write as Proxy" tabs.
Contract Name:
SystemRegistry
Compiler Version
v0.8.19+commit.7dd6d404
Optimization Enabled:
Yes with 200 runs
Other Settings:
default evmVersion
Contract Source Code (Solidity Standard Json-Input format)
// SPDX-License-Identifier: UNLICENSED
pragma solidity 0.8.19;
import {Errors} from "./utils/Errors.sol";
import {Ownable2Step} from "./access/Ownable2Step.sol";
import {ISystemRegistry} from "./interfaces/ISystemRegistry.sol";
import {ISystemSecurity} from "./interfaces/security/ISystemSecurity.sol";
import {IAccessController} from "./interfaces/security/IAccessController.sol";
import {IERC20Metadata} from "@openzeppelin/contracts/token/ERC20/extensions/IERC20Metadata.sol";
import {IRentShare} from "./interfaces/rent/IRentShare.sol";
import {IRentDistributor} from "./interfaces/rent/IRentDistributor.sol";
import {IMarketplace} from "./interfaces/marketplace/IMarketplace.sol";
import {ISecondaryMarket} from "./interfaces/marketplace/ISecondaryMarket.sol";
import {IWhitelist} from "./interfaces/whitelist/IWhitelist.sol";
import {ILockNFT} from "./interfaces/lockNft/ILockNFT.sol";
import {IXeqFeeManager} from "./interfaces/fees/IXeqFeeManager.sol";
import {IRootPriceOracle} from "./interfaces/oracles/IRootPriceOracle.sol";
import {IJarvisDex} from "./interfaces/oclr/IJarvisDex.sol";
import {IDFXRouter} from "./interfaces/oclr/IDFXRouter.sol";
import {ISanctionsList} from "./interfaces/sbt/ISanctionsList.sol";
import {ISBT} from "./interfaces/sbt/ISBT.sol";
import {IPasskeyFactory} from "./interfaces/wallet/IPasskeyFactory.sol";
import {IERC20} from "@openzeppelin/contracts/token/ERC20/IERC20.sol";
import "@openzeppelin/contracts-upgradeable/proxy/utils/Initializable.sol";
import "@openzeppelin/contracts-upgradeable/proxy/utils/UUPSUpgradeable.sol";
import "@openzeppelin/contracts-upgradeable/access/Ownable2StepUpgradeable.sol";
import "hardhat/console.sol";
/* ******************************** */
/* Errors */
/* ******************************** */
error InvalidContract(address addr);
/// @notice Root contract of the system instance.
/// @dev All contracts in this instance of the system should be reachable from this contract
contract SystemRegistry is
ISystemRegistry,
Initializable,
UUPSUpgradeable,
Ownable2StepUpgradeable
{
/* ******************************** */
/* State Variables */
/* ******************************** */
IAccessController private _accessController;
ISystemSecurity private _systemSecurity;
IRentShare private _rentShare;
IRentDistributor private _rentDistributor;
IMarketplace private _marketplace;
IWhitelist private _whitelist;
ILockNFT private _lockNftMinter;
ILockNFT private _lockNft;
IXeqFeeManager private _xeqFeeManager;
IERC20 private _xeq;
IRootPriceOracle private _rootPriceOracle;
IERC20 private _try;
IERC20 private _usdc;
IERC20 private _xUsdc;
address private _oclr;
IJarvisDex private _jarvisDex;
IDFXRouter private _dfxRouter;
address private _transferManager;
ISanctionsList private _sanctionsList;
ISBT private _sbt;
IPasskeyFactory private _passkeyWalletFactory;
ISecondaryMarket private _secondaryMarket;
/* ******************************** */
/* Events */
/* ******************************** */
event AccessControllerSet(address newAddress);
event SystemSecuritySet(address security);
event RentShareSet(address rentShare);
event RentDistributorSet(address rentDistributor);
event MarketplaceSet(address marketplace);
event WhitelistSet(address tokensWhitelist);
event LockNftMinterSet(address lockNftMinter);
event LockNftSet(address lockNft);
event XeqFeeManagerSet(address xeqFeeManagerSet);
event XeqSet(address xeq);
event RootPriceOracleSet(address rootPriceOracle);
event TrySet(address Try);
event UsdcSet(address Usdc);
event XUsdcSet(address xUsdc);
event OclrSet(address Oclr);
event JarvisDexSet(address jarvisDex);
event DfxRouterSet(address dfxRouter);
event TransferManagerSet(address transferManager);
event SanctionsListSet(address santionsList);
event SBTSet(address sbt);
event PasskeyWalletFactorySet(address passkeyWalletFactory);
event SecondaryMarketSet(address secondaryMarket);
/// @custom:oz-upgrades-unsafe-allow constructor
constructor() {
_disableInitializers();
}
/**
* @notice Initializes the contract.
*/
function initialize() public initializer {
console.log("Inside the initialze");
__UUPSUpgradeable_init();
__Ownable2Step_init();
}
/* ******************************** */
/* External Function */
/* ******************************** */
/// @notice Set the Access Controller for this instance of the system
/// @param controller Address of the access controller
function setAccessController(address controller) external onlyOwner {
Errors.verifyNotZero(controller, "accessController");
emit AccessControllerSet(controller);
_accessController = IAccessController(controller);
_verifySystemsAgree(controller);
}
/// @notice Set the PasskeyWalletFactory for this instance of the system
/// @param passkeyWalletFactoryInstance Address of the PasskeyWallet Factory
function setPasskeyWalletFactory(
address passkeyWalletFactoryInstance
) external onlyOwner {
Errors.verifyNotZero(
passkeyWalletFactoryInstance,
"passkeyWalletFactoryInstance"
);
emit PasskeyWalletFactorySet(passkeyWalletFactoryInstance);
_passkeyWalletFactory = IPasskeyFactory(passkeyWalletFactoryInstance);
_verifySystemsAgree(passkeyWalletFactoryInstance);
}
/// @notice Set the Rent share for this instance of the system
/// @param rentShareInstance Address of the rent share
function setRentShare(address rentShareInstance) external onlyOwner {
Errors.verifyNotZero(rentShareInstance, "rentShareInstance");
emit RentShareSet(rentShareInstance);
_rentShare = IRentShare(rentShareInstance);
_verifySystemsAgree(rentShareInstance);
}
/// @notice Set the Rent Distributor for this instance of the system
/// @param rentDistributorInsance Address of the rent distributor
function setRentDistributor(
address rentDistributorInsance
) external onlyOwner {
Errors.verifyNotZero(rentDistributorInsance, "rentDistributorInsance");
emit RentDistributorSet(rentDistributorInsance);
_rentDistributor = IRentDistributor(rentDistributorInsance);
_verifySystemsAgree(rentDistributorInsance);
}
/// @notice Set jarvis dex address of pair
/// @param jarvisDexInstance Address of the Jarvis dex
function setJarvisDex(address jarvisDexInstance) external onlyOwner {
Errors.verifyNotZero(jarvisDexInstance, "jarvisDexInstance");
emit JarvisDexSet(jarvisDexInstance);
_jarvisDex = IJarvisDex(jarvisDexInstance);
}
/// @notice Set dfx router instance
/// @param dfxRouterInstance Address of the DFX router
function setDfxRouter(address dfxRouterInstance) external onlyOwner {
Errors.verifyNotZero(dfxRouterInstance, "dfxRouterInstance");
emit DfxRouterSet(dfxRouterInstance);
_dfxRouter = IDFXRouter(dfxRouterInstance);
}
/// @notice Set the Marketplace for this instance of the system
/// @param marketplaceInstance Address of the Marketplace
function setMarketplace(address marketplaceInstance) external onlyOwner {
Errors.verifyNotZero(marketplaceInstance, "marketplaceInstance");
emit MarketplaceSet(marketplaceInstance);
_marketplace = IMarketplace(marketplaceInstance);
_verifySystemsAgree(marketplaceInstance);
}
/// @notice Set the Whitelist for this instance of the system
/// @param whitelistInstance Address of the whitelist
function setWhiltelist(address whitelistInstance) external onlyOwner {
Errors.verifyNotZero(whitelistInstance, "whitelistInstance");
emit WhitelistSet(whitelistInstance);
_whitelist = IWhitelist(whitelistInstance);
_verifySystemsAgree(whitelistInstance);
}
/// @notice Set the SantionList
/// @param sanctionsListInstance Address of the SanctionsList
function setSanctionsList(
address sanctionsListInstance
) external onlyOwner {
Errors.verifyNotZero(sanctionsListInstance, "sanctionsListInstance");
emit SanctionsListSet(sanctionsListInstance);
_sanctionsList = ISanctionsList(sanctionsListInstance);
}
/// @notice Set the LockNftMinter for this instance of the system
/// @param lockNftMinterInstance Address of the LockNftMinter.sol
function setLockNftMinter(
address lockNftMinterInstance
) external onlyOwner {
Errors.verifyNotZero(lockNftMinterInstance, "lockNftMinter");
emit LockNftMinterSet(lockNftMinterInstance);
_lockNftMinter = ILockNFT(lockNftMinterInstance);
_verifySystemsAgree(lockNftMinterInstance);
}
/// @notice Set the LockNft for this instance of the system
/// @param lockNftInstance Address of the LockNFT.sol
function setLockNft(address lockNftInstance) external onlyOwner {
Errors.verifyNotZero(lockNftInstance, "lockNftInstance");
emit LockNftSet(lockNftInstance);
_lockNft = ILockNFT(lockNftInstance);
_verifySystemsAgree(lockNftInstance);
}
/// @notice Set the XeqFeeManger.sol for this system
/// @param xeqFeeManagerInstance Address of the XeqFeeManager.sol
function setXeqFeeManager(
address xeqFeeManagerInstance
) external onlyOwner {
Errors.verifyNotZero(xeqFeeManagerInstance, "xeqFeeManagerInstance");
emit XeqFeeManagerSet(xeqFeeManagerInstance);
_xeqFeeManager = IXeqFeeManager(xeqFeeManagerInstance);
_verifySystemsAgree(xeqFeeManagerInstance);
}
/// @notice Set the XEQ token for this system
/// @param xeqToken Address of the XEQ token
function setXeq(address xeqToken) external onlyOwner {
Errors.verifyNotZero(xeqToken, "xeqToken");
emit XeqFeeManagerSet(xeqToken);
_xeq = IERC20(xeqToken);
_verifySystemsAgree(xeqToken);
}
/// @notice Set the SBT kyc for this system
/// @param sbtInstance Address of the SBT.sol
function setSBT(address sbtInstance) external onlyOwner {
Errors.verifyNotZero(sbtInstance, "sbtInstance");
emit SBTSet(sbtInstance);
_sbt = ISBT(sbtInstance);
_verifySystemsAgree(sbtInstance);
}
/// @notice Set the transfer manager for property tokens
/// @param transferManagerInstance Address of TransferManager
function setTransferManager(
address transferManagerInstance
) external onlyOwner {
Errors.verifyNotZero(
transferManagerInstance,
"transferManagerInstance"
);
emit TransferManagerSet(transferManagerInstance);
_transferManager = transferManagerInstance;
_verifySystemsAgree(transferManagerInstance);
}
/// @notice Set RootPriceOracle for this system
/// @param rootPriceOracleInstance Address RootPriceOracle.sol
function setRootPriceOracle(
address rootPriceOracleInstance
) external onlyOwner {
Errors.verifyNotZero(
rootPriceOracleInstance,
"rootPriceOracleInstance"
);
emit RootPriceOracleSet(rootPriceOracleInstance);
_rootPriceOracle = IRootPriceOracle(rootPriceOracleInstance);
_verifySystemsAgree(rootPriceOracleInstance);
}
/// @notice Set the System Security instance for this system
/// @param security Address of the security contract
function setSystemSecurity(address security) external onlyOwner {
Errors.verifyNotZero(security, "security");
emit SystemSecuritySet(security);
_systemSecurity = ISystemSecurity(security);
_verifySystemsAgree(security);
}
/// @notice Set the OCLR instance for this system
/// @param oclrInstance Address of the OCLR
function setOclr(address oclrInstance) external onlyOwner {
Errors.verifyNotZero(oclrInstance, "oclrInstance");
emit OclrSet(oclrInstance);
_oclr = oclrInstance;
_verifySystemsAgree(oclrInstance);
}
/// @notice Set the TRY address
/// @param Try Address of the TRY erc20
function setTry(address Try) external onlyOwner {
Errors.verifyNotZero(Try, "Try");
emit TrySet(Try);
_try = IERC20(Try);
}
/// @notice Set the USDC address
/// @param Usdc Address of the USDC erc20
function setUsdc(address Usdc) external onlyOwner {
Errors.verifyNotZero(Usdc, "Usdc");
emit UsdcSet(Usdc);
_usdc = IERC20(Usdc);
}
/// @notice Set the xUSDC address
/// @param xUsdc Address of the xUSDC erc20
function setXUsdc(address xUsdc) external onlyOwner {
Errors.verifyNotZero(xUsdc, "xUsdc");
emit XUsdcSet(xUsdc);
_xUsdc = IERC20(xUsdc);
}
/// @notice Set the SecondaryMarket.sol address
/// @param secondaryMarketInstance Address of the SecondaryMarket.sol
function setSecondaryMarket(
address secondaryMarketInstance
) external onlyOwner {
Errors.verifyNotZero(
secondaryMarketInstance,
"secondaryMarketInstance"
);
emit SecondaryMarketSet(secondaryMarketInstance);
_secondaryMarket = ISecondaryMarket(secondaryMarketInstance);
}
/* ******************************** */
/* Views */
/* ******************************** */
/// @inheritdoc ISystemRegistry
function accessController() external view returns (IAccessController) {
return _accessController;
}
/// @inheritdoc ISystemRegistry
function systemSecurity() external view returns (ISystemSecurity) {
return _systemSecurity;
}
/// @inheritdoc ISystemRegistry
function rentShare() external view returns (IRentShare) {
return _rentShare;
}
/// @inheritdoc ISystemRegistry
function rentDistributor() external view returns (IRentDistributor) {
return _rentDistributor;
}
/// @inheritdoc ISystemRegistry
function marketplace() external view returns (IMarketplace) {
return _marketplace;
}
/// @inheritdoc ISystemRegistry
function whitelist() external view returns (IWhitelist) {
return _whitelist;
}
/// @inheritdoc ISystemRegistry
function jarvisDex() external view returns (IJarvisDex) {
return _jarvisDex;
}
/// @inheritdoc ISystemRegistry
function dfxRouter() external view returns (IDFXRouter) {
return _dfxRouter;
}
/// @inheritdoc ISystemRegistry
function lockNftMinter() external view returns (ILockNFT) {
return _lockNftMinter;
}
/// @inheritdoc ISystemRegistry
function lockNft() external view returns (ILockNFT) {
return _lockNft;
}
/// @inheritdoc ISystemRegistry
function xeqFeeManager() external view returns (IXeqFeeManager) {
return _xeqFeeManager;
}
/// @inheritdoc ISystemRegistry
function oclr() external view returns (address) {
return _oclr;
}
/// @inheritdoc ISystemRegistry
function passkeyWalletFactory() external view returns (IPasskeyFactory) {
return _passkeyWalletFactory;
}
/// @inheritdoc ISystemRegistry
function TRY() external view returns (IERC20) {
return _try;
}
/// @inheritdoc ISystemRegistry
function sanctionsList() external view returns (ISanctionsList) {
return _sanctionsList;
}
/// @inheritdoc ISystemRegistry
function transferManager() external view returns (address) {
return _transferManager;
}
/// @inheritdoc ISystemRegistry
function USDC() external view returns (IERC20) {
return _usdc;
}
/// @inheritdoc ISystemRegistry
function xUSDC() external view returns (IERC20) {
return _xUsdc;
}
/// @inheritdoc ISystemRegistry
function xeq() external view returns (IERC20) {
return _xeq;
}
/// @inheritdoc ISystemRegistry
function rootPriceOracle() external view returns (IRootPriceOracle) {
return _rootPriceOracle;
}
/// @inheritdoc ISystemRegistry
function sbt() external view returns (ISBT) {
return _sbt;
}
/// @inheritdoc ISystemRegistry
function secondaryMarket() external view returns (ISecondaryMarket) {
return _secondaryMarket;
}
/// @notice Verifies that a system bound contract matches this contract
/// @dev All system bound contracts must match a registry contract. Will revert on mismatch
/// @param dep The contract to check
function _verifySystemsAgree(address dep) internal view {
// slither-disable-start low-level-calls
// solhint-disable-next-line avoid-low-level-calls
(bool success, bytes memory data) = dep.staticcall(
abi.encodeWithSignature("getSystemRegistry()")
);
// slither-disable-end low-level-calls
if (success) {
address depRegistry = abi.decode(data, (address));
if (depRegistry != address(this)) {
revert Errors.SystemMismatch(address(this), depRegistry);
}
} else {
revert InvalidContract(dep);
}
}
function _authorizeUpgrade(
address newImplementation
) internal override onlyOwner {}
}// SPDX-License-Identifier: MIT
// OpenZeppelin Contracts (last updated v4.9.0) (access/Ownable2Step.sol)
pragma solidity ^0.8.0;
import "./OwnableUpgradeable.sol";
import {Initializable} from "../proxy/utils/Initializable.sol";
/**
* @dev Contract module which provides access control mechanism, where
* there is an account (an owner) that can be granted exclusive access to
* specific functions.
*
* By default, the owner account will be the one that deploys the contract. This
* can later be changed with {transferOwnership} and {acceptOwnership}.
*
* This module is used through inheritance. It will make available all functions
* from parent (Ownable).
*/
abstract contract Ownable2StepUpgradeable is Initializable, OwnableUpgradeable {
address private _pendingOwner;
event OwnershipTransferStarted(address indexed previousOwner, address indexed newOwner);
function __Ownable2Step_init() internal onlyInitializing {
__Ownable_init_unchained();
}
function __Ownable2Step_init_unchained() internal onlyInitializing {
}
/**
* @dev Returns the address of the pending owner.
*/
function pendingOwner() public view virtual returns (address) {
return _pendingOwner;
}
/**
* @dev Starts the ownership transfer of the contract to a new account. Replaces the pending transfer if there is one.
* Can only be called by the current owner.
*/
function transferOwnership(address newOwner) public virtual override onlyOwner {
_pendingOwner = newOwner;
emit OwnershipTransferStarted(owner(), newOwner);
}
/**
* @dev Transfers ownership of the contract to a new account (`newOwner`) and deletes any pending owner.
* Internal function without access restriction.
*/
function _transferOwnership(address newOwner) internal virtual override {
delete _pendingOwner;
super._transferOwnership(newOwner);
}
/**
* @dev The new owner accepts the ownership transfer.
*/
function acceptOwnership() public virtual {
address sender = _msgSender();
require(pendingOwner() == sender, "Ownable2Step: caller is not the new owner");
_transferOwnership(sender);
}
/**
* @dev This empty reserved space is put in place to allow future versions to add new
* variables without shifting down storage in the inheritance chain.
* See https://docs.openzeppelin.com/contracts/4.x/upgradeable#storage_gaps
*/
uint256[49] private __gap;
}// SPDX-License-Identifier: MIT
// OpenZeppelin Contracts (last updated v4.9.0) (access/Ownable.sol)
pragma solidity ^0.8.0;
import "../utils/ContextUpgradeable.sol";
import {Initializable} from "../proxy/utils/Initializable.sol";
/**
* @dev Contract module which provides a basic access control mechanism, where
* there is an account (an owner) that can be granted exclusive access to
* specific functions.
*
* By default, the owner account will be the one that deploys the contract. This
* can later be changed with {transferOwnership}.
*
* This module is used through inheritance. It will make available the modifier
* `onlyOwner`, which can be applied to your functions to restrict their use to
* the owner.
*/
abstract contract OwnableUpgradeable is Initializable, ContextUpgradeable {
address private _owner;
event OwnershipTransferred(address indexed previousOwner, address indexed newOwner);
/**
* @dev Initializes the contract setting the deployer as the initial owner.
*/
function __Ownable_init() internal onlyInitializing {
__Ownable_init_unchained();
}
function __Ownable_init_unchained() internal onlyInitializing {
_transferOwnership(_msgSender());
}
/**
* @dev Throws if called by any account other than the owner.
*/
modifier onlyOwner() {
_checkOwner();
_;
}
/**
* @dev Returns the address of the current owner.
*/
function owner() public view virtual returns (address) {
return _owner;
}
/**
* @dev Throws if the sender is not the owner.
*/
function _checkOwner() internal view virtual {
require(owner() == _msgSender(), "Ownable: caller is not the owner");
}
/**
* @dev Leaves the contract without owner. It will not be possible to call
* `onlyOwner` functions. Can only be called by the current owner.
*
* NOTE: Renouncing ownership will leave the contract without an owner,
* thereby disabling any functionality that is only available to the owner.
*/
function renounceOwnership() public virtual onlyOwner {
_transferOwnership(address(0));
}
/**
* @dev Transfers ownership of the contract to a new account (`newOwner`).
* Can only be called by the current owner.
*/
function transferOwnership(address newOwner) public virtual onlyOwner {
require(newOwner != address(0), "Ownable: new owner is the zero address");
_transferOwnership(newOwner);
}
/**
* @dev Transfers ownership of the contract to a new account (`newOwner`).
* Internal function without access restriction.
*/
function _transferOwnership(address newOwner) internal virtual {
address oldOwner = _owner;
_owner = newOwner;
emit OwnershipTransferred(oldOwner, newOwner);
}
/**
* @dev This empty reserved space is put in place to allow future versions to add new
* variables without shifting down storage in the inheritance chain.
* See https://docs.openzeppelin.com/contracts/4.x/upgradeable#storage_gaps
*/
uint256[49] private __gap;
}// SPDX-License-Identifier: MIT
// OpenZeppelin Contracts (last updated v4.5.0) (interfaces/draft-IERC1822.sol)
pragma solidity ^0.8.0;
/**
* @dev ERC1822: Universal Upgradeable Proxy Standard (UUPS) documents a method for upgradeability through a simplified
* proxy whose upgrades are fully controlled by the current implementation.
*/
interface IERC1822ProxiableUpgradeable {
/**
* @dev Returns the storage slot that the proxiable contract assumes is being used to store the implementation
* address.
*
* IMPORTANT: A proxy pointing at a proxiable contract should not be considered proxiable itself, because this risks
* bricking a proxy that upgrades to it, by delegating to itself until out of gas. Thus it is critical that this
* function revert if invoked through a proxy.
*/
function proxiableUUID() external view returns (bytes32);
}// SPDX-License-Identifier: MIT
// OpenZeppelin Contracts (last updated v4.9.0) (interfaces/IERC1967.sol)
pragma solidity ^0.8.0;
/**
* @dev ERC-1967: Proxy Storage Slots. This interface contains the events defined in the ERC.
*
* _Available since v4.8.3._
*/
interface IERC1967Upgradeable {
/**
* @dev Emitted when the implementation is upgraded.
*/
event Upgraded(address indexed implementation);
/**
* @dev Emitted when the admin account has changed.
*/
event AdminChanged(address previousAdmin, address newAdmin);
/**
* @dev Emitted when the beacon is changed.
*/
event BeaconUpgraded(address indexed beacon);
}// SPDX-License-Identifier: MIT
// OpenZeppelin Contracts v4.4.1 (proxy/beacon/IBeacon.sol)
pragma solidity ^0.8.0;
/**
* @dev This is the interface that {BeaconProxy} expects of its beacon.
*/
interface IBeaconUpgradeable {
/**
* @dev Must return an address that can be used as a delegate call target.
*
* {BeaconProxy} will check that this address is a contract.
*/
function implementation() external view returns (address);
}// SPDX-License-Identifier: MIT
// OpenZeppelin Contracts (last updated v4.9.0) (proxy/ERC1967/ERC1967Upgrade.sol)
pragma solidity ^0.8.2;
import "../beacon/IBeaconUpgradeable.sol";
import "../../interfaces/IERC1967Upgradeable.sol";
import "../../interfaces/draft-IERC1822Upgradeable.sol";
import "../../utils/AddressUpgradeable.sol";
import "../../utils/StorageSlotUpgradeable.sol";
import {Initializable} from "../utils/Initializable.sol";
/**
* @dev This abstract contract provides getters and event emitting update functions for
* https://eips.ethereum.org/EIPS/eip-1967[EIP1967] slots.
*
* _Available since v4.1._
*/
abstract contract ERC1967UpgradeUpgradeable is Initializable, IERC1967Upgradeable {
// This is the keccak-256 hash of "eip1967.proxy.rollback" subtracted by 1
bytes32 private constant _ROLLBACK_SLOT = 0x4910fdfa16fed3260ed0e7147f7cc6da11a60208b5b9406d12a635614ffd9143;
/**
* @dev Storage slot with the address of the current implementation.
* This is the keccak-256 hash of "eip1967.proxy.implementation" subtracted by 1, and is
* validated in the constructor.
*/
bytes32 internal constant _IMPLEMENTATION_SLOT = 0x360894a13ba1a3210667c828492db98dca3e2076cc3735a920a3ca505d382bbc;
function __ERC1967Upgrade_init() internal onlyInitializing {
}
function __ERC1967Upgrade_init_unchained() internal onlyInitializing {
}
/**
* @dev Returns the current implementation address.
*/
function _getImplementation() internal view returns (address) {
return StorageSlotUpgradeable.getAddressSlot(_IMPLEMENTATION_SLOT).value;
}
/**
* @dev Stores a new address in the EIP1967 implementation slot.
*/
function _setImplementation(address newImplementation) private {
require(AddressUpgradeable.isContract(newImplementation), "ERC1967: new implementation is not a contract");
StorageSlotUpgradeable.getAddressSlot(_IMPLEMENTATION_SLOT).value = newImplementation;
}
/**
* @dev Perform implementation upgrade
*
* Emits an {Upgraded} event.
*/
function _upgradeTo(address newImplementation) internal {
_setImplementation(newImplementation);
emit Upgraded(newImplementation);
}
/**
* @dev Perform implementation upgrade with additional setup call.
*
* Emits an {Upgraded} event.
*/
function _upgradeToAndCall(address newImplementation, bytes memory data, bool forceCall) internal {
_upgradeTo(newImplementation);
if (data.length > 0 || forceCall) {
AddressUpgradeable.functionDelegateCall(newImplementation, data);
}
}
/**
* @dev Perform implementation upgrade with security checks for UUPS proxies, and additional setup call.
*
* Emits an {Upgraded} event.
*/
function _upgradeToAndCallUUPS(address newImplementation, bytes memory data, bool forceCall) internal {
// Upgrades from old implementations will perform a rollback test. This test requires the new
// implementation to upgrade back to the old, non-ERC1822 compliant, implementation. Removing
// this special case will break upgrade paths from old UUPS implementation to new ones.
if (StorageSlotUpgradeable.getBooleanSlot(_ROLLBACK_SLOT).value) {
_setImplementation(newImplementation);
} else {
try IERC1822ProxiableUpgradeable(newImplementation).proxiableUUID() returns (bytes32 slot) {
require(slot == _IMPLEMENTATION_SLOT, "ERC1967Upgrade: unsupported proxiableUUID");
} catch {
revert("ERC1967Upgrade: new implementation is not UUPS");
}
_upgradeToAndCall(newImplementation, data, forceCall);
}
}
/**
* @dev Storage slot with the admin of the contract.
* This is the keccak-256 hash of "eip1967.proxy.admin" subtracted by 1, and is
* validated in the constructor.
*/
bytes32 internal constant _ADMIN_SLOT = 0xb53127684a568b3173ae13b9f8a6016e243e63b6e8ee1178d6a717850b5d6103;
/**
* @dev Returns the current admin.
*/
function _getAdmin() internal view returns (address) {
return StorageSlotUpgradeable.getAddressSlot(_ADMIN_SLOT).value;
}
/**
* @dev Stores a new address in the EIP1967 admin slot.
*/
function _setAdmin(address newAdmin) private {
require(newAdmin != address(0), "ERC1967: new admin is the zero address");
StorageSlotUpgradeable.getAddressSlot(_ADMIN_SLOT).value = newAdmin;
}
/**
* @dev Changes the admin of the proxy.
*
* Emits an {AdminChanged} event.
*/
function _changeAdmin(address newAdmin) internal {
emit AdminChanged(_getAdmin(), newAdmin);
_setAdmin(newAdmin);
}
/**
* @dev The storage slot of the UpgradeableBeacon contract which defines the implementation for this proxy.
* This is bytes32(uint256(keccak256('eip1967.proxy.beacon')) - 1)) and is validated in the constructor.
*/
bytes32 internal constant _BEACON_SLOT = 0xa3f0ad74e5423aebfd80d3ef4346578335a9a72aeaee59ff6cb3582b35133d50;
/**
* @dev Returns the current beacon.
*/
function _getBeacon() internal view returns (address) {
return StorageSlotUpgradeable.getAddressSlot(_BEACON_SLOT).value;
}
/**
* @dev Stores a new beacon in the EIP1967 beacon slot.
*/
function _setBeacon(address newBeacon) private {
require(AddressUpgradeable.isContract(newBeacon), "ERC1967: new beacon is not a contract");
require(
AddressUpgradeable.isContract(IBeaconUpgradeable(newBeacon).implementation()),
"ERC1967: beacon implementation is not a contract"
);
StorageSlotUpgradeable.getAddressSlot(_BEACON_SLOT).value = newBeacon;
}
/**
* @dev Perform beacon upgrade with additional setup call. Note: This upgrades the address of the beacon, it does
* not upgrade the implementation contained in the beacon (see {UpgradeableBeacon-_setImplementation} for that).
*
* Emits a {BeaconUpgraded} event.
*/
function _upgradeBeaconToAndCall(address newBeacon, bytes memory data, bool forceCall) internal {
_setBeacon(newBeacon);
emit BeaconUpgraded(newBeacon);
if (data.length > 0 || forceCall) {
AddressUpgradeable.functionDelegateCall(IBeaconUpgradeable(newBeacon).implementation(), data);
}
}
/**
* @dev This empty reserved space is put in place to allow future versions to add new
* variables without shifting down storage in the inheritance chain.
* See https://docs.openzeppelin.com/contracts/4.x/upgradeable#storage_gaps
*/
uint256[50] private __gap;
}// SPDX-License-Identifier: MIT
// OpenZeppelin Contracts (last updated v4.9.0) (proxy/utils/Initializable.sol)
pragma solidity ^0.8.2;
import "../../utils/AddressUpgradeable.sol";
/**
* @dev This is a base contract to aid in writing upgradeable contracts, or any kind of contract that will be deployed
* behind a proxy. Since proxied contracts do not make use of a constructor, it's common to move constructor logic to an
* external initializer function, usually called `initialize`. It then becomes necessary to protect this initializer
* function so it can only be called once. The {initializer} modifier provided by this contract will have this effect.
*
* The initialization functions use a version number. Once a version number is used, it is consumed and cannot be
* reused. This mechanism prevents re-execution of each "step" but allows the creation of new initialization steps in
* case an upgrade adds a module that needs to be initialized.
*
* For example:
*
* [.hljs-theme-light.nopadding]
* ```solidity
* contract MyToken is ERC20Upgradeable {
* function initialize() initializer public {
* __ERC20_init("MyToken", "MTK");
* }
* }
*
* contract MyTokenV2 is MyToken, ERC20PermitUpgradeable {
* function initializeV2() reinitializer(2) public {
* __ERC20Permit_init("MyToken");
* }
* }
* ```
*
* TIP: To avoid leaving the proxy in an uninitialized state, the initializer function should be called as early as
* possible by providing the encoded function call as the `_data` argument to {ERC1967Proxy-constructor}.
*
* CAUTION: When used with inheritance, manual care must be taken to not invoke a parent initializer twice, or to ensure
* that all initializers are idempotent. This is not verified automatically as constructors are by Solidity.
*
* [CAUTION]
* ====
* Avoid leaving a contract uninitialized.
*
* An uninitialized contract can be taken over by an attacker. This applies to both a proxy and its implementation
* contract, which may impact the proxy. To prevent the implementation contract from being used, you should invoke
* the {_disableInitializers} function in the constructor to automatically lock it when it is deployed:
*
* [.hljs-theme-light.nopadding]
* ```
* /// @custom:oz-upgrades-unsafe-allow constructor
* constructor() {
* _disableInitializers();
* }
* ```
* ====
*/
abstract contract Initializable {
/**
* @dev Indicates that the contract has been initialized.
* @custom:oz-retyped-from bool
*/
uint8 private _initialized;
/**
* @dev Indicates that the contract is in the process of being initialized.
*/
bool private _initializing;
/**
* @dev Triggered when the contract has been initialized or reinitialized.
*/
event Initialized(uint8 version);
/**
* @dev A modifier that defines a protected initializer function that can be invoked at most once. In its scope,
* `onlyInitializing` functions can be used to initialize parent contracts.
*
* Similar to `reinitializer(1)`, except that functions marked with `initializer` can be nested in the context of a
* constructor.
*
* Emits an {Initialized} event.
*/
modifier initializer() {
bool isTopLevelCall = !_initializing;
require(
(isTopLevelCall && _initialized < 1) || (!AddressUpgradeable.isContract(address(this)) && _initialized == 1),
"Initializable: contract is already initialized"
);
_initialized = 1;
if (isTopLevelCall) {
_initializing = true;
}
_;
if (isTopLevelCall) {
_initializing = false;
emit Initialized(1);
}
}
/**
* @dev A modifier that defines a protected reinitializer function that can be invoked at most once, and only if the
* contract hasn't been initialized to a greater version before. In its scope, `onlyInitializing` functions can be
* used to initialize parent contracts.
*
* A reinitializer may be used after the original initialization step. This is essential to configure modules that
* are added through upgrades and that require initialization.
*
* When `version` is 1, this modifier is similar to `initializer`, except that functions marked with `reinitializer`
* cannot be nested. If one is invoked in the context of another, execution will revert.
*
* Note that versions can jump in increments greater than 1; this implies that if multiple reinitializers coexist in
* a contract, executing them in the right order is up to the developer or operator.
*
* WARNING: setting the version to 255 will prevent any future reinitialization.
*
* Emits an {Initialized} event.
*/
modifier reinitializer(uint8 version) {
require(!_initializing && _initialized < version, "Initializable: contract is already initialized");
_initialized = version;
_initializing = true;
_;
_initializing = false;
emit Initialized(version);
}
/**
* @dev Modifier to protect an initialization function so that it can only be invoked by functions with the
* {initializer} and {reinitializer} modifiers, directly or indirectly.
*/
modifier onlyInitializing() {
require(_initializing, "Initializable: contract is not initializing");
_;
}
/**
* @dev Locks the contract, preventing any future reinitialization. This cannot be part of an initializer call.
* Calling this in the constructor of a contract will prevent that contract from being initialized or reinitialized
* to any version. It is recommended to use this to lock implementation contracts that are designed to be called
* through proxies.
*
* Emits an {Initialized} event the first time it is successfully executed.
*/
function _disableInitializers() internal virtual {
require(!_initializing, "Initializable: contract is initializing");
if (_initialized != type(uint8).max) {
_initialized = type(uint8).max;
emit Initialized(type(uint8).max);
}
}
/**
* @dev Returns the highest version that has been initialized. See {reinitializer}.
*/
function _getInitializedVersion() internal view returns (uint8) {
return _initialized;
}
/**
* @dev Returns `true` if the contract is currently initializing. See {onlyInitializing}.
*/
function _isInitializing() internal view returns (bool) {
return _initializing;
}
}// SPDX-License-Identifier: MIT
// OpenZeppelin Contracts (last updated v4.9.0) (proxy/utils/UUPSUpgradeable.sol)
pragma solidity ^0.8.0;
import "../../interfaces/draft-IERC1822Upgradeable.sol";
import "../ERC1967/ERC1967UpgradeUpgradeable.sol";
import {Initializable} from "./Initializable.sol";
/**
* @dev An upgradeability mechanism designed for UUPS proxies. The functions included here can perform an upgrade of an
* {ERC1967Proxy}, when this contract is set as the implementation behind such a proxy.
*
* A security mechanism ensures that an upgrade does not turn off upgradeability accidentally, although this risk is
* reinstated if the upgrade retains upgradeability but removes the security mechanism, e.g. by replacing
* `UUPSUpgradeable` with a custom implementation of upgrades.
*
* The {_authorizeUpgrade} function must be overridden to include access restriction to the upgrade mechanism.
*
* _Available since v4.1._
*/
abstract contract UUPSUpgradeable is Initializable, IERC1822ProxiableUpgradeable, ERC1967UpgradeUpgradeable {
/// @custom:oz-upgrades-unsafe-allow state-variable-immutable state-variable-assignment
address private immutable __self = address(this);
/**
* @dev Check that the execution is being performed through a delegatecall call and that the execution context is
* a proxy contract with an implementation (as defined in ERC1967) pointing to self. This should only be the case
* for UUPS and transparent proxies that are using the current contract as their implementation. Execution of a
* function through ERC1167 minimal proxies (clones) would not normally pass this test, but is not guaranteed to
* fail.
*/
modifier onlyProxy() {
require(address(this) != __self, "Function must be called through delegatecall");
require(_getImplementation() == __self, "Function must be called through active proxy");
_;
}
/**
* @dev Check that the execution is not being performed through a delegate call. This allows a function to be
* callable on the implementing contract but not through proxies.
*/
modifier notDelegated() {
require(address(this) == __self, "UUPSUpgradeable: must not be called through delegatecall");
_;
}
function __UUPSUpgradeable_init() internal onlyInitializing {
}
function __UUPSUpgradeable_init_unchained() internal onlyInitializing {
}
/**
* @dev Implementation of the ERC1822 {proxiableUUID} function. This returns the storage slot used by the
* implementation. It is used to validate the implementation's compatibility when performing an upgrade.
*
* IMPORTANT: A proxy pointing at a proxiable contract should not be considered proxiable itself, because this risks
* bricking a proxy that upgrades to it, by delegating to itself until out of gas. Thus it is critical that this
* function revert if invoked through a proxy. This is guaranteed by the `notDelegated` modifier.
*/
function proxiableUUID() external view virtual override notDelegated returns (bytes32) {
return _IMPLEMENTATION_SLOT;
}
/**
* @dev Upgrade the implementation of the proxy to `newImplementation`.
*
* Calls {_authorizeUpgrade}.
*
* Emits an {Upgraded} event.
*
* @custom:oz-upgrades-unsafe-allow-reachable delegatecall
*/
function upgradeTo(address newImplementation) public virtual onlyProxy {
_authorizeUpgrade(newImplementation);
_upgradeToAndCallUUPS(newImplementation, new bytes(0), false);
}
/**
* @dev Upgrade the implementation of the proxy to `newImplementation`, and subsequently execute the function call
* encoded in `data`.
*
* Calls {_authorizeUpgrade}.
*
* Emits an {Upgraded} event.
*
* @custom:oz-upgrades-unsafe-allow-reachable delegatecall
*/
function upgradeToAndCall(address newImplementation, bytes memory data) public payable virtual onlyProxy {
_authorizeUpgrade(newImplementation);
_upgradeToAndCallUUPS(newImplementation, data, true);
}
/**
* @dev Function that should revert when `msg.sender` is not authorized to upgrade the contract. Called by
* {upgradeTo} and {upgradeToAndCall}.
*
* Normally, this function will use an xref:access.adoc[access control] modifier such as {Ownable-onlyOwner}.
*
* ```solidity
* function _authorizeUpgrade(address) internal override onlyOwner {}
* ```
*/
function _authorizeUpgrade(address newImplementation) internal virtual;
/**
* @dev This empty reserved space is put in place to allow future versions to add new
* variables without shifting down storage in the inheritance chain.
* See https://docs.openzeppelin.com/contracts/4.x/upgradeable#storage_gaps
*/
uint256[50] private __gap;
}// SPDX-License-Identifier: MIT
// OpenZeppelin Contracts (last updated v4.9.0) (utils/Address.sol)
pragma solidity ^0.8.1;
/**
* @dev Collection of functions related to the address type
*/
library AddressUpgradeable {
/**
* @dev Returns true if `account` is a contract.
*
* [IMPORTANT]
* ====
* It is unsafe to assume that an address for which this function returns
* false is an externally-owned account (EOA) and not a contract.
*
* Among others, `isContract` will return false for the following
* types of addresses:
*
* - an externally-owned account
* - a contract in construction
* - an address where a contract will be created
* - an address where a contract lived, but was destroyed
*
* Furthermore, `isContract` will also return true if the target contract within
* the same transaction is already scheduled for destruction by `SELFDESTRUCT`,
* which only has an effect at the end of a transaction.
* ====
*
* [IMPORTANT]
* ====
* You shouldn't rely on `isContract` to protect against flash loan attacks!
*
* Preventing calls from contracts is highly discouraged. It breaks composability, breaks support for smart wallets
* like Gnosis Safe, and does not provide security since it can be circumvented by calling from a contract
* constructor.
* ====
*/
function isContract(address account) internal view returns (bool) {
// This method relies on extcodesize/address.code.length, which returns 0
// for contracts in construction, since the code is only stored at the end
// of the constructor execution.
return account.code.length > 0;
}
/**
* @dev Replacement for Solidity's `transfer`: sends `amount` wei to
* `recipient`, forwarding all available gas and reverting on errors.
*
* https://eips.ethereum.org/EIPS/eip-1884[EIP1884] increases the gas cost
* of certain opcodes, possibly making contracts go over the 2300 gas limit
* imposed by `transfer`, making them unable to receive funds via
* `transfer`. {sendValue} removes this limitation.
*
* https://consensys.net/diligence/blog/2019/09/stop-using-soliditys-transfer-now/[Learn more].
*
* IMPORTANT: because control is transferred to `recipient`, care must be
* taken to not create reentrancy vulnerabilities. Consider using
* {ReentrancyGuard} or the
* https://solidity.readthedocs.io/en/v0.8.0/security-considerations.html#use-the-checks-effects-interactions-pattern[checks-effects-interactions pattern].
*/
function sendValue(address payable recipient, uint256 amount) internal {
require(address(this).balance >= amount, "Address: insufficient balance");
(bool success, ) = recipient.call{value: amount}("");
require(success, "Address: unable to send value, recipient may have reverted");
}
/**
* @dev Performs a Solidity function call using a low level `call`. A
* plain `call` is an unsafe replacement for a function call: use this
* function instead.
*
* If `target` reverts with a revert reason, it is bubbled up by this
* function (like regular Solidity function calls).
*
* Returns the raw returned data. To convert to the expected return value,
* use https://solidity.readthedocs.io/en/latest/units-and-global-variables.html?highlight=abi.decode#abi-encoding-and-decoding-functions[`abi.decode`].
*
* Requirements:
*
* - `target` must be a contract.
* - calling `target` with `data` must not revert.
*
* _Available since v3.1._
*/
function functionCall(address target, bytes memory data) internal returns (bytes memory) {
return functionCallWithValue(target, data, 0, "Address: low-level call failed");
}
/**
* @dev Same as {xref-Address-functionCall-address-bytes-}[`functionCall`], but with
* `errorMessage` as a fallback revert reason when `target` reverts.
*
* _Available since v3.1._
*/
function functionCall(
address target,
bytes memory data,
string memory errorMessage
) internal returns (bytes memory) {
return functionCallWithValue(target, data, 0, errorMessage);
}
/**
* @dev Same as {xref-Address-functionCall-address-bytes-}[`functionCall`],
* but also transferring `value` wei to `target`.
*
* Requirements:
*
* - the calling contract must have an ETH balance of at least `value`.
* - the called Solidity function must be `payable`.
*
* _Available since v3.1._
*/
function functionCallWithValue(address target, bytes memory data, uint256 value) internal returns (bytes memory) {
return functionCallWithValue(target, data, value, "Address: low-level call with value failed");
}
/**
* @dev Same as {xref-Address-functionCallWithValue-address-bytes-uint256-}[`functionCallWithValue`], but
* with `errorMessage` as a fallback revert reason when `target` reverts.
*
* _Available since v3.1._
*/
function functionCallWithValue(
address target,
bytes memory data,
uint256 value,
string memory errorMessage
) internal returns (bytes memory) {
require(address(this).balance >= value, "Address: insufficient balance for call");
(bool success, bytes memory returndata) = target.call{value: value}(data);
return verifyCallResultFromTarget(target, success, returndata, errorMessage);
}
/**
* @dev Same as {xref-Address-functionCall-address-bytes-}[`functionCall`],
* but performing a static call.
*
* _Available since v3.3._
*/
function functionStaticCall(address target, bytes memory data) internal view returns (bytes memory) {
return functionStaticCall(target, data, "Address: low-level static call failed");
}
/**
* @dev Same as {xref-Address-functionCall-address-bytes-string-}[`functionCall`],
* but performing a static call.
*
* _Available since v3.3._
*/
function functionStaticCall(
address target,
bytes memory data,
string memory errorMessage
) internal view returns (bytes memory) {
(bool success, bytes memory returndata) = target.staticcall(data);
return verifyCallResultFromTarget(target, success, returndata, errorMessage);
}
/**
* @dev Same as {xref-Address-functionCall-address-bytes-}[`functionCall`],
* but performing a delegate call.
*
* _Available since v3.4._
*/
function functionDelegateCall(address target, bytes memory data) internal returns (bytes memory) {
return functionDelegateCall(target, data, "Address: low-level delegate call failed");
}
/**
* @dev Same as {xref-Address-functionCall-address-bytes-string-}[`functionCall`],
* but performing a delegate call.
*
* _Available since v3.4._
*/
function functionDelegateCall(
address target,
bytes memory data,
string memory errorMessage
) internal returns (bytes memory) {
(bool success, bytes memory returndata) = target.delegatecall(data);
return verifyCallResultFromTarget(target, success, returndata, errorMessage);
}
/**
* @dev Tool to verify that a low level call to smart-contract was successful, and revert (either by bubbling
* the revert reason or using the provided one) in case of unsuccessful call or if target was not a contract.
*
* _Available since v4.8._
*/
function verifyCallResultFromTarget(
address target,
bool success,
bytes memory returndata,
string memory errorMessage
) internal view returns (bytes memory) {
if (success) {
if (returndata.length == 0) {
// only check isContract if the call was successful and the return data is empty
// otherwise we already know that it was a contract
require(isContract(target), "Address: call to non-contract");
}
return returndata;
} else {
_revert(returndata, errorMessage);
}
}
/**
* @dev Tool to verify that a low level call was successful, and revert if it wasn't, either by bubbling the
* revert reason or using the provided one.
*
* _Available since v4.3._
*/
function verifyCallResult(
bool success,
bytes memory returndata,
string memory errorMessage
) internal pure returns (bytes memory) {
if (success) {
return returndata;
} else {
_revert(returndata, errorMessage);
}
}
function _revert(bytes memory returndata, string memory errorMessage) private pure {
// Look for revert reason and bubble it up if present
if (returndata.length > 0) {
// The easiest way to bubble the revert reason is using memory via assembly
/// @solidity memory-safe-assembly
assembly {
let returndata_size := mload(returndata)
revert(add(32, returndata), returndata_size)
}
} else {
revert(errorMessage);
}
}
}// SPDX-License-Identifier: MIT
// OpenZeppelin Contracts (last updated v4.9.4) (utils/Context.sol)
pragma solidity ^0.8.0;
import {Initializable} from "../proxy/utils/Initializable.sol";
/**
* @dev Provides information about the current execution context, including the
* sender of the transaction and its data. While these are generally available
* via msg.sender and msg.data, they should not be accessed in such a direct
* manner, since when dealing with meta-transactions the account sending and
* paying for execution may not be the actual sender (as far as an application
* is concerned).
*
* This contract is only required for intermediate, library-like contracts.
*/
abstract contract ContextUpgradeable is Initializable {
function __Context_init() internal onlyInitializing {
}
function __Context_init_unchained() internal onlyInitializing {
}
function _msgSender() internal view virtual returns (address) {
return msg.sender;
}
function _msgData() internal view virtual returns (bytes calldata) {
return msg.data;
}
function _contextSuffixLength() internal view virtual returns (uint256) {
return 0;
}
/**
* @dev This empty reserved space is put in place to allow future versions to add new
* variables without shifting down storage in the inheritance chain.
* See https://docs.openzeppelin.com/contracts/4.x/upgradeable#storage_gaps
*/
uint256[50] private __gap;
}// SPDX-License-Identifier: MIT
// OpenZeppelin Contracts (last updated v4.9.0) (utils/StorageSlot.sol)
// This file was procedurally generated from scripts/generate/templates/StorageSlot.js.
pragma solidity ^0.8.0;
/**
* @dev Library for reading and writing primitive types to specific storage slots.
*
* Storage slots are often used to avoid storage conflict when dealing with upgradeable contracts.
* This library helps with reading and writing to such slots without the need for inline assembly.
*
* The functions in this library return Slot structs that contain a `value` member that can be used to read or write.
*
* Example usage to set ERC1967 implementation slot:
* ```solidity
* contract ERC1967 {
* bytes32 internal constant _IMPLEMENTATION_SLOT = 0x360894a13ba1a3210667c828492db98dca3e2076cc3735a920a3ca505d382bbc;
*
* function _getImplementation() internal view returns (address) {
* return StorageSlot.getAddressSlot(_IMPLEMENTATION_SLOT).value;
* }
*
* function _setImplementation(address newImplementation) internal {
* require(Address.isContract(newImplementation), "ERC1967: new implementation is not a contract");
* StorageSlot.getAddressSlot(_IMPLEMENTATION_SLOT).value = newImplementation;
* }
* }
* ```
*
* _Available since v4.1 for `address`, `bool`, `bytes32`, `uint256`._
* _Available since v4.9 for `string`, `bytes`._
*/
library StorageSlotUpgradeable {
struct AddressSlot {
address value;
}
struct BooleanSlot {
bool value;
}
struct Bytes32Slot {
bytes32 value;
}
struct Uint256Slot {
uint256 value;
}
struct StringSlot {
string value;
}
struct BytesSlot {
bytes value;
}
/**
* @dev Returns an `AddressSlot` with member `value` located at `slot`.
*/
function getAddressSlot(bytes32 slot) internal pure returns (AddressSlot storage r) {
/// @solidity memory-safe-assembly
assembly {
r.slot := slot
}
}
/**
* @dev Returns an `BooleanSlot` with member `value` located at `slot`.
*/
function getBooleanSlot(bytes32 slot) internal pure returns (BooleanSlot storage r) {
/// @solidity memory-safe-assembly
assembly {
r.slot := slot
}
}
/**
* @dev Returns an `Bytes32Slot` with member `value` located at `slot`.
*/
function getBytes32Slot(bytes32 slot) internal pure returns (Bytes32Slot storage r) {
/// @solidity memory-safe-assembly
assembly {
r.slot := slot
}
}
/**
* @dev Returns an `Uint256Slot` with member `value` located at `slot`.
*/
function getUint256Slot(bytes32 slot) internal pure returns (Uint256Slot storage r) {
/// @solidity memory-safe-assembly
assembly {
r.slot := slot
}
}
/**
* @dev Returns an `StringSlot` with member `value` located at `slot`.
*/
function getStringSlot(bytes32 slot) internal pure returns (StringSlot storage r) {
/// @solidity memory-safe-assembly
assembly {
r.slot := slot
}
}
/**
* @dev Returns an `StringSlot` representation of the string storage pointer `store`.
*/
function getStringSlot(string storage store) internal pure returns (StringSlot storage r) {
/// @solidity memory-safe-assembly
assembly {
r.slot := store.slot
}
}
/**
* @dev Returns an `BytesSlot` with member `value` located at `slot`.
*/
function getBytesSlot(bytes32 slot) internal pure returns (BytesSlot storage r) {
/// @solidity memory-safe-assembly
assembly {
r.slot := slot
}
}
/**
* @dev Returns an `BytesSlot` representation of the bytes storage pointer `store`.
*/
function getBytesSlot(bytes storage store) internal pure returns (BytesSlot storage r) {
/// @solidity memory-safe-assembly
assembly {
r.slot := store.slot
}
}
}// SPDX-License-Identifier: MIT
// OpenZeppelin Contracts v4.4.1 (access/IAccessControl.sol)
pragma solidity ^0.8.0;
/**
* @dev External interface of AccessControl declared to support ERC165 detection.
*/
interface IAccessControl {
/**
* @dev Emitted when `newAdminRole` is set as ``role``'s admin role, replacing `previousAdminRole`
*
* `DEFAULT_ADMIN_ROLE` is the starting admin for all roles, despite
* {RoleAdminChanged} not being emitted signaling this.
*
* _Available since v3.1._
*/
event RoleAdminChanged(bytes32 indexed role, bytes32 indexed previousAdminRole, bytes32 indexed newAdminRole);
/**
* @dev Emitted when `account` is granted `role`.
*
* `sender` is the account that originated the contract call, an admin role
* bearer except when using {AccessControl-_setupRole}.
*/
event RoleGranted(bytes32 indexed role, address indexed account, address indexed sender);
/**
* @dev Emitted when `account` is revoked `role`.
*
* `sender` is the account that originated the contract call:
* - if using `revokeRole`, it is the admin role bearer
* - if using `renounceRole`, it is the role bearer (i.e. `account`)
*/
event RoleRevoked(bytes32 indexed role, address indexed account, address indexed sender);
/**
* @dev Returns `true` if `account` has been granted `role`.
*/
function hasRole(bytes32 role, address account) external view returns (bool);
/**
* @dev Returns the admin role that controls `role`. See {grantRole} and
* {revokeRole}.
*
* To change a role's admin, use {AccessControl-_setRoleAdmin}.
*/
function getRoleAdmin(bytes32 role) external view returns (bytes32);
/**
* @dev Grants `role` to `account`.
*
* If `account` had not been already granted `role`, emits a {RoleGranted}
* event.
*
* Requirements:
*
* - the caller must have ``role``'s admin role.
*/
function grantRole(bytes32 role, address account) external;
/**
* @dev Revokes `role` from `account`.
*
* If `account` had been granted `role`, emits a {RoleRevoked} event.
*
* Requirements:
*
* - the caller must have ``role``'s admin role.
*/
function revokeRole(bytes32 role, address account) external;
/**
* @dev Revokes `role` from the calling account.
*
* Roles are often managed via {grantRole} and {revokeRole}: this function's
* purpose is to provide a mechanism for accounts to lose their privileges
* if they are compromised (such as when a trusted device is misplaced).
*
* If the calling account had been granted `role`, emits a {RoleRevoked}
* event.
*
* Requirements:
*
* - the caller must be `account`.
*/
function renounceRole(bytes32 role, address account) external;
}// SPDX-License-Identifier: MIT
// OpenZeppelin Contracts v4.4.1 (access/IAccessControlEnumerable.sol)
pragma solidity ^0.8.0;
import "./IAccessControl.sol";
/**
* @dev External interface of AccessControlEnumerable declared to support ERC165 detection.
*/
interface IAccessControlEnumerable is IAccessControl {
/**
* @dev Returns one of the accounts that have `role`. `index` must be a
* value between 0 and {getRoleMemberCount}, non-inclusive.
*
* Role bearers are not sorted in any particular way, and their ordering may
* change at any point.
*
* WARNING: When using {getRoleMember} and {getRoleMemberCount}, make sure
* you perform all queries on the same block. See the following
* https://forum.openzeppelin.com/t/iterating-over-elements-on-enumerableset-in-openzeppelin-contracts/2296[forum post]
* for more information.
*/
function getRoleMember(bytes32 role, uint256 index) external view returns (address);
/**
* @dev Returns the number of accounts that have `role`. Can be used
* together with {getRoleMember} to enumerate all bearers of a role.
*/
function getRoleMemberCount(bytes32 role) external view returns (uint256);
}// SPDX-License-Identifier: MIT
// OpenZeppelin Contracts (last updated v4.9.0) (access/Ownable.sol)
pragma solidity ^0.8.0;
import "../utils/Context.sol";
/**
* @dev Contract module which provides a basic access control mechanism, where
* there is an account (an owner) that can be granted exclusive access to
* specific functions.
*
* By default, the owner account will be the one that deploys the contract. This
* can later be changed with {transferOwnership}.
*
* This module is used through inheritance. It will make available the modifier
* `onlyOwner`, which can be applied to your functions to restrict their use to
* the owner.
*/
abstract contract Ownable is Context {
address private _owner;
event OwnershipTransferred(address indexed previousOwner, address indexed newOwner);
/**
* @dev Initializes the contract setting the deployer as the initial owner.
*/
constructor() {
_transferOwnership(_msgSender());
}
/**
* @dev Throws if called by any account other than the owner.
*/
modifier onlyOwner() {
_checkOwner();
_;
}
/**
* @dev Returns the address of the current owner.
*/
function owner() public view virtual returns (address) {
return _owner;
}
/**
* @dev Throws if the sender is not the owner.
*/
function _checkOwner() internal view virtual {
require(owner() == _msgSender(), "Ownable: caller is not the owner");
}
/**
* @dev Leaves the contract without owner. It will not be possible to call
* `onlyOwner` functions. Can only be called by the current owner.
*
* NOTE: Renouncing ownership will leave the contract without an owner,
* thereby disabling any functionality that is only available to the owner.
*/
function renounceOwnership() public virtual onlyOwner {
_transferOwnership(address(0));
}
/**
* @dev Transfers ownership of the contract to a new account (`newOwner`).
* Can only be called by the current owner.
*/
function transferOwnership(address newOwner) public virtual onlyOwner {
require(newOwner != address(0), "Ownable: new owner is the zero address");
_transferOwnership(newOwner);
}
/**
* @dev Transfers ownership of the contract to a new account (`newOwner`).
* Internal function without access restriction.
*/
function _transferOwnership(address newOwner) internal virtual {
address oldOwner = _owner;
_owner = newOwner;
emit OwnershipTransferred(oldOwner, newOwner);
}
}// SPDX-License-Identifier: MIT
// OpenZeppelin Contracts (last updated v4.9.0) (access/Ownable2Step.sol)
pragma solidity ^0.8.0;
import "./Ownable.sol";
/**
* @dev Contract module which provides access control mechanism, where
* there is an account (an owner) that can be granted exclusive access to
* specific functions.
*
* By default, the owner account will be the one that deploys the contract. This
* can later be changed with {transferOwnership} and {acceptOwnership}.
*
* This module is used through inheritance. It will make available all functions
* from parent (Ownable).
*/
abstract contract Ownable2Step is Ownable {
address private _pendingOwner;
event OwnershipTransferStarted(address indexed previousOwner, address indexed newOwner);
/**
* @dev Returns the address of the pending owner.
*/
function pendingOwner() public view virtual returns (address) {
return _pendingOwner;
}
/**
* @dev Starts the ownership transfer of the contract to a new account. Replaces the pending transfer if there is one.
* Can only be called by the current owner.
*/
function transferOwnership(address newOwner) public virtual override onlyOwner {
_pendingOwner = newOwner;
emit OwnershipTransferStarted(owner(), newOwner);
}
/**
* @dev Transfers ownership of the contract to a new account (`newOwner`) and deletes any pending owner.
* Internal function without access restriction.
*/
function _transferOwnership(address newOwner) internal virtual override {
delete _pendingOwner;
super._transferOwnership(newOwner);
}
/**
* @dev The new owner accepts the ownership transfer.
*/
function acceptOwnership() public virtual {
address sender = _msgSender();
require(pendingOwner() == sender, "Ownable2Step: caller is not the new owner");
_transferOwnership(sender);
}
}// SPDX-License-Identifier: MIT
// OpenZeppelin Contracts v4.4.1 (token/ERC20/extensions/IERC20Metadata.sol)
pragma solidity ^0.8.0;
import "../IERC20.sol";
/**
* @dev Interface for the optional metadata functions from the ERC20 standard.
*
* _Available since v4.1._
*/
interface IERC20Metadata is IERC20 {
/**
* @dev Returns the name of the token.
*/
function name() external view returns (string memory);
/**
* @dev Returns the symbol of the token.
*/
function symbol() external view returns (string memory);
/**
* @dev Returns the decimals places of the token.
*/
function decimals() external view returns (uint8);
}// SPDX-License-Identifier: MIT
// OpenZeppelin Contracts (last updated v4.9.0) (token/ERC20/IERC20.sol)
pragma solidity ^0.8.0;
/**
* @dev Interface of the ERC20 standard as defined in the EIP.
*/
interface IERC20 {
/**
* @dev Emitted when `value` tokens are moved from one account (`from`) to
* another (`to`).
*
* Note that `value` may be zero.
*/
event Transfer(address indexed from, address indexed to, uint256 value);
/**
* @dev Emitted when the allowance of a `spender` for an `owner` is set by
* a call to {approve}. `value` is the new allowance.
*/
event Approval(address indexed owner, address indexed spender, uint256 value);
/**
* @dev Returns the amount of tokens in existence.
*/
function totalSupply() external view returns (uint256);
/**
* @dev Returns the amount of tokens owned by `account`.
*/
function balanceOf(address account) external view returns (uint256);
/**
* @dev Moves `amount` tokens from the caller's account to `to`.
*
* Returns a boolean value indicating whether the operation succeeded.
*
* Emits a {Transfer} event.
*/
function transfer(address to, uint256 amount) external returns (bool);
/**
* @dev Returns the remaining number of tokens that `spender` will be
* allowed to spend on behalf of `owner` through {transferFrom}. This is
* zero by default.
*
* This value changes when {approve} or {transferFrom} are called.
*/
function allowance(address owner, address spender) external view returns (uint256);
/**
* @dev Sets `amount` as the allowance of `spender` over the caller's tokens.
*
* Returns a boolean value indicating whether the operation succeeded.
*
* IMPORTANT: Beware that changing an allowance with this method brings the risk
* that someone may use both the old and the new allowance by unfortunate
* transaction ordering. One possible solution to mitigate this race
* condition is to first reduce the spender's allowance to 0 and set the
* desired value afterwards:
* https://github.com/ethereum/EIPs/issues/20#issuecomment-263524729
*
* Emits an {Approval} event.
*/
function approve(address spender, uint256 amount) external returns (bool);
/**
* @dev Moves `amount` tokens from `from` to `to` using the
* allowance mechanism. `amount` is then deducted from the caller's
* allowance.
*
* Returns a boolean value indicating whether the operation succeeded.
*
* Emits a {Transfer} event.
*/
function transferFrom(address from, address to, uint256 amount) external returns (bool);
}// SPDX-License-Identifier: MIT
// OpenZeppelin Contracts (last updated v4.9.0) (utils/Address.sol)
pragma solidity ^0.8.1;
/**
* @dev Collection of functions related to the address type
*/
library Address {
/**
* @dev Returns true if `account` is a contract.
*
* [IMPORTANT]
* ====
* It is unsafe to assume that an address for which this function returns
* false is an externally-owned account (EOA) and not a contract.
*
* Among others, `isContract` will return false for the following
* types of addresses:
*
* - an externally-owned account
* - a contract in construction
* - an address where a contract will be created
* - an address where a contract lived, but was destroyed
*
* Furthermore, `isContract` will also return true if the target contract within
* the same transaction is already scheduled for destruction by `SELFDESTRUCT`,
* which only has an effect at the end of a transaction.
* ====
*
* [IMPORTANT]
* ====
* You shouldn't rely on `isContract` to protect against flash loan attacks!
*
* Preventing calls from contracts is highly discouraged. It breaks composability, breaks support for smart wallets
* like Gnosis Safe, and does not provide security since it can be circumvented by calling from a contract
* constructor.
* ====
*/
function isContract(address account) internal view returns (bool) {
// This method relies on extcodesize/address.code.length, which returns 0
// for contracts in construction, since the code is only stored at the end
// of the constructor execution.
return account.code.length > 0;
}
/**
* @dev Replacement for Solidity's `transfer`: sends `amount` wei to
* `recipient`, forwarding all available gas and reverting on errors.
*
* https://eips.ethereum.org/EIPS/eip-1884[EIP1884] increases the gas cost
* of certain opcodes, possibly making contracts go over the 2300 gas limit
* imposed by `transfer`, making them unable to receive funds via
* `transfer`. {sendValue} removes this limitation.
*
* https://consensys.net/diligence/blog/2019/09/stop-using-soliditys-transfer-now/[Learn more].
*
* IMPORTANT: because control is transferred to `recipient`, care must be
* taken to not create reentrancy vulnerabilities. Consider using
* {ReentrancyGuard} or the
* https://solidity.readthedocs.io/en/v0.8.0/security-considerations.html#use-the-checks-effects-interactions-pattern[checks-effects-interactions pattern].
*/
function sendValue(address payable recipient, uint256 amount) internal {
require(address(this).balance >= amount, "Address: insufficient balance");
(bool success, ) = recipient.call{value: amount}("");
require(success, "Address: unable to send value, recipient may have reverted");
}
/**
* @dev Performs a Solidity function call using a low level `call`. A
* plain `call` is an unsafe replacement for a function call: use this
* function instead.
*
* If `target` reverts with a revert reason, it is bubbled up by this
* function (like regular Solidity function calls).
*
* Returns the raw returned data. To convert to the expected return value,
* use https://solidity.readthedocs.io/en/latest/units-and-global-variables.html?highlight=abi.decode#abi-encoding-and-decoding-functions[`abi.decode`].
*
* Requirements:
*
* - `target` must be a contract.
* - calling `target` with `data` must not revert.
*
* _Available since v3.1._
*/
function functionCall(address target, bytes memory data) internal returns (bytes memory) {
return functionCallWithValue(target, data, 0, "Address: low-level call failed");
}
/**
* @dev Same as {xref-Address-functionCall-address-bytes-}[`functionCall`], but with
* `errorMessage` as a fallback revert reason when `target` reverts.
*
* _Available since v3.1._
*/
function functionCall(
address target,
bytes memory data,
string memory errorMessage
) internal returns (bytes memory) {
return functionCallWithValue(target, data, 0, errorMessage);
}
/**
* @dev Same as {xref-Address-functionCall-address-bytes-}[`functionCall`],
* but also transferring `value` wei to `target`.
*
* Requirements:
*
* - the calling contract must have an ETH balance of at least `value`.
* - the called Solidity function must be `payable`.
*
* _Available since v3.1._
*/
function functionCallWithValue(address target, bytes memory data, uint256 value) internal returns (bytes memory) {
return functionCallWithValue(target, data, value, "Address: low-level call with value failed");
}
/**
* @dev Same as {xref-Address-functionCallWithValue-address-bytes-uint256-}[`functionCallWithValue`], but
* with `errorMessage` as a fallback revert reason when `target` reverts.
*
* _Available since v3.1._
*/
function functionCallWithValue(
address target,
bytes memory data,
uint256 value,
string memory errorMessage
) internal returns (bytes memory) {
require(address(this).balance >= value, "Address: insufficient balance for call");
(bool success, bytes memory returndata) = target.call{value: value}(data);
return verifyCallResultFromTarget(target, success, returndata, errorMessage);
}
/**
* @dev Same as {xref-Address-functionCall-address-bytes-}[`functionCall`],
* but performing a static call.
*
* _Available since v3.3._
*/
function functionStaticCall(address target, bytes memory data) internal view returns (bytes memory) {
return functionStaticCall(target, data, "Address: low-level static call failed");
}
/**
* @dev Same as {xref-Address-functionCall-address-bytes-string-}[`functionCall`],
* but performing a static call.
*
* _Available since v3.3._
*/
function functionStaticCall(
address target,
bytes memory data,
string memory errorMessage
) internal view returns (bytes memory) {
(bool success, bytes memory returndata) = target.staticcall(data);
return verifyCallResultFromTarget(target, success, returndata, errorMessage);
}
/**
* @dev Same as {xref-Address-functionCall-address-bytes-}[`functionCall`],
* but performing a delegate call.
*
* _Available since v3.4._
*/
function functionDelegateCall(address target, bytes memory data) internal returns (bytes memory) {
return functionDelegateCall(target, data, "Address: low-level delegate call failed");
}
/**
* @dev Same as {xref-Address-functionCall-address-bytes-string-}[`functionCall`],
* but performing a delegate call.
*
* _Available since v3.4._
*/
function functionDelegateCall(
address target,
bytes memory data,
string memory errorMessage
) internal returns (bytes memory) {
(bool success, bytes memory returndata) = target.delegatecall(data);
return verifyCallResultFromTarget(target, success, returndata, errorMessage);
}
/**
* @dev Tool to verify that a low level call to smart-contract was successful, and revert (either by bubbling
* the revert reason or using the provided one) in case of unsuccessful call or if target was not a contract.
*
* _Available since v4.8._
*/
function verifyCallResultFromTarget(
address target,
bool success,
bytes memory returndata,
string memory errorMessage
) internal view returns (bytes memory) {
if (success) {
if (returndata.length == 0) {
// only check isContract if the call was successful and the return data is empty
// otherwise we already know that it was a contract
require(isContract(target), "Address: call to non-contract");
}
return returndata;
} else {
_revert(returndata, errorMessage);
}
}
/**
* @dev Tool to verify that a low level call was successful, and revert if it wasn't, either by bubbling the
* revert reason or using the provided one.
*
* _Available since v4.3._
*/
function verifyCallResult(
bool success,
bytes memory returndata,
string memory errorMessage
) internal pure returns (bytes memory) {
if (success) {
return returndata;
} else {
_revert(returndata, errorMessage);
}
}
function _revert(bytes memory returndata, string memory errorMessage) private pure {
// Look for revert reason and bubble it up if present
if (returndata.length > 0) {
// The easiest way to bubble the revert reason is using memory via assembly
/// @solidity memory-safe-assembly
assembly {
let returndata_size := mload(returndata)
revert(add(32, returndata), returndata_size)
}
} else {
revert(errorMessage);
}
}
}// SPDX-License-Identifier: MIT
// OpenZeppelin Contracts (last updated v4.9.4) (utils/Context.sol)
pragma solidity ^0.8.0;
/**
* @dev Provides information about the current execution context, including the
* sender of the transaction and its data. While these are generally available
* via msg.sender and msg.data, they should not be accessed in such a direct
* manner, since when dealing with meta-transactions the account sending and
* paying for execution may not be the actual sender (as far as an application
* is concerned).
*
* This contract is only required for intermediate, library-like contracts.
*/
abstract contract Context {
function _msgSender() internal view virtual returns (address) {
return msg.sender;
}
function _msgData() internal view virtual returns (bytes calldata) {
return msg.data;
}
function _contextSuffixLength() internal view virtual returns (uint256) {
return 0;
}
}// SPDX-License-Identifier: UNLICENSED
pragma solidity 0.8.19;
import {Ownable2Step as OZOwnable2Step} from "@openzeppelin/contracts/access/Ownable2Step.sol";
abstract contract Ownable2Step is OZOwnable2Step {
function renounceOwnership() public view override onlyOwner {
revert("cannot renounce ownership");
}
}// SPDX-License-Identifier: GPL-3.0
pragma solidity 0.8.19;
interface IXeqFeeManager {
function calculateXEQForBuy(
address _token,
uint256 _amountOfTokens
) external returns (uint256);
function calculateXEQForSell(
address _token,
uint256 _amountOfTokens
) external returns (uint256);
}// SPDX-License-Identifier: UNLICENSED
pragma solidity 0.8.19;
import {ISystemSecurity} from "./security/ISystemSecurity.sol";
import {IAccessController} from "./security/IAccessController.sol";
import {IRentShare} from "./rent/IRentShare.sol";
import {IRentDistributor} from "./rent/IRentDistributor.sol";
import {IMarketplace} from "./marketplace/IMarketplace.sol";
import {ISecondaryMarket} from "./marketplace/ISecondaryMarket.sol";
import {IWhitelist} from "./whitelist/IWhitelist.sol";
import {ILockNFT} from "./lockNft/ILockNFT.sol";
import {IXeqFeeManager} from "./fees/IXeqFeeManager.sol";
import {IRootPriceOracle} from "./oracles/IRootPriceOracle.sol";
import {IJarvisDex} from "./oclr/IJarvisDex.sol";
import {IDFXRouter} from "./oclr/IDFXRouter.sol";
import {ISanctionsList} from "./sbt/ISanctionsList.sol";
import {ISBT} from "./sbt/ISBT.sol";
import {IPasskeyFactory} from "./wallet/IPasskeyFactory.sol";
import {IERC20} from "@openzeppelin/contracts/token/ERC20/IERC20.sol";
/// @notice Root most registry contract for the system
interface ISystemRegistry {
/// @notice Get the system security instance for this system
/// @return security instance of system security for this system
function systemSecurity() external view returns (ISystemSecurity security);
/// @notice Get the access Controller for this system
/// @return controller instance of the access controller for this system
function accessController()
external
view
returns (IAccessController controller);
/// @notice Get the RentShare for this system
/// @return rentShare instance for this system
function rentShare() external view returns (IRentShare rentShare);
/// @notice Get the RentDistributor for this system
/// @return rentDistributor instance for this system
function rentDistributor()
external
view
returns (IRentDistributor rentDistributor);
/// @notice Get the Marketplace for this system
/// @return Marketplace instance for this system
function marketplace() external view returns (IMarketplace);
/// @notice Get the TokensWhitelist for this system
/// @return TokensWhitelist instance for this system
function whitelist() external view returns (IWhitelist);
/// @notice Get the LockNFTMinter.sol for this system
/// @return LockNFTMinter instance for this system
function lockNftMinter() external view returns (ILockNFT);
/// @notice Get the LockNFT.sol for this system
/// @return Lock NFT instance for this system that will be used to mint lock NFTs to users to withdraw funds from system
function lockNft() external view returns (ILockNFT);
/// @notice Get the XeqFeeManger.sol for this system
/// @return XeqFeeManger that will be used to tell how much fees in XEQ should be charged against base currency
function xeqFeeManager() external view returns (IXeqFeeManager);
/// @notice Get the XEQ.sol for this system
/// @return Protocol XEQ token
function xeq() external view returns (IERC20);
/// @notice Get the RootPriceOracle.sol for the system
/// @return RootPriceOracle to provide prices of normal erc20 tokens and Property tokens
function rootPriceOracle() external view returns (IRootPriceOracle);
/// @return address of TRY
function TRY() external view returns (IERC20);
/// @return address of USDC
function USDC() external view returns (IERC20);
/// @return address of xUSDC => 0xequity usdc
function xUSDC() external view returns (IERC20);
/// @notice router to support property swaps and some tokens swap for rent
/// @return address of OCLR
function oclr() external view returns (address);
/// @return jarvis dex address
function jarvisDex() external view returns (IJarvisDex);
/// @return DFX router address
function dfxRouter() external view returns (IDFXRouter);
/// @return address of transfer manager to enforce checks on Property tokens' transfers
function transferManager() external view returns (address);
/// @return address of the sacntions list to enforce token transfer with checks
function sanctionsList() external view returns (ISanctionsList);
/// @return address of the SBT.sol that issues tokens when a user KYCs
function sbt() external view returns (ISBT);
/// @return address of PasskeyWalletFactory.sol
function passkeyWalletFactory() external view returns (IPasskeyFactory);
/// @return address of SecondaryMarket.sol
function secondaryMarket() external view returns (ISecondaryMarket);
}// SPDX-License-Identifier: GPL-3.0
pragma solidity 0.8.19;
interface ILock {
enum LockStatus {
CANCELLED,
ACTIVE,
EXECUTED
}
struct UserPositionLock {
address[] collateralTokens;
uint[] amounts;
uint createdAt;
LockStatus lockStatus;
}
struct RentShareLock {
string[] propertySymbols;
uint[] amounts;
uint createdAt;
LockStatus lockStatus;
}
struct OtherLock {
bytes32[] tokensDetails;
uint[] amount;
uint createdAt;
LockStatus lockStatus;
}
enum LockType {
USER_POSITION_LOCK,
RENT_SHARE_LOCK,
OTHER_LOCK
}
}// SPDX-License-Identifier: GPL-3.0
pragma solidity 0.8.19;
import "./ILock.sol";
interface ILockNFT is ILock {
function lockNFT() external view returns (address);
function updateLockNftStatus(
uint lockNftTokenId,
LockStatus lockStatus
) external;
function lockNftToStatus(
uint lockNftTokenId
) external view returns (ILock.LockStatus);
function mintUserPositionLockNft(
address receiver,
ILock.UserPositionLock calldata
) external returns (uint);
function mintRentShareLockNft(
address receiver,
ILock.RentShareLock calldata
) external returns (uint);
function mintOtherLockNft(
address receiver,
ILock.OtherLock calldata
) external returns (uint);
function nftToUserPositionLockDetails(
uint nftTokenId
) external view returns (ILock.UserPositionLock memory);
function nftToRentShareLockDetails(
uint nftTokenId
) external view returns (ILock.RentShareLock memory);
function nftToOtherLockDetails(
uint nftTokenId
) external view returns (ILock.OtherLock memory);
}// SPDX-License-Identifier: UNLICENSED
pragma solidity 0.8.19;
interface IMarketplace {
struct MarketplaceStorage {
/// @notice Max fees that can be charged when buying property
uint MAX_BUY_FEES;
/// @notice Max fees that can be charged when selling property
uint MAX_SELL_FEES;
/// @notice maps property symbol to property tokens address
/// disallows same property symbols
mapping(string => PropertyDetails) propertySymbolToDetails;
///@notice address of Property token implementation
address propertyTokenImplementation;
/// @notice keeps track of numbers of properties deployed by this Marketplace
/// also serves the purpose of Rent Pool id in RentShare.sol
/// means if 5th property is deployed, deployedProperties.length shows that
/// this 5th property has rent pool id of 5 in Rentshare.sol
address[] deployedProperties;
/// @notice to check if a Property token is deployed by this Marketplace
mapping(address propertyTokenAddress => bool isPropertyExist) propertyExist;
/// @notice flag to ACTIVE/PAUSE buying of Properties tokens
State propertiesBuyState;
/// @notice flag to ACTIVE/PAUSE selling of Properties tokens
State propertiesSellState;
}
struct SwapArgs {
address from;
address to;
address recipient;
bool isFeeInXeq;
address[] vaults;
uint256[] amounts; // how much tokens to buy/sell in corresponding vault
bytes arbCallData;
}
enum State {
Active,
Paused
}
struct PropertyDetails {
address baseCurrency;
uint totalSupply;
address propertyOwner;
address propertyFeesReceiver;
address propertyTokenAddress;
uint buyFees;
uint sellFees;
State buyState; // by default it is active
State sellState; // by default it is active
}
function isPropertyBuyingPaused(
address propertyTokenAddress
) external view returns (bool);
function isPropertySellingPaused(
address propertyTokenAddress
) external view returns (bool);
function getFeesToCharge(
address propertyToken,
uint amountToChargeFeesOn,
bool isBuy
) external view returns (uint);
/// @return returns amount of quote tokens paid in case of buying of property
/// or amount of tokens get when selling
function swap(SwapArgs memory swapArgs) external returns (uint);
function getPropertyPriceInQuoteCurrency(
address baseCurrency,
address quoteCurrency,
uint amountInBaseCurrency // will be in 18 decimals
) external view returns (uint);
function getPropertyDetails(
address propertyAddress
) external view returns (PropertyDetails memory);
}// SPDX-License-Identifier: AGPL-3.0-only
pragma solidity 0.8.19;
interface ISecondaryMarket {
/**
* @notice for Marketplace: takes tokens from MP and send Proeprty tokens to MP
* @param _propertyToken address of WLegal
* @param _repayAmount amount of baseCurrency that is being paid to buy Property tokens
* @param _currentPertokenPrice current price of unit Property token in Quote currency
* @param _quoteCurrency quote currency (token which is being paid to buy property)
* @param _recipient Buyer of Property
* @param _vaults Vault that will hold the property tokens and provide liquidity
* @param _amounts amount of property tokens to fetch from each vault
*/
function buyPropertyTokens(
address _propertyToken,
uint256 _repayAmount,
uint256 _currentPertokenPrice,
address _quoteCurrency,
address _recipient,
address[] memory _vaults,
uint256[] memory _amounts
) external;
function sellPropertyTokens(
uint256 _tokensToBorrow,
address _propertyToken,
address _recipient,
address[] memory _vaults,
uint256[] memory _amounts
) external returns (uint);
}// SPDX-License-Identifier: GPL-3.0
pragma solidity 0.8.19;
interface IDFXRouter {
/// @notice view how much target amount a fixed origin amount will swap for
/// @param _quoteCurrency the address of the quote currency (usually USDC)
/// @param _origin the address of the origin
/// @param _target the address of the target
/// @param _originAmount the origin amount
/// @return targetAmount_ the amount of target that will be returned
function viewOriginSwap(
address _quoteCurrency,
address _origin,
address _target,
uint256 _originAmount
) external view returns (uint256 targetAmount_);
/// @notice swap a dynamic origin amount for a fixed target amount
/// @param _quoteCurrency the address of the quote currency (usually USDC)
/// @param _origin the address of the origin
/// @param _target the address of the target
/// @param _originAmount the origin amount
/// @param _minTargetAmount the minimum target amount
/// @param _deadline deadline in block number after which the trade will not execute
/// @return targetAmount_ the amount of target that has been swapped for the origin amount
function originSwap(
address _quoteCurrency,
address _origin,
address _target,
uint256 _originAmount,
uint256 _minTargetAmount,
uint256 _deadline
) external returns (uint256 targetAmount_);
/// @notice view how much of the origin currency the target currency will take
/// @param _quoteCurrency the address of the quote currency (usually USDC)
/// @param _origin the address of the origin
/// @param _target the address of the target
/// @param _targetAmount the target amount
/// @return originAmount_ the amount of target that has been swapped for the origin
function viewTargetSwap(
address _quoteCurrency,
address _origin,
address _target,
uint256 _targetAmount
) external view returns (uint256 originAmount_);
}// SPDX-License-Identifier: GPL-3.0
pragma solidity 0.8.19;
interface IJarvisDex {
/**
* @notice Mint synthetic tokens using fixed amount of collateral
* @notice This calculate the price using on chain price feed
* @notice User must approve collateral transfer for the mint request to succeed
* @param mintParams Input parameters for minting (see MintParams struct)
* @return syntheticTokensMinted Amount of synthetic tokens minted by a user
* @return feePaid Amount of collateral paid by the user as fee
*/
function mint(
MintParams calldata mintParams
) external returns (uint256 syntheticTokensMinted, uint256 feePaid);
// For JARVIS_DEX contract
function mint(
MintParams calldata mintParams,
address poolAddress
) external returns (uint256 syntheticTokensMinted, uint256 feePaid);
/**
* @notice Redeem amount of collateral using fixed number of synthetic token
* @notice This calculate the price using on chain price feed
* @notice User must approve synthetic token transfer for the redeem request to succeed
* @param redeemParams Input parameters for redeeming (see RedeemParams struct)
* @return collateralRedeemed Amount of collateral redeem by user
* @return feePaid Amount of collateral paid by user as fee
*/
function redeem(
RedeemParams calldata redeemParams
) external returns (uint256 collateralRedeemed, uint256 feePaid);
// For JARVIS_DEX contract
function redeem(
RedeemParams calldata redeemParams,
address poolAddress
) external returns (uint256 collateralRedeemed, uint256 feePaid);
struct MintParams {
// Minimum amount of synthetic tokens that a user wants to mint using collateral (anti-slippage)
uint256 minNumTokens;
// Amount of collateral that a user wants to spend for minting
uint256 collateralAmount;
// Expiration time of the transaction
uint256 expiration;
// Address to which send synthetic tokens minted
address recipient;
}
struct RedeemParams {
// Amount of synthetic tokens that user wants to use for redeeming
uint256 numTokens;
// Minimium amount of collateral that user wants to redeem (anti-slippage)
uint256 minCollateral;
// Expiration time of the transaction
uint256 expiration;
// Address to which send collateral tokens redeemed
address recipient;
}
/**
* @notice Returns the collateral amount will be received and fees will be paid in exchange for an input amount of synthetic tokens
* @notice This function is only trading-informative, it doesn't check edge case conditions like lending manager dust and undercap of one or more LPs
* @param _syntTokensAmount Amount of synthetic tokens to be exchanged
* @return collateralAmountReceived Collateral amount will be received by the user
* @return feePaid Collateral fee will be paid
*/
function getRedeemTradeInfo(
uint256 _syntTokensAmount
) external view returns (uint256 collateralAmountReceived, uint256 feePaid);
/**
* @notice Returns the synthetic tokens will be received and fees will be paid in exchange for an input collateral amount
* @notice This function is only trading-informative, it doesn't check edge case conditions like lending manager dust and reverting due to dust splitting
* @param _collateralAmount Input collateral amount to be exchanged
* @return synthTokensReceived Synthetic tokens will be minted
* @return feePaid Collateral fee will be paid
*/
function getMintTradeInfo(
uint256 _collateralAmount
) external view returns (uint256 synthTokensReceived, uint256 feePaid);
/**
* @return return token that is used as collateral
*/
function collateralToken() external view returns (address);
/**
* @return return token that will be minted agaisnt collateral
*/
function syntheticToken() external view returns (address);
}// SPDX-License-Identifier: UNLICENSED
pragma solidity 0.8.19;
/// @notice An oracle that can provide prices for single or multiple classes of tokens
interface IRootPriceOracle {
// struct Property {
// uint256 price;
// address currency;
// address priceFeed;
// }
// struct Storage {
// mapping(string => Property) propertyDetails;
// mapping(address => address) currencyToFeed;
// mapping(string => address) nameToFeed;
// }
// function feedPriceChainlink(
// address _of
// ) external view returns (uint256 latestPrice);
// function setPropertyDetails(
// string memory _propertySymbol,
// Property calldata _propertyDetails
// ) external;
// function getPropertyDetail(
// string memory _propertySymbol
// ) external view returns (Property memory property);
// //---------------------------------------------------------------------
// // function setCurrencyToFeed(address _currency, address _feed) external;
// function getCurrencyToFeed(
// address _currency
// ) external view returns (address);
/// @notice Returns price for the provided token in USD when normal token e.g LINK, ETH
/// and returns in Property's Base currency when Property Token e.g WXEFR1.
/// @dev May require additional registration with the provider before being used for a token
/// returns price in 18 decimals
/// @param token Token to get the price of
/// @return price The price of the token in USD
function getTokenPrice(address token) external view returns (uint256 price);
}//SPDX-License-Identifier: Unlicense
pragma solidity 0.8.19;
interface IRentDistributor {
/**
* @notice Allows user to redeem rent
* @param lockNftTokenId LockNft id to redeem
* @param recipient receiver of the redeemed amount
*/
function redeem(
uint lockNftTokenId,
address recipient
) external returns (uint);
/**
* @notice Allows Vaults to redeem rent
* @param lockNftTokenId LockNft id to redeem
*/
function redeemRentForVault(uint lockNftTokenId) external returns (uint);
}// SPDX-License-Identifier: UNLICENSED
pragma solidity 0.8.19;
import "@openzeppelin/contracts/token/ERC20/IERC20.sol";
interface IRentShare {
struct RentShareStorage {
mapping(uint => Pool) pools; // Pool id to Pool details
uint256 RENT_PRECISION;
mapping(string propertySymbol => uint poolId) symbolToPoolId; // symbol of Property token -> Pool Id
mapping(uint256 poolId => mapping(address propertyTokensHolder => PoolStaker propertyHolderDetails)) poolStakers; // Pool Id -> holder/user -> Details
mapping(address propertyTokenHolder => mapping(uint poolId => uint rentMadeSoFar)) userToPoolToRent; // user => Property Pool Id => property rent made so far
mapping(uint poolId => mapping(uint epochNumber => uint totalRentAccumulatedRentPerShare)) epochAccumluatedRentPerShare;
mapping(uint poolId => uint epoch) poolIdToEpoch;
// uint public epoch;
mapping(uint poolId => bool isInitialized) isPoolInitialized;
bool rentWrapperToogle; // true: means harvestRewards should only be called by a wrapper not users, false: means users can call harvestRent directly
mapping(string propertySymbol => uint rentClaimLockDuration) propertyToRentClaimDuration; // duration in seconds after which rent can be claimed since harvestRent transaction
}
// Staking user for a pool
struct PoolStaker {
mapping(uint epoch => uint propertyTokenBalance) epochToTokenBalance;
mapping(uint epoch => uint rentDebt) epochToRentDebt;
uint lastEpoch;
// uint256 amount; // Amount of Property tokens a user holds
// uint256 rentDebt; // The amount relative to accumulatedRentPerShare the user can't get as rent
}
struct Pool {
IERC20 stakeToken; // Property token
uint256 tokensStaked; // Total tokens staked
uint256 lastRentedTimestamp; // Last block time the user had their rent calculated
uint256 accumulatedRentPerShare; // Accumulated rent per share times RENT_PRECISION
uint256 rentTokensPerSecond; // Number of rent tokens minted per block for this pool
}
struct LockNftDetailEvent {
address caller;
uint lockNftTokenId;
string propertySymbol;
uint amount;
}
struct UserEpochsRent {
uint poolId;
address user;
uint fromEpoch;
uint toEpoch;
}
function createPool(
IERC20 _stakeToken,
string memory symbol,
uint256 _poolId
) external;
function deposit(
string calldata _propertySymbol,
address _sender,
uint256 _amount
) external;
function withdraw(
string calldata _propertySymbol,
address _sender,
uint256 _amount
) external;
function isLockNftMature(uint lockNftTokenId) external view returns (bool);
function harvestRent(
string[] calldata symbols,
address receiver
) external returns (uint);
function getSymbolToPropertyAddress(
string memory symbol
) external view returns (address);
}//SPDX-License-Identifier: Unlicense
pragma solidity 0.8.19;
interface ISanctionsList {
function isSanctioned(address addr) external view returns (bool);
}//SPDX-License-Identifier: Unlicense
pragma solidity 0.8.19;
interface ISBT {
// events
event CommunityAdded(string indexed name);
event CommunityRemoved(string indexed name);
event ApprovedCommunityAdded(
string indexed wrappedProperty,
string indexed community
);
event ApprovedCommunityRemoved(
string indexed wrappedProperty,
string indexed community
);
event BulkApprovedCommunities(
string indexed wrappedProperty,
string[] communities
);
event BulkRemoveCommunities(
string indexed wrappedProperty,
string[] communities
);
struct SBTStorage {
//is community approved
mapping(string => bool) nameExist;
mapping(string => uint256) communityToId;
mapping(uint256 => bool) idExist;
//approved communities against wrapped property token.
mapping(string => mapping(string => bool)) approvedSBT;
//approved communities list against wrapped property token.
mapping(string => string[]) approvedSBTCommunities;
// communityId => key => encoded data
mapping(uint => mapping(bytes32 => bytes)) communityToKeyToValue;
// community id -> key -> does exist or not?
mapping(uint => mapping(bytes32 => bool)) keyExistsInCommunity;
// registry of blacklisted address by 0x40C57923924B5c5c5455c48D93317139ADDaC8fb
address sanctionsList;
}
function getApprovedSBTCommunities(
string memory symbol
) external view returns (string[] memory);
function getBalanceOf(
address user,
string memory community
) external view returns (uint256);
}// SPDX-License-Identifier: UNLICENSED
pragma solidity 0.8.19;
import {IAccessControlEnumerable} from "@openzeppelin/contracts/access/IAccessControlEnumerable.sol";
interface IAccessController is IAccessControlEnumerable {
error AccessDenied();
function setupRole(bytes32 role, address account) external;
function verifyOwner(address account) external view;
function grantPropertyTokenRole(address propertyToken) external;
}// SPDX-License-Identifier: UNLICENSED
pragma solidity 0.8.19;
interface ISystemSecurity {
/// @notice Whether or not the system as a whole is paused
function isSystemPaused() external view returns (bool);
}// SPDX-License-Identifier: MIT
pragma solidity 0.8.19;
interface IPasskeyFactory {
function updatePasskeySigner(
address newSigner // ignore 2 steps ownership transfer
) external;
/// @notice returns true of deplpoyed from factory, false otherwise
function isDeployedFromHere(
address passkeyWallet
) external view returns (bool);
function computeAddress(
bytes32 salt,
address signerIfAny
) external view returns (address);
function recoveryCoolDownPeriod() external view returns (uint);
function isKycdForRecovery(address caller) external view returns (bool);
function whitelistedClientJsonDataPost(
bytes32 hashClientJsonDataPost
) external view returns (bool);
}// SPDX-License-Identifier: AGPL-3.0-only
pragma solidity 0.8.19;
/**
* @title An interface to track a whitelist of addresses.
*/
interface IWhitelist {
/**
* @notice Adds an address to the whitelist.
* @param newToken the new address to add.
*/
function addTokenToWhitelist(address newToken) external;
/**
* @notice Removes an address from the whitelist.
* @param tokenToRemove The existing address to remove.
*/
function removeTokenFromWhitelist(address tokenToRemove) external;
/**
* @notice Checks whether an address is on the whitelist.
* @param tokenToCheck The address to check.
* @return True if `tokenToCheck` is on the whitelist, or False.
*/
function isTokenOnWhitelist(
address tokenToCheck
) external view returns (bool);
/**
* @notice Checks whether an address is on the whitelist.
* @param addressToCheck The address to check.
* @return True if `addressToCheck` is on the whitelist, or False.
*/
function isAddressOnAllowList(
address addressToCheck
) external view returns (bool);
/**
* @notice Gets all addresses that are currently included in the whitelist.
* @return The list of addresses on the whitelist.
*/
function getTokenWhitelist() external view returns (address[] memory);
}// SPDX-License-Identifier: UNLICENSED
pragma solidity 0.8.19;
import {Address} from "@openzeppelin/contracts/utils/Address.sol";
library Errors {
using Address for address;
///////////////////////////////////////////////////////////////////
// Set errors
///////////////////////////////////////////////////////////////////
error AccessDenied();
error ZeroAddress(string paramName);
error ZeroAmount();
error InsufficientBalance(address token);
error AssetNotAllowed(address token);
error InvalidAddress(address addr);
error InvalidParam(string paramName);
error InvalidParams();
error AlreadySet(string param);
error ArrayLengthMismatch(uint256 length1, uint256 length2, string details);
error RegistryItemMissing(string item);
error SystemMismatch(address source1, address source2);
error ItemNotFound();
error ItemExists();
error MissingRole(bytes32 role, address user);
error NotRegistered();
// Used to check storage slot is empty before setting.
error MustBeZero();
// Used to check storage slot set before deleting.
error MustBeSet();
error ApprovalFailed(address token);
error InvalidToken(address token);
function verifyArrayLengths(
uint256 length1,
uint256 length2,
string memory details
) external pure {
if (length1 != length2) {
revert ArrayLengthMismatch(length1, length2, details);
}
}
function verifyNotZero(
address addr,
string memory paramName
) internal pure {
if (addr == address(0)) {
revert ZeroAddress(paramName);
}
}
function verifyNotEmpty(
string memory val,
string memory paramName
) internal pure {
if (bytes(val).length == 0) {
revert InvalidParam(paramName);
}
}
function verifyNotZero(uint256 num, string memory paramName) internal pure {
if (num == 0) {
revert InvalidParam(paramName);
}
}
function verifySystemsMatch(
address component1,
address component2
) internal view {
bytes memory call = abi.encodeWithSignature("getSystemRegistry()");
address registry1 = abi.decode(
component1.functionStaticCall(call),
(address)
);
address registry2 = abi.decode(
component2.functionStaticCall(call),
(address)
);
if (registry1 != registry2) {
revert SystemMismatch(component1, component2);
}
}
}// SPDX-License-Identifier: MIT
pragma solidity >=0.4.22 <0.9.0;
library console {
address constant CONSOLE_ADDRESS =
0x000000000000000000636F6e736F6c652e6c6f67;
function _sendLogPayloadImplementation(bytes memory payload) internal view {
address consoleAddress = CONSOLE_ADDRESS;
/// @solidity memory-safe-assembly
assembly {
pop(
staticcall(
gas(),
consoleAddress,
add(payload, 32),
mload(payload),
0,
0
)
)
}
}
function _castToPure(
function(bytes memory) internal view fnIn
) internal pure returns (function(bytes memory) pure fnOut) {
assembly {
fnOut := fnIn
}
}
function _sendLogPayload(bytes memory payload) internal pure {
_castToPure(_sendLogPayloadImplementation)(payload);
}
function log() internal pure {
_sendLogPayload(abi.encodeWithSignature("log()"));
}
function logInt(int256 p0) internal pure {
_sendLogPayload(abi.encodeWithSignature("log(int256)", p0));
}
function logUint(uint256 p0) internal pure {
_sendLogPayload(abi.encodeWithSignature("log(uint256)", p0));
}
function logString(string memory p0) internal pure {
_sendLogPayload(abi.encodeWithSignature("log(string)", p0));
}
function logBool(bool p0) internal pure {
_sendLogPayload(abi.encodeWithSignature("log(bool)", p0));
}
function logAddress(address p0) internal pure {
_sendLogPayload(abi.encodeWithSignature("log(address)", p0));
}
function logBytes(bytes memory p0) internal pure {
_sendLogPayload(abi.encodeWithSignature("log(bytes)", p0));
}
function logBytes1(bytes1 p0) internal pure {
_sendLogPayload(abi.encodeWithSignature("log(bytes1)", p0));
}
function logBytes2(bytes2 p0) internal pure {
_sendLogPayload(abi.encodeWithSignature("log(bytes2)", p0));
}
function logBytes3(bytes3 p0) internal pure {
_sendLogPayload(abi.encodeWithSignature("log(bytes3)", p0));
}
function logBytes4(bytes4 p0) internal pure {
_sendLogPayload(abi.encodeWithSignature("log(bytes4)", p0));
}
function logBytes5(bytes5 p0) internal pure {
_sendLogPayload(abi.encodeWithSignature("log(bytes5)", p0));
}
function logBytes6(bytes6 p0) internal pure {
_sendLogPayload(abi.encodeWithSignature("log(bytes6)", p0));
}
function logBytes7(bytes7 p0) internal pure {
_sendLogPayload(abi.encodeWithSignature("log(bytes7)", p0));
}
function logBytes8(bytes8 p0) internal pure {
_sendLogPayload(abi.encodeWithSignature("log(bytes8)", p0));
}
function logBytes9(bytes9 p0) internal pure {
_sendLogPayload(abi.encodeWithSignature("log(bytes9)", p0));
}
function logBytes10(bytes10 p0) internal pure {
_sendLogPayload(abi.encodeWithSignature("log(bytes10)", p0));
}
function logBytes11(bytes11 p0) internal pure {
_sendLogPayload(abi.encodeWithSignature("log(bytes11)", p0));
}
function logBytes12(bytes12 p0) internal pure {
_sendLogPayload(abi.encodeWithSignature("log(bytes12)", p0));
}
function logBytes13(bytes13 p0) internal pure {
_sendLogPayload(abi.encodeWithSignature("log(bytes13)", p0));
}
function logBytes14(bytes14 p0) internal pure {
_sendLogPayload(abi.encodeWithSignature("log(bytes14)", p0));
}
function logBytes15(bytes15 p0) internal pure {
_sendLogPayload(abi.encodeWithSignature("log(bytes15)", p0));
}
function logBytes16(bytes16 p0) internal pure {
_sendLogPayload(abi.encodeWithSignature("log(bytes16)", p0));
}
function logBytes17(bytes17 p0) internal pure {
_sendLogPayload(abi.encodeWithSignature("log(bytes17)", p0));
}
function logBytes18(bytes18 p0) internal pure {
_sendLogPayload(abi.encodeWithSignature("log(bytes18)", p0));
}
function logBytes19(bytes19 p0) internal pure {
_sendLogPayload(abi.encodeWithSignature("log(bytes19)", p0));
}
function logBytes20(bytes20 p0) internal pure {
_sendLogPayload(abi.encodeWithSignature("log(bytes20)", p0));
}
function logBytes21(bytes21 p0) internal pure {
_sendLogPayload(abi.encodeWithSignature("log(bytes21)", p0));
}
function logBytes22(bytes22 p0) internal pure {
_sendLogPayload(abi.encodeWithSignature("log(bytes22)", p0));
}
function logBytes23(bytes23 p0) internal pure {
_sendLogPayload(abi.encodeWithSignature("log(bytes23)", p0));
}
function logBytes24(bytes24 p0) internal pure {
_sendLogPayload(abi.encodeWithSignature("log(bytes24)", p0));
}
function logBytes25(bytes25 p0) internal pure {
_sendLogPayload(abi.encodeWithSignature("log(bytes25)", p0));
}
function logBytes26(bytes26 p0) internal pure {
_sendLogPayload(abi.encodeWithSignature("log(bytes26)", p0));
}
function logBytes27(bytes27 p0) internal pure {
_sendLogPayload(abi.encodeWithSignature("log(bytes27)", p0));
}
function logBytes28(bytes28 p0) internal pure {
_sendLogPayload(abi.encodeWithSignature("log(bytes28)", p0));
}
function logBytes29(bytes29 p0) internal pure {
_sendLogPayload(abi.encodeWithSignature("log(bytes29)", p0));
}
function logBytes30(bytes30 p0) internal pure {
_sendLogPayload(abi.encodeWithSignature("log(bytes30)", p0));
}
function logBytes31(bytes31 p0) internal pure {
_sendLogPayload(abi.encodeWithSignature("log(bytes31)", p0));
}
function logBytes32(bytes32 p0) internal pure {
_sendLogPayload(abi.encodeWithSignature("log(bytes32)", p0));
}
function log(uint256 p0) internal pure {
_sendLogPayload(abi.encodeWithSignature("log(uint256)", p0));
}
function log(string memory p0) internal pure {
_sendLogPayload(abi.encodeWithSignature("log(string)", p0));
}
function log(bool p0) internal pure {
_sendLogPayload(abi.encodeWithSignature("log(bool)", p0));
}
function log(address p0) internal pure {
_sendLogPayload(abi.encodeWithSignature("log(address)", p0));
}
function log(uint256 p0, uint256 p1) internal pure {
_sendLogPayload(abi.encodeWithSignature("log(uint256,uint256)", p0, p1));
}
function log(uint256 p0, string memory p1) internal pure {
_sendLogPayload(abi.encodeWithSignature("log(uint256,string)", p0, p1));
}
function log(uint256 p0, bool p1) internal pure {
_sendLogPayload(abi.encodeWithSignature("log(uint256,bool)", p0, p1));
}
function log(uint256 p0, address p1) internal pure {
_sendLogPayload(abi.encodeWithSignature("log(uint256,address)", p0, p1));
}
function log(string memory p0, uint256 p1) internal pure {
_sendLogPayload(abi.encodeWithSignature("log(string,uint256)", p0, p1));
}
function log(string memory p0, string memory p1) internal pure {
_sendLogPayload(abi.encodeWithSignature("log(string,string)", p0, p1));
}
function log(string memory p0, bool p1) internal pure {
_sendLogPayload(abi.encodeWithSignature("log(string,bool)", p0, p1));
}
function log(string memory p0, address p1) internal pure {
_sendLogPayload(abi.encodeWithSignature("log(string,address)", p0, p1));
}
function log(bool p0, uint256 p1) internal pure {
_sendLogPayload(abi.encodeWithSignature("log(bool,uint256)", p0, p1));
}
function log(bool p0, string memory p1) internal pure {
_sendLogPayload(abi.encodeWithSignature("log(bool,string)", p0, p1));
}
function log(bool p0, bool p1) internal pure {
_sendLogPayload(abi.encodeWithSignature("log(bool,bool)", p0, p1));
}
function log(bool p0, address p1) internal pure {
_sendLogPayload(abi.encodeWithSignature("log(bool,address)", p0, p1));
}
function log(address p0, uint256 p1) internal pure {
_sendLogPayload(abi.encodeWithSignature("log(address,uint256)", p0, p1));
}
function log(address p0, string memory p1) internal pure {
_sendLogPayload(abi.encodeWithSignature("log(address,string)", p0, p1));
}
function log(address p0, bool p1) internal pure {
_sendLogPayload(abi.encodeWithSignature("log(address,bool)", p0, p1));
}
function log(address p0, address p1) internal pure {
_sendLogPayload(abi.encodeWithSignature("log(address,address)", p0, p1));
}
function log(uint256 p0, uint256 p1, uint256 p2) internal pure {
_sendLogPayload(abi.encodeWithSignature("log(uint256,uint256,uint256)", p0, p1, p2));
}
function log(uint256 p0, uint256 p1, string memory p2) internal pure {
_sendLogPayload(abi.encodeWithSignature("log(uint256,uint256,string)", p0, p1, p2));
}
function log(uint256 p0, uint256 p1, bool p2) internal pure {
_sendLogPayload(abi.encodeWithSignature("log(uint256,uint256,bool)", p0, p1, p2));
}
function log(uint256 p0, uint256 p1, address p2) internal pure {
_sendLogPayload(abi.encodeWithSignature("log(uint256,uint256,address)", p0, p1, p2));
}
function log(uint256 p0, string memory p1, uint256 p2) internal pure {
_sendLogPayload(abi.encodeWithSignature("log(uint256,string,uint256)", p0, p1, p2));
}
function log(uint256 p0, string memory p1, string memory p2) internal pure {
_sendLogPayload(abi.encodeWithSignature("log(uint256,string,string)", p0, p1, p2));
}
function log(uint256 p0, string memory p1, bool p2) internal pure {
_sendLogPayload(abi.encodeWithSignature("log(uint256,string,bool)", p0, p1, p2));
}
function log(uint256 p0, string memory p1, address p2) internal pure {
_sendLogPayload(abi.encodeWithSignature("log(uint256,string,address)", p0, p1, p2));
}
function log(uint256 p0, bool p1, uint256 p2) internal pure {
_sendLogPayload(abi.encodeWithSignature("log(uint256,bool,uint256)", p0, p1, p2));
}
function log(uint256 p0, bool p1, string memory p2) internal pure {
_sendLogPayload(abi.encodeWithSignature("log(uint256,bool,string)", p0, p1, p2));
}
function log(uint256 p0, bool p1, bool p2) internal pure {
_sendLogPayload(abi.encodeWithSignature("log(uint256,bool,bool)", p0, p1, p2));
}
function log(uint256 p0, bool p1, address p2) internal pure {
_sendLogPayload(abi.encodeWithSignature("log(uint256,bool,address)", p0, p1, p2));
}
function log(uint256 p0, address p1, uint256 p2) internal pure {
_sendLogPayload(abi.encodeWithSignature("log(uint256,address,uint256)", p0, p1, p2));
}
function log(uint256 p0, address p1, string memory p2) internal pure {
_sendLogPayload(abi.encodeWithSignature("log(uint256,address,string)", p0, p1, p2));
}
function log(uint256 p0, address p1, bool p2) internal pure {
_sendLogPayload(abi.encodeWithSignature("log(uint256,address,bool)", p0, p1, p2));
}
function log(uint256 p0, address p1, address p2) internal pure {
_sendLogPayload(abi.encodeWithSignature("log(uint256,address,address)", p0, p1, p2));
}
function log(string memory p0, uint256 p1, uint256 p2) internal pure {
_sendLogPayload(abi.encodeWithSignature("log(string,uint256,uint256)", p0, p1, p2));
}
function log(string memory p0, uint256 p1, string memory p2) internal pure {
_sendLogPayload(abi.encodeWithSignature("log(string,uint256,string)", p0, p1, p2));
}
function log(string memory p0, uint256 p1, bool p2) internal pure {
_sendLogPayload(abi.encodeWithSignature("log(string,uint256,bool)", p0, p1, p2));
}
function log(string memory p0, uint256 p1, address p2) internal pure {
_sendLogPayload(abi.encodeWithSignature("log(string,uint256,address)", p0, p1, p2));
}
function log(string memory p0, string memory p1, uint256 p2) internal pure {
_sendLogPayload(abi.encodeWithSignature("log(string,string,uint256)", p0, p1, p2));
}
function log(string memory p0, string memory p1, string memory p2) internal pure {
_sendLogPayload(abi.encodeWithSignature("log(string,string,string)", p0, p1, p2));
}
function log(string memory p0, string memory p1, bool p2) internal pure {
_sendLogPayload(abi.encodeWithSignature("log(string,string,bool)", p0, p1, p2));
}
function log(string memory p0, string memory p1, address p2) internal pure {
_sendLogPayload(abi.encodeWithSignature("log(string,string,address)", p0, p1, p2));
}
function log(string memory p0, bool p1, uint256 p2) internal pure {
_sendLogPayload(abi.encodeWithSignature("log(string,bool,uint256)", p0, p1, p2));
}
function log(string memory p0, bool p1, string memory p2) internal pure {
_sendLogPayload(abi.encodeWithSignature("log(string,bool,string)", p0, p1, p2));
}
function log(string memory p0, bool p1, bool p2) internal pure {
_sendLogPayload(abi.encodeWithSignature("log(string,bool,bool)", p0, p1, p2));
}
function log(string memory p0, bool p1, address p2) internal pure {
_sendLogPayload(abi.encodeWithSignature("log(string,bool,address)", p0, p1, p2));
}
function log(string memory p0, address p1, uint256 p2) internal pure {
_sendLogPayload(abi.encodeWithSignature("log(string,address,uint256)", p0, p1, p2));
}
function log(string memory p0, address p1, string memory p2) internal pure {
_sendLogPayload(abi.encodeWithSignature("log(string,address,string)", p0, p1, p2));
}
function log(string memory p0, address p1, bool p2) internal pure {
_sendLogPayload(abi.encodeWithSignature("log(string,address,bool)", p0, p1, p2));
}
function log(string memory p0, address p1, address p2) internal pure {
_sendLogPayload(abi.encodeWithSignature("log(string,address,address)", p0, p1, p2));
}
function log(bool p0, uint256 p1, uint256 p2) internal pure {
_sendLogPayload(abi.encodeWithSignature("log(bool,uint256,uint256)", p0, p1, p2));
}
function log(bool p0, uint256 p1, string memory p2) internal pure {
_sendLogPayload(abi.encodeWithSignature("log(bool,uint256,string)", p0, p1, p2));
}
function log(bool p0, uint256 p1, bool p2) internal pure {
_sendLogPayload(abi.encodeWithSignature("log(bool,uint256,bool)", p0, p1, p2));
}
function log(bool p0, uint256 p1, address p2) internal pure {
_sendLogPayload(abi.encodeWithSignature("log(bool,uint256,address)", p0, p1, p2));
}
function log(bool p0, string memory p1, uint256 p2) internal pure {
_sendLogPayload(abi.encodeWithSignature("log(bool,string,uint256)", p0, p1, p2));
}
function log(bool p0, string memory p1, string memory p2) internal pure {
_sendLogPayload(abi.encodeWithSignature("log(bool,string,string)", p0, p1, p2));
}
function log(bool p0, string memory p1, bool p2) internal pure {
_sendLogPayload(abi.encodeWithSignature("log(bool,string,bool)", p0, p1, p2));
}
function log(bool p0, string memory p1, address p2) internal pure {
_sendLogPayload(abi.encodeWithSignature("log(bool,string,address)", p0, p1, p2));
}
function log(bool p0, bool p1, uint256 p2) internal pure {
_sendLogPayload(abi.encodeWithSignature("log(bool,bool,uint256)", p0, p1, p2));
}
function log(bool p0, bool p1, string memory p2) internal pure {
_sendLogPayload(abi.encodeWithSignature("log(bool,bool,string)", p0, p1, p2));
}
function log(bool p0, bool p1, bool p2) internal pure {
_sendLogPayload(abi.encodeWithSignature("log(bool,bool,bool)", p0, p1, p2));
}
function log(bool p0, bool p1, address p2) internal pure {
_sendLogPayload(abi.encodeWithSignature("log(bool,bool,address)", p0, p1, p2));
}
function log(bool p0, address p1, uint256 p2) internal pure {
_sendLogPayload(abi.encodeWithSignature("log(bool,address,uint256)", p0, p1, p2));
}
function log(bool p0, address p1, string memory p2) internal pure {
_sendLogPayload(abi.encodeWithSignature("log(bool,address,string)", p0, p1, p2));
}
function log(bool p0, address p1, bool p2) internal pure {
_sendLogPayload(abi.encodeWithSignature("log(bool,address,bool)", p0, p1, p2));
}
function log(bool p0, address p1, address p2) internal pure {
_sendLogPayload(abi.encodeWithSignature("log(bool,address,address)", p0, p1, p2));
}
function log(address p0, uint256 p1, uint256 p2) internal pure {
_sendLogPayload(abi.encodeWithSignature("log(address,uint256,uint256)", p0, p1, p2));
}
function log(address p0, uint256 p1, string memory p2) internal pure {
_sendLogPayload(abi.encodeWithSignature("log(address,uint256,string)", p0, p1, p2));
}
function log(address p0, uint256 p1, bool p2) internal pure {
_sendLogPayload(abi.encodeWithSignature("log(address,uint256,bool)", p0, p1, p2));
}
function log(address p0, uint256 p1, address p2) internal pure {
_sendLogPayload(abi.encodeWithSignature("log(address,uint256,address)", p0, p1, p2));
}
function log(address p0, string memory p1, uint256 p2) internal pure {
_sendLogPayload(abi.encodeWithSignature("log(address,string,uint256)", p0, p1, p2));
}
function log(address p0, string memory p1, string memory p2) internal pure {
_sendLogPayload(abi.encodeWithSignature("log(address,string,string)", p0, p1, p2));
}
function log(address p0, string memory p1, bool p2) internal pure {
_sendLogPayload(abi.encodeWithSignature("log(address,string,bool)", p0, p1, p2));
}
function log(address p0, string memory p1, address p2) internal pure {
_sendLogPayload(abi.encodeWithSignature("log(address,string,address)", p0, p1, p2));
}
function log(address p0, bool p1, uint256 p2) internal pure {
_sendLogPayload(abi.encodeWithSignature("log(address,bool,uint256)", p0, p1, p2));
}
function log(address p0, bool p1, string memory p2) internal pure {
_sendLogPayload(abi.encodeWithSignature("log(address,bool,string)", p0, p1, p2));
}
function log(address p0, bool p1, bool p2) internal pure {
_sendLogPayload(abi.encodeWithSignature("log(address,bool,bool)", p0, p1, p2));
}
function log(address p0, bool p1, address p2) internal pure {
_sendLogPayload(abi.encodeWithSignature("log(address,bool,address)", p0, p1, p2));
}
function log(address p0, address p1, uint256 p2) internal pure {
_sendLogPayload(abi.encodeWithSignature("log(address,address,uint256)", p0, p1, p2));
}
function log(address p0, address p1, string memory p2) internal pure {
_sendLogPayload(abi.encodeWithSignature("log(address,address,string)", p0, p1, p2));
}
function log(address p0, address p1, bool p2) internal pure {
_sendLogPayload(abi.encodeWithSignature("log(address,address,bool)", p0, p1, p2));
}
function log(address p0, address p1, address p2) internal pure {
_sendLogPayload(abi.encodeWithSignature("log(address,address,address)", p0, p1, p2));
}
function log(uint256 p0, uint256 p1, uint256 p2, uint256 p3) internal pure {
_sendLogPayload(abi.encodeWithSignature("log(uint256,uint256,uint256,uint256)", p0, p1, p2, p3));
}
function log(uint256 p0, uint256 p1, uint256 p2, string memory p3) internal pure {
_sendLogPayload(abi.encodeWithSignature("log(uint256,uint256,uint256,string)", p0, p1, p2, p3));
}
function log(uint256 p0, uint256 p1, uint256 p2, bool p3) internal pure {
_sendLogPayload(abi.encodeWithSignature("log(uint256,uint256,uint256,bool)", p0, p1, p2, p3));
}
function log(uint256 p0, uint256 p1, uint256 p2, address p3) internal pure {
_sendLogPayload(abi.encodeWithSignature("log(uint256,uint256,uint256,address)", p0, p1, p2, p3));
}
function log(uint256 p0, uint256 p1, string memory p2, uint256 p3) internal pure {
_sendLogPayload(abi.encodeWithSignature("log(uint256,uint256,string,uint256)", p0, p1, p2, p3));
}
function log(uint256 p0, uint256 p1, string memory p2, string memory p3) internal pure {
_sendLogPayload(abi.encodeWithSignature("log(uint256,uint256,string,string)", p0, p1, p2, p3));
}
function log(uint256 p0, uint256 p1, string memory p2, bool p3) internal pure {
_sendLogPayload(abi.encodeWithSignature("log(uint256,uint256,string,bool)", p0, p1, p2, p3));
}
function log(uint256 p0, uint256 p1, string memory p2, address p3) internal pure {
_sendLogPayload(abi.encodeWithSignature("log(uint256,uint256,string,address)", p0, p1, p2, p3));
}
function log(uint256 p0, uint256 p1, bool p2, uint256 p3) internal pure {
_sendLogPayload(abi.encodeWithSignature("log(uint256,uint256,bool,uint256)", p0, p1, p2, p3));
}
function log(uint256 p0, uint256 p1, bool p2, string memory p3) internal pure {
_sendLogPayload(abi.encodeWithSignature("log(uint256,uint256,bool,string)", p0, p1, p2, p3));
}
function log(uint256 p0, uint256 p1, bool p2, bool p3) internal pure {
_sendLogPayload(abi.encodeWithSignature("log(uint256,uint256,bool,bool)", p0, p1, p2, p3));
}
function log(uint256 p0, uint256 p1, bool p2, address p3) internal pure {
_sendLogPayload(abi.encodeWithSignature("log(uint256,uint256,bool,address)", p0, p1, p2, p3));
}
function log(uint256 p0, uint256 p1, address p2, uint256 p3) internal pure {
_sendLogPayload(abi.encodeWithSignature("log(uint256,uint256,address,uint256)", p0, p1, p2, p3));
}
function log(uint256 p0, uint256 p1, address p2, string memory p3) internal pure {
_sendLogPayload(abi.encodeWithSignature("log(uint256,uint256,address,string)", p0, p1, p2, p3));
}
function log(uint256 p0, uint256 p1, address p2, bool p3) internal pure {
_sendLogPayload(abi.encodeWithSignature("log(uint256,uint256,address,bool)", p0, p1, p2, p3));
}
function log(uint256 p0, uint256 p1, address p2, address p3) internal pure {
_sendLogPayload(abi.encodeWithSignature("log(uint256,uint256,address,address)", p0, p1, p2, p3));
}
function log(uint256 p0, string memory p1, uint256 p2, uint256 p3) internal pure {
_sendLogPayload(abi.encodeWithSignature("log(uint256,string,uint256,uint256)", p0, p1, p2, p3));
}
function log(uint256 p0, string memory p1, uint256 p2, string memory p3) internal pure {
_sendLogPayload(abi.encodeWithSignature("log(uint256,string,uint256,string)", p0, p1, p2, p3));
}
function log(uint256 p0, string memory p1, uint256 p2, bool p3) internal pure {
_sendLogPayload(abi.encodeWithSignature("log(uint256,string,uint256,bool)", p0, p1, p2, p3));
}
function log(uint256 p0, string memory p1, uint256 p2, address p3) internal pure {
_sendLogPayload(abi.encodeWithSignature("log(uint256,string,uint256,address)", p0, p1, p2, p3));
}
function log(uint256 p0, string memory p1, string memory p2, uint256 p3) internal pure {
_sendLogPayload(abi.encodeWithSignature("log(uint256,string,string,uint256)", p0, p1, p2, p3));
}
function log(uint256 p0, string memory p1, string memory p2, string memory p3) internal pure {
_sendLogPayload(abi.encodeWithSignature("log(uint256,string,string,string)", p0, p1, p2, p3));
}
function log(uint256 p0, string memory p1, string memory p2, bool p3) internal pure {
_sendLogPayload(abi.encodeWithSignature("log(uint256,string,string,bool)", p0, p1, p2, p3));
}
function log(uint256 p0, string memory p1, string memory p2, address p3) internal pure {
_sendLogPayload(abi.encodeWithSignature("log(uint256,string,string,address)", p0, p1, p2, p3));
}
function log(uint256 p0, string memory p1, bool p2, uint256 p3) internal pure {
_sendLogPayload(abi.encodeWithSignature("log(uint256,string,bool,uint256)", p0, p1, p2, p3));
}
function log(uint256 p0, string memory p1, bool p2, string memory p3) internal pure {
_sendLogPayload(abi.encodeWithSignature("log(uint256,string,bool,string)", p0, p1, p2, p3));
}
function log(uint256 p0, string memory p1, bool p2, bool p3) internal pure {
_sendLogPayload(abi.encodeWithSignature("log(uint256,string,bool,bool)", p0, p1, p2, p3));
}
function log(uint256 p0, string memory p1, bool p2, address p3) internal pure {
_sendLogPayload(abi.encodeWithSignature("log(uint256,string,bool,address)", p0, p1, p2, p3));
}
function log(uint256 p0, string memory p1, address p2, uint256 p3) internal pure {
_sendLogPayload(abi.encodeWithSignature("log(uint256,string,address,uint256)", p0, p1, p2, p3));
}
function log(uint256 p0, string memory p1, address p2, string memory p3) internal pure {
_sendLogPayload(abi.encodeWithSignature("log(uint256,string,address,string)", p0, p1, p2, p3));
}
function log(uint256 p0, string memory p1, address p2, bool p3) internal pure {
_sendLogPayload(abi.encodeWithSignature("log(uint256,string,address,bool)", p0, p1, p2, p3));
}
function log(uint256 p0, string memory p1, address p2, address p3) internal pure {
_sendLogPayload(abi.encodeWithSignature("log(uint256,string,address,address)", p0, p1, p2, p3));
}
function log(uint256 p0, bool p1, uint256 p2, uint256 p3) internal pure {
_sendLogPayload(abi.encodeWithSignature("log(uint256,bool,uint256,uint256)", p0, p1, p2, p3));
}
function log(uint256 p0, bool p1, uint256 p2, string memory p3) internal pure {
_sendLogPayload(abi.encodeWithSignature("log(uint256,bool,uint256,string)", p0, p1, p2, p3));
}
function log(uint256 p0, bool p1, uint256 p2, bool p3) internal pure {
_sendLogPayload(abi.encodeWithSignature("log(uint256,bool,uint256,bool)", p0, p1, p2, p3));
}
function log(uint256 p0, bool p1, uint256 p2, address p3) internal pure {
_sendLogPayload(abi.encodeWithSignature("log(uint256,bool,uint256,address)", p0, p1, p2, p3));
}
function log(uint256 p0, bool p1, string memory p2, uint256 p3) internal pure {
_sendLogPayload(abi.encodeWithSignature("log(uint256,bool,string,uint256)", p0, p1, p2, p3));
}
function log(uint256 p0, bool p1, string memory p2, string memory p3) internal pure {
_sendLogPayload(abi.encodeWithSignature("log(uint256,bool,string,string)", p0, p1, p2, p3));
}
function log(uint256 p0, bool p1, string memory p2, bool p3) internal pure {
_sendLogPayload(abi.encodeWithSignature("log(uint256,bool,string,bool)", p0, p1, p2, p3));
}
function log(uint256 p0, bool p1, string memory p2, address p3) internal pure {
_sendLogPayload(abi.encodeWithSignature("log(uint256,bool,string,address)", p0, p1, p2, p3));
}
function log(uint256 p0, bool p1, bool p2, uint256 p3) internal pure {
_sendLogPayload(abi.encodeWithSignature("log(uint256,bool,bool,uint256)", p0, p1, p2, p3));
}
function log(uint256 p0, bool p1, bool p2, string memory p3) internal pure {
_sendLogPayload(abi.encodeWithSignature("log(uint256,bool,bool,string)", p0, p1, p2, p3));
}
function log(uint256 p0, bool p1, bool p2, bool p3) internal pure {
_sendLogPayload(abi.encodeWithSignature("log(uint256,bool,bool,bool)", p0, p1, p2, p3));
}
function log(uint256 p0, bool p1, bool p2, address p3) internal pure {
_sendLogPayload(abi.encodeWithSignature("log(uint256,bool,bool,address)", p0, p1, p2, p3));
}
function log(uint256 p0, bool p1, address p2, uint256 p3) internal pure {
_sendLogPayload(abi.encodeWithSignature("log(uint256,bool,address,uint256)", p0, p1, p2, p3));
}
function log(uint256 p0, bool p1, address p2, string memory p3) internal pure {
_sendLogPayload(abi.encodeWithSignature("log(uint256,bool,address,string)", p0, p1, p2, p3));
}
function log(uint256 p0, bool p1, address p2, bool p3) internal pure {
_sendLogPayload(abi.encodeWithSignature("log(uint256,bool,address,bool)", p0, p1, p2, p3));
}
function log(uint256 p0, bool p1, address p2, address p3) internal pure {
_sendLogPayload(abi.encodeWithSignature("log(uint256,bool,address,address)", p0, p1, p2, p3));
}
function log(uint256 p0, address p1, uint256 p2, uint256 p3) internal pure {
_sendLogPayload(abi.encodeWithSignature("log(uint256,address,uint256,uint256)", p0, p1, p2, p3));
}
function log(uint256 p0, address p1, uint256 p2, string memory p3) internal pure {
_sendLogPayload(abi.encodeWithSignature("log(uint256,address,uint256,string)", p0, p1, p2, p3));
}
function log(uint256 p0, address p1, uint256 p2, bool p3) internal pure {
_sendLogPayload(abi.encodeWithSignature("log(uint256,address,uint256,bool)", p0, p1, p2, p3));
}
function log(uint256 p0, address p1, uint256 p2, address p3) internal pure {
_sendLogPayload(abi.encodeWithSignature("log(uint256,address,uint256,address)", p0, p1, p2, p3));
}
function log(uint256 p0, address p1, string memory p2, uint256 p3) internal pure {
_sendLogPayload(abi.encodeWithSignature("log(uint256,address,string,uint256)", p0, p1, p2, p3));
}
function log(uint256 p0, address p1, string memory p2, string memory p3) internal pure {
_sendLogPayload(abi.encodeWithSignature("log(uint256,address,string,string)", p0, p1, p2, p3));
}
function log(uint256 p0, address p1, string memory p2, bool p3) internal pure {
_sendLogPayload(abi.encodeWithSignature("log(uint256,address,string,bool)", p0, p1, p2, p3));
}
function log(uint256 p0, address p1, string memory p2, address p3) internal pure {
_sendLogPayload(abi.encodeWithSignature("log(uint256,address,string,address)", p0, p1, p2, p3));
}
function log(uint256 p0, address p1, bool p2, uint256 p3) internal pure {
_sendLogPayload(abi.encodeWithSignature("log(uint256,address,bool,uint256)", p0, p1, p2, p3));
}
function log(uint256 p0, address p1, bool p2, string memory p3) internal pure {
_sendLogPayload(abi.encodeWithSignature("log(uint256,address,bool,string)", p0, p1, p2, p3));
}
function log(uint256 p0, address p1, bool p2, bool p3) internal pure {
_sendLogPayload(abi.encodeWithSignature("log(uint256,address,bool,bool)", p0, p1, p2, p3));
}
function log(uint256 p0, address p1, bool p2, address p3) internal pure {
_sendLogPayload(abi.encodeWithSignature("log(uint256,address,bool,address)", p0, p1, p2, p3));
}
function log(uint256 p0, address p1, address p2, uint256 p3) internal pure {
_sendLogPayload(abi.encodeWithSignature("log(uint256,address,address,uint256)", p0, p1, p2, p3));
}
function log(uint256 p0, address p1, address p2, string memory p3) internal pure {
_sendLogPayload(abi.encodeWithSignature("log(uint256,address,address,string)", p0, p1, p2, p3));
}
function log(uint256 p0, address p1, address p2, bool p3) internal pure {
_sendLogPayload(abi.encodeWithSignature("log(uint256,address,address,bool)", p0, p1, p2, p3));
}
function log(uint256 p0, address p1, address p2, address p3) internal pure {
_sendLogPayload(abi.encodeWithSignature("log(uint256,address,address,address)", p0, p1, p2, p3));
}
function log(string memory p0, uint256 p1, uint256 p2, uint256 p3) internal pure {
_sendLogPayload(abi.encodeWithSignature("log(string,uint256,uint256,uint256)", p0, p1, p2, p3));
}
function log(string memory p0, uint256 p1, uint256 p2, string memory p3) internal pure {
_sendLogPayload(abi.encodeWithSignature("log(string,uint256,uint256,string)", p0, p1, p2, p3));
}
function log(string memory p0, uint256 p1, uint256 p2, bool p3) internal pure {
_sendLogPayload(abi.encodeWithSignature("log(string,uint256,uint256,bool)", p0, p1, p2, p3));
}
function log(string memory p0, uint256 p1, uint256 p2, address p3) internal pure {
_sendLogPayload(abi.encodeWithSignature("log(string,uint256,uint256,address)", p0, p1, p2, p3));
}
function log(string memory p0, uint256 p1, string memory p2, uint256 p3) internal pure {
_sendLogPayload(abi.encodeWithSignature("log(string,uint256,string,uint256)", p0, p1, p2, p3));
}
function log(string memory p0, uint256 p1, string memory p2, string memory p3) internal pure {
_sendLogPayload(abi.encodeWithSignature("log(string,uint256,string,string)", p0, p1, p2, p3));
}
function log(string memory p0, uint256 p1, string memory p2, bool p3) internal pure {
_sendLogPayload(abi.encodeWithSignature("log(string,uint256,string,bool)", p0, p1, p2, p3));
}
function log(string memory p0, uint256 p1, string memory p2, address p3) internal pure {
_sendLogPayload(abi.encodeWithSignature("log(string,uint256,string,address)", p0, p1, p2, p3));
}
function log(string memory p0, uint256 p1, bool p2, uint256 p3) internal pure {
_sendLogPayload(abi.encodeWithSignature("log(string,uint256,bool,uint256)", p0, p1, p2, p3));
}
function log(string memory p0, uint256 p1, bool p2, string memory p3) internal pure {
_sendLogPayload(abi.encodeWithSignature("log(string,uint256,bool,string)", p0, p1, p2, p3));
}
function log(string memory p0, uint256 p1, bool p2, bool p3) internal pure {
_sendLogPayload(abi.encodeWithSignature("log(string,uint256,bool,bool)", p0, p1, p2, p3));
}
function log(string memory p0, uint256 p1, bool p2, address p3) internal pure {
_sendLogPayload(abi.encodeWithSignature("log(string,uint256,bool,address)", p0, p1, p2, p3));
}
function log(string memory p0, uint256 p1, address p2, uint256 p3) internal pure {
_sendLogPayload(abi.encodeWithSignature("log(string,uint256,address,uint256)", p0, p1, p2, p3));
}
function log(string memory p0, uint256 p1, address p2, string memory p3) internal pure {
_sendLogPayload(abi.encodeWithSignature("log(string,uint256,address,string)", p0, p1, p2, p3));
}
function log(string memory p0, uint256 p1, address p2, bool p3) internal pure {
_sendLogPayload(abi.encodeWithSignature("log(string,uint256,address,bool)", p0, p1, p2, p3));
}
function log(string memory p0, uint256 p1, address p2, address p3) internal pure {
_sendLogPayload(abi.encodeWithSignature("log(string,uint256,address,address)", p0, p1, p2, p3));
}
function log(string memory p0, string memory p1, uint256 p2, uint256 p3) internal pure {
_sendLogPayload(abi.encodeWithSignature("log(string,string,uint256,uint256)", p0, p1, p2, p3));
}
function log(string memory p0, string memory p1, uint256 p2, string memory p3) internal pure {
_sendLogPayload(abi.encodeWithSignature("log(string,string,uint256,string)", p0, p1, p2, p3));
}
function log(string memory p0, string memory p1, uint256 p2, bool p3) internal pure {
_sendLogPayload(abi.encodeWithSignature("log(string,string,uint256,bool)", p0, p1, p2, p3));
}
function log(string memory p0, string memory p1, uint256 p2, address p3) internal pure {
_sendLogPayload(abi.encodeWithSignature("log(string,string,uint256,address)", p0, p1, p2, p3));
}
function log(string memory p0, string memory p1, string memory p2, uint256 p3) internal pure {
_sendLogPayload(abi.encodeWithSignature("log(string,string,string,uint256)", p0, p1, p2, p3));
}
function log(string memory p0, string memory p1, string memory p2, string memory p3) internal pure {
_sendLogPayload(abi.encodeWithSignature("log(string,string,string,string)", p0, p1, p2, p3));
}
function log(string memory p0, string memory p1, string memory p2, bool p3) internal pure {
_sendLogPayload(abi.encodeWithSignature("log(string,string,string,bool)", p0, p1, p2, p3));
}
function log(string memory p0, string memory p1, string memory p2, address p3) internal pure {
_sendLogPayload(abi.encodeWithSignature("log(string,string,string,address)", p0, p1, p2, p3));
}
function log(string memory p0, string memory p1, bool p2, uint256 p3) internal pure {
_sendLogPayload(abi.encodeWithSignature("log(string,string,bool,uint256)", p0, p1, p2, p3));
}
function log(string memory p0, string memory p1, bool p2, string memory p3) internal pure {
_sendLogPayload(abi.encodeWithSignature("log(string,string,bool,string)", p0, p1, p2, p3));
}
function log(string memory p0, string memory p1, bool p2, bool p3) internal pure {
_sendLogPayload(abi.encodeWithSignature("log(string,string,bool,bool)", p0, p1, p2, p3));
}
function log(string memory p0, string memory p1, bool p2, address p3) internal pure {
_sendLogPayload(abi.encodeWithSignature("log(string,string,bool,address)", p0, p1, p2, p3));
}
function log(string memory p0, string memory p1, address p2, uint256 p3) internal pure {
_sendLogPayload(abi.encodeWithSignature("log(string,string,address,uint256)", p0, p1, p2, p3));
}
function log(string memory p0, string memory p1, address p2, string memory p3) internal pure {
_sendLogPayload(abi.encodeWithSignature("log(string,string,address,string)", p0, p1, p2, p3));
}
function log(string memory p0, string memory p1, address p2, bool p3) internal pure {
_sendLogPayload(abi.encodeWithSignature("log(string,string,address,bool)", p0, p1, p2, p3));
}
function log(string memory p0, string memory p1, address p2, address p3) internal pure {
_sendLogPayload(abi.encodeWithSignature("log(string,string,address,address)", p0, p1, p2, p3));
}
function log(string memory p0, bool p1, uint256 p2, uint256 p3) internal pure {
_sendLogPayload(abi.encodeWithSignature("log(string,bool,uint256,uint256)", p0, p1, p2, p3));
}
function log(string memory p0, bool p1, uint256 p2, string memory p3) internal pure {
_sendLogPayload(abi.encodeWithSignature("log(string,bool,uint256,string)", p0, p1, p2, p3));
}
function log(string memory p0, bool p1, uint256 p2, bool p3) internal pure {
_sendLogPayload(abi.encodeWithSignature("log(string,bool,uint256,bool)", p0, p1, p2, p3));
}
function log(string memory p0, bool p1, uint256 p2, address p3) internal pure {
_sendLogPayload(abi.encodeWithSignature("log(string,bool,uint256,address)", p0, p1, p2, p3));
}
function log(string memory p0, bool p1, string memory p2, uint256 p3) internal pure {
_sendLogPayload(abi.encodeWithSignature("log(string,bool,string,uint256)", p0, p1, p2, p3));
}
function log(string memory p0, bool p1, string memory p2, string memory p3) internal pure {
_sendLogPayload(abi.encodeWithSignature("log(string,bool,string,string)", p0, p1, p2, p3));
}
function log(string memory p0, bool p1, string memory p2, bool p3) internal pure {
_sendLogPayload(abi.encodeWithSignature("log(string,bool,string,bool)", p0, p1, p2, p3));
}
function log(string memory p0, bool p1, string memory p2, address p3) internal pure {
_sendLogPayload(abi.encodeWithSignature("log(string,bool,string,address)", p0, p1, p2, p3));
}
function log(string memory p0, bool p1, bool p2, uint256 p3) internal pure {
_sendLogPayload(abi.encodeWithSignature("log(string,bool,bool,uint256)", p0, p1, p2, p3));
}
function log(string memory p0, bool p1, bool p2, string memory p3) internal pure {
_sendLogPayload(abi.encodeWithSignature("log(string,bool,bool,string)", p0, p1, p2, p3));
}
function log(string memory p0, bool p1, bool p2, bool p3) internal pure {
_sendLogPayload(abi.encodeWithSignature("log(string,bool,bool,bool)", p0, p1, p2, p3));
}
function log(string memory p0, bool p1, bool p2, address p3) internal pure {
_sendLogPayload(abi.encodeWithSignature("log(string,bool,bool,address)", p0, p1, p2, p3));
}
function log(string memory p0, bool p1, address p2, uint256 p3) internal pure {
_sendLogPayload(abi.encodeWithSignature("log(string,bool,address,uint256)", p0, p1, p2, p3));
}
function log(string memory p0, bool p1, address p2, string memory p3) internal pure {
_sendLogPayload(abi.encodeWithSignature("log(string,bool,address,string)", p0, p1, p2, p3));
}
function log(string memory p0, bool p1, address p2, bool p3) internal pure {
_sendLogPayload(abi.encodeWithSignature("log(string,bool,address,bool)", p0, p1, p2, p3));
}
function log(string memory p0, bool p1, address p2, address p3) internal pure {
_sendLogPayload(abi.encodeWithSignature("log(string,bool,address,address)", p0, p1, p2, p3));
}
function log(string memory p0, address p1, uint256 p2, uint256 p3) internal pure {
_sendLogPayload(abi.encodeWithSignature("log(string,address,uint256,uint256)", p0, p1, p2, p3));
}
function log(string memory p0, address p1, uint256 p2, string memory p3) internal pure {
_sendLogPayload(abi.encodeWithSignature("log(string,address,uint256,string)", p0, p1, p2, p3));
}
function log(string memory p0, address p1, uint256 p2, bool p3) internal pure {
_sendLogPayload(abi.encodeWithSignature("log(string,address,uint256,bool)", p0, p1, p2, p3));
}
function log(string memory p0, address p1, uint256 p2, address p3) internal pure {
_sendLogPayload(abi.encodeWithSignature("log(string,address,uint256,address)", p0, p1, p2, p3));
}
function log(string memory p0, address p1, string memory p2, uint256 p3) internal pure {
_sendLogPayload(abi.encodeWithSignature("log(string,address,string,uint256)", p0, p1, p2, p3));
}
function log(string memory p0, address p1, string memory p2, string memory p3) internal pure {
_sendLogPayload(abi.encodeWithSignature("log(string,address,string,string)", p0, p1, p2, p3));
}
function log(string memory p0, address p1, string memory p2, bool p3) internal pure {
_sendLogPayload(abi.encodeWithSignature("log(string,address,string,bool)", p0, p1, p2, p3));
}
function log(string memory p0, address p1, string memory p2, address p3) internal pure {
_sendLogPayload(abi.encodeWithSignature("log(string,address,string,address)", p0, p1, p2, p3));
}
function log(string memory p0, address p1, bool p2, uint256 p3) internal pure {
_sendLogPayload(abi.encodeWithSignature("log(string,address,bool,uint256)", p0, p1, p2, p3));
}
function log(string memory p0, address p1, bool p2, string memory p3) internal pure {
_sendLogPayload(abi.encodeWithSignature("log(string,address,bool,string)", p0, p1, p2, p3));
}
function log(string memory p0, address p1, bool p2, bool p3) internal pure {
_sendLogPayload(abi.encodeWithSignature("log(string,address,bool,bool)", p0, p1, p2, p3));
}
function log(string memory p0, address p1, bool p2, address p3) internal pure {
_sendLogPayload(abi.encodeWithSignature("log(string,address,bool,address)", p0, p1, p2, p3));
}
function log(string memory p0, address p1, address p2, uint256 p3) internal pure {
_sendLogPayload(abi.encodeWithSignature("log(string,address,address,uint256)", p0, p1, p2, p3));
}
function log(string memory p0, address p1, address p2, string memory p3) internal pure {
_sendLogPayload(abi.encodeWithSignature("log(string,address,address,string)", p0, p1, p2, p3));
}
function log(string memory p0, address p1, address p2, bool p3) internal pure {
_sendLogPayload(abi.encodeWithSignature("log(string,address,address,bool)", p0, p1, p2, p3));
}
function log(string memory p0, address p1, address p2, address p3) internal pure {
_sendLogPayload(abi.encodeWithSignature("log(string,address,address,address)", p0, p1, p2, p3));
}
function log(bool p0, uint256 p1, uint256 p2, uint256 p3) internal pure {
_sendLogPayload(abi.encodeWithSignature("log(bool,uint256,uint256,uint256)", p0, p1, p2, p3));
}
function log(bool p0, uint256 p1, uint256 p2, string memory p3) internal pure {
_sendLogPayload(abi.encodeWithSignature("log(bool,uint256,uint256,string)", p0, p1, p2, p3));
}
function log(bool p0, uint256 p1, uint256 p2, bool p3) internal pure {
_sendLogPayload(abi.encodeWithSignature("log(bool,uint256,uint256,bool)", p0, p1, p2, p3));
}
function log(bool p0, uint256 p1, uint256 p2, address p3) internal pure {
_sendLogPayload(abi.encodeWithSignature("log(bool,uint256,uint256,address)", p0, p1, p2, p3));
}
function log(bool p0, uint256 p1, string memory p2, uint256 p3) internal pure {
_sendLogPayload(abi.encodeWithSignature("log(bool,uint256,string,uint256)", p0, p1, p2, p3));
}
function log(bool p0, uint256 p1, string memory p2, string memory p3) internal pure {
_sendLogPayload(abi.encodeWithSignature("log(bool,uint256,string,string)", p0, p1, p2, p3));
}
function log(bool p0, uint256 p1, string memory p2, bool p3) internal pure {
_sendLogPayload(abi.encodeWithSignature("log(bool,uint256,string,bool)", p0, p1, p2, p3));
}
function log(bool p0, uint256 p1, string memory p2, address p3) internal pure {
_sendLogPayload(abi.encodeWithSignature("log(bool,uint256,string,address)", p0, p1, p2, p3));
}
function log(bool p0, uint256 p1, bool p2, uint256 p3) internal pure {
_sendLogPayload(abi.encodeWithSignature("log(bool,uint256,bool,uint256)", p0, p1, p2, p3));
}
function log(bool p0, uint256 p1, bool p2, string memory p3) internal pure {
_sendLogPayload(abi.encodeWithSignature("log(bool,uint256,bool,string)", p0, p1, p2, p3));
}
function log(bool p0, uint256 p1, bool p2, bool p3) internal pure {
_sendLogPayload(abi.encodeWithSignature("log(bool,uint256,bool,bool)", p0, p1, p2, p3));
}
function log(bool p0, uint256 p1, bool p2, address p3) internal pure {
_sendLogPayload(abi.encodeWithSignature("log(bool,uint256,bool,address)", p0, p1, p2, p3));
}
function log(bool p0, uint256 p1, address p2, uint256 p3) internal pure {
_sendLogPayload(abi.encodeWithSignature("log(bool,uint256,address,uint256)", p0, p1, p2, p3));
}
function log(bool p0, uint256 p1, address p2, string memory p3) internal pure {
_sendLogPayload(abi.encodeWithSignature("log(bool,uint256,address,string)", p0, p1, p2, p3));
}
function log(bool p0, uint256 p1, address p2, bool p3) internal pure {
_sendLogPayload(abi.encodeWithSignature("log(bool,uint256,address,bool)", p0, p1, p2, p3));
}
function log(bool p0, uint256 p1, address p2, address p3) internal pure {
_sendLogPayload(abi.encodeWithSignature("log(bool,uint256,address,address)", p0, p1, p2, p3));
}
function log(bool p0, string memory p1, uint256 p2, uint256 p3) internal pure {
_sendLogPayload(abi.encodeWithSignature("log(bool,string,uint256,uint256)", p0, p1, p2, p3));
}
function log(bool p0, string memory p1, uint256 p2, string memory p3) internal pure {
_sendLogPayload(abi.encodeWithSignature("log(bool,string,uint256,string)", p0, p1, p2, p3));
}
function log(bool p0, string memory p1, uint256 p2, bool p3) internal pure {
_sendLogPayload(abi.encodeWithSignature("log(bool,string,uint256,bool)", p0, p1, p2, p3));
}
function log(bool p0, string memory p1, uint256 p2, address p3) internal pure {
_sendLogPayload(abi.encodeWithSignature("log(bool,string,uint256,address)", p0, p1, p2, p3));
}
function log(bool p0, string memory p1, string memory p2, uint256 p3) internal pure {
_sendLogPayload(abi.encodeWithSignature("log(bool,string,string,uint256)", p0, p1, p2, p3));
}
function log(bool p0, string memory p1, string memory p2, string memory p3) internal pure {
_sendLogPayload(abi.encodeWithSignature("log(bool,string,string,string)", p0, p1, p2, p3));
}
function log(bool p0, string memory p1, string memory p2, bool p3) internal pure {
_sendLogPayload(abi.encodeWithSignature("log(bool,string,string,bool)", p0, p1, p2, p3));
}
function log(bool p0, string memory p1, string memory p2, address p3) internal pure {
_sendLogPayload(abi.encodeWithSignature("log(bool,string,string,address)", p0, p1, p2, p3));
}
function log(bool p0, string memory p1, bool p2, uint256 p3) internal pure {
_sendLogPayload(abi.encodeWithSignature("log(bool,string,bool,uint256)", p0, p1, p2, p3));
}
function log(bool p0, string memory p1, bool p2, string memory p3) internal pure {
_sendLogPayload(abi.encodeWithSignature("log(bool,string,bool,string)", p0, p1, p2, p3));
}
function log(bool p0, string memory p1, bool p2, bool p3) internal pure {
_sendLogPayload(abi.encodeWithSignature("log(bool,string,bool,bool)", p0, p1, p2, p3));
}
function log(bool p0, string memory p1, bool p2, address p3) internal pure {
_sendLogPayload(abi.encodeWithSignature("log(bool,string,bool,address)", p0, p1, p2, p3));
}
function log(bool p0, string memory p1, address p2, uint256 p3) internal pure {
_sendLogPayload(abi.encodeWithSignature("log(bool,string,address,uint256)", p0, p1, p2, p3));
}
function log(bool p0, string memory p1, address p2, string memory p3) internal pure {
_sendLogPayload(abi.encodeWithSignature("log(bool,string,address,string)", p0, p1, p2, p3));
}
function log(bool p0, string memory p1, address p2, bool p3) internal pure {
_sendLogPayload(abi.encodeWithSignature("log(bool,string,address,bool)", p0, p1, p2, p3));
}
function log(bool p0, string memory p1, address p2, address p3) internal pure {
_sendLogPayload(abi.encodeWithSignature("log(bool,string,address,address)", p0, p1, p2, p3));
}
function log(bool p0, bool p1, uint256 p2, uint256 p3) internal pure {
_sendLogPayload(abi.encodeWithSignature("log(bool,bool,uint256,uint256)", p0, p1, p2, p3));
}
function log(bool p0, bool p1, uint256 p2, string memory p3) internal pure {
_sendLogPayload(abi.encodeWithSignature("log(bool,bool,uint256,string)", p0, p1, p2, p3));
}
function log(bool p0, bool p1, uint256 p2, bool p3) internal pure {
_sendLogPayload(abi.encodeWithSignature("log(bool,bool,uint256,bool)", p0, p1, p2, p3));
}
function log(bool p0, bool p1, uint256 p2, address p3) internal pure {
_sendLogPayload(abi.encodeWithSignature("log(bool,bool,uint256,address)", p0, p1, p2, p3));
}
function log(bool p0, bool p1, string memory p2, uint256 p3) internal pure {
_sendLogPayload(abi.encodeWithSignature("log(bool,bool,string,uint256)", p0, p1, p2, p3));
}
function log(bool p0, bool p1, string memory p2, string memory p3) internal pure {
_sendLogPayload(abi.encodeWithSignature("log(bool,bool,string,string)", p0, p1, p2, p3));
}
function log(bool p0, bool p1, string memory p2, bool p3) internal pure {
_sendLogPayload(abi.encodeWithSignature("log(bool,bool,string,bool)", p0, p1, p2, p3));
}
function log(bool p0, bool p1, string memory p2, address p3) internal pure {
_sendLogPayload(abi.encodeWithSignature("log(bool,bool,string,address)", p0, p1, p2, p3));
}
function log(bool p0, bool p1, bool p2, uint256 p3) internal pure {
_sendLogPayload(abi.encodeWithSignature("log(bool,bool,bool,uint256)", p0, p1, p2, p3));
}
function log(bool p0, bool p1, bool p2, string memory p3) internal pure {
_sendLogPayload(abi.encodeWithSignature("log(bool,bool,bool,string)", p0, p1, p2, p3));
}
function log(bool p0, bool p1, bool p2, bool p3) internal pure {
_sendLogPayload(abi.encodeWithSignature("log(bool,bool,bool,bool)", p0, p1, p2, p3));
}
function log(bool p0, bool p1, bool p2, address p3) internal pure {
_sendLogPayload(abi.encodeWithSignature("log(bool,bool,bool,address)", p0, p1, p2, p3));
}
function log(bool p0, bool p1, address p2, uint256 p3) internal pure {
_sendLogPayload(abi.encodeWithSignature("log(bool,bool,address,uint256)", p0, p1, p2, p3));
}
function log(bool p0, bool p1, address p2, string memory p3) internal pure {
_sendLogPayload(abi.encodeWithSignature("log(bool,bool,address,string)", p0, p1, p2, p3));
}
function log(bool p0, bool p1, address p2, bool p3) internal pure {
_sendLogPayload(abi.encodeWithSignature("log(bool,bool,address,bool)", p0, p1, p2, p3));
}
function log(bool p0, bool p1, address p2, address p3) internal pure {
_sendLogPayload(abi.encodeWithSignature("log(bool,bool,address,address)", p0, p1, p2, p3));
}
function log(bool p0, address p1, uint256 p2, uint256 p3) internal pure {
_sendLogPayload(abi.encodeWithSignature("log(bool,address,uint256,uint256)", p0, p1, p2, p3));
}
function log(bool p0, address p1, uint256 p2, string memory p3) internal pure {
_sendLogPayload(abi.encodeWithSignature("log(bool,address,uint256,string)", p0, p1, p2, p3));
}
function log(bool p0, address p1, uint256 p2, bool p3) internal pure {
_sendLogPayload(abi.encodeWithSignature("log(bool,address,uint256,bool)", p0, p1, p2, p3));
}
function log(bool p0, address p1, uint256 p2, address p3) internal pure {
_sendLogPayload(abi.encodeWithSignature("log(bool,address,uint256,address)", p0, p1, p2, p3));
}
function log(bool p0, address p1, string memory p2, uint256 p3) internal pure {
_sendLogPayload(abi.encodeWithSignature("log(bool,address,string,uint256)", p0, p1, p2, p3));
}
function log(bool p0, address p1, string memory p2, string memory p3) internal pure {
_sendLogPayload(abi.encodeWithSignature("log(bool,address,string,string)", p0, p1, p2, p3));
}
function log(bool p0, address p1, string memory p2, bool p3) internal pure {
_sendLogPayload(abi.encodeWithSignature("log(bool,address,string,bool)", p0, p1, p2, p3));
}
function log(bool p0, address p1, string memory p2, address p3) internal pure {
_sendLogPayload(abi.encodeWithSignature("log(bool,address,string,address)", p0, p1, p2, p3));
}
function log(bool p0, address p1, bool p2, uint256 p3) internal pure {
_sendLogPayload(abi.encodeWithSignature("log(bool,address,bool,uint256)", p0, p1, p2, p3));
}
function log(bool p0, address p1, bool p2, string memory p3) internal pure {
_sendLogPayload(abi.encodeWithSignature("log(bool,address,bool,string)", p0, p1, p2, p3));
}
function log(bool p0, address p1, bool p2, bool p3) internal pure {
_sendLogPayload(abi.encodeWithSignature("log(bool,address,bool,bool)", p0, p1, p2, p3));
}
function log(bool p0, address p1, bool p2, address p3) internal pure {
_sendLogPayload(abi.encodeWithSignature("log(bool,address,bool,address)", p0, p1, p2, p3));
}
function log(bool p0, address p1, address p2, uint256 p3) internal pure {
_sendLogPayload(abi.encodeWithSignature("log(bool,address,address,uint256)", p0, p1, p2, p3));
}
function log(bool p0, address p1, address p2, string memory p3) internal pure {
_sendLogPayload(abi.encodeWithSignature("log(bool,address,address,string)", p0, p1, p2, p3));
}
function log(bool p0, address p1, address p2, bool p3) internal pure {
_sendLogPayload(abi.encodeWithSignature("log(bool,address,address,bool)", p0, p1, p2, p3));
}
function log(bool p0, address p1, address p2, address p3) internal pure {
_sendLogPayload(abi.encodeWithSignature("log(bool,address,address,address)", p0, p1, p2, p3));
}
function log(address p0, uint256 p1, uint256 p2, uint256 p3) internal pure {
_sendLogPayload(abi.encodeWithSignature("log(address,uint256,uint256,uint256)", p0, p1, p2, p3));
}
function log(address p0, uint256 p1, uint256 p2, string memory p3) internal pure {
_sendLogPayload(abi.encodeWithSignature("log(address,uint256,uint256,string)", p0, p1, p2, p3));
}
function log(address p0, uint256 p1, uint256 p2, bool p3) internal pure {
_sendLogPayload(abi.encodeWithSignature("log(address,uint256,uint256,bool)", p0, p1, p2, p3));
}
function log(address p0, uint256 p1, uint256 p2, address p3) internal pure {
_sendLogPayload(abi.encodeWithSignature("log(address,uint256,uint256,address)", p0, p1, p2, p3));
}
function log(address p0, uint256 p1, string memory p2, uint256 p3) internal pure {
_sendLogPayload(abi.encodeWithSignature("log(address,uint256,string,uint256)", p0, p1, p2, p3));
}
function log(address p0, uint256 p1, string memory p2, string memory p3) internal pure {
_sendLogPayload(abi.encodeWithSignature("log(address,uint256,string,string)", p0, p1, p2, p3));
}
function log(address p0, uint256 p1, string memory p2, bool p3) internal pure {
_sendLogPayload(abi.encodeWithSignature("log(address,uint256,string,bool)", p0, p1, p2, p3));
}
function log(address p0, uint256 p1, string memory p2, address p3) internal pure {
_sendLogPayload(abi.encodeWithSignature("log(address,uint256,string,address)", p0, p1, p2, p3));
}
function log(address p0, uint256 p1, bool p2, uint256 p3) internal pure {
_sendLogPayload(abi.encodeWithSignature("log(address,uint256,bool,uint256)", p0, p1, p2, p3));
}
function log(address p0, uint256 p1, bool p2, string memory p3) internal pure {
_sendLogPayload(abi.encodeWithSignature("log(address,uint256,bool,string)", p0, p1, p2, p3));
}
function log(address p0, uint256 p1, bool p2, bool p3) internal pure {
_sendLogPayload(abi.encodeWithSignature("log(address,uint256,bool,bool)", p0, p1, p2, p3));
}
function log(address p0, uint256 p1, bool p2, address p3) internal pure {
_sendLogPayload(abi.encodeWithSignature("log(address,uint256,bool,address)", p0, p1, p2, p3));
}
function log(address p0, uint256 p1, address p2, uint256 p3) internal pure {
_sendLogPayload(abi.encodeWithSignature("log(address,uint256,address,uint256)", p0, p1, p2, p3));
}
function log(address p0, uint256 p1, address p2, string memory p3) internal pure {
_sendLogPayload(abi.encodeWithSignature("log(address,uint256,address,string)", p0, p1, p2, p3));
}
function log(address p0, uint256 p1, address p2, bool p3) internal pure {
_sendLogPayload(abi.encodeWithSignature("log(address,uint256,address,bool)", p0, p1, p2, p3));
}
function log(address p0, uint256 p1, address p2, address p3) internal pure {
_sendLogPayload(abi.encodeWithSignature("log(address,uint256,address,address)", p0, p1, p2, p3));
}
function log(address p0, string memory p1, uint256 p2, uint256 p3) internal pure {
_sendLogPayload(abi.encodeWithSignature("log(address,string,uint256,uint256)", p0, p1, p2, p3));
}
function log(address p0, string memory p1, uint256 p2, string memory p3) internal pure {
_sendLogPayload(abi.encodeWithSignature("log(address,string,uint256,string)", p0, p1, p2, p3));
}
function log(address p0, string memory p1, uint256 p2, bool p3) internal pure {
_sendLogPayload(abi.encodeWithSignature("log(address,string,uint256,bool)", p0, p1, p2, p3));
}
function log(address p0, string memory p1, uint256 p2, address p3) internal pure {
_sendLogPayload(abi.encodeWithSignature("log(address,string,uint256,address)", p0, p1, p2, p3));
}
function log(address p0, string memory p1, string memory p2, uint256 p3) internal pure {
_sendLogPayload(abi.encodeWithSignature("log(address,string,string,uint256)", p0, p1, p2, p3));
}
function log(address p0, string memory p1, string memory p2, string memory p3) internal pure {
_sendLogPayload(abi.encodeWithSignature("log(address,string,string,string)", p0, p1, p2, p3));
}
function log(address p0, string memory p1, string memory p2, bool p3) internal pure {
_sendLogPayload(abi.encodeWithSignature("log(address,string,string,bool)", p0, p1, p2, p3));
}
function log(address p0, string memory p1, string memory p2, address p3) internal pure {
_sendLogPayload(abi.encodeWithSignature("log(address,string,string,address)", p0, p1, p2, p3));
}
function log(address p0, string memory p1, bool p2, uint256 p3) internal pure {
_sendLogPayload(abi.encodeWithSignature("log(address,string,bool,uint256)", p0, p1, p2, p3));
}
function log(address p0, string memory p1, bool p2, string memory p3) internal pure {
_sendLogPayload(abi.encodeWithSignature("log(address,string,bool,string)", p0, p1, p2, p3));
}
function log(address p0, string memory p1, bool p2, bool p3) internal pure {
_sendLogPayload(abi.encodeWithSignature("log(address,string,bool,bool)", p0, p1, p2, p3));
}
function log(address p0, string memory p1, bool p2, address p3) internal pure {
_sendLogPayload(abi.encodeWithSignature("log(address,string,bool,address)", p0, p1, p2, p3));
}
function log(address p0, string memory p1, address p2, uint256 p3) internal pure {
_sendLogPayload(abi.encodeWithSignature("log(address,string,address,uint256)", p0, p1, p2, p3));
}
function log(address p0, string memory p1, address p2, string memory p3) internal pure {
_sendLogPayload(abi.encodeWithSignature("log(address,string,address,string)", p0, p1, p2, p3));
}
function log(address p0, string memory p1, address p2, bool p3) internal pure {
_sendLogPayload(abi.encodeWithSignature("log(address,string,address,bool)", p0, p1, p2, p3));
}
function log(address p0, string memory p1, address p2, address p3) internal pure {
_sendLogPayload(abi.encodeWithSignature("log(address,string,address,address)", p0, p1, p2, p3));
}
function log(address p0, bool p1, uint256 p2, uint256 p3) internal pure {
_sendLogPayload(abi.encodeWithSignature("log(address,bool,uint256,uint256)", p0, p1, p2, p3));
}
function log(address p0, bool p1, uint256 p2, string memory p3) internal pure {
_sendLogPayload(abi.encodeWithSignature("log(address,bool,uint256,string)", p0, p1, p2, p3));
}
function log(address p0, bool p1, uint256 p2, bool p3) internal pure {
_sendLogPayload(abi.encodeWithSignature("log(address,bool,uint256,bool)", p0, p1, p2, p3));
}
function log(address p0, bool p1, uint256 p2, address p3) internal pure {
_sendLogPayload(abi.encodeWithSignature("log(address,bool,uint256,address)", p0, p1, p2, p3));
}
function log(address p0, bool p1, string memory p2, uint256 p3) internal pure {
_sendLogPayload(abi.encodeWithSignature("log(address,bool,string,uint256)", p0, p1, p2, p3));
}
function log(address p0, bool p1, string memory p2, string memory p3) internal pure {
_sendLogPayload(abi.encodeWithSignature("log(address,bool,string,string)", p0, p1, p2, p3));
}
function log(address p0, bool p1, string memory p2, bool p3) internal pure {
_sendLogPayload(abi.encodeWithSignature("log(address,bool,string,bool)", p0, p1, p2, p3));
}
function log(address p0, bool p1, string memory p2, address p3) internal pure {
_sendLogPayload(abi.encodeWithSignature("log(address,bool,string,address)", p0, p1, p2, p3));
}
function log(address p0, bool p1, bool p2, uint256 p3) internal pure {
_sendLogPayload(abi.encodeWithSignature("log(address,bool,bool,uint256)", p0, p1, p2, p3));
}
function log(address p0, bool p1, bool p2, string memory p3) internal pure {
_sendLogPayload(abi.encodeWithSignature("log(address,bool,bool,string)", p0, p1, p2, p3));
}
function log(address p0, bool p1, bool p2, bool p3) internal pure {
_sendLogPayload(abi.encodeWithSignature("log(address,bool,bool,bool)", p0, p1, p2, p3));
}
function log(address p0, bool p1, bool p2, address p3) internal pure {
_sendLogPayload(abi.encodeWithSignature("log(address,bool,bool,address)", p0, p1, p2, p3));
}
function log(address p0, bool p1, address p2, uint256 p3) internal pure {
_sendLogPayload(abi.encodeWithSignature("log(address,bool,address,uint256)", p0, p1, p2, p3));
}
function log(address p0, bool p1, address p2, string memory p3) internal pure {
_sendLogPayload(abi.encodeWithSignature("log(address,bool,address,string)", p0, p1, p2, p3));
}
function log(address p0, bool p1, address p2, bool p3) internal pure {
_sendLogPayload(abi.encodeWithSignature("log(address,bool,address,bool)", p0, p1, p2, p3));
}
function log(address p0, bool p1, address p2, address p3) internal pure {
_sendLogPayload(abi.encodeWithSignature("log(address,bool,address,address)", p0, p1, p2, p3));
}
function log(address p0, address p1, uint256 p2, uint256 p3) internal pure {
_sendLogPayload(abi.encodeWithSignature("log(address,address,uint256,uint256)", p0, p1, p2, p3));
}
function log(address p0, address p1, uint256 p2, string memory p3) internal pure {
_sendLogPayload(abi.encodeWithSignature("log(address,address,uint256,string)", p0, p1, p2, p3));
}
function log(address p0, address p1, uint256 p2, bool p3) internal pure {
_sendLogPayload(abi.encodeWithSignature("log(address,address,uint256,bool)", p0, p1, p2, p3));
}
function log(address p0, address p1, uint256 p2, address p3) internal pure {
_sendLogPayload(abi.encodeWithSignature("log(address,address,uint256,address)", p0, p1, p2, p3));
}
function log(address p0, address p1, string memory p2, uint256 p3) internal pure {
_sendLogPayload(abi.encodeWithSignature("log(address,address,string,uint256)", p0, p1, p2, p3));
}
function log(address p0, address p1, string memory p2, string memory p3) internal pure {
_sendLogPayload(abi.encodeWithSignature("log(address,address,string,string)", p0, p1, p2, p3));
}
function log(address p0, address p1, string memory p2, bool p3) internal pure {
_sendLogPayload(abi.encodeWithSignature("log(address,address,string,bool)", p0, p1, p2, p3));
}
function log(address p0, address p1, string memory p2, address p3) internal pure {
_sendLogPayload(abi.encodeWithSignature("log(address,address,string,address)", p0, p1, p2, p3));
}
function log(address p0, address p1, bool p2, uint256 p3) internal pure {
_sendLogPayload(abi.encodeWithSignature("log(address,address,bool,uint256)", p0, p1, p2, p3));
}
function log(address p0, address p1, bool p2, string memory p3) internal pure {
_sendLogPayload(abi.encodeWithSignature("log(address,address,bool,string)", p0, p1, p2, p3));
}
function log(address p0, address p1, bool p2, bool p3) internal pure {
_sendLogPayload(abi.encodeWithSignature("log(address,address,bool,bool)", p0, p1, p2, p3));
}
function log(address p0, address p1, bool p2, address p3) internal pure {
_sendLogPayload(abi.encodeWithSignature("log(address,address,bool,address)", p0, p1, p2, p3));
}
function log(address p0, address p1, address p2, uint256 p3) internal pure {
_sendLogPayload(abi.encodeWithSignature("log(address,address,address,uint256)", p0, p1, p2, p3));
}
function log(address p0, address p1, address p2, string memory p3) internal pure {
_sendLogPayload(abi.encodeWithSignature("log(address,address,address,string)", p0, p1, p2, p3));
}
function log(address p0, address p1, address p2, bool p3) internal pure {
_sendLogPayload(abi.encodeWithSignature("log(address,address,address,bool)", p0, p1, p2, p3));
}
function log(address p0, address p1, address p2, address p3) internal pure {
_sendLogPayload(abi.encodeWithSignature("log(address,address,address,address)", p0, p1, p2, p3));
}
}{
"optimizer": {
"enabled": true,
"runs": 200
},
"outputSelection": {
"*": {
"*": [
"evm.bytecode",
"evm.deployedBytecode",
"devdoc",
"userdoc",
"metadata",
"abi"
]
}
},
"libraries": {}
}Contract Security Audit
- No Contract Security Audit Submitted- Submit Audit Here
Contract ABI
API[{"inputs":[],"stateMutability":"nonpayable","type":"constructor"},{"inputs":[{"internalType":"address","name":"addr","type":"address"}],"name":"InvalidContract","type":"error"},{"inputs":[{"internalType":"address","name":"source1","type":"address"},{"internalType":"address","name":"source2","type":"address"}],"name":"SystemMismatch","type":"error"},{"inputs":[{"internalType":"string","name":"paramName","type":"string"}],"name":"ZeroAddress","type":"error"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"address","name":"newAddress","type":"address"}],"name":"AccessControllerSet","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"address","name":"previousAdmin","type":"address"},{"indexed":false,"internalType":"address","name":"newAdmin","type":"address"}],"name":"AdminChanged","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"beacon","type":"address"}],"name":"BeaconUpgraded","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"address","name":"dfxRouter","type":"address"}],"name":"DfxRouterSet","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"uint8","name":"version","type":"uint8"}],"name":"Initialized","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"address","name":"jarvisDex","type":"address"}],"name":"JarvisDexSet","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"address","name":"lockNftMinter","type":"address"}],"name":"LockNftMinterSet","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"address","name":"lockNft","type":"address"}],"name":"LockNftSet","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"address","name":"marketplace","type":"address"}],"name":"MarketplaceSet","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"address","name":"Oclr","type":"address"}],"name":"OclrSet","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"previousOwner","type":"address"},{"indexed":true,"internalType":"address","name":"newOwner","type":"address"}],"name":"OwnershipTransferStarted","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"previousOwner","type":"address"},{"indexed":true,"internalType":"address","name":"newOwner","type":"address"}],"name":"OwnershipTransferred","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"address","name":"passkeyWalletFactory","type":"address"}],"name":"PasskeyWalletFactorySet","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"address","name":"rentDistributor","type":"address"}],"name":"RentDistributorSet","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"address","name":"rentShare","type":"address"}],"name":"RentShareSet","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"address","name":"rootPriceOracle","type":"address"}],"name":"RootPriceOracleSet","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"address","name":"sbt","type":"address"}],"name":"SBTSet","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"address","name":"santionsList","type":"address"}],"name":"SanctionsListSet","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"address","name":"secondaryMarket","type":"address"}],"name":"SecondaryMarketSet","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"address","name":"security","type":"address"}],"name":"SystemSecuritySet","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"address","name":"transferManager","type":"address"}],"name":"TransferManagerSet","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"address","name":"Try","type":"address"}],"name":"TrySet","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"implementation","type":"address"}],"name":"Upgraded","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"address","name":"Usdc","type":"address"}],"name":"UsdcSet","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"address","name":"tokensWhitelist","type":"address"}],"name":"WhitelistSet","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"address","name":"xUsdc","type":"address"}],"name":"XUsdcSet","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"address","name":"xeqFeeManagerSet","type":"address"}],"name":"XeqFeeManagerSet","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"address","name":"xeq","type":"address"}],"name":"XeqSet","type":"event"},{"inputs":[],"name":"TRY","outputs":[{"internalType":"contract IERC20","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"USDC","outputs":[{"internalType":"contract IERC20","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"acceptOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"accessController","outputs":[{"internalType":"contract IAccessController","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"dfxRouter","outputs":[{"internalType":"contract IDFXRouter","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"initialize","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"jarvisDex","outputs":[{"internalType":"contract IJarvisDex","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"lockNft","outputs":[{"internalType":"contract ILockNFT","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"lockNftMinter","outputs":[{"internalType":"contract ILockNFT","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"marketplace","outputs":[{"internalType":"contract IMarketplace","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"oclr","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"owner","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"passkeyWalletFactory","outputs":[{"internalType":"contract IPasskeyFactory","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"pendingOwner","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"proxiableUUID","outputs":[{"internalType":"bytes32","name":"","type":"bytes32"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"renounceOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"rentDistributor","outputs":[{"internalType":"contract IRentDistributor","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"rentShare","outputs":[{"internalType":"contract IRentShare","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"rootPriceOracle","outputs":[{"internalType":"contract IRootPriceOracle","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"sanctionsList","outputs":[{"internalType":"contract ISanctionsList","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"sbt","outputs":[{"internalType":"contract ISBT","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"secondaryMarket","outputs":[{"internalType":"contract ISecondaryMarket","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"controller","type":"address"}],"name":"setAccessController","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"dfxRouterInstance","type":"address"}],"name":"setDfxRouter","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"jarvisDexInstance","type":"address"}],"name":"setJarvisDex","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"lockNftInstance","type":"address"}],"name":"setLockNft","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"lockNftMinterInstance","type":"address"}],"name":"setLockNftMinter","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"marketplaceInstance","type":"address"}],"name":"setMarketplace","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"oclrInstance","type":"address"}],"name":"setOclr","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"passkeyWalletFactoryInstance","type":"address"}],"name":"setPasskeyWalletFactory","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"rentDistributorInsance","type":"address"}],"name":"setRentDistributor","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"rentShareInstance","type":"address"}],"name":"setRentShare","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"rootPriceOracleInstance","type":"address"}],"name":"setRootPriceOracle","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"sbtInstance","type":"address"}],"name":"setSBT","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"sanctionsListInstance","type":"address"}],"name":"setSanctionsList","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"secondaryMarketInstance","type":"address"}],"name":"setSecondaryMarket","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"security","type":"address"}],"name":"setSystemSecurity","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"transferManagerInstance","type":"address"}],"name":"setTransferManager","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"Try","type":"address"}],"name":"setTry","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"Usdc","type":"address"}],"name":"setUsdc","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"whitelistInstance","type":"address"}],"name":"setWhiltelist","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"xUsdc","type":"address"}],"name":"setXUsdc","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"xeqToken","type":"address"}],"name":"setXeq","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"xeqFeeManagerInstance","type":"address"}],"name":"setXeqFeeManager","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"systemSecurity","outputs":[{"internalType":"contract ISystemSecurity","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"transferManager","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"newOwner","type":"address"}],"name":"transferOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"newImplementation","type":"address"}],"name":"upgradeTo","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"newImplementation","type":"address"},{"internalType":"bytes","name":"data","type":"bytes"}],"name":"upgradeToAndCall","outputs":[],"stateMutability":"payable","type":"function"},{"inputs":[],"name":"whitelist","outputs":[{"internalType":"contract IWhitelist","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"xUSDC","outputs":[{"internalType":"contract IERC20","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"xeq","outputs":[{"internalType":"contract IERC20","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"xeqFeeManager","outputs":[{"internalType":"contract IXeqFeeManager","name":"","type":"address"}],"stateMutability":"view","type":"function"}]Contract Creation Code
60a0604052306080523480156200001557600080fd5b506200002062000026565b620000e7565b600054610100900460ff1615620000935760405162461bcd60e51b815260206004820152602760248201527f496e697469616c697a61626c653a20636f6e747261637420697320696e697469604482015266616c697a696e6760c81b606482015260840160405180910390fd5b60005460ff90811614620000e5576000805460ff191660ff9081179091556040519081527f7f26b83ff96e1f2b6a682f133852f6798a09c465da95921460cefb38474024989060200160405180910390a15b565b6080516125546200011f60003960008181610adb01528181610b2401528181610cf801528181610d380152610e6701526125546000f3fe6080604052600436106103195760003560e01c806393e59dc1116101ab578063c67cb529116100f7578063ec571c6a11610095578063f3c274f71161006f578063f3c274f714610911578063f8a77e7114610930578063f9d65d3b14610950578063fe92660d1461096f57600080fd5b8063ec571c6a146108b2578063f08391d8146108d1578063f2fde38b146108f157600080fd5b8063e30c3978116100d1578063e30c397814610835578063e405702714610853578063e4d4a1ca14610872578063e60fcde81461089257600080fd5b8063c67cb529146107d6578063cb146879146107f5578063e26ad9c11461081557600080fd5b8063abc8c7af11610164578063b1c25cd31161013e578063b1c25cd31461075c578063b3564c091461077a578063bc43cbaf1461079a578063c3d0cbfb146107b857600080fd5b8063abc8c7af146106ff578063acf104de1461071d578063b1324f7b1461073d57600080fd5b806393e59dc11461064157806394540cee14610660578063994b7548146106805780639c5bfeae146106a0578063a286eda7146106bf578063a37454ef146106df57600080fd5b8063500ca67f1161026a57806373ad6c2d116102235780637bca4916116101fd5780637bca4916146105cf5780638129fc1c146105ef57806389a30271146106045780638da5cb5b1461062357600080fd5b806373ad6c2d1461057a5780637848efc51461059a57806379ba5097146105ba57600080fd5b8063500ca67f146104c457806352d1902d146104e45780635ac072d7146105075780635fcf0919146105265780636607828d14610545578063715018a61461056557600080fd5b806336bb317a116102d757806346ea2552116102b157806346ea25521461045357806349dc5e8d146104725780634cb3140d146104925780634f1ef286146104b157600080fd5b806336bb317a146103f657806344ea795314610414578063462cd3d01461043357600080fd5b8062b786481461031e5780630568d9d3146103405780630804d35c146103785780631a79c3d01461039857806334443346146103b75780633659cfe6146103d6575b600080fd5b34801561032a57600080fd5b5061033e610339366004612254565b61098f565b005b34801561034c57600080fd5b50610110546001600160a01b03165b6040516001600160a01b0390911681526020015b60405180910390f35b34801561038457600080fd5b5061033e610393366004612254565b610a29565b3480156103a457600080fd5b50610101546001600160a01b031661035b565b3480156103c357600080fd5b5061010f546001600160a01b031661035b565b3480156103e257600080fd5b5061033e6103f1366004612254565b610ad1565b34801561040257600080fd5b5060fd546001600160a01b031661035b565b34801561042057600080fd5b50610109546001600160a01b031661035b565b34801561043f57600080fd5b5061033e61044e366004612254565b610bb6565b34801561045f57600080fd5b5061010c546001600160a01b031661035b565b34801561047e57600080fd5b5061033e61048d366004612254565b610c50565b34801561049e57600080fd5b50610103546001600160a01b031661035b565b61033e6104bf366004612287565b610cee565b3480156104d057600080fd5b5061033e6104df366004612254565b610dbe565b3480156104f057600080fd5b506104f9610e5a565b60405190815260200161036f565b34801561051357600080fd5b50610106546001600160a01b031661035b565b34801561053257600080fd5b5061010b546001600160a01b031661035b565b34801561055157600080fd5b5061033e610560366004612254565b610f0d565b34801561057157600080fd5b5061033e610f9f565b34801561058657600080fd5b5061033e610595366004612254565b610fb3565b3480156105a657600080fd5b5061033e6105b5366004612254565b611050565b3480156105c657600080fd5b5061033e6110de565b3480156105db57600080fd5b5061033e6105ea366004612254565b611155565b3480156105fb57600080fd5b5061033e6111ef565b34801561061057600080fd5b50610107546001600160a01b031661035b565b34801561062f57600080fd5b506097546001600160a01b031661035b565b34801561064d57600080fd5b50610100546001600160a01b031661035b565b34801561066c57600080fd5b5061033e61067b366004612254565b61133c565b34801561068c57600080fd5b5061033e61069b366004612254565b6113d6565b3480156106ac57600080fd5b50610102546001600160a01b031661035b565b3480156106cb57600080fd5b5061033e6106da366004612254565b61146c565b3480156106eb57600080fd5b5061033e6106fa366004612254565b6114f8565b34801561070b57600080fd5b5060ff546001600160a01b031661035b565b34801561072957600080fd5b5061033e610738366004612254565b611593565b34801561074957600080fd5b5061010e546001600160a01b031661035b565b34801561076857600080fd5b5060fe546001600160a01b031661035b565b34801561078657600080fd5b5061033e610795366004612254565b611639565b3480156107a657600080fd5b5060fb546001600160a01b031661035b565b3480156107c457600080fd5b5060fc546001600160a01b031661035b565b3480156107e257600080fd5b50610104546001600160a01b031661035b565b34801561080157600080fd5b5061033e610810366004612254565b6116cc565b34801561082157600080fd5b5061033e610830366004612254565b611759565b34801561084157600080fd5b5060c9546001600160a01b031661035b565b34801561085f57600080fd5b50610108546001600160a01b031661035b565b34801561087e57600080fd5b5061033e61088d366004612254565b6117f1565b34801561089e57600080fd5b5061033e6108ad366004612254565b611899565b3480156108be57600080fd5b5061010d546001600160a01b031661035b565b3480156108dd57600080fd5b5061033e6108ec366004612254565b611939565b3480156108fd57600080fd5b5061033e61090c366004612254565b6119d3565b34801561091d57600080fd5b50610105546001600160a01b031661035b565b34801561093c57600080fd5b5061033e61094b366004612254565b611a44565b34801561095c57600080fd5b5061010a546001600160a01b031661035b565b34801561097b57600080fd5b5061033e61098a366004612254565b611ae4565b610997611b8c565b6109c5816040518060400160405280600c81526020016b6f636c72496e7374616e636560a01b815250611be6565b6040516001600160a01b03821681527f289eeafc2ab122b515b2bbe83aa5b7aaf6f4863c634b5a33f030010fc7dffbf99060200160405180910390a161010980546001600160a01b0319166001600160a01b038316179055610a2681611c0f565b50565b610a31611b8c565b610a70816040518060400160405280601781526020017f7472616e736665724d616e61676572496e7374616e6365000000000000000000815250611be6565b6040516001600160a01b03821681527f2fa4d55ccac27bdda738b800a4659bc2763f3ed0ff623ff01d6e6b27638eb6739060200160405180910390a161010c80546001600160a01b0319166001600160a01b038316179055610a2681611c0f565b6001600160a01b037f0000000000000000000000000000000000000000000000000000000000000000163003610b225760405162461bcd60e51b8152600401610b199061234b565b60405180910390fd5b7f00000000000000000000000000000000000000000000000000000000000000006001600160a01b0316610b6b6000805160206124d8833981519152546001600160a01b031690565b6001600160a01b031614610b915760405162461bcd60e51b8152600401610b1990612397565b610b9a81611d1e565b60408051600080825260208201909252610a2691839190611d26565b610bbe611b8c565b610bef816040518060400160405280600f81526020016e6c6f636b4e6674496e7374616e636560881b815250611be6565b6040516001600160a01b03821681527f331cad4407a60a4318d77a3bd593bfae26cde9a0c90d4324202dfa6b5ca9e67a9060200160405180910390a161010280546001600160a01b0319166001600160a01b038316179055610a2681611c0f565b610c58611b8c565b610c8f816040518060400160405280601581526020017473616e6374696f6e734c697374496e7374616e636560581b815250611be6565b6040516001600160a01b03821681527f523629e0a2e306908392cb2bff4fcd26e035692d91676ecd9006cf96e87b46bd9060200160405180910390a161010d80546001600160a01b0319166001600160a01b0392909216919091179055565b6001600160a01b037f0000000000000000000000000000000000000000000000000000000000000000163003610d365760405162461bcd60e51b8152600401610b199061234b565b7f00000000000000000000000000000000000000000000000000000000000000006001600160a01b0316610d7f6000805160206124d8833981519152546001600160a01b031690565b6001600160a01b031614610da55760405162461bcd60e51b8152600401610b1990612397565b610dae82611d1e565b610dba82826001611d26565b5050565b610dc6611b8c565b610df9816040518060400160405280601181526020017077686974656c697374496e7374616e636560781b815250611be6565b6040516001600160a01b03821681527f29d77446d0fb0dcebabf25ce79ea69ba1382a4525d4acf615a38c89c798aef719060200160405180910390a161010080546001600160a01b0319166001600160a01b038316179055610a2681611c0f565b6000306001600160a01b037f00000000000000000000000000000000000000000000000000000000000000001614610efa5760405162461bcd60e51b815260206004820152603860248201527f555550535570677261646561626c653a206d757374206e6f742062652063616c60448201527f6c6564207468726f7567682064656c656761746563616c6c00000000000000006064820152608401610b19565b506000805160206124d883398151915290565b610f15611b8c565b610f3f8160405180604001604052806008815260200167736563757269747960c01b815250611be6565b6040516001600160a01b03821681527f0e0889236c4ba8729ffd40ab4ff99dda07d5619cb81afbd7a8854d9877931dc69060200160405180910390a160fc80546001600160a01b0319166001600160a01b038316179055610a2681611c0f565b610fa7611b8c565b610fb16000611e91565b565b610fbb611b8c565b610ff081604051806040016040528060138152602001726d61726b6574706c616365496e7374616e636560681b815250611be6565b6040516001600160a01b03821681527f78fd71746fd8724dd16b5a93e765a076614159ebdc73d996a6a8884f358898e59060200160405180910390a160ff80546001600160a01b0319166001600160a01b038316179055610a2681611c0f565b611058611b8c565b61107f8160405180604001604052806005815260200164785573646360d81b815250611be6565b6040516001600160a01b03821681527fda9af3eeafad19b9184fc516c83ff3529419cb129f1938a2508573b749ca151a9060200160405180910390a161010880546001600160a01b0319166001600160a01b0392909216919091179055565b60c95433906001600160a01b0316811461114c5760405162461bcd60e51b815260206004820152602960248201527f4f776e61626c6532537465703a2063616c6c6572206973206e6f7420746865206044820152683732bb9037bbb732b960b91b6064820152608401610b19565b610a2681611e91565b61115d611b8c565b6111908160405180604001604052806011815260200170646678526f75746572496e7374616e636560781b815250611be6565b6040516001600160a01b03821681527f0cf1f6fc6713d1e540de5737303b759b86600e294869579e6fb9b25a9d9f10a89060200160405180910390a161010b80546001600160a01b0319166001600160a01b0392909216919091179055565b600054610100900460ff161580801561120f5750600054600160ff909116105b806112295750303b158015611229575060005460ff166001145b61128c5760405162461bcd60e51b815260206004820152602e60248201527f496e697469616c697a61626c653a20636f6e747261637420697320616c72656160448201526d191e481a5b9a5d1a585b1a5e995960921b6064820152608401610b19565b6000805460ff1916600117905580156112af576000805461ff0019166101001790555b6112e460405180604001604052806014815260200173496e736964652074686520696e697469616c7a6560601b815250611eaa565b6112ec611eed565b6112f4611f14565b8015610a26576000805461ff0019169055604051600181527f7f26b83ff96e1f2b6a682f133852f6798a09c465da95921460cefb38474024989060200160405180910390a150565b611344611b8c565b61137781604051806040016040528060118152602001706a6172766973446578496e7374616e636560781b815250611be6565b6040516001600160a01b03821681527f6dc72632bd79d801fe98cba3c68c9dc20bdc6c6d3b0a9c8f2f227fa75f23ad679060200160405180910390a161010a80546001600160a01b0319166001600160a01b0392909216919091179055565b6113de611b8c565b61140b816040518060400160405280600b81526020016a736274496e7374616e636560a81b815250611be6565b6040516001600160a01b03821681527fcc6c7fe8024c44aacbd64a60ef19ad3fee30550d8f00fbee772c0eb14c9d2cef9060200160405180910390a161010e80546001600160a01b0319166001600160a01b038316179055610a2681611c0f565b611474611b8c565b611499816040518060400160405280600381526020016254727960e81b815250611be6565b6040516001600160a01b03821681527f36b067fd8db79b6a6fa30aa83c802203e256a322d2b4cb758d6ec5257a4a93169060200160405180910390a161010680546001600160a01b0319166001600160a01b0392909216919091179055565b611500611b8c565b611533816040518060400160405280601181526020017072656e745368617265496e7374616e636560781b815250611be6565b6040516001600160a01b03821681527fc7afafe1b1743aaa8773058ac08cc87f81d04dc5dc542ca5c982331ed9ba419c9060200160405180910390a160fd80546001600160a01b0319166001600160a01b038316179055610a2681611c0f565b61159b611b8c565b6115da816040518060400160405280601781526020017f7365636f6e646172794d61726b6574496e7374616e6365000000000000000000815250611be6565b6040516001600160a01b03821681527f339587712492f7e7769576550574d54cf809aa6f60b25f27973e580843489f419060200160405180910390a161011080546001600160a01b0319166001600160a01b0392909216919091179055565b611641611b8c565b61166b81604051806040016040528060088152602001673c32b8aa37b5b2b760c11b815250611be6565b6040516001600160a01b03821681527f2712517a6091f5a13c4d9d8c0902deb6f8c84f78dafb57a3d5fab561db488bc79060200160405180910390a161010480546001600160a01b0319166001600160a01b038316179055610a2681611c0f565b6116d4611b8c565b6116fa81604051806040016040528060048152602001635573646360e01b815250611be6565b6040516001600160a01b03821681527fa86377f6e4b5bf9c06229d957a487a88f365f5188d4594ba2e322e093dc4ee769060200160405180910390a161010780546001600160a01b0319166001600160a01b0392909216919091179055565b611761611b8c565b611790816040518060400160405280600d81526020016c3637b1b5a7333a26b4b73a32b960991b815250611be6565b6040516001600160a01b03821681527f62fb36c7675803d301a1d4bebbe712378e7a3c51140337eeda61ad7815d8f5ad9060200160405180910390a161010180546001600160a01b0319166001600160a01b038316179055610a2681611c0f565b6117f9611b8c565b611838816040518060400160405280601c81526020017f706173736b657957616c6c6574466163746f7279496e7374616e636500000000815250611be6565b6040516001600160a01b03821681527ff54d16903cefbe71b191446f57ae78e522cee66102558823b842b3f78a4442bc9060200160405180910390a161010f80546001600160a01b0319166001600160a01b038316179055610a2681611c0f565b6118a1611b8c565b6118d881604051806040016040528060158152602001747865714665654d616e61676572496e7374616e636560581b815250611be6565b6040516001600160a01b03821681527f2712517a6091f5a13c4d9d8c0902deb6f8c84f78dafb57a3d5fab561db488bc79060200160405180910390a161010380546001600160a01b0319166001600160a01b038316179055610a2681611c0f565b611941611b8c565b611973816040518060400160405280601081526020016f30b1b1b2b9b9a1b7b73a3937b63632b960811b815250611be6565b6040516001600160a01b03821681527fd0761a673d8d97d3dd1e8beb78920467f6482d897a3d1a77d0749f20c653130d9060200160405180910390a160fb80546001600160a01b0319166001600160a01b038316179055610a2681611c0f565b6119db611b8c565b60c980546001600160a01b0383166001600160a01b03199091168117909155611a0c6097546001600160a01b031690565b6001600160a01b03167f38d16b8cac22d99fc7c124b9cd0de2d3fa1faef420bfe791d8c362d765e2270060405160405180910390a350565b611a4c611b8c565b611a84816040518060400160405280601681526020017572656e744469737472696275746f72496e73616e636560501b815250611be6565b6040516001600160a01b03821681527f11df7d295277b88146bb77c4f19a42fe05e0250184325658eea21bcaab2344cc9060200160405180910390a160fe80546001600160a01b0319166001600160a01b038316179055610a2681611c0f565b611aec611b8c565b611b2b816040518060400160405280601781526020017f726f6f7450726963654f7261636c65496e7374616e6365000000000000000000815250611be6565b6040516001600160a01b03821681527ffaac2a8d05b578d03e37fd3a14e5fd62cc2c41286fabe3b287154dbc628f35ec9060200160405180910390a161010580546001600160a01b0319166001600160a01b038316179055610a2681611c0f565b6097546001600160a01b03163314610fb15760405162461bcd60e51b815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e65726044820152606401610b19565b6001600160a01b038216610dba578060405163eac0d38960e01b8152600401610b199190612407565b60408051600481526024810182526020810180516001600160e01b0316633c4aebd760e21b179052905160009182916001600160a01b03851691611c529161243a565b600060405180830381855afa9150503d8060008114611c8d576040519150601f19603f3d011682016040523d82523d6000602084013e611c92565b606091505b50915091508115611cf557600081806020019051810190611cb39190612456565b90506001600160a01b0381163014611cef57604051632f6b3b6360e01b81523060048201526001600160a01b0382166024820152604401610b19565b50505050565b604051633b00592160e21b81526001600160a01b0384166004820152602401610b19565b505050565b610a26611b8c565b7f4910fdfa16fed3260ed0e7147f7cc6da11a60208b5b9406d12a635614ffd91435460ff1615611d5957611d1983611f43565b826001600160a01b03166352d1902d6040518163ffffffff1660e01b8152600401602060405180830381865afa925050508015611db3575060408051601f3d908101601f19168201909252611db091810190612473565b60015b611e165760405162461bcd60e51b815260206004820152602e60248201527f45524331393637557067726164653a206e657720696d706c656d656e7461746960448201526d6f6e206973206e6f74205555505360901b6064820152608401610b19565b6000805160206124d88339815191528114611e855760405162461bcd60e51b815260206004820152602960248201527f45524331393637557067726164653a20756e737570706f727465642070726f786044820152681a58589b195555525160ba1b6064820152608401610b19565b50611d19838383611fdf565b60c980546001600160a01b0319169055610a2681612004565b610a2681604051602401611ebe9190612407565b60408051601f198184030181529190526020810180516001600160e01b031663104c13eb60e21b179052612056565b600054610100900460ff16610fb15760405162461bcd60e51b8152600401610b199061248c565b600054610100900460ff16611f3b5760405162461bcd60e51b8152600401610b199061248c565b610fb161205f565b6001600160a01b0381163b611fb05760405162461bcd60e51b815260206004820152602d60248201527f455243313936373a206e657720696d706c656d656e746174696f6e206973206e60448201526c1bdd08184818dbdb9d1c9858dd609a1b6064820152608401610b19565b6000805160206124d883398151915280546001600160a01b0319166001600160a01b0392909216919091179055565b611fe88361208f565b600082511180611ff55750805b15611d1957611cef83836120cf565b609780546001600160a01b038381166001600160a01b0319831681179093556040519116919082907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e090600090a35050565b610a26816120fb565b600054610100900460ff166120865760405162461bcd60e51b8152600401610b199061248c565b610fb133611e91565b61209881611f43565b6040516001600160a01b038216907fbc7cd75a20ee27fd9adebab32041f755214dbc6bffa90cc0225b39da2e5c2d3b90600090a250565b60606120f483836040518060600160405280602781526020016124f86027913961211c565b9392505050565b60006a636f6e736f6c652e6c6f679050600080835160208501845afa505050565b6060600080856001600160a01b031685604051612139919061243a565b600060405180830381855af49150503d8060008114612174576040519150601f19603f3d011682016040523d82523d6000602084013e612179565b606091505b509150915061218a86838387612194565b9695505050505050565b606083156122035782516000036121fc576001600160a01b0385163b6121fc5760405162461bcd60e51b815260206004820152601d60248201527f416464726573733a2063616c6c20746f206e6f6e2d636f6e74726163740000006044820152606401610b19565b508161220d565b61220d8383612215565b949350505050565b8151156122255781518083602001fd5b8060405162461bcd60e51b8152600401610b199190612407565b6001600160a01b0381168114610a2657600080fd5b60006020828403121561226657600080fd5b81356120f48161223f565b634e487b7160e01b600052604160045260246000fd5b6000806040838503121561229a57600080fd5b82356122a58161223f565b9150602083013567ffffffffffffffff808211156122c257600080fd5b818501915085601f8301126122d657600080fd5b8135818111156122e8576122e8612271565b604051601f8201601f19908116603f0116810190838211818310171561231057612310612271565b8160405282815288602084870101111561232957600080fd5b8260208601602083013760006020848301015280955050505050509250929050565b6020808252602c908201527f46756e6374696f6e206d7573742062652063616c6c6564207468726f7567682060408201526b19195b1959d85d1958d85b1b60a21b606082015260800190565b6020808252602c908201527f46756e6374696f6e206d7573742062652063616c6c6564207468726f7567682060408201526b6163746976652070726f787960a01b606082015260800190565b60005b838110156123fe5781810151838201526020016123e6565b50506000910152565b60208152600082518060208401526124268160408501602087016123e3565b601f01601f19169190910160400192915050565b6000825161244c8184602087016123e3565b9190910192915050565b60006020828403121561246857600080fd5b81516120f48161223f565b60006020828403121561248557600080fd5b5051919050565b6020808252602b908201527f496e697469616c697a61626c653a20636f6e7472616374206973206e6f74206960408201526a6e697469616c697a696e6760a81b60608201526080019056fe360894a13ba1a3210667c828492db98dca3e2076cc3735a920a3ca505d382bbc416464726573733a206c6f772d6c6576656c2064656c65676174652063616c6c206661696c6564a26469706673582212206df546aeec7d10f8be317ef91c7692cb734c7db1cabca3e5928c6d0f35f47abc64736f6c63430008130033
Deployed Bytecode
0x6080604052600436106103195760003560e01c806393e59dc1116101ab578063c67cb529116100f7578063ec571c6a11610095578063f3c274f71161006f578063f3c274f714610911578063f8a77e7114610930578063f9d65d3b14610950578063fe92660d1461096f57600080fd5b8063ec571c6a146108b2578063f08391d8146108d1578063f2fde38b146108f157600080fd5b8063e30c3978116100d1578063e30c397814610835578063e405702714610853578063e4d4a1ca14610872578063e60fcde81461089257600080fd5b8063c67cb529146107d6578063cb146879146107f5578063e26ad9c11461081557600080fd5b8063abc8c7af11610164578063b1c25cd31161013e578063b1c25cd31461075c578063b3564c091461077a578063bc43cbaf1461079a578063c3d0cbfb146107b857600080fd5b8063abc8c7af146106ff578063acf104de1461071d578063b1324f7b1461073d57600080fd5b806393e59dc11461064157806394540cee14610660578063994b7548146106805780639c5bfeae146106a0578063a286eda7146106bf578063a37454ef146106df57600080fd5b8063500ca67f1161026a57806373ad6c2d116102235780637bca4916116101fd5780637bca4916146105cf5780638129fc1c146105ef57806389a30271146106045780638da5cb5b1461062357600080fd5b806373ad6c2d1461057a5780637848efc51461059a57806379ba5097146105ba57600080fd5b8063500ca67f146104c457806352d1902d146104e45780635ac072d7146105075780635fcf0919146105265780636607828d14610545578063715018a61461056557600080fd5b806336bb317a116102d757806346ea2552116102b157806346ea25521461045357806349dc5e8d146104725780634cb3140d146104925780634f1ef286146104b157600080fd5b806336bb317a146103f657806344ea795314610414578063462cd3d01461043357600080fd5b8062b786481461031e5780630568d9d3146103405780630804d35c146103785780631a79c3d01461039857806334443346146103b75780633659cfe6146103d6575b600080fd5b34801561032a57600080fd5b5061033e610339366004612254565b61098f565b005b34801561034c57600080fd5b50610110546001600160a01b03165b6040516001600160a01b0390911681526020015b60405180910390f35b34801561038457600080fd5b5061033e610393366004612254565b610a29565b3480156103a457600080fd5b50610101546001600160a01b031661035b565b3480156103c357600080fd5b5061010f546001600160a01b031661035b565b3480156103e257600080fd5b5061033e6103f1366004612254565b610ad1565b34801561040257600080fd5b5060fd546001600160a01b031661035b565b34801561042057600080fd5b50610109546001600160a01b031661035b565b34801561043f57600080fd5b5061033e61044e366004612254565b610bb6565b34801561045f57600080fd5b5061010c546001600160a01b031661035b565b34801561047e57600080fd5b5061033e61048d366004612254565b610c50565b34801561049e57600080fd5b50610103546001600160a01b031661035b565b61033e6104bf366004612287565b610cee565b3480156104d057600080fd5b5061033e6104df366004612254565b610dbe565b3480156104f057600080fd5b506104f9610e5a565b60405190815260200161036f565b34801561051357600080fd5b50610106546001600160a01b031661035b565b34801561053257600080fd5b5061010b546001600160a01b031661035b565b34801561055157600080fd5b5061033e610560366004612254565b610f0d565b34801561057157600080fd5b5061033e610f9f565b34801561058657600080fd5b5061033e610595366004612254565b610fb3565b3480156105a657600080fd5b5061033e6105b5366004612254565b611050565b3480156105c657600080fd5b5061033e6110de565b3480156105db57600080fd5b5061033e6105ea366004612254565b611155565b3480156105fb57600080fd5b5061033e6111ef565b34801561061057600080fd5b50610107546001600160a01b031661035b565b34801561062f57600080fd5b506097546001600160a01b031661035b565b34801561064d57600080fd5b50610100546001600160a01b031661035b565b34801561066c57600080fd5b5061033e61067b366004612254565b61133c565b34801561068c57600080fd5b5061033e61069b366004612254565b6113d6565b3480156106ac57600080fd5b50610102546001600160a01b031661035b565b3480156106cb57600080fd5b5061033e6106da366004612254565b61146c565b3480156106eb57600080fd5b5061033e6106fa366004612254565b6114f8565b34801561070b57600080fd5b5060ff546001600160a01b031661035b565b34801561072957600080fd5b5061033e610738366004612254565b611593565b34801561074957600080fd5b5061010e546001600160a01b031661035b565b34801561076857600080fd5b5060fe546001600160a01b031661035b565b34801561078657600080fd5b5061033e610795366004612254565b611639565b3480156107a657600080fd5b5060fb546001600160a01b031661035b565b3480156107c457600080fd5b5060fc546001600160a01b031661035b565b3480156107e257600080fd5b50610104546001600160a01b031661035b565b34801561080157600080fd5b5061033e610810366004612254565b6116cc565b34801561082157600080fd5b5061033e610830366004612254565b611759565b34801561084157600080fd5b5060c9546001600160a01b031661035b565b34801561085f57600080fd5b50610108546001600160a01b031661035b565b34801561087e57600080fd5b5061033e61088d366004612254565b6117f1565b34801561089e57600080fd5b5061033e6108ad366004612254565b611899565b3480156108be57600080fd5b5061010d546001600160a01b031661035b565b3480156108dd57600080fd5b5061033e6108ec366004612254565b611939565b3480156108fd57600080fd5b5061033e61090c366004612254565b6119d3565b34801561091d57600080fd5b50610105546001600160a01b031661035b565b34801561093c57600080fd5b5061033e61094b366004612254565b611a44565b34801561095c57600080fd5b5061010a546001600160a01b031661035b565b34801561097b57600080fd5b5061033e61098a366004612254565b611ae4565b610997611b8c565b6109c5816040518060400160405280600c81526020016b6f636c72496e7374616e636560a01b815250611be6565b6040516001600160a01b03821681527f289eeafc2ab122b515b2bbe83aa5b7aaf6f4863c634b5a33f030010fc7dffbf99060200160405180910390a161010980546001600160a01b0319166001600160a01b038316179055610a2681611c0f565b50565b610a31611b8c565b610a70816040518060400160405280601781526020017f7472616e736665724d616e61676572496e7374616e6365000000000000000000815250611be6565b6040516001600160a01b03821681527f2fa4d55ccac27bdda738b800a4659bc2763f3ed0ff623ff01d6e6b27638eb6739060200160405180910390a161010c80546001600160a01b0319166001600160a01b038316179055610a2681611c0f565b6001600160a01b037f00000000000000000000000092cbfd2a016e26f3f7415038e2bd5504335590f6163003610b225760405162461bcd60e51b8152600401610b199061234b565b60405180910390fd5b7f00000000000000000000000092cbfd2a016e26f3f7415038e2bd5504335590f66001600160a01b0316610b6b6000805160206124d8833981519152546001600160a01b031690565b6001600160a01b031614610b915760405162461bcd60e51b8152600401610b1990612397565b610b9a81611d1e565b60408051600080825260208201909252610a2691839190611d26565b610bbe611b8c565b610bef816040518060400160405280600f81526020016e6c6f636b4e6674496e7374616e636560881b815250611be6565b6040516001600160a01b03821681527f331cad4407a60a4318d77a3bd593bfae26cde9a0c90d4324202dfa6b5ca9e67a9060200160405180910390a161010280546001600160a01b0319166001600160a01b038316179055610a2681611c0f565b610c58611b8c565b610c8f816040518060400160405280601581526020017473616e6374696f6e734c697374496e7374616e636560581b815250611be6565b6040516001600160a01b03821681527f523629e0a2e306908392cb2bff4fcd26e035692d91676ecd9006cf96e87b46bd9060200160405180910390a161010d80546001600160a01b0319166001600160a01b0392909216919091179055565b6001600160a01b037f00000000000000000000000092cbfd2a016e26f3f7415038e2bd5504335590f6163003610d365760405162461bcd60e51b8152600401610b199061234b565b7f00000000000000000000000092cbfd2a016e26f3f7415038e2bd5504335590f66001600160a01b0316610d7f6000805160206124d8833981519152546001600160a01b031690565b6001600160a01b031614610da55760405162461bcd60e51b8152600401610b1990612397565b610dae82611d1e565b610dba82826001611d26565b5050565b610dc6611b8c565b610df9816040518060400160405280601181526020017077686974656c697374496e7374616e636560781b815250611be6565b6040516001600160a01b03821681527f29d77446d0fb0dcebabf25ce79ea69ba1382a4525d4acf615a38c89c798aef719060200160405180910390a161010080546001600160a01b0319166001600160a01b038316179055610a2681611c0f565b6000306001600160a01b037f00000000000000000000000092cbfd2a016e26f3f7415038e2bd5504335590f61614610efa5760405162461bcd60e51b815260206004820152603860248201527f555550535570677261646561626c653a206d757374206e6f742062652063616c60448201527f6c6564207468726f7567682064656c656761746563616c6c00000000000000006064820152608401610b19565b506000805160206124d883398151915290565b610f15611b8c565b610f3f8160405180604001604052806008815260200167736563757269747960c01b815250611be6565b6040516001600160a01b03821681527f0e0889236c4ba8729ffd40ab4ff99dda07d5619cb81afbd7a8854d9877931dc69060200160405180910390a160fc80546001600160a01b0319166001600160a01b038316179055610a2681611c0f565b610fa7611b8c565b610fb16000611e91565b565b610fbb611b8c565b610ff081604051806040016040528060138152602001726d61726b6574706c616365496e7374616e636560681b815250611be6565b6040516001600160a01b03821681527f78fd71746fd8724dd16b5a93e765a076614159ebdc73d996a6a8884f358898e59060200160405180910390a160ff80546001600160a01b0319166001600160a01b038316179055610a2681611c0f565b611058611b8c565b61107f8160405180604001604052806005815260200164785573646360d81b815250611be6565b6040516001600160a01b03821681527fda9af3eeafad19b9184fc516c83ff3529419cb129f1938a2508573b749ca151a9060200160405180910390a161010880546001600160a01b0319166001600160a01b0392909216919091179055565b60c95433906001600160a01b0316811461114c5760405162461bcd60e51b815260206004820152602960248201527f4f776e61626c6532537465703a2063616c6c6572206973206e6f7420746865206044820152683732bb9037bbb732b960b91b6064820152608401610b19565b610a2681611e91565b61115d611b8c565b6111908160405180604001604052806011815260200170646678526f75746572496e7374616e636560781b815250611be6565b6040516001600160a01b03821681527f0cf1f6fc6713d1e540de5737303b759b86600e294869579e6fb9b25a9d9f10a89060200160405180910390a161010b80546001600160a01b0319166001600160a01b0392909216919091179055565b600054610100900460ff161580801561120f5750600054600160ff909116105b806112295750303b158015611229575060005460ff166001145b61128c5760405162461bcd60e51b815260206004820152602e60248201527f496e697469616c697a61626c653a20636f6e747261637420697320616c72656160448201526d191e481a5b9a5d1a585b1a5e995960921b6064820152608401610b19565b6000805460ff1916600117905580156112af576000805461ff0019166101001790555b6112e460405180604001604052806014815260200173496e736964652074686520696e697469616c7a6560601b815250611eaa565b6112ec611eed565b6112f4611f14565b8015610a26576000805461ff0019169055604051600181527f7f26b83ff96e1f2b6a682f133852f6798a09c465da95921460cefb38474024989060200160405180910390a150565b611344611b8c565b61137781604051806040016040528060118152602001706a6172766973446578496e7374616e636560781b815250611be6565b6040516001600160a01b03821681527f6dc72632bd79d801fe98cba3c68c9dc20bdc6c6d3b0a9c8f2f227fa75f23ad679060200160405180910390a161010a80546001600160a01b0319166001600160a01b0392909216919091179055565b6113de611b8c565b61140b816040518060400160405280600b81526020016a736274496e7374616e636560a81b815250611be6565b6040516001600160a01b03821681527fcc6c7fe8024c44aacbd64a60ef19ad3fee30550d8f00fbee772c0eb14c9d2cef9060200160405180910390a161010e80546001600160a01b0319166001600160a01b038316179055610a2681611c0f565b611474611b8c565b611499816040518060400160405280600381526020016254727960e81b815250611be6565b6040516001600160a01b03821681527f36b067fd8db79b6a6fa30aa83c802203e256a322d2b4cb758d6ec5257a4a93169060200160405180910390a161010680546001600160a01b0319166001600160a01b0392909216919091179055565b611500611b8c565b611533816040518060400160405280601181526020017072656e745368617265496e7374616e636560781b815250611be6565b6040516001600160a01b03821681527fc7afafe1b1743aaa8773058ac08cc87f81d04dc5dc542ca5c982331ed9ba419c9060200160405180910390a160fd80546001600160a01b0319166001600160a01b038316179055610a2681611c0f565b61159b611b8c565b6115da816040518060400160405280601781526020017f7365636f6e646172794d61726b6574496e7374616e6365000000000000000000815250611be6565b6040516001600160a01b03821681527f339587712492f7e7769576550574d54cf809aa6f60b25f27973e580843489f419060200160405180910390a161011080546001600160a01b0319166001600160a01b0392909216919091179055565b611641611b8c565b61166b81604051806040016040528060088152602001673c32b8aa37b5b2b760c11b815250611be6565b6040516001600160a01b03821681527f2712517a6091f5a13c4d9d8c0902deb6f8c84f78dafb57a3d5fab561db488bc79060200160405180910390a161010480546001600160a01b0319166001600160a01b038316179055610a2681611c0f565b6116d4611b8c565b6116fa81604051806040016040528060048152602001635573646360e01b815250611be6565b6040516001600160a01b03821681527fa86377f6e4b5bf9c06229d957a487a88f365f5188d4594ba2e322e093dc4ee769060200160405180910390a161010780546001600160a01b0319166001600160a01b0392909216919091179055565b611761611b8c565b611790816040518060400160405280600d81526020016c3637b1b5a7333a26b4b73a32b960991b815250611be6565b6040516001600160a01b03821681527f62fb36c7675803d301a1d4bebbe712378e7a3c51140337eeda61ad7815d8f5ad9060200160405180910390a161010180546001600160a01b0319166001600160a01b038316179055610a2681611c0f565b6117f9611b8c565b611838816040518060400160405280601c81526020017f706173736b657957616c6c6574466163746f7279496e7374616e636500000000815250611be6565b6040516001600160a01b03821681527ff54d16903cefbe71b191446f57ae78e522cee66102558823b842b3f78a4442bc9060200160405180910390a161010f80546001600160a01b0319166001600160a01b038316179055610a2681611c0f565b6118a1611b8c565b6118d881604051806040016040528060158152602001747865714665654d616e61676572496e7374616e636560581b815250611be6565b6040516001600160a01b03821681527f2712517a6091f5a13c4d9d8c0902deb6f8c84f78dafb57a3d5fab561db488bc79060200160405180910390a161010380546001600160a01b0319166001600160a01b038316179055610a2681611c0f565b611941611b8c565b611973816040518060400160405280601081526020016f30b1b1b2b9b9a1b7b73a3937b63632b960811b815250611be6565b6040516001600160a01b03821681527fd0761a673d8d97d3dd1e8beb78920467f6482d897a3d1a77d0749f20c653130d9060200160405180910390a160fb80546001600160a01b0319166001600160a01b038316179055610a2681611c0f565b6119db611b8c565b60c980546001600160a01b0383166001600160a01b03199091168117909155611a0c6097546001600160a01b031690565b6001600160a01b03167f38d16b8cac22d99fc7c124b9cd0de2d3fa1faef420bfe791d8c362d765e2270060405160405180910390a350565b611a4c611b8c565b611a84816040518060400160405280601681526020017572656e744469737472696275746f72496e73616e636560501b815250611be6565b6040516001600160a01b03821681527f11df7d295277b88146bb77c4f19a42fe05e0250184325658eea21bcaab2344cc9060200160405180910390a160fe80546001600160a01b0319166001600160a01b038316179055610a2681611c0f565b611aec611b8c565b611b2b816040518060400160405280601781526020017f726f6f7450726963654f7261636c65496e7374616e6365000000000000000000815250611be6565b6040516001600160a01b03821681527ffaac2a8d05b578d03e37fd3a14e5fd62cc2c41286fabe3b287154dbc628f35ec9060200160405180910390a161010580546001600160a01b0319166001600160a01b038316179055610a2681611c0f565b6097546001600160a01b03163314610fb15760405162461bcd60e51b815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e65726044820152606401610b19565b6001600160a01b038216610dba578060405163eac0d38960e01b8152600401610b199190612407565b60408051600481526024810182526020810180516001600160e01b0316633c4aebd760e21b179052905160009182916001600160a01b03851691611c529161243a565b600060405180830381855afa9150503d8060008114611c8d576040519150601f19603f3d011682016040523d82523d6000602084013e611c92565b606091505b50915091508115611cf557600081806020019051810190611cb39190612456565b90506001600160a01b0381163014611cef57604051632f6b3b6360e01b81523060048201526001600160a01b0382166024820152604401610b19565b50505050565b604051633b00592160e21b81526001600160a01b0384166004820152602401610b19565b505050565b610a26611b8c565b7f4910fdfa16fed3260ed0e7147f7cc6da11a60208b5b9406d12a635614ffd91435460ff1615611d5957611d1983611f43565b826001600160a01b03166352d1902d6040518163ffffffff1660e01b8152600401602060405180830381865afa925050508015611db3575060408051601f3d908101601f19168201909252611db091810190612473565b60015b611e165760405162461bcd60e51b815260206004820152602e60248201527f45524331393637557067726164653a206e657720696d706c656d656e7461746960448201526d6f6e206973206e6f74205555505360901b6064820152608401610b19565b6000805160206124d88339815191528114611e855760405162461bcd60e51b815260206004820152602960248201527f45524331393637557067726164653a20756e737570706f727465642070726f786044820152681a58589b195555525160ba1b6064820152608401610b19565b50611d19838383611fdf565b60c980546001600160a01b0319169055610a2681612004565b610a2681604051602401611ebe9190612407565b60408051601f198184030181529190526020810180516001600160e01b031663104c13eb60e21b179052612056565b600054610100900460ff16610fb15760405162461bcd60e51b8152600401610b199061248c565b600054610100900460ff16611f3b5760405162461bcd60e51b8152600401610b199061248c565b610fb161205f565b6001600160a01b0381163b611fb05760405162461bcd60e51b815260206004820152602d60248201527f455243313936373a206e657720696d706c656d656e746174696f6e206973206e60448201526c1bdd08184818dbdb9d1c9858dd609a1b6064820152608401610b19565b6000805160206124d883398151915280546001600160a01b0319166001600160a01b0392909216919091179055565b611fe88361208f565b600082511180611ff55750805b15611d1957611cef83836120cf565b609780546001600160a01b038381166001600160a01b0319831681179093556040519116919082907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e090600090a35050565b610a26816120fb565b600054610100900460ff166120865760405162461bcd60e51b8152600401610b199061248c565b610fb133611e91565b61209881611f43565b6040516001600160a01b038216907fbc7cd75a20ee27fd9adebab32041f755214dbc6bffa90cc0225b39da2e5c2d3b90600090a250565b60606120f483836040518060600160405280602781526020016124f86027913961211c565b9392505050565b60006a636f6e736f6c652e6c6f679050600080835160208501845afa505050565b6060600080856001600160a01b031685604051612139919061243a565b600060405180830381855af49150503d8060008114612174576040519150601f19603f3d011682016040523d82523d6000602084013e612179565b606091505b509150915061218a86838387612194565b9695505050505050565b606083156122035782516000036121fc576001600160a01b0385163b6121fc5760405162461bcd60e51b815260206004820152601d60248201527f416464726573733a2063616c6c20746f206e6f6e2d636f6e74726163740000006044820152606401610b19565b508161220d565b61220d8383612215565b949350505050565b8151156122255781518083602001fd5b8060405162461bcd60e51b8152600401610b199190612407565b6001600160a01b0381168114610a2657600080fd5b60006020828403121561226657600080fd5b81356120f48161223f565b634e487b7160e01b600052604160045260246000fd5b6000806040838503121561229a57600080fd5b82356122a58161223f565b9150602083013567ffffffffffffffff808211156122c257600080fd5b818501915085601f8301126122d657600080fd5b8135818111156122e8576122e8612271565b604051601f8201601f19908116603f0116810190838211818310171561231057612310612271565b8160405282815288602084870101111561232957600080fd5b8260208601602083013760006020848301015280955050505050509250929050565b6020808252602c908201527f46756e6374696f6e206d7573742062652063616c6c6564207468726f7567682060408201526b19195b1959d85d1958d85b1b60a21b606082015260800190565b6020808252602c908201527f46756e6374696f6e206d7573742062652063616c6c6564207468726f7567682060408201526b6163746976652070726f787960a01b606082015260800190565b60005b838110156123fe5781810151838201526020016123e6565b50506000910152565b60208152600082518060208401526124268160408501602087016123e3565b601f01601f19169190910160400192915050565b6000825161244c8184602087016123e3565b9190910192915050565b60006020828403121561246857600080fd5b81516120f48161223f565b60006020828403121561248557600080fd5b5051919050565b6020808252602b908201527f496e697469616c697a61626c653a20636f6e7472616374206973206e6f74206960408201526a6e697469616c697a696e6760a81b60608201526080019056fe360894a13ba1a3210667c828492db98dca3e2076cc3735a920a3ca505d382bbc416464726573733a206c6f772d6c6576656c2064656c65676174652063616c6c206661696c6564a26469706673582212206df546aeec7d10f8be317ef91c7692cb734c7db1cabca3e5928c6d0f35f47abc64736f6c63430008130033
Loading...
Loading
Loading...
Loading
Multichain Portfolio | 34 Chains
| Chain | Token | Portfolio % | Price | Amount | Value |
|---|
Loading...
Loading
Loading...
Loading
Loading...
Loading
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.