[ Download CSV Export ]
OVERVIEW
https://koyo.finance/
Latest 25 internal transaction
[ Download CSV Export ]
Contract Source Code Verified (Exact Match)
Contract Name:
Vyper_contract
Compiler Version
vyper:0.3.3
Contract Source Code (Vyper language format)
# @version 0.3.3 """ @title Kōyō Finance (KYO) token @author Kōyō Finance @license MIT @dev 6_149_520_000 tokens are minter over the period of ~5 years (157680000 seconds). Every epoch (1 second), 39 KYO tokens are available to be minted by the "Minter" contract. """ from vyper.interfaces import ERC20 implements: ERC20 event Transfer: _from: indexed(address) _to: indexed(address) _value: uint256 event Approval: _owner: indexed(address) _spender: indexed(address) _value: uint256 event Mint: minter: indexed(address) recipient: indexed(address) amount: uint256 previous_total_supply: uint256 new_total_supply: uint256 event CommitOwnership: owner: indexed(address) event ApplyOwnership: owner: indexed(address) event SetMinter: minter: indexed(address) YEAR: constant(uint256) = 365 * 86400 EMISSION_DURATION: constant(uint256) = 5 * YEAR EMISSION_AMOUNT: constant(uint256) = 6_149_520_000 name: public(String[64]) symbol: public(String[32]) decimals: public(uint256) total_supply: uint256 balanceOf: public(HashMap[address, uint256]) allowances: HashMap[address, HashMap[address, uint256]] emission_end: public(uint256) emission_rate: public(uint256) emissions_generated: public(uint256) emissions_last_update_time: public(uint256) owner: public(address) # Can and will be a smart contract future_owner: public(address) minter: public(address) # Can and will be a smart contract future_minter: public(address) @external def __init__(_name: String[64], _symbol: String[32], _decimals: uint256): """ @notice Contract constructor. @param _name Token full name. @param _symbol Token symbol. @param _decimals Number of decimals for token. """ ts: uint256 = block.timestamp self.owner = msg.sender self.minter = msg.sender self.name = _name self.symbol = _symbol self.decimals = _decimals self.emission_end = ts + EMISSION_DURATION self.emission_rate = (EMISSION_AMOUNT * 10 ** _decimals) / EMISSION_DURATION self.emissions_generated = 0 self.emissions_last_update_time = ts @internal @view def assert_is_owner(addr: address): """ @notice Check if the call is from the owner, revert if not. @param addr Address to be checked. """ assert addr == self.owner # dev: owner only @internal @view def assert_is_minter(addr: address): """ @notice Check if the call is from the designated minter, revert if not. @param addr Address to be checked. """ assert addr == self.minter # dev: minter only @internal def _update_emissions() -> uint256: total: uint256 = self.emissions_generated last_time: uint256 = min(block.timestamp, self.emission_end) total += (last_time - self.emissions_last_update_time) * self.emission_rate self.emissions_generated = total self.emissions_last_update_time = last_time return total @external @view def totalSupply() -> uint256: """ @notice Total number of tokens in existence. """ return self.total_supply @external @view def allowance(_owner : address, _spender : address) -> uint256: """ @notice Check the amount of tokens that an owner allowed to a spender. @param _owner The address which owns the funds. @param _spender The address which will spend the funds. @return uint256 specifying the amount of tokens still available for the spender. """ return self.allowances[_owner][_spender] @external def transfer(_to : address, _value : uint256) -> bool: """ @notice Transfer `_value` tokens from `msg.sender` to `_to`. @dev Vyper does not allow underflows, so the subtraction in this function will revert on an insufficient balance. @param _to The address to transfer to. @param _value The amount to be transferred. @return bool success. """ assert _to != ZERO_ADDRESS # dev: transfers to 0x0 are not allowed self.balanceOf[msg.sender] -= _value self.balanceOf[_to] += _value log Transfer(msg.sender, _to, _value) return True @external def transferFrom(_from : address, _to : address, _value : uint256) -> bool: """ @notice Transfer `_value` tokens from `_from` to `_to`. @param _from address The address which you want to send tokens from. @param _to address The address which you want to transfer to. @param _value uint256 the amount of tokens to be transferred. @return bool success. """ assert _to != ZERO_ADDRESS # dev: transfers to 0x0 are not allowed # NOTE: vyper does not allow underflows # so the following subtraction would revert on insufficient balance self.balanceOf[_from] -= _value self.balanceOf[_to] += _value self.allowances[_from][msg.sender] -= _value log Transfer(_from, _to, _value) return True @external def approve(_spender : address, _value : uint256) -> bool: """ @notice Approve `_spender` to transfer `_value` tokens on behalf of `msg.sender`. @dev Approval may only be from zero -> nonzero or from nonzero -> zero in order to mitigate the potential race condition described here: https://github.com/ethereum/EIPs/issues/20#issuecomment-263524729 . @param _spender The address which will spend the funds. @param _value The amount of tokens to be spent. @return bool success. """ assert _value == 0 or self.allowances[msg.sender][_spender] == 0 self.allowances[msg.sender][_spender] = _value log Approval(msg.sender, _spender, _value) return True @external def increaseAllowance(_spender: address, _added_value: uint256) -> bool: """ @notice Increase the allowance granted to `_spender` by the caller @dev This is alternative to {approve} that can be used as a mitigation for the potential race condition @param _spender The address which will transfer the funds @param _added_value The amount of to increase the allowance @return bool success """ allowance: uint256 = self.allowances[msg.sender][_spender] + _added_value self.allowances[msg.sender][_spender] = allowance log Approval(msg.sender, _spender, allowance) return True @external def decreaseAllowance(_spender: address, _subtracted_value: uint256) -> bool: """ @notice Decrease the allowance granted to `_spender` by the caller. @dev This is alternative to {approve} that can be used as a mitigation for the potential race condition. @param _spender The address which will transfer the funds. @param _subtracted_value The amount of to decrease the allowance. @return bool success. """ allowance: uint256 = self.allowances[msg.sender][_spender] - _subtracted_value self.allowances[msg.sender][_spender] = allowance log Approval(msg.sender, _spender, allowance) return True @external def mint_available(_to: address) -> bool: """ @notice Mints any available tokens to `_to`. @param _to Address to which all available tokens should be minted. @return bool success. """ self.assert_is_minter(msg.sender) assert _to != ZERO_ADDRESS # dev: zero address amount_till: uint256 = self.emissions_generated amount_overall: uint256 = self._update_emissions() amount: uint256 = amount_overall - amount_till _total_supply: uint256 = self.total_supply self.total_supply = _total_supply + amount self.balanceOf[_to] += amount log Transfer(ZERO_ADDRESS, _to, amount) log Mint(msg.sender, _to, amount, _total_supply, self.total_supply) return True @external def burn(_value: uint256) -> bool: """ @notice Burn `_value` tokens belonging to `msg.sender`. @dev Emits a Transfer event with a destination of 0x00. @param _value The amount that will be burned. @return bool success. """ self.balanceOf[msg.sender] -= _value self.total_supply -= _value log Transfer(msg.sender, ZERO_ADDRESS, _value) return True @external def set_minter(_minter: address): """ @notice Set the minter address. @param _minter Address of the minter. """ self.assert_is_owner(msg.sender) self.minter = _minter log SetMinter(_minter) @external def commit_transfer_ownership(addr: address): """ @notice Transfer ownership of the "Minter" contract to `addr`. @param addr Address to have ownership transferred to. """ self.assert_is_owner(msg.sender) self.future_owner = addr log CommitOwnership(addr) @external def apply_transfer_ownership(): """ @notice Apply ownership transfer. """ self.assert_is_owner(msg.sender) _owner: address = self.future_owner assert _owner != ZERO_ADDRESS # dev: owner not set self.owner = _owner self.future_owner = ZERO_ADDRESS log ApplyOwnership(_owner) @external def set_name(_name: String[64], _symbol: String[32]): """ @notice Change the token name and symbol to `_name` and `_symbol`. @dev Only callable by the admin account. @param _name New token name. @param _symbol New token symbol. """ self.assert_is_owner(msg.sender) self.name = _name self.symbol = _symbol
Contract Security Audit
- No Contract Security Audit Submitted- Submit Audit Here
[{"name":"Transfer","inputs":[{"name":"_from","type":"address","indexed":true},{"name":"_to","type":"address","indexed":true},{"name":"_value","type":"uint256","indexed":false}],"anonymous":false,"type":"event"},{"name":"Approval","inputs":[{"name":"_owner","type":"address","indexed":true},{"name":"_spender","type":"address","indexed":true},{"name":"_value","type":"uint256","indexed":false}],"anonymous":false,"type":"event"},{"name":"Mint","inputs":[{"name":"minter","type":"address","indexed":true},{"name":"recipient","type":"address","indexed":true},{"name":"amount","type":"uint256","indexed":false},{"name":"previous_total_supply","type":"uint256","indexed":false},{"name":"new_total_supply","type":"uint256","indexed":false}],"anonymous":false,"type":"event"},{"name":"CommitOwnership","inputs":[{"name":"owner","type":"address","indexed":true}],"anonymous":false,"type":"event"},{"name":"ApplyOwnership","inputs":[{"name":"owner","type":"address","indexed":true}],"anonymous":false,"type":"event"},{"name":"SetMinter","inputs":[{"name":"minter","type":"address","indexed":true}],"anonymous":false,"type":"event"},{"stateMutability":"nonpayable","type":"constructor","inputs":[{"name":"_name","type":"string"},{"name":"_symbol","type":"string"},{"name":"_decimals","type":"uint256"}],"outputs":[]},{"stateMutability":"view","type":"function","name":"totalSupply","inputs":[],"outputs":[{"name":"","type":"uint256"}]},{"stateMutability":"view","type":"function","name":"allowance","inputs":[{"name":"_owner","type":"address"},{"name":"_spender","type":"address"}],"outputs":[{"name":"","type":"uint256"}]},{"stateMutability":"nonpayable","type":"function","name":"transfer","inputs":[{"name":"_to","type":"address"},{"name":"_value","type":"uint256"}],"outputs":[{"name":"","type":"bool"}]},{"stateMutability":"nonpayable","type":"function","name":"transferFrom","inputs":[{"name":"_from","type":"address"},{"name":"_to","type":"address"},{"name":"_value","type":"uint256"}],"outputs":[{"name":"","type":"bool"}]},{"stateMutability":"nonpayable","type":"function","name":"approve","inputs":[{"name":"_spender","type":"address"},{"name":"_value","type":"uint256"}],"outputs":[{"name":"","type":"bool"}]},{"stateMutability":"nonpayable","type":"function","name":"increaseAllowance","inputs":[{"name":"_spender","type":"address"},{"name":"_added_value","type":"uint256"}],"outputs":[{"name":"","type":"bool"}]},{"stateMutability":"nonpayable","type":"function","name":"decreaseAllowance","inputs":[{"name":"_spender","type":"address"},{"name":"_subtracted_value","type":"uint256"}],"outputs":[{"name":"","type":"bool"}]},{"stateMutability":"nonpayable","type":"function","name":"mint_available","inputs":[{"name":"_to","type":"address"}],"outputs":[{"name":"","type":"bool"}]},{"stateMutability":"nonpayable","type":"function","name":"burn","inputs":[{"name":"_value","type":"uint256"}],"outputs":[{"name":"","type":"bool"}]},{"stateMutability":"nonpayable","type":"function","name":"set_minter","inputs":[{"name":"_minter","type":"address"}],"outputs":[]},{"stateMutability":"nonpayable","type":"function","name":"commit_transfer_ownership","inputs":[{"name":"addr","type":"address"}],"outputs":[]},{"stateMutability":"nonpayable","type":"function","name":"apply_transfer_ownership","inputs":[],"outputs":[]},{"stateMutability":"nonpayable","type":"function","name":"set_name","inputs":[{"name":"_name","type":"string"},{"name":"_symbol","type":"string"}],"outputs":[]},{"stateMutability":"view","type":"function","name":"name","inputs":[],"outputs":[{"name":"","type":"string"}]},{"stateMutability":"view","type":"function","name":"symbol","inputs":[],"outputs":[{"name":"","type":"string"}]},{"stateMutability":"view","type":"function","name":"decimals","inputs":[],"outputs":[{"name":"","type":"uint256"}]},{"stateMutability":"view","type":"function","name":"balanceOf","inputs":[{"name":"arg0","type":"address"}],"outputs":[{"name":"","type":"uint256"}]},{"stateMutability":"view","type":"function","name":"emission_end","inputs":[],"outputs":[{"name":"","type":"uint256"}]},{"stateMutability":"view","type":"function","name":"emission_rate","inputs":[],"outputs":[{"name":"","type":"uint256"}]},{"stateMutability":"view","type":"function","name":"emissions_generated","inputs":[],"outputs":[{"name":"","type":"uint256"}]},{"stateMutability":"view","type":"function","name":"emissions_last_update_time","inputs":[],"outputs":[{"name":"","type":"uint256"}]},{"stateMutability":"view","type":"function","name":"owner","inputs":[],"outputs":[{"name":"","type":"address"}]},{"stateMutability":"view","type":"function","name":"future_owner","inputs":[],"outputs":[{"name":"","type":"address"}]},{"stateMutability":"view","type":"function","name":"minter","inputs":[],"outputs":[{"name":"","type":"address"}]},{"stateMutability":"view","type":"function","name":"future_minter","inputs":[],"outputs":[{"name":"","type":"address"}]}]
Contract Creation Code
6020610b516000396000516040602082610b510160003960005111610b4c57602081610b510160003960005180604052602082018181610b51016060395050506020610b716000396000516020602082610b510160003960005111610b4c57602081610b51016000396000518060a05260208201602081610b510160003960005160c0525050504260e05233600d5533600f55604051806000556000602082601f010460028111610b4c5780156100ca57905b602081026060015181600101556001018181186100b2575b50505060a0518060035560c051600455506020610b9160003960005160055560e05163096601808181830110610b4c578082019050905060095564016e8a3a80604e6020610b916000396000511015610b4c576020610b91600039600051600a0a808202821582848304141715610b4c5790509050630966018080820490509050600a556000600b5560e051600c556109d96101726300000000396109d96000016300000000f3600436101561000d57610945565b60003560e01c346109d4576318160ddd811861002f5760065460405260206040f35b63dd62ed3e8118610081576004358060a01c6109d4576040526024358060a01c6109d4576060526008604051602052600052604060002080606051602052600052604060002090505460805260206080f35b63a9059cbb811861012b576004358060a01c6109d4576040526000604051146109d457600733602052600052604060002080546024358082106109d4578082039050905081555060076040516020526000526040600020805460243581818301106109d45780820190509050815550604051337fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60243560605260206060a3600160605260206060f35b6323b872dd811861021c576004358060a01c6109d4576040526024358060a01c6109d4576060526000606051146109d4576007604051602052600052604060002080546044358082106109d4578082039050905081555060076060516020526000526040600020805460443581818301106109d457808201905090508155506008604051602052600052604060002080336020526000526040600020905080546044358082106109d457808203905090508155506060516040517fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60443560805260206080a3600160805260206080f35b63095ea7b381186102c9576004358060a01c6109d4576040526024351561026357600833602052600052604060002080604051602052600052604060002090505415610266565b60015b156109d4576024356008336020526000526040600020806040516020526000526040600020905055604051337f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92560243560605260206060a3600160605260206060f35b63395093518118610376576004358060a01c6109d457604052600833602052600052604060002080604051602052600052604060002090505460243581818301106109d457808201905090506060526060516008336020526000526040600020806040516020526000526040600020905055604051337f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92560605160805260206080a3600160805260206080f35b63a457c2d78118610421576004358060a01c6109d45760405260083360205260005260406000208060405160205260005260406000209050546024358082106109d457808203905090506060526060516008336020526000526040600020806040516020526000526040600020905055604051337f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92560605160805260206080a3600160805260206080f35b63bf5221448118610547576004358060a01c6109d45760805233604052610446610958565b6000608051146109d457600b5460a05261046060e0610965565b60e05160c05260c05160a0518082106109d4578082039050905060e052600654610100526101005160e05181818301106109d4578082019050905060065560076080516020526000526040600020805460e05181818301106109d4578082019050905081555060805160007fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60e051610120526020610120a3608051337f458f5fa412d0f69b08dd84872b0215675cc67bc1d5b6fd93300a1c3878b8619660e051610120526101005161014052600654610160526060610120a36001610120526020610120f35b6342966c6881186105c757600733602052600052604060002080546004358082106109d457808203905090508155506006546004358082106109d457808203905090506006556000337fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60043560405260206040a3600160405260206040f35b631652e9fc811861061d576004358060a01c6109d457606052336040526105ec61094b565b606051600f556060517fcec52196e972044edde8689a1b608e459c5946b7f3e5c8cd3d6d8e126d422e1c60006080a2005b636b441a408118610673576004358060a01c6109d4576060523360405261064261094b565b606051600e556060517f2f56810a6bf40af059b96d3aea4db54081f378029a518390491093a7b67032e960006080a2005b636a1c05ae81186106d0573360405261068a61094b565b600e546060526000606051146109d457606051600d556000600e556060517febee2d5739011062cb4f14113f3b36bf0ffe3da5c0568f64189d1012a118910560006080a2005b63e1430e0681186107745760043560040160408135116109d45780358060605260208201818160803750505060243560040160208135116109d45780358060c05260208201803560e0525050503360405261072961094b565b606051806000556000602082601f0104600281116109d457801561076157905b60208102608001518160010155600101818118610749575b50505060c0518060035560e05160045550005b6306fdde0381186107f15760208060405280604001600054808252602082016000602083601f0104600281116109d45780156107c357905b8060010154602082028401526001018181186107ac575b50505050805180602083010181600003601f163682375050601f19601f825160200101169050810190506040f35b6395d89b41811861084157602080604052806040016003548082526020820160045481525050805180602083010181600003601f163682375050601f19601f825160200101169050810190506040f35b63313ce56781186108585760055460405260206040f35b6370a08231811861088b576004358060a01c6109d457604052600760405160205260005260406000205460605260206060f35b635c1d73a481186108a25760095460405260206040f35b633a93dd0981186108b957600a5460405260206040f35b637928ce3881186108d057600b5460405260206040f35b63a9261d5a81186108e757600c5460405260206040f35b638da5cb5b81186108fe57600d5460405260206040f35b631ec0cdc1811861091557600e5460405260206040f35b6307546172811861092c57600f5460405260206040f35b637b5dede381186109435760105460405260206040f35b505b60006000fd5b600d54604051186109d457565b600f54604051186109d457565b600b546040524260095480828118828410021890509050606052604051606051600c548082106109d45780820390509050600a548082028215828483041417156109d4579050905081818301106109d45780820190509050604052604051600b55606051600c55604051815250565b600080fd005b600080fd000000000000000000000000000000000000000000000000000000000000006000000000000000000000000000000000000000000000000000000000000000a00000000000000000000000000000000000000000000000000000000000000012000000000000000000000000000000000000000000000000000000000000000c4bc58d79c58d20546f6b656e000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000034b594f0000000000000000000000000000000000000000000000000000000000
Constructor Arguments (ABI-Encoded and is the last bytes of the Contract Creation Code above)
000000000000000000000000000000000000000000000000000000000000006000000000000000000000000000000000000000000000000000000000000000a00000000000000000000000000000000000000000000000000000000000000012000000000000000000000000000000000000000000000000000000000000000c4bc58d79c58d20546f6b656e000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000034b594f0000000000000000000000000000000000000000000000000000000000
-----Decoded View---------------
Arg [0] : _name (string): Kōyō Token
Arg [1] : _symbol (string): KYO
Arg [2] : _decimals (uint256): 18
-----Encoded View---------------
7 Constructor Arguments found :
Arg [0] : 0000000000000000000000000000000000000000000000000000000000000060
Arg [1] : 00000000000000000000000000000000000000000000000000000000000000a0
Arg [2] : 0000000000000000000000000000000000000000000000000000000000000012
Arg [3] : 000000000000000000000000000000000000000000000000000000000000000c
Arg [4] : 4bc58d79c58d20546f6b656e0000000000000000000000000000000000000000
Arg [5] : 0000000000000000000000000000000000000000000000000000000000000003
Arg [6] : 4b594f0000000000000000000000000000000000000000000000000000000000
Make sure to use the "Vote Down" button for any spammy posts, and the "Vote Up" for interesting conversations.