symbol-shoestring


Namesymbol-shoestring JSON
Version 0.1.2 PyPI version JSON
download
home_pagehttps://github.com/symbol/product/tree/main/tools/shoestring
SummarySymbol Shoestring Deployment Tool
upload_time2024-04-06 19:23:12
maintainerSymbol Contributors
docs_urlNone
authorSymbol Contributors
requires_python<4.0,>=3.9
licenseMIT
keywords symbol shoestring deployment node
VCS
bugtrack_url
requirements No requirements were recorded.
Travis-CI No Travis.
coveralls test coverage No coveralls.
            # shoestring

# Security

> [!IMPORTANT]
> CLI commands will generate unencrypted PEM file by default. The file specified via the argument  `--ca-key-path` is expected to contain the **main** private key. This file itself is NOT needed to run the node and can be removed after the node is properly configured.
>
> Additionally, the `pemtool` command can produce a encrypted PEM file, which is supported by all CLI commands.
>
> In order to limit security risk, it is recommended to:
> 1. Make sure to back up `ca.key.pem`
> 2. Remove `ca.key.pem` after node setup
> 3. Use an encrypted PEM file if **main** account is sufficient valuable.

> [!WARNING]
> `shoestring.wizard` does not currently support encrypted PEM files because there is no password input currently.

## PEM files

