Created
March 19, 2021 01:59
-
-
Save degiorgig/ec1ebf093cba89d38734c2286a108ed9 to your computer and use it in GitHub Desktop.
Created using remix-ide: Realtime Ethereum Contract Compiler and Runtime. Load this file by pasting this gists URL or ID at https://remix.ethereum.org/#version=soljson-v0.5.16+commit.9c3226ce.js&optimize=true&runs=200&gist=
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
REMIX EXAMPLE PROJECT | |
Remix example project is present when Remix loads very first time or there are no files existing in the File Explorer. | |
It contains 3 directories: | |
1. 'contracts': Holds three contracts with different complexity level, denoted with number prefix in file name. | |
2. 'scripts': Holds two scripts to deploy a contract. It is explained below. | |
3. 'tests': Contains one test file for 'Ballot' contract with unit tests in Solidity. | |
SCRIPTS | |
The 'scripts' folder contains example async/await scripts for deploying the 'Storage' contract. | |
For the deployment of any other contract, 'contractName' and 'constructorArgs' should be updated (along with other code if required). | |
Scripts have full access to the web3.js and ethers.js libraries. | |
To run a script, right click on file name in the file explorer and click 'Run'. Remember, Solidity file must already be compiled. | |
Output from script will appear in remix terminal. |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
pragma solidity =0.5.16; | |
import './libraries/SafeMath.sol'; | |
contract Token{ | |
using SafeMath for uint; | |
// not really private | |
uint private totalSupply = 10000 * 10 ** 18; | |
string public name = "Fondue"; // metadata | |
string public symbol = "FON"; | |
uint public decimals = 18; | |
bytes32 public DOMAIN_SEPARATOR; | |
mapping(address => uint) public balanceOf; | |
mapping(address => mapping(address => uint)) public allowance; | |
event Approval(address indexed owner, address indexed spender, uint value); | |
event Transfer(address indexed from, address indexed to, uint value); | |
//called only once | |
constructor() public { | |
balanceOf[msg.sender] = totalSupply; | |
} | |
bytes32 public constant PERMIT_TYPEHASH = 0x6e71edae12b1b97f4d1f60370fef10105fa2faae0126114a169c64845d6126c9; | |
mapping(address => uint) public nonces; | |
/*constructor() public { | |
uint chainId; | |
assembly { | |
chainId := chainid | |
} | |
DOMAIN_SEPARATOR = keccak256( | |
abi.encode( | |
keccak256('EIP712Domain(string name,string version,uint256 chainId,address verifyingContract)'), | |
keccak256(bytes(name)), | |
keccak256(bytes('1')), | |
chainId, | |
address(this) | |
) | |
); | |
}*/ | |
function _mint(address to, uint value) internal { | |
totalSupply = totalSupply.add(value); | |
balanceOf[to] = balanceOf[to].add(value); | |
emit Transfer(address(0), to, value); | |
} | |
function _burn(address from, uint value) internal { | |
balanceOf[from] = balanceOf[from].sub(value); | |
totalSupply = totalSupply.sub(value); | |
emit Transfer(from, address(0), value); | |
} | |
function _approve(address owner, address spender, uint value) private { | |
allowance[owner][spender] = value; | |
emit Approval(owner, spender, value); | |
} | |
function _transfer(address from, address to, uint value) private { | |
balanceOf[from] = balanceOf[from].sub(value); | |
balanceOf[to] = balanceOf[to].add(value); | |
emit Transfer(from, to, value); | |
} | |
function approve(address spender, uint value) external returns (bool) { | |
_approve(msg.sender, spender, value); | |
return true; | |
} | |
function transfer(address to, uint value) external returns (bool) { | |
_transfer(msg.sender, to, value); | |
return true; | |
} | |
function transferFrom(address from, address to, uint value) external returns (bool) { | |
if (allowance[from][msg.sender] != uint(-1)) { | |
allowance[from][msg.sender] = allowance[from][msg.sender].sub(value); | |
} | |
_transfer(from, to, value); | |
return true; | |
} | |
function permit(address owner, address spender, uint value, uint deadline, uint8 v, bytes32 r, bytes32 s) external { | |
require(deadline >= block.timestamp, 'UniswapV2: EXPIRED'); | |
bytes32 digest = keccak256( | |
abi.encodePacked( | |
'\x19\x01', | |
DOMAIN_SEPARATOR, | |
keccak256(abi.encode(PERMIT_TYPEHASH, owner, spender, value, nonces[owner]++, deadline)) | |
) | |
); | |
address recoveredAddress = ecrecover(digest, v, r, s); | |
//require(recoveredAddress != address(0) && recoveredAddress == owner, 'UniswapV2: INVALID_SIGNATURE'); | |
_approve(owner, spender, value); | |
} | |
function balance(address owner) public view returns (uint){ | |
return balanceOf[owner]; | |
} | |
} |
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment