├── artifacts ├── contracts │ ├── Lock.sol │ │ ├── Lock.dbg.json │ │ └── Lock.json │ └── Token.sol │ │ ├── BeeToken.dbg.json │ │ └── BeeToken.json └── @openzeppelin │ └── contracts │ ├── utils │ └── Context.sol │ │ ├── Context.dbg.json │ │ └── Context.json │ └── token │ └── ERC20 │ ├── ERC20.sol │ ├── ERC20.dbg.json │ └── ERC20.json │ ├── IERC20.sol │ ├── IERC20.dbg.json │ └── IERC20.json │ └── extensions │ └── IERC20Metadata.sol │ ├── IERC20Metadata.dbg.json │ └── IERC20Metadata.json ├── contracts ├── Token.sol └── Lock.sol ├── scripts ├── deploy1.js └── deploy2.js ├── package.json ├── hardhat.config.js ├── cache └── solidity-files-cache.json └── README.md /artifacts/contracts/Lock.sol/Lock.dbg.json: -------------------------------------------------------------------------------- 1 | { 2 | "_format": "hh-sol-dbg-1", 3 | "buildInfo": "..\\..\\build-info\\1f2928d1e9bd365198afd89929e76280.json" 4 | } 5 | -------------------------------------------------------------------------------- /artifacts/contracts/Token.sol/BeeToken.dbg.json: -------------------------------------------------------------------------------- 1 | { 2 | "_format": "hh-sol-dbg-1", 3 | "buildInfo": "..\\..\\build-info\\1f2928d1e9bd365198afd89929e76280.json" 4 | } 5 | -------------------------------------------------------------------------------- /artifacts/@openzeppelin/contracts/utils/Context.sol/Context.dbg.json: -------------------------------------------------------------------------------- 1 | { 2 | "_format": "hh-sol-dbg-1", 3 | "buildInfo": "..\\..\\..\\..\\build-info\\1f2928d1e9bd365198afd89929e76280.json" 4 | } 5 | -------------------------------------------------------------------------------- /artifacts/@openzeppelin/contracts/token/ERC20/ERC20.sol/ERC20.dbg.json: -------------------------------------------------------------------------------- 1 | { 2 | "_format": "hh-sol-dbg-1", 3 | "buildInfo": "..\\..\\..\\..\\..\\build-info\\1f2928d1e9bd365198afd89929e76280.json" 4 | } 5 | -------------------------------------------------------------------------------- /artifacts/@openzeppelin/contracts/token/ERC20/IERC20.sol/IERC20.dbg.json: -------------------------------------------------------------------------------- 1 | { 2 | "_format": "hh-sol-dbg-1", 3 | "buildInfo": "..\\..\\..\\..\\..\\build-info\\1f2928d1e9bd365198afd89929e76280.json" 4 | } 5 | -------------------------------------------------------------------------------- /artifacts/@openzeppelin/contracts/token/ERC20/extensions/IERC20Metadata.sol/IERC20Metadata.dbg.json: -------------------------------------------------------------------------------- 1 | { 2 | "_format": "hh-sol-dbg-1", 3 | "buildInfo": "..\\..\\..\\..\\..\\..\\build-info\\1f2928d1e9bd365198afd89929e76280.json" 4 | } 5 | -------------------------------------------------------------------------------- /contracts/Token.sol: -------------------------------------------------------------------------------- 1 | // SPDX-License-Identifier: UNLICENSED 2 | pragma solidity ^0.8.2; 3 | 4 | import "@openzeppelin/contracts/token/ERC20/ERC20.sol"; 5 | 6 | contract BeeToken is ERC20 { 7 | constructor() ERC20("BEE Token", "BEE") { 8 | _mint(msg.sender, 1773000 * 10**decimals()); 9 | } 10 | } 11 | -------------------------------------------------------------------------------- /artifacts/@openzeppelin/contracts/utils/Context.sol/Context.json: -------------------------------------------------------------------------------- 1 | { 2 | "_format": "hh-sol-artifact-1", 3 | "contractName": "Context", 4 | "sourceName": "@openzeppelin/contracts/utils/Context.sol", 5 | "abi": [], 6 | "bytecode": "0x", 7 | "deployedBytecode": "0x", 8 | "linkReferences": {}, 9 | "deployedLinkReferences": {} 10 | } 11 | -------------------------------------------------------------------------------- /scripts/deploy1.js: -------------------------------------------------------------------------------- 1 | const {ethers} = require("hardhat"); 2 | 3 | async function main(){ 4 | 5 | const Token = await ethers.getContractFactory("BeeToken"); 6 | const token = await Token.deploy(); 7 | 8 | console.log("Contract address",token.address); 9 | } 10 | main() 11 | .then(()=> process.exit(0)) 12 | .catch((error)=>{ 13 | console.error(error); 14 | process.exit(1); 15 | }) 16 | -------------------------------------------------------------------------------- /scripts/deploy2.js: -------------------------------------------------------------------------------- 1 | const {ethers} = require("hardhat"); 2 | 3 | async function main(){ 4 | 5 | const Lock = await ethers.getContractFactory("Lock"); 6 | const lock = await Lock.deploy("0x94CFe96F0843D72ef4Cc62fc47c8c2854c0226bb"); 7 | 8 | console.log("Contract address",lock.address); 9 | } 10 | main() 11 | .then(()=> process.exit(0)) 12 | .catch((error)=>{ 13 | console.error(error); 14 | process.exit(1); 15 | }) 16 | -------------------------------------------------------------------------------- /package.json: -------------------------------------------------------------------------------- 1 | { 2 | "name": "medium-proje", 3 | "version": "1.0.0", 4 | "description": "", 5 | "main": "index.js", 6 | "scripts": { 7 | "test": "echo \"Error: no test specified\" && exit 1" 8 | }, 9 | "keywords": [], 10 | "author": "", 11 | "license": "ISC", 12 | "devDependencies": { 13 | "@nomiclabs/hardhat-ethers": "^2.1.0", 14 | "@nomiclabs/hardhat-waffle": "^2.0.3", 15 | "chai": "^4.3.6", 16 | "ethereum-waffle": "^3.4.4", 17 | "ethers": "^5.6.9", 18 | "hardhat": "^2.10.1" 19 | }, 20 | "dependencies": { 21 | "@openzeppelin/contracts": "^4.7.2" 22 | } 23 | } 24 | -------------------------------------------------------------------------------- /hardhat.config.js: -------------------------------------------------------------------------------- 1 | //require("@nomiclabs/hardhat-ethers"); 2 | require("@nomiclabs/hardhat-waffle"); 3 | 4 | const PRIVATE_KEY = "metamask cuzdanınızın private key'ini giriniz..!!!!"; 5 | 6 | 7 | module.exports = { 8 | solidity: "0.8.2", 9 | networks: { 10 | hardhat:{}, 11 | alchemy:{ 12 | url:"https://eth-rinkeby.alchemyapi.io/v2/HqFAMf3XQpOZE9JIKv1piCcZBj8IR-Xa", 13 | accounts: [`${PRIVATE_KEY}`] 14 | }, 15 | mainnet: { 16 | url: `https://api.avax.network/ext/bc/C/rpc`, 17 | accounts: [`${PRIVATE_KEY}`] 18 | }, 19 | fuji: { 20 | url: `https://api.avax-test.network/ext/bc/C/rpc`, 21 | accounts: [`${PRIVATE_KEY}`] 22 | } 23 | } 24 | }; -------------------------------------------------------------------------------- /contracts/Lock.sol: -------------------------------------------------------------------------------- 1 | // SPDX-License-Identifier: UNLICENSED 2 | pragma solidity ^0.8.2; 3 | 4 | import "./Token.sol"; 5 | 6 | contract Lock { 7 | BeeToken Token; 8 | 9 | uint256 public lockerCount; 10 | uint256 public totalLocked; 11 | mapping(address => uint256) public lockers; 12 | mapping(address => uint256) public deadLine; 13 | 14 | constructor(address tokenAddress) { 15 | Token = BeeToken(tokenAddress); 16 | } 17 | 18 | function LockToken(uint256 amount, uint256 time) external { 19 | require(amount > 0, "Token amount must be bigger than 0"); 20 | // require(Token.balanceOf(msg.sender) >= amount, "insufficent balance."); 21 | // require( 22 | // Token.allowance(msg.sender, address(this)) >= amount, 23 | // "insufficent allowance." 24 | // ); 25 | if (!(lockers[msg.sender] > 0)) lockerCount++; 26 | totalLocked += amount; 27 | lockers[msg.sender] += amount; 28 | deadLine[msg.sender] = block.timestamp + time; 29 | 30 | bool ok = Token.transferFrom(msg.sender, address(this), amount); 31 | require(ok, "Transfer failed.!!!"); 32 | } 33 | 34 | function withdrawToken() external { 35 | require(lockers[msg.sender] > 0, "not enough token"); 36 | require(block.timestamp > deadLine[msg.sender], "deadline is not over"); 37 | uint256 amount = lockers[msg.sender]; 38 | delete (lockers[msg.sender]); 39 | totalLocked -= amount; 40 | lockerCount--; 41 | 42 | require(Token.transfer(msg.sender, amount), "Transfer failed.!!!"); 43 | } 44 | } 45 | -------------------------------------------------------------------------------- /artifacts/@openzeppelin/contracts/token/ERC20/IERC20.sol/IERC20.json: -------------------------------------------------------------------------------- 1 | { 2 | "_format": "hh-sol-artifact-1", 3 | "contractName": "IERC20", 4 | "sourceName": "@openzeppelin/contracts/token/ERC20/IERC20.sol", 5 | "abi": [ 6 | { 7 | "anonymous": false, 8 | "inputs": [ 9 | { 10 | "indexed": true, 11 | "internalType": "address", 12 | "name": "owner", 13 | "type": "address" 14 | }, 15 | { 16 | "indexed": true, 17 | "internalType": "address", 18 | "name": "spender", 19 | "type": "address" 20 | }, 21 | { 22 | "indexed": false, 23 | "internalType": "uint256", 24 | "name": "value", 25 | "type": "uint256" 26 | } 27 | ], 28 | "name": "Approval", 29 | "type": "event" 30 | }, 31 | { 32 | "anonymous": false, 33 | "inputs": [ 34 | { 35 | "indexed": true, 36 | "internalType": "address", 37 | "name": "from", 38 | "type": "address" 39 | }, 40 | { 41 | "indexed": true, 42 | "internalType": "address", 43 | "name": "to", 44 | "type": "address" 45 | }, 46 | { 47 | "indexed": false, 48 | "internalType": "uint256", 49 | "name": "value", 50 | "type": "uint256" 51 | } 52 | ], 53 | "name": "Transfer", 54 | "type": "event" 55 | }, 56 | { 57 | "inputs": [ 58 | { 59 | "internalType": "address", 60 | "name": "owner", 61 | "type": "address" 62 | }, 63 | { 64 | "internalType": "address", 65 | "name": "spender", 66 | "type": "address" 67 | } 68 | ], 69 | "name": "allowance", 70 | "outputs": [ 71 | { 72 | "internalType": "uint256", 73 | "name": "", 74 | "type": "uint256" 75 | } 76 | ], 77 | "stateMutability": "view", 78 | "type": "function" 79 | }, 80 | { 81 | "inputs": [ 82 | { 83 | "internalType": "address", 84 | "name": "spender", 85 | "type": "address" 86 | }, 87 | { 88 | "internalType": "uint256", 89 | "name": "amount", 90 | "type": "uint256" 91 | } 92 | ], 93 | "name": "approve", 94 | "outputs": [ 95 | { 96 | "internalType": "bool", 97 | "name": "", 98 | "type": "bool" 99 | } 100 | ], 101 | "stateMutability": "nonpayable", 102 | "type": "function" 103 | }, 104 | { 105 | "inputs": [ 106 | { 107 | "internalType": "address", 108 | "name": "account", 109 | "type": "address" 110 | } 111 | ], 112 | "name": "balanceOf", 113 | "outputs": [ 114 | { 115 | "internalType": "uint256", 116 | "name": "", 117 | "type": "uint256" 118 | } 119 | ], 120 | "stateMutability": "view", 121 | "type": "function" 122 | }, 123 | { 124 | "inputs": [], 125 | "name": "totalSupply", 126 | "outputs": [ 127 | { 128 | "internalType": "uint256", 129 | "name": "", 130 | "type": "uint256" 131 | } 132 | ], 133 | "stateMutability": "view", 134 | "type": "function" 135 | }, 136 | { 137 | "inputs": [ 138 | { 139 | "internalType": "address", 140 | "name": "to", 141 | "type": "address" 142 | }, 143 | { 144 | "internalType": "uint256", 145 | "name": "amount", 146 | "type": "uint256" 147 | } 148 | ], 149 | "name": "transfer", 150 | "outputs": [ 151 | { 152 | "internalType": "bool", 153 | "name": "", 154 | "type": "bool" 155 | } 156 | ], 157 | "stateMutability": "nonpayable", 158 | "type": "function" 159 | }, 160 | { 161 | "inputs": [ 162 | { 163 | "internalType": "address", 164 | "name": "from", 165 | "type": "address" 166 | }, 167 | { 168 | "internalType": "address", 169 | "name": "to", 170 | "type": "address" 171 | }, 172 | { 173 | "internalType": "uint256", 174 | "name": "amount", 175 | "type": "uint256" 176 | } 177 | ], 178 | "name": "transferFrom", 179 | "outputs": [ 180 | { 181 | "internalType": "bool", 182 | "name": "", 183 | "type": "bool" 184 | } 185 | ], 186 | "stateMutability": "nonpayable", 187 | "type": "function" 188 | } 189 | ], 190 | "bytecode": "0x", 191 | "deployedBytecode": "0x", 192 | "linkReferences": {}, 193 | "deployedLinkReferences": {} 194 | } 195 | -------------------------------------------------------------------------------- /artifacts/@openzeppelin/contracts/token/ERC20/extensions/IERC20Metadata.sol/IERC20Metadata.json: -------------------------------------------------------------------------------- 1 | { 2 | "_format": "hh-sol-artifact-1", 3 | "contractName": "IERC20Metadata", 4 | "sourceName": "@openzeppelin/contracts/token/ERC20/extensions/IERC20Metadata.sol", 5 | "abi": [ 6 | { 7 | "anonymous": false, 8 | "inputs": [ 9 | { 10 | "indexed": true, 11 | "internalType": "address", 12 | "name": "owner", 13 | "type": "address" 14 | }, 15 | { 16 | "indexed": true, 17 | "internalType": "address", 18 | "name": "spender", 19 | "type": "address" 20 | }, 21 | { 22 | "indexed": false, 23 | "internalType": "uint256", 24 | "name": "value", 25 | "type": "uint256" 26 | } 27 | ], 28 | "name": "Approval", 29 | "type": "event" 30 | }, 31 | { 32 | "anonymous": false, 33 | "inputs": [ 34 | { 35 | "indexed": true, 36 | "internalType": "address", 37 | "name": "from", 38 | "type": "address" 39 | }, 40 | { 41 | "indexed": true, 42 | "internalType": "address", 43 | "name": "to", 44 | "type": "address" 45 | }, 46 | { 47 | "indexed": false, 48 | "internalType": "uint256", 49 | "name": "value", 50 | "type": "uint256" 51 | } 52 | ], 53 | "name": "Transfer", 54 | "type": "event" 55 | }, 56 | { 57 | "inputs": [ 58 | { 59 | "internalType": "address", 60 | "name": "owner", 61 | "type": "address" 62 | }, 63 | { 64 | "internalType": "address", 65 | "name": "spender", 66 | "type": "address" 67 | } 68 | ], 69 | "name": "allowance", 70 | "outputs": [ 71 | { 72 | "internalType": "uint256", 73 | "name": "", 74 | "type": "uint256" 75 | } 76 | ], 77 | "stateMutability": "view", 78 | "type": "function" 79 | }, 80 | { 81 | "inputs": [ 82 | { 83 | "internalType": "address", 84 | "name": "spender", 85 | "type": "address" 86 | }, 87 | { 88 | "internalType": "uint256", 89 | "name": "amount", 90 | "type": "uint256" 91 | } 92 | ], 93 | "name": "approve", 94 | "outputs": [ 95 | { 96 | "internalType": "bool", 97 | "name": "", 98 | "type": "bool" 99 | } 100 | ], 101 | "stateMutability": "nonpayable", 102 | "type": "function" 103 | }, 104 | { 105 | "inputs": [ 106 | { 107 | "internalType": "address", 108 | "name": "account", 109 | "type": "address" 110 | } 111 | ], 112 | "name": "balanceOf", 113 | "outputs": [ 114 | { 115 | "internalType": "uint256", 116 | "name": "", 117 | "type": "uint256" 118 | } 119 | ], 120 | "stateMutability": "view", 121 | "type": "function" 122 | }, 123 | { 124 | "inputs": [], 125 | "name": "decimals", 126 | "outputs": [ 127 | { 128 | "internalType": "uint8", 129 | "name": "", 130 | "type": "uint8" 131 | } 132 | ], 133 | "stateMutability": "view", 134 | "type": "function" 135 | }, 136 | { 137 | "inputs": [], 138 | "name": "name", 139 | "outputs": [ 140 | { 141 | "internalType": "string", 142 | "name": "", 143 | "type": "string" 144 | } 145 | ], 146 | "stateMutability": "view", 147 | "type": "function" 148 | }, 149 | { 150 | "inputs": [], 151 | "name": "symbol", 152 | "outputs": [ 153 | { 154 | "internalType": "string", 155 | "name": "", 156 | "type": "string" 157 | } 158 | ], 159 | "stateMutability": "view", 160 | "type": "function" 161 | }, 162 | { 163 | "inputs": [], 164 | "name": "totalSupply", 165 | "outputs": [ 166 | { 167 | "internalType": "uint256", 168 | "name": "", 169 | "type": "uint256" 170 | } 171 | ], 172 | "stateMutability": "view", 173 | "type": "function" 174 | }, 175 | { 176 | "inputs": [ 177 | { 178 | "internalType": "address", 179 | "name": "to", 180 | "type": "address" 181 | }, 182 | { 183 | "internalType": "uint256", 184 | "name": "amount", 185 | "type": "uint256" 186 | } 187 | ], 188 | "name": "transfer", 189 | "outputs": [ 190 | { 191 | "internalType": "bool", 192 | "name": "", 193 | "type": "bool" 194 | } 195 | ], 196 | "stateMutability": "nonpayable", 197 | "type": "function" 198 | }, 199 | { 200 | "inputs": [ 201 | { 202 | "internalType": "address", 203 | "name": "from", 204 | "type": "address" 205 | }, 206 | { 207 | "internalType": "address", 208 | "name": "to", 209 | "type": "address" 210 | }, 211 | { 212 | "internalType": "uint256", 213 | "name": "amount", 214 | "type": "uint256" 215 | } 216 | ], 217 | "name": "transferFrom", 218 | "outputs": [ 219 | { 220 | "internalType": "bool", 221 | "name": "", 222 | "type": "bool" 223 | } 224 | ], 225 | "stateMutability": "nonpayable", 226 | "type": "function" 227 | } 228 | ], 229 | "bytecode": "0x", 230 | "deployedBytecode": "0x", 231 | "linkReferences": {}, 232 | "deployedLinkReferences": {} 233 | } 234 | -------------------------------------------------------------------------------- /cache/solidity-files-cache.json: -------------------------------------------------------------------------------- 1 | { 2 | "_format": "hh-sol-cache-2", 3 | "files": { 4 | "C:\\Users\\Mustafa\\Desktop\\medium-proje\\contracts\\Lock.sol": { 5 | "lastModificationDate": 1659218818973, 6 | "contentHash": "b41baa261532824ec10ffafafa189c5c", 7 | "sourceName": "contracts/Lock.sol", 8 | "solcConfig": { 9 | "version": "0.8.2", 10 | "settings": { 11 | "optimizer": { 12 | "enabled": false, 13 | "runs": 200 14 | }, 15 | "outputSelection": { 16 | "*": { 17 | "*": [ 18 | "abi", 19 | "evm.bytecode", 20 | "evm.deployedBytecode", 21 | "evm.methodIdentifiers", 22 | "metadata" 23 | ], 24 | "": [ 25 | "ast" 26 | ] 27 | } 28 | } 29 | } 30 | }, 31 | "imports": [ 32 | "./Token.sol" 33 | ], 34 | "versionPragmas": [ 35 | "^0.8.2" 36 | ], 37 | "artifacts": [ 38 | "Lock" 39 | ] 40 | }, 41 | "C:\\Users\\Mustafa\\Desktop\\medium-proje\\contracts\\Token.sol": { 42 | "lastModificationDate": 1659218819020, 43 | "contentHash": "8d55b4a8f13f621bbe79259ca4def7ee", 44 | "sourceName": "contracts/Token.sol", 45 | "solcConfig": { 46 | "version": "0.8.2", 47 | "settings": { 48 | "optimizer": { 49 | "enabled": false, 50 | "runs": 200 51 | }, 52 | "outputSelection": { 53 | "*": { 54 | "*": [ 55 | "abi", 56 | "evm.bytecode", 57 | "evm.deployedBytecode", 58 | "evm.methodIdentifiers", 59 | "metadata" 60 | ], 61 | "": [ 62 | "ast" 63 | ] 64 | } 65 | } 66 | } 67 | }, 68 | "imports": [ 69 | "@openzeppelin/contracts/token/ERC20/ERC20.sol" 70 | ], 71 | "versionPragmas": [ 72 | "^0.8.2" 73 | ], 74 | "artifacts": [ 75 | "BeeToken" 76 | ] 77 | }, 78 | "C:\\Users\\Mustafa\\Desktop\\medium-proje\\node_modules\\@openzeppelin\\contracts\\token\\ERC20\\ERC20.sol": { 79 | "lastModificationDate": 1659219180184, 80 | "contentHash": "af7bd64e1cfefbf6cb07f2adc1a25392", 81 | "sourceName": "@openzeppelin/contracts/token/ERC20/ERC20.sol", 82 | "solcConfig": { 83 | "version": "0.8.2", 84 | "settings": { 85 | "optimizer": { 86 | "enabled": false, 87 | "runs": 200 88 | }, 89 | "outputSelection": { 90 | "*": { 91 | "*": [ 92 | "abi", 93 | "evm.bytecode", 94 | "evm.deployedBytecode", 95 | "evm.methodIdentifiers", 96 | "metadata" 97 | ], 98 | "": [ 99 | "ast" 100 | ] 101 | } 102 | } 103 | } 104 | }, 105 | "imports": [ 106 | "./IERC20.sol", 107 | "./extensions/IERC20Metadata.sol", 108 | "../../utils/Context.sol" 109 | ], 110 | "versionPragmas": [ 111 | "^0.8.0" 112 | ], 113 | "artifacts": [ 114 | "ERC20" 115 | ] 116 | }, 117 | "C:\\Users\\Mustafa\\Desktop\\medium-proje\\node_modules\\@openzeppelin\\contracts\\token\\ERC20\\IERC20.sol": { 118 | "lastModificationDate": 1659219180344, 119 | "contentHash": "ad7c2d0af148c8f9f097d65deeb4da6b", 120 | "sourceName": "@openzeppelin/contracts/token/ERC20/IERC20.sol", 121 | "solcConfig": { 122 | "version": "0.8.2", 123 | "settings": { 124 | "optimizer": { 125 | "enabled": false, 126 | "runs": 200 127 | }, 128 | "outputSelection": { 129 | "*": { 130 | "*": [ 131 | "abi", 132 | "evm.bytecode", 133 | "evm.deployedBytecode", 134 | "evm.methodIdentifiers", 135 | "metadata" 136 | ], 137 | "": [ 138 | "ast" 139 | ] 140 | } 141 | } 142 | } 143 | }, 144 | "imports": [], 145 | "versionPragmas": [ 146 | "^0.8.0" 147 | ], 148 | "artifacts": [ 149 | "IERC20" 150 | ] 151 | }, 152 | "C:\\Users\\Mustafa\\Desktop\\medium-proje\\node_modules\\@openzeppelin\\contracts\\token\\ERC20\\extensions\\IERC20Metadata.sol": { 153 | "lastModificationDate": 1659219180346, 154 | "contentHash": "909ab67fc5c25033fe6cd364f8c056f9", 155 | "sourceName": "@openzeppelin/contracts/token/ERC20/extensions/IERC20Metadata.sol", 156 | "solcConfig": { 157 | "version": "0.8.2", 158 | "settings": { 159 | "optimizer": { 160 | "enabled": false, 161 | "runs": 200 162 | }, 163 | "outputSelection": { 164 | "*": { 165 | "*": [ 166 | "abi", 167 | "evm.bytecode", 168 | "evm.deployedBytecode", 169 | "evm.methodIdentifiers", 170 | "metadata" 171 | ], 172 | "": [ 173 | "ast" 174 | ] 175 | } 176 | } 177 | } 178 | }, 179 | "imports": [ 180 | "../IERC20.sol" 181 | ], 182 | "versionPragmas": [ 183 | "^0.8.0" 184 | ], 185 | "artifacts": [ 186 | "IERC20Metadata" 187 | ] 188 | }, 189 | "C:\\Users\\Mustafa\\Desktop\\medium-proje\\node_modules\\@openzeppelin\\contracts\\utils\\Context.sol": { 190 | "lastModificationDate": 1659219180114, 191 | "contentHash": "5f2c5c4b6af2dd4551027144797bc8be", 192 | "sourceName": "@openzeppelin/contracts/utils/Context.sol", 193 | "solcConfig": { 194 | "version": "0.8.2", 195 | "settings": { 196 | "optimizer": { 197 | "enabled": false, 198 | "runs": 200 199 | }, 200 | "outputSelection": { 201 | "*": { 202 | "*": [ 203 | "abi", 204 | "evm.bytecode", 205 | "evm.deployedBytecode", 206 | "evm.methodIdentifiers", 207 | "metadata" 208 | ], 209 | "": [ 210 | "ast" 211 | ] 212 | } 213 | } 214 | } 215 | }, 216 | "imports": [], 217 | "versionPragmas": [ 218 | "^0.8.0" 219 | ], 220 | "artifacts": [ 221 | "Context" 222 | ] 223 | } 224 | } 225 | } 226 | -------------------------------------------------------------------------------- /artifacts/contracts/Lock.sol/Lock.json: -------------------------------------------------------------------------------- 1 | { 2 | "_format": "hh-sol-artifact-1", 3 | "contractName": "Lock", 4 | "sourceName": "contracts/Lock.sol", 5 | "abi": [ 6 | { 7 | "inputs": [ 8 | { 9 | "internalType": "address", 10 | "name": "tokenAddress", 11 | "type": "address" 12 | } 13 | ], 14 | "stateMutability": "nonpayable", 15 | "type": "constructor" 16 | }, 17 | { 18 | "inputs": [ 19 | { 20 | "internalType": "uint256", 21 | "name": "amount", 22 | "type": "uint256" 23 | }, 24 | { 25 | "internalType": "uint256", 26 | "name": "time", 27 | "type": "uint256" 28 | } 29 | ], 30 | "name": "LockToken", 31 | "outputs": [], 32 | "stateMutability": "nonpayable", 33 | "type": "function" 34 | }, 35 | { 36 | "inputs": [ 37 | { 38 | "internalType": "address", 39 | "name": "", 40 | "type": "address" 41 | } 42 | ], 43 | "name": "deadLine", 44 | "outputs": [ 45 | { 46 | "internalType": "uint256", 47 | "name": "", 48 | "type": "uint256" 49 | } 50 | ], 51 | "stateMutability": "view", 52 | "type": "function" 53 | }, 54 | { 55 | "inputs": [], 56 | "name": "lockerCount", 57 | "outputs": [ 58 | { 59 | "internalType": "uint256", 60 | "name": "", 61 | "type": "uint256" 62 | } 63 | ], 64 | "stateMutability": "view", 65 | "type": "function" 66 | }, 67 | { 68 | "inputs": [ 69 | { 70 | "internalType": "address", 71 | "name": "", 72 | "type": "address" 73 | } 74 | ], 75 | "name": "lockers", 76 | "outputs": [ 77 | { 78 | "internalType": "uint256", 79 | "name": "", 80 | "type": "uint256" 81 | } 82 | ], 83 | "stateMutability": "view", 84 | "type": "function" 85 | }, 86 | { 87 | "inputs": [], 88 | "name": "totalLocked", 89 | "outputs": [ 90 | { 91 | "internalType": "uint256", 92 | "name": "", 93 | "type": "uint256" 94 | } 95 | ], 96 | "stateMutability": "view", 97 | "type": "function" 98 | }, 99 | { 100 | "inputs": [], 101 | "name": "withdrawToken", 102 | "outputs": [], 103 | "stateMutability": "nonpayable", 104 | "type": "function" 105 | } 106 | ], 107 | "bytecode": "0x608060405234801561001057600080fd5b50604051610cb3380380610cb38339818101604052810190610032919061008d565b806000806101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550506100ff565b600081519050610087816100e8565b92915050565b60006020828403121561009f57600080fd5b60006100ad84828501610078565b91505092915050565b60006100c1826100c8565b9050919050565b600073ffffffffffffffffffffffffffffffffffffffff82169050919050565b6100f1816100b6565b81146100fc57600080fd5b50565b610ba58061010e6000396000f3fe608060405234801561001057600080fd5b50600436106100625760003560e01c80632c8e7a2114610067578063568914121461009757806357bb55e6146100b557806358e46a73146100d1578063ca628c7814610101578063ccd96eb61461010b575b600080fd5b610081600480360381019061007c91906106a8565b610129565b60405161008e91906108c0565b60405180910390f35b61009f610141565b6040516100ac91906108c0565b60405180910390f35b6100cf60048036038101906100ca91906106fa565b610147565b005b6100eb60048036038101906100e691906106a8565b6103a1565b6040516100f891906108c0565b60405180910390f35b6101096103b9565b005b610113610663565b60405161012091906108c0565b60405180910390f35b60036020528060005260406000206000915090505481565b60025481565b6000821161018a576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161018190610880565b60405180910390fd5b6000600360003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002054116101ea57600160008154809291906101e4906109e8565b91905055505b81600260008282546101fc91906108ec565b9250508190555081600360003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600082825461025291906108ec565b92505081905550804261026591906108ec565b600460003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000208190555060008060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff166323b872dd3330866040518463ffffffff1660e01b8152600401610308939291906107e0565b602060405180830381600087803b15801561032257600080fd5b505af1158015610336573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061035a91906106d1565b90508061039c576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610393906108a0565b60405180910390fd5b505050565b60046020528060005260406000206000915090505481565b6000600360003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020541161043b576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161043290610860565b60405180910390fd5b600460003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000205442116104bc576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016104b390610840565b60405180910390fd5b6000600360003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020549050600360003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000206000905580600260008282546105559190610942565b925050819055506001600081548092919061056f906109be565b919050555060008054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1663a9059cbb33836040518363ffffffff1660e01b81526004016105cf929190610817565b602060405180830381600087803b1580156105e957600080fd5b505af11580156105fd573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061062191906106d1565b610660576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610657906108a0565b60405180910390fd5b50565b60015481565b60008135905061067881610b2a565b92915050565b60008151905061068d81610b41565b92915050565b6000813590506106a281610b58565b92915050565b6000602082840312156106ba57600080fd5b60006106c884828501610669565b91505092915050565b6000602082840312156106e357600080fd5b60006106f18482850161067e565b91505092915050565b6000806040838503121561070d57600080fd5b600061071b85828601610693565b925050602061072c85828601610693565b9150509250929050565b61073f81610976565b82525050565b60006107526014836108db565b915061075d82610a60565b602082019050919050565b60006107756010836108db565b915061078082610a89565b602082019050919050565b60006107986022836108db565b91506107a382610ab2565b604082019050919050565b60006107bb6013836108db565b91506107c682610b01565b602082019050919050565b6107da816109b4565b82525050565b60006060820190506107f56000830186610736565b6108026020830185610736565b61080f60408301846107d1565b949350505050565b600060408201905061082c6000830185610736565b61083960208301846107d1565b9392505050565b6000602082019050818103600083015261085981610745565b9050919050565b6000602082019050818103600083015261087981610768565b9050919050565b600060208201905081810360008301526108998161078b565b9050919050565b600060208201905081810360008301526108b9816107ae565b9050919050565b60006020820190506108d560008301846107d1565b92915050565b600082825260208201905092915050565b60006108f7826109b4565b9150610902836109b4565b9250827fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0382111561093757610936610a31565b5b828201905092915050565b600061094d826109b4565b9150610958836109b4565b92508282101561096b5761096a610a31565b5b828203905092915050565b600061098182610994565b9050919050565b60008115159050919050565b600073ffffffffffffffffffffffffffffffffffffffff82169050919050565b6000819050919050565b60006109c9826109b4565b915060008214156109dd576109dc610a31565b5b600182039050919050565b60006109f3826109b4565b91507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff821415610a2657610a25610a31565b5b600182019050919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b7f646561646c696e65206973206e6f74206f766572000000000000000000000000600082015250565b7f6e6f7420656e6f75676820746f6b656e00000000000000000000000000000000600082015250565b7f546f6b656e20616d6f756e74206d75737420626520626967676572207468616e60008201527f2030000000000000000000000000000000000000000000000000000000000000602082015250565b7f5472616e73666572206661696c65642e21212100000000000000000000000000600082015250565b610b3381610976565b8114610b3e57600080fd5b50565b610b4a81610988565b8114610b5557600080fd5b50565b610b61816109b4565b8114610b6c57600080fd5b5056fea2646970667358221220b2257eae8b90d1e6647a01a9ad6fa0a9b4365d3df7ff8815a808eff321de11e964736f6c63430008020033", 108 | "deployedBytecode": "0x608060405234801561001057600080fd5b50600436106100625760003560e01c80632c8e7a2114610067578063568914121461009757806357bb55e6146100b557806358e46a73146100d1578063ca628c7814610101578063ccd96eb61461010b575b600080fd5b610081600480360381019061007c91906106a8565b610129565b60405161008e91906108c0565b60405180910390f35b61009f610141565b6040516100ac91906108c0565b60405180910390f35b6100cf60048036038101906100ca91906106fa565b610147565b005b6100eb60048036038101906100e691906106a8565b6103a1565b6040516100f891906108c0565b60405180910390f35b6101096103b9565b005b610113610663565b60405161012091906108c0565b60405180910390f35b60036020528060005260406000206000915090505481565b60025481565b6000821161018a576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161018190610880565b60405180910390fd5b6000600360003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002054116101ea57600160008154809291906101e4906109e8565b91905055505b81600260008282546101fc91906108ec565b9250508190555081600360003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600082825461025291906108ec565b92505081905550804261026591906108ec565b600460003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000208190555060008060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff166323b872dd3330866040518463ffffffff1660e01b8152600401610308939291906107e0565b602060405180830381600087803b15801561032257600080fd5b505af1158015610336573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061035a91906106d1565b90508061039c576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610393906108a0565b60405180910390fd5b505050565b60046020528060005260406000206000915090505481565b6000600360003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020541161043b576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161043290610860565b60405180910390fd5b600460003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000205442116104bc576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016104b390610840565b60405180910390fd5b6000600360003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020549050600360003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000206000905580600260008282546105559190610942565b925050819055506001600081548092919061056f906109be565b919050555060008054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1663a9059cbb33836040518363ffffffff1660e01b81526004016105cf929190610817565b602060405180830381600087803b1580156105e957600080fd5b505af11580156105fd573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061062191906106d1565b610660576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610657906108a0565b60405180910390fd5b50565b60015481565b60008135905061067881610b2a565b92915050565b60008151905061068d81610b41565b92915050565b6000813590506106a281610b58565b92915050565b6000602082840312156106ba57600080fd5b60006106c884828501610669565b91505092915050565b6000602082840312156106e357600080fd5b60006106f18482850161067e565b91505092915050565b6000806040838503121561070d57600080fd5b600061071b85828601610693565b925050602061072c85828601610693565b9150509250929050565b61073f81610976565b82525050565b60006107526014836108db565b915061075d82610a60565b602082019050919050565b60006107756010836108db565b915061078082610a89565b602082019050919050565b60006107986022836108db565b91506107a382610ab2565b604082019050919050565b60006107bb6013836108db565b91506107c682610b01565b602082019050919050565b6107da816109b4565b82525050565b60006060820190506107f56000830186610736565b6108026020830185610736565b61080f60408301846107d1565b949350505050565b600060408201905061082c6000830185610736565b61083960208301846107d1565b9392505050565b6000602082019050818103600083015261085981610745565b9050919050565b6000602082019050818103600083015261087981610768565b9050919050565b600060208201905081810360008301526108998161078b565b9050919050565b600060208201905081810360008301526108b9816107ae565b9050919050565b60006020820190506108d560008301846107d1565b92915050565b600082825260208201905092915050565b60006108f7826109b4565b9150610902836109b4565b9250827fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0382111561093757610936610a31565b5b828201905092915050565b600061094d826109b4565b9150610958836109b4565b92508282101561096b5761096a610a31565b5b828203905092915050565b600061098182610994565b9050919050565b60008115159050919050565b600073ffffffffffffffffffffffffffffffffffffffff82169050919050565b6000819050919050565b60006109c9826109b4565b915060008214156109dd576109dc610a31565b5b600182039050919050565b60006109f3826109b4565b91507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff821415610a2657610a25610a31565b5b600182019050919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b7f646561646c696e65206973206e6f74206f766572000000000000000000000000600082015250565b7f6e6f7420656e6f75676820746f6b656e00000000000000000000000000000000600082015250565b7f546f6b656e20616d6f756e74206d75737420626520626967676572207468616e60008201527f2030000000000000000000000000000000000000000000000000000000000000602082015250565b7f5472616e73666572206661696c65642e21212100000000000000000000000000600082015250565b610b3381610976565b8114610b3e57600080fd5b50565b610b4a81610988565b8114610b5557600080fd5b50565b610b61816109b4565b8114610b6c57600080fd5b5056fea2646970667358221220b2257eae8b90d1e6647a01a9ad6fa0a9b4365d3df7ff8815a808eff321de11e964736f6c63430008020033", 109 | "linkReferences": {}, 110 | "deployedLinkReferences": {} 111 | } 112 | -------------------------------------------------------------------------------- /artifacts/@openzeppelin/contracts/token/ERC20/ERC20.sol/ERC20.json: -------------------------------------------------------------------------------- 1 | { 2 | "_format": "hh-sol-artifact-1", 3 | "contractName": "ERC20", 4 | "sourceName": "@openzeppelin/contracts/token/ERC20/ERC20.sol", 5 | "abi": [ 6 | { 7 | "inputs": [ 8 | { 9 | "internalType": "string", 10 | "name": "name_", 11 | "type": "string" 12 | }, 13 | { 14 | "internalType": "string", 15 | "name": "symbol_", 16 | "type": "string" 17 | } 18 | ], 19 | "stateMutability": "nonpayable", 20 | "type": "constructor" 21 | }, 22 | { 23 | "anonymous": false, 24 | "inputs": [ 25 | { 26 | "indexed": true, 27 | "internalType": "address", 28 | "name": "owner", 29 | "type": "address" 30 | }, 31 | { 32 | "indexed": true, 33 | "internalType": "address", 34 | "name": "spender", 35 | "type": "address" 36 | }, 37 | { 38 | "indexed": false, 39 | "internalType": "uint256", 40 | "name": "value", 41 | "type": "uint256" 42 | } 43 | ], 44 | "name": "Approval", 45 | "type": "event" 46 | }, 47 | { 48 | "anonymous": false, 49 | "inputs": [ 50 | { 51 | "indexed": true, 52 | "internalType": "address", 53 | "name": "from", 54 | "type": "address" 55 | }, 56 | { 57 | "indexed": true, 58 | "internalType": "address", 59 | "name": "to", 60 | "type": "address" 61 | }, 62 | { 63 | "indexed": false, 64 | "internalType": "uint256", 65 | "name": "value", 66 | "type": "uint256" 67 | } 68 | ], 69 | "name": "Transfer", 70 | "type": "event" 71 | }, 72 | { 73 | "inputs": [ 74 | { 75 | "internalType": "address", 76 | "name": "owner", 77 | "type": "address" 78 | }, 79 | { 80 | "internalType": "address", 81 | "name": "spender", 82 | "type": "address" 83 | } 84 | ], 85 | "name": "allowance", 86 | "outputs": [ 87 | { 88 | "internalType": "uint256", 89 | "name": "", 90 | "type": "uint256" 91 | } 92 | ], 93 | "stateMutability": "view", 94 | "type": "function" 95 | }, 96 | { 97 | "inputs": [ 98 | { 99 | "internalType": "address", 100 | "name": "spender", 101 | "type": "address" 102 | }, 103 | { 104 | "internalType": "uint256", 105 | "name": "amount", 106 | "type": "uint256" 107 | } 108 | ], 109 | "name": "approve", 110 | "outputs": [ 111 | { 112 | "internalType": "bool", 113 | "name": "", 114 | "type": "bool" 115 | } 116 | ], 117 | "stateMutability": "nonpayable", 118 | "type": "function" 119 | }, 120 | { 121 | "inputs": [ 122 | { 123 | "internalType": "address", 124 | "name": "account", 125 | "type": "address" 126 | } 127 | ], 128 | "name": "balanceOf", 129 | "outputs": [ 130 | { 131 | "internalType": "uint256", 132 | "name": "", 133 | "type": "uint256" 134 | } 135 | ], 136 | "stateMutability": "view", 137 | "type": "function" 138 | }, 139 | { 140 | "inputs": [], 141 | "name": "decimals", 142 | "outputs": [ 143 | { 144 | "internalType": "uint8", 145 | "name": "", 146 | "type": "uint8" 147 | } 148 | ], 149 | "stateMutability": "view", 150 | "type": "function" 151 | }, 152 | { 153 | "inputs": [ 154 | { 155 | "internalType": "address", 156 | "name": "spender", 157 | "type": "address" 158 | }, 159 | { 160 | "internalType": "uint256", 161 | "name": "subtractedValue", 162 | "type": "uint256" 163 | } 164 | ], 165 | "name": "decreaseAllowance", 166 | "outputs": [ 167 | { 168 | "internalType": "bool", 169 | "name": "", 170 | "type": "bool" 171 | } 172 | ], 173 | "stateMutability": "nonpayable", 174 | "type": "function" 175 | }, 176 | { 177 | "inputs": [ 178 | { 179 | "internalType": "address", 180 | "name": "spender", 181 | "type": "address" 182 | }, 183 | { 184 | "internalType": "uint256", 185 | "name": "addedValue", 186 | "type": "uint256" 187 | } 188 | ], 189 | "name": "increaseAllowance", 190 | "outputs": [ 191 | { 192 | "internalType": "bool", 193 | "name": "", 194 | "type": "bool" 195 | } 196 | ], 197 | "stateMutability": "nonpayable", 198 | "type": "function" 199 | }, 200 | { 201 | "inputs": [], 202 | "name": "name", 203 | "outputs": [ 204 | { 205 | "internalType": "string", 206 | "name": "", 207 | "type": "string" 208 | } 209 | ], 210 | "stateMutability": "view", 211 | "type": "function" 212 | }, 213 | { 214 | "inputs": [], 215 | "name": "symbol", 216 | "outputs": [ 217 | { 218 | "internalType": "string", 219 | "name": "", 220 | "type": "string" 221 | } 222 | ], 223 | "stateMutability": "view", 224 | "type": "function" 225 | }, 226 | { 227 | "inputs": [], 228 | "name": "totalSupply", 229 | "outputs": [ 230 | { 231 | "internalType": "uint256", 232 | "name": "", 233 | "type": "uint256" 234 | } 235 | ], 236 | "stateMutability": "view", 237 | "type": "function" 238 | }, 239 | { 240 | "inputs": [ 241 | { 242 | "internalType": "address", 243 | "name": "to", 244 | "type": "address" 245 | }, 246 | { 247 | "internalType": "uint256", 248 | "name": "amount", 249 | "type": "uint256" 250 | } 251 | ], 252 | "name": "transfer", 253 | "outputs": [ 254 | { 255 | "internalType": "bool", 256 | "name": "", 257 | "type": "bool" 258 | } 259 | ], 260 | "stateMutability": "nonpayable", 261 | "type": "function" 262 | }, 263 | { 264 | "inputs": [ 265 | { 266 | "internalType": "address", 267 | "name": "from", 268 | "type": "address" 269 | }, 270 | { 271 | "internalType": "address", 272 | "name": "to", 273 | "type": "address" 274 | }, 275 | { 276 | "internalType": "uint256", 277 | "name": "amount", 278 | "type": "uint256" 279 | } 280 | ], 281 | "name": "transferFrom", 282 | "outputs": [ 283 | { 284 | "internalType": "bool", 285 | "name": "", 286 | "type": "bool" 287 | } 288 | ], 289 | "stateMutability": "nonpayable", 290 | "type": "function" 291 | } 292 | ], 293 | "bytecode": "0x60806040523480156200001157600080fd5b50604051620015d9380380620015d9833981810160405281019062000037919062000193565b81600390805190602001906200004f92919062000071565b5080600490805190602001906200006892919062000071565b50505062000376565b8280546200007f906200029b565b90600052602060002090601f016020900481019282620000a35760008555620000ef565b82601f10620000be57805160ff1916838001178555620000ef565b82800160010185558215620000ef579182015b82811115620000ee578251825591602001919060010190620000d1565b5b509050620000fe919062000102565b5090565b5b808211156200011d57600081600090555060010162000103565b5090565b60006200013862000132846200022f565b62000206565b9050828152602081018484840111156200015157600080fd5b6200015e84828562000265565b509392505050565b600082601f8301126200017857600080fd5b81516200018a84826020860162000121565b91505092915050565b60008060408385031215620001a757600080fd5b600083015167ffffffffffffffff811115620001c257600080fd5b620001d08582860162000166565b925050602083015167ffffffffffffffff811115620001ee57600080fd5b620001fc8582860162000166565b9150509250929050565b60006200021262000225565b9050620002208282620002d1565b919050565b6000604051905090565b600067ffffffffffffffff8211156200024d576200024c62000336565b5b620002588262000365565b9050602081019050919050565b60005b838110156200028557808201518184015260208101905062000268565b8381111562000295576000848401525b50505050565b60006002820490506001821680620002b457607f821691505b60208210811415620002cb57620002ca62000307565b5b50919050565b620002dc8262000365565b810181811067ffffffffffffffff82111715620002fe57620002fd62000336565b5b80604052505050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b6000601f19601f8301169050919050565b61125380620003866000396000f3fe608060405234801561001057600080fd5b50600436106100a95760003560e01c80633950935111610071578063395093511461016857806370a082311461019857806395d89b41146101c8578063a457c2d7146101e6578063a9059cbb14610216578063dd62ed3e14610246576100a9565b806306fdde03146100ae578063095ea7b3146100cc57806318160ddd146100fc57806323b872dd1461011a578063313ce5671461014a575b600080fd5b6100b6610276565b6040516100c39190610d19565b60405180910390f35b6100e660048036038101906100e19190610b67565b610308565b6040516100f39190610cfe565b60405180910390f35b61010461032b565b6040516101119190610e1b565b60405180910390f35b610134600480360381019061012f9190610b18565b610335565b6040516101419190610cfe565b60405180910390f35b610152610364565b60405161015f9190610e36565b60405180910390f35b610182600480360381019061017d9190610b67565b61036d565b60405161018f9190610cfe565b60405180910390f35b6101b260048036038101906101ad9190610ab3565b6103a4565b6040516101bf9190610e1b565b60405180910390f35b6101d06103ec565b6040516101dd9190610d19565b60405180910390f35b61020060048036038101906101fb9190610b67565b61047e565b60405161020d9190610cfe565b60405180910390f35b610230600480360381019061022b9190610b67565b6104f5565b60405161023d9190610cfe565b60405180910390f35b610260600480360381019061025b9190610adc565b610518565b60405161026d9190610e1b565b60405180910390f35b60606003805461028590610f4b565b80601f01602080910402602001604051908101604052809291908181526020018280546102b190610f4b565b80156102fe5780601f106102d3576101008083540402835291602001916102fe565b820191906000526020600020905b8154815290600101906020018083116102e157829003601f168201915b5050505050905090565b60008061031361059f565b90506103208185856105a7565b600191505092915050565b6000600254905090565b60008061034061059f565b905061034d858285610772565b6103588585856107fe565b60019150509392505050565b60006012905090565b60008061037861059f565b905061039981858561038a8589610518565b6103949190610e6d565b6105a7565b600191505092915050565b60008060008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020549050919050565b6060600480546103fb90610f4b565b80601f016020809104026020016040519081016040528092919081815260200182805461042790610f4b565b80156104745780601f1061044957610100808354040283529160200191610474565b820191906000526020600020905b81548152906001019060200180831161045757829003601f168201915b5050505050905090565b60008061048961059f565b905060006104978286610518565b9050838110156104dc576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016104d390610dfb565b60405180910390fd5b6104e982868684036105a7565b60019250505092915050565b60008061050061059f565b905061050d8185856107fe565b600191505092915050565b6000600160008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002054905092915050565b600033905090565b600073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff161415610617576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161060e90610ddb565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff161415610687576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161067e90610d5b565b60405180910390fd5b80600160008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020819055508173ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff167f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b925836040516107659190610e1b565b60405180910390a3505050565b600061077e8484610518565b90507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff81146107f857818110156107ea576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016107e190610d7b565b60405180910390fd5b6107f784848484036105a7565b5b50505050565b600073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff16141561086e576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161086590610dbb565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1614156108de576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016108d590610d3b565b60405180910390fd5b6108e9838383610a7f565b60008060008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000205490508181101561096f576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161096690610d9b565b60405180910390fd5b8181036000808673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002081905550816000808573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000206000828254610a029190610e6d565b925050819055508273ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef84604051610a669190610e1b565b60405180910390a3610a79848484610a84565b50505050565b505050565b505050565b600081359050610a98816111ef565b92915050565b600081359050610aad81611206565b92915050565b600060208284031215610ac557600080fd5b6000610ad384828501610a89565b91505092915050565b60008060408385031215610aef57600080fd5b6000610afd85828601610a89565b9250506020610b0e85828601610a89565b9150509250929050565b600080600060608486031215610b2d57600080fd5b6000610b3b86828701610a89565b9350506020610b4c86828701610a89565b9250506040610b5d86828701610a9e565b9150509250925092565b60008060408385031215610b7a57600080fd5b6000610b8885828601610a89565b9250506020610b9985828601610a9e565b9150509250929050565b610bac81610ed5565b82525050565b6000610bbd82610e51565b610bc78185610e5c565b9350610bd7818560208601610f18565b610be081610fdb565b840191505092915050565b6000610bf8602383610e5c565b9150610c0382610fec565b604082019050919050565b6000610c1b602283610e5c565b9150610c268261103b565b604082019050919050565b6000610c3e601d83610e5c565b9150610c498261108a565b602082019050919050565b6000610c61602683610e5c565b9150610c6c826110b3565b604082019050919050565b6000610c84602583610e5c565b9150610c8f82611102565b604082019050919050565b6000610ca7602483610e5c565b9150610cb282611151565b604082019050919050565b6000610cca602583610e5c565b9150610cd5826111a0565b604082019050919050565b610ce981610f01565b82525050565b610cf881610f0b565b82525050565b6000602082019050610d136000830184610ba3565b92915050565b60006020820190508181036000830152610d338184610bb2565b905092915050565b60006020820190508181036000830152610d5481610beb565b9050919050565b60006020820190508181036000830152610d7481610c0e565b9050919050565b60006020820190508181036000830152610d9481610c31565b9050919050565b60006020820190508181036000830152610db481610c54565b9050919050565b60006020820190508181036000830152610dd481610c77565b9050919050565b60006020820190508181036000830152610df481610c9a565b9050919050565b60006020820190508181036000830152610e1481610cbd565b9050919050565b6000602082019050610e306000830184610ce0565b92915050565b6000602082019050610e4b6000830184610cef565b92915050565b600081519050919050565b600082825260208201905092915050565b6000610e7882610f01565b9150610e8383610f01565b9250827fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff03821115610eb857610eb7610f7d565b5b828201905092915050565b6000610ece82610ee1565b9050919050565b60008115159050919050565b600073ffffffffffffffffffffffffffffffffffffffff82169050919050565b6000819050919050565b600060ff82169050919050565b60005b83811015610f36578082015181840152602081019050610f1b565b83811115610f45576000848401525b50505050565b60006002820490506001821680610f6357607f821691505b60208210811415610f7757610f76610fac565b5b50919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b6000601f19601f8301169050919050565b7f45524332303a207472616e7366657220746f20746865207a65726f206164647260008201527f6573730000000000000000000000000000000000000000000000000000000000602082015250565b7f45524332303a20617070726f766520746f20746865207a65726f20616464726560008201527f7373000000000000000000000000000000000000000000000000000000000000602082015250565b7f45524332303a20696e73756666696369656e7420616c6c6f77616e6365000000600082015250565b7f45524332303a207472616e7366657220616d6f756e742065786365656473206260008201527f616c616e63650000000000000000000000000000000000000000000000000000602082015250565b7f45524332303a207472616e736665722066726f6d20746865207a65726f20616460008201527f6472657373000000000000000000000000000000000000000000000000000000602082015250565b7f45524332303a20617070726f76652066726f6d20746865207a65726f2061646460008201527f7265737300000000000000000000000000000000000000000000000000000000602082015250565b7f45524332303a2064656372656173656420616c6c6f77616e63652062656c6f7760008201527f207a65726f000000000000000000000000000000000000000000000000000000602082015250565b6111f881610ec3565b811461120357600080fd5b50565b61120f81610f01565b811461121a57600080fd5b5056fea264697066735822122078736b85f9a6445c14622d8d730f663e8f67a8e04fdba2889d528c1d4c4c51ab64736f6c63430008020033", 294 | "deployedBytecode": "0x608060405234801561001057600080fd5b50600436106100a95760003560e01c80633950935111610071578063395093511461016857806370a082311461019857806395d89b41146101c8578063a457c2d7146101e6578063a9059cbb14610216578063dd62ed3e14610246576100a9565b806306fdde03146100ae578063095ea7b3146100cc57806318160ddd146100fc57806323b872dd1461011a578063313ce5671461014a575b600080fd5b6100b6610276565b6040516100c39190610d19565b60405180910390f35b6100e660048036038101906100e19190610b67565b610308565b6040516100f39190610cfe565b60405180910390f35b61010461032b565b6040516101119190610e1b565b60405180910390f35b610134600480360381019061012f9190610b18565b610335565b6040516101419190610cfe565b60405180910390f35b610152610364565b60405161015f9190610e36565b60405180910390f35b610182600480360381019061017d9190610b67565b61036d565b60405161018f9190610cfe565b60405180910390f35b6101b260048036038101906101ad9190610ab3565b6103a4565b6040516101bf9190610e1b565b60405180910390f35b6101d06103ec565b6040516101dd9190610d19565b60405180910390f35b61020060048036038101906101fb9190610b67565b61047e565b60405161020d9190610cfe565b60405180910390f35b610230600480360381019061022b9190610b67565b6104f5565b60405161023d9190610cfe565b60405180910390f35b610260600480360381019061025b9190610adc565b610518565b60405161026d9190610e1b565b60405180910390f35b60606003805461028590610f4b565b80601f01602080910402602001604051908101604052809291908181526020018280546102b190610f4b565b80156102fe5780601f106102d3576101008083540402835291602001916102fe565b820191906000526020600020905b8154815290600101906020018083116102e157829003601f168201915b5050505050905090565b60008061031361059f565b90506103208185856105a7565b600191505092915050565b6000600254905090565b60008061034061059f565b905061034d858285610772565b6103588585856107fe565b60019150509392505050565b60006012905090565b60008061037861059f565b905061039981858561038a8589610518565b6103949190610e6d565b6105a7565b600191505092915050565b60008060008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020549050919050565b6060600480546103fb90610f4b565b80601f016020809104026020016040519081016040528092919081815260200182805461042790610f4b565b80156104745780601f1061044957610100808354040283529160200191610474565b820191906000526020600020905b81548152906001019060200180831161045757829003601f168201915b5050505050905090565b60008061048961059f565b905060006104978286610518565b9050838110156104dc576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016104d390610dfb565b60405180910390fd5b6104e982868684036105a7565b60019250505092915050565b60008061050061059f565b905061050d8185856107fe565b600191505092915050565b6000600160008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002054905092915050565b600033905090565b600073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff161415610617576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161060e90610ddb565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff161415610687576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161067e90610d5b565b60405180910390fd5b80600160008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020819055508173ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff167f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b925836040516107659190610e1b565b60405180910390a3505050565b600061077e8484610518565b90507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff81146107f857818110156107ea576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016107e190610d7b565b60405180910390fd5b6107f784848484036105a7565b5b50505050565b600073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff16141561086e576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161086590610dbb565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1614156108de576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016108d590610d3b565b60405180910390fd5b6108e9838383610a7f565b60008060008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000205490508181101561096f576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161096690610d9b565b60405180910390fd5b8181036000808673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002081905550816000808573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000206000828254610a029190610e6d565b925050819055508273ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef84604051610a669190610e1b565b60405180910390a3610a79848484610a84565b50505050565b505050565b505050565b600081359050610a98816111ef565b92915050565b600081359050610aad81611206565b92915050565b600060208284031215610ac557600080fd5b6000610ad384828501610a89565b91505092915050565b60008060408385031215610aef57600080fd5b6000610afd85828601610a89565b9250506020610b0e85828601610a89565b9150509250929050565b600080600060608486031215610b2d57600080fd5b6000610b3b86828701610a89565b9350506020610b4c86828701610a89565b9250506040610b5d86828701610a9e565b9150509250925092565b60008060408385031215610b7a57600080fd5b6000610b8885828601610a89565b9250506020610b9985828601610a9e565b9150509250929050565b610bac81610ed5565b82525050565b6000610bbd82610e51565b610bc78185610e5c565b9350610bd7818560208601610f18565b610be081610fdb565b840191505092915050565b6000610bf8602383610e5c565b9150610c0382610fec565b604082019050919050565b6000610c1b602283610e5c565b9150610c268261103b565b604082019050919050565b6000610c3e601d83610e5c565b9150610c498261108a565b602082019050919050565b6000610c61602683610e5c565b9150610c6c826110b3565b604082019050919050565b6000610c84602583610e5c565b9150610c8f82611102565b604082019050919050565b6000610ca7602483610e5c565b9150610cb282611151565b604082019050919050565b6000610cca602583610e5c565b9150610cd5826111a0565b604082019050919050565b610ce981610f01565b82525050565b610cf881610f0b565b82525050565b6000602082019050610d136000830184610ba3565b92915050565b60006020820190508181036000830152610d338184610bb2565b905092915050565b60006020820190508181036000830152610d5481610beb565b9050919050565b60006020820190508181036000830152610d7481610c0e565b9050919050565b60006020820190508181036000830152610d9481610c31565b9050919050565b60006020820190508181036000830152610db481610c54565b9050919050565b60006020820190508181036000830152610dd481610c77565b9050919050565b60006020820190508181036000830152610df481610c9a565b9050919050565b60006020820190508181036000830152610e1481610cbd565b9050919050565b6000602082019050610e306000830184610ce0565b92915050565b6000602082019050610e4b6000830184610cef565b92915050565b600081519050919050565b600082825260208201905092915050565b6000610e7882610f01565b9150610e8383610f01565b9250827fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff03821115610eb857610eb7610f7d565b5b828201905092915050565b6000610ece82610ee1565b9050919050565b60008115159050919050565b600073ffffffffffffffffffffffffffffffffffffffff82169050919050565b6000819050919050565b600060ff82169050919050565b60005b83811015610f36578082015181840152602081019050610f1b565b83811115610f45576000848401525b50505050565b60006002820490506001821680610f6357607f821691505b60208210811415610f7757610f76610fac565b5b50919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b6000601f19601f8301169050919050565b7f45524332303a207472616e7366657220746f20746865207a65726f206164647260008201527f6573730000000000000000000000000000000000000000000000000000000000602082015250565b7f45524332303a20617070726f766520746f20746865207a65726f20616464726560008201527f7373000000000000000000000000000000000000000000000000000000000000602082015250565b7f45524332303a20696e73756666696369656e7420616c6c6f77616e6365000000600082015250565b7f45524332303a207472616e7366657220616d6f756e742065786365656473206260008201527f616c616e63650000000000000000000000000000000000000000000000000000602082015250565b7f45524332303a207472616e736665722066726f6d20746865207a65726f20616460008201527f6472657373000000000000000000000000000000000000000000000000000000602082015250565b7f45524332303a20617070726f76652066726f6d20746865207a65726f2061646460008201527f7265737300000000000000000000000000000000000000000000000000000000602082015250565b7f45524332303a2064656372656173656420616c6c6f77616e63652062656c6f7760008201527f207a65726f000000000000000000000000000000000000000000000000000000602082015250565b6111f881610ec3565b811461120357600080fd5b50565b61120f81610f01565b811461121a57600080fd5b5056fea264697066735822122078736b85f9a6445c14622d8d730f663e8f67a8e04fdba2889d528c1d4c4c51ab64736f6c63430008020033", 295 | "linkReferences": {}, 296 | "deployedLinkReferences": {} 297 | } 298 | -------------------------------------------------------------------------------- /artifacts/contracts/Token.sol/BeeToken.json: -------------------------------------------------------------------------------- 1 | { 2 | "_format": "hh-sol-artifact-1", 3 | "contractName": "BeeToken", 4 | "sourceName": "contracts/Token.sol", 5 | "abi": [ 6 | { 7 | "inputs": [], 8 | "stateMutability": "nonpayable", 9 | "type": "constructor" 10 | }, 11 | { 12 | "anonymous": false, 13 | "inputs": [ 14 | { 15 | "indexed": true, 16 | "internalType": "address", 17 | "name": "owner", 18 | "type": "address" 19 | }, 20 | { 21 | "indexed": true, 22 | "internalType": "address", 23 | "name": "spender", 24 | "type": "address" 25 | }, 26 | { 27 | "indexed": false, 28 | "internalType": "uint256", 29 | "name": "value", 30 | "type": "uint256" 31 | } 32 | ], 33 | "name": "Approval", 34 | "type": "event" 35 | }, 36 | { 37 | "anonymous": false, 38 | "inputs": [ 39 | { 40 | "indexed": true, 41 | "internalType": "address", 42 | "name": "from", 43 | "type": "address" 44 | }, 45 | { 46 | "indexed": true, 47 | "internalType": "address", 48 | "name": "to", 49 | "type": "address" 50 | }, 51 | { 52 | "indexed": false, 53 | "internalType": "uint256", 54 | "name": "value", 55 | "type": "uint256" 56 | } 57 | ], 58 | "name": "Transfer", 59 | "type": "event" 60 | }, 61 | { 62 | "inputs": [ 63 | { 64 | "internalType": "address", 65 | "name": "owner", 66 | "type": "address" 67 | }, 68 | { 69 | "internalType": "address", 70 | "name": "spender", 71 | "type": "address" 72 | } 73 | ], 74 | "name": "allowance", 75 | "outputs": [ 76 | { 77 | "internalType": "uint256", 78 | "name": "", 79 | "type": "uint256" 80 | } 81 | ], 82 | "stateMutability": "view", 83 | "type": "function" 84 | }, 85 | { 86 | "inputs": [ 87 | { 88 | "internalType": "address", 89 | "name": "spender", 90 | "type": "address" 91 | }, 92 | { 93 | "internalType": "uint256", 94 | "name": "amount", 95 | "type": "uint256" 96 | } 97 | ], 98 | "name": "approve", 99 | "outputs": [ 100 | { 101 | "internalType": "bool", 102 | "name": "", 103 | "type": "bool" 104 | } 105 | ], 106 | "stateMutability": "nonpayable", 107 | "type": "function" 108 | }, 109 | { 110 | "inputs": [ 111 | { 112 | "internalType": "address", 113 | "name": "account", 114 | "type": "address" 115 | } 116 | ], 117 | "name": "balanceOf", 118 | "outputs": [ 119 | { 120 | "internalType": "uint256", 121 | "name": "", 122 | "type": "uint256" 123 | } 124 | ], 125 | "stateMutability": "view", 126 | "type": "function" 127 | }, 128 | { 129 | "inputs": [], 130 | "name": "decimals", 131 | "outputs": [ 132 | { 133 | "internalType": "uint8", 134 | "name": "", 135 | "type": "uint8" 136 | } 137 | ], 138 | "stateMutability": "view", 139 | "type": "function" 140 | }, 141 | { 142 | "inputs": [ 143 | { 144 | "internalType": "address", 145 | "name": "spender", 146 | "type": "address" 147 | }, 148 | { 149 | "internalType": "uint256", 150 | "name": "subtractedValue", 151 | "type": "uint256" 152 | } 153 | ], 154 | "name": "decreaseAllowance", 155 | "outputs": [ 156 | { 157 | "internalType": "bool", 158 | "name": "", 159 | "type": "bool" 160 | } 161 | ], 162 | "stateMutability": "nonpayable", 163 | "type": "function" 164 | }, 165 | { 166 | "inputs": [ 167 | { 168 | "internalType": "address", 169 | "name": "spender", 170 | "type": "address" 171 | }, 172 | { 173 | "internalType": "uint256", 174 | "name": "addedValue", 175 | "type": "uint256" 176 | } 177 | ], 178 | "name": "increaseAllowance", 179 | "outputs": [ 180 | { 181 | "internalType": "bool", 182 | "name": "", 183 | "type": "bool" 184 | } 185 | ], 186 | "stateMutability": "nonpayable", 187 | "type": "function" 188 | }, 189 | { 190 | "inputs": [], 191 | "name": "name", 192 | "outputs": [ 193 | { 194 | "internalType": "string", 195 | "name": "", 196 | "type": "string" 197 | } 198 | ], 199 | "stateMutability": "view", 200 | "type": "function" 201 | }, 202 | { 203 | "inputs": [], 204 | "name": "symbol", 205 | "outputs": [ 206 | { 207 | "internalType": "string", 208 | "name": "", 209 | "type": "string" 210 | } 211 | ], 212 | "stateMutability": "view", 213 | "type": "function" 214 | }, 215 | { 216 | "inputs": [], 217 | "name": "totalSupply", 218 | "outputs": [ 219 | { 220 | "internalType": "uint256", 221 | "name": "", 222 | "type": "uint256" 223 | } 224 | ], 225 | "stateMutability": "view", 226 | "type": "function" 227 | }, 228 | { 229 | "inputs": [ 230 | { 231 | "internalType": "address", 232 | "name": "to", 233 | "type": "address" 234 | }, 235 | { 236 | "internalType": "uint256", 237 | "name": "amount", 238 | "type": "uint256" 239 | } 240 | ], 241 | "name": "transfer", 242 | "outputs": [ 243 | { 244 | "internalType": "bool", 245 | "name": "", 246 | "type": "bool" 247 | } 248 | ], 249 | "stateMutability": "nonpayable", 250 | "type": "function" 251 | }, 252 | { 253 | "inputs": [ 254 | { 255 | "internalType": "address", 256 | "name": "from", 257 | "type": "address" 258 | }, 259 | { 260 | "internalType": "address", 261 | "name": "to", 262 | "type": "address" 263 | }, 264 | { 265 | "internalType": "uint256", 266 | "name": "amount", 267 | "type": "uint256" 268 | } 269 | ], 270 | "name": "transferFrom", 271 | "outputs": [ 272 | { 273 | "internalType": "bool", 274 | "name": "", 275 | "type": "bool" 276 | } 277 | ], 278 | "stateMutability": "nonpayable", 279 | "type": "function" 280 | } 281 | ], 282 | "bytecode": "0x60806040523480156200001157600080fd5b506040518060400160405280600981526020017f42454520546f6b656e00000000000000000000000000000000000000000000008152506040518060400160405280600381526020017f424545000000000000000000000000000000000000000000000000000000000081525081600390805190602001906200009692919062000283565b508060049080519060200190620000af92919062000283565b505050620000f133620000c7620000f760201b60201c565b600a620000d5919062000473565b621b0dc8620000e59190620005b0565b6200010060201b60201c565b620006f2565b60006012905090565b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff16141562000173576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016200016a906200036b565b60405180910390fd5b62000187600083836200027960201b60201c565b80600260008282546200019b9190620003bb565b92505081905550806000808473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000206000828254620001f29190620003bb565b925050819055508173ffffffffffffffffffffffffffffffffffffffff16600073ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef836040516200025991906200038d565b60405180910390a362000275600083836200027e60201b60201c565b5050565b505050565b505050565b828054620002919062000628565b90600052602060002090601f016020900481019282620002b5576000855562000301565b82601f10620002d057805160ff191683800117855562000301565b8280016001018555821562000301579182015b8281111562000300578251825591602001919060010190620002e3565b5b50905062000310919062000314565b5090565b5b808211156200032f57600081600090555060010162000315565b5090565b600062000342601f83620003aa565b91506200034f82620006c9565b602082019050919050565b620003658162000611565b82525050565b60006020820190508181036000830152620003868162000333565b9050919050565b6000602082019050620003a460008301846200035a565b92915050565b600082825260208201905092915050565b6000620003c88262000611565b9150620003d58362000611565b9250827fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff038211156200040d576200040c6200065e565b5b828201905092915050565b6000808291508390505b60018511156200046a578086048111156200044257620004416200065e565b5b6001851615620004525780820291505b80810290506200046285620006bc565b945062000422565b94509492505050565b6000620004808262000611565b91506200048d836200061b565b9250620004bc7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff8484620004c4565b905092915050565b600082620004d65760019050620005a9565b81620004e65760009050620005a9565b8160018114620004ff57600281146200050a5762000540565b6001915050620005a9565b60ff8411156200051f576200051e6200065e565b5b8360020a9150848211156200053957620005386200065e565b5b50620005a9565b5060208310610133831016604e8410600b84101617156200057a5782820a9050838111156200057457620005736200065e565b5b620005a9565b62000589848484600162000418565b92509050818404811115620005a357620005a26200065e565b5b81810290505b9392505050565b6000620005bd8262000611565b9150620005ca8362000611565b9250817fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff04831182151516156200060657620006056200065e565b5b828202905092915050565b6000819050919050565b600060ff82169050919050565b600060028204905060018216806200064157607f821691505b602082108114156200065857620006576200068d565b5b50919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b60008160011c9050919050565b7f45524332303a206d696e7420746f20746865207a65726f206164647265737300600082015250565b61125380620007026000396000f3fe608060405234801561001057600080fd5b50600436106100a95760003560e01c80633950935111610071578063395093511461016857806370a082311461019857806395d89b41146101c8578063a457c2d7146101e6578063a9059cbb14610216578063dd62ed3e14610246576100a9565b806306fdde03146100ae578063095ea7b3146100cc57806318160ddd146100fc57806323b872dd1461011a578063313ce5671461014a575b600080fd5b6100b6610276565b6040516100c39190610d19565b60405180910390f35b6100e660048036038101906100e19190610b67565b610308565b6040516100f39190610cfe565b60405180910390f35b61010461032b565b6040516101119190610e1b565b60405180910390f35b610134600480360381019061012f9190610b18565b610335565b6040516101419190610cfe565b60405180910390f35b610152610364565b60405161015f9190610e36565b60405180910390f35b610182600480360381019061017d9190610b67565b61036d565b60405161018f9190610cfe565b60405180910390f35b6101b260048036038101906101ad9190610ab3565b6103a4565b6040516101bf9190610e1b565b60405180910390f35b6101d06103ec565b6040516101dd9190610d19565b60405180910390f35b61020060048036038101906101fb9190610b67565b61047e565b60405161020d9190610cfe565b60405180910390f35b610230600480360381019061022b9190610b67565b6104f5565b60405161023d9190610cfe565b60405180910390f35b610260600480360381019061025b9190610adc565b610518565b60405161026d9190610e1b565b60405180910390f35b60606003805461028590610f4b565b80601f01602080910402602001604051908101604052809291908181526020018280546102b190610f4b565b80156102fe5780601f106102d3576101008083540402835291602001916102fe565b820191906000526020600020905b8154815290600101906020018083116102e157829003601f168201915b5050505050905090565b60008061031361059f565b90506103208185856105a7565b600191505092915050565b6000600254905090565b60008061034061059f565b905061034d858285610772565b6103588585856107fe565b60019150509392505050565b60006012905090565b60008061037861059f565b905061039981858561038a8589610518565b6103949190610e6d565b6105a7565b600191505092915050565b60008060008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020549050919050565b6060600480546103fb90610f4b565b80601f016020809104026020016040519081016040528092919081815260200182805461042790610f4b565b80156104745780601f1061044957610100808354040283529160200191610474565b820191906000526020600020905b81548152906001019060200180831161045757829003601f168201915b5050505050905090565b60008061048961059f565b905060006104978286610518565b9050838110156104dc576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016104d390610dfb565b60405180910390fd5b6104e982868684036105a7565b60019250505092915050565b60008061050061059f565b905061050d8185856107fe565b600191505092915050565b6000600160008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002054905092915050565b600033905090565b600073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff161415610617576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161060e90610ddb565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff161415610687576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161067e90610d5b565b60405180910390fd5b80600160008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020819055508173ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff167f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b925836040516107659190610e1b565b60405180910390a3505050565b600061077e8484610518565b90507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff81146107f857818110156107ea576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016107e190610d7b565b60405180910390fd5b6107f784848484036105a7565b5b50505050565b600073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff16141561086e576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161086590610dbb565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1614156108de576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016108d590610d3b565b60405180910390fd5b6108e9838383610a7f565b60008060008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000205490508181101561096f576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161096690610d9b565b60405180910390fd5b8181036000808673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002081905550816000808573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000206000828254610a029190610e6d565b925050819055508273ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef84604051610a669190610e1b565b60405180910390a3610a79848484610a84565b50505050565b505050565b505050565b600081359050610a98816111ef565b92915050565b600081359050610aad81611206565b92915050565b600060208284031215610ac557600080fd5b6000610ad384828501610a89565b91505092915050565b60008060408385031215610aef57600080fd5b6000610afd85828601610a89565b9250506020610b0e85828601610a89565b9150509250929050565b600080600060608486031215610b2d57600080fd5b6000610b3b86828701610a89565b9350506020610b4c86828701610a89565b9250506040610b5d86828701610a9e565b9150509250925092565b60008060408385031215610b7a57600080fd5b6000610b8885828601610a89565b9250506020610b9985828601610a9e565b9150509250929050565b610bac81610ed5565b82525050565b6000610bbd82610e51565b610bc78185610e5c565b9350610bd7818560208601610f18565b610be081610fdb565b840191505092915050565b6000610bf8602383610e5c565b9150610c0382610fec565b604082019050919050565b6000610c1b602283610e5c565b9150610c268261103b565b604082019050919050565b6000610c3e601d83610e5c565b9150610c498261108a565b602082019050919050565b6000610c61602683610e5c565b9150610c6c826110b3565b604082019050919050565b6000610c84602583610e5c565b9150610c8f82611102565b604082019050919050565b6000610ca7602483610e5c565b9150610cb282611151565b604082019050919050565b6000610cca602583610e5c565b9150610cd5826111a0565b604082019050919050565b610ce981610f01565b82525050565b610cf881610f0b565b82525050565b6000602082019050610d136000830184610ba3565b92915050565b60006020820190508181036000830152610d338184610bb2565b905092915050565b60006020820190508181036000830152610d5481610beb565b9050919050565b60006020820190508181036000830152610d7481610c0e565b9050919050565b60006020820190508181036000830152610d9481610c31565b9050919050565b60006020820190508181036000830152610db481610c54565b9050919050565b60006020820190508181036000830152610dd481610c77565b9050919050565b60006020820190508181036000830152610df481610c9a565b9050919050565b60006020820190508181036000830152610e1481610cbd565b9050919050565b6000602082019050610e306000830184610ce0565b92915050565b6000602082019050610e4b6000830184610cef565b92915050565b600081519050919050565b600082825260208201905092915050565b6000610e7882610f01565b9150610e8383610f01565b9250827fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff03821115610eb857610eb7610f7d565b5b828201905092915050565b6000610ece82610ee1565b9050919050565b60008115159050919050565b600073ffffffffffffffffffffffffffffffffffffffff82169050919050565b6000819050919050565b600060ff82169050919050565b60005b83811015610f36578082015181840152602081019050610f1b565b83811115610f45576000848401525b50505050565b60006002820490506001821680610f6357607f821691505b60208210811415610f7757610f76610fac565b5b50919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b6000601f19601f8301169050919050565b7f45524332303a207472616e7366657220746f20746865207a65726f206164647260008201527f6573730000000000000000000000000000000000000000000000000000000000602082015250565b7f45524332303a20617070726f766520746f20746865207a65726f20616464726560008201527f7373000000000000000000000000000000000000000000000000000000000000602082015250565b7f45524332303a20696e73756666696369656e7420616c6c6f77616e6365000000600082015250565b7f45524332303a207472616e7366657220616d6f756e742065786365656473206260008201527f616c616e63650000000000000000000000000000000000000000000000000000602082015250565b7f45524332303a207472616e736665722066726f6d20746865207a65726f20616460008201527f6472657373000000000000000000000000000000000000000000000000000000602082015250565b7f45524332303a20617070726f76652066726f6d20746865207a65726f2061646460008201527f7265737300000000000000000000000000000000000000000000000000000000602082015250565b7f45524332303a2064656372656173656420616c6c6f77616e63652062656c6f7760008201527f207a65726f000000000000000000000000000000000000000000000000000000602082015250565b6111f881610ec3565b811461120357600080fd5b50565b61120f81610f01565b811461121a57600080fd5b5056fea2646970667358221220e0e24ff0a0843cce4f3bc61f06ecc95185ac6746a92ee65ff955cf28f1882c3864736f6c63430008020033", 283 | "deployedBytecode": "0x608060405234801561001057600080fd5b50600436106100a95760003560e01c80633950935111610071578063395093511461016857806370a082311461019857806395d89b41146101c8578063a457c2d7146101e6578063a9059cbb14610216578063dd62ed3e14610246576100a9565b806306fdde03146100ae578063095ea7b3146100cc57806318160ddd146100fc57806323b872dd1461011a578063313ce5671461014a575b600080fd5b6100b6610276565b6040516100c39190610d19565b60405180910390f35b6100e660048036038101906100e19190610b67565b610308565b6040516100f39190610cfe565b60405180910390f35b61010461032b565b6040516101119190610e1b565b60405180910390f35b610134600480360381019061012f9190610b18565b610335565b6040516101419190610cfe565b60405180910390f35b610152610364565b60405161015f9190610e36565b60405180910390f35b610182600480360381019061017d9190610b67565b61036d565b60405161018f9190610cfe565b60405180910390f35b6101b260048036038101906101ad9190610ab3565b6103a4565b6040516101bf9190610e1b565b60405180910390f35b6101d06103ec565b6040516101dd9190610d19565b60405180910390f35b61020060048036038101906101fb9190610b67565b61047e565b60405161020d9190610cfe565b60405180910390f35b610230600480360381019061022b9190610b67565b6104f5565b60405161023d9190610cfe565b60405180910390f35b610260600480360381019061025b9190610adc565b610518565b60405161026d9190610e1b565b60405180910390f35b60606003805461028590610f4b565b80601f01602080910402602001604051908101604052809291908181526020018280546102b190610f4b565b80156102fe5780601f106102d3576101008083540402835291602001916102fe565b820191906000526020600020905b8154815290600101906020018083116102e157829003601f168201915b5050505050905090565b60008061031361059f565b90506103208185856105a7565b600191505092915050565b6000600254905090565b60008061034061059f565b905061034d858285610772565b6103588585856107fe565b60019150509392505050565b60006012905090565b60008061037861059f565b905061039981858561038a8589610518565b6103949190610e6d565b6105a7565b600191505092915050565b60008060008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020549050919050565b6060600480546103fb90610f4b565b80601f016020809104026020016040519081016040528092919081815260200182805461042790610f4b565b80156104745780601f1061044957610100808354040283529160200191610474565b820191906000526020600020905b81548152906001019060200180831161045757829003601f168201915b5050505050905090565b60008061048961059f565b905060006104978286610518565b9050838110156104dc576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016104d390610dfb565b60405180910390fd5b6104e982868684036105a7565b60019250505092915050565b60008061050061059f565b905061050d8185856107fe565b600191505092915050565b6000600160008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002054905092915050565b600033905090565b600073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff161415610617576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161060e90610ddb565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff161415610687576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161067e90610d5b565b60405180910390fd5b80600160008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020819055508173ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff167f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b925836040516107659190610e1b565b60405180910390a3505050565b600061077e8484610518565b90507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff81146107f857818110156107ea576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016107e190610d7b565b60405180910390fd5b6107f784848484036105a7565b5b50505050565b600073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff16141561086e576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161086590610dbb565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1614156108de576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016108d590610d3b565b60405180910390fd5b6108e9838383610a7f565b60008060008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000205490508181101561096f576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161096690610d9b565b60405180910390fd5b8181036000808673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002081905550816000808573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000206000828254610a029190610e6d565b925050819055508273ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef84604051610a669190610e1b565b60405180910390a3610a79848484610a84565b50505050565b505050565b505050565b600081359050610a98816111ef565b92915050565b600081359050610aad81611206565b92915050565b600060208284031215610ac557600080fd5b6000610ad384828501610a89565b91505092915050565b60008060408385031215610aef57600080fd5b6000610afd85828601610a89565b9250506020610b0e85828601610a89565b9150509250929050565b600080600060608486031215610b2d57600080fd5b6000610b3b86828701610a89565b9350506020610b4c86828701610a89565b9250506040610b5d86828701610a9e565b9150509250925092565b60008060408385031215610b7a57600080fd5b6000610b8885828601610a89565b9250506020610b9985828601610a9e565b9150509250929050565b610bac81610ed5565b82525050565b6000610bbd82610e51565b610bc78185610e5c565b9350610bd7818560208601610f18565b610be081610fdb565b840191505092915050565b6000610bf8602383610e5c565b9150610c0382610fec565b604082019050919050565b6000610c1b602283610e5c565b9150610c268261103b565b604082019050919050565b6000610c3e601d83610e5c565b9150610c498261108a565b602082019050919050565b6000610c61602683610e5c565b9150610c6c826110b3565b604082019050919050565b6000610c84602583610e5c565b9150610c8f82611102565b604082019050919050565b6000610ca7602483610e5c565b9150610cb282611151565b604082019050919050565b6000610cca602583610e5c565b9150610cd5826111a0565b604082019050919050565b610ce981610f01565b82525050565b610cf881610f0b565b82525050565b6000602082019050610d136000830184610ba3565b92915050565b60006020820190508181036000830152610d338184610bb2565b905092915050565b60006020820190508181036000830152610d5481610beb565b9050919050565b60006020820190508181036000830152610d7481610c0e565b9050919050565b60006020820190508181036000830152610d9481610c31565b9050919050565b60006020820190508181036000830152610db481610c54565b9050919050565b60006020820190508181036000830152610dd481610c77565b9050919050565b60006020820190508181036000830152610df481610c9a565b9050919050565b60006020820190508181036000830152610e1481610cbd565b9050919050565b6000602082019050610e306000830184610ce0565b92915050565b6000602082019050610e4b6000830184610cef565b92915050565b600081519050919050565b600082825260208201905092915050565b6000610e7882610f01565b9150610e8383610f01565b9250827fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff03821115610eb857610eb7610f7d565b5b828201905092915050565b6000610ece82610ee1565b9050919050565b60008115159050919050565b600073ffffffffffffffffffffffffffffffffffffffff82169050919050565b6000819050919050565b600060ff82169050919050565b60005b83811015610f36578082015181840152602081019050610f1b565b83811115610f45576000848401525b50505050565b60006002820490506001821680610f6357607f821691505b60208210811415610f7757610f76610fac565b5b50919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b6000601f19601f8301169050919050565b7f45524332303a207472616e7366657220746f20746865207a65726f206164647260008201527f6573730000000000000000000000000000000000000000000000000000000000602082015250565b7f45524332303a20617070726f766520746f20746865207a65726f20616464726560008201527f7373000000000000000000000000000000000000000000000000000000000000602082015250565b7f45524332303a20696e73756666696369656e7420616c6c6f77616e6365000000600082015250565b7f45524332303a207472616e7366657220616d6f756e742065786365656473206260008201527f616c616e63650000000000000000000000000000000000000000000000000000602082015250565b7f45524332303a207472616e736665722066726f6d20746865207a65726f20616460008201527f6472657373000000000000000000000000000000000000000000000000000000602082015250565b7f45524332303a20617070726f76652066726f6d20746865207a65726f2061646460008201527f7265737300000000000000000000000000000000000000000000000000000000602082015250565b7f45524332303a2064656372656173656420616c6c6f77616e63652062656c6f7760008201527f207a65726f000000000000000000000000000000000000000000000000000000602082015250565b6111f881610ec3565b811461120357600080fd5b50565b61120f81610f01565b811461121a57600080fd5b5056fea2646970667358221220e0e24ff0a0843cce4f3bc61f06ecc95185ac6746a92ee65ff955cf28f1882c3864736f6c63430008020033", 284 | "linkReferences": {}, 285 | "deployedLinkReferences": {} 286 | } 287 | -------------------------------------------------------------------------------- /README.md: -------------------------------------------------------------------------------- 1 |

