Skip to main content

ape-starknet: An ape plugin for the StarkNet networks

Project description

Ape StarkNet

Plugins for the StarkNet Ethereum L2 networks.

Dependencies

  • python3 version 3.7 or greater, python3-dev

Installation

via pip

You can install the latest release via pip:

pip install ape-starknet

via setuptools

You can clone the repository and use setuptools for the most up-to-date version:

git clone https://github.com/ApeWorX/ape-starknet.git
cd ape-starknet
python3 setup.py install

Quick Usage

Account Management

Accounts are used to execute transactions and sign call data. Accounts are smart contracts in Starknet.

To deploy a new account:

ape starknet accounts create <ALIAS> --network starknet:testnet

You can deploy the same account to multiple networks.

ape starknet accounts create <ALIAS> --network starknet:mainnet

See your accounts and all of their deployment addresses:

ape starknet accounts list

shows:

Alias                      - <ALIAS>
Public key                 - 0x123444444d716666dd88882bE2e99991555DE1c7
Contract address (testnet) - 0x6b7111AA4111e5B2229c3332B66696888164440A773333143333B383333a183
Contract address (mainnet) - 0x7873113A4111e5B2229c3332B66696388163440A373333143333B3833332122

Import an existing account:

ape starknet accounts import <ALIAS> --address 0x6b7111AA4111e5B2229c3332B66696888164440A773333143333B383333a183 --network starknet:testnet

You can also import an account by key-file, including a key-file you exported from your Argent-X browser wallet:

ape starknet accounts import <ALIAS> --keyfile path/to/keyfile.json

You can also delete accounts:

ape starknet accounts delete <ALIAS> --network starknet:testnet

NOTE: You don't have to specify the network if your account is only deployed to a single network.

Declare and Deploy Contracts

In Starknet, you can declare contract types by publishing them to the chain. This allows other contracts to create instances of them using the deploy system call.

To declare a contract using ape-starknet, do the following (in a script or console):

from ape import project, networks

provider = networks.active_provider
declaration = provider.declare(project.MyContract)
print(declaration.class_hash)

Then, you can use the class hash in a deploy system call in a factory contract:

from starkware.cairo.common.alloc import alloc
from starkware.starknet.common.syscalls import deploy
from starkware.cairo.common.cairo_builtins import HashBuiltin

@external
func deploy_my_contract{
    syscall_ptr : felt*,
    pedersen_ptr : HashBuiltin*,
    range_check_ptr,
}():
    let (current_salt) = salt.read()
    let (class_hash) = ownable_class_hash.read()
    let (calldata_ptr) = alloc()
    let (contract_address) = deploy(
        class_hash=class_hash,
        contract_address_salt=current_salt,
        constructor_calldata_size=0,
        constructor_calldata=calldata_ptr,
    )
    salt.write(value=current_salt + 1)

After deploying the factory contract, you can use it to create contract instances:

from ape import Contract, project

declaration = project.provider.declare(project.MyContract)
factory = project.ContractFactory.deploy(declaration.class_hash)
call_result = factory.deploy_my_contract()
contract_address = project.starknet.decode_address(call_result)
contract = Contract(contract_address, contract_address)

You can also deploy() from the declaration receipt (which uses the legacy deploy transaction):

from ape import accounts, project

declaration = project.provider.declare(project.MyContract)
receipt = declaration.deploy(1, 2, sender=accounts.load("MyAccount"))

Otherwise, you can use the legacy deploy system which works the same as Ethereum in ape except no sender is needed:

from ape import project

contract = project.MyContract.deploy()

Contract Interaction

After you have deployed your contracts, you can begin interacting with them. deploy methods return a contract instance from which you can call methods on:

from ape import project

contract = project.MyContract.deploy()

# Interact with deployed contract
receipt = contract.my_mutable_method(123)
value = contract.my_view_method()

You can access the return data from a mutable method's receipt:

receipt = contract.my_mutable_method(123)
result = receipt.return_value

Include a sender to delegate the transaction to an account contract:

from ape import accounts

account = accounts.load("my_account")
receipt = contract.my_mutable_method(123, sender=account)

NOTE: Currently, to pass in arrays as arguments, you have to also include the array size beforehand:

receipt = contract.store_my_list(3, [1, 2, 3])

Mainnet Alpha Whitelist Deployment Token

You can deploy contracts by doing:

