-
Notifications
You must be signed in to change notification settings - Fork 0
/
Qunicorn.sol
83 lines (72 loc) · 3.37 KB
/
Qunicorn.sol
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
// SPDX-License-Identifier: MIT
pragma solidity ^0.8.6;
// use latest solidity version at time of writing, need not worry about overflow and underflow
/// @title ERC20 Contract
contract Token {
// My Variables
string public name;
string public symbol;
uint256 public decimals;
uint256 public totalSupply;
// Keep track balances and allowances approved
mapping(address => uint256) public balanceOf;
mapping(address => mapping(address => uint256)) public allowance;
// Events - fire events on state changes etc
event Transfer(address indexed from, address indexed to, uint256 value);
event Approval(address indexed owner, address indexed spender, uint256 value);
constructor(string memory _name, string memory _symbol, uint _decimals, uint _totalSupply) {
name = _name;
symbol = _symbol;
decimals = _decimals;
totalSupply = _totalSupply;
balanceOf[msg.sender] = totalSupply;
}
/// @notice transfer amount of tokens to an address
/// @param _to receiver of token
/// @param _value amount value of token to send
/// @return success as true, for transfer
function transfer(address _to, uint256 _value) external returns (bool success) {
require(balanceOf[msg.sender] >= _value);
_transfer(msg.sender, _to, _value);
return true;
}
/// @dev internal helper transfer function with required safety checks
/// @param _from, where funds coming the sender
/// @param _to receiver of token
/// @param _value amount value of token to send
// Internal function transfer can only be called by this contract
// Emit Transfer Event event
function _transfer(address _from, address _to, uint256 _value) internal {
// Ensure sending is to valid address! 0x0 address cane be used to burn()
require(_to != address(0));
balanceOf[_from] = balanceOf[_from] - (_value);
balanceOf[_to] = balanceOf[_to] + (_value);
emit Transfer(_from, _to, _value);
}
/// @notice Approve other to spend on your behalf eg an exchange
/// @param _spender allowed to spend and a max amount allowed to spend
/// @param _value amount value of token to send
/// @return true, success once address approved
// Emit the Approval event
// Allow _spender to spend up to _value on your behalf
function approve(address _spender, uint256 _value) external returns (bool) {
require(_spender != address(0));
allowance[msg.sender][_spender] = _value;
emit Approval(msg.sender, _spender, _value);
return true;
}
/// @notice transfer by approved person from original address of an amount within approved limit
/// @param _from, address sending to and the amount to send
/// @param _to receiver of token
/// @param _value amount value of token to send
/// @dev internal helper transfer function with required safety checks
/// @return true, success once transfered from original account
// Allow _spender to spend up to _value on your behalf
function transferFrom(address _from, address _to, uint256 _value) external returns (bool) {
require(_value <= balanceOf[_from]);
require(_value <= allowance[_from][msg.sender]);
allowance[_from][msg.sender] = allowance[_from][msg.sender] - (_value);
_transfer(_from, _to, _value);
return true;
}
}