Bu yazımda, MetaMask gibi kullanıcı tarafından kontrol edilen cüzdanlarla çalışan Hardhat, React ve Ethers.js kullanarak yazdığımız akıllı kontratları testnet'e deploy edeceğiz ve bu kontratlar ile basit bir arayüz kodlayarak iletişime geçeceğiz. Bu süreçte sizlere en baştan kurulum ve ayarlamaları yaparak adım adım açıklayarak anlatmaya çalışacağım. 5 | 6 | ### Kullanılan Araçlar 7 | 1.Metamask 8 | 2.Hardhat 9 | 3.React 10 | 4.Ethers.js 11 | 12 | ##
1.Metamask
13 | ### Metamask Nedir? 14 |Ethereum blok zinciri ile etkileşim kurmak için kullanılan bir yazılım kripto para cüzdanıdır. Kullanıcıların, daha sonra merkezi olmayan uygulamalarla etkileşim kurmak için kullanılabilecek bir tarayıcı uzantısı veya mobil uygulama aracılığıyla Ethereum cüzdanlarına erişmelerine olanak tanır. MetaMask, Ethereum tabanlı araçlara ve altyapıya odaklanan bir blok zinciri yazılım şirketi olan ConsenSys Software Inc. tarafından geliştirilmiştir. Blockchain sistemlerinde cüzdanınızın "Private Key"i sizin kimliğinizdir. Bu bilgi başkasının eline geçer ise Blockchain üzerinde sizin adınıza imzalar atarak siz gibi davranır. ConsenSys şirketi, Metamask'ın bu bilgileri kesinlikle kullanıcı dışında kimseye ulaştırmayan bir yapıda cüzdan yönetimi amacı ile tasarlamıştır.
15 |Metamask cüzdanınızı tarayıcınızın eklentiler kısmından indirebilirsiniz. Metamask cüzdanını kurduğunuzu varsayarak "Ağ Ekle" kısmından Avalanche'ın testneti olan "Fuji Testnet" ağını aşağıdaki bilgileri girerek ekliyoruz. Bu proje sürecinde Fuji testnetin cüzdanlarını kullanacağız ve kontratları bu ağa deploy edeceğiz. Kısaca Fuji ve testnet hakkında bilgi vermem gerekirse;
16 | 17 | 18 | ### Testnet Nedir? 19 |Test için kullanılacak alternatif bir blok zinciridir. Testnet paraları gerçek paralardan farklıdır ve testnet paralarının herhangi bir parasal değeri yoktur. Bu, uygulama geliştiricilerinin veya testçilerinin değerli madeni paralar kullanmak zorunda kalmadan deney yapmalarını sağlar. Testnetlerin diğer gerçek Mainnet'ler ile bir bağlantısı yoktur.
20 | 21 | • Network Name: Avalanche Fuji Testnet 22 | • New RPC URL: https://api.avax-test.network/ext/bc/C/rpc 23 | • ChainID: 43113 24 | • Symbol: AVAX 25 | • Explorer: https://testnet.snowtrace.io/ 26 |

