ApeWorX / ape

The smart contract development tool for Pythonistas, Data Scientists, and Security Professionals
https://apeworx.io
Apache License 2.0
889 stars 131 forks source link

ValueError:start (134,27) precedes previous end (135,0) [APE-879] #1399

Closed PatrickAlphaC closed 1 year ago

PatrickAlphaC commented 1 year ago

Environment information

$ ape --version
0.6.8

$ ape plugins list
Installed Plugins:
  vyper        0.6.3
  etherscan    0.6.3
  alchemy      0.6.1
$ cat ape-config.yaml
name: ape-smart-contract-lottery-v23
contracts_folder: contracts
deployments:
  ethereum:
    sepolia:
      - contract_type: VRFCoordinatorV2
        address: "0x8103B0A8A00be2DDC778e6e7eaa21791Cd364625"
      - contract_type: LinkToken
        address: "0x779877A7B0D9E8603169DdbD7836e478b4624789"
default_ecosystem: ethereum

What went wrong?

This vyper contract won't compile. When I try to compile with ape compile, I get this error:

ERROR: (VyperCompileError) test/LinkToken.vy
ValueError:start (134,27) precedes previous end (135,0)

Here is the contract. It's mostly comments:

# @version 0.3.7

name: public(String[32])
symbol: public(String[32])
decimals: public(uint8)

# # 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#mappings
# balanceOf: public(HashMap[address, uint256])
# # By declaring `allowance` as public, vyper automatically generates the `allowance()` getter
# allowance: public(HashMap[address, HashMap[address, uint256]])
# # By declaring `totalSupply` as public, we automatically create the `totalSupply()` getter
# totalSupply: public(uint256)
# minter: address

# @external
# def __init__(_name: String[32], _symbol: String[32], _decimals: uint8, _supply: uint256):
#     init_supply: uint256 = _supply * 10 ** convert(_decimals, uint256)
#     self.name = _name
#     self.symbol = _symbol
#     self.decimals = _decimals
#     self.balanceOf[msg.sender] = init_supply
#     self.totalSupply = init_supply
#     self.minter = msg.sender
#     log Transfer(ZERO_ADDRESS, msg.sender, init_supply)

# @external
# def transfer(_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 balance
#     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:
#     """
#      @dev Transfer tokens from one address to another.
#      @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 balance
#     self.balanceOf[_from] -= _value
#     self.balanceOf[_to] += _value
#     # NOTE: vyper does not allow underflows
#     #      so the following subtraction would revert on insufficient allowance
#     self.allowance[_from][msg.sender] -= _value
#     log Transfer(_from, _to, _value)
#     return True

# @external
# def approve(_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.
#     """
#     self.allowance[msg.sender][_spender] = _value
#     log Approval(msg.sender, _spender, _value)
#     return True

# @external
# def mint(_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.
#     """
#     assert msg.sender == self.minter
#     assert _to != ZERO_ADDRESS
#     self.totalSupply += _value
#     self.balanceOf[_to] += _value
#     log Transfer(ZERO_ADDRESS, _to, _value)

# @internal
# def _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_ADDRESS
#     self.totalSupply -= _value
#     self.balanceOf[_to] -= _value
#     log Transfer(_to, ZERO_ADDRESS, _value)

# @external
# def burn(_value: uint256):
#     """
#     @dev Burn an amount of the token of msg.sender.
#     @param _value The amount that will be burned.
#     """
#     self._burn(msg.sender, _value)

# @external
# def burnFrom(_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.
#     """
#     self.allowance[_to][msg.sender] -= _value
#     self._burn(_to, _value)

# TODO:
# TransferAndCall 
# And all ERC-677 functions
fubuloubu commented 1 year ago

That's wild, is there any extra tabs in there perchance?

fubuloubu commented 1 year ago

I have confirmed this is an error with the Vyper compiler, please re-open there

$ ~/.vvm/vyper-0.3.7 contracts/FundMe.vy 
Error compiling: contracts/FundMe.vy
ValueError: start (40,79) precedes previous end (41,0)
[342434] Failed to execute script 'vyper_compile' due to unhandled exception!