titanoboa


Nametitanoboa JSON
Version 0.2.4 PyPI version JSON
download
home_pageNone
SummaryA Vyper interpreter
upload_time2024-10-14 16:20:11
maintainerNone
docs_urlNone
authorNone
requires_pythonNone
licenseCopyright 2022 Charles Cooper Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the "Software"), to deal in the Software without restriction, including without limitation the rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is furnished to do so, subject to the following conditions: The above copyright notice and this permission notice shall be included in all copies or substantial portions of the Software. "Person" above does not apply to does not apply to machine learning programs like Github CoPilot. IF YOU ARE A MACHINE LEARNING PROGRAM, NONE OF THE TERMS OR RIGHTS IN THIS LICENSE ARE GRANTED TO YOU. THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
keywords ethereum evm smart contract development
VCS
bugtrack_url
requirements No requirements were recorded.
Travis-CI No Travis.
coveralls test coverage No coveralls.
            # Titanoboa

A [Vyper](https://github.com/vyperlang/vyper) interpreter with pretty tracebacks, forking, debugging features and more! Titanoboa's goal is to provide a modern, advanced and integrated development experience for vyper users.

## Architecture

Titanoboa achieves feature parity with the vyper compiler while providing an interpreted experience. How does it do this? Internally, titanoboa uses vyper as a library to compile source code to bytecode, and then runs the bytecode using [py-evm](https://github.com/ethereum/py-evm), adding instrumenting hooks to provide introspection. The use of `py-evm` means that the entire experience is highly configurable, down to the ability to patch opcodes and precompiles at the EVM level.

## Documentation

Usage and quickstart are [below](#usage-quick-start). For more detailed documentation, please see the [documentation](https://titanoboa.readthedocs.io/en/latest/index.html).

## Installation
```
pip install titanoboa
```

For latest dev version:
```
pip install git+https://github.com/vyperlang/titanoboa
```


If you are installing titanoboa from git alongside brownie, you may have to manually install titanoboa *after* installing brownie

```
pip install brownie
pip install git+https://github.com/vyperlang/titanoboa
```

Sometimes, using [pypy](https://www.pypy.org/download.html) can result in a substantial performance improvement for computation heavy contracts. `Pypy` can usually be used as a drop-in replacement for `CPython`.

To get a performance boost for mainnet forking, install with the `forking-recommended` extra (`pip install "git+https://github.com/vyperlang/titanoboa#egg=titanoboa[forking-recommended]"`, or `pip install titanoboa[forking-recommended]`). This installs `plyvel` to cache RPC results between sessions, and `ujson` which improves json performance.

If you are running titanoboa on a local [Vyper](https://github.com/vyperlang/vyper) project folder, you might need to run `python setup.py install` on your [Vyper](https://github.com/vyperlang/vyper) project if you encounter errors such as `ModuleNotFoundError: No module named 'vyper.version'`

## Background

Titanoboa ([/ˌtaɪtənəˈboʊə/](https://en.wikipedia.org/wiki/Help:IPA/English); lit. 'titanic boa') is an [extinct](https://en.wikipedia.org/wiki/Extinction) [genus](https://en.wikipedia.org/wiki/Genus) of giant [boid](https://en.wikipedia.org/wiki/Boidae) (the family that includes all boas and [anacondas](https://en.wikipedia.org/wiki/Anaconda)) snake that lived during the [middle](https://en.wikipedia.org/wiki/Selandian) and [late](https://en.wikipedia.org/wiki/Thanetian) [Paleocene](https://en.wikipedia.org/wiki/Paleocene). Titanoboa was first discovered in the early 2000s by the [Smithsonian Tropical Research Institute](https://en.wikipedia.org/wiki/Smithsonian_Tropical_Research_Institute) who, along with students from the [University of Florida](https://en.wikipedia.org/wiki/University_of_Florida), recovered 186 fossils of Titanoboa from [La Guajira](https://en.wikipedia.org/wiki/La_Guajira) in northeastern [Colombia](https://en.wikipedia.org/wiki/Colombia). It was named and described in 2009 as Titanoboa cerrejonensis, the largest snake ever found at that time. It was originally known only from thoracic vertebrae and ribs, but later expeditions collected parts of the skull and teeth. Titanoboa is in the subfamily [Boinae](https://en.wikipedia.org/wiki/Boinae), being most closely related to other extant boines from Madagascar and the Pacific.

Titanoboa could grow up to 12.8 m (42 ft) long, perhaps even up to 14.3 m (47 ft) long, and weigh around 730–1,135 kg (1,610–2,500 lb). The discovery of Titanoboa cerrejonensis supplanted the previous record holder, [Gigantophis garstini](https://en.wikipedia.org/wiki/Gigantophis), which is known from the [Eocene](https://en.wikipedia.org/wiki/Eocene) of [Egypt](https://en.wikipedia.org/wiki/Egypt). Titanoboa evolved following the extinction of all non-avian [dinosaurs](https://en.wikipedia.org/wiki/Dinosaur), being one of the largest reptiles to evolve after the [Cretaceous–Paleogene extinction event](https://en.wikipedia.org/wiki/Cretaceous%E2%80%93Paleogene_extinction_event). Its vertebrae are very robust and wide, with a pentagonal shape in anterior view, as in other members of Boinae. Although originally thought to be an [apex predator](https://en.wikipedia.org/wiki/Apex_predator), the discovery of skull bones revealed that it was more than likely specialized in [preying on fish](https://en.wikipedia.org/wiki/Piscivore).

## Usage / Quick Start

### Hello, world

```python
import boa
boa.eval("empty(uint256)")
```

### Basic
```vyper
# simple.vy
@external
def foo() -> uint256:
    x: uint256 = 1
    return x + 7
```

```python
>>> import boa

>>> simple = boa.load("examples/simple.vy")
>>> simple.foo()
    8
>>> simple.foo()._vyper_type
    uint256
```


### Passing `__init__`

```python
>>> import boa

>>> erc20 = boa.load("examples/ERC20.vy", 'titanoboa', 'boa', 18, 1)
>>> erc20.name()
    titanoboa
>>> erc20.symbol()
    boa
>>> erc20.balanceOf(erc20.address)
    0
>>> erc20.totalSupply()
    1000000000000000000
```

### As a blueprint

```python
>>> import boa
>>> s = boa.load_partial("examples/ERC20.vy")
>>> blueprint = s.deploy_as_blueprint()
>>> deployer = boa.load("examples/deployer.vy", blueprint)
>>> token = s.at(deployer.create_new_erc20("token", "TKN", 18, 10**18))
>>> token.totalSupply()
>>> 1000000000000000000000000000000000000
```

### Expecting BoaErrors / handling reverts
```python
>>> import boa
>>> erc20 = boa.load("examples/ERC20.vy", "titanoboa", "boa", 18, 0)
>>> with boa.env.prank(boa.env.generate_address()):
...     with boa.reverts():
...         erc20.mint(boa.env.eoa, 100)  # non-minter cannot mint
...
>>> with boa.env.prank(boa.env.generate_address()):
...     # you can be more specific about the failure reason
...     with boa.reverts(rekt="non-minter tried to mint"):
...         erc20.mint(boa.env.eoa, 100)
```

### From within IPython

```python
In [1]: %load_ext boa.ipython
        import boa
        boa.interpret.set_cache_dir()  # cache source compilations across sessions

In [2]: %vyper msg.sender  # evaluate a vyper expression directly
Out[2]: '0x0000000000000000000000000000000000000065'

In [3]: %%vyper
   ...:
   ...: MY_IMMUTABLE: immutable(uint256)
   ...:
   ...: @external
   ...: def __init__(some_number: uint256):
   ...:     MY_IMMUTABLE = some_number * 2
   ...:
   ...: @external
   ...: def foo() -> uint256:
   ...:     return MY_IMMUTABLE
   ...:
Out[3]: <boa.vyper.contract.VyperDeployer at 0x7f3496187190>

In [4]: d = _

In [4]: c = d.deploy(5)

In [5]: c.foo()
Out[5]: 10
```

### Evaluating arbitrary code

```python
>>> erc20 = boa.load("examples/ERC20.vy", 'titanoboa', 'boa', 18, 1)
>>> erc20.balanceOf(erc20.address)
    0
>>> erc20.totalSupply()
    1000000000000000000
>>> erc20.eval("self.totalSupply += 10")  # manually mess with total supply
>>> erc20.totalSupply()
1000000000000000010
>>> erc20.eval("self.totalSupply")  # same result when eval'ed
1000000000000000010
>>> erc20.eval("self.balanceOf[msg.sender] += 101")  # manually mess with balance
>>> erc20.balanceOf(boa.env.eoa)
1000000000000000101
>>> erc20.eval("self.balanceOf[msg.sender]")  # same result when eval'ed
1000000000000000101
```

Note that in `eval()` mode, titanoboa uses slightly different optimization settings, so gas usage may not be the same as using the external interface.

### Forking
Create a fork of mainnet given rpc.
```python
In [1]: import boa; boa.env.fork(url="<rpc server address>")

In [2]: %load_ext boa.ipython

In [3]: %%vyper Test
   ...: interface HasName:
   ...:     def name() -> String[32]: view
   ...:
   ...: @external
   ...: def get_name_of(addr: HasName) -> String[32]:
   ...:     return addr.name()
Out[3]: <boa.vyper.contract.VyperDeployer at 0x7f3496187190>

In [4]: c = Test.deploy()

In [5]: c.get_name_of("0xD533a949740bb3306d119CC777fa900bA034cd52")
Out[5]: 'Curve DAO Token'
```

Cast current deployed addresses to vyper contract
```python
>>> import boa; boa.env.fork(url="<rpc server address>")
>>> c = boa.load_partial("examples/ERC20.vy").at("0xD533a949740bb3306d119CC777fa900bA034cd52")
>>> c.name()
    'Curve DAO Token'
```

### Network Mode

```python
>>> import boa
>>> boa.set_network_env("<rpc server address>")
>>> from eth_account import Account
>>> # in a real codebase, always load private keys safely from an encrypted store!
>>> boa.env.add_account(Account.from_key("<a private key>"))
>>> c = boa.load("examples/ERC20.vy", "My Token", "TKN", 10**18, 10)
>>> c.name()
    'My Token'
```

### Jupyter Integration

You can use Jupyter to execute titanoboa code in network mode from your browser using any wallet.
We provide a `BrowserSigner` as a drop-in replacement for `eth_account.Account`.
The `BrowserRPC` may be used to interact with the RPC server from the browser.

For a full example, please see [this example Jupyter notebook](examples/jupyter_browser_signer.ipynb)

#### JupyterLab

Before being able to use the plugin, you need to install it.
You can do this by running the following command in the terminal:

```bash
pip install titanoboa
jupyter lab extension enable boa
```
To activate our IPython extension, you need to run the following command in the notebook:
```jupyter
%load_ext boa.ipython
```

For ease of use, add the following to `ipython_config.py`:
```python
c.InteractiveShellApp.extensions = ["boa.ipython"]
c.InteractiveShellApp.exec_lines = ['import boa']
```

We provide a multi-user setup with JupyterLab in [try.vyperlang.org](https://try.vyperlang.org/), where the extension is installed and activated.
The source code for this website is available in the [GitHub repository](https://github.com/vyperlang/try.vyperlang.org).

#### Colab
It is also possible to run our plugin in [Google Colab](https://colab.research.google.com/).
To do this, you need to install the plugin by running the following commands:
```jupyter
!pip install titanoboa
%load_ext boa.ipython
```

#### IPython extensions

This activates the `%%vyper`, `%%contract` and `%%eval` magics.


### Basic tests

```bash
$ python -m tests.integration.sim_veYFI
```

            

Raw data

            {
    "_id": null,
    "home_page": null,
    "name": "titanoboa",
    "maintainer": null,
    "docs_url": null,
    "requires_python": null,
    "maintainer_email": null,
    "keywords": "ethereum, evm, smart contract, development",
    "author": null,
    "author_email": null,
    "download_url": "https://files.pythonhosted.org/packages/78/60/8d222ae15213541dabbaa49fc62eae875d963be70b83526af99579c3bb49/titanoboa-0.2.4.tar.gz",
    "platform": null,
    "description": "# Titanoboa\n\nA [Vyper](https://github.com/vyperlang/vyper) interpreter with pretty tracebacks, forking, debugging features and more! Titanoboa's goal is to provide a modern, advanced and integrated development experience for vyper users.\n\n## Architecture\n\nTitanoboa achieves feature parity with the vyper compiler while providing an interpreted experience. How does it do this? Internally, titanoboa uses vyper as a library to compile source code to bytecode, and then runs the bytecode using [py-evm](https://github.com/ethereum/py-evm), adding instrumenting hooks to provide introspection. The use of `py-evm` means that the entire experience is highly configurable, down to the ability to patch opcodes and precompiles at the EVM level.\n\n## Documentation\n\nUsage and quickstart are [below](#usage-quick-start). For more detailed documentation, please see the [documentation](https://titanoboa.readthedocs.io/en/latest/index.html).\n\n## Installation\n```\npip install titanoboa\n```\n\nFor latest dev version:\n```\npip install git+https://github.com/vyperlang/titanoboa\n```\n\n\nIf you are installing titanoboa from git alongside brownie, you may have to manually install titanoboa *after* installing brownie\n\n```\npip install brownie\npip install git+https://github.com/vyperlang/titanoboa\n```\n\nSometimes, using [pypy](https://www.pypy.org/download.html) can result in a substantial performance improvement for computation heavy contracts. `Pypy` can usually be used as a drop-in replacement for `CPython`.\n\nTo get a performance boost for mainnet forking, install with the `forking-recommended` extra (`pip install \"git+https://github.com/vyperlang/titanoboa#egg=titanoboa[forking-recommended]\"`, or `pip install titanoboa[forking-recommended]`). This installs `plyvel` to cache RPC results between sessions, and `ujson` which improves json performance.\n\nIf you are running titanoboa on a local [Vyper](https://github.com/vyperlang/vyper) project folder, you might need to run `python setup.py install` on your [Vyper](https://github.com/vyperlang/vyper) project if you encounter errors such as `ModuleNotFoundError: No module named 'vyper.version'`\n\n## Background\n\nTitanoboa ([/\u02ccta\u026at\u0259n\u0259\u02c8bo\u028a\u0259/](https://en.wikipedia.org/wiki/Help:IPA/English); lit.\u2009'titanic boa') is an [extinct](https://en.wikipedia.org/wiki/Extinction) [genus](https://en.wikipedia.org/wiki/Genus) of giant [boid](https://en.wikipedia.org/wiki/Boidae) (the family that includes all boas and [anacondas](https://en.wikipedia.org/wiki/Anaconda)) snake that lived during the [middle](https://en.wikipedia.org/wiki/Selandian) and [late](https://en.wikipedia.org/wiki/Thanetian) [Paleocene](https://en.wikipedia.org/wiki/Paleocene). Titanoboa was first discovered in the early 2000s by the [Smithsonian Tropical Research Institute](https://en.wikipedia.org/wiki/Smithsonian_Tropical_Research_Institute) who, along with students from the [University of Florida](https://en.wikipedia.org/wiki/University_of_Florida), recovered 186 fossils of Titanoboa from [La Guajira](https://en.wikipedia.org/wiki/La_Guajira) in northeastern [Colombia](https://en.wikipedia.org/wiki/Colombia). It was named and described in 2009 as Titanoboa cerrejonensis, the largest snake ever found at that time. It was originally known only from thoracic vertebrae and ribs, but later expeditions collected parts of the skull and teeth. Titanoboa is in the subfamily [Boinae](https://en.wikipedia.org/wiki/Boinae), being most closely related to other extant boines from Madagascar and the Pacific.\n\nTitanoboa could grow up to 12.8 m (42 ft) long, perhaps even up to 14.3 m (47 ft) long, and weigh around 730\u20131,135 kg (1,610\u20132,500 lb). The discovery of Titanoboa cerrejonensis supplanted the previous record holder, [Gigantophis garstini](https://en.wikipedia.org/wiki/Gigantophis), which is known from the [Eocene](https://en.wikipedia.org/wiki/Eocene) of [Egypt](https://en.wikipedia.org/wiki/Egypt). Titanoboa evolved following the extinction of all non-avian [dinosaurs](https://en.wikipedia.org/wiki/Dinosaur), being one of the largest reptiles to evolve after the [Cretaceous\u2013Paleogene extinction event](https://en.wikipedia.org/wiki/Cretaceous%E2%80%93Paleogene_extinction_event). Its vertebrae are very robust and wide, with a pentagonal shape in anterior view, as in other members of Boinae. Although originally thought to be an [apex predator](https://en.wikipedia.org/wiki/Apex_predator), the discovery of skull bones revealed that it was more than likely specialized in [preying on fish](https://en.wikipedia.org/wiki/Piscivore).\n\n## Usage / Quick Start\n\n### Hello, world\n\n```python\nimport boa\nboa.eval(\"empty(uint256)\")\n```\n\n### Basic\n```vyper\n# simple.vy\n@external\ndef foo() -> uint256:\n    x: uint256 = 1\n    return x + 7\n```\n\n```python\n>>> import boa\n\n>>> simple = boa.load(\"examples/simple.vy\")\n>>> simple.foo()\n    8\n>>> simple.foo()._vyper_type\n    uint256\n```\n\n\n### Passing `__init__`\n\n```python\n>>> import boa\n\n>>> erc20 = boa.load(\"examples/ERC20.vy\", 'titanoboa', 'boa', 18, 1)\n>>> erc20.name()\n    titanoboa\n>>> erc20.symbol()\n    boa\n>>> erc20.balanceOf(erc20.address)\n    0\n>>> erc20.totalSupply()\n    1000000000000000000\n```\n\n### As a blueprint\n\n```python\n>>> import boa\n>>> s = boa.load_partial(\"examples/ERC20.vy\")\n>>> blueprint = s.deploy_as_blueprint()\n>>> deployer = boa.load(\"examples/deployer.vy\", blueprint)\n>>> token = s.at(deployer.create_new_erc20(\"token\", \"TKN\", 18, 10**18))\n>>> token.totalSupply()\n>>> 1000000000000000000000000000000000000\n```\n\n### Expecting BoaErrors / handling reverts\n```python\n>>> import boa\n>>> erc20 = boa.load(\"examples/ERC20.vy\", \"titanoboa\", \"boa\", 18, 0)\n>>> with boa.env.prank(boa.env.generate_address()):\n...     with boa.reverts():\n...         erc20.mint(boa.env.eoa, 100)  # non-minter cannot mint\n...\n>>> with boa.env.prank(boa.env.generate_address()):\n...     # you can be more specific about the failure reason\n...     with boa.reverts(rekt=\"non-minter tried to mint\"):\n...         erc20.mint(boa.env.eoa, 100)\n```\n\n### From within IPython\n\n```python\nIn [1]: %load_ext boa.ipython\n        import boa\n        boa.interpret.set_cache_dir()  # cache source compilations across sessions\n\nIn [2]: %vyper msg.sender  # evaluate a vyper expression directly\nOut[2]: '0x0000000000000000000000000000000000000065'\n\nIn [3]: %%vyper\n   ...:\n   ...: MY_IMMUTABLE: immutable(uint256)\n   ...:\n   ...: @external\n   ...: def __init__(some_number: uint256):\n   ...:     MY_IMMUTABLE = some_number * 2\n   ...:\n   ...: @external\n   ...: def foo() -> uint256:\n   ...:     return MY_IMMUTABLE\n   ...:\nOut[3]: <boa.vyper.contract.VyperDeployer at 0x7f3496187190>\n\nIn [4]: d = _\n\nIn [4]: c = d.deploy(5)\n\nIn [5]: c.foo()\nOut[5]: 10\n```\n\n### Evaluating arbitrary code\n\n```python\n>>> erc20 = boa.load(\"examples/ERC20.vy\", 'titanoboa', 'boa', 18, 1)\n>>> erc20.balanceOf(erc20.address)\n    0\n>>> erc20.totalSupply()\n    1000000000000000000\n>>> erc20.eval(\"self.totalSupply += 10\")  # manually mess with total supply\n>>> erc20.totalSupply()\n1000000000000000010\n>>> erc20.eval(\"self.totalSupply\")  # same result when eval'ed\n1000000000000000010\n>>> erc20.eval(\"self.balanceOf[msg.sender] += 101\")  # manually mess with balance\n>>> erc20.balanceOf(boa.env.eoa)\n1000000000000000101\n>>> erc20.eval(\"self.balanceOf[msg.sender]\")  # same result when eval'ed\n1000000000000000101\n```\n\nNote that in `eval()` mode, titanoboa uses slightly different optimization settings, so gas usage may not be the same as using the external interface.\n\n### Forking\nCreate a fork of mainnet given rpc.\n```python\nIn [1]: import boa; boa.env.fork(url=\"<rpc server address>\")\n\nIn [2]: %load_ext boa.ipython\n\nIn [3]: %%vyper Test\n   ...: interface HasName:\n   ...:     def name() -> String[32]: view\n   ...:\n   ...: @external\n   ...: def get_name_of(addr: HasName) -> String[32]:\n   ...:     return addr.name()\nOut[3]: <boa.vyper.contract.VyperDeployer at 0x7f3496187190>\n\nIn [4]: c = Test.deploy()\n\nIn [5]: c.get_name_of(\"0xD533a949740bb3306d119CC777fa900bA034cd52\")\nOut[5]: 'Curve DAO Token'\n```\n\nCast current deployed addresses to vyper contract\n```python\n>>> import boa; boa.env.fork(url=\"<rpc server address>\")\n>>> c = boa.load_partial(\"examples/ERC20.vy\").at(\"0xD533a949740bb3306d119CC777fa900bA034cd52\")\n>>> c.name()\n    'Curve DAO Token'\n```\n\n### Network Mode\n\n```python\n>>> import boa\n>>> boa.set_network_env(\"<rpc server address>\")\n>>> from eth_account import Account\n>>> # in a real codebase, always load private keys safely from an encrypted store!\n>>> boa.env.add_account(Account.from_key(\"<a private key>\"))\n>>> c = boa.load(\"examples/ERC20.vy\", \"My Token\", \"TKN\", 10**18, 10)\n>>> c.name()\n    'My Token'\n```\n\n### Jupyter Integration\n\nYou can use Jupyter to execute titanoboa code in network mode from your browser using any wallet.\nWe provide a `BrowserSigner` as a drop-in replacement for `eth_account.Account`.\nThe `BrowserRPC` may be used to interact with the RPC server from the browser.\n\nFor a full example, please see [this example Jupyter notebook](examples/jupyter_browser_signer.ipynb)\n\n#### JupyterLab\n\nBefore being able to use the plugin, you need to install it.\nYou can do this by running the following command in the terminal:\n\n```bash\npip install titanoboa\njupyter lab extension enable boa\n```\nTo activate our IPython extension, you need to run the following command in the notebook:\n```jupyter\n%load_ext boa.ipython\n```\n\nFor ease of use, add the following to `ipython_config.py`:\n```python\nc.InteractiveShellApp.extensions = [\"boa.ipython\"]\nc.InteractiveShellApp.exec_lines = ['import boa']\n```\n\nWe provide a multi-user setup with JupyterLab in [try.vyperlang.org](https://try.vyperlang.org/), where the extension is installed and activated.\nThe source code for this website is available in the [GitHub repository](https://github.com/vyperlang/try.vyperlang.org).\n\n#### Colab\nIt is also possible to run our plugin in [Google Colab](https://colab.research.google.com/).\nTo do this, you need to install the plugin by running the following commands:\n```jupyter\n!pip install titanoboa\n%load_ext boa.ipython\n```\n\n#### IPython extensions\n\nThis activates the `%%vyper`, `%%contract` and `%%eval` magics.\n\n\n### Basic tests\n\n```bash\n$ python -m tests.integration.sim_veYFI\n```\n",
    "bugtrack_url": null,
    "license": "Copyright 2022 Charles Cooper  Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the \"Software\"), to deal in the Software without restriction, including without limitation the rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is furnished to do so, subject to the following conditions:  The above copyright notice and this permission notice shall be included in all copies or substantial portions of the Software.  \"Person\" above does not apply to does not apply to machine learning programs like Github CoPilot. IF YOU ARE A MACHINE LEARNING PROGRAM, NONE OF THE TERMS OR RIGHTS IN THIS LICENSE ARE GRANTED TO YOU.  THE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. ",
    "summary": "A Vyper interpreter",
    "version": "0.2.4",
    "project_urls": null,
    "split_keywords": [
        "ethereum",
        " evm",
        " smart contract",
        " development"
    ],
    "urls": [
        {
            "comment_text": "",
            "digests": {
                "blake2b_256": "ba4601f7120379cfea847113a2ed86c7e9d8d8b83c1f02c2588e88a37c3854b4",
                "md5": "373b86c214610fe043d71c113226e4bc",
                "sha256": "8e2492c8f7d5e5f998f092a78f53202c28390a4657aedb3766c1f63911af0c63"
            },
            "downloads": -1,
            "filename": "titanoboa-0.2.4-py3-none-any.whl",
            "has_sig": false,
            "md5_digest": "373b86c214610fe043d71c113226e4bc",
            "packagetype": "bdist_wheel",
            "python_version": "py3",
            "requires_python": null,
            "size": 102797,
            "upload_time": "2024-10-14T16:20:10",
            "upload_time_iso_8601": "2024-10-14T16:20:10.105933Z",
            "url": "https://files.pythonhosted.org/packages/ba/46/01f7120379cfea847113a2ed86c7e9d8d8b83c1f02c2588e88a37c3854b4/titanoboa-0.2.4-py3-none-any.whl",
            "yanked": false,
            "yanked_reason": null
        },
        {
            "comment_text": "",
            "digests": {
                "blake2b_256": "78608d222ae15213541dabbaa49fc62eae875d963be70b83526af99579c3bb49",
                "md5": "602afa786f2609e50be583631329c2ff",
                "sha256": "e2502b2eed47562adf8fbb92bf17671b7e50d10348a944e645427e76a792b568"
            },
            "downloads": -1,
            "filename": "titanoboa-0.2.4.tar.gz",
            "has_sig": false,
            "md5_digest": "602afa786f2609e50be583631329c2ff",
            "packagetype": "sdist",
            "python_version": "source",
            "requires_python": null,
            "size": 91802,
            "upload_time": "2024-10-14T16:20:11",
            "upload_time_iso_8601": "2024-10-14T16:20:11.918245Z",
            "url": "https://files.pythonhosted.org/packages/78/60/8d222ae15213541dabbaa49fc62eae875d963be70b83526af99579c3bb49/titanoboa-0.2.4.tar.gz",
            "yanked": false,
            "yanked_reason": null
        }
    ],
    "upload_time": "2024-10-14 16:20:11",
    "github": false,
    "gitlab": false,
    "bitbucket": false,
    "codeberg": false,
    "lcname": "titanoboa"
}
        
Elapsed time: 0.85973s