from ape import project

my_contract = project.MyContract.deploy()

Paying Fees

Starknet fees are currently paid in ETH, which is an ERC-20 on the Starknet chain. To check your account balance (in ETH), use the balance property on the account:

from ape import accounts

acct = accounts.load("Alias")
print(acct.balance)

If your account has a positive balance, you can begin paying fees!

To pay fees, you can either manually set the max_fee kwarg on an invoke-transaction:

receipt = contract.my_mutable_method(123, max_fee=2900000000000)

NOTE: By not setting the max_fee, it will automatically get set to the value returned from the provider estimate_gas_cost() call. You do not need to call estimate_gas_cost() explicitly. Currently, for local networks, the estimated gas is always 0 as it is not yet required.

Mainnet Alpha Whitelist Deployment Token

Currently, to deploy to Alpha-Mainnet, your contract needs to be whitelisted. You can provide your WL token in a variety of ways.

Via Python code:

from ape import project

my_contract = project.MyContract.deploy(token="MY_TOKEN")

Via an Environment Variable:

export ALPHA_MAINNET_WL_DEPLOY_TOKEN="MY_TOKEN"

Or, via the --token flag when deploying an account:

ape starknet accounts create MY_ACCOUNT --token MY_TOKEN

Development

This project is in development and should be considered a beta. Things might not be in their final state and breaking changes may occur. Comments, questions, criticisms and pull requests are welcomed.

License

This project is licensed under the Apache 2.0.

Project details


Download files

Download the file for your platform. If you're not sure which to choose, learn more about installing packages.

Source Distribution

ape-starknet-0.3.0a0.tar.gz (48.7 kB view details)

Uploaded Source

Built Distribution

ape_starknet-0.3.0a0-py3-none-any.whl (33.5 kB view details)

Uploaded Python 3

File details

Details for the file ape-starknet-0.3.0a0.tar.gz.

File metadata

  • Download URL: ape-starknet-0.3.0a0.tar.gz
  • Upload date:
  • Size: 48.7 kB
  • Tags: Source
  • Uploaded using Trusted Publishing? No
  • Uploaded via: twine/3.8.0 pkginfo/1.8.3 readme-renderer/35.0 requests/2.28.0 requests-toolbelt/0.9.1 urllib3/1.26.9 tqdm/4.64.0 importlib-metadata/4.11.4 keyring/23.6.0 rfc3986/2.0.0 colorama/0.4.5 CPython/3.9.13

File hashes

Hashes for ape-starknet-0.3.0a0.tar.gz
Algorithm Hash digest
SHA256 4539a786534e9c5f9f36232bf3f51faa97ba73717ccd02e96fe9e8a6a1df3a23
MD5 63b34bcbe4286294e28c3cf5b20bdf6f
BLAKE2b-256 bad5a487b0fe24505a301e2995a6fd4e7ffa3a5c952b0772ac68f11a163f34e8

See more details on using hashes here.

File details

Details for the file ape_starknet-0.3.0a0-py3-none-any.whl.

File metadata

  • Download URL: ape_starknet-0.3.0a0-py3-none-any.whl
  • Upload date:
  • Size: 33.5 kB
  • Tags: Python 3
  • Uploaded using Trusted Publishing? No
  • Uploaded via: twine/3.8.0 pkginfo/1.8.3 readme-renderer/35.0 requests/2.28.0 requests-toolbelt/0.9.1 urllib3/1.26.9 tqdm/4.64.0 importlib-metadata/4.11.4 keyring/23.6.0 rfc3986/2.0.0 colorama/0.4.5 CPython/3.9.13

File hashes

Hashes for ape_starknet-0.3.0a0-py3-none-any.whl
Algorithm Hash digest
SHA256 ff180f69ffd3a5ce737fbb4c8991ab76b31c8f72ca8b99965723406dd824b229
MD5 f7cb6a632a89f642767e6a8eba09168b
BLAKE2b-256 4c1774a697c6dc54d209ecae0eae671c2a5a82bee3f200c1192c3c19867adadc

See more details on using hashes here.

Supported by

AWS AWS Cloud computing and Security Sponsor Datadog Datadog Monitoring Fastly Fastly CDN Google Google Download Analytics Microsoft Microsoft PSF Sponsor Pingdom Pingdom Monitoring Sentry Sentry Error logging StatusPage StatusPage Status page