2.Hardhat
32 | ### Hardhat Nedir? 33 |Hardhat, Ethereum yazılımı için bir geliştirme ortamıdır. Akıllı sözleşmelerinizi ve dApp'lerinizi düzenlemek, derlemek, hata ayıklamak ve dağıtmak için tümü eksiksiz bir geliştirme ortamı oluşturmak için birlikte çalışan farklı bileşenlerden oluşur. Kısacası Hardhat projesi oluşturarak biz içerisindeki bileşemler/kütüphaneler ile yazdığımız akıllı kontratları derleme ,deploy etme, test etme vb gibi aksiyonları gerçekleştirebiliyoruz. Hardhat'in truffle gibi alternatifleri bulunmaktadır. Fakat Hardhat bize yapmak istediğimiz aksiyonlarda daha fazla söz sahibi yaparak daha kullanışlı olduğunu düşünüyorum. Blockchain geliştiricisi için Hardhati bilmek çok önemli ve yeterli olacağını söyleyebilirim.
34 | 35 | ### Hardhat Proje Oluşturma ve Yapılandırması 36 |Bir Hardhat projesi geliştirmek için bilgisayarınızda "Node.js" in kurulu olması gerekmektedir. Hardhat ise Node versiyonunun “16.0” dan yüksek olması halinde çalışmaktadır.
37 | •node -v ile bilgisayarınızda yüklü mü? diye kontrol edebilirsiniz.
38 |
39 | 
İlk olarak kolaylık olması açısından proje dosyamızı Visiual Code uygulamasından açıyoruz ve gerekli komutları girmek için terminal ekranına geliyoruz.(Daha öncesinden VSCode ile Solidity dilini yazmadıysanız eklentilerden Solidity dil paketini indirin!!!)
41 | 42 | • npm init --yes ile Node projesi başlatıyoruz.
43 | 
npm install --save-dev hardhat ile hardhati projemize indiriyoruz.
46 | 
npx hardhat ile Hardhati çalıştırarak çalışma ortamının kurulmasını sağlıyoruz.
49 | “Create an empty hardhat.config.js” seçeneğine tıklayarak boş bir proje yapısının oluşmasını söylüyoruz.
50 |
Dosya yapısı aşağıdaki gibi olması gerekmektedir. O yüzden “contracts,test,scripts” dosyalarını hardhat proje dizininin içerisine biz oluşturuyoruz.
53 |
npm install --save-dev @nomiclabs/hardhat-ethers ethers @nomiclabs/hardhat-waffle ethereum-waffle chai ile gerekli eklentileri kuruyoruz.
61 | “ethereum-waffle, chai, hardhat-waffle” bunlar hardhat de test kodlarını yazmamız için faydalanacağımız kütüphanelerdir. Yazımızın ilerleyen bölümlerinde test kodlarınıda yazacağız.
62 | • npm install @openzeppelin/contracts ile ERC20 kontratını openzeplin kütüphanesinden import edeceğiz.
63 |
64 | Şimdi akıllı kontratlarımızı contract/ dizinin altına yazıyoruz.
65 |
Projemizin senaryosunda 2 adet kontratımız var. Bu kontratları tek tek açıklamayacağım. Fakat ne iş yaptığını kısaca bilmemiz gerekir ise bunlar;
70 | 71 | 1) Token.sol Bu kontratımız ERC20 protokolünde miras alınarak yazılmış token kontratıdır. Yani bu kontratımızda ERC20 kontratınının sahip olduğu “private” hariç tüm özelliklere doğrudan çağırıp kullanabilir. 72 | ``` 73 | // SPDX-License-Identifier: UNLICENSED 74 | pragma solidity ^0.8.2; 75 | 76 | import "@openzeppelin/contracts/token/ERC20/ERC20.sol"; 77 | 78 | contract BeeToken is ERC20 { 79 | constructor() ERC20("BEE Token", "BEE") { 80 | _mint(msg.sender, 1773000 * 10**decimals()); 81 | } 82 | } 83 | ``` 84 | 85 | • Constructor() fonksiyonunun içinde tokenımızın adını ve kısalmasını belirtiyoruz. 86 | • _mint() fonksiyonu ile total arzını belirtiyoruz ve _mint() fonksiyonunu çalıştıran yani kontratı deploy eden cüzdan adresine bu tokenlar gönderiliyor. 87 | Not: Burada decimals() fonksiyonu “18” sonucunu ERC20 kontratından döndürüyor. Yani total arzı “1773000…10^18 sıfır olarak belirliyoruz. 88 | • Openzeppelin kütüphanesinden erc20 kontratını import ediyoruz. 89 | 90 | 2) Lock.sol Bu kontratımızın senaryosu ise kullanıcılar bu kontrata token gönderip bir nevi kilitlemiş oluyor. Sonra bu tokenları belirli bir zaman geçtikten sonra çekebilme iznine sahip olan bir mantığına dayanmaktadır. 91 | •LockToken() fonksiyonu ile kullanıcının kilitleyeceği token miktarını ve kilitli kalacağı zaman(saniye cinsinden ) bilgilerini giriyor ve aslında tokenları bu kontratta kilitlemiş oluyor. 92 | (Not: approve() fonksiyonu ile bu Lock kontratına izin verilmediği sürece bu kontrat token transferini yapamaz. İleride bu durumu açıklayacağım.) 93 | • withdrawToken() fonksiyonu ile bu kullanıcı kilitlediği tokenlarını, kilitlediği süre sona erdiyse geri çekebilmektedir. 94 | 95 | ``` 96 | // SPDX-License-Identifier: UNLICENSED 97 | pragma solidity ^0.8.2; 98 | 99 | import "./Token.sol"; 100 | 101 | contract Lock { 102 | BeeToken Token; 103 | 104 | uint256 public lockerCount; 105 | uint256 public totalLocked; 106 | mapping(address => uint256) public lockers; 107 | mapping(address => uint256) public deadLine; 108 | 109 | constructor(address tokenAddress) { 110 | Token = BeeToken(tokenAddress); 111 | } 112 | 113 | function LockToken(uint256 amount, uint256 time) external { 114 | require(amount > 0, "Token amount must be bigger than 0"); 115 | // require(Token.balanceOf(msg.sender) >= amount, "insufficent balance."); 116 | // require( 117 | // Token.allowance(msg.sender, address(this)) >= amount, 118 | // "insufficent allowance." 119 | // ); 120 | if (!(lockers[msg.sender] > 0)) lockerCount++; 121 | totalLocked += amount; 122 | lockers[msg.sender] += amount; 123 | deadLine[msg.sender] = block.timestamp + time; 124 | 125 | bool ok = Token.transferFrom(msg.sender, address(this), amount); 126 | require(ok, "Transfer failed.!!!"); 127 | } 128 | 129 | function withdrawToken() external { 130 | require(lockers[msg.sender] > 0, "not enough token"); 131 | require(block.timestamp > deadLine[msg.sender], "deadline is not over"); 132 | uint256 amount = lockers[msg.sender]; 133 | delete (lockers[msg.sender]); 134 | totalLocked -= amount; 135 | lockerCount--; 136 | 137 | require(Token.transfer(msg.sender, amount), "Transfer failed.!!!"); 138 | } 139 | } 140 | ``` 141 | 142 | •npx hardhat compile ile akıllı kontratlarımızı EVM’ nin anlayabileceği dile dönüştürmek için derliyoruz. Bu komut ile projemizde artifacts dosyası oluşmaktadır. Bu dosyanın altında import ettiğimiz kontratlar ve kendi kontratlarımızın “ABI ve Bytes” kodları yer almaktadır.
143 | ABI Code: Fonksiyonların nasıl çağrılacağı, parametrelerin nasıl geçirileceği vb gibi fonksiyonel olaylara ve değişkenlere EVM ‘nin anlayacağı türden bir iletişim kalıbı oluşturuyor diyebiliriz.
144 |
Şimdi kontratlarımız deploy etmeye hazır. Fakat bunun için deploy edeceğimiz ağ ve deploy scriptini yazmamız gerekmektedir.
147 | hardhat.config.jsNot: Burada “hardhat-waffle” ‘ın içerisinde ethers kütüphanesi de olduğu için “hardhat-ethers” kütüphanesini kaldırırsak hata vermeyecektir.
182 |
Daha sonra ethers.js kütüphanesinden yararlanarak deploy scriptlerini yazıyoruz. Bu scriptleri çalıştırdığımızda kontratlarımız seçtiğimiz ağa deploy olacaktır. Burada ayrı ayrı 2 script yazmalıyız çünkü 2 farklı kontratımız mevcut.
186 |Not: Blockchain ile iletişime geçilen durumlarda promise değeri döndürüleceği için async-await olarak tanımlama yapılmalıdır.
187 | 188 |Token.sol Kontrat için -> deploy1.js
189 | 190 | ``` 191 | const {ethers} = require("hardhat"); 192 | 193 | async function main(){ 194 | 195 | const Token = await ethers.getContractFactory("BeeToken"); 196 | const token = await Token.deploy(); 197 | 198 | console.log("Contract address",token.address); 199 | } 200 | main() 201 | .then(()=> process.exit(0)) 202 | .catch((error)=>{ 203 | console.error(error); 204 | process.exit(1); 205 | }) 206 | 207 | ``` 208 | 209 | •const {ethers} = require("hardhat");
210 | Burada hardhat içerisinde ethers kütüphanesini kullandık. Bu kütüphane hardhat ekibi tarafından ethers.js kütüphanesine eklemeler yapılmış bir kütüphanedir.
211 |Örneğin ethers.js de “new ContractFactory(contractAbi, contractByteCode);” şeklinde kullanılmaktadır. Hardhat’in ethers kütüphanesinde abi ve bytecode girmemize gerek kalmadan “getContracFacfory(Kontrat_adi)” şeklinde çağırmamızı sağlamaktadır. Bir nevi işleri biraz kolaylaştırma amaçlanmıştır..
212 | 213 | • 214 | ``` 215 | const Token = await ethers.getContractFactory("BeeToken"); 216 | const token = await Token.deploy(); 217 | console.log("Contract address",token.address); 218 | ``` 219 | 220 |Burada “BeeToken” kontratımızın bilgilerini Token değişkenine aktarıyoruz. Token.deploy() komutu ile kontratımız bu komut çalıştığında deploy edilecektir. Console.log ile deploy edilen bu kontratın adresini kontrol amaçlı görmek için ekrana mesaj olarak bastırıyorız.
221 | 222 |npx hardhat run scripts/deploy1.js --network fuji komutu ile Token kontratımızı fuji ağına deploy ediyoruz.
Contract address 0x94CFe96F0843D72ef4Cc62fc47c8c2854c0226bb
224 |
Lock.sol Kontrat için -> deploy2.js
227 | Hatırlarsanız Lock kontratımız constructor parametresi olarak BeeToken kontrat adresini almaktaydı. Yukarıda BeeToken kontratımızı deploy ettiğimiz adresi aşağıdaki constructor parametre alanına giriyoruz. 228 | 229 | ``` 230 | const {ethers} = require("hardhat"); 231 | 232 | async function main(){ 233 | 234 | const Lock = await ethers.getContractFactory("Lock"); 235 | const lock = await Lock.deploy("0x94CFe96F0843D72ef4Cc62fc47c8c2854c0226bb"); 236 | 237 | console.log("Contract address",lock.address); 238 | } 239 | main() 240 | .then(()=> process.exit(0)) 241 | .catch((error)=>{ 242 | console.error(error); 243 | process.exit(1); 244 | }) 245 | 246 | ``` 247 | 248 | 249 |npx hardhat run scripts/deploy2.js --network fuji komutu ile Lock kontratımızı fuji ağına deploy ediyoruz.
Contract address 0x0903De388e6B0c21687E58FCbBA2B642F0f1D583
251 |
Artık bu 2 kontratımız fuji test ağında deploy edilmiş bir şekilde faaliyetine başlamıştır.( https://testnet.snowtrace.io/ ) adresinde işlemlerinizin kontrollerini gerçekleştirebilirsiniz. Aşağıda gördüğünüz üzere Metamaskımız da aktif olan cüzdanımızın PRIVATE_KEY ile bu iki kontratı deploy etmiştik. Snowtrace den bu cüzdan adresinin doğruluğunu da kontrol etmiş olduk. Peki bu "Snowtrace" nedir ? 254 | 255 | ### Snowtrace Nedir? 256 |
SnowTracebir blok zincir gezginidir. Ethereum'un uygulaması olan Etherscan'le çok benzerdir. Ethereum üzerinde Etherscan ile ulaşabildiğiniz her bilgiye, Avalanche blok zincirinde ise SnowTrace uygulamasıyla ulaşabilirsiniz. İşlemler, bloklar, cüzdan adresleri, akıllı sözleşmeler ve diğer zincir üstü veriler arasında arama yapmanıza imkan tanır.
257 | 258 | Token.sol (BeeToken) 259 |

3) React Projesinin Kurulumu
265 | 266 | Hardhat proje dosyamızın ana dizinine react projemizi oluşturuyoruz. Oluşturduğumuzda projemizin dosya görünümü aşağıdaki gibi olacaktır. 267 |
cd client kodu ile client dizinine geçiş yapıyoruz. Artık cüzdan bağlama ve kontrat ile etkileşime bu client adını verdiğimiz web projesi içerisinde yapacağız.
270 | 

