contracts/GoldenCorn.sol 1.8 K raw
1
// SPDX-License-Identifier: MIT
2
pragma solidity ^0.8.20;
3
4
import "@openzeppelin/contracts/token/ERC20/ERC20.sol";
5
import "@openzeppelin/contracts/access/Ownable.sol";
6
import "@openzeppelin/contracts/token/ERC20/extensions/ERC20Permit.sol";
7
8
contract GoldenCorn is ERC20, Ownable, ERC20Permit {
9
    mapping(address => bool) private _whitelist;
10
11
    constructor(
12
        address initialOwner
13
    )
14
        ERC20("GoldenCorn", "GC")
15
        Ownable(initialOwner)
16
        ERC20Permit("GoldenCorn")
17
    {}
18
19
    function mint(address to, uint256 amount) public onlyOwner {
20
        uint256 mintAmount = amount * (10 ** decimals());
21
        _mint(to, mintAmount);
22
    }
23
24
    // Override the transfer function
25
    function transfer(
26
        address recipient,
27
        uint256 amount
28
    ) public override returns (bool) {
29
        require(
30
            _whitelist[msg.sender],
31
            "Only whitelisted addresses can initiate transfers"
32
        );
33
        _transfer(_msgSender(), recipient, amount);
34
        return true;
35
    }
36
37
    // Override the transferFrom function
38
    function transferFrom(
39
        address sender,
40
        address recipient,
41
        uint256 amount
42
    ) public override returns (bool) {
43
        require(
44
            _whitelist[sender],
45
            "Only whitelisted addresses can initiate transfers"
46
        );
47
        _transfer(sender, recipient, amount);
48
        _approve(
49
            sender,
50
            _msgSender(),
51
            allowance(sender, _msgSender()) - amount
52
        );
53
        return true;
54
    }
55
56
    // Add a function to add or remove addresses from the whitelist
57
    function setWhitelisted(address account, bool value) external {
58
        require(
59
            msg.sender == owner(),
60
            "Only the owner can modify the whitelist"
61
        );
62
        _whitelist[account] = value;
63
    }
64
}