To import existing private key and optionally encrypt it, we recommend using `pemtool` command, described below in [pemtool section](#pemtool).

OpenSSL can be used to inspect the contents of a PEM file.

To print the public key only:
```sh
openssl pkey -in PEM_FILE.pem -noout -text_pub
```

To print both the private key and public key:
```sh
openssl pkey -in PEM_FILE.pem -noout -text
```

OpenSSL can also be used to generate completely new key:
```sh
openssl genpkey -algorithm ed25519 -out ca.key.pem
```

To generate new encrypted key:
```sh
openssl genpkey -algorithm ed25519 -out ca.key.pem -pass OPTIONS-FOLLOW
```

For details on openssl `-pass` switch we refer to [openssl passphrase documentation](https://www.openssl.org/docs/manmaster/man1/openssl-passphrase-options.html).

# Tips

If you are setting up a new node from scratch, it is recommended to use `init` and `setup`.

If you are setting up a new node but have existing harvesting and/or voting keys, it is recommended to update the imports section of the shoestring configuration file downloaded by `init` before running `setup`.

If you need to renew voting key files, it is recommended to use `renew-voting-keys`. This command will unregister all expired voting keys and register a new set of voting keys starting at first epoch without a registered voting key.

# CLI Commands

In commands that require `--package` switch, the list of currently supported network aliases are:
 * mainnet
 * sai (current testnet)

As documented below, alternatively full path to package zip file can be provided using `file:///filename` or `http(s)://`.

## Setup Commands

### init

Extracts a template shoestring configuration file from a package that the user can then customize.

```
init [--package PACKAGE] config

  config             path to shoestring configuration file
  --package PACKAGE  Network configuration package. Possible values: (name | file:///filename | http(s)://uri) (default: mainnet)
```

### min-cosignatures-count

Automatically detects the minimum cosignatures required for an account and optionally updates the shoestring configuration file.

```
min-cosignatures-count --config CONFIG --ca-key-path CA_KEY_PATH [--update]

  --config CONFIG           path to shoestring configuration file
  --ca-key-path CA_KEY_PATH path to main private key PEM file
  --update                  update the shoestring configuration file
```

### import-bootstrap

Imports settings from a symbol-bootstap installation.


```
import-bootstrap --config CONFIG --bootstrap BOOTSTRAP

  --config CONFIG       path to shoestring configuration file
  --bootstrap BOOTSTRAP path to bootstrap target directory
```

### pemtool

Generates a main private key PEM file that can be used by shoestring.

```
pemtool --output OUTPUT [--input INPUT] [--ask-pass] [--force]

  --output OUTPUT  output PEM key file
  --input INPUT    input private key file (optional)
  --ask-pass       encrypt PEM with a password (password prompt will be shown)
  --force          overwrite output file if it already exists
```

### setup

Sets up a Symbol node from scratch

```
setup \
    --config CONFIG \
    [--package PACKAGE] \
    [--directory DIRECTORY] \
    [--overrides OVERRIDES] \
    [--metadata METADATA] \
    [--security {default,paranoid,insecure}] \
    --ca-key-path CA_KEY_PATH

  --config CONFIG           path to shoestring configuration file
  --package PACKAGE         Network configuration package. Possible values: (name | file:///filename | http(s)://uri) (default: mainnet)
  --directory DIRECTORY     installation directory (default: $HOME)
  --overrides OVERRIDES     path to custom user settings
  --metadata METADATA       custom node metadata (this is only valid for API roles)
  --security                security mode (default: default)
  --ca-key-path CA_KEY_PATH path to main private key PEM file
```

Please note that only security mode "default" is supported at this time.

This command will generate a transaction that will need to be sent to the network using `announce-transaction` to update the network state.

## Operational Commands

### signer

Signs a transaction that can then be announced to the network

```
signer --config CONFIG --ca-key-path CA_KEY_PATH [--save] filename

  filename                  transaction binary payload
  --config CONFIG           path to shoestring configuration file
  --ca-key-path CA_KEY_PATH path to main private key PEM file
  --save                    save signed payload into same file as input
```

### announce-transaction

Announces a transaction to the network.

```
announce-transaction --config CONFIG --transaction TRANSACTION

  --config CONFIG           path to shoestring configuration file
  --transaction TRANSACTION file containing serialized transaction to send
```

### health

Checks the health of the local Symbol node.


```
health [-h] --config CONFIG [--directory DIRECTORY]

  --config CONFIG       path to shoestring configuration file
  --directory DIRECTORY installation directory (default: $HOME)
```

## Upgrade Commands

### upgrade

Upgrades a node to the latest client version.

```
upgrade \
    --config CONFIG \
    [--package PACKAGE] \
    [--directory DIRECTORY] \
    [--overrides OVERRIDES] \
    [--metadata METADATA]

  --config CONFIG           path to shoestring configuration file
  --package PACKAGE         Network configuration package. Possible values: (name | file:///filename | http(s)://uri) (default: mainnet)
  --directory DIRECTORY     installation directory (default: $HOME)
  --overrides OVERRIDES     path to custom user settings
  --metadata METADATA       custom node metadata (this is only valid for API roles)
```

### renew-certificates

Renews peer certificates.

```
renew-certificates --config CONFIG [--directory DIRECTORY] --ca-key-path CA_KEY_PATH [--renew-ca]

  --config CONFIG           path to shoestring configuration file
  --directory DIRECTORY     installation directory (default: $HOME)
  --ca-key-path CA_KEY_PATH path to main private key PEM file
  --renew-ca                renews CA certificate too
```

When `--renew-ca` is set, both CA and node certificates will be regenerated. Otherwise, only node certificate will be.

### renew-voting-keys

Renews voting keys.

```
renew-voting-keys --config CONFIG [--directory DIRECTORY]

  --config CONFIG           path to shoestring configuration file
  --directory DIRECTORY     installation directory (default: $HOME)
```

This command will generate a transaction that will need to be sent to the network using `announce-transaction` to update the network state.

### reset-data

Resets blockchain state to allow a resync from scratch.

```
reset-data --config CONFIG [--directory DIRECTORY] [--purge-harvesters]

  --config CONFIG           path to shoestring configuration file
  --directory DIRECTORY     installation directory (default: $HOME)
  --purge-harvesters        purge harvesters.dat file
```

When `--purge-harvesters` is set, delegates discovered using old keys will be discarded.


## Files

### Shoestring Configuration INI

INI file used by shoestring to customize a Symbol node deployment.
It is composed of five sections: `network`, `images`, `services`, `transaction`, `imports`, `node`.

#### network

Describes properties of network that deployed node should connect with.
These should match values in `config-network.properties` Symbol configuration file.
If `init` command is used, these values shouldn't be modified

```
name                  Network name
identifier            Network numeric identifier
epochAdjustment       Network epoch adjustment
generationHashSeed    Network generation hash seed
```

#### images

Describes Symbol docker images to use.
If `init` command is used, these values shouldn't be modified
```
client  Catapult client docker image
rest    REST docker image
```

#### services

Describes network services to use during deployment.
If `init` command is used, these values shouldn't be modified

```
nodewatch  URL to nodewatch service.
```

#### transactions

Describes properties of generated transactions.
If `init` command is used, most of these values _generally_ shouldn't be modified.
`min-cosignatures-count` command can be used to automatically update `minCosignaturesCount` setting.

General properties:
```
feeMultiplier             Min fee multiplier of generated transactions
timeoutHours              Timeout of generated transactions (in hours)
minCosignaturesCount      Minimum number of cosignatures generated transactions will require
```

When `signer` command is signing an aggregate bonded transaction, it will additionally generate a hash lock transaction
using the following properties:
```
hashLockDuration          Hash lock duration in blocks
currencyMosaicId          Network currency mosaid id
lockedFundsPerAggregate   Locked funds per aggregate
```

#### imports

Describes keys to import.
These need to be manually set if there are harvesting and/or voting keys that need to be imported.

```
harvester Path to a config-harvesting.properties Symbol configuration file containing harvesting keys to import
voter     Path to a directory containing private_key_tree*.day files to import
```

#### node

Describes settings to customize a node.

`features` supports the following:
* `PEER` - Peer support
* `API` - REST support
* `HARVESTER` - Node will be configured to harvest and accept delegated harvesters
* `VOTER` - Node will be configured to vote

`caPassword` supports all available openssl passphrase options: https://www.openssl.org/docs/man3.0/man1/openssl-passphrase-options.html.

```
features       One or more node features to deploy (| delimited)
userId         User id of node used to set process and file permissons
groupId        Group id of node used to set process and file permissons
caPassword     Password of CA (main) PEM private key file (if applicable)
apiHttps       Set to enable HTTPS REST (only applicable when features include API)

caCommonName   Common name of generated CA certificates
nodeCommonName Common name of generated Node certificates
```

### Overrides

INI file that is used to customize advanced Symbol settings.

Sections should have the format `[<config-short-name>.<config-section>]`.
Section contents will then be applied to the appropriate Symbol configuration file.

For example, in order to set two custom settings:
1. `connectTimeout` - located in the `config-node.properties` file in section `node`
1. `maxUnlockedAccounts` - located in the `config-harvesting.properties` file in section `harvesting`

The following snippet will suffice:

```ini
[node.node]

connectTimeout = 5s

[harvesting.harvesting]

maxUnlockedAccounts = 2
```

Notice that these custom settings are applied *BEFORE* shoestring updates the Symbol configuration files.
In cases of conflicts, the shoestring changes will take precedence.

### Node Metadata

JSON file that is ingested and used to replace the contents of `nodeMetadata` in rest.json.
This data is then accessible via the `node/metadata` REST endpoint.
This file is optional and only used for deployments including API role.

# Running

## Prerequisites:

```sh
apt-get install python3 python3-pip openssl
```

## Installing and running prepared package:

```sh
python3 -m pip install symbol-shoestring
python3 -m shoestring --help
```

## (Alternative) Running from github clone:

```sh
cd symbol-product-directory/tools/shoestring

python3 -m pip install -r requirements.txt
PYTHONPATH=. python3 -m shoestring --help
```

            

Raw data

            {
    "_id": null,
    "home_page": "https://github.com/symbol/product/tree/main/tools/shoestring",
    "name": "symbol-shoestring",
    "maintainer": "Symbol Contributors",
    "docs_url": null,
    "requires_python": "<4.0,>=3.9",
    "maintainer_email": "contributors@symbol.dev",
    "keywords": "symbol, shoestring, deployment, node",
    "author": "Symbol Contributors",
    "author_email": "contributors@symbol.dev",
    "download_url": "https://files.pythonhosted.org/packages/a2/50/316c30efdd756f88028e508414a4d4b75a392217d5d0e5a5aa1458fc1f4f/symbol_shoestring-0.1.2.tar.gz",
    "platform": null,
    "description": "# shoestring\n\n# Security\n\n> [!IMPORTANT]\n> CLI commands will generate unencrypted PEM file by default. The file specified via the argument  `--ca-key-path` is expected to contain the **main** private key. This file itself is NOT needed to run the node and can be removed after the node is properly configured.\n>\n> Additionally, the `pemtool` command can produce a encrypted PEM file, which is supported by all CLI commands.\n>\n> In order to limit security risk, it is recommended to:\n> 1. Make sure to back up `ca.key.pem`\n> 2. Remove `ca.key.pem` after node setup\n> 3. Use an encrypted PEM file if **main** account is sufficient valuable.\n\n> [!WARNING]\n> `shoestring.wizard` does not currently support encrypted PEM files because there is no password input currently.\n\n## PEM files\n\nTo import existing private key and optionally encrypt it, we recommend using `pemtool` command, described below in [pemtool section](#pemtool).\n\nOpenSSL can be used to inspect the contents of a PEM file.\n\nTo print the public key only:\n```sh\nopenssl pkey -in PEM_FILE.pem -noout -text_pub\n```\n\nTo print both the private key and public key:\n```sh\nopenssl pkey -in PEM_FILE.pem -noout -text\n```\n\nOpenSSL can also be used to generate completely new key:\n```sh\nopenssl genpkey -algorithm ed25519 -out ca.key.pem\n```\n\nTo generate new encrypted key:\n```sh\nopenssl genpkey -algorithm ed25519 -out ca.key.pem -pass OPTIONS-FOLLOW\n```\n\nFor details on openssl `-pass` switch we refer to [openssl passphrase documentation](https://www.openssl.org/docs/manmaster/man1/openssl-passphrase-options.html).\n\n# Tips\n\nIf you are setting up a new node from scratch, it is recommended to use `init` and `setup`.\n\nIf you are setting up a new node but have existing harvesting and/or voting keys, it is recommended to update the imports section of the shoestring configuration file downloaded by `init` before running `setup`.\n\nIf you need to renew voting key files, it is recommended to use `renew-voting-keys`. This command will unregister all expired voting keys and register a new set of voting keys starting at first epoch without a registered voting key.\n\n# CLI Commands\n\nIn commands that require `--package` switch, the list of currently supported network aliases are:\n * mainnet\n * sai (current testnet)\n\nAs documented below, alternatively full path to package zip file can be provided using `file:///filename` or `http(s)://`.\n\n## Setup Commands\n\n### init\n\nExtracts a template shoestring configuration file from a package that the user can then customize.\n\n```\ninit [--package PACKAGE] config\n\n  config             path to shoestring configuration file\n  --package PACKAGE  Network configuration package. Possible values: (name | file:///filename | http(s)://uri) (default: mainnet)\n```\n\n### min-cosignatures-count\n\nAutomatically detects the minimum cosignatures required for an account and optionally updates the shoestring configuration file.\n\n```\nmin-cosignatures-count --config CONFIG --ca-key-path CA_KEY_PATH [--update]\n\n  --config CONFIG           path to shoestring configuration file\n  --ca-key-path CA_KEY_PATH path to main private key PEM file\n  --update                  update the shoestring configuration file\n```\n\n### import-bootstrap\n\nImports settings from a symbol-bootstap installation.\n\n\n```\nimport-bootstrap --config CONFIG --bootstrap BOOTSTRAP\n\n  --config CONFIG       path to shoestring configuration file\n  --bootstrap BOOTSTRAP path to bootstrap target directory\n```\n\n### pemtool\n\nGenerates a main private key PEM file that can be used by shoestring.\n\n```\npemtool --output OUTPUT [--input INPUT] [--ask-pass] [--force]\n\n  --output OUTPUT  output PEM key file\n  --input INPUT    input private key file (optional)\n  --ask-pass       encrypt PEM with a password (password prompt will be shown)\n  --force          overwrite output file if it already exists\n```\n\n### setup\n\nSets up a Symbol node from scratch\n\n```\nsetup \\\n    --config CONFIG \\\n    [--package PACKAGE] \\\n    [--directory DIRECTORY] \\\n    [--overrides OVERRIDES] \\\n    [--metadata METADATA] \\\n    [--security {default,paranoid,insecure}] \\\n    --ca-key-path CA_KEY_PATH\n\n  --config CONFIG           path to shoestring configuration file\n  --package PACKAGE         Network configuration package. Possible values: (name | file:///filename | http(s)://uri) (default: mainnet)\n  --directory DIRECTORY     installation directory (default: $HOME)\n  --overrides OVERRIDES     path to custom user settings\n  --metadata METADATA       custom node metadata (this is only valid for API roles)\n  --security                security mode (default: default)\n  --ca-key-path CA_KEY_PATH path to main private key PEM file\n```\n\nPlease note that only security mode \"default\" is supported at this time.\n\nThis command will generate a transaction that will need to be sent to the network using `announce-transaction` to update the network state.\n\n## Operational Commands\n\n### signer\n\nSigns a transaction that can then be announced to the network\n\n```\nsigner --config CONFIG --ca-key-path CA_KEY_PATH [--save] filename\n\n  filename                  transaction binary payload\n  --config CONFIG           path to shoestring configuration file\n  --ca-key-path CA_KEY_PATH path to main private key PEM file\n  --save                    save signed payload into same file as input\n```\n\n### announce-transaction\n\nAnnounces a transaction to the network.\n\n```\nannounce-transaction --config CONFIG --transaction TRANSACTION\n\n  --config CONFIG           path to shoestring configuration file\n  --transaction TRANSACTION file containing serialized transaction to send\n```\n\n### health\n\nChecks the health of the local Symbol node.\n\n\n```\nhealth [-h] --config CONFIG [--directory DIRECTORY]\n\n  --config CONFIG       path to shoestring configuration file\n  --directory DIRECTORY installation directory (default: $HOME)\n```\n\n## Upgrade Commands\n\n### upgrade\n\nUpgrades a node to the latest client version.\n\n```\nupgrade \\\n    --config CONFIG \\\n    [--package PACKAGE] \\\n    [--directory DIRECTORY] \\\n    [--overrides OVERRIDES] \\\n    [--metadata METADATA]\n\n  --config CONFIG           path to shoestring configuration file\n  --package PACKAGE         Network configuration package. Possible values: (name | file:///filename | http(s)://uri) (default: mainnet)\n  --directory DIRECTORY     installation directory (default: $HOME)\n  --overrides OVERRIDES     path to custom user settings\n  --metadata METADATA       custom node metadata (this is only valid for API roles)\n```\n\n### renew-certificates\n\nRenews peer certificates.\n\n```\nrenew-certificates --config CONFIG [--directory DIRECTORY] --ca-key-path CA_KEY_PATH [--renew-ca]\n\n  --config CONFIG           path to shoestring configuration file\n  --directory DIRECTORY     installation directory (default: $HOME)\n  --ca-key-path CA_KEY_PATH path to main private key PEM file\n  --renew-ca                renews CA certificate too\n```\n\nWhen `--renew-ca` is set, both CA and node certificates will be regenerated. Otherwise, only node certificate will be.\n\n### renew-voting-keys\n\nRenews voting keys.\n\n```\nrenew-voting-keys --config CONFIG [--directory DIRECTORY]\n\n  --config CONFIG           path to shoestring configuration file\n  --directory DIRECTORY     installation directory (default: $HOME)\n```\n\nThis command will generate a transaction that will need to be sent to the network using `announce-transaction` to update the network state.\n\n### reset-data\n\nResets blockchain state to allow a resync from scratch.\n\n```\nreset-data --config CONFIG [--directory DIRECTORY] [--purge-harvesters]\n\n  --config CONFIG           path to shoestring configuration file\n  --directory DIRECTORY     installation directory (default: $HOME)\n  --purge-harvesters        purge harvesters.dat file\n```\n\nWhen `--purge-harvesters` is set, delegates discovered using old keys will be discarded.\n\n\n## Files\n\n### Shoestring Configuration INI\n\nINI file used by shoestring to customize a Symbol node deployment.\nIt is composed of five sections: `network`, `images`, `services`, `transaction`, `imports`, `node`.\n\n#### network\n\nDescribes properties of network that deployed node should connect with.\nThese should match values in `config-network.properties` Symbol configuration file.\nIf `init` command is used, these values shouldn't be modified\n\n```\nname                  Network name\nidentifier            Network numeric identifier\nepochAdjustment       Network epoch adjustment\ngenerationHashSeed    Network generation hash seed\n```\n\n#### images\n\nDescribes Symbol docker images to use.\nIf `init` command is used, these values shouldn't be modified\n```\nclient  Catapult client docker image\nrest    REST docker image\n```\n\n#### services\n\nDescribes network services to use during deployment.\nIf `init` command is used, these values shouldn't be modified\n\n```\nnodewatch  URL to nodewatch service.\n```\n\n#### transactions\n\nDescribes properties of generated transactions.\nIf `init` command is used, most of these values _generally_ shouldn't be modified.\n`min-cosignatures-count` command can be used to automatically update `minCosignaturesCount` setting.\n\nGeneral properties:\n```\nfeeMultiplier             Min fee multiplier of generated transactions\ntimeoutHours              Timeout of generated transactions (in hours)\nminCosignaturesCount      Minimum number of cosignatures generated transactions will require\n```\n\nWhen `signer` command is signing an aggregate bonded transaction, it will additionally generate a hash lock transaction\nusing the following properties:\n```\nhashLockDuration          Hash lock duration in blocks\ncurrencyMosaicId          Network currency mosaid id\nlockedFundsPerAggregate   Locked funds per aggregate\n```\n\n#### imports\n\nDescribes keys to import.\nThese need to be manually set if there are harvesting and/or voting keys that need to be imported.\n\n```\nharvester Path to a config-harvesting.properties Symbol configuration file containing harvesting keys to import\nvoter     Path to a directory containing private_key_tree*.day files to import\n```\n\n#### node\n\nDescribes settings to customize a node.\n\n`features` supports the following:\n* `PEER` - Peer support\n* `API` - REST support\n* `HARVESTER` - Node will be configured to harvest and accept delegated harvesters\n* `VOTER` - Node will be configured to vote\n\n`caPassword` supports all available openssl passphrase options: https://www.openssl.org/docs/man3.0/man1/openssl-passphrase-options.html.\n\n```\nfeatures       One or more node features to deploy (| delimited)\nuserId         User id of node used to set process and file permissons\ngroupId        Group id of node used to set process and file permissons\ncaPassword     Password of CA (main) PEM private key file (if applicable)\napiHttps       Set to enable HTTPS REST (only applicable when features include API)\n\ncaCommonName   Common name of generated CA certificates\nnodeCommonName Common name of generated Node certificates\n```\n\n### Overrides\n\nINI file that is used to customize advanced Symbol settings.\n\nSections should have the format `[<config-short-name>.<config-section>]`.\nSection contents will then be applied to the appropriate Symbol configuration file.\n\nFor example, in order to set two custom settings:\n1. `connectTimeout` - located in the `config-node.properties` file in section `node`\n1. `maxUnlockedAccounts` - located in the `config-harvesting.properties` file in section `harvesting`\n\nThe following snippet will suffice:\n\n```ini\n[node.node]\n\nconnectTimeout = 5s\n\n[harvesting.harvesting]\n\nmaxUnlockedAccounts = 2\n```\n\nNotice that these custom settings are applied *BEFORE* shoestring updates the Symbol configuration files.\nIn cases of conflicts, the shoestring changes will take precedence.\n\n### Node Metadata\n\nJSON file that is ingested and used to replace the contents of `nodeMetadata` in rest.json.\nThis data is then accessible via the `node/metadata` REST endpoint.\nThis file is optional and only used for deployments including API role.\n\n# Running\n\n## Prerequisites:\n\n```sh\napt-get install python3 python3-pip openssl\n```\n\n## Installing and running prepared package:\n\n```sh\npython3 -m pip install symbol-shoestring\npython3 -m shoestring --help\n```\n\n## (Alternative) Running from github clone:\n\n```sh\ncd symbol-product-directory/tools/shoestring\n\npython3 -m pip install -r requirements.txt\nPYTHONPATH=. python3 -m shoestring --help\n```\n",
    "bugtrack_url": null,
    "license": "MIT",
    "summary": "Symbol Shoestring Deployment Tool",
    "version": "0.1.2",
    "project_urls": {
        "Homepage": "https://github.com/symbol/product/tree/main/tools/shoestring",
        "Repository": "https://github.com/symbol/product/tree/main/tools/shoestring"
    },
    "split_keywords": [
        "symbol",
        " shoestring",
        " deployment",
        " node"
    ],
    "urls": [
        {
            "comment_text": "",
            "digests": {
                "blake2b_256": "a630fcb279e199aff346d70af173154f689ec234be614703a3fe00c10f5c2f7c",
                "md5": "05c587cb5c58f61a00c159d2c8fc33be",
                "sha256": "323d049934f3e1995a0d30fb26ac142f21ec8d24eb58ee3aa4b944cc7870cbfd"
            },
            "downloads": -1,
            "filename": "symbol_shoestring-0.1.2-py3-none-any.whl",
            "has_sig": false,
            "md5_digest": "05c587cb5c58f61a00c159d2c8fc33be",
            "packagetype": "bdist_wheel",
            "python_version": "py3",
            "requires_python": "<4.0,>=3.9",
            "size": 91208,
            "upload_time": "2024-04-06T19:23:11",
            "upload_time_iso_8601": "2024-04-06T19:23:11.048006Z",
            "url": "https://files.pythonhosted.org/packages/a6/30/fcb279e199aff346d70af173154f689ec234be614703a3fe00c10f5c2f7c/symbol_shoestring-0.1.2-py3-none-any.whl",
            "yanked": false,
            "yanked_reason": null
        },
        {
            "comment_text": "",
            "digests": {
                "blake2b_256": "a250316c30efdd756f88028e508414a4d4b75a392217d5d0e5a5aa1458fc1f4f",
                "md5": "f11d1d453091a87fea022382ebefee41",
                "sha256": "89a8de35c558e0f0bc374a8471012e1f7421ef927bb57b2f99466187e8e7fed8"
            },
            "downloads": -1,
            "filename": "symbol_shoestring-0.1.2.tar.gz",
            "has_sig": false,
            "md5_digest": "f11d1d453091a87fea022382ebefee41",
            "packagetype": "sdist",
            "python_version": "source",
            "requires_python": "<4.0,>=3.9",
            "size": 60480,
            "upload_time": "2024-04-06T19:23:12",
            "upload_time_iso_8601": "2024-04-06T19:23:12.766342Z",
            "url": "https://files.pythonhosted.org/packages/a2/50/316c30efdd756f88028e508414a4d4b75a392217d5d0e5a5aa1458fc1f4f/symbol_shoestring-0.1.2.tar.gz",
            "yanked": false,
            "yanked_reason": null
        }
    ],
    "upload_time": "2024-04-06 19:23:12",
    "github": true,
    "gitlab": false,
    "bitbucket": false,
    "codeberg": false,
    "github_user": "symbol",
    "github_project": "product",
    "travis_ci": false,
    "coveralls": false,
    "github_actions": true,
    "lcname": "symbol-shoestring"
}
        
Elapsed time: 0.24381s