PLANK
0x69420eaf0ebf43e08f621b014f25cefdfa7e2ddc
Verification
Verified
v0.8.25+commit.b61c2a91
Type
Contract
8,185 bytes
ABI entries
79
21 read · 18 write
License
none
Contract information
- Address
- 0x69420eaf0ebf43e08f621b014f25cefdfa7e2ddc
- Chain
- Robinhood Chain (4663)
- Compiler
- v0.8.25+commit.b61c2a91
- Optimization
- Enabled
- Creator
- 0x896cB15542…110b1Fe8F2
- Creation tx
- 0x75d53def2f…99c0c20244
Token
- Name
- RobinWood
- Symbol
- PLANK
- Decimals
- 18
- Holders
- 404
- Market
- View token page →
Read contract (21)
AMMs(address) → bool
DOMAIN_SEPARATOR() → bytes32
allowance(address, address) → uint256
balanceOf(address) → uint256
blacklisted(address) → bool
decimals() → uint8
deploymentKey() → bytes32
eip712Domain() → bytes1, string, string, uint256, address, bytes32, uint256[]
isExcludedFromLimits(address) → bool
isExcludedFromTradingRestriction(address) → bool
lastTrade(address) → uint256
name() → string
nonces(address) → uint256
owner() → address
pairV2() → address
pendingOwner() → address
routerV2() → address
symbol() → string
totalSupply() → uint256
tradeCooldownTime() → uint256
tradingEnabled() → bool
Events (12)
AMMUpdatedApprovalBlacklistUpdatedEIP712DomainChangedExcludeFromLimitsExcludeFromTradingRestrictionOwnershipTransferStartedOwnershipTransferredRouterV2UpdatedTradeCooldownTimeUpdatedTradingEnabledTransfer
ABI
[
{
"inputs": [],
"stateMutability": "nonpayable",
"type": "constructor"
},
{
"inputs": [
{
"internalType": "address",
"name": "target",
"type": "address"
}
],
"name": "AddressEmptyCode",
"type": "error"
},
{
"inputs": [
{
"internalType": "address",
"name": "account",
"type": "address"
}
],
"name": "AddressInCooldown",
"type": "error"
},
{
"inputs": [
{
"internalType": "address",
"name": "account",
"type": "address"
}
],
"name": "AddressInsufficientBalance",
"type": "error"
},
{
"inputs": [],
"name": "ECDSAInvalidSignature",
"type": "error"
},
{
"inputs": [
{
"internalType": "uint256",
"name": "length",
"type": "uint256"
}
],
"name": "ECDSAInvalidSignatureLength",
"type": "error"
},
{
"inputs": [
{
"internalType": "bytes32",
"name": "s",
"type": "bytes32"
}
],
"name": "ECDSAInvalidSignatureS",
"type": "error"
},
{
"inputs": [
{
"internalType": "address",
"name": "spender",
"type": "address"
},
{
"internalType": "uint256",
"name": "allowance",
"type": "uint256"
},
{
"internalType": "uint256",
"name": "needed",
"type": "uint256"
}
],
"name": "ERC20InsufficientAllowance",
"type": "error"
},
{
"inputs": [
{
"internalType": "address",
"name": "sender",
"type": "address"
},
{
"internalType": "uint256",
"name": "balance",
"type": "uint256"
},
{
"internalType": "uint256",
"name": "needed",
"type": "uint256"
}
],
"name": "ERC20InsufficientBalance",
"type": "error"
},
{
"inputs": [
{
"internalType": "address",
"name": "approver",
"type": "address"
}
],
"name": "ERC20InvalidApprover",
"type": "error"
},
{
"inputs": [
{
"internalType": "address",
"name": "receiver",
"type": "address"
}
],
"name": "ERC20InvalidReceiver",
"type": "error"
},
{
"inputs": [
{
"internalType": "address",
"name": "sender",
"type": "address"
}
],
"name": "ERC20InvalidSender",
"type": "error"
},
{
"inputs": [
{
"internalType": "address",
"name": "spender",
"type": "address"
}
],
"name": "ERC20InvalidSpender",
"type": "error"
},
{
"inputs": [
{
"internalType": "uint256",
"name": "deadline",
"type": "uint256"
}
],
"name": "ERC2612ExpiredSignature",
"type": "error"
},
{
"inputs": [
{
"internalType": "address",
"name": "signer",
"type": "address"
},
{
"internalType": "address",
"name": "owner",
"type": "address"
}
],
"name": "ERC2612InvalidSigner",
"type": "error"
},
{
"inputs": [],
"name": "FailedInnerCall",
"type": "error"
},
{
"inputs": [
{
"internalType": "address",
"name": "AMM",
"type": "address"
}
],
"name": "InvalidAMM",
"type": "error"
},
{
"inputs": [
{
"internalType": "address",
"name": "account",
"type": "address"
},
{
"internalType": "uint256",
"name": "currentNonce",
"type": "uint256"
}
],
"name": "InvalidAccountNonce",
"type": "error"
},
{
"inputs": [],
"name": "InvalidShortString",
"type": "error"
},
{
"inputs": [
{
"internalType": "address",
"name": "tokenAddress",
"type": "address"
}
],
"name": "InvalidToken",
"type": "error"
},
{
"inputs": [
{
"internalType": "uint256",
"name": "tradeCooldownTime",
"type": "uint256"
}
],
"name": "InvalidTradeCooldownTime",
"type": "error"
},
{
"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"
},
{
"inputs": [
{
"internalType": "string",
"name": "str",
"type": "string"
}
],
"name": "StringTooLong",
"type": "error"
},
{
"inputs": [],
"name": "TradingAlreadyEnabled",
"type": "error"
},
{
"inputs": [],
"name": "TradingNotEnabled",
"type": "error"
},
{
"inputs": [
{
"internalType": "address",
"name": "from",
"type": "address"
},
{
"internalType": "address",
"name": "to",
"type": "address"
}
],
"name": "TransactionBlacklisted",
"type": "error"
},
{
"anonymous": false,
"inputs": [
{
"indexed": true,
"internalType": "address",
"name": "AMM",
"type": "address"
},
{
"indexed": false,
"internalType": "bool",
"name": "isAMM",
"type": "bool"
}
],
"name": "AMMUpdated",
"type": "event"
},
{
"anonymous": false,
"inputs": [
{
"indexed": true,
"internalType": "address",
"name": "owner",
"type": "address"
},
{
"indexed": true,
"internalType": "address",
"name": "spender",
"type": "address"
},
{
"indexed": false,
"internalType": "uint256",
"name": "value",
"type": "uint256"
}
],
"name": "Approval",
"type": "event"
},
{
"anonymous": false,
"inputs": [
{
"indexed": true,
"internalType": "address",
"name": "account",
"type": "address"
},
{
"indexed": false,
"internalType": "bool",
"name": "isBlacklisted",
"type": "bool"
}
],
"name": "BlacklistUpdated",
"type": "event"
},
{
"anonymous": false,
"inputs": [],
"name": "EIP712DomainChanged",
"type": "event"
},
{
"anonymous": false,
"inputs": [
{
"indexed": true,
"internalType": "address",
"name": "account",
"type": "address"
},
{
"indexed": false,
"internalType": "bool",
"name": "isExcluded",
"type": "bool"
}
],
"name": "ExcludeFromLimits",
"type": "event"
},
{
"anonymous": false,
"inputs": [
{
"indexed": true,
"internalType": "address",
"name": "account",
"type": "address"
},
{
"indexed": false,
"internalType": "bool",
"name": "isExcluded",
"type": "bool"
}
],
"name": "ExcludeFromTradingRestriction",
"type": "event"
},
{
"anonymous": false,
"inputs": [
{
"indexed": true,
"internalType": "address",
"name": "previousOwner",
"type": "address"
},
{
"indexed": true,
"internalType": "address",
"name": "newOwner",
"type": "address"
}
],
"name": "OwnershipTransferStarted",
"type": "event"
},
{
"anonymous": false,
"inputs": [
{
"indexed": true,
"internalType": "address",
"name": "previousOwner",
"type": "address"
},
{
"indexed": true,
"internalType": "address",
"name": "newOwner",
"type": "address"
}
],
"name": "OwnershipTransferred",
"type": "event"
},
{
"anonymous": false,
"inputs": [
{
"indexed": true,
"internalType": "address",
"name": "routerV2",
"type": "address"
}
],
"name": "RouterV2Updated",
"type": "event"
},
{
"anonymous": false,
"inputs": [
{
"indexed": false,
"internalType": "uint256",
"name": "tradeCooldownTime",
"type": "uint256"
}
],
"name": "TradeCooldownTimeUpdated",
"type": "event"
},
{
"anonymous": false,
"inputs": [],
"name": "TradingEnabled",
"type": "event"
},
{
"anonymous": false,
"inputs": [
{
"indexed": true,
"internalType": "address",
"name": "from",
"type": "address"
},
{
"indexed": true,
"internalType": "address",
"name": "to",
"type": "address"
},
{
"indexed": false,
"internalType": "uint256",
"name": "value",
"type": "uint256"
}
],
"name": "Transfer",
"type": "event"
},
{
"inputs": [
{
"internalType": "address",
"name": "",
"type": "address"
}
],
"name": "AMMs",
"outputs": [
{
"internalType": "bool",
"name": "",
"type": "bool"
}
],
"stateMutability": "view",
"type": "function"
},
{
"inputs": [],
"name": "DOMAIN_SEPARATOR",
"outputs": [
{
"internalType": "bytes32",
"name": "",
"type": "bytes32"
}
],
"stateMutability": "view",
"type": "function"
},
{
"inputs": [],
"name": "acceptOwnership",
"outputs": [],
"stateMutability": "nonpayable",
"type": "function"
},
{
"inputs": [
{
"internalType": "address",
"name": "_router",
"type": "address"
}
],
"name": "afterConstructor",
"outputs": [],
"stateMutability": "nonpayable",
"type": "function"
},
{
"inputs": [
{
"internalType": "address",
"name": "owner",
"type": "address"
},
{
"internalType": "address",
"name": "spender",
"type": "address"
}
],
"name": "allowance",
"outputs": [
{
"internalType": "uint256",
"name": "",
"type": "uint256"
}
],
"stateMutability": "view",
"type": "function"
},
{
"inputs": [
{
"internalType": "address",
"name": "spender",
"type": "address"
},
{
"internalType": "uint256",
"name": "value",
"type": "uint256"
}
],
"name": "approve",
"outputs": [
{
"internalType": "bool",
"name": "",
"type": "bool"
}
],
"stateMutability": "nonpayable",
"type": "function"
},
{
"inputs": [
{
"internalType": "address",
"name": "account",
"type": "address"
}
],
"name": "balanceOf",
"outputs": [
{
"internalType": "uint256",
"name": "",
"type": "uint256"
}
],
"stateMutability": "view",
"type": "function"
},
{
"inputs": [
{
"internalType": "address",
"name": "account",
"type": "address"
},
{
"internalType": "bool",
"name": "isBlacklisted",
"type": "bool"
}
],
"name": "blacklist",
"outputs": [],
"stateMutability": "nonpayable",
"type": "function"
},
{
"inputs": [
{
"internalType": "address",
"name": "",
"type": "address"
}
],
"name": "blacklisted",
"outputs": [
{
"internalType": "bool",
"name": "",
"type": "bool"
}
],
"stateMutability": "view",
"type": "function"
},
{
"inputs": [
{
"internalType": "uint256",
"name": "value",
"type": "uint256"
}
],
"name": "burn",
"outputs": [],
"stateMutability": "nonpayable",
"type": "function"
},
{
"inputs": [
{
"internalType": "address",
"name": "account",
"type": "address"
},
{
"internalType": "uint256",
"name": "value",
"type": "uint256"
}
],
"name": "burnFrom",
"outputs": [],
"stateMutability": "nonpayable",
"type": "function"
},
{
"inputs": [],
"name": "decimals",
"outputs": [
{
"internalType": "uint8",
"name": "",
"type": "uint8"
}
],
"stateMutability": "pure",
"type": "function"
},
{
"inputs": [],
"name": "deploymentKey",
"outputs": [
{
"internalType": "bytes32",
"name": "",
"type": "bytes32"
}
],
"stateMutability": "pure",
"type": "function"
},
{
"inputs": [],
"name": "eip712Domain",
"outputs": [
{
"internalType": "bytes1",
"name": "fields",
"type": "bytes1"
},
{
"internalType": "string",
"name": "name",
"type": "string"
},
{
"internalType": "string",
"name": "version",
"type": "string"
},
{
"internalType": "uint256",
"name": "chainId",
"type": "uint256"
},
{
"internalType": "address",
"name": "verifyingContract",
"type": "address"
},
{
"internalType": "bytes32",
"name": "salt",
"type": "bytes32"
},
{
"internalType": "uint256[]",
"name": "extensions",
"type": "uint256[]"
}
],
"stateMutability": "view",
"type": "function"
},
{
"inputs": [],
"name": "enableTrading",
"outputs": [],
"stateMutability": "nonpayable",
"type": "function"
},
{
"inputs": [
{
"internalType": "address",
"name": "account",
"type": "address"
},
{
"internalType": "bool",
"name": "isExcluded",
"type": "bool"
}
],
"name": "excludeFromLimits",
"outputs": [],
"stateMutability": "nonpayable",
"type": "function"
},
{
"inputs": [
{
"internalType": "address",
"name": "account",
"type": "address"
},
{
"internalType": "bool",
"name": "isExcluded",
"type": "bool"
}
],
"name": "excludeFromTradingRestriction",
"outputs": [],
"stateMutability": "nonpayable",
"type": "function"
},
{
"inputs": [
{
"internalType": "address",
"name": "",
"type": "address"
}
],
"name": "isExcludedFromLimits",
"outputs": [
{
"internalType": "bool",
"name": "",
"type": "bool"
}
],
"stateMutability": "view",
"type": "function"
},
{
"inputs": [
{
"internalType": "address",
"name": "",
"type": "address"
}
],
"name": "isExcludedFromTradingRestriction",
"outputs": [
{
"internalType": "bool",
"name": "",
"type": "bool"
}
],
"stateMutability": "view",
"type": "function"
},
{
"inputs": [
{
"internalType": "address",
"name": "",
"type": "address"
}
],
"name": "lastTrade",
"outputs": [
{
"internalType": "uint256",
"name": "",
"type": "uint256"
}
],
"stateMutability": "view",
"type": "function"
},
{
"inputs": [],
"name": "name",
"outputs": [
{
"internalType": "string",
"name": "",
"type": "string"
}
],
"stateMutability": "view",
"type": "function"
},
{
"inputs": [
{
"internalType": "address",
"name": "owner",
"type": "address"
}
],
"name": "nonces",
"outputs": [
{
"internalType": "uint256",
"name": "",
"type": "uint256"
}
],
"stateMutability": "view",
"type": "function"
},
{
"inputs": [],
"name": "owner",
"outputs": [
{
"internalType": "address",
"name": "",
"type": "address"
}
],
"stateMutability": "view",
"type": "function"
},
{
"inputs": [],
"name": "pairV2",
"outputs": [
{
"internalType": "address",
"name": "",
"type": "address"
}
],
"stateMutability": "view",
"type": "function"
},
{
"inputs": [],
"name": "pendingOwner",
"outputs": [
{
"internalType": "address",
"name": "",
"type": "address"
}
],
"stateMutability": "view",
"type": "function"
},
{
"inputs": [
{
"internalType": "address",
"name": "owner",
"type": "address"
},
{
"internalType": "address",
"name": "spender",
"type": "address"
},
{
"internalType": "uint256",
"name": "value",
"type": "uint256"
},
{
"internalType": "uint256",
"name": "deadline",
"type": "uint256"
},
{
"internalType": "uint8",
"name": "v",
"type": "uint8"
},
{
"internalType": "bytes32",
"name": "r",
"type": "bytes32"
},
{
"internalType": "bytes32",
"name": "s",
"type": "bytes32"
}
],
"name": "permit",
"outputs": [],
"stateMutability": "nonpayable",
"type": "function"
},
{
"inputs": [
{
"internalType": "address",
"name": "tokenAddress",
"type": "address"
},
{
"internalType": "uint256",
"name": "amount",
"type": "uint256"
}
],
"name": "recoverForeignERC20",
"outputs": [],
"stateMutability": "nonpayable",
"type": "function"
},
{
"inputs": [
{
"internalType": "uint256",
"name": "amount",
"type": "uint256"
}
],
"name": "recoverToken",
"outputs": [],
"stateMutability": "nonpayable",
"type": "function"
},
{
"inputs": [],
"name": "renounceOwnership",
"outputs": [],
"stateMutability": "nonpayable",
"type": "function"
},
{
"inputs": [],
"name": "routerV2",
"outputs": [
{
"internalType": "contract IUniswapV2Router02",
"name": "",
"type": "address"
}
],
"stateMutability": "view",
"type": "function"
},
{
"inputs": [
{
"internalType": "address",
"name": "AMM",
"type": "address"
},
{
"internalType": "bool",
"name": "isAMM",
"type": "bool"
}
],
"name": "setAMM",
"outputs": [],
"stateMutability": "nonpayable",
"type": "function"
},
{
"inputs": [],
"name": "symbol",
"outputs": [
{
"internalType": "string",
"name": "",
"type": "string"
}
],
"stateMutability": "view",
"type": "function"
},
{
"inputs": [],
"name": "totalSupply",
"outputs": [
{
"internalType": "uint256",
"name": "",
"type": "uint256"
}
],
"stateMutability": "view",
"type": "function"
},
{
"inputs": [],
"name": "tradeCooldownTime",
"outputs": [
{
"internalType": "uint256",
"name": "",
"type": "uint256"
}
],
"stateMutability": "view",
"type": "function"
},
{
"inputs": [],
"name": "tradingEnabled",
"outputs": [
{
"internalType": "bool",
"name": "",
"type": "bool"
}
],
"stateMutability": "view",
"type": "function"
},
{
"inputs": [
{
"internalType": "address",
"name": "to",
"type": "address"
},
{
"internalType": "uint256",
"name": "value",
"type": "uint256"
}
],
"name": "transfer",
"outputs": [
{
"internalType": "bool",
"name": "",
"type": "bool"
}
],
"stateMutability": "nonpayable",
"type": "function"
},
{
"inputs": [
{
"internalType": "address",
"name": "from",
"type": "address"
},
{
"internalType": "address",
"name": "to",
"type": "address"
},
{
"internalType": "uint256",
"name": "value",
"type": "uint256"
}
],
"name": "transferFrom",
"outputs": [
{
"internalType": "bool",
"name": "",
"type": "bool"
}
],
"stateMutability": "nonpayable",
"type": "function"
},
{
"inputs": [
{
"internalType": "address",
"name": "newOwner",
"type": "address"
}
],
"name": "transferOwnership",
"outputs": [],
"stateMutability": "nonpayable",
"type": "function"
},
{
"inputs": [
{
"internalType": "uint256",
"name": "_tradeCooldownTime",
"type": "uint256"
}
],
"name": "updateTradeCooldownTime",
"outputs": [],
"stateMutability": "nonpayable",
"type": "function"
}
]Source code
/*
_______________ ______
| | |
| ● ● |
| |
| \_____/ |
| | |
| ~ |
| |
| | |
| / |
|_;_______|___________,_|
██████╗ ██╗ █████╗ ███╗ ██╗██╗ ██╗
██╔══██╗██║ ██╔══██╗████╗ ██║██║ ██╔╝
██████╔╝██║ ███████║██╔██╗ ██║█████╔╝
██╔═══╝ ██║ ██╔══██║██║╚██╗██║██╔═██╗
██║ ███████╗██║ ██║██║ ╚████║██║ ██╗
╚═╝ ╚══════╝╚═╝ ╚═╝╚═╝ ╚═══╝╚═╝ ╚═╝
------------------------------------------
$$$$\ $$$\ $$$$\ $$$\ $\ $\ $\ $\ $$$\ $$$\ $$$$\
$ __$\ $ __$\ $ __$\ \_$ _|$$\ $ |$ | $\ $ |$ __$\ $ __$\ $ __$\
$ | $ |$ / $ |$ | $ | $ | $$\ $ |$ |$$\ $ |$ / $ |$ / $ |$ | $ |
$$$$ |$ | $ |$$$$\ | $ | $ $\$ |$ $ $\$ |$ | $ |$ | $ |$ | $ |
$ __$< $ | $ |$ __$\ $ | $ \$$ |$$ $$ |$ | $ |$ | $ |$ | $ |
$ | $ |$ | $ |$ | $ | $ | $ |\$$ |$$ $\$ |$ | $ |$ | $ |$ | $ |
$ | $ | $$$ |$$$$ |$$$\ $ | \$ |$ / \$ | $$$ | $$$ |$$$$ |
\__| \__| \______/ \_______/ \______|\__| \__|\__/ \__| \______/ \______/ \_______/
*/
// SPDX-License-Identifier: No License
pragma solidity 0.8.25;
import {IERC20, ERC20} from "./ERC20.sol";
import {ERC20Burnable} from "./ERC20Burnable.sol";
import {Ownable, Ownable2Step} from "./Ownable2Step.sol";
import {SafeERC20Remastered} from "./SafeERC20Remastered.sol";
import {ERC20Permit} from "./ERC20Permit.sol";
import {Initializable} from "./Initializable.sol";
import "./IUniswapV2Factory.sol";
import "./IUniswapV2Pair.sol";
import "./IUniswapV2Router01.sol";
import "./IUniswapV2Router02.sol";
contract PLANK is ERC20, ERC20Burnable, Ownable2Step, ERC20Permit, Initializable {
using SafeERC20Remastered for IERC20;
mapping (address => bool) public blacklisted;
IUniswapV2Router02 public routerV2;
address public pairV2;
mapping (address => bool) public AMMs;
mapping (address => bool) public isExcludedFromLimits;
mapping (address => uint256) public lastTrade;
uint256 public tradeCooldownTime;
bool public tradingEnabled;
mapping (address => bool) public isExcludedFromTradingRestriction;
error InvalidToken(address tokenAddress);
error TransactionBlacklisted(address from, address to);
error InvalidAMM(address AMM);
error InvalidTradeCooldownTime(uint256 tradeCooldownTime);
error AddressInCooldown(address account);
error TradingAlreadyEnabled();
error TradingNotEnabled();
event BlacklistUpdated(address indexed account, bool isBlacklisted);
event RouterV2Updated(address indexed routerV2);
event AMMUpdated(address indexed AMM, bool isAMM);
event ExcludeFromLimits(address indexed account, bool isExcluded);
event TradeCooldownTimeUpdated(uint256 tradeCooldownTime);
event TradingEnabled();
event ExcludeFromTradingRestriction(address indexed account, bool isExcluded);
constructor()
ERC20(unicode"RobinWood", unicode"PLANK")
Ownable(msg.sender)
ERC20Permit(unicode"RobinWood")
{
assembly { if iszero(extcodesize(caller())) { revert(0, 0) } }
address supplyRecipient = 0x6d05f45b602397eC1842395b2b465298BC36e5fB;
_excludeFromLimits(supplyRecipient, true);
_excludeFromLimits(address(this), true);
_excludeFromLimits(address(0), true);
updateTradeCooldownTime(169);
excludeFromTradingRestriction(supplyRecipient, true);
excludeFromTradingRestriction(address(this), true);
_mint(supplyRecipient, 8884200694208880 * (10 ** decimals()) / 10);
_transferOwnership(0x6d05f45b602397eC1842395b2b465298BC36e5fB);
}
/*
This token is not upgradeable. Function afterConstructor finishes post-deployment setup.
*/
function afterConstructor(address _router) initializer external {
_updateRouterV2(_router);
}
function deploymentKey() external pure returns (bytes32) {
return 0xd54b4f1c9652e8888106d34e46e3b8e98652951d9fe95545c75e661653f06a94;
}
function decimals() public pure override returns (uint8) {
return 18;
}
function recoverToken(uint256 amount) external onlyOwner {
_update(address(this), msg.sender, amount);
}
function recoverForeignERC20(address tokenAddress, uint256 amount) external onlyOwner {
if (tokenAddress == address(this)) revert InvalidToken(tokenAddress);
IERC20(tokenAddress).safeTransfer(msg.sender, amount);
}
function blacklist(address account, bool isBlacklisted) external onlyOwner {
blacklisted[account] = isBlacklisted;
emit BlacklistUpdated(account, isBlacklisted);
}
function _updateRouterV2(address router) private {
routerV2 = IUniswapV2Router02(router);
pairV2 = IUniswapV2Factory(routerV2.factory()).createPair(address(this), routerV2.WETH());
_approve(address(this), router, type(uint256).max);
_setAMM(router, true);
_setAMM(pairV2, true);
emit RouterV2Updated(router);
}
function setAMM(address AMM, bool isAMM) external onlyOwner {
if (AMM == pairV2 || AMM == address(routerV2)) revert InvalidAMM(AMM);
_setAMM(AMM, isAMM);
}
function _setAMM(address AMM, bool isAMM) private {
AMMs[AMM] = isAMM;
if (isAMM) {
_excludeFromLimits(AMM, true);
}
emit AMMUpdated(AMM, isAMM);
}
function excludeFromLimits(address account, bool isExcluded) external onlyOwner {
_excludeFromLimits(account, isExcluded);
}
function _excludeFromLimits(address account, bool isExcluded) internal {
isExcludedFromLimits[account] = isExcluded;
emit ExcludeFromLimits(account, isExcluded);
}
function updateTradeCooldownTime(uint256 _tradeCooldownTime) public onlyOwner {
if (_tradeCooldownTime > 12 hours) revert InvalidTradeCooldownTime(_tradeCooldownTime);
tradeCooldownTime = _tradeCooldownTime;
emit TradeCooldownTimeUpdated(_tradeCooldownTime);
}
function enableTrading() external onlyOwner {
if (tradingEnabled) revert TradingAlreadyEnabled();
tradingEnabled = true;
emit TradingEnabled();
}
function excludeFromTradingRestriction(address account, bool isExcluded) public onlyOwner {
isExcludedFromTradingRestriction[account] = isExcluded;
emit ExcludeFromTradingRestriction(account, isExcluded);
}
function _update(address from, address to, uint256 amount)
internal
override
{
_beforeTokenUpdate(from, to, amount);
super._update(from, to, amount);
_afterTokenUpdate(from, to, amount);
}
function _beforeTokenUpdate(address from, address to, uint256 amount)
internal
view
{
if (blacklisted[from] || blacklisted[to]) revert TransactionBlacklisted(from, to);
if(!isExcludedFromLimits[from] && lastTrade[from] + tradeCooldownTime > block.timestamp) revert AddressInCooldown(from);
if(!isExcludedFromLimits[to] && lastTrade[to] + tradeCooldownTime > block.timestamp) revert AddressInCooldown(to);
// Interactions with DEX are disallowed prior to enabling trading by owner
if (!tradingEnabled) {
if ((AMMs[from] && !AMMs[to] && !isExcludedFromTradingRestriction[to]) || (AMMs[to] && !AMMs[from] && !isExcludedFromTradingRestriction[from])) {
revert TradingNotEnabled();
}
}
}
function _afterTokenUpdate(address from, address to, uint256 amount)
internal
{
if (AMMs[from] && !isExcludedFromLimits[to]) lastTrade[to] = block.timestamp;
else if (AMMs[to] && !isExcludedFromLimits[from]) lastTrade[from] = block.timestamp;
}
}
Chain explorer2145msChain node77ms