4) Ether.js ile Block zincir deki Kontratlar ile Etkileşim
276 | 277 |npm install ethers ile “ethers” kütüphanesini react projemize dahil ediyoruz.(Not:React proje dizinini içerisinde olduğunuza dikkat edin.)
278 |
279 | “src” dizinin altına “constants” adında klasör oluşturarak içerisine aşağıdaki dosyaları oluşturuyoruz.
280 | • addresses.js -> Bu dosya da hardhat ile Fuji testnetine deploy ettiğimiz yani etkileşime geçeceğimiz kontratların adreslerini tutan değişkenler oluşturuyoruz.
281 | 

Artık ether js ile hali hazırda Blockchain üzerinde olan kontratlar ile iletişime geçeceğiz. Bu adıma başlamadan önce react bilginizi var olduğunu düşünüyorum sadece ethers.js kütüphanesi ile yazdığım kodları açıklayacağım.
289 |Hatırlatma olarak biz Lock ve BeeToken kontratlarımızı deploy etmiştik. Yani bu kontratlar Blockchain üzerinde hali hazırda çalışmaktadır. Yapmamız gerek ethers kütüphanesi ile bu kontratların projemizde bir instance ‘larını oluşturarak iletişime geçmek kaldı.
290 |Projemizin senaryosunda sadece Lock kontratı ile iletişime geçmemiz gerekmektedir. Hatırlarsak Lock.sol dosyasında yazdığımız kontratta constructor parametresi ile BeeToken’ın adresini girmiştik ve Lock kontratı içerisinde BeeToken türünde Token adında bir instance oluşturarak bu kontratı atamıştık. Bu demek oluyor ki Lock kontratı kendi içerisinde BeeToken kontratı ile etkileşim halinde.
291 |Bu yüzden bizim projemizin senaryosuna göre sadece Lock kontratını projemizde kullanmamız yeterli olacaktır.
292 |Src klasörünün altında “hooks” adında klasör oluşturuyorum. Bu klasör altında kendi hooklarımı yazarak projemin her yerine propslar ile göndermek yerine bu hooklarımı çağırarak ulaşabileceğim. Bunun en alternatif çözümlerinden biri ise redux-toolkit yöntemini kullanmaktır. Fakat bu yazımda hooks ve redux konularına değinmeden geçeceğim. 293 | 294 | ### 1) Contract instance oluşturma 295 | 296 |
“hooks” dizininin altında “useLookContract” adında .js dosyası oluşturuyoruz ve aşağıdaki yazdığımız kodlar ile blockchain üzerindeki “Lock” kontratının bir instance’sını oluşturuyoruz. Oluşturduğumuz bu hook’u çağırdığımızda bize bu instance’ı döndürecektir. Gelin kodlar ne işe yarıyor inceleyelim.
297 | 298 | ``` 299 | import { useState,useEffect } from "react" 300 | import {ethers} from "ethers" 301 | import { LOCK_ADDRESS } from "../constants/adresses" 302 | import { LOCK_ABI } from "../constants/abi" 303 | 304 | export const useLockContract = ()=>{ 305 | const [contract,setContract] = useState("") 306 | 307 | useEffect(()=>{ 308 | const provider = new ethers.providers.Web3Provider(window.ethereum) 309 | const signer = provider.getSigner() 310 | const _contract = new ethers.Contract(LOCK_ADDRESS,LOCK_ABI,signer) 311 | setContract(_contract) 312 | },[]) 313 | 314 | return contract; 315 | } 316 | 317 | ``` 318 | 319 | • Kontrat abilerini, adreslerini, ethers ve gerekli kütüphaneleri “useLockContrat.js” dosyasına import ediyoruz. İmport edilen dosyalar yeniden bu dosyada tanımlamamaksızın kullanmamızı sağlar. 320 | 321 | •const [contract,setContract] = useState("").
322 | useState(): Bize bir değer(contract) ve bu değeri değiştirmemize yarayan fonksiyon(setContract) döndürür.(“”) içerisindeki değer ise default değeri belirtir.
323 |
324 | • useEffect(()=>{},[]).
325 | useEffect Render edildikten sonra ilk çalışacak fonksiyondur. İlk parametresi bir fonksiyondur. Bu fonksiyonun içerisine yazdığımız kodlar component render edildiğinde diğer fonksiyonlardan önce çalışacaktır. İkinci parametresi dizi almaktadır. yukardaki gibi boş bir dizi ([]) ile tanımlarsak, component render edildiğinde bir kez çalışır.Eğer içerisine değişken girmiş olsaydık ([value]), value değişkeni her değiştiğinde useEffect fonksiyonu her defasında yeniden çalışacaktı.
326 |
327 | ```
328 | useEffect(()=>{
329 | const provider = new ethers.providers.Web3Provider(window.ethereum)
330 | const signer = provider.getSigner()
331 | const _contract = new ethers.Contract(LOCK_ADDRESS,LOCK_ABI,signer)
332 | setContract(_contract)
333 | },[])
334 |
335 | return contract;
336 | ```
337 |
338 | *** Öncelikle aşağıdaki kavramların ne iş yaptıkarlını bilirsek, problemler üzerindeki hakimiyetlerimiz artacaktır. Bu kavramlar;
339 | window.ethereum ? Nodes ? Provider ? Metamask ?
340 | “window.ethereum”, metamask uygulamasının içerisinde gelen yazılımdır. window.ethereum'da ziyaret edilen web sitelerine global bir API enjekte eder. Bu API, web sitelerinin kullanıcıların Ethereum hesaplarını talep etmesine, kullanıcının bağlı olduğu blok zincirlerinden veri okumasına ve kullanıcının mesajları ve işlemleri imzalamasını önermesine olanak tanır.
341 |Muhtemelen bildiğiniz gibi, Blockchain ile iletişime geçmek için düğümlere(nodes) ihtiyacımız var ve bu düğümlerin her biri blok zincirinin bir kopyasına sahiptir. Blok zinciri ile etkileşime geçmek istediğimizde, bu düğümlerden biriyle etkileşime girmemiz gerekiyor.
342 |Düğümlerle konuşmak istiyorsak yapmak isteyeceğimiz ilk şey, hangi düğümle konuşacağımızı belirlemektir. Kendi düğümünüzü kurabilir veya düğümlerden birini Infura ve Alchemy gibi üçüncü taraf hizmetler tarafından kullanabilirsiniz. İster kendiniz kurmuş olun, ister mevcut hizmetlerden birini kullanmış olun, blok zinciri ile etkileşime girdiğinizde bağlandığınız bu düğümlere providers. denir.
343 |Bir provider aracılığıyla blok zincirine bağlandığınızda, blok zincirinin durumunu okuyabilirsiniz, ancak durumu değiştirmek ve blok zincirine yazmak için sign mesajlara ihtiyacımız olacaktır. Mesajları imzalamak için cüzdanlarımızın private key lerine ihtiyacımız vardır. Şimdi bir dApp oluşturuyorsanız, muhtemelen kullanıcı anahtarlarını saklamak veya onlardan istemek en iyi fikir değildir. İşte burada Metamask ‘ın hizmeti devreye giriyor.
344 |Metamask, bu anahtar yönetimini gerçekleştiren bir araçtır. Bunun da ötesinde, blok zincirine bir bağlantı sağlar. Bunun nedeni, Metamask'ın Infura nodes tarafından sağlanan bağlantıya zaten sahip olmasıdır. Blok zincirine bağlanmak için tek yapmanız gereken sağlayıcıdan (Infura düğümlerinden biri) MetaMask'ı istemektir.
345 |Özetlemek gerekirse;
346 | 1. Provider blok zinciri ile etkileşim kurmak için kullandığınız düğümdür. 347 | 2. Metamask, anahtar yönetimini ele alarak ve dApp'i bir sağlayıcıya bağlayarak dApp geliştirmeyi kolaylaştıran bir araçtır. 348 | 349 |Şimdi kodlarımıza tekrar dönelim ve bu kodların ne işe yaradıklarına bakalım;
350 | 351 | •const provider = new ethers.providers.Web3Provider(window.ethereum)
352 | etherjs kütüphanesini kullanarak provider’ımızı “window.ethereum” olarak belirtiyoruz ve provider değişkenine atıyoruz.Metamask bize o an bağlı olduğu ağın rpc ni getirerek otomatik o api’nin getirdiği node’a yani providera bağlantı kuruyor.
353 | 354 | •const signer = provider.getSigner()
355 | Metamask’ımız da o an ki aktif olan imzalayıcı olan cüzdanı getirir. Blockchaine veri yazarken bu signer ile işlemler imzalanmaktadır.
356 | 357 | •cconst _contract = new ethers.Contract(LOCK_ADDRESS,LOCK_ABI,signer)
358 | Bu satırda blockchain’e deploy ettiğimiz Lock kontratın bilgilerini parametre olarak giriyoruz. 3.parametre olarak signer’ı giriyoruz. Burada blockchain’ e veri yazılması durumunda bu signer ile imzalanarak gas ücretini ödeyecektir. Buradaki signer yukarıda dediğimiz gibi metamask adresinde o an o ağda seçili olan hesaptır. 359 | Bu ağdaki Lock kontratın instance’sını bize döndürerek bunu değişkende tutuyoruz.
360 | 361 | • 362 | ``` 363 | 4 setContract(_contract) 364 | },[]) 365 | 366 | return contract; 367 | 368 | ``` 369 | 370 |Daha sonra kontratımızın instance’ı tuttuğumuz değişkeni state fonksiyonu ile contract değişkenine atıyoruz ve bu değişkeni döndürüyoruz. Yani oluşturduğumuz bu hook fonksiyonunu projemizin neresinde olursa olsun çağırdığımızda bize bu instance’ı verecektir.
371 | 372 | ### Front_end Baglama 373 | 374 |Şimdi bunu useLockContract hook’umuzu app.js konratında çağırarak bir buton aracılığı ile Lock kontratımızda bulunan totalLocker() değişkenimize ulaşacağız. Bu değişken, konratımız üzerinde kilitlenen tokenların tamamını tutmaktadır.
375 | 376 | ``` 377 | import { ethers } from 'ethers'; 378 | import './App.css'; 379 | import {useLockContract } from './hooks/useLooksContract'; 380 | 381 | function App() { 382 | const lockContract = useLockContract 383 | 384 | ``` 385 | 386 | 387 | 388 | •const lockContract = useLockContract().
389 | bu satırda Lock kontratımızın instance’sını oluşturduğumuz custom hook fonksiyonu ile çağırıyoruz.
390 |
391 | •
392 | ```
393 | const getTotalLocked = async() => {
394 | const result = await lockContract?.totalLocked(); // lockkontratına erişim yok ise hata vermesin demek => "?"
395 | console.log(ethers.utils.formatEther(result))
396 | }
397 | ```
398 |
399 | Burada önemli olan bir konuya değinmek istiyorum. Blockchain üzerinde kontratlar ile iletişime geçildiğinde bizlere promise döndürmektedir. Bunun için kontratlar ile iletişime geçilen işlemlerde asenkron fonksiyonlar tanımlayarak await ile belirtmeliyiz.
400 |Burada Lock kontratı üzerinden totalLocked değerini okuyarak result değişkenine atıyoruz. Ve bu değeri “formEther()” fonksiyonu ile ether türünden yazıyoruz. Blockchain üzerinde bu değerler 1018 basamaklıdır ve bu fonksiyon ile bu basamağı kaldırarak ether cinsine çeviriyoruz.
401 | 402 | • 403 | ``` 404 |“npm start” diyerek react projesini çalıştırıyoruz.Default olarak Localhost:3000 portunda çalışmaktadır.

Bu adımda “useGetSigner” adında yeni bir hook oluşturuyoruz ve bu hook bize o anki anlık metamask üzerinden hesap adresini döndürmektedir. Metamask üzerinde cüzdan adresini değiştirdiğimizde signer değişkeni otomatik olarak güncellenecektir.
418 |Bu fonksiyonda Windows.ethereum ‘a “accountsChanged” fonksiyonunu çalıştırmasını söylüyoruz ve bu fonksiyona bize ağdaki aktif kullanıcı adreslerini döndürmektedir. Biz 1. Adresi yani o anki aktif adresi signer değişkenine kaydediyoruz ve fonksiyonumuz bu değişkeni bize döndürüyor.
419 | 420 | useGetSigner.js.js 421 | 422 | ``` 423 | import { useState,useEffect } from "react" 424 | 425 | export const useGetSigner = () =>{ 426 | const [signer,setSigner] = useState() 427 | 428 | useEffect(()=>{ 429 | window.ethereum.on("accountsChanged", (accounts) => { 430 | if (accounts.length > 0) { 431 | setSigner(accounts[0]); 432 | } else { 433 | alert("Adres Bulunamadı.") 434 | } 435 | }); 436 | },[]) 437 | 438 | return signer; 439 | } 440 | 441 | ``` 442 | 443 | 444 | ### Front_end Baglama 445 | 446 | • useGetSigner() hookumuzu çağırarak kullanıcı adresini getSigner değişkenine atıyoruz. 447 | App.js 448 | 449 | ``` 450 | import { ethers } from 'ethers'; 451 | import './App.css'; 452 | import {useLockContract } from './hooks/useLooksContract'; 453 | import {useGetSigner} from './hooks/useGetSigner'; 454 | 455 | function App() { 456 | const lockContract = useLockContract() 457 | const getSigner = useGetSigner() 458 | 459 | const getTotalLocked = async() => { 460 | const result = await lockContract?.totalLocked(); // lockkontratına erişim yok ise hata vermesin demek => "?" 461 | console.log(ethers.utils.formatEther(result)) 462 | } 463 | return ( 464 |Address : {getSigner} ile Kullanıcının yani kontrat ile etkileşime geçecek adresi ekrana yazdırıyoruz.
478 | 
Artık bu adımda, Fuji testnetine deploy ettiğimiz akıllı kontratlar ile etkileşime geçeceğiz. Etkileşime geçtikten sonra artık kontratlar üzerindeki fonksiyonlara erişebilir duruma gelerek veri yazabilir ve veri okuyabileceğiz.
483 |Hatırlarsak bizim kontratlarımızın biri ERC20 protokoli ile yazılmış "BeeToken" kontratımız, bir diğeri olan "Lock"kontratımız ise deploy olduğunu an constructor parametresi ile BeeToken kontratımızın fuji blok zinciri üzerindeki kontrat adresini girerek bir instance oluşturmuştuk. Lock kontratımız bu BeeToken instance'sı sayesinde kontrat ile etkileşime geçerek BeeToken kontratı üzerindeki fonksiyonlarını kullanabilecektir.
484 |Bir ERC20 tokenları sadece oluşturulduğu o kontrat üzerinde balance değişkenleri üzerinde tutulmaktadır. Her kullanıcının kendine ait tokenları, cüzdan adresslerine göre saklanmaktadır(mapping). Bir kullanıcı başka bir adrese token transferi yaptığı an bu kontrat üzerindeki balance değişkeninde, gönderdiği tutar kendi bakiyesinden silinerek gönderdiği adresin bakiyesine eklenir. ERC20 de token transferi kaba tabir ile bu şekilde yapılmaktadır. Fakat burada ERC20 protokülünde "approve" adında bir fonksiyon vardır. Peki approve etmek ne anlama gelmektedir ?
485 | 486 | ### Approve Nedir? 487 |Sözlük anlamı "onaylamak" olan approve, ERC20 protokolünde de bu anlama gelmektedir. Yukarıda bahsettiğim gibi bir ERC20 token'ı bulunduğu kontrat dışına çıkmadan içerisinde balance değişkeninde tutulur. Bu tokenları ERC20 protokolü içerisinde bulunan transfer() fonksiyonu ile doğrudan kendi imzanız ile başka bir adrese token transferi yapabilirsiniz. Fakat ERC20 protokolünün içerisinde transferFrom() fonksiyonu ile de token transferlerini gerçekleştirebiliriz. Peki bu transfer ve transferFrom fonksiyonlarının arasında ki fark ne ? Bu fark, transfer fonksiyonu token sahibinin imzasını zorunlu kılarken, transferFrom fonksiyonu tokenın sahibini zorunlu kılmadan başka bir addresinde bu tokenları göndermesini olanak sağlar. İşte burada approve fonksiyonun önemi devreye girmektedir.
488 |Peki token transferlerinde approve tam olarak ne işe yarıyor ve önemi ne ? Bunu bir örnek vererek açıklamak istiyorum;
489 |Bir haber bültenine ait akıllı kontrat olduğunu düşünün.Bu haber bülteninin aylık ödemesi 1 BeeToken olsun. Siz her ay manuel olarak bu akıllı kontrata para göndermek yerine 6 aylık abone olmak istiyorsunuz ve her ay kendi cüzdanınızdan bu 1 BeeToken ücreti Haber bülteninin kontratı tarafından otomatik olarak çekilecektir. Burada otomatik ücret ödemesi transferFrom() fonksiyonu kullanılarak yazılmalıdır. Çünkü transferFrom fonksiyonu başka kontratın bizim tokenlarımızı transfer etme talebinde bulunmasını sağlayabiliyor. Fakat bu transferin gerçekleşmesi için bizim bu haber bültenine ait akıllı kontrata çekim onayını vermemiz gerekiyor. İşte bu onaya "approve" denmektedir. Peki biz bu onayı verdiğimizde bizim bakiyemizdeki tüm tokenları çekebilir mi ? evet çekebilir. Bu yüzden approve ile onay verirken bir limit de tanımlarız. Bu tanımladığımız çekim limitine ise "allowance" Olası onay verdiğimiz kontratta aksilik, hack gibi durumlarda bizim tanımladığımız limit kadar tokenlarımızı transfer edebilir. Bu tüm tokenlarımızı kaybetme riskinden bizi korumaktadır.
490 | 491 | •approve() 492 |
Approve fonksiyonu 2 parametre almaktadır. ilk parametre olan "_spender" token transferlerini gerçekleştirebilmesi için onay verdiğimiz kontrat adresidir. Yani bu bizim haber bülteni örneğindeki haber bültenine ait kontrat addresidir.
494 |ikinci parametre olan "_value" ise haber bülteni kontratına verdiğimiz çekim limitine denir.
495 | 496 | •allowance() 497 |allowance, bir kontrata tokenlarınızı yönetmesi için izin verdiğinizde, kontratın çekebileceği ne kadar çekim limitinin kaldığını gösterir. Örneğin, haber bültenine 6 aylık abone olduk ve toplam 6 BeeToken çeklim limiti hakkı verdik. 4 ay zaman geçtkten sonra aylık 1 BeeToken olduğuna göre 4 ay sonucu 4 BeeToken bizim cüzdanımızdan Haber Bülteni kontratına transfer olmuş olur. Biz "allowance" fonksiyonunu çağırdığımızda bize kalan çekim limiti hakkı olan 2 BeeToken değerini döndürür.
498 |

Allowance fonksiyonu da 2 parametre almaktadır. Bunların ilki "_owner" adresidir. Bu adres, haber bülteni örneğimizdeki Token'ların sahibi yani bizim adresimizdir. 2.parametre ise "_spender" adresidir. Bu adres ise yine haber bülteni örneğimzden ilerlersek haber bülteninin kontrat adresidir.
501 |Kısacası bu fonksiyon hangi token sahibinin hangi adreslere ödeme hakkı(approve) verdiyse, o ödeme miktarından kalan değeri verir.
502 |Şimdi projemizin kodlarından ilerleyerek akıllı kontratlar üzerinde etkileşime geçerek approve ve allowance fonksiyonlarını çalıştıralım. İlk olarak daha önce yaptığımız işlemler gibi approve ve allowance işlerimlerini yapmak için "useAllowance" adında bir custom hook daha oluşturuyoruz. Son olarak dizin yapımız aşağıdaki gibi olmaktadır...
503 |
ilk olarak allowance ve approving state değişkenlerini oluşturuyoruz. allowance bize akıllı kontratta kullanıcının verdiği ödeme izninde kalan ödeme miktarını verecektir. Burada ödeme "BigNumber.from(0)" türünden olacağınız belirtiyoruz. Çünkü ileride akıllı kontratlar üzerinde alabileceği en fazla çekim iznini vereceğiz ve bu gerçekten çok büyük bir sayı...
557 | 558 | • 559 | ``` 560 | useEffect(()=>{ 561 | getAllowance(); 562 | },[]) 563 | ``` 564 | 565 |Burada useEffect ile app.js kontratından useAllowance hook'unu çağırır çağırmaz getAllowance fonksiyonu BeeToken kontratına gidip allowance fonksiyonunu çalıştırarak bize değeri döndürecektir. Eğer approve yapmamışsak, allowance değerini girilmediği için default değer olarak 0 değerini döndürecektir.
566 | 567 | ``` 568 | const getAllowance = async()=>{ 569 | const provider = new ethers.providers.Web3Provider(window.ethereum) 570 | const signer = provider.getSigner() 571 | const tokenContract = new ethers.Contract(BeeTOKEN_ADDRESS,TOKEN_ABI,signer) 572 | const result = await tokenContract.allowance(signer.getAddress(),LOCK_ADDRESS) 573 | setAllowance(result) 574 | } 575 | ``` 576 | 577 | •const provider = new ethers.providers.Web3Provider(window.ethereum)
578 | etherjs kütüphanesini kullanarak provider’ımızı “window.ethereum” olarak belirtiyoruz ve provider değişkenine atıyoruz.Metamask bize o an bağlı olduğu ağın rpc ni getirerek otomatik o api’nin getirdiği node’a yani providera bağlantı kuruyor.
579 | 580 | •const signer = provider.getSigner()
581 | Metamask’ımız da o an ki aktif olan imzalayıcı olan cüzdanı getirir. Blockchaine veri yazarken bu signer ile işlemler imzalanmaktadır.
582 | 583 | •const tokenContract = new ethers.Contract(BeeTOKEN_ADDRESS,TOKEN_ABI,signer)
584 | Bu satırda blockchain’e deploy ettiğimiz BeeToken kontratın bilgilerini parametre olarak giriyoruz. 3.parametre olarak signer’ı giriyoruz. Burada blockchain’ e veri yazılması durumunda bu signer ile imzalanarak gas ücretini ödeyecektir. Buradaki signer yukarıda dediğimiz gibi metamask adresinde o an o ağda seçili olan hesaptır. 585 | Bu ağdaki BeeToken kontratın instance’sını bize döndürerek bunu değişkende tutuyoruz.Artık tokenContract ile BeeToken fonksiyonlarını çalıştırabileceğiz.
586 | 587 | •const result = await tokenContract.allowance(signer.getAddress(),LOCK_ADDRESS)
588 | BeeToken kontratından(ERC20) allowance fonksiyonunu çalıştırıyoruz. İlk parametre olarak token sahibi olan yani o anki metamask cüzdanında hangi adres bu fonksiyonu çalıştırıyor ise( kısacası Haber Bülteni örneğinde bizim adresimiz) onun adresini giriyoruz. 2. parametre olarak ise lock kontratının ağa deploy edildiği adresini ( Haber Bülteni örneğinde bültenin kontrat adresi yani approve ettiğimiz adres) giriyoruz. Hatırlarsak bu fonksiyon getter fonksiyonu olduğu için bize kalan ödeme limitini döndürecektir ve result değişkeninde bu değeri tutuyoruz.
589 | 590 | •setAllowance(result)
591 | Result değişkeninde tuttuğumuz allowance değerini "allowance" state'ine aktarıyoruz.
592 | 593 | 594 | ``` 595 | const approve = async() =>{ 596 | const provider = new ethers.providers.Web3Provider(window.ethereum) 597 | const signer = provider.getSigner() 598 | const tokenContract = new ethers.Contract(BeeTOKEN_ADDRESS,TOKEN_ABI,signer) 599 | setIsApproving(true) 600 | try { 601 | const txn = await tokenContract.approve(LOCK_ADDRESS,ethers.constants.MaxUint256) 602 | await txn.wait(); 603 | setIsApproving(false); 604 | getAllowance() 605 | }catch{ 606 | setIsApproving(false); 607 | 608 | } 609 | } 610 | 611 | return {allowance,approving,approve} 612 | ``` 613 | 614 | 615 |Burada provider, signer, tokenContract satırındaki kodları yukarıda açıkladığım için direk try bloğundan başlayacağım. Try bloğunun yapısı geneli içerisinde kodlar hatalı duruma düşer ise, catch bloğunun içerisindeki hata fırlatılır. Biz burada try bloğunun içerisinde hata alırsak "approving" state'ini false durumuna döndüreceğimizi söyledik.
616 | 617 | 618 | ``` 619 | try { 620 | const txn = await tokenContract.approve(LOCK_ADDRESS,ethers.constants.MaxUint256) 621 | await txn.wait(); 622 | setIsApproving(false); 623 | getAllowance() 624 | }catch{ 625 | setIsApproving(false); 626 | 627 | } 628 | ``` 629 | 630 | 631 | •const txn = await tokenContract.approve(LOCK_ADDRESS,ethers.constants.MaxUint256)
632 | Burada BeeToken kontratındaki approve fonksiyonunu çalıştırıyoruz. İlk parametre olarak, "transferFrom()" fonksiyonunu kullanarak tokenlarımızı transfer etme iznini vereceğimiz adresi giriyoruz. Bu Haber Bülteni örneğimizdeki Haber Bülteni'nin kontrat adresidir. İkinci parametre olarak ise Haber bülteni kontratına ödeme izninin miktarını giriyoruz. Burada örnek olsun diye akıllı kontratlar üzerinde en büyük sayı değerini ethers.constants.MaxUint256 ile çekim limiti olarak belirledik
Not: Burada ödeme izni verdiğimiz kontrata maksimum değeri girmemiz ile bizim tüm bakiyemizi çekme iznine sahip olabiliyor. Eğer Haber bülteni kontratı hacklendiğinde, bir güvenlik açığı olduğunda veya kötü niyetli kullanım ile tüm tokenlarımızı transferForm() fonksiyonu ile transfer edebilir.Bu durum oldukça tehlikelidir!!!
635 | 636 | • 637 | ``` 638 | await txn.wait(); 639 | setIsApproving(false); 640 | getAllowance() 641 | ``` 642 | Burada await txn.wait() ile approve işleminin bitmeden devam etmeyeceğini söylüyoruz. İşlem başarılı bir şekilde tamamlandıktan sonra setIsApproving(false) ile approving state'ini false durumuna geçmesini söylüyoruz ve getAllowance() ile allowance fonksiyonunu tekrar çalıştırarak "allowance" state'ini güncelliyoruz.
return {allowance,approving,approve}
645 | oluşturduğumuz useAllowance() hook'unu diğer sayfalardan (app.js) çağırdığımızda bize allowance, approving değişkenlerini ve approve() fonksiyonunu döndürecektir.
646 | 647 | ### Front_end Baglama 648 | 649 |
Artık son adıma geldik. Burada useAllowance() hookumuzu çağırarak etkileşimde bulunduğumuz kontrattaki değerleri ekrana aktaracağız.
652 | app.js 653 | 654 | ``` 655 | import { ethers } from 'ethers'; 656 | import { useState } from 'react'; 657 | import './App.css'; 658 | import {useLockContract } from './hooks/useLooksContract'; 659 | import {useGetSigner} from './hooks/useGetSigner'; 660 | import { useAllowance } from './hooks/useAllowance'; 661 | 662 | function App() { 663 | const lockContract = useLockContract() 664 | const getSigner = useGetSigner() 665 | const [value,setValue] = useState("") 666 | 667 | const {allowance,approving,approve} = useAllowance() 668 | 669 | 670 | const getTotalLocked = async() => { 671 | const result = await lockContract?.totalLocked(); // lockkontratına erişim yok ise hata vermesin demek => "?" 672 | console.log(ethers.utils.formatEther(result)) 673 | } 674 | 675 | const lock = async()=>{ 676 | await lockContract.LockToken(ethers.utils.parseEther(value),5); 677 | } 678 | 679 | return ( 680 |const {allowance,approving,approve} = useAllowance()
705 | useAllowance() hookumuzda döndürdüğümüz allowance,approving değişkenlerini ve approve fonksiyonunu alıyoruz.
706 | 707 | • 708 | 709 | ``` 710 | const lock = async()=>{ 711 | await lockContract.LockToken(ethers.utils.parseEther(value),5); 712 | } 713 | ``` 714 | 715 |lock() fonksiyonu ile Lock kontratı üzerindeki "LockToken" fonksiyonunu çalıştırıyoruz. Bu fonksiyon Lock kontratına token göndermemize yaramaktadır.Lock kontratını tekrar incelerseniz, ilk parametre olarka gönderilecek token miktarını almaktadır. Bu miktarı input ekranında girilen değeri "parseEther" ile ether türüne çeviriyoruz.(Yani wei cinsinden sıfırlar ile uğraşmıyoruz.). 2. parametre olarak 5 değerini girmişiz. Bu ise LockToken fonksiyonunun en son çalıştırıldığından 5 saniye içinde tekrar çalıştırılmayacağı anlamına gelmektedir. Bir nevi kilitli kalacağı zamanı(saniye cinsinden ) belirtmektedir.
716 | 717 | • 718 | 719 | ``` 720 | setValue( e.target.value)}/> 721 | 722 | ``` 723 | 724 |İlk satırda input dan aldığımız değeri value state'ine aktarıyoruz. Daha sonra Lock Tokens butonuna tıklandığında yukarıda oluşturduğumuz lock() fonksiyonu çalışarak kontrata token kilitleme işlemini gerçekleştiriyoruz.
725 |Not: Burada Lock kontratını hiç approve etmediğimiz için lock fonksiyonu çalışmayacak ve Lock kontratına token kilitleyemeyeceğiz. Bunun için aşağıdaki approve butonuna tıklayarak ilk önce izin vereceğiz ve daha sonra "Lock Tokens" butonuna tıklayarak token kilitleme işlemini yapabiliriz.
726 | 727 | •/button onClick={approve}>Approve/button>
728 | "Approve" butonuna tıklandığında useAllowance() hookumuzda döndürdüğümüz approve fonksiyonunun çalışmasını söyledik. Bu Lock kontratına ödeme iznini verecektir. Bu bizim örneğimizde Haber Bülteni kontratına izin veren işlemdir.
729 | 730 | • 731 | 732 | ``` 733 |ethers.utils.formatEther(allowance) ile "useAllowance()" hookumuzdan döndürdüğümüz allowance değerini ether türüne çevirerek ekrana yazdırıyoruz.
Sizlere adım adım Metamask, Hardhat, Ethers.js, React araçları ile beraber proje oluşturarak nasıl kontratları block zinciri ağlarına deploy edeceğimizi ve bu deploy ettiğimiz kontralar ile nasıl etkileşime girerek front-end kısmında nasıl göstereceğimize değindim. Elimden geldiğince açıklamaya çalıştım. Konu hakkında sorularını olursa veya eksik gördüğünüz yerleri twitter: @mustierd adresinden bana ulaşabilirsiniz.
741 | --------------------------------------------------------------------------------