Experimental Vyper interpreter
Project description
Titanoboa
An experimental Vyper interpreter
Installation
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
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 project folder, you might need to run python setup.py install
on your Vyper project if you encounter errors such as ModuleNotFoundError: No module named 'vyper.version'
Background
Titanoboa (/tiˌtɑːnoʊˈboʊə/) is an extinct genus of very large snakes that lived in what is now La Guajira in northeastern Colombia. They could grow up to 12.8 m (42 ft), perhaps even 14.3 m (47 ft) long and reach a weight of 1,135 kg (2,500 lb). This snake lived during the Middle to Late Paleocene epoch, around 60 to 58 million years ago following the extinction of the dinosaurs. Although originally thought to be an apex predator, the discovery of skull bones revealed that it was more than likely specialized in preying on fish. The only known species is Titanoboa cerrejonensis, the largest snake ever discovered,[1] which supplanted the previous record holder, Gigantophis garstini.[2]
Usage
Hello, world
import boa
boa.eval("empty(uint256)")
Basic
# simple.vy
@external
def foo() -> uint256:
x: uint256 = 1
return x + 7
>>> import boa
>>> simple = boa.load("examples/simple.vy")
>>> simple.foo()
8
>>> simple.foo()._vyper_type
uint256
Passing __init__
>>> 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
>>> 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
>>> 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
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.contract.VyperDeployer at 0x7f3496187190>
In [4]: d = _
In [4]: c = d.deploy(5)
In [5]: c.foo()
Out[5]: 10
Evaluating arbitrary code
>>> 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.
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.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
>>> import boa; boa.env.fork(url="<rpc server address>")
>>> c = boa.load_partial("examples/ERC20.vy").at("0xD533a949740bb3306d119CC777fa900bA034cd52")
>>> c.name()
'Curve DAO Token'
basic tests:
$ python -m tests.sim_veYFI
Project details
Release history Release notifications | RSS feed
Download files
Download the file for your platform. If you're not sure which to choose, learn more about installing packages.
Source Distribution
Built Distribution
File details
Details for the file titanoboa-0.1.6.tar.gz
.
File metadata
- Download URL: titanoboa-0.1.6.tar.gz
- Upload date:
- Size: 26.8 kB
- Tags: Source
- Uploaded using Trusted Publishing? No
- Uploaded via: twine/4.0.1 CPython/3.10.6
File hashes
Algorithm | Hash digest | |
---|---|---|
SHA256 | 124fee3fc998c11a588fb1c22ac51d765c44b304aa5d9adbd1f59b4a0bb2123e |
|
MD5 | 54ca9ae4817087a4ab2a78f1bb6832c8 |
|
BLAKE2b-256 | 224e4755b1afb4f3cd3e601e2ccd16b806f59589aa8cd8ad85c204071ff304e9 |
File details
Details for the file titanoboa-0.1.6-py3-none-any.whl
.
File metadata
- Download URL: titanoboa-0.1.6-py3-none-any.whl
- Upload date:
- Size: 27.8 kB
- Tags: Python 3
- Uploaded using Trusted Publishing? No
- Uploaded via: twine/4.0.1 CPython/3.10.6
File hashes
Algorithm | Hash digest | |
---|---|---|
SHA256 | fd401a6ca7ce06da79ad52c5094c6ae1688dfbc667fb95fbda291b11f789147c |
|
MD5 | 38b5bfde2e22ec8b15c20b78005fb004 |
|
BLAKE2b-256 | 8755c8de9321f186b88990defd97d010eaf71255bdef4b1959e48e448c8ae333 |