Package: puya
PuyaPy - Python to TEAL compiler[!WARNING]
PuyaPy is currently in alpha / developer preview. It is not recommended for production usage yet.PuyaPy is an optimising TEAL compiler that allows you to write code to execute on the Algorand
Virtual Machine (AVM) with Python syntax.Project background and guiding principles.PuyaPy supports a statically-typed subset of valid Python syntax. Importantly, that subset has
identical semantics when comparing Python behaviour and behaviour of the executed TEAL.
For example,foo = spam() or eggs()will only executeeggs()ifbool(spam())isFalse.InstallationThe minimum supported Python version for running PuyaPy itself is 3.12.You can install the developer preview of PuyaPy from PyPI into your project virtualenv:pipinstallpuyaIf you're using poetry for dependency and virutalenv management, you can add it that way withpoetry add puya.Or if you just want to play with some examples, you can clone the repo and have a poke around.gitclonehttps://github.com/algorandfoundation/puya.gitcdpuya
poetryinstall
poetryshellNote that with this method you'll need to activate the virtual environment created by poetry
before using the puyapy command in each new shell that you open - you can do this by runningpoetry shellin thepuyadirectory.Compiler usageTo check that you can run thepuyapycommand successfully after that, you can run the help command:puyapy -hTo compile a contract or contracts, just supply the path(s) - either to the .py files themselves,
or the containing directories. In the case of containing directories, any contracts discovered
therein will be compiled, allowing you to compile multiple contracts at once. You can also supply
more than one path at a time to the compiler.e.g.puyapy my_project/orpuyapy my_project/contract.pywill work to compile a single contract.Language fundamentals[!NOTE]
A more comprehensive guide is coming soon!ContractsA smart contract is defined within a single class. You can extend other contracts (through inheritance),
and also define standalone functions and reference them. This also works across different Python
packages - in other words, you can have a Python library with common functions and re-use that
library across multiple projects!All contracts must inherit from the base classpuyapy.Contract- either directly or indirectly,
which can include inheriting frompuyapy.ARC4Contract. For a non-ARC4 contract, a contract class
must implement anapproval_programand aclear_state_programmethod. For ARC4 contracts, these
methods will be implemented for you, although you can optionally provide aclear_state_program(the default implementation just always approves).As an example, this is a valid contract that always approves:importpuyapyclassContract(puyapy.Contract):defapproval_program(self)->bool:returnTruedefclear_state_program(self)->bool:returnTrueThe return value of these methods can be either aboolthat indicates whether the transaction
should approve or not, or apuyapy.UInt64value, whereUInt64(0)indicates that the transaction
should be rejected and any other value indicates that it should be approved.And here is a valid ARC4 contract:importpuyapyclassABIContract(puyapy.ARC4Contract):"""This contract can be created, but otherwise does nothing"""passPrimitive typesThe primitive types of the AVM,uint64andbytes[]are represented bypuyapy.UInt64andpuyapy.Bytesrespectively.puyapy.BigUIntis also available for AVM supported wide-math
(up to 512 bits).Note that Python builtin types such asintcannot be used as variables, for semantic compatibility
reasons - however you can define module level constants of this type, and integer literals are
permitted in expressions.For example:frompuyapyimportUInt64,subroutineSCALE=100000SCALED_PI=314159@subroutinedefcircle_area(radius:UInt64)->UInt64:scaled_result=SCALED_PI*radius**2result=scaled_result//SCALEreturnresult@subroutinedefcircle_area_100()->UInt64:returncircle_area(UInt64(100))ExamplesThere are many examples in this repo, here are some of the more useful ones that showcase what
is possible.hello world (arc4)votingAMMauctionnon-ABI calculatorlocal storageThe compiled output is available under theout/directory alongside these, e.g. the approval
TEAL forvotingis available atexamples/voting/out/voting.approval.teal.