// SPDX-License-Identifier: MIT// OpenZeppelin Contracts (last updated v4.9.0) (token/ERC20/IERC20.sol)pragmasolidity ^0.8.0;/**
* @dev Interface of the ERC20 standard as defined in the EIP.
*/interfaceIERC20{
/**
* @dev Emitted when `value` tokens are moved from one account (`from`) to
* another (`to`).
*
* Note that `value` may be zero.
*/eventTransfer(addressindexedfrom, addressindexed 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.
*/eventApproval(addressindexed owner, addressindexed spender, uint256 value);
/**
* @dev Returns the amount of tokens in existence.
*/functiontotalSupply() externalviewreturns (uint256);
/**
* @dev Returns the amount of tokens owned by `account`.
*/functionbalanceOf(address account) externalviewreturns (uint256);
/**
* @dev Moves `amount` tokens from the caller's account to `to`.
*
* Returns a boolean value indicating whether the operation succeeded.
*
* Emits a {Transfer} event.
*/functiontransfer(address to, uint256 amount) externalreturns (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.
*/functionallowance(address owner, address spender) externalviewreturns (uint256);
/**
* @dev Sets `amount` as the allowance of `spender` over the caller's tokens.
*
* Returns a boolean value indicating whether the operation succeeded.
*
* IMPORTANT: Beware that changing an allowance with this method brings the risk
* that someone may use both the old and the new allowance by unfortunate
* transaction ordering. One possible solution to mitigate this race
* condition is to first reduce the spender's allowance to 0 and set the
* desired value afterwards:
* https://github.com/ethereum/EIPs/issues/20#issuecomment-263524729
*
* Emits an {Approval} event.
*/functionapprove(address spender, uint256 amount) externalreturns (bool);
/**
* @dev Moves `amount` tokens from `from` to `to` using the
* allowance mechanism. `amount` is then deducted from the caller's
* allowance.
*
* Returns a boolean value indicating whether the operation succeeded.
*
* Emits a {Transfer} event.
*/functiontransferFrom(addressfrom, address to, uint256 amount) externalreturns (bool);
}
Contract Source Code
File 2 of 2: LynxVault.sol
//SPDX-License-Identifier: MITpragmasolidity 0.8.21;// Importsimport"openzeppelin/token/ERC20/IERC20.sol";
// ErrorserrorLynxVault__NotWhitelisted();
errorLynxVault__NotOwner();
errorLynxVault__ProperChannels();
errorLynxVault__InvalidAddress();
/**
* @title Vault for Lynx
* @author Semi Invader
* @notice This contract is the vault for Lynx Tokens used in other contracts.
*/contractLynxVault{
//------------------------// Variables//------------------------mapping(address=>bool) public whitelisted;
addresspublic owner;
IERC20 public lynx;
//------------------------// Events//------------------------eventSetWhitelist(addressindexed _address, bool status);
eventWithdraw(addressindexed _address, uint amount);
//------------------------// Modifiers//------------------------modifieronlyWhitelisted() {
if (whitelisted[msg.sender]) _;
elserevert LynxVault__NotWhitelisted();
}
modifieronlyOwner() {
if (msg.sender== owner) _;
elserevert LynxVault__NotOwner();
}
//------------------------// Constructor//------------------------constructor(address _lynx) {
whitelisted[msg.sender] =true;
owner =msg.sender;
lynx = IERC20(_lynx);
}
//----------------------------// External/Public functions//----------------------------/**
* @notice Sets the whitelist status for an address
* @param _address Address to set the whitelist status for
* @param status the status to set the whitelist to
*/functionsetWhitelistStatus(address _address,
bool status
) externalonlyOwner{
if (_address ==address(0)) revert LynxVault__InvalidAddress();
whitelisted[_address] = status;
emit SetWhitelist(_address, status);
}
/**
* @notice Sets the whitelist status for multiple Addresses
* @param _addresses Addresses to set the whitelist status for
* @param status the status value set
*/functionaddMultipleWhitelist(address[] calldata _addresses,
bool status
) externalonlyOwner{
for (uint i =0; i < _addresses.length; i++) {
if (_addresses[i] ==address(0)) revert LynxVault__InvalidAddress();
whitelisted[_addresses[i]] = status;
emit SetWhitelist(_addresses[i], status);
}
}
functionwithdraw(uint amount) externalonlyWhitelisted{
lynx.transfer(msg.sender, amount);
emit Withdraw(msg.sender, amount);
}
functionwithdrawTo(address _address,
uint amount
) externalonlyWhitelisted{
if (_address ==address(0)) revert LynxVault__InvalidAddress();
lynx.transfer(_address, amount);
emit Withdraw(_address, amount);
}
functionrecoverERC20(address _otherToken) externalonlyOwner{
if (_otherToken ==address(lynx)) revert LynxVault__ProperChannels();
IERC20 otherToken = IERC20(_otherToken);
otherToken.transfer(msg.sender, otherToken.balanceOf(address(this)));
}
}