Source Code
Latest 1 from a total of 1 transactions
| Transaction Hash |
Method
|
Block
|
From
|
|
To
|
||||
|---|---|---|---|---|---|---|---|---|---|
| Start Sale | 23755610 | 129 days ago | IN | 0 ETH | 0.0001161 |
Loading...
Loading
Loading...
Loading
Cross-Chain Transactions
Loading...
Loading
Contract Name:
TribeICO
Compiler Version
v0.8.26+commit.8a97fa7a
Optimization Enabled:
No with 200 runs
Other Settings:
default evmVersion
Contract Source Code (Solidity Standard Json-Input format)
// SPDX-License-Identifier: MIT
pragma solidity 0.8.26;
import "@openzeppelin/contracts/access/Ownable.sol";
import "@openzeppelin/contracts/utils/math/SafeMath.sol";
import "@openzeppelin/contracts/token/ERC20/IERC20.sol";
import "@openzeppelin/contracts/token/ERC20/utils/SafeERC20.sol";
contract TribeICO is Ownable {
using SafeMath for uint256;
using SafeERC20 for IERC20;
enum PaymentType {
USDT, //0
USDC, //1
FDUSD, //2
BUSD //3
}
bool public saleStatus;
mapping(PaymentType => address) public tokenAddresses;
// Sale variables
uint256 usdtPrice;
IERC20 public tokenAddress;
uint256 saleCounter;
uint256 soldToken;
address public fundsRecipentAddress =
0xc728595c1Ae60DfA2Db7F20BBFDbEf649d7c2783;
address public taxRecipentAddress =
0xacdcAa25Ff0590754ADD4ED8A9A1980EBb2b3c16;
uint256 lastPriceUpdate;
uint256 public PRICE_INCREMENT_INTERVAL = 10 days;
uint256 public PRICE_INCREMENT_PERCENTAGE = 5; // 5% increment
uint256 public Tax_Percentage = 5; // tax of 5% on token buy
// Raised amounts for each token
mapping(PaymentType => uint256) private raisedAmounts;
struct Transaction {
uint256 timestamp;
uint256 amountPaid;
uint256 tokensReceived;
uint256 pricePerToken;
}
mapping(address => Transaction[]) userTransactions;
event TokenPurchased(
address indexed user,
uint256 amountPaid,
uint256 tokensReceived,
uint256 pricePerToken
);
event TokensWithdrawn(
address indexed to,
address indexed from,
uint256 amount,
uint256 timestamp
);
event PriceUpdated(uint256 newPrice);
event SaleStarted();
event SaleStopped();
constructor(
address _tokenAddress,
address _owner,
uint256 _usdtPrice
) Ownable(_owner) {
tokenAddress = IERC20(_tokenAddress);
usdtPrice = _usdtPrice;
setTokenAddresses();
}
function setTokenAddresses() internal {
tokenAddresses[
PaymentType.USDT
] = 0xdAC17F958D2ee523a2206206994597C13D831ec7;
tokenAddresses[
PaymentType.USDC
] = 0xA0b86991c6218b36c1d19D4a2e9Eb0cE3606eB48;
tokenAddresses[
PaymentType.FDUSD
] = 0xc5f0f7b66764F6ec8C8Dff7BA683102295E16409;
tokenAddresses[
PaymentType.BUSD
] = 0x4Fabb145d64652a948d72533023f6E7A623C7C53;
}
function startSale() external onlyOwner {
require(!saleStatus, "Sale is already started");
saleStatus = true;
saleCounter = 0;
lastPriceUpdate = block.timestamp;
emit SaleStarted();
}
function updateSaleStatus(bool _saleStatus) external onlyOwner {
if (saleStatus == _saleStatus) {
return;
}
saleStatus = _saleStatus;
if (saleStatus) {
lastPriceUpdate = block.timestamp;
}
}
function updatePriceIncrementPercentage(uint256 _updatetPercentage)
external
onlyOwner
{
PRICE_INCREMENT_PERCENTAGE = _updatetPercentage;
}
function updateTexPrecenatge(uint256 _updatetPercentage)
external
onlyOwner
{
Tax_Percentage = _updatetPercentage;
}
function updateToken(IERC20 _token) external onlyOwner {
tokenAddress = IERC20(_token);
}
function withdrawLockFunds(
address _address,
address to,
uint256 amount
) public onlyOwner {
require(
IERC20(_address).balanceOf(address(this)) >= amount,
"Insufficient balance"
);
IERC20(_address).transfer(to, amount);
emit TokensWithdrawn(_address, to, amount, block.timestamp);
}
function updateFundsRecipentAddress(address _fundsRecipentAddress)
external
onlyOwner
{
fundsRecipentAddress = _fundsRecipentAddress;
}
function UpdatetaxRecipentAddress(address _taxRecipentAddress)
external
onlyOwner
{
taxRecipentAddress = _taxRecipentAddress;
}
function updateTokensAddresses(address _addeess, PaymentType _pay)
external
onlyOwner
{
tokenAddresses[_pay] = _addeess;
}
function buy(uint256 _amount, PaymentType _pay) external {
require(saleStatus != false, "Sale is Closed");
address tokenAddr = tokenAddresses[_pay];
IERC20(tokenAddr).safeTransferFrom(
msg.sender,
fundsRecipentAddress,
_amount
);
TokenPrice();
(uint256 transferAmount, uint256 taxAmount) = calculateToken(
_amount,
_pay
);
raisedAmounts[_pay] = raisedAmounts[_pay].add(_amount);
uint256 tokenAmount = transferAmount.add(taxAmount);
require(
tokenAddress.balanceOf(address(this)) >= tokenAmount,
"Insufficient token balance"
);
tokenAddress.safeTransfer(msg.sender, transferAmount);
tokenAddress.safeTransfer(taxRecipentAddress, taxAmount);
soldToken = soldToken.add(tokenAmount);
saleCounter += 1;
userTransactions[msg.sender].push(
Transaction({
timestamp: block.timestamp,
amountPaid: _amount,
tokensReceived: transferAmount,
pricePerToken: usdtPrice
})
);
emit TokenPurchased(msg.sender, _amount, transferAmount, usdtPrice);
}
function calculateToken(uint256 _amount, PaymentType _pay)
public
view
returns (uint256 _transferAble, uint256 _tax)
{
uint256 tokenPrice = getCurrentPrice();
uint256 amount;
if (_pay == PaymentType.USDT || _pay == PaymentType.USDC) {
amount = (_amount * 1e18) / tokenPrice;
}
else if (_pay == PaymentType.FDUSD || _pay == PaymentType.BUSD) {
amount = (_amount * 1e6) / tokenPrice;
}
uint256 taxnAmount = (amount * Tax_Percentage) / 100;
uint256 userAmount = amount - taxnAmount;
return (userAmount, taxnAmount);
}
function getCurrentPrice() public view returns (uint256) {
if (!saleStatus) {
return usdtPrice;
}
uint256 currentPrice = usdtPrice;
uint256 timePassed = block.timestamp - lastPriceUpdate;
if (timePassed >= PRICE_INCREMENT_INTERVAL) {
uint256 intervalsPassed = timePassed / PRICE_INCREMENT_INTERVAL;
for (uint256 i = 0; i < intervalsPassed; i++) {
currentPrice = currentPrice.add(
currentPrice.mul(PRICE_INCREMENT_PERCENTAGE).div(100)
);
}
}
return currentPrice;
}
function TokenPrice() internal returns (uint256) {
uint256 currentPrice = getCurrentPrice();
if (currentPrice > usdtPrice) {
uint256 timePassed = block.timestamp - lastPriceUpdate;
uint256 intervalsPassed = timePassed / PRICE_INCREMENT_INTERVAL;
usdtPrice = currentPrice;
lastPriceUpdate = lastPriceUpdate.add(
intervalsPassed.mul(PRICE_INCREMENT_INTERVAL)
);
}
usdtPrice = currentPrice;
return usdtPrice;
}
function withdrawUnSoldTokens(address _to, uint256 _amount)
external
onlyOwner
{
require(
_amount > 0 && tokenAddress.balanceOf(address(this)) > _amount,
"Not enough balance"
);
tokenAddress.safeTransfer(_to, _amount);
}
function getSaleInfo()
public
view
returns (
uint256 _IcoBalance,
uint256 _saleCounter,
uint256 _totalRaisedUSDT,
uint256 _totalRaisedUSDC,
uint256 _totalRaisedFDUSD,
uint256 _totalRaisedBUSD
)
{
return (
tokenAddress.balanceOf(address(this)),
saleCounter,
raisedAmounts[PaymentType.USDT],
raisedAmounts[PaymentType.USDC],
raisedAmounts[PaymentType.FDUSD],
raisedAmounts[PaymentType.BUSD]
);
}
function tokenSold() public view returns (uint256) {
return soldToken;
}
function getUserTransactionHistory(address user)
external
view
returns (Transaction[] memory)
{
return userTransactions[user];
}
}// SPDX-License-Identifier: MIT
// OpenZeppelin Contracts (last updated v5.2.0) (token/ERC20/utils/SafeERC20.sol)
pragma solidity ^0.8.20;
import {IERC20} from "../IERC20.sol";
import {IERC1363} from "../../../interfaces/IERC1363.sol";
/**
* @title SafeERC20
* @dev Wrappers around ERC-20 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 {
/**
* @dev An operation with an ERC-20 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.
*
* IMPORTANT: If the token implements ERC-7674 (ERC-20 with temporary allowance), and if the "client"
* smart contract uses ERC-7674 to set temporary allowances, then the "client" smart contract should avoid using
* this function. Performing a {safeIncreaseAllowance} or {safeDecreaseAllowance} operation on a token contract
* that has a non-zero temporary allowance (for that particular owner-spender) will result in unexpected behavior.
*/
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.
*
* IMPORTANT: If the token implements ERC-7674 (ERC-20 with temporary allowance), and if the "client"
* smart contract uses ERC-7674 to set temporary allowances, then the "client" smart contract should avoid using
* this function. Performing a {safeIncreaseAllowance} or {safeDecreaseAllowance} operation on a token contract
* that has a non-zero temporary allowance (for that particular owner-spender) will result in unexpected behavior.
*/
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.
*
* NOTE: If the token implements ERC-7674, this function will not modify any temporary allowance. This function
* only sets the "standard" allowance. Any temporary allowance will remain active, in addition to the value being
* set here.
*/
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 Performs an {ERC1363} transferAndCall, with a fallback to the simple {ERC20} transfer if the target has no
* code. This can be used to implement an {ERC721}-like safe transfer that rely on {ERC1363} checks when
* targeting contracts.
*
* Reverts if the returned value is other than `true`.
*/
function transferAndCallRelaxed(IERC1363 token, address to, uint256 value, bytes memory data) internal {
if (to.code.length == 0) {
safeTransfer(token, to, value);
} else if (!token.transferAndCall(to, value, data)) {
revert SafeERC20FailedOperation(address(token));
}
}
/**
* @dev Performs an {ERC1363} transferFromAndCall, with a fallback to the simple {ERC20} transferFrom if the target
* has no code. This can be used to implement an {ERC721}-like safe transfer that rely on {ERC1363} checks when
* targeting contracts.
*
* Reverts if the returned value is other than `true`.
*/
function transferFromAndCallRelaxed(
IERC1363 token,
address from,
address to,
uint256 value,
bytes memory data
) internal {
if (to.code.length == 0) {
safeTransferFrom(token, from, to, value);
} else if (!token.transferFromAndCall(from, to, value, data)) {
revert SafeERC20FailedOperation(address(token));
}
}
/**
* @dev Performs an {ERC1363} approveAndCall, with a fallback to the simple {ERC20} approve if the target has no
* code. This can be used to implement an {ERC721}-like safe transfer that rely on {ERC1363} checks when
* targeting contracts.
*
* NOTE: When the recipient address (`to`) has no code (i.e. is an EOA), this function behaves as {forceApprove}.
* Opposedly, when the recipient address (`to`) has code, this function only attempts to call {ERC1363-approveAndCall}
* once without retrying, and relies on the returned value to be true.
*
* Reverts if the returned value is other than `true`.
*/
function approveAndCallRelaxed(IERC1363 token, address to, uint256 value, bytes memory data) internal {
if (to.code.length == 0) {
forceApprove(token, to, value);
} else if (!token.approveAndCall(to, value, data)) {
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 {_callOptionalReturnBool} that reverts if call fails to meet the requirements.
*/
function _callOptionalReturn(IERC20 token, bytes memory data) private {
uint256 returnSize;
uint256 returnValue;
assembly ("memory-safe") {
let success := call(gas(), token, 0, add(data, 0x20), mload(data), 0, 0x20)
// bubble errors
if iszero(success) {
let ptr := mload(0x40)
returndatacopy(ptr, 0, returndatasize())
revert(ptr, returndatasize())
}
returnSize := returndatasize()
returnValue := mload(0)
}
if (returnSize == 0 ? address(token).code.length == 0 : returnValue != 1) {
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 silently catches all reverts and returns a bool instead.
*/
function _callOptionalReturnBool(IERC20 token, bytes memory data) private returns (bool) {
bool success;
uint256 returnSize;
uint256 returnValue;
assembly ("memory-safe") {
success := call(gas(), token, 0, add(data, 0x20), mload(data), 0, 0x20)
returnSize := returndatasize()
returnValue := mload(0)
}
return success && (returnSize == 0 ? address(token).code.length > 0 : returnValue == 1);
}
}// SPDX-License-Identifier: MIT
// OpenZeppelin Contracts (last updated v5.1.0) (token/ERC20/IERC20.sol)
pragma solidity ^0.8.20;
/**
* @dev Interface of the ERC-20 standard as defined in the ERC.
*/
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 v4.9.0) (utils/math/SafeMath.sol)
pragma solidity ^0.8.0;
// CAUTION
// This version of SafeMath should only be used with Solidity 0.8 or later,
// because it relies on the compiler's built in overflow checks.
/**
* @dev Wrappers over Solidity's arithmetic operations.
*
* NOTE: `SafeMath` is generally not needed starting with Solidity 0.8, since the compiler
* now has built in overflow checking.
*/
library SafeMath {
/**
* @dev Returns the addition of two unsigned integers, with an overflow flag.
*
* _Available since v3.4._
*/
function tryAdd(uint256 a, uint256 b) internal pure returns (bool, uint256) {
unchecked {
uint256 c = a + b;
if (c < a) return (false, 0);
return (true, c);
}
}
/**
* @dev Returns the subtraction of two unsigned integers, with an overflow flag.
*
* _Available since v3.4._
*/
function trySub(uint256 a, uint256 b) internal pure returns (bool, uint256) {
unchecked {
if (b > a) return (false, 0);
return (true, a - b);
}
}
/**
* @dev Returns the multiplication of two unsigned integers, with an overflow flag.
*
* _Available since v3.4._
*/
function tryMul(uint256 a, uint256 b) internal pure returns (bool, uint256) {
unchecked {
// Gas optimization: this is cheaper than requiring 'a' not being zero, but the
// benefit is lost if 'b' is also tested.
// See: https://github.com/OpenZeppelin/openzeppelin-contracts/pull/522
if (a == 0) return (true, 0);
uint256 c = a * b;
if (c / a != b) return (false, 0);
return (true, c);
}
}
/**
* @dev Returns the division of two unsigned integers, with a division by zero flag.
*
* _Available since v3.4._
*/
function tryDiv(uint256 a, uint256 b) internal pure returns (bool, uint256) {
unchecked {
if (b == 0) return (false, 0);
return (true, a / b);
}
}
/**
* @dev Returns the remainder of dividing two unsigned integers, with a division by zero flag.
*
* _Available since v3.4._
*/
function tryMod(uint256 a, uint256 b) internal pure returns (bool, uint256) {
unchecked {
if (b == 0) return (false, 0);
return (true, a % b);
}
}
/**
* @dev Returns the addition of two unsigned integers, reverting on
* overflow.
*
* Counterpart to Solidity's `+` operator.
*
* Requirements:
*
* - Addition cannot overflow.
*/
function add(uint256 a, uint256 b) internal pure returns (uint256) {
return a + b;
}
/**
* @dev Returns the subtraction of two unsigned integers, reverting on
* overflow (when the result is negative).
*
* Counterpart to Solidity's `-` operator.
*
* Requirements:
*
* - Subtraction cannot overflow.
*/
function sub(uint256 a, uint256 b) internal pure returns (uint256) {
return a - b;
}
/**
* @dev Returns the multiplication of two unsigned integers, reverting on
* overflow.
*
* Counterpart to Solidity's `*` operator.
*
* Requirements:
*
* - Multiplication cannot overflow.
*/
function mul(uint256 a, uint256 b) internal pure returns (uint256) {
return a * b;
}
/**
* @dev Returns the integer division of two unsigned integers, reverting on
* division by zero. The result is rounded towards zero.
*
* Counterpart to Solidity's `/` operator.
*
* Requirements:
*
* - The divisor cannot be zero.
*/
function div(uint256 a, uint256 b) internal pure returns (uint256) {
return a / b;
}
/**
* @dev Returns the remainder of dividing two unsigned integers. (unsigned integer modulo),
* reverting when dividing by zero.
*
* Counterpart to Solidity's `%` operator. This function uses a `revert`
* opcode (which leaves remaining gas untouched) while Solidity uses an
* invalid opcode to revert (consuming all remaining gas).
*
* Requirements:
*
* - The divisor cannot be zero.
*/
function mod(uint256 a, uint256 b) internal pure returns (uint256) {
return a % b;
}
/**
* @dev Returns the subtraction of two unsigned integers, reverting with custom message on
* overflow (when the result is negative).
*
* CAUTION: This function is deprecated because it requires allocating memory for the error
* message unnecessarily. For custom revert reasons use {trySub}.
*
* Counterpart to Solidity's `-` operator.
*
* Requirements:
*
* - Subtraction cannot overflow.
*/
function sub(uint256 a, uint256 b, string memory errorMessage) internal pure returns (uint256) {
unchecked {
require(b <= a, errorMessage);
return a - b;
}
}
/**
* @dev Returns the integer division of two unsigned integers, reverting with custom message on
* division by zero. The result is rounded towards zero.
*
* Counterpart to Solidity's `/` operator. Note: this function uses a
* `revert` opcode (which leaves remaining gas untouched) while Solidity
* uses an invalid opcode to revert (consuming all remaining gas).
*
* Requirements:
*
* - The divisor cannot be zero.
*/
function div(uint256 a, uint256 b, string memory errorMessage) internal pure returns (uint256) {
unchecked {
require(b > 0, errorMessage);
return a / b;
}
}
/**
* @dev Returns the remainder of dividing two unsigned integers. (unsigned integer modulo),
* reverting with custom message when dividing by zero.
*
* CAUTION: This function is deprecated because it requires allocating memory for the error
* message unnecessarily. For custom revert reasons use {tryMod}.
*
* Counterpart to Solidity's `%` operator. This function uses a `revert`
* opcode (which leaves remaining gas untouched) while Solidity uses an
* invalid opcode to revert (consuming all remaining gas).
*
* Requirements:
*
* - The divisor cannot be zero.
*/
function mod(uint256 a, uint256 b, string memory errorMessage) internal pure returns (uint256) {
unchecked {
require(b > 0, errorMessage);
return a % b;
}
}
}// SPDX-License-Identifier: MIT
// OpenZeppelin Contracts (last updated v5.0.0) (access/Ownable.sol)
pragma solidity ^0.8.20;
import {Context} from "../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.
*
* The initial owner is set to the address provided by the deployer. 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;
/**
* @dev The caller account is not authorized to perform an operation.
*/
error OwnableUnauthorizedAccount(address account);
/**
* @dev The owner is not a valid owner account. (eg. `address(0)`)
*/
error OwnableInvalidOwner(address owner);
event OwnershipTransferred(address indexed previousOwner, address indexed newOwner);
/**
* @dev Initializes the contract setting the address provided by the deployer as the initial owner.
*/
constructor(address initialOwner) {
if (initialOwner == address(0)) {
revert OwnableInvalidOwner(address(0));
}
_transferOwnership(initialOwner);
}
/**
* @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 {
if (owner() != _msgSender()) {
revert OwnableUnauthorizedAccount(_msgSender());
}
}
/**
* @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 {
if (newOwner == address(0)) {
revert OwnableInvalidOwner(address(0));
}
_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 v5.1.0) (interfaces/IERC1363.sol)
pragma solidity ^0.8.20;
import {IERC20} from "./IERC20.sol";
import {IERC165} from "./IERC165.sol";
/**
* @title IERC1363
* @dev Interface of the ERC-1363 standard as defined in the https://eips.ethereum.org/EIPS/eip-1363[ERC-1363].
*
* Defines an extension interface for ERC-20 tokens that supports executing code on a recipient contract
* after `transfer` or `transferFrom`, or code on a spender contract after `approve`, in a single transaction.
*/
interface IERC1363 is IERC20, IERC165 {
/*
* Note: the ERC-165 identifier for this interface is 0xb0202a11.
* 0xb0202a11 ===
* bytes4(keccak256('transferAndCall(address,uint256)')) ^
* bytes4(keccak256('transferAndCall(address,uint256,bytes)')) ^
* bytes4(keccak256('transferFromAndCall(address,address,uint256)')) ^
* bytes4(keccak256('transferFromAndCall(address,address,uint256,bytes)')) ^
* bytes4(keccak256('approveAndCall(address,uint256)')) ^
* bytes4(keccak256('approveAndCall(address,uint256,bytes)'))
*/
/**
* @dev Moves a `value` amount of tokens from the caller's account to `to`
* and then calls {IERC1363Receiver-onTransferReceived} on `to`.
* @param to The address which you want to transfer to.
* @param value The amount of tokens to be transferred.
* @return A boolean value indicating whether the operation succeeded unless throwing.
*/
function transferAndCall(address to, uint256 value) external returns (bool);
/**
* @dev Moves a `value` amount of tokens from the caller's account to `to`
* and then calls {IERC1363Receiver-onTransferReceived} on `to`.
* @param to The address which you want to transfer to.
* @param value The amount of tokens to be transferred.
* @param data Additional data with no specified format, sent in call to `to`.
* @return A boolean value indicating whether the operation succeeded unless throwing.
*/
function transferAndCall(address to, uint256 value, bytes calldata data) external returns (bool);
/**
* @dev Moves a `value` amount of tokens from `from` to `to` using the allowance mechanism
* and then calls {IERC1363Receiver-onTransferReceived} on `to`.
* @param from The address which you want to send tokens from.
* @param to The address which you want to transfer to.
* @param value The amount of tokens to be transferred.
* @return A boolean value indicating whether the operation succeeded unless throwing.
*/
function transferFromAndCall(address from, address to, uint256 value) external returns (bool);
/**
* @dev Moves a `value` amount of tokens from `from` to `to` using the allowance mechanism
* and then calls {IERC1363Receiver-onTransferReceived} on `to`.
* @param from The address which you want to send tokens from.
* @param to The address which you want to transfer to.
* @param value The amount of tokens to be transferred.
* @param data Additional data with no specified format, sent in call to `to`.
* @return A boolean value indicating whether the operation succeeded unless throwing.
*/
function transferFromAndCall(address from, address to, uint256 value, bytes calldata data) external returns (bool);
/**
* @dev Sets a `value` amount of tokens as the allowance of `spender` over the
* caller's tokens and then calls {IERC1363Spender-onApprovalReceived} on `spender`.
* @param spender The address which will spend the funds.
* @param value The amount of tokens to be spent.
* @return A boolean value indicating whether the operation succeeded unless throwing.
*/
function approveAndCall(address spender, uint256 value) external returns (bool);
/**
* @dev Sets a `value` amount of tokens as the allowance of `spender` over the
* caller's tokens and then calls {IERC1363Spender-onApprovalReceived} on `spender`.
* @param spender The address which will spend the funds.
* @param value The amount of tokens to be spent.
* @param data Additional data with no specified format, sent in call to `spender`.
* @return A boolean value indicating whether the operation succeeded unless throwing.
*/
function approveAndCall(address spender, uint256 value, bytes calldata data) external returns (bool);
}// SPDX-License-Identifier: MIT
// OpenZeppelin Contracts (last updated v5.0.1) (utils/Context.sol)
pragma solidity ^0.8.20;
/**
* @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: MIT
// OpenZeppelin Contracts (last updated v5.0.0) (interfaces/IERC165.sol)
pragma solidity ^0.8.20;
import {IERC165} from "../utils/introspection/IERC165.sol";// SPDX-License-Identifier: MIT
// OpenZeppelin Contracts (last updated v5.0.0) (interfaces/IERC20.sol)
pragma solidity ^0.8.20;
import {IERC20} from "../token/ERC20/IERC20.sol";// SPDX-License-Identifier: MIT
// OpenZeppelin Contracts (last updated v5.1.0) (utils/introspection/IERC165.sol)
pragma solidity ^0.8.20;
/**
* @dev Interface of the ERC-165 standard, as defined in the
* https://eips.ethereum.org/EIPS/eip-165[ERC].
*
* Implementers can declare support of contract interfaces, which can then be
* queried by others ({ERC165Checker}).
*
* For an implementation, see {ERC165}.
*/
interface IERC165 {
/**
* @dev Returns true if this contract implements the interface defined by
* `interfaceId`. See the corresponding
* https://eips.ethereum.org/EIPS/eip-165#how-interfaces-are-identified[ERC section]
* to learn more about how these ids are created.
*
* This function call must use less than 30 000 gas.
*/
function supportsInterface(bytes4 interfaceId) external view returns (bool);
}{
"optimizer": {
"enabled": false,
"runs": 200
},
"outputSelection": {
"*": {
"*": [
"evm.bytecode",
"evm.deployedBytecode",
"devdoc",
"userdoc",
"metadata",
"abi"
]
}
},
"remappings": []
}Contract Security Audit
- No Contract Security Audit Submitted- Submit Audit Here
Contract ABI
API[{"inputs":[{"internalType":"address","name":"_tokenAddress","type":"address"},{"internalType":"address","name":"_owner","type":"address"},{"internalType":"uint256","name":"_usdtPrice","type":"uint256"}],"stateMutability":"nonpayable","type":"constructor"},{"inputs":[{"internalType":"address","name":"owner","type":"address"}],"name":"OwnableInvalidOwner","type":"error"},{"inputs":[{"internalType":"address","name":"account","type":"address"}],"name":"OwnableUnauthorizedAccount","type":"error"},{"inputs":[{"internalType":"address","name":"token","type":"address"}],"name":"SafeERC20FailedOperation","type":"error"},{"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":"uint256","name":"newPrice","type":"uint256"}],"name":"PriceUpdated","type":"event"},{"anonymous":false,"inputs":[],"name":"SaleStarted","type":"event"},{"anonymous":false,"inputs":[],"name":"SaleStopped","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"user","type":"address"},{"indexed":false,"internalType":"uint256","name":"amountPaid","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"tokensReceived","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"pricePerToken","type":"uint256"}],"name":"TokenPurchased","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"to","type":"address"},{"indexed":true,"internalType":"address","name":"from","type":"address"},{"indexed":false,"internalType":"uint256","name":"amount","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"timestamp","type":"uint256"}],"name":"TokensWithdrawn","type":"event"},{"inputs":[],"name":"PRICE_INCREMENT_INTERVAL","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"PRICE_INCREMENT_PERCENTAGE","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"Tax_Percentage","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"_taxRecipentAddress","type":"address"}],"name":"UpdatetaxRecipentAddress","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_amount","type":"uint256"},{"internalType":"enum TribeICO.PaymentType","name":"_pay","type":"uint8"}],"name":"buy","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_amount","type":"uint256"},{"internalType":"enum TribeICO.PaymentType","name":"_pay","type":"uint8"}],"name":"calculateToken","outputs":[{"internalType":"uint256","name":"_transferAble","type":"uint256"},{"internalType":"uint256","name":"_tax","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"fundsRecipentAddress","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"getCurrentPrice","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"getSaleInfo","outputs":[{"internalType":"uint256","name":"_IcoBalance","type":"uint256"},{"internalType":"uint256","name":"_saleCounter","type":"uint256"},{"internalType":"uint256","name":"_totalRaisedUSDT","type":"uint256"},{"internalType":"uint256","name":"_totalRaisedUSDC","type":"uint256"},{"internalType":"uint256","name":"_totalRaisedFDUSD","type":"uint256"},{"internalType":"uint256","name":"_totalRaisedBUSD","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"user","type":"address"}],"name":"getUserTransactionHistory","outputs":[{"components":[{"internalType":"uint256","name":"timestamp","type":"uint256"},{"internalType":"uint256","name":"amountPaid","type":"uint256"},{"internalType":"uint256","name":"tokensReceived","type":"uint256"},{"internalType":"uint256","name":"pricePerToken","type":"uint256"}],"internalType":"struct TribeICO.Transaction[]","name":"","type":"tuple[]"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"owner","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"renounceOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"saleStatus","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"startSale","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"taxRecipentAddress","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"tokenAddress","outputs":[{"internalType":"contract IERC20","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"enum TribeICO.PaymentType","name":"","type":"uint8"}],"name":"tokenAddresses","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"tokenSold","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"newOwner","type":"address"}],"name":"transferOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"_fundsRecipentAddress","type":"address"}],"name":"updateFundsRecipentAddress","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_updatetPercentage","type":"uint256"}],"name":"updatePriceIncrementPercentage","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bool","name":"_saleStatus","type":"bool"}],"name":"updateSaleStatus","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_updatetPercentage","type":"uint256"}],"name":"updateTexPrecenatge","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"contract IERC20","name":"_token","type":"address"}],"name":"updateToken","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"_addeess","type":"address"},{"internalType":"enum TribeICO.PaymentType","name":"_pay","type":"uint8"}],"name":"updateTokensAddresses","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"_address","type":"address"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"amount","type":"uint256"}],"name":"withdrawLockFunds","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"_to","type":"address"},{"internalType":"uint256","name":"_amount","type":"uint256"}],"name":"withdrawUnSoldTokens","outputs":[],"stateMutability":"nonpayable","type":"function"}]Contract Creation Code
608060405273c728595c1ae60dfa2db7f20bbfdbef649d7c278360065f6101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555073acdcaa25ff0590754add4ed8a9a1980ebb2b3c1660075f6101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550620d2f006009556005600a556005600b553480156100c8575f80fd5b5060405161288238038061288283398181016040528101906100ea919061053a565b815f73ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff160361015b575f6040517f1e4fbdf70000000000000000000000000000000000000000000000000000000081526004016101529190610599565b60405180910390fd5b61016a816101c860201b60201c565b508260035f6101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550806002819055506101c061028960201b60201c565b5050506105df565b5f805f9054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050815f806101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508173ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a35050565b73dac17f958d2ee523a2206206994597c13d831ec760015f8060038111156102b4576102b36105b2565b5b60038111156102c6576102c56105b2565b5b81526020019081526020015f205f6101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555073a0b86991c6218b36c1d19d4a2e9eb0ce3606eb4860015f6001600381111561033c5761033b6105b2565b5b600381111561034e5761034d6105b2565b5b81526020019081526020015f205f6101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555073c5f0f7b66764f6ec8c8dff7ba683102295e1640960015f600260038111156103c4576103c36105b2565b5b60038111156103d6576103d56105b2565b5b81526020019081526020015f205f6101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550734fabb145d64652a948d72533023f6e7a623c7c5360015f60038081111561044b5761044a6105b2565b5b600381111561045d5761045c6105b2565b5b81526020019081526020015f205f6101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550565b5f80fd5b5f73ffffffffffffffffffffffffffffffffffffffff82169050919050565b5f6104d6826104ad565b9050919050565b6104e6816104cc565b81146104f0575f80fd5b50565b5f81519050610501816104dd565b92915050565b5f819050919050565b61051981610507565b8114610523575f80fd5b50565b5f8151905061053481610510565b92915050565b5f805f60608486031215610551576105506104a9565b5b5f61055e868287016104f3565b935050602061056f868287016104f3565b925050604061058086828701610526565b9150509250925092565b610593816104cc565b82525050565b5f6020820190506105ac5f83018461058a565b92915050565b7f4e487b71000000000000000000000000000000000000000000000000000000005f52602160045260245ffd5b612296806105ec5f395ff3fe608060405234801561000f575f80fd5b50600436106101a7575f3560e01c80639d76ea58116100f7578063dffb64c611610095578063ed6b2da41161006f578063ed6b2da41461044a578063f2fde38b14610468578063f9020e3314610484578063f9a138e0146104a2576101a7565b8063dffb64c6146103f4578063e90bc7b114610410578063eb91d37e1461042c576101a7565b8063c51309db116100d1578063c51309db14610355578063c854b44a14610385578063cf0d7437146103a1578063db83694c146103d1576101a7565b80639d76ea581461030f578063b66a0e5d1461032d578063bcb6c53b14610337576101a7565b80636db505eb11610164578063869ee9a81161013e578063869ee9a81461029b5780638b309f0a146102b95780638da5cb5b146102d55780639bbfb082146102f3576101a7565b80636db505eb14610259578063715018a6146102755780637ad3def21461027f576101a7565b80630a088949146101ab5780630ff77cab146101c75780631d3e7235146101e35780631f108a82146101ff57806332504cba1461021d578063519ee19e1461023b575b5f80fd5b6101c560048036038101906101c09190611873565b6104d3565b005b6101e160048036038101906101dc919061191b565b61052e565b005b6101fd60048036038101906101f89190611959565b6105ad565b005b6102076105f8565b604051610214919061199c565b60405180910390f35b6102256105fe565b60405161023291906119c4565b60405180910390f35b610243610623565b604051610250919061199c565b60405180910390f35b610273600480360381019061026e9190611a07565b61062c565b005b61027d610769565b005b61029960048036038101906102949190611a80565b61077c565b005b6102a36107c7565b6040516102b0919061199c565b60405180910390f35b6102d360048036038101906102ce9190611959565b6107cd565b005b6102dd610818565b6040516102ea91906119c4565b60405180910390f35b61030d60048036038101906103089190611aab565b61083f565b005b610317610851565b6040516103249190611b31565b60405180910390f35b610335610876565b005b61033f610923565b60405161034c91906119c4565b60405180910390f35b61036f600480360381019061036a9190611959565b610948565b60405161037c9190611c54565b60405180910390f35b61039f600480360381019061039a9190611aab565b610a08565b005b6103bb60048036038101906103b69190611c74565b610a1a565b6040516103c891906119c4565b60405180910390f35b6103d9610a4a565b6040516103eb96959493929190611c9f565b60405180910390f35b61040e60048036038101906104099190611cfe565b610bda565b005b61042a60048036038101906104259190611d4e565b610d84565b005b610434611200565b604051610441919061199c565b60405180910390f35b6104526112ae565b60405161045f919061199c565b60405180910390f35b610482600480360381019061047d9190611959565b6112b4565b005b61048c611338565b6040516104999190611d9b565b60405180910390f35b6104bc60048036038101906104b79190611d4e565b61134a565b6040516104ca929190611db4565b60405180910390f35b6104db61148f565b8015155f60149054906101000a900460ff161515031561052b57805f60146101000a81548160ff0219169083151502179055505f60149054906101000a900460ff161561052a57426008819055505b5b50565b61053661148f565b8160015f83600381111561054d5761054c611ddb565b5b600381111561055f5761055e611ddb565b5b81526020019081526020015f205f6101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055505050565b6105b561148f565b8060065f6101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555050565b600a5481565b60075f9054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b5f600554905090565b61063461148f565b5f811180156106da57508060035f9054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff166370a08231306040518263ffffffff1660e01b815260040161069991906119c4565b602060405180830381865afa1580156106b4573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906106d89190611e1c565b115b610719576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161071090611ea1565b60405180910390fd5b610765828260035f9054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff166115169092919063ffffffff16565b5050565b61077161148f565b61077a5f611595565b565b61078461148f565b8060035f6101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555050565b60095481565b6107d561148f565b8060075f6101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555050565b5f805f9054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905090565b61084761148f565b80600b8190555050565b60035f9054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b61087e61148f565b5f60149054906101000a900460ff16156108cd576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016108c490611f09565b60405180910390fd5b60015f60146101000a81548160ff0219169083151502179055505f600481905550426008819055507f912ee23dde46ec889d6748212cce445d667f7041597691dc89e8549ad8bc0acb60405160405180910390a1565b60065f9054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b6060600d5f8373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f20805480602002602001604051908101604052809291908181526020015f905b828210156109fd578382905f5260205f2090600402016040518060800160405290815f82015481526020016001820154815260200160028201548152602001600382015481525050815260200190600101906109a6565b505050509050919050565b610a1061148f565b80600a8190555050565b6001602052805f5260405f205f915054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b5f805f805f8060035f9054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff166370a08231306040518263ffffffff1660e01b8152600401610aaa91906119c4565b602060405180830381865afa158015610ac5573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190610ae99190611e1c565b600454600c5f806003811115610b0257610b01611ddb565b5b6003811115610b1457610b13611ddb565b5b81526020019081526020015f2054600c5f60016003811115610b3957610b38611ddb565b5b6003811115610b4b57610b4a611ddb565b5b81526020019081526020015f2054600c5f60026003811115610b7057610b6f611ddb565b5b6003811115610b8257610b81611ddb565b5b81526020019081526020015f2054600c5f600380811115610ba657610ba5611ddb565b5b6003811115610bb857610bb7611ddb565b5b81526020019081526020015f2054955095509550955095509550909192939495565b610be261148f565b808373ffffffffffffffffffffffffffffffffffffffff166370a08231306040518263ffffffff1660e01b8152600401610c1c91906119c4565b602060405180830381865afa158015610c37573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190610c5b9190611e1c565b1015610c9c576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610c9390611f71565b60405180910390fd5b8273ffffffffffffffffffffffffffffffffffffffff1663a9059cbb83836040518363ffffffff1660e01b8152600401610cd7929190611f8f565b6020604051808303815f875af1158015610cf3573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190610d179190611fca565b508173ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff167f6b83b455c317523498e4e86849438d4356ad79ba6b355a5e6d5bc05eca6c780f8342604051610d77929190611db4565b60405180910390a3505050565b5f15155f60149054906101000a900460ff16151503610dd8576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610dcf9061203f565b60405180910390fd5b5f60015f836003811115610def57610dee611ddb565b5b6003811115610e0157610e00611ddb565b5b81526020019081526020015f205f9054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050610e7e3360065f9054906101000a900473ffffffffffffffffffffffffffffffffffffffff16858473ffffffffffffffffffffffffffffffffffffffff16611656909392919063ffffffff16565b610e866116d8565b505f80610e93858561134a565b91509150610edf85600c5f876003811115610eb157610eb0611ddb565b5b6003811115610ec357610ec2611ddb565b5b81526020019081526020015f205461175990919063ffffffff16565b600c5f866003811115610ef557610ef4611ddb565b5b6003811115610f0757610f06611ddb565b5b81526020019081526020015f20819055505f610f2c828461175990919063ffffffff16565b90508060035f9054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff166370a08231306040518263ffffffff1660e01b8152600401610f8991906119c4565b602060405180830381865afa158015610fa4573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190610fc89190611e1c565b1015611009576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611000906120a7565b60405180910390fd5b611055338460035f9054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff166115169092919063ffffffff16565b6110c260075f9054906101000a900473ffffffffffffffffffffffffffffffffffffffff168360035f9054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff166115169092919063ffffffff16565b6110d78160055461175990919063ffffffff16565b600581905550600160045f8282546110ef91906120f2565b92505081905550600d5f3373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f206040518060800160405280428152602001888152602001858152602001600254815250908060018154018082558091505060019003905f5260205f2090600402015f909190919091505f820151815f015560208201518160010155604082015181600201556060820151816003015550503373ffffffffffffffffffffffffffffffffffffffff167f2b0c4dfbf2e34a2292e9110d6ea90d7c78f54b3aebe3974d2db7197308f21ff887856002546040516111f093929190612125565b60405180910390a2505050505050565b5f8060149054906101000a900460ff1661121e5760025490506112ab565b5f60025490505f60085442611233919061215a565b905060095481106112a5575f6009548261124d91906121ba565b90505f5b818110156112a2576112936112846064611276600a548861176e90919063ffffffff16565b61178390919063ffffffff16565b8561175990919063ffffffff16565b93508080600101915050611251565b50505b81925050505b90565b600b5481565b6112bc61148f565b5f73ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff160361132c575f6040517f1e4fbdf700000000000000000000000000000000000000000000000000000000815260040161132391906119c4565b60405180910390fd5b61133581611595565b50565b5f60149054906101000a900460ff1681565b5f805f611355611200565b90505f80600381111561136b5761136a611ddb565b5b85600381111561137e5761137d611ddb565b5b14806113ae57506001600381111561139957611398611ddb565b5b8560038111156113ac576113ab611ddb565b5b145b156113d95781670de0b6b3a7640000876113c891906121ea565b6113d291906121ba565b9050611452565b600260038111156113ed576113ec611ddb565b5b856003811115611400576113ff611ddb565b5b148061142f575060038081111561141a57611419611ddb565b5b85600381111561142d5761142c611ddb565b5b145b156114515781620f42408761144491906121ea565b61144e91906121ba565b90505b5b5f6064600b548361146391906121ea565b61146d91906121ba565b90505f818361147c919061215a565b9050808295509550505050509250929050565b611497611798565b73ffffffffffffffffffffffffffffffffffffffff166114b5610818565b73ffffffffffffffffffffffffffffffffffffffff1614611514576114d8611798565b6040517f118cdaa700000000000000000000000000000000000000000000000000000000815260040161150b91906119c4565b60405180910390fd5b565b611590838473ffffffffffffffffffffffffffffffffffffffff1663a9059cbb8585604051602401611549929190611f8f565b604051602081830303815290604052915060e01b6020820180517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff838183161783525050505061179f565b505050565b5f805f9054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050815f806101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508173ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a35050565b6116d2848573ffffffffffffffffffffffffffffffffffffffff166323b872dd86868660405160240161168b9392919061222b565b604051602081830303815290604052915060e01b6020820180517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff838183161783525050505061179f565b50505050565b5f806116e2611200565b9050600254811115611749575f600854426116fd919061215a565b90505f6009548261170e91906121ba565b90508260028190555061174061172f6009548361176e90919063ffffffff16565b60085461175990919063ffffffff16565b60088190555050505b8060028190555060025491505090565b5f818361176691906120f2565b905092915050565b5f818361177b91906121ea565b905092915050565b5f818361179091906121ba565b905092915050565b5f33905090565b5f8060205f8451602086015f885af1806117be576040513d5f823e3d81fd5b3d92505f519150505f82146117d75760018114156117f2565b5f8473ffffffffffffffffffffffffffffffffffffffff163b145b1561183457836040517f5274afe700000000000000000000000000000000000000000000000000000000815260040161182b91906119c4565b60405180910390fd5b50505050565b5f80fd5b5f8115159050919050565b6118528161183e565b811461185c575f80fd5b50565b5f8135905061186d81611849565b92915050565b5f602082840312156118885761188761183a565b5b5f6118958482850161185f565b91505092915050565b5f73ffffffffffffffffffffffffffffffffffffffff82169050919050565b5f6118c78261189e565b9050919050565b6118d7816118bd565b81146118e1575f80fd5b50565b5f813590506118f2816118ce565b92915050565b60048110611904575f80fd5b50565b5f81359050611915816118f8565b92915050565b5f80604083850312156119315761193061183a565b5b5f61193e858286016118e4565b925050602061194f85828601611907565b9150509250929050565b5f6020828403121561196e5761196d61183a565b5b5f61197b848285016118e4565b91505092915050565b5f819050919050565b61199681611984565b82525050565b5f6020820190506119af5f83018461198d565b92915050565b6119be816118bd565b82525050565b5f6020820190506119d75f8301846119b5565b92915050565b6119e681611984565b81146119f0575f80fd5b50565b5f81359050611a01816119dd565b92915050565b5f8060408385031215611a1d57611a1c61183a565b5b5f611a2a858286016118e4565b9250506020611a3b858286016119f3565b9150509250929050565b5f611a4f826118bd565b9050919050565b611a5f81611a45565b8114611a69575f80fd5b50565b5f81359050611a7a81611a56565b92915050565b5f60208284031215611a9557611a9461183a565b5b5f611aa284828501611a6c565b91505092915050565b5f60208284031215611ac057611abf61183a565b5b5f611acd848285016119f3565b91505092915050565b5f819050919050565b5f611af9611af4611aef8461189e565b611ad6565b61189e565b9050919050565b5f611b0a82611adf565b9050919050565b5f611b1b82611b00565b9050919050565b611b2b81611b11565b82525050565b5f602082019050611b445f830184611b22565b92915050565b5f81519050919050565b5f82825260208201905092915050565b5f819050602082019050919050565b611b7c81611984565b82525050565b608082015f820151611b965f850182611b73565b506020820151611ba96020850182611b73565b506040820151611bbc6040850182611b73565b506060820151611bcf6060850182611b73565b50505050565b5f611be08383611b82565b60808301905092915050565b5f602082019050919050565b5f611c0282611b4a565b611c0c8185611b54565b9350611c1783611b64565b805f5b83811015611c47578151611c2e8882611bd5565b9750611c3983611bec565b925050600181019050611c1a565b5085935050505092915050565b5f6020820190508181035f830152611c6c8184611bf8565b905092915050565b5f60208284031215611c8957611c8861183a565b5b5f611c9684828501611907565b91505092915050565b5f60c082019050611cb25f83018961198d565b611cbf602083018861198d565b611ccc604083018761198d565b611cd9606083018661198d565b611ce6608083018561198d565b611cf360a083018461198d565b979650505050505050565b5f805f60608486031215611d1557611d1461183a565b5b5f611d22868287016118e4565b9350506020611d33868287016118e4565b9250506040611d44868287016119f3565b9150509250925092565b5f8060408385031215611d6457611d6361183a565b5b5f611d71858286016119f3565b9250506020611d8285828601611907565b9150509250929050565b611d958161183e565b82525050565b5f602082019050611dae5f830184611d8c565b92915050565b5f604082019050611dc75f83018561198d565b611dd4602083018461198d565b9392505050565b7f4e487b71000000000000000000000000000000000000000000000000000000005f52602160045260245ffd5b5f81519050611e16816119dd565b92915050565b5f60208284031215611e3157611e3061183a565b5b5f611e3e84828501611e08565b91505092915050565b5f82825260208201905092915050565b7f4e6f7420656e6f7567682062616c616e636500000000000000000000000000005f82015250565b5f611e8b601283611e47565b9150611e9682611e57565b602082019050919050565b5f6020820190508181035f830152611eb881611e7f565b9050919050565b7f53616c6520697320616c726561647920737461727465640000000000000000005f82015250565b5f611ef3601783611e47565b9150611efe82611ebf565b602082019050919050565b5f6020820190508181035f830152611f2081611ee7565b9050919050565b7f496e73756666696369656e742062616c616e63650000000000000000000000005f82015250565b5f611f5b601483611e47565b9150611f6682611f27565b602082019050919050565b5f6020820190508181035f830152611f8881611f4f565b9050919050565b5f604082019050611fa25f8301856119b5565b611faf602083018461198d565b9392505050565b5f81519050611fc481611849565b92915050565b5f60208284031215611fdf57611fde61183a565b5b5f611fec84828501611fb6565b91505092915050565b7f53616c6520697320436c6f7365640000000000000000000000000000000000005f82015250565b5f612029600e83611e47565b915061203482611ff5565b602082019050919050565b5f6020820190508181035f8301526120568161201d565b9050919050565b7f496e73756666696369656e7420746f6b656e2062616c616e63650000000000005f82015250565b5f612091601a83611e47565b915061209c8261205d565b602082019050919050565b5f6020820190508181035f8301526120be81612085565b9050919050565b7f4e487b71000000000000000000000000000000000000000000000000000000005f52601160045260245ffd5b5f6120fc82611984565b915061210783611984565b925082820190508082111561211f5761211e6120c5565b5b92915050565b5f6060820190506121385f83018661198d565b612145602083018561198d565b612152604083018461198d565b949350505050565b5f61216482611984565b915061216f83611984565b9250828203905081811115612187576121866120c5565b5b92915050565b7f4e487b71000000000000000000000000000000000000000000000000000000005f52601260045260245ffd5b5f6121c482611984565b91506121cf83611984565b9250826121df576121de61218d565b5b828204905092915050565b5f6121f482611984565b91506121ff83611984565b925082820261220d81611984565b91508282048414831517612224576122236120c5565b5b5092915050565b5f60608201905061223e5f8301866119b5565b61224b60208301856119b5565b612258604083018461198d565b94935050505056fea2646970667358221220a9add42961c0fe143472644dfae17eb13f91b5e238c2af3ae8607236e0268eee64736f6c634300081a0033000000000000000000000000f23e88fe67d026b37964a0d9faa9e76b45a97c270000000000000000000000002cc312f73f34bcdada7d7589cb3074c7dc06ebe9000000000000000000000000000000000000000000000000000000000000227c
Deployed Bytecode
0x608060405234801561000f575f80fd5b50600436106101a7575f3560e01c80639d76ea58116100f7578063dffb64c611610095578063ed6b2da41161006f578063ed6b2da41461044a578063f2fde38b14610468578063f9020e3314610484578063f9a138e0146104a2576101a7565b8063dffb64c6146103f4578063e90bc7b114610410578063eb91d37e1461042c576101a7565b8063c51309db116100d1578063c51309db14610355578063c854b44a14610385578063cf0d7437146103a1578063db83694c146103d1576101a7565b80639d76ea581461030f578063b66a0e5d1461032d578063bcb6c53b14610337576101a7565b80636db505eb11610164578063869ee9a81161013e578063869ee9a81461029b5780638b309f0a146102b95780638da5cb5b146102d55780639bbfb082146102f3576101a7565b80636db505eb14610259578063715018a6146102755780637ad3def21461027f576101a7565b80630a088949146101ab5780630ff77cab146101c75780631d3e7235146101e35780631f108a82146101ff57806332504cba1461021d578063519ee19e1461023b575b5f80fd5b6101c560048036038101906101c09190611873565b6104d3565b005b6101e160048036038101906101dc919061191b565b61052e565b005b6101fd60048036038101906101f89190611959565b6105ad565b005b6102076105f8565b604051610214919061199c565b60405180910390f35b6102256105fe565b60405161023291906119c4565b60405180910390f35b610243610623565b604051610250919061199c565b60405180910390f35b610273600480360381019061026e9190611a07565b61062c565b005b61027d610769565b005b61029960048036038101906102949190611a80565b61077c565b005b6102a36107c7565b6040516102b0919061199c565b60405180910390f35b6102d360048036038101906102ce9190611959565b6107cd565b005b6102dd610818565b6040516102ea91906119c4565b60405180910390f35b61030d60048036038101906103089190611aab565b61083f565b005b610317610851565b6040516103249190611b31565b60405180910390f35b610335610876565b005b61033f610923565b60405161034c91906119c4565b60405180910390f35b61036f600480360381019061036a9190611959565b610948565b60405161037c9190611c54565b60405180910390f35b61039f600480360381019061039a9190611aab565b610a08565b005b6103bb60048036038101906103b69190611c74565b610a1a565b6040516103c891906119c4565b60405180910390f35b6103d9610a4a565b6040516103eb96959493929190611c9f565b60405180910390f35b61040e60048036038101906104099190611cfe565b610bda565b005b61042a60048036038101906104259190611d4e565b610d84565b005b610434611200565b604051610441919061199c565b60405180910390f35b6104526112ae565b60405161045f919061199c565b60405180910390f35b610482600480360381019061047d9190611959565b6112b4565b005b61048c611338565b6040516104999190611d9b565b60405180910390f35b6104bc60048036038101906104b79190611d4e565b61134a565b6040516104ca929190611db4565b60405180910390f35b6104db61148f565b8015155f60149054906101000a900460ff161515031561052b57805f60146101000a81548160ff0219169083151502179055505f60149054906101000a900460ff161561052a57426008819055505b5b50565b61053661148f565b8160015f83600381111561054d5761054c611ddb565b5b600381111561055f5761055e611ddb565b5b81526020019081526020015f205f6101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055505050565b6105b561148f565b8060065f6101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555050565b600a5481565b60075f9054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b5f600554905090565b61063461148f565b5f811180156106da57508060035f9054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff166370a08231306040518263ffffffff1660e01b815260040161069991906119c4565b602060405180830381865afa1580156106b4573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906106d89190611e1c565b115b610719576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161071090611ea1565b60405180910390fd5b610765828260035f9054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff166115169092919063ffffffff16565b5050565b61077161148f565b61077a5f611595565b565b61078461148f565b8060035f6101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555050565b60095481565b6107d561148f565b8060075f6101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555050565b5f805f9054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905090565b61084761148f565b80600b8190555050565b60035f9054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b61087e61148f565b5f60149054906101000a900460ff16156108cd576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016108c490611f09565b60405180910390fd5b60015f60146101000a81548160ff0219169083151502179055505f600481905550426008819055507f912ee23dde46ec889d6748212cce445d667f7041597691dc89e8549ad8bc0acb60405160405180910390a1565b60065f9054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b6060600d5f8373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f20805480602002602001604051908101604052809291908181526020015f905b828210156109fd578382905f5260205f2090600402016040518060800160405290815f82015481526020016001820154815260200160028201548152602001600382015481525050815260200190600101906109a6565b505050509050919050565b610a1061148f565b80600a8190555050565b6001602052805f5260405f205f915054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b5f805f805f8060035f9054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff166370a08231306040518263ffffffff1660e01b8152600401610aaa91906119c4565b602060405180830381865afa158015610ac5573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190610ae99190611e1c565b600454600c5f806003811115610b0257610b01611ddb565b5b6003811115610b1457610b13611ddb565b5b81526020019081526020015f2054600c5f60016003811115610b3957610b38611ddb565b5b6003811115610b4b57610b4a611ddb565b5b81526020019081526020015f2054600c5f60026003811115610b7057610b6f611ddb565b5b6003811115610b8257610b81611ddb565b5b81526020019081526020015f2054600c5f600380811115610ba657610ba5611ddb565b5b6003811115610bb857610bb7611ddb565b5b81526020019081526020015f2054955095509550955095509550909192939495565b610be261148f565b808373ffffffffffffffffffffffffffffffffffffffff166370a08231306040518263ffffffff1660e01b8152600401610c1c91906119c4565b602060405180830381865afa158015610c37573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190610c5b9190611e1c565b1015610c9c576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610c9390611f71565b60405180910390fd5b8273ffffffffffffffffffffffffffffffffffffffff1663a9059cbb83836040518363ffffffff1660e01b8152600401610cd7929190611f8f565b6020604051808303815f875af1158015610cf3573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190610d179190611fca565b508173ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff167f6b83b455c317523498e4e86849438d4356ad79ba6b355a5e6d5bc05eca6c780f8342604051610d77929190611db4565b60405180910390a3505050565b5f15155f60149054906101000a900460ff16151503610dd8576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610dcf9061203f565b60405180910390fd5b5f60015f836003811115610def57610dee611ddb565b5b6003811115610e0157610e00611ddb565b5b81526020019081526020015f205f9054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050610e7e3360065f9054906101000a900473ffffffffffffffffffffffffffffffffffffffff16858473ffffffffffffffffffffffffffffffffffffffff16611656909392919063ffffffff16565b610e866116d8565b505f80610e93858561134a565b91509150610edf85600c5f876003811115610eb157610eb0611ddb565b5b6003811115610ec357610ec2611ddb565b5b81526020019081526020015f205461175990919063ffffffff16565b600c5f866003811115610ef557610ef4611ddb565b5b6003811115610f0757610f06611ddb565b5b81526020019081526020015f20819055505f610f2c828461175990919063ffffffff16565b90508060035f9054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff166370a08231306040518263ffffffff1660e01b8152600401610f8991906119c4565b602060405180830381865afa158015610fa4573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190610fc89190611e1c565b1015611009576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611000906120a7565b60405180910390fd5b611055338460035f9054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff166115169092919063ffffffff16565b6110c260075f9054906101000a900473ffffffffffffffffffffffffffffffffffffffff168360035f9054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff166115169092919063ffffffff16565b6110d78160055461175990919063ffffffff16565b600581905550600160045f8282546110ef91906120f2565b92505081905550600d5f3373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f206040518060800160405280428152602001888152602001858152602001600254815250908060018154018082558091505060019003905f5260205f2090600402015f909190919091505f820151815f015560208201518160010155604082015181600201556060820151816003015550503373ffffffffffffffffffffffffffffffffffffffff167f2b0c4dfbf2e34a2292e9110d6ea90d7c78f54b3aebe3974d2db7197308f21ff887856002546040516111f093929190612125565b60405180910390a2505050505050565b5f8060149054906101000a900460ff1661121e5760025490506112ab565b5f60025490505f60085442611233919061215a565b905060095481106112a5575f6009548261124d91906121ba565b90505f5b818110156112a2576112936112846064611276600a548861176e90919063ffffffff16565b61178390919063ffffffff16565b8561175990919063ffffffff16565b93508080600101915050611251565b50505b81925050505b90565b600b5481565b6112bc61148f565b5f73ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff160361132c575f6040517f1e4fbdf700000000000000000000000000000000000000000000000000000000815260040161132391906119c4565b60405180910390fd5b61133581611595565b50565b5f60149054906101000a900460ff1681565b5f805f611355611200565b90505f80600381111561136b5761136a611ddb565b5b85600381111561137e5761137d611ddb565b5b14806113ae57506001600381111561139957611398611ddb565b5b8560038111156113ac576113ab611ddb565b5b145b156113d95781670de0b6b3a7640000876113c891906121ea565b6113d291906121ba565b9050611452565b600260038111156113ed576113ec611ddb565b5b856003811115611400576113ff611ddb565b5b148061142f575060038081111561141a57611419611ddb565b5b85600381111561142d5761142c611ddb565b5b145b156114515781620f42408761144491906121ea565b61144e91906121ba565b90505b5b5f6064600b548361146391906121ea565b61146d91906121ba565b90505f818361147c919061215a565b9050808295509550505050509250929050565b611497611798565b73ffffffffffffffffffffffffffffffffffffffff166114b5610818565b73ffffffffffffffffffffffffffffffffffffffff1614611514576114d8611798565b6040517f118cdaa700000000000000000000000000000000000000000000000000000000815260040161150b91906119c4565b60405180910390fd5b565b611590838473ffffffffffffffffffffffffffffffffffffffff1663a9059cbb8585604051602401611549929190611f8f565b604051602081830303815290604052915060e01b6020820180517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff838183161783525050505061179f565b505050565b5f805f9054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050815f806101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508173ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a35050565b6116d2848573ffffffffffffffffffffffffffffffffffffffff166323b872dd86868660405160240161168b9392919061222b565b604051602081830303815290604052915060e01b6020820180517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff838183161783525050505061179f565b50505050565b5f806116e2611200565b9050600254811115611749575f600854426116fd919061215a565b90505f6009548261170e91906121ba565b90508260028190555061174061172f6009548361176e90919063ffffffff16565b60085461175990919063ffffffff16565b60088190555050505b8060028190555060025491505090565b5f818361176691906120f2565b905092915050565b5f818361177b91906121ea565b905092915050565b5f818361179091906121ba565b905092915050565b5f33905090565b5f8060205f8451602086015f885af1806117be576040513d5f823e3d81fd5b3d92505f519150505f82146117d75760018114156117f2565b5f8473ffffffffffffffffffffffffffffffffffffffff163b145b1561183457836040517f5274afe700000000000000000000000000000000000000000000000000000000815260040161182b91906119c4565b60405180910390fd5b50505050565b5f80fd5b5f8115159050919050565b6118528161183e565b811461185c575f80fd5b50565b5f8135905061186d81611849565b92915050565b5f602082840312156118885761188761183a565b5b5f6118958482850161185f565b91505092915050565b5f73ffffffffffffffffffffffffffffffffffffffff82169050919050565b5f6118c78261189e565b9050919050565b6118d7816118bd565b81146118e1575f80fd5b50565b5f813590506118f2816118ce565b92915050565b60048110611904575f80fd5b50565b5f81359050611915816118f8565b92915050565b5f80604083850312156119315761193061183a565b5b5f61193e858286016118e4565b925050602061194f85828601611907565b9150509250929050565b5f6020828403121561196e5761196d61183a565b5b5f61197b848285016118e4565b91505092915050565b5f819050919050565b61199681611984565b82525050565b5f6020820190506119af5f83018461198d565b92915050565b6119be816118bd565b82525050565b5f6020820190506119d75f8301846119b5565b92915050565b6119e681611984565b81146119f0575f80fd5b50565b5f81359050611a01816119dd565b92915050565b5f8060408385031215611a1d57611a1c61183a565b5b5f611a2a858286016118e4565b9250506020611a3b858286016119f3565b9150509250929050565b5f611a4f826118bd565b9050919050565b611a5f81611a45565b8114611a69575f80fd5b50565b5f81359050611a7a81611a56565b92915050565b5f60208284031215611a9557611a9461183a565b5b5f611aa284828501611a6c565b91505092915050565b5f60208284031215611ac057611abf61183a565b5b5f611acd848285016119f3565b91505092915050565b5f819050919050565b5f611af9611af4611aef8461189e565b611ad6565b61189e565b9050919050565b5f611b0a82611adf565b9050919050565b5f611b1b82611b00565b9050919050565b611b2b81611b11565b82525050565b5f602082019050611b445f830184611b22565b92915050565b5f81519050919050565b5f82825260208201905092915050565b5f819050602082019050919050565b611b7c81611984565b82525050565b608082015f820151611b965f850182611b73565b506020820151611ba96020850182611b73565b506040820151611bbc6040850182611b73565b506060820151611bcf6060850182611b73565b50505050565b5f611be08383611b82565b60808301905092915050565b5f602082019050919050565b5f611c0282611b4a565b611c0c8185611b54565b9350611c1783611b64565b805f5b83811015611c47578151611c2e8882611bd5565b9750611c3983611bec565b925050600181019050611c1a565b5085935050505092915050565b5f6020820190508181035f830152611c6c8184611bf8565b905092915050565b5f60208284031215611c8957611c8861183a565b5b5f611c9684828501611907565b91505092915050565b5f60c082019050611cb25f83018961198d565b611cbf602083018861198d565b611ccc604083018761198d565b611cd9606083018661198d565b611ce6608083018561198d565b611cf360a083018461198d565b979650505050505050565b5f805f60608486031215611d1557611d1461183a565b5b5f611d22868287016118e4565b9350506020611d33868287016118e4565b9250506040611d44868287016119f3565b9150509250925092565b5f8060408385031215611d6457611d6361183a565b5b5f611d71858286016119f3565b9250506020611d8285828601611907565b9150509250929050565b611d958161183e565b82525050565b5f602082019050611dae5f830184611d8c565b92915050565b5f604082019050611dc75f83018561198d565b611dd4602083018461198d565b9392505050565b7f4e487b71000000000000000000000000000000000000000000000000000000005f52602160045260245ffd5b5f81519050611e16816119dd565b92915050565b5f60208284031215611e3157611e3061183a565b5b5f611e3e84828501611e08565b91505092915050565b5f82825260208201905092915050565b7f4e6f7420656e6f7567682062616c616e636500000000000000000000000000005f82015250565b5f611e8b601283611e47565b9150611e9682611e57565b602082019050919050565b5f6020820190508181035f830152611eb881611e7f565b9050919050565b7f53616c6520697320616c726561647920737461727465640000000000000000005f82015250565b5f611ef3601783611e47565b9150611efe82611ebf565b602082019050919050565b5f6020820190508181035f830152611f2081611ee7565b9050919050565b7f496e73756666696369656e742062616c616e63650000000000000000000000005f82015250565b5f611f5b601483611e47565b9150611f6682611f27565b602082019050919050565b5f6020820190508181035f830152611f8881611f4f565b9050919050565b5f604082019050611fa25f8301856119b5565b611faf602083018461198d565b9392505050565b5f81519050611fc481611849565b92915050565b5f60208284031215611fdf57611fde61183a565b5b5f611fec84828501611fb6565b91505092915050565b7f53616c6520697320436c6f7365640000000000000000000000000000000000005f82015250565b5f612029600e83611e47565b915061203482611ff5565b602082019050919050565b5f6020820190508181035f8301526120568161201d565b9050919050565b7f496e73756666696369656e7420746f6b656e2062616c616e63650000000000005f82015250565b5f612091601a83611e47565b915061209c8261205d565b602082019050919050565b5f6020820190508181035f8301526120be81612085565b9050919050565b7f4e487b71000000000000000000000000000000000000000000000000000000005f52601160045260245ffd5b5f6120fc82611984565b915061210783611984565b925082820190508082111561211f5761211e6120c5565b5b92915050565b5f6060820190506121385f83018661198d565b612145602083018561198d565b612152604083018461198d565b949350505050565b5f61216482611984565b915061216f83611984565b9250828203905081811115612187576121866120c5565b5b92915050565b7f4e487b71000000000000000000000000000000000000000000000000000000005f52601260045260245ffd5b5f6121c482611984565b91506121cf83611984565b9250826121df576121de61218d565b5b828204905092915050565b5f6121f482611984565b91506121ff83611984565b925082820261220d81611984565b91508282048414831517612224576122236120c5565b5b5092915050565b5f60608201905061223e5f8301866119b5565b61224b60208301856119b5565b612258604083018461198d565b94935050505056fea2646970667358221220a9add42961c0fe143472644dfae17eb13f91b5e238c2af3ae8607236e0268eee64736f6c634300081a0033
Constructor Arguments (ABI-Encoded and is the last bytes of the Contract Creation Code above)
000000000000000000000000f23e88fe67d026b37964a0d9faa9e76b45a97c270000000000000000000000002cc312f73f34bcdada7d7589cb3074c7dc06ebe9000000000000000000000000000000000000000000000000000000000000227c
-----Decoded View---------------
Arg [0] : _tokenAddress (address): 0xF23e88FE67d026B37964A0d9FAa9e76B45A97C27
Arg [1] : _owner (address): 0x2cc312F73F34BcdADa7d7589CB3074c7Dc06ebE9
Arg [2] : _usdtPrice (uint256): 8828
-----Encoded View---------------
3 Constructor Arguments found :
Arg [0] : 000000000000000000000000f23e88fe67d026b37964a0d9faa9e76b45a97c27
Arg [1] : 0000000000000000000000002cc312f73f34bcdada7d7589cb3074c7dc06ebe9
Arg [2] : 000000000000000000000000000000000000000000000000000000000000227c
Loading...
Loading
Loading...
Loading
Net Worth in USD
$0.00
Net Worth in ETH
0
Multichain Portfolio | 33 Chains
| Chain | Token | Portfolio % | Price | Amount | Value |
|---|
Loading...
Loading
Loading...
Loading
Loading...
Loading
[ 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.