# Quick Start
Plugins for the [StarkNet Ethereum L2 networks](https://starkware.co/starknet/).
## Dependencies
- [python3](https://www.python.org/downloads) version 3.8 or greater, python3-dev
## Installation
### via `pip`
You can install the latest release via [`pip`](https://pypi.org/project/pip/):
```bash
pip install ape-starknet
```
### via `setuptools`
You can clone the repository and use [`setuptools`](https://github.com/pypa/setuptools) for the most up-to-date version:
```bash
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.
Out of the box, `ape-starknet` comes with development accounts.
Access them like this:
```python
from ape import accounts
container = accounts.containers["starknet"]
owner = container.test_accounts[0]
```
See the section below about [Testing](#Testing) to learn more about test accounts.
However, when using a live network, you will have to import or create an account first.
#### Importing an Account
To import an account, use the `import` command:
```bash
ape starknet accounts import <ALIAS> \
--network testnet,testnet2 \
--address 0x6b7111AA4111e5B2229c3332B66696888164440A773333143333B383333a183 \
--class-hash "0x025ec026985a3bf9d0cc1fe17326b245dfdc3ff89b8fde106542a3ea56c5a918"
--salt 123
```
The command above is using a network value of `testnet,testnet2`, meaning both Starknet's Goerli testnet and Goerli testnet2 networks.
You can run the import command more than once to add more networks at a later time.
To add all networks at once, you can also use a `--network` value of `starknet`.
If the account is already added, you can omit the `--address` flag and use the calculated one instead.
If you know the salt the account used to calculate its address, you can provide that with the `--salt` flag.
This will allow future deployments to use the same address.
Importing accounts is complex.
A common use-case is to import your Argent-X wallet.
To do this, you can use the following command:
```bash
ape starknet accounts import <ArgentX-Alias> \
--network starknet \
--address 0x6b7111AA4111e5B2229c3332B66696888164440A773333143333B383333a183 \
--class-hash argentx
```
And then export your Argent-X private key from the app and paste it in the CLI prompt.
Now, you can use your argent-x account to fund and create other accounts!
#### Creating an Account
To create a new account, you can use the `create` command:
```bash
ape starknet accounts create <NEW-ALIAS>
```
By default, new accounts use the Open Zeppelin account contract implementation.
However, if you want to change the class, use the `--class-hash` option:
```bash
CLASS_HASH="0x1a7820094feaf82d53f53f214b81292d717e7bb9a92bb2488092cd306f3993f"
ape starknet accounts create <NEW-ALIAS> --class-hash "${CLASS_HASH}"
```
**NOTE**: You may also need to change the constructor calldata using the `--constructor-calldata` flag when using a different account contract type.
The `create` command will first generate the public and private key combination and store a local keyfile for the account.
However, it does not deploy the account.
The reason it does not deploy is that the account needs funding to pay for its deployment and there are several ways to achieve this.
See [this section](https://starknet.io/docs/hello_starknet/account_setup.html#transferring-goerli-eth-to-the-account) of the Starknet official guides for more information.
#### Deploying an Account
To deploy the new account, use the `deploy` command:
```bash
ape starknet accounts deploy <NEW-ALIAS> --network testnet
```
This only works if the account has been funded.
For convenience purposes, if you have another account with funds, you can use that account to fund the deployment of this one using the `--funder` option:
```bash
ape starknet accounts deploy <NEW-ALIAS> --network testnet --funder <EXISTING-FUNDED-ALIAS>
```
**NOTE**: You cannot use an Ethereum account to send funds to a Starknet account directly.
You must use the [StarkNet L2 bridge](https://goerli.starkgate.starknet.io/) to transfer existing Goerli L1 ETH to and from the L2 account.
#### Listing Accounts
See your accounts and all of their deployment addresses:
```bash
ape starknet accounts list
```
shows:
```bash
Alias - <ALIAS>
Public key - 0x123444444d716666dd88882bE2e99991555DE1c7
Class hash - 0x25ec026985a3bf9d0cc1fe17326b245dfdc3ff89b8fde106542a3ea56c5a918
Contract address (testnet) - 0x6b7111AA4111e5B2229c3332B66696888164440A773333143333B383333a183
Contract address (mainnet) - 0x7873113A4111e5B2229c3332B66696388163440A373333143333B3833332122
```
#### Deleting an Account
You can also delete accounts:
```bash
ape starknet accounts delete <ALIAS> --network testnet,testnet2
```
The `delete` command differs based on its values of `--network` and `--address`:
- To delete all deployments on a given network, use the `--network` option without `--address`.
- To delete all deployments matching an address (regardless of network), use the `--address` option without `--network`.
- To delete a deployment on a network with a particular address, use both `--network` and `--address`.
- Exclude both options to delete the whole account.
Note you can also specify multiple networks, the same as `import`.
#### Auto-Sign Message
While generally bad practice, sometimes it is necessary to have unlocked keyfile accounts auto-signing messages.
An example would be during testnet automated deployments.
To achieve this, use the `set_autosign()` method available on the keyfile accounts:
```python
import keyring
from ape import accounts
# Use keyring package to store secrets
password = keyring.get_password("starknet-testnet-automations", "ci-shared-account")
testnet_account = accounts.load("starknet-testnet-account")
testnet_account.set_autosign(True, passphrase=password)
# Won't prompt for signing or unlocking
testnet_account.sign_message([123])
```
### 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](https://www.cairo-lang.org/docs/hello_starknet/deploying_from_contracts.html).
To declare a contract using `ape-starknet`, do the following (in a script or console):
```python
from ape import accounts, project
account = accounts.load("<MY_STARK_ACCOUNT>")
declaration = account.declare(project.MyContract)
print(declaration.class_hash)
```
Then, you can use the `deploy` method to deploy the contracts.
**NOTE**: The `deploy` method in `ape-starknet` makes an invoke-function call against the Starknet public UDC contract.
Learn more about UDC contracts [here](https://community.starknet.io/t/universal-deployer-contract-proposal/1864).
```python
from ape import accounts, project
# This only works if `project.MyContract` was declared previously.
# The class hash is not necessary as an argument. Ape will look it up.
account = accounts.load("<MY_STARK_ACCOUNT>")
account.deploy(project.MyContact)
```
You can also deploy contracts by doing:
```python
from ape import accounts, project
account = accounts.load("<MY_STARK_ACCOUNT>")
my_contract = project.MyContract.deploy(sender=account)
```
Alternatively, you can use the class hash in a `deploy()` system call in a local factory contract.
Let's say for example I have the following Cairo factory contract:
```cairo
from starkware.cairo.common.alloc import alloc
from starkware.starknet.common.syscalls import deploy
from starkware.cairo.common.cairo_builtins import HashBuiltin
@storage_var
func class_hash() -> (class_hash: felt) {
}
@storage_var
func salt() -> (value: felt) {
}
@constructor
func constructor{syscall_ptr: felt*, pedersen_ptr: HashBuiltin*, range_check_ptr}(cls_hash: felt) {
class_hash.write(value=cls_hash);
return ();
}
@external
func deploy_my_contract{syscall_ptr: felt*, pedersen_ptr: HashBuiltin*, range_check_ptr}() {
let (cls_hash) = class_hash.read();
let (current_salt) = salt.read();
let (ctor_calldata) = alloc();
let (contract_addr) = deploy(
class_hash=cls_hash,
contract_address_salt=current_salt,
constructor_calldata_size=0,
constructor_calldata=ctor_calldata,
deploy_from_zero=FALSE,
);
salt.write(value=current_salt + 1);
return ();
}
```
This contract accepts a class hash of a declared contract deploys it.
The following example shows how to use this factory class to deploy other contracts:
```python
from ape import Contract, accounts, networks, project
account = accounts.load("<MY_STARK_ACCOUNT>")
declaration = account.declare(project.MyContract)
# NOTE: Assuming you have a contract named 'ContractFactory'.
factory = project.ContractFactory.deploy(declaration.class_hash, sender=account)
call_result = factory.deploy_my_contract()
contract_address = networks.starknet.decode_address(call_result)
contract = Contract(contract_address, contract_type=project.MyContract.contract_type)
```
### 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:
```python
from ape import project
contract = project.MyContract.deploy(sender=account)
# 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:
```python
receipt = contract.my_mutable_method(123)
result = receipt.return_value
```
Include a sender to delegate the transaction to an account contract:
```python
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:
```python
receipt = contract.store_my_list(3, [1, 2, 3])
```
### Testing
#### Accounts
You can use `starknet-devnet` accounts in your tests.
```python
import pytest
import ape
@pytest.fixture
def devnet_accounts():
return ape.accounts.containers["starknet"].test_accounts
@pytest.fixture
def owner(devnet_accounts):
return devnet_accounts[0]
```
Additionally, any accounts deployed in the local network are **not** saved to disk and are ephemeral.
```python
import pytest
import ape
@pytest.fixture(scope="session")
def ephemeral_account():
accounts = ape.accounts.containers["starknet"]
accounts.deploy_account("ALIAS")
# This account only exists in the devnet and is not a key-file account.
return accounts.load("ALIAS")
```
### 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:
```python
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:
```python
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.
### 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:
```python
from ape import project
my_contract = project.MyContract.deploy(token="MY_TOKEN")
```
Via an Environment Variable:
```bash
export ALPHA_MAINNET_WL_DEPLOY_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.
Raw data
{
"_id": null,
"home_page": "https://github.com/ApeWorX/ape-starknet",
"name": "ape-starknet",
"maintainer": "",
"docs_url": null,
"requires_python": ">=3.8,<3.11",
"maintainer_email": "",
"keywords": "ethereum starknet",
"author": "ApeWorX Ltd.",
"author_email": "admin@apeworx.io",
"download_url": "https://files.pythonhosted.org/packages/00/95/f50144e6f943ae53ba699283ac73e1d0cef6f5c2ce22d7a4b63780f349ff/ape-starknet-0.6.0.tar.gz",
"platform": null,
"description": "# Quick Start\n\nPlugins for the [StarkNet Ethereum L2 networks](https://starkware.co/starknet/).\n\n## Dependencies\n\n- [python3](https://www.python.org/downloads) version 3.8 or greater, python3-dev\n\n## Installation\n\n### via `pip`\n\nYou can install the latest release via [`pip`](https://pypi.org/project/pip/):\n\n```bash\npip install ape-starknet\n```\n\n### via `setuptools`\n\nYou can clone the repository and use [`setuptools`](https://github.com/pypa/setuptools) for the most up-to-date version:\n\n```bash\ngit clone https://github.com/ApeWorX/ape-starknet.git\ncd ape-starknet\npython3 setup.py install\n```\n\n## Quick Usage\n\n### Account Management\n\nAccounts are used to execute transactions and sign call data.\nAccounts are smart contracts in Starknet.\n\nOut of the box, `ape-starknet` comes with development accounts.\nAccess them like this:\n\n```python\nfrom ape import accounts\n\ncontainer = accounts.containers[\"starknet\"]\nowner = container.test_accounts[0]\n```\n\nSee the section below about [Testing](#Testing) to learn more about test accounts.\n\nHowever, when using a live network, you will have to import or create an account first.\n\n#### Importing an Account\n\nTo import an account, use the `import` command:\n\n```bash\nape starknet accounts import <ALIAS> \\\n --network testnet,testnet2 \\\n --address 0x6b7111AA4111e5B2229c3332B66696888164440A773333143333B383333a183 \\\n --class-hash \"0x025ec026985a3bf9d0cc1fe17326b245dfdc3ff89b8fde106542a3ea56c5a918\"\n --salt 123\n```\n\nThe command above is using a network value of `testnet,testnet2`, meaning both Starknet's Goerli testnet and Goerli testnet2 networks.\nYou can run the import command more than once to add more networks at a later time.\nTo add all networks at once, you can also use a `--network` value of `starknet`.\n\nIf the account is already added, you can omit the `--address` flag and use the calculated one instead.\nIf you know the salt the account used to calculate its address, you can provide that with the `--salt` flag.\nThis will allow future deployments to use the same address.\n\nImporting accounts is complex.\nA common use-case is to import your Argent-X wallet.\nTo do this, you can use the following command:\n\n```bash\nape starknet accounts import <ArgentX-Alias> \\\n --network starknet \\\n --address 0x6b7111AA4111e5B2229c3332B66696888164440A773333143333B383333a183 \\\n --class-hash argentx\n```\n\nAnd then export your Argent-X private key from the app and paste it in the CLI prompt.\nNow, you can use your argent-x account to fund and create other accounts!\n\n#### Creating an Account\n\nTo create a new account, you can use the `create` command:\n\n```bash\nape starknet accounts create <NEW-ALIAS>\n```\n\nBy default, new accounts use the Open Zeppelin account contract implementation.\nHowever, if you want to change the class, use the `--class-hash` option:\n\n```bash\nCLASS_HASH=\"0x1a7820094feaf82d53f53f214b81292d717e7bb9a92bb2488092cd306f3993f\"\nape starknet accounts create <NEW-ALIAS> --class-hash \"${CLASS_HASH}\"\n```\n\n**NOTE**: You may also need to change the constructor calldata using the `--constructor-calldata` flag when using a different account contract type.\n\nThe `create` command will first generate the public and private key combination and store a local keyfile for the account.\nHowever, it does not deploy the account.\nThe reason it does not deploy is that the account needs funding to pay for its deployment and there are several ways to achieve this.\nSee [this section](https://starknet.io/docs/hello_starknet/account_setup.html#transferring-goerli-eth-to-the-account) of the Starknet official guides for more information.\n\n#### Deploying an Account\n\nTo deploy the new account, use the `deploy` command:\n\n```bash\nape starknet accounts deploy <NEW-ALIAS> --network testnet\n```\n\nThis only works if the account has been funded.\nFor convenience purposes, if you have another account with funds, you can use that account to fund the deployment of this one using the `--funder` option:\n\n```bash\nape starknet accounts deploy <NEW-ALIAS> --network testnet --funder <EXISTING-FUNDED-ALIAS>\n```\n\n**NOTE**: You cannot use an Ethereum account to send funds to a Starknet account directly.\nYou must use the [StarkNet L2 bridge](https://goerli.starkgate.starknet.io/) to transfer existing Goerli L1 ETH to and from the L2 account.\n\n#### Listing Accounts\n\nSee your accounts and all of their deployment addresses:\n\n```bash\nape starknet accounts list\n```\n\nshows:\n\n```bash\nAlias - <ALIAS>\nPublic key - 0x123444444d716666dd88882bE2e99991555DE1c7\nClass hash - 0x25ec026985a3bf9d0cc1fe17326b245dfdc3ff89b8fde106542a3ea56c5a918\nContract address (testnet) - 0x6b7111AA4111e5B2229c3332B66696888164440A773333143333B383333a183\nContract address (mainnet) - 0x7873113A4111e5B2229c3332B66696388163440A373333143333B3833332122\n```\n\n#### Deleting an Account\n\nYou can also delete accounts:\n\n```bash\nape starknet accounts delete <ALIAS> --network testnet,testnet2\n```\n\nThe `delete` command differs based on its values of `--network` and `--address`:\n\n- To delete all deployments on a given network, use the `--network` option without `--address`.\n- To delete all deployments matching an address (regardless of network), use the `--address` option without `--network`.\n- To delete a deployment on a network with a particular address, use both `--network` and `--address`.\n- Exclude both options to delete the whole account.\n\nNote you can also specify multiple networks, the same as `import`.\n\n#### Auto-Sign Message\n\nWhile generally bad practice, sometimes it is necessary to have unlocked keyfile accounts auto-signing messages.\nAn example would be during testnet automated deployments.\nTo achieve this, use the `set_autosign()` method available on the keyfile accounts:\n\n```python\nimport keyring\nfrom ape import accounts\n\n# Use keyring package to store secrets\npassword = keyring.get_password(\"starknet-testnet-automations\", \"ci-shared-account\")\ntestnet_account = accounts.load(\"starknet-testnet-account\")\ntestnet_account.set_autosign(True, passphrase=password)\n\n# Won't prompt for signing or unlocking\ntestnet_account.sign_message([123])\n```\n\n### Declare and Deploy Contracts\n\nIn Starknet, you can declare contract types by publishing them to the chain.\nThis allows other contracts to create instances of them using the [deploy system call](https://www.cairo-lang.org/docs/hello_starknet/deploying_from_contracts.html).\n\nTo declare a contract using `ape-starknet`, do the following (in a script or console):\n\n```python\nfrom ape import accounts, project\n\naccount = accounts.load(\"<MY_STARK_ACCOUNT>\")\ndeclaration = account.declare(project.MyContract)\nprint(declaration.class_hash)\n```\n\nThen, you can use the `deploy` method to deploy the contracts.\n**NOTE**: The `deploy` method in `ape-starknet` makes an invoke-function call against the Starknet public UDC contract.\nLearn more about UDC contracts [here](https://community.starknet.io/t/universal-deployer-contract-proposal/1864).\n\n```python\nfrom ape import accounts, project\n\n# This only works if `project.MyContract` was declared previously.\n# The class hash is not necessary as an argument. Ape will look it up.\naccount = accounts.load(\"<MY_STARK_ACCOUNT>\")\naccount.deploy(project.MyContact)\n```\n\nYou can also deploy contracts by doing:\n\n```python\nfrom ape import accounts, project\n\naccount = accounts.load(\"<MY_STARK_ACCOUNT>\")\nmy_contract = project.MyContract.deploy(sender=account)\n```\n\nAlternatively, you can use the class hash in a `deploy()` system call in a local factory contract.\nLet's say for example I have the following Cairo factory contract:\n\n```cairo\nfrom starkware.cairo.common.alloc import alloc\nfrom starkware.starknet.common.syscalls import deploy\nfrom starkware.cairo.common.cairo_builtins import HashBuiltin\n\n@storage_var\nfunc class_hash() -> (class_hash: felt) {\n}\n\n@storage_var\nfunc salt() -> (value: felt) {\n}\n\n@constructor\nfunc constructor{syscall_ptr: felt*, pedersen_ptr: HashBuiltin*, range_check_ptr}(cls_hash: felt) {\n class_hash.write(value=cls_hash);\n return ();\n}\n\n@external\nfunc deploy_my_contract{syscall_ptr: felt*, pedersen_ptr: HashBuiltin*, range_check_ptr}() {\n let (cls_hash) = class_hash.read();\n let (current_salt) = salt.read();\n let (ctor_calldata) = alloc();\n let (contract_addr) = deploy(\n class_hash=cls_hash,\n contract_address_salt=current_salt,\n constructor_calldata_size=0,\n constructor_calldata=ctor_calldata,\n deploy_from_zero=FALSE,\n );\n salt.write(value=current_salt + 1);\n return ();\n}\n```\n\nThis contract accepts a class hash of a declared contract deploys it.\nThe following example shows how to use this factory class to deploy other contracts:\n\n```python\nfrom ape import Contract, accounts, networks, project\n\naccount = accounts.load(\"<MY_STARK_ACCOUNT>\")\ndeclaration = account.declare(project.MyContract)\n\n# NOTE: Assuming you have a contract named 'ContractFactory'.\nfactory = project.ContractFactory.deploy(declaration.class_hash, sender=account)\n\ncall_result = factory.deploy_my_contract()\ncontract_address = networks.starknet.decode_address(call_result)\ncontract = Contract(contract_address, contract_type=project.MyContract.contract_type)\n```\n\n### Contract Interaction\n\nAfter you have deployed your contracts, you can begin interacting with them.\n`deploy` methods return a contract instance from which you can call methods on:\n\n```python\nfrom ape import project\n\ncontract = project.MyContract.deploy(sender=account)\n\n# Interact with deployed contract\nreceipt = contract.my_mutable_method(123)\nvalue = contract.my_view_method()\n```\n\nYou can access the return data from a mutable method's receipt:\n\n```python\nreceipt = contract.my_mutable_method(123)\nresult = receipt.return_value\n```\n\nInclude a sender to delegate the transaction to an account contract:\n\n```python\nfrom ape import accounts\n\naccount = accounts.load(\"my_account\")\nreceipt = contract.my_mutable_method(123, sender=account)\n```\n\n**NOTE**: Currently, to pass in arrays as arguments, you have to also include the array size beforehand:\n\n```python\nreceipt = contract.store_my_list(3, [1, 2, 3])\n```\n\n### Testing\n\n#### Accounts\n\nYou can use `starknet-devnet` accounts in your tests.\n\n```python\nimport pytest\nimport ape\n\n\n@pytest.fixture\ndef devnet_accounts():\n return ape.accounts.containers[\"starknet\"].test_accounts\n\n\n@pytest.fixture\ndef owner(devnet_accounts):\n return devnet_accounts[0]\n```\n\nAdditionally, any accounts deployed in the local network are **not** saved to disk and are ephemeral.\n\n```python\nimport pytest\nimport ape\n\n\n@pytest.fixture(scope=\"session\")\ndef ephemeral_account():\n accounts = ape.accounts.containers[\"starknet\"]\n accounts.deploy_account(\"ALIAS\")\n\n # This account only exists in the devnet and is not a key-file account.\n return accounts.load(\"ALIAS\")\n```\n\n### Paying Fees\n\nStarknet fees are currently paid in ETH, which is an ERC-20 on the Starknet chain.\nTo check your account balance (in ETH), use the `balance` property on the account:\n\n```python\nfrom ape import accounts\n\nacct = accounts.load(\"Alias\")\nprint(acct.balance)\n```\n\nIf your account has a positive balance, you can begin paying fees!\n\nTo pay fees, you can either manually set the `max_fee` kwarg on an invoke-transaction:\n\n```python\nreceipt = contract.my_mutable_method(123, max_fee=2900000000000)\n```\n\n**NOTE**: By not setting the `max_fee`, it will automatically get set to the value returned from the provider `estimate_gas_cost()` call.\nYou do **not** need to call `estimate_gas_cost()` explicitly.\n\n### Mainnet Alpha Whitelist Deployment Token\n\nCurrently, to deploy to Alpha-Mainnet, your contract needs to be whitelisted.\nYou can provide your WL token in a variety of ways.\n\nVia Python code:\n\n```python\nfrom ape import project\n\nmy_contract = project.MyContract.deploy(token=\"MY_TOKEN\")\n```\n\nVia an Environment Variable:\n\n```bash\nexport ALPHA_MAINNET_WL_DEPLOY_TOKEN=\"MY_TOKEN\"\n```\n\n## Development\n\nThis project is in development and should be considered a beta.\nThings might not be in their final state and breaking changes may occur.\nComments, questions, criticisms and pull requests are welcomed.\n\n\n",
"bugtrack_url": null,
"license": "Apache-2.0",
"summary": "ape-starknet: An ape plugin for the StarkNet networks",
"version": "0.6.0",
"split_keywords": [
"ethereum",
"starknet"
],
"urls": [
{
"comment_text": "",
"digests": {
"blake2b_256": "64c0a7b02c74ebc00514d5a77a283e2373175ea69dec31c341349a76c8c5cedc",
"md5": "9675eb997d41d179d874debe07b9171e",
"sha256": "f644eb38b82f4f7d45249e1fef5211d52f9c3aecf9c2eda1ee8a97f30358721d"
},
"downloads": -1,
"filename": "ape_starknet-0.6.0-py3-none-any.whl",
"has_sig": false,
"md5_digest": "9675eb997d41d179d874debe07b9171e",
"packagetype": "bdist_wheel",
"python_version": "py3",
"requires_python": ">=3.8,<3.11",
"size": 53607,
"upload_time": "2023-02-01T20:37:56",
"upload_time_iso_8601": "2023-02-01T20:37:56.865227Z",
"url": "https://files.pythonhosted.org/packages/64/c0/a7b02c74ebc00514d5a77a283e2373175ea69dec31c341349a76c8c5cedc/ape_starknet-0.6.0-py3-none-any.whl",
"yanked": false,
"yanked_reason": null
},
{
"comment_text": "",
"digests": {
"blake2b_256": "0095f50144e6f943ae53ba699283ac73e1d0cef6f5c2ce22d7a4b63780f349ff",
"md5": "716b7684d444d81aadf0f1c3bf7365bb",
"sha256": "91e10d82fd5acba46f864ff828545fdec5f7df6118abe8779b8f493211a66e29"
},
"downloads": -1,
"filename": "ape-starknet-0.6.0.tar.gz",
"has_sig": false,
"md5_digest": "716b7684d444d81aadf0f1c3bf7365bb",
"packagetype": "sdist",
"python_version": "source",
"requires_python": ">=3.8,<3.11",
"size": 120433,
"upload_time": "2023-02-01T20:37:59",
"upload_time_iso_8601": "2023-02-01T20:37:59.071123Z",
"url": "https://files.pythonhosted.org/packages/00/95/f50144e6f943ae53ba699283ac73e1d0cef6f5c2ce22d7a4b63780f349ff/ape-starknet-0.6.0.tar.gz",
"yanked": false,
"yanked_reason": null
}
],
"upload_time": "2023-02-01 20:37:59",
"github": true,
"gitlab": false,
"bitbucket": false,
"github_user": "ApeWorX",
"github_project": "ape-starknet",
"travis_ci": false,
"coveralls": false,
"github_actions": true,
"lcname": "ape-starknet"
}