# NOTE: By declaring `balanceOf` as public, vyper automatically generates a 'balanceOf()' getter# method to allow access to account balances.# The _KeyType will become a required parameter for the getter and it will return _ValueType.# See: https://vyper.readthedocs.io/en/v0.1.0-beta.8/types.html?highlight=getter#mappingsbalanceOf:public(map(address,uint256))...@publicdef__init__(_name:string[64],_symbol:string[32],_decimals:uint256,_supply:uint256):init_supply:uint256=_supply*10**_decimalsself.name=_nameself.symbol=_symbolself.decimals=_decimalsself.balanceOf[msg.sender]=init_supplyself.total_supply=init_supplyself.minter=msg.senderlog.Transfer(ZERO_ADDRESS,msg.sender,init_supply)
This view method gets the allowance of an address (_spender) to spend on behalf of some other account _owner.
Input
Type
Description
_spender
address
Account that can spend up to the allowance
_owner
address
Account that is paying when _spender spends the allowance
Source code
@public@constantdefallowance(_owner:address,_spender:address)->uint256:""" @dev Function to 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 An uint256 specifying the amount of tokens still available for the spender. """returnself.allowances[_owner][_spender]
Transfer tokens to a specified address. _from address is implicitly msg.sender. Returns True if the transfer succeeds.
Input
Type
Description
_to
address
Receiver of the tokens
_value
uint256
Amount of tokens to be transferred
Emits: Transfer
Source code
@publicdeftransfer(_to:address,_value:uint256)->bool:""" @dev Transfer token for a specified address @param _to The address to transfer to. @param _value The amount to be transferred. """# NOTE: vyper does not allow underflows# so the following subtraction would revert on insufficient balanceself.balanceOf[msg.sender]-=_valueself.balanceOf[_to]+=_valuelog.Transfer(msg.sender,_to,_value)returnTrue
Transfer tokens from one address to another. msg.sender does the transfer on behalf of the _from address, and requires sufficient spending allowance. Returns True if transfer succeeds.
Input
Type
Description
_from
address
Address which msg.sender want to send tokens from
_to
address
Address which msg.sender want to transfer to
_value
uint256
Amount of tokens to be transferred
Emits: Transfer
Source code
@publicdeftransferFrom(_from:address,_to:address,_value:uint256)->bool:""" @dev Transfer tokens from one address to another. Note that while this function emits a Transfer event, this is not required as per the specification, and other compliant implementations may not emit the event. @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 """# NOTE: vyper does not allow underflows# so the following subtraction would revert on insufficient balanceself.balanceOf[_from]-=_valueself.balanceOf[_to]+=_valueifmsg.sender!=self.minter:# minter is allowed to transfer anything# NOTE: vyper does not allow underflows# so the following subtraction would revert on insufficient allowanceself.allowances[_from][msg.sender]-=_valuelog.Transfer(_from,_to,_value)returnTrue
Note
While this function emits a Transfer event, this is not required as per the specification, and other compliant implementations may not emit the event.
Approve the passed address to spend the specified amount of tokens on behalf of msg.sender. Returns True on successful approvals.
Input
Type
Description
_spender
address
Address which will spend the funds
_value
uint256
Amount of tokens to be spent
Emits: Approval
Source code
@publicdefapprove(_spender:address,_value:uint256)->bool:""" @dev Approve the passed address to spend the specified amount of tokens on behalf of msg.sender. Beware that changing an allowance with this method brings the risk that someone may use both the old and the new allowance by unfortunate transaction ordering. One possible solution to mitigate this race condition is to first reduce the spender's allowance to 0 and set the desired value afterwards: 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. """assert_value==0orself.allowances[msg.sender][_spender]==0self.allowances[msg.sender][_spender]=_valuelog.Approval(msg.sender,_spender,_value)returnTrue
Warning
Beware that changing an allowance with this method brings the risk that someone may use both the old and the new allowance by unfortunate transaction ordering. One possible solution to mitigate this race condition is to first reduce the spender’s allowance to 0 and set the desired value afterwards (see this GitHub issue).
Warning
For Curve LP Tokens V1 and V2, non-zero to non-zero approvals are prohibited. Instead, after every non-zero approval, the allowance for the spender must be reset to 0.
This encapsulates the modification of balances such that the proper events are emitted.
Input
Type
Description
_to
address
Address that will receive the minted tokens
_value
uint256
Amount of tokens that will be minted
Emits: Transfer
Source code
@publicdefmint(_to:address,_value:uint256):""" @dev Mint an amount of the token and assigns it to an account. This encapsulates the modification of balances such that the proper events are emitted. @param _to The account that will receive the created tokens. @param _value The amount that will be created. """assertmsg.sender==self.minterassert_to!=ZERO_ADDRESSself.total_supply+=_valueself.balanceOf[_to]+=_valuelog.Transfer(ZERO_ADDRESS,_to,_value)
@privatedef_burn(_to:address,_value:uint256):""" @dev Internal function that burns an amount of the token of a given account. @param _to The account whose tokens will be burned. @param _value The amount that will be burned. """assert_to!=ZERO_ADDRESSself.total_supply-=_valueself.balanceOf[_to]-=_valuelog.Transfer(_to,ZERO_ADDRESS,_value)@publicdefburn(_value:uint256):""" @dev Burn an amount of the token of msg.sender. @param _value The amount that will be burned. """assertmsg.sender==self.minter,"Only minter is allowed to burn"self._burn(msg.sender,_value)
@privatedef_burn(_to:address,_value:uint256):""" @dev Internal function that burns an amount of the token of a given account. @param _to The account whose tokens will be burned. @param _value The amount that will be burned. """assert_to!=ZERO_ADDRESSself.total_supply-=_valueself.balanceOf[_to]-=_valuelog.Transfer(_to,ZERO_ADDRESS,_value)@publicdefburnFrom(_to:address,_value:uint256):""" @dev Burn an amount of the token from a given account. @param _to The account whose tokens will be burned. @param _value The amount that will be burned. """assertmsg.sender==self.minter,"Only minter is allowed to burn"self._burn(_to,_value)