Source Code
Overview
ETH Balance
0 ETH
More Info
ContractCreator
Multichain Info
N/A
Latest 12 from a total of 12 transactions
Transaction Hash |
Method
|
Block
|
From
|
To
|
|||||
---|---|---|---|---|---|---|---|---|---|
Create Presale | 7116043 | 86 days ago | IN | 0 ETH | 0.23826467 | ||||
Create Presale | 7115168 | 86 days ago | IN | 0 ETH | 0.20430881 | ||||
Create Presale | 7115025 | 86 days ago | IN | 0 ETH | 0.23956115 | ||||
Create Presale | 7114734 | 86 days ago | IN | 0 ETH | 0.02758024 | ||||
Create Presale | 7108917 | 87 days ago | IN | 0 ETH | 0.03017227 | ||||
Create Presale | 7107883 | 87 days ago | IN | 0 ETH | 0.0104881 | ||||
Create Presale | 7107558 | 87 days ago | IN | 0 ETH | 0.00788323 | ||||
Create Presale | 7103086 | 88 days ago | IN | 0 ETH | 0.02966455 | ||||
Create Presale | 7067343 | 93 days ago | IN | 0 ETH | 0.02089271 | ||||
Create Presale | 7067220 | 93 days ago | IN | 0 ETH | 0.00736127 | ||||
Create Presale | 7066938 | 93 days ago | IN | 0 ETH | 0.0033385 | ||||
Create Presale | 7060366 | 94 days ago | IN | 0 ETH | 0.00537097 |
Latest 12 internal transactions
Advanced mode:
Parent Transaction Hash | Block |
From
|
To
|
|||
---|---|---|---|---|---|---|
7116043 | 86 days ago | Contract Creation | 0 ETH | |||
7115168 | 86 days ago | Contract Creation | 0 ETH | |||
7115025 | 86 days ago | Contract Creation | 0 ETH | |||
7114734 | 86 days ago | Contract Creation | 0 ETH | |||
7108917 | 87 days ago | Contract Creation | 0 ETH | |||
7107883 | 87 days ago | Contract Creation | 0 ETH | |||
7107558 | 87 days ago | Contract Creation | 0 ETH | |||
7103086 | 88 days ago | Contract Creation | 0 ETH | |||
7067343 | 93 days ago | Contract Creation | 0 ETH | |||
7067220 | 93 days ago | Contract Creation | 0 ETH | |||
7066938 | 93 days ago | Contract Creation | 0 ETH | |||
7060366 | 94 days ago | Contract Creation | 0 ETH |
Loading...
Loading
Contract Source Code Verified (Exact Match)
Contract Name:
PresaleFactory
Compiler Version
v0.8.25+commit.b61c2a91
Optimization Enabled:
Yes with 1000000 runs
Other Settings:
paris EvmVersion
Contract Source Code (Solidity Standard Json-Input format)
// SPDX-License-Identifier:MIT pragma solidity 0.8.25; import { SafeERC20 } from "@openzeppelin/contracts/token/ERC20/utils/SafeERC20.sol"; import { ILockup } from "./interfaces/ILockup.sol"; import { IERC20 } from "@openzeppelin/contracts/token/ERC20/IERC20.sol"; import { ADMIN_ROLE, PriceFeedData, ZeroAddress, FIVE_PERCENT_PPM, PPM, InvalidPercentage } from "./utils/Common.sol"; /// @member fundsWalletAddress The address of the funds wallet /// @member platformWalletAddress The address of the platform wallet /// @member signerAddress The address of the signer wallet /// @member lockupContractAddress The address of lockup contract /// @member uniswapV2Router02Contract The address of uniswap router /// @member lockLiquidityContract The address of contract where liquidty will be locked /// @member owner The address of owner wallet /// @member lastRound The price of token from price feed /// @member startTimes The array of rounds start time /// @member endTimes The array of rounds end time /// @member prices The array of rounds prices /// @member allowedTokens The allowed tokens in each round /// @member tokensToAddPriceFeed The array of tokens with pricefeed /// @member customPrices The custom price of each allowed token in each round /// @member accesses The access of each allowed token in each round /// @member rounds The number of rounds in presale /// @member referralCommissionPPMinit The percentage of leader commissions /// @member hardCapAmount The maximum amount of funding to raise in dollars /// @member minBuyAmount The miniumum amount, a user can buy in presale /// @member maxBuyAmount The maximum amount, a user can buy in presale /// @member presaleTokenContractAddress The address of presale token address /// @member liquidityPercentInit The percentage of liquidty, user want to add /// @member tokensToSell The number of presale tokens available for selling /// @member liquidityTokens The number of presale tokens for liquidity /// @member priceFeeds The token price feed struct Data { address fundsWalletAddress; address platformWalletAddress; address signerAddress; address lockupContractAddress; address uniswapV2Router02Contract; address lockLiquidityContract; address owner; uint32 lastRound; uint256[] startTimes; uint256[] endTimes; uint256[] prices; IERC20[][] allowedTokens; IERC20[] tokensToAddPriceFeed; uint256[][] customPrices; bool[][] accesses; uint32[] rounds; uint256 referralCommissionPPMinit; uint256 hardCapAmount; uint256 minBuyAmount; uint256 maxBuyAmount; IERC20 presaleTokenContractAddress; uint256 liquidityPercentInit; uint256 tokensToSell; uint256 liquidityTokens; PriceFeedData[] priceFeeds; } /// @title PresaleFactory contract /// @notice Creates new claims and presale contracts contract PresaleFactory { using SafeERC20 for IERC20; /// @notice The index where last presale and claims were created uint256 public index; /// @notice Gives presale contract address for the given index mapping(uint256 index => address presale) public sales; /// @dev Emitted when sale is created event SaleCreated(address owner, uint256 index, address indexed presale); /// @notice Thrown when byte code is zero error ZeroLengthByteCode(); /// @dev Constructor constructor() {} /// @notice Deploys a new Presale contract /// @param saleBytecode The byte code of presale /// @param salt The random hexa decimal number /// @param data The struct of data needed for presale /// @param tokenWalletAddress The struct of data needed for presale function createPresale( bytes memory saleBytecode, bytes32 salt, Data memory data, address tokenWalletAddress ) external returns (address presaleContract) { if (saleBytecode.length == 0) { revert ZeroLengthByteCode(); } if (tokenWalletAddress == address(0)) { revert ZeroAddress(); } bytes memory constructorArgs = abi.encode(data); bytes memory saleBytecodeWithArgs = abi.encodePacked(saleBytecode, constructorArgs); assembly { presaleContract := create2(0, add(saleBytecodeWithArgs, 0x20), mload(saleBytecodeWithArgs), salt) } if (presaleContract == address(0)) { revert ZeroAddress(); } uint256 tokensAmount = (data.tokensToSell * FIVE_PERCENT_PPM) / PPM; IERC20(data.presaleTokenContractAddress).safeTransferFrom( tokenWalletAddress, presaleContract, data.tokensToSell + data.liquidityTokens + tokensAmount ); index++; sales[index] = presaleContract; emit SaleCreated({ owner: data.owner, index: index, presale: presaleContract }); } }
// SPDX-License-Identifier: MIT pragma solidity ^0.8.0; interface AggregatorV3Interface { function decimals() external view returns (uint8); function description() external view returns (string memory); function version() external view returns (uint256); function getRoundData( uint80 _roundId ) external view returns (uint80 roundId, int256 answer, uint256 startedAt, uint256 updatedAt, uint80 answeredInRound); function latestRoundData() external view returns (uint80 roundId, int256 answer, uint256 startedAt, uint256 updatedAt, uint80 answeredInRound); }
// SPDX-License-Identifier: MIT // OpenZeppelin Contracts (last updated v5.0.0) (token/ERC20/extensions/IERC20Permit.sol) pragma solidity ^0.8.20; /** * @dev Interface of the ERC20 Permit extension allowing approvals to be made via signatures, as defined in * https://eips.ethereum.org/EIPS/eip-2612[EIP-2612]. * * Adds the {permit} method, which can be used to change an account's ERC20 allowance (see {IERC20-allowance}) by * presenting a message signed by the account. By not relying on {IERC20-approve}, the token holder account doesn't * need to send a transaction, and thus is not required to hold Ether at all. * * ==== Security Considerations * * There are two important considerations concerning the use of `permit`. The first is that a valid permit signature * expresses an allowance, and it should not be assumed to convey additional meaning. In particular, it should not be * considered as an intention to spend the allowance in any specific way. The second is that because permits have * built-in replay protection and can be submitted by anyone, they can be frontrun. A protocol that uses permits should * take this into consideration and allow a `permit` call to fail. Combining these two aspects, a pattern that may be * generally recommended is: * * ```solidity * function doThingWithPermit(..., uint256 value, uint256 deadline, uint8 v, bytes32 r, bytes32 s) public { * try token.permit(msg.sender, address(this), value, deadline, v, r, s) {} catch {} * doThing(..., value); * } * * function doThing(..., uint256 value) public { * token.safeTransferFrom(msg.sender, address(this), value); * ... * } * ``` * * Observe that: 1) `msg.sender` is used as the owner, leaving no ambiguity as to the signer intent, and 2) the use of * `try/catch` allows the permit to fail and makes the code tolerant to frontrunning. (See also * {SafeERC20-safeTransferFrom}). * * Additionally, note that smart contract wallets (such as Argent or Safe) are not able to produce permit signatures, so * contracts should have entry points that don't rely on permit. */ interface IERC20Permit { /** * @dev Sets `value` as the allowance of `spender` over ``owner``'s tokens, * given ``owner``'s signed approval. * * IMPORTANT: The same issues {IERC20-approve} has related to transaction * ordering also apply here. * * Emits an {Approval} event. * * Requirements: * * - `spender` cannot be the zero address. * - `deadline` must be a timestamp in the future. * - `v`, `r` and `s` must be a valid `secp256k1` signature from `owner` * over the EIP712-formatted function arguments. * - the signature must use ``owner``'s current nonce (see {nonces}). * * For more information on the signature format, see the * https://eips.ethereum.org/EIPS/eip-2612#specification[relevant EIP * section]. * * CAUTION: See Security Considerations above. */ function permit( address owner, address spender, uint256 value, uint256 deadline, uint8 v, bytes32 r, bytes32 s ) external; /** * @dev Returns the current nonce for `owner`. This value must be * included whenever a signature is generated for {permit}. * * Every successful call to {permit} increases ``owner``'s nonce by one. This * prevents a signature from being used multiple times. */ function nonces(address owner) external view returns (uint256); /** * @dev Returns the domain separator used in the encoding of the signature for {permit}, as defined by {EIP712}. */ // solhint-disable-next-line func-name-mixedcase function DOMAIN_SEPARATOR() external view returns (bytes32); }
// SPDX-License-Identifier: MIT // OpenZeppelin Contracts (last updated v5.0.0) (token/ERC20/IERC20.sol) pragma solidity ^0.8.20; /** * @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 value of tokens in existence. */ function totalSupply() external view returns (uint256); /** * @dev Returns the value of tokens owned by `account`. */ function balanceOf(address account) external view returns (uint256); /** * @dev Moves a `value` amount of 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 value) 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 a `value` amount of tokens 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 value) external returns (bool); /** * @dev Moves a `value` amount of tokens from `from` to `to` using the * allowance mechanism. `value` 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 value) external returns (bool); }
// SPDX-License-Identifier: MIT // OpenZeppelin Contracts (last updated v5.0.0) (token/ERC20/utils/SafeERC20.sol) pragma solidity ^0.8.20; import {IERC20} from "../IERC20.sol"; import {IERC20Permit} from "../extensions/IERC20Permit.sol"; import {Address} from "../../../utils/Address.sol"; /** * @title SafeERC20 * @dev Wrappers around ERC20 operations that throw on failure (when the token * contract returns false). Tokens that return no value (and instead revert or * throw on failure) are also supported, non-reverting calls are assumed to be * successful. * To use this library you can add a `using SafeERC20 for IERC20;` statement to your contract, * which allows you to call the safe operations as `token.safeTransfer(...)`, etc. */ library SafeERC20 { using Address for address; /** * @dev An operation with an ERC20 token failed. */ error SafeERC20FailedOperation(address token); /** * @dev Indicates a failed `decreaseAllowance` request. */ error SafeERC20FailedDecreaseAllowance(address spender, uint256 currentAllowance, uint256 requestedDecrease); /** * @dev Transfer `value` amount of `token` from the calling contract to `to`. If `token` returns no value, * non-reverting calls are assumed to be successful. */ function safeTransfer(IERC20 token, address to, uint256 value) internal { _callOptionalReturn(token, abi.encodeCall(token.transfer, (to, value))); } /** * @dev Transfer `value` amount of `token` from `from` to `to`, spending the approval given by `from` to the * calling contract. If `token` returns no value, non-reverting calls are assumed to be successful. */ function safeTransferFrom(IERC20 token, address from, address to, uint256 value) internal { _callOptionalReturn(token, abi.encodeCall(token.transferFrom, (from, to, value))); } /** * @dev Increase the calling contract's allowance toward `spender` by `value`. If `token` returns no value, * non-reverting calls are assumed to be successful. */ function safeIncreaseAllowance(IERC20 token, address spender, uint256 value) internal { uint256 oldAllowance = token.allowance(address(this), spender); forceApprove(token, spender, oldAllowance + value); } /** * @dev Decrease the calling contract's allowance toward `spender` by `requestedDecrease`. If `token` returns no * value, non-reverting calls are assumed to be successful. */ function safeDecreaseAllowance(IERC20 token, address spender, uint256 requestedDecrease) internal { unchecked { uint256 currentAllowance = token.allowance(address(this), spender); if (currentAllowance < requestedDecrease) { revert SafeERC20FailedDecreaseAllowance(spender, currentAllowance, requestedDecrease); } forceApprove(token, spender, currentAllowance - requestedDecrease); } } /** * @dev Set the calling contract's allowance toward `spender` to `value`. If `token` returns no value, * non-reverting calls are assumed to be successful. Meant to be used with tokens that require the approval * to be set to zero before setting it to a non-zero value, such as USDT. */ function forceApprove(IERC20 token, address spender, uint256 value) internal { bytes memory approvalCall = abi.encodeCall(token.approve, (spender, value)); if (!_callOptionalReturnBool(token, approvalCall)) { _callOptionalReturn(token, abi.encodeCall(token.approve, (spender, 0))); _callOptionalReturn(token, approvalCall); } } /** * @dev Imitates a Solidity high-level call (i.e. a regular function call to a contract), relaxing the requirement * on the return value: the return value is optional (but if data is returned, it must not be false). * @param token The token targeted by the call. * @param data The call data (encoded using abi.encode or one of its variants). */ function _callOptionalReturn(IERC20 token, bytes memory data) private { // We need to perform a low level call here, to bypass Solidity's return data size checking mechanism, since // we're implementing it ourselves. We use {Address-functionCall} to perform this call, which verifies that // the target address contains contract code and also asserts for success in the low-level call. bytes memory returndata = address(token).functionCall(data); if (returndata.length != 0 && !abi.decode(returndata, (bool))) { revert SafeERC20FailedOperation(address(token)); } } /** * @dev Imitates a Solidity high-level call (i.e. a regular function call to a contract), relaxing the requirement * on the return value: the return value is optional (but if data is returned, it must not be false). * @param token The token targeted by the call. * @param data The call data (encoded using abi.encode or one of its variants). * * This is a variant of {_callOptionalReturn} that silents catches all reverts and returns a bool instead. */ function _callOptionalReturnBool(IERC20 token, bytes memory data) private returns (bool) { // We need to perform a low level call here, to bypass Solidity's return data size checking mechanism, since // we're implementing it ourselves. We cannot use {Address-functionCall} here since this should return false // and not revert is the subcall reverts. (bool success, bytes memory returndata) = address(token).call(data); return success && (returndata.length == 0 || abi.decode(returndata, (bool))) && address(token).code.length > 0; } }
// SPDX-License-Identifier: MIT // OpenZeppelin Contracts (last updated v5.0.0) (utils/Address.sol) pragma solidity ^0.8.20; /** * @dev Collection of functions related to the address type */ library Address { /** * @dev The ETH balance of the account is not enough to perform the operation. */ error AddressInsufficientBalance(address account); /** * @dev There's no code at `target` (it is not a contract). */ error AddressEmptyCode(address target); /** * @dev A call to an address target failed. The target may have reverted. */ error FailedInnerCall(); /** * @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.20/security-considerations.html#use-the-checks-effects-interactions-pattern[checks-effects-interactions pattern]. */ function sendValue(address payable recipient, uint256 amount) internal { if (address(this).balance < amount) { revert AddressInsufficientBalance(address(this)); } (bool success, ) = recipient.call{value: amount}(""); if (!success) { revert FailedInnerCall(); } } /** * @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 or custom error, it is bubbled * up by this function (like regular Solidity function calls). However, if * the call reverted with no returned reason, this function reverts with a * {FailedInnerCall} error. * * 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. */ function functionCall(address target, bytes memory data) internal returns (bytes memory) { return functionCallWithValue(target, data, 0); } /** * @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`. */ function functionCallWithValue(address target, bytes memory data, uint256 value) internal returns (bytes memory) { if (address(this).balance < value) { revert AddressInsufficientBalance(address(this)); } (bool success, bytes memory returndata) = target.call{value: value}(data); return verifyCallResultFromTarget(target, success, returndata); } /** * @dev Same as {xref-Address-functionCall-address-bytes-}[`functionCall`], * but performing a static call. */ function functionStaticCall(address target, bytes memory data) internal view returns (bytes memory) { (bool success, bytes memory returndata) = target.staticcall(data); return verifyCallResultFromTarget(target, success, returndata); } /** * @dev Same as {xref-Address-functionCall-address-bytes-}[`functionCall`], * but performing a delegate call. */ function functionDelegateCall(address target, bytes memory data) internal returns (bytes memory) { (bool success, bytes memory returndata) = target.delegatecall(data); return verifyCallResultFromTarget(target, success, returndata); } /** * @dev Tool to verify that a low level call to smart-contract was successful, and reverts if the target * was not a contract or bubbling up the revert reason (falling back to {FailedInnerCall}) in case of an * unsuccessful call. */ function verifyCallResultFromTarget( address target, bool success, bytes memory returndata ) internal view returns (bytes memory) { if (!success) { _revert(returndata); } else { // only check if target is a contract if the call was successful and the return data is empty // otherwise we already know that it was a contract if (returndata.length == 0 && target.code.length == 0) { revert AddressEmptyCode(target); } return returndata; } } /** * @dev Tool to verify that a low level call was successful, and reverts if it wasn't, either by bubbling the * revert reason or with a default {FailedInnerCall} error. */ function verifyCallResult(bool success, bytes memory returndata) internal pure returns (bytes memory) { if (!success) { _revert(returndata); } else { return returndata; } } /** * @dev Reverts with returndata if present. Otherwise reverts with {FailedInnerCall}. */ function _revert(bytes memory returndata) 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 FailedInnerCall(); } } }
// SPDX-License-Identifier: MIT pragma solidity ^0.8.0; import { IERC20 } from "@openzeppelin/contracts/token/ERC20/IERC20.sol"; import { IRounds } from "./IRounds.sol"; interface ILockup { /// @notice Returns locked amount of user at given index /// @param user The address of the user /// @param index The index number at which user has locked amount function stakes(address user, uint256 index) external view returns (uint256 amount, uint256 endTime); } // interface IPreSale is IRounds { // /// @notice Purchases token with claim amount // /// @param token The purchase token // /// @param tokenPrice The current price of token in 10 decimals // /// @param referenceNormalizationFactor The value to handle decimals // /// @param amount The purchase amount // /// @param minAmountToken The minimum amount of token recipient will get // /// @param indexes The indexes at which user has locked tokens // /// @param recipient The address of the recipient // /// @param round The round in which user will purchase // function purchaseWithClaim( // IERC20 token, // uint256 tokenPrice, // uint8 referenceNormalizationFactor, // uint256 amount, // uint256 minAmountToken, // uint256[] calldata indexes, // address recipient, // uint32 round // ) external payable; // }
// SPDX-License-Identifier: MIT pragma solidity 0.8.25; interface IRounds { /// @notice Returns the round details of the round function rounds(uint32 round) external view returns (uint256 startTime, uint256 endTime, uint256 price); }
// SPDX-License-Identifier: MIT pragma solidity 0.8.25; import { IERC20 } from "@openzeppelin/contracts/token/ERC20/IERC20.sol"; import { AggregatorV3Interface } from "@chainlink/contracts/src/v0.8/shared/interfaces/AggregatorV3Interface.sol"; /// @member priceFeed The Chainlink price feed address /// @member normalizationFactorForToken The normalization factor to achieve return value of 18 decimals, while calculating presale token purchases and always with different token decimals /// @member tolerance The pricefeed live price should be updated in tolerance time to get better price struct PriceFeedData { AggregatorV3Interface priceFeed; uint8 normalizationFactorForToken; uint256 tolerance; } /// @notice Thrown when updating an address with zero address error ZeroAddress(); /// @notice Thrown when updating with an array of no values error ZeroLengthArray(); /// @notice Thrown when updating with the same value as previously stored error IdenticalValue(); /// @notice Thrown when two array lengths does not match error ArrayLengthMismatch(); /// @notice Thrown when sign is invalid error InvalidSignature(); /// @notice Thrown when value to transfer is zero error ZeroValue(); /// @notice Thrown if percentage is not correct error InvalidPercentage(); /// @notice Thrown when caller is not presale contract error OnlyPresale(); /// @dev The constant value helps in calculating percentages uint256 constant PPM = 1_000_000; /// @notice Thrown when input array length is zero error InvalidData(); /// @dev The address of the Ethereum IERC20 constant ETH = IERC20(0xEeeeeEeeeEeEeeEeEeEeeEEEeeeeEeeeeeeeEEeE); /// @dev The constant value helps in calculating amounts uint256 constant FIVE_PERCENT_PPM = 50_000; /// @dev Returns the identifier of the ADMIN_ROLE role bytes32 constant ADMIN_ROLE = keccak256("ADMIN");
{ "viaIR": true, "optimizer": { "enabled": true, "runs": 1000000 }, "evmVersion": "paris", "outputSelection": { "*": { "*": [ "evm.bytecode", "evm.deployedBytecode", "devdoc", "userdoc", "metadata", "abi" ] } }, "libraries": {} }
[{"inputs":[],"stateMutability":"nonpayable","type":"constructor"},{"inputs":[{"internalType":"address","name":"target","type":"address"}],"name":"AddressEmptyCode","type":"error"},{"inputs":[{"internalType":"address","name":"account","type":"address"}],"name":"AddressInsufficientBalance","type":"error"},{"inputs":[],"name":"FailedInnerCall","type":"error"},{"inputs":[{"internalType":"address","name":"token","type":"address"}],"name":"SafeERC20FailedOperation","type":"error"},{"inputs":[],"name":"ZeroAddress","type":"error"},{"inputs":[],"name":"ZeroLengthByteCode","type":"error"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"address","name":"owner","type":"address"},{"indexed":false,"internalType":"uint256","name":"index","type":"uint256"},{"indexed":true,"internalType":"address","name":"presale","type":"address"}],"name":"SaleCreated","type":"event"},{"inputs":[{"internalType":"bytes","name":"saleBytecode","type":"bytes"},{"internalType":"bytes32","name":"salt","type":"bytes32"},{"components":[{"internalType":"address","name":"fundsWalletAddress","type":"address"},{"internalType":"address","name":"platformWalletAddress","type":"address"},{"internalType":"address","name":"signerAddress","type":"address"},{"internalType":"address","name":"lockupContractAddress","type":"address"},{"internalType":"address","name":"uniswapV2Router02Contract","type":"address"},{"internalType":"address","name":"lockLiquidityContract","type":"address"},{"internalType":"address","name":"owner","type":"address"},{"internalType":"uint32","name":"lastRound","type":"uint32"},{"internalType":"uint256[]","name":"startTimes","type":"uint256[]"},{"internalType":"uint256[]","name":"endTimes","type":"uint256[]"},{"internalType":"uint256[]","name":"prices","type":"uint256[]"},{"internalType":"contract IERC20[][]","name":"allowedTokens","type":"address[][]"},{"internalType":"contract IERC20[]","name":"tokensToAddPriceFeed","type":"address[]"},{"internalType":"uint256[][]","name":"customPrices","type":"uint256[][]"},{"internalType":"bool[][]","name":"accesses","type":"bool[][]"},{"internalType":"uint32[]","name":"rounds","type":"uint32[]"},{"internalType":"uint256","name":"referralCommissionPPMinit","type":"uint256"},{"internalType":"uint256","name":"hardCapAmount","type":"uint256"},{"internalType":"uint256","name":"minBuyAmount","type":"uint256"},{"internalType":"uint256","name":"maxBuyAmount","type":"uint256"},{"internalType":"contract IERC20","name":"presaleTokenContractAddress","type":"address"},{"internalType":"uint256","name":"liquidityPercentInit","type":"uint256"},{"internalType":"uint256","name":"tokensToSell","type":"uint256"},{"internalType":"uint256","name":"liquidityTokens","type":"uint256"},{"components":[{"internalType":"contract AggregatorV3Interface","name":"priceFeed","type":"address"},{"internalType":"uint8","name":"normalizationFactorForToken","type":"uint8"},{"internalType":"uint256","name":"tolerance","type":"uint256"}],"internalType":"struct PriceFeedData[]","name":"priceFeeds","type":"tuple[]"}],"internalType":"struct Data","name":"data","type":"tuple"},{"internalType":"address","name":"tokenWalletAddress","type":"address"}],"name":"createPresale","outputs":[{"internalType":"address","name":"presaleContract","type":"address"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"index","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"index","type":"uint256"}],"name":"sales","outputs":[{"internalType":"address","name":"presale","type":"address"}],"stateMutability":"view","type":"function"}]
Contract Creation Code
60808060405234601557611346908161001b8239f35b600080fdfe6080604052600436101561001257600080fd5b6000803560e01c9081632986c0e5146100a5578163b5f522f714610045575063d8d7d1d61461004057600080fd5b610821565b346100a25760207ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc3601126100a25773ffffffffffffffffffffffffffffffffffffffff6040602092600435815260018452205416604051908152f35b80fd5b346100a257807ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc3601126100a2575460805260206080f35b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b6060810190811067ffffffffffffffff82111761012857604052565b6100dd565b60a0810190811067ffffffffffffffff82111761012857604052565b90601f7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0910116810190811067ffffffffffffffff82111761012857604052565b60405190610320820182811067ffffffffffffffff82111761012857604052565b67ffffffffffffffff811161012857601f017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe01660200190565b73ffffffffffffffffffffffffffffffffffffffff81160361020357565b600080fd5b60643590610215826101e5565b565b3590610215826101e5565b359063ffffffff8216820361020357565b67ffffffffffffffff81116101285760051b60200190565b9080601f8301121561020357602090823561026581610233565b936102736040519586610149565b81855260208086019260051b82010192831161020357602001905b82821061029c575050505090565b8135815290830190830161028e565b9080601f830112156102035760209082356102c581610233565b936102d36040519586610149565b81855260208086019260051b82010192831161020357602001905b8282106102fc575050505090565b838091833561030a816101e5565b8152019101906102ee565b81601f820112156102035780359160209161032f84610233565b9361033d6040519586610149565b808552838086019160051b8301019280841161020357848301915b8483106103685750505050505090565b823567ffffffffffffffff811161020357869161038a848480948901016102ab565b815201920191610358565b81601f82011215610203578035916020916103af84610233565b936103bd6040519586610149565b808552838086019160051b8301019280841161020357848301915b8483106103e85750505050505090565b823567ffffffffffffffff811161020357869161040a8484809489010161024b565b8152019201916103d8565b8015150361020357565b81601f8201121561020357602090803561043881610233565b9360406104486040519687610149565b828652848601918560059460051b8601019481861161020357868101935b86851061047857505050505050505090565b843567ffffffffffffffff811161020357820183603f820112156102035788810135906104a482610233565b916104b187519384610149565b808352868b8401918a1b830101918683116102035791878c94929593015b8181106104e6575050829350815201940193610466565b91938091939583356104f781610415565b8152019101918b939194926104cf565b9080601f8301121561020357602090823561052181610233565b9361052f6040519586610149565b81855260208086019260051b82010192831161020357602001905b828210610558575050505090565b83809161056484610222565b81520191019061054a565b81601f8201121561020357803590602061058883610233565b9360406105986040519687610149565b8486528286019183606080970286010194818611610203578401925b8584106105c5575050505050505090565b8684830312610203578251906105da8261010c565b84356105e5816101e5565b8252858501359060ff8216820361020357828792838b95015285870135868201528152019301926105b4565b9190610320838203126102035761062661018a565b9261063081610217565b845261063e60208201610217565b602085015261064f60408201610217565b604085015261066060608201610217565b606085015261067160808201610217565b608085015261068260a08201610217565b60a085015261069360c08201610217565b60c08501526106a460e08201610222565b60e085015267ffffffffffffffff916101008281013584811161020357826106cd91850161024b565b908601526101208083013584811161020357826106eb91850161024b565b9086015261014080830135848111610203578261070991850161024b565b90860152610160808301358481116102035782610727918501610315565b908601526101808083013584811161020357826107459185016102ab565b908601526101a0808301358481116102035782610763918501610395565b908601526101c080830135848111610203578261078191850161041f565b908601526101e080830135848111610203578261079f918501610507565b9086015261020080830135908601526102208083013590860152610240808301359086015261026080830135908601526102806107dd818401610217565b908601526102a080830135908601526102c080830135908601526102e0808301359086015261030092838301359081116102035761081b920161056f565b90830152565b346102035760807ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc3601126102035760043567ffffffffffffffff808211610203573660238301121561020357816004013561087c816101ab565b9261088a6040519485610149565b81845236602483830101116102035781600092602460209301838701378401015260443590811161020357610903916108ca6108dc923690600401610611565b6108d2610208565b9160243590610efc565b60405173ffffffffffffffffffffffffffffffffffffffff90911681529081906020820190565b0390f35b90815180825260208080930193019160005b828110610927575050505090565b835185529381019392810192600101610919565b90815180825260208080930193019160005b82811061095b575050505090565b835173ffffffffffffffffffffffffffffffffffffffff168552938101939281019260010161094d565b90808251908181526020809101926020808460051b8301019501936000915b8483106109b45750505050505090565b90919293949584806109f0837fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe086600196030187528a5161093b565b98019301930191949392906109a4565b90808251908181526020809101926020808460051b8301019501936000915b848310610a2f5750505050505090565b9091929394958480610a6b837fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe086600196030187528a51610907565b9801930193019194939290610a1f565b80518083526020600582901b840181019392810191906000818501815b848310610aa9575050505050505090565b909192877fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe088839798999b9a0301845287519082808351928381520192019084905b808210610b0e575050509080600192980193019301919493929097959697610a98565b91938060019294865115158152019401920187939291610aeb565b90815180825260208080930193019160005b828110610b49575050505090565b835163ffffffff1685529381019392810192600101610b3b565b90815180825260208080930193019160005b828110610b83575050505090565b8351805173ffffffffffffffffffffffffffffffffffffffff1686528083015160ff16868401526040908101519086015260609094019392810192600101610b75565b90610e499160208152610bf260208201835173ffffffffffffffffffffffffffffffffffffffff169052565b602082015173ffffffffffffffffffffffffffffffffffffffff166040820152604082015173ffffffffffffffffffffffffffffffffffffffff166060820152606082015173ffffffffffffffffffffffffffffffffffffffff166080820152608082015173ffffffffffffffffffffffffffffffffffffffff1660a082015260a082015173ffffffffffffffffffffffffffffffffffffffff1660c082015260c082015173ffffffffffffffffffffffffffffffffffffffff1660e082015260e0820151610ccc610100918284019063ffffffff169052565b82015190610320610cea610120938285850152610340840190610907565b9284015193610dc3610dac610d95610d7e610d67610d50610d397fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe09a6101409c8d8d8d840301908d0152610907565b9a8701519a6101609b8b8b8303018d8c0152610907565b99860151996101809a8a8a8303018c8b0152610985565b98850151986101a09989898303018b8a015261093b565b97840151976101c09888888303018a890152610a00565b96830151966101e097878783030189880152610a7b565b958201519561020096868683030188870152610b29565b948101516102209081850152810151610240908185015281015161026090818501528101516102809081850152810151610e186102a0918286019073ffffffffffffffffffffffffffffffffffffffff169052565b8101516102c090818501528101516102e0908185015281015190610300918285015201519282850301910152610b63565b90565b9081519160005b838110610e64575050016000815290565b8060208092840101518185015201610e53565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b9061c35091828102928184041490151715610ebd57565b610e77565b91908201809211610ebd57565b7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff8114610ebd5760010190565b9392908451156111045773ffffffffffffffffffffffffffffffffffffffff94858316156110da57610f87610f9360405180610f3b8860208301610bc6565b0390610f6d7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe092838101835282610149565b604051938491610f81602084018098610e4c565b90610e4c565b03908101835282610149565b51906000f59384169182156110da5760c08161102b7f8df1556ee71ffa157c18ca297c840cb45dc34c30630937550a7c8f8a436c51f194886102c06110ac960191611025610fed610fe48551610ea6565b620f4240900490565b61102061101261028089015173ffffffffffffffffffffffffffffffffffffffff1690565b95516102e089015190610ec2565b610ec2565b9261112e565b6110918761105161103d600054610ecf565b806000556000526001602052604060002090565b9073ffffffffffffffffffffffffffffffffffffffff167fffffffffffffffffffffffff0000000000000000000000000000000000000000825416179055565b015173ffffffffffffffffffffffffffffffffffffffff1690565b6000546040805173ffffffffffffffffffffffffffffffffffffffff939093168352602083019190915290a2565b60046040517fd92e233d000000000000000000000000000000000000000000000000000000008152fd5b60046040517f1208b22e000000000000000000000000000000000000000000000000000000008152fd5b6000916111d29383926040519660208801937f23b872dd00000000000000000000000000000000000000000000000000000000855273ffffffffffffffffffffffffffffffffffffffff938480921660248b015216604489015260648801526064875261119a8761012d565b1694519082865af13d15611253573d906111b3826101ab565b916111c16040519384610149565b82523d6000602084013e5b83611270565b8051908115159182611231575b50506111e85750565b6040517f5274afe700000000000000000000000000000000000000000000000000000000815273ffffffffffffffffffffffffffffffffffffffff919091166004820152602490fd5b61124c92509060208061124893830101910161125b565b1590565b38806111df565b6060906111cc565b908160209103126102035751610e4981610415565b906112af575080511561128557805190602001fd5b60046040517f1425ea42000000000000000000000000000000000000000000000000000000008152fd5b81511580611307575b6112c0575090565b60249073ffffffffffffffffffffffffffffffffffffffff604051917f9996b315000000000000000000000000000000000000000000000000000000008352166004820152fd5b50803b156112b856fea2646970667358221220113a2f22cfbc59edeccc2849dad74119210b93b7a8f2af92562d5ea0a7009a4064736f6c63430008190033
Deployed Bytecode
0x6080604052600436101561001257600080fd5b6000803560e01c9081632986c0e5146100a5578163b5f522f714610045575063d8d7d1d61461004057600080fd5b610821565b346100a25760207ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc3601126100a25773ffffffffffffffffffffffffffffffffffffffff6040602092600435815260018452205416604051908152f35b80fd5b346100a257807ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc3601126100a2575460805260206080f35b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b6060810190811067ffffffffffffffff82111761012857604052565b6100dd565b60a0810190811067ffffffffffffffff82111761012857604052565b90601f7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0910116810190811067ffffffffffffffff82111761012857604052565b60405190610320820182811067ffffffffffffffff82111761012857604052565b67ffffffffffffffff811161012857601f017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe01660200190565b73ffffffffffffffffffffffffffffffffffffffff81160361020357565b600080fd5b60643590610215826101e5565b565b3590610215826101e5565b359063ffffffff8216820361020357565b67ffffffffffffffff81116101285760051b60200190565b9080601f8301121561020357602090823561026581610233565b936102736040519586610149565b81855260208086019260051b82010192831161020357602001905b82821061029c575050505090565b8135815290830190830161028e565b9080601f830112156102035760209082356102c581610233565b936102d36040519586610149565b81855260208086019260051b82010192831161020357602001905b8282106102fc575050505090565b838091833561030a816101e5565b8152019101906102ee565b81601f820112156102035780359160209161032f84610233565b9361033d6040519586610149565b808552838086019160051b8301019280841161020357848301915b8483106103685750505050505090565b823567ffffffffffffffff811161020357869161038a848480948901016102ab565b815201920191610358565b81601f82011215610203578035916020916103af84610233565b936103bd6040519586610149565b808552838086019160051b8301019280841161020357848301915b8483106103e85750505050505090565b823567ffffffffffffffff811161020357869161040a8484809489010161024b565b8152019201916103d8565b8015150361020357565b81601f8201121561020357602090803561043881610233565b9360406104486040519687610149565b828652848601918560059460051b8601019481861161020357868101935b86851061047857505050505050505090565b843567ffffffffffffffff811161020357820183603f820112156102035788810135906104a482610233565b916104b187519384610149565b808352868b8401918a1b830101918683116102035791878c94929593015b8181106104e6575050829350815201940193610466565b91938091939583356104f781610415565b8152019101918b939194926104cf565b9080601f8301121561020357602090823561052181610233565b9361052f6040519586610149565b81855260208086019260051b82010192831161020357602001905b828210610558575050505090565b83809161056484610222565b81520191019061054a565b81601f8201121561020357803590602061058883610233565b9360406105986040519687610149565b8486528286019183606080970286010194818611610203578401925b8584106105c5575050505050505090565b8684830312610203578251906105da8261010c565b84356105e5816101e5565b8252858501359060ff8216820361020357828792838b95015285870135868201528152019301926105b4565b9190610320838203126102035761062661018a565b9261063081610217565b845261063e60208201610217565b602085015261064f60408201610217565b604085015261066060608201610217565b606085015261067160808201610217565b608085015261068260a08201610217565b60a085015261069360c08201610217565b60c08501526106a460e08201610222565b60e085015267ffffffffffffffff916101008281013584811161020357826106cd91850161024b565b908601526101208083013584811161020357826106eb91850161024b565b9086015261014080830135848111610203578261070991850161024b565b90860152610160808301358481116102035782610727918501610315565b908601526101808083013584811161020357826107459185016102ab565b908601526101a0808301358481116102035782610763918501610395565b908601526101c080830135848111610203578261078191850161041f565b908601526101e080830135848111610203578261079f918501610507565b9086015261020080830135908601526102208083013590860152610240808301359086015261026080830135908601526102806107dd818401610217565b908601526102a080830135908601526102c080830135908601526102e0808301359086015261030092838301359081116102035761081b920161056f565b90830152565b346102035760807ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc3601126102035760043567ffffffffffffffff808211610203573660238301121561020357816004013561087c816101ab565b9261088a6040519485610149565b81845236602483830101116102035781600092602460209301838701378401015260443590811161020357610903916108ca6108dc923690600401610611565b6108d2610208565b9160243590610efc565b60405173ffffffffffffffffffffffffffffffffffffffff90911681529081906020820190565b0390f35b90815180825260208080930193019160005b828110610927575050505090565b835185529381019392810192600101610919565b90815180825260208080930193019160005b82811061095b575050505090565b835173ffffffffffffffffffffffffffffffffffffffff168552938101939281019260010161094d565b90808251908181526020809101926020808460051b8301019501936000915b8483106109b45750505050505090565b90919293949584806109f0837fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe086600196030187528a5161093b565b98019301930191949392906109a4565b90808251908181526020809101926020808460051b8301019501936000915b848310610a2f5750505050505090565b9091929394958480610a6b837fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe086600196030187528a51610907565b9801930193019194939290610a1f565b80518083526020600582901b840181019392810191906000818501815b848310610aa9575050505050505090565b909192877fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe088839798999b9a0301845287519082808351928381520192019084905b808210610b0e575050509080600192980193019301919493929097959697610a98565b91938060019294865115158152019401920187939291610aeb565b90815180825260208080930193019160005b828110610b49575050505090565b835163ffffffff1685529381019392810192600101610b3b565b90815180825260208080930193019160005b828110610b83575050505090565b8351805173ffffffffffffffffffffffffffffffffffffffff1686528083015160ff16868401526040908101519086015260609094019392810192600101610b75565b90610e499160208152610bf260208201835173ffffffffffffffffffffffffffffffffffffffff169052565b602082015173ffffffffffffffffffffffffffffffffffffffff166040820152604082015173ffffffffffffffffffffffffffffffffffffffff166060820152606082015173ffffffffffffffffffffffffffffffffffffffff166080820152608082015173ffffffffffffffffffffffffffffffffffffffff1660a082015260a082015173ffffffffffffffffffffffffffffffffffffffff1660c082015260c082015173ffffffffffffffffffffffffffffffffffffffff1660e082015260e0820151610ccc610100918284019063ffffffff169052565b82015190610320610cea610120938285850152610340840190610907565b9284015193610dc3610dac610d95610d7e610d67610d50610d397fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe09a6101409c8d8d8d840301908d0152610907565b9a8701519a6101609b8b8b8303018d8c0152610907565b99860151996101809a8a8a8303018c8b0152610985565b98850151986101a09989898303018b8a015261093b565b97840151976101c09888888303018a890152610a00565b96830151966101e097878783030189880152610a7b565b958201519561020096868683030188870152610b29565b948101516102209081850152810151610240908185015281015161026090818501528101516102809081850152810151610e186102a0918286019073ffffffffffffffffffffffffffffffffffffffff169052565b8101516102c090818501528101516102e0908185015281015190610300918285015201519282850301910152610b63565b90565b9081519160005b838110610e64575050016000815290565b8060208092840101518185015201610e53565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b9061c35091828102928184041490151715610ebd57565b610e77565b91908201809211610ebd57565b7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff8114610ebd5760010190565b9392908451156111045773ffffffffffffffffffffffffffffffffffffffff94858316156110da57610f87610f9360405180610f3b8860208301610bc6565b0390610f6d7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe092838101835282610149565b604051938491610f81602084018098610e4c565b90610e4c565b03908101835282610149565b51906000f59384169182156110da5760c08161102b7f8df1556ee71ffa157c18ca297c840cb45dc34c30630937550a7c8f8a436c51f194886102c06110ac960191611025610fed610fe48551610ea6565b620f4240900490565b61102061101261028089015173ffffffffffffffffffffffffffffffffffffffff1690565b95516102e089015190610ec2565b610ec2565b9261112e565b6110918761105161103d600054610ecf565b806000556000526001602052604060002090565b9073ffffffffffffffffffffffffffffffffffffffff167fffffffffffffffffffffffff0000000000000000000000000000000000000000825416179055565b015173ffffffffffffffffffffffffffffffffffffffff1690565b6000546040805173ffffffffffffffffffffffffffffffffffffffff939093168352602083019190915290a2565b60046040517fd92e233d000000000000000000000000000000000000000000000000000000008152fd5b60046040517f1208b22e000000000000000000000000000000000000000000000000000000008152fd5b6000916111d29383926040519660208801937f23b872dd00000000000000000000000000000000000000000000000000000000855273ffffffffffffffffffffffffffffffffffffffff938480921660248b015216604489015260648801526064875261119a8761012d565b1694519082865af13d15611253573d906111b3826101ab565b916111c16040519384610149565b82523d6000602084013e5b83611270565b8051908115159182611231575b50506111e85750565b6040517f5274afe700000000000000000000000000000000000000000000000000000000815273ffffffffffffffffffffffffffffffffffffffff919091166004820152602490fd5b61124c92509060208061124893830101910161125b565b1590565b38806111df565b6060906111cc565b908160209103126102035751610e4981610415565b906112af575080511561128557805190602001fd5b60046040517f1425ea42000000000000000000000000000000000000000000000000000000008152fd5b81511580611307575b6112c0575090565b60249073ffffffffffffffffffffffffffffffffffffffff604051917f9996b315000000000000000000000000000000000000000000000000000000008352166004820152fd5b50803b156112b856fea2646970667358221220113a2f22cfbc59edeccc2849dad74119210b93b7a8f2af92562d5ea0a7009a4064736f6c63430008190033
Loading...
Loading
[ Download: CSV Export ]
[ Download: CSV Export ]
A contract address hosts a smart contract, which is a set of code stored on the blockchain that runs when predetermined conditions are met. Learn more about addresses in our Knowledge Base.