From b4aedd4b9a71ad0403a3e7f5d794b37b17a14e9a Mon Sep 17 00:00:00 2001 From: Altynbek Orumbayev Date: Tue, 18 Feb 2025 14:59:32 +0100 Subject: [PATCH 1/2] docs: update html folder with v3 docs --- .github/workflows/check-python.yaml | 10 +- docs/html/.buildinfo | 4 +- .../algokit_utils/algokit_utils.md.txt | 1841 --------- .../accounts/account_manager/index.rst.txt | 743 ++++ .../algokit_utils/accounts/index.rst.txt | 16 + .../kmd_account_manager/index.rst.txt | 82 + .../algokit_utils/algorand/index.rst.txt | 291 ++ .../applications/abi/index.rst.txt | 222 ++ .../applications/app_client/index.rst.txt | 852 ++++ .../applications/app_deployer/index.rst.txt | 373 ++ .../applications/app_factory/index.rst.txt | 429 +++ .../applications/app_manager/index.rst.txt | 337 ++ .../applications/app_spec/arc32/index.rst.txt | 244 ++ .../applications/app_spec/arc56/index.rst.txt | 1304 +++++++ .../applications/app_spec/index.rst.txt | 16 + .../applications/enums/index.rst.txt | 131 + .../algokit_utils/applications/index.rst.txt | 21 + .../assets/asset_manager/index.rst.txt | 310 ++ .../algokit_utils/assets/index.rst.txt | 15 + .../clients/client_manager/index.rst.txt | 520 +++ .../dispenser_api_client/index.rst.txt | 159 + .../algokit_utils/clients/index.rst.txt | 16 + .../algokit_utils/config/index.rst.txt | 145 + .../algokit_utils/errors/index.rst.txt | 15 + .../errors/logic_error/index.rst.txt | 105 + .../autoapi/algokit_utils/index.rst.txt | 37 + .../models/account/index.rst.txt | 229 ++ .../algokit_utils/models/amount/index.rst.txt | 121 + .../models/application/index.rst.txt | 216 ++ .../algokit_utils/models/index.rst.txt | 21 + .../models/network/index.rst.txt | 66 + .../models/simulate/index.rst.txt | 35 + .../algokit_utils/models/state/index.rst.txt | 114 + .../models/transaction/index.rst.txt | 150 + .../protocols/account/index.rst.txt | 42 + .../algokit_utils/protocols/index.rst.txt | 16 + .../protocols/typed_clients/index.rst.txt | 105 + .../algokit_utils/transactions/index.rst.txt | 17 + .../transaction_composer/index.rst.txt | 1591 ++++++++ .../transaction_creator/index.rst.txt | 685 ++++ .../transaction_sender/index.rst.txt | 1004 +++++ docs/html/_sources/autoapi/index.rst.txt | 11 + .../html/_sources/capabilities/account.md.txt | 242 +- .../capabilities/algorand-client.md.txt | 190 + docs/html/_sources/capabilities/amount.md.txt | 55 + .../_sources/capabilities/app-client.md.txt | 398 +- .../_sources/capabilities/app-deploy.md.txt | 217 +- docs/html/_sources/capabilities/app.md.txt | 163 + docs/html/_sources/capabilities/asset.md.txt | 134 + docs/html/_sources/capabilities/client.md.txt | 110 +- .../_sources/capabilities/debugging.md.txt | 93 + .../capabilities/dispenser-client.md.txt | 63 +- .../html/_sources/capabilities/testing.md.txt | 204 + .../capabilities/transaction-composer.md.txt | 345 ++ .../_sources/capabilities/transaction.md.txt | 147 + .../_sources/capabilities/transfer.md.txt | 199 +- .../capabilities/typed-app-clients.md.txt | 200 + docs/html/_sources/index.md.txt | 140 +- docs/html/_sources/v3-migration-guide.md.txt | 284 ++ .../_sphinx_javascript_frameworks_compat.js | 123 - docs/html/_static/basic.css | 37 +- docs/html/_static/css/badge_only.css | 1 - .../_static/css/fonts/Roboto-Slab-Bold.woff | Bin 87624 -> 0 bytes .../_static/css/fonts/Roboto-Slab-Bold.woff2 | Bin 67312 -> 0 bytes .../css/fonts/Roboto-Slab-Regular.woff | Bin 86288 -> 0 bytes .../css/fonts/Roboto-Slab-Regular.woff2 | Bin 66444 -> 0 bytes .../_static/css/fonts/fontawesome-webfont.eot | Bin 165742 -> 0 bytes .../_static/css/fonts/fontawesome-webfont.svg | 2671 ------------- .../_static/css/fonts/fontawesome-webfont.ttf | Bin 165548 -> 0 bytes .../css/fonts/fontawesome-webfont.woff | Bin 98024 -> 0 bytes .../css/fonts/fontawesome-webfont.woff2 | Bin 77160 -> 0 bytes .../_static/css/fonts/lato-bold-italic.woff | Bin 323344 -> 0 bytes .../_static/css/fonts/lato-bold-italic.woff2 | Bin 193308 -> 0 bytes docs/html/_static/css/fonts/lato-bold.woff | Bin 309728 -> 0 bytes docs/html/_static/css/fonts/lato-bold.woff2 | Bin 184912 -> 0 bytes .../_static/css/fonts/lato-normal-italic.woff | Bin 328412 -> 0 bytes .../css/fonts/lato-normal-italic.woff2 | Bin 195704 -> 0 bytes docs/html/_static/css/fonts/lato-normal.woff | Bin 309192 -> 0 bytes docs/html/_static/css/fonts/lato-normal.woff2 | Bin 182708 -> 0 bytes docs/html/_static/css/theme.css | 4 - docs/html/_static/debug.css | 69 + docs/html/_static/doctools.js | 7 - docs/html/_static/documentation_options.js | 5 +- docs/html/_static/graphviz.css | 12 + docs/html/_static/jquery.js | 2 - docs/html/_static/js/badge_only.js | 1 - .../_static/js/html5shiv-printshiv.min.js | 4 - docs/html/_static/js/html5shiv.min.js | 4 - docs/html/_static/js/theme.js | 1 - docs/html/_static/language_data.js | 9 +- docs/html/_static/pygments.css | 310 +- docs/html/_static/scripts/furo-extensions.js | 0 docs/html/_static/scripts/furo.js | 3 + docs/html/_static/scripts/furo.js.LICENSE.txt | 7 + docs/html/_static/scripts/furo.js.map | 1 + docs/html/_static/searchtools.js | 226 +- docs/html/_static/skeleton.css | 296 ++ docs/html/_static/sphinx_highlight.js | 16 +- docs/html/_static/styles/furo-extensions.css | 2 + .../_static/styles/furo-extensions.css.map | 1 + docs/html/_static/styles/furo.css | 2 + docs/html/_static/styles/furo.css.map | 1 + .../apidocs/algokit_utils/algokit_utils.html | 1628 -------- .../accounts/account_manager/index.html | 1311 +++++++ .../autoapi/algokit_utils/accounts/index.html | 407 ++ .../accounts/kmd_account_manager/index.html | 516 +++ .../autoapi/algokit_utils/algorand/index.html | 813 ++++ .../algokit_utils/applications/abi/index.html | 725 ++++ .../applications/app_client/index.html | 1430 +++++++ .../applications/app_deployer/index.html | 854 ++++ .../applications/app_factory/index.html | 914 +++++ .../applications/app_manager/index.html | 903 +++++ .../applications/app_spec/arc32/index.html | 726 ++++ .../applications/app_spec/arc56/index.html | 1882 +++++++++ .../applications/app_spec/index.html | 407 ++ .../applications/enums/index.html | 529 +++ .../algokit_utils/applications/index.html | 412 ++ .../assets/asset_manager/index.html | 759 ++++ .../autoapi/algokit_utils/assets/index.html | 406 ++ .../clients/client_manager/index.html | 1125 ++++++ .../clients/dispenser_api_client/index.html | 634 +++ .../autoapi/algokit_utils/clients/index.html | 407 ++ .../autoapi/algokit_utils/config/index.html | 572 +++ .../autoapi/algokit_utils/errors/index.html | 406 ++ .../errors/logic_error/index.html | 560 +++ docs/html/autoapi/algokit_utils/index.html | 424 ++ .../algokit_utils/models/account/index.html | 698 ++++ .../algokit_utils/models/amount/index.html | 584 +++ .../models/application/index.html | 645 ++++ .../autoapi/algokit_utils/models/index.html | 412 ++ .../algokit_utils/models/network/index.html | 482 +++ .../algokit_utils/models/simulate/index.html | 448 +++ .../algokit_utils/models/state/index.html | 541 +++ .../models/transaction/index.html | 616 +++ .../protocols/account/index.html | 441 +++ .../algokit_utils/protocols/index.html | 407 ++ .../protocols/typed_clients/index.html | 513 +++ .../algokit_utils/transactions/index.html | 408 ++ .../transaction_composer/index.html | 2252 +++++++++++ .../transaction_creator/index.html | 1187 ++++++ .../transaction_sender/index.html | 1587 ++++++++ docs/html/autoapi/index.html | 448 +++ docs/html/capabilities/account.html | 721 +++- docs/html/capabilities/algorand-client.html | 598 +++ docs/html/capabilities/amount.html | 457 +++ docs/html/capabilities/app-client.html | 908 +++-- docs/html/capabilities/app-deploy.html | 703 +++- docs/html/capabilities/app.html | 568 +++ docs/html/capabilities/asset.html | 541 +++ docs/html/capabilities/client.html | 599 ++- docs/html/capabilities/debugger.html | 163 - docs/html/capabilities/debugging.html | 498 +++ docs/html/capabilities/dispenser-client.html | 554 ++- docs/html/capabilities/testing.html | 598 +++ .../capabilities/transaction-composer.html | 726 ++++ docs/html/capabilities/transaction.html | 560 +++ docs/html/capabilities/transfer.html | 677 +++- docs/html/capabilities/typed-app-clients.html | 585 +++ docs/html/genindex.html | 3429 ++++++++++++++--- docs/html/index.html | 706 +++- docs/html/objects.inv | Bin 3315 -> 13812 bytes docs/html/py-modindex.html | 682 +++- docs/html/search.html | 457 ++- docs/html/searchindex.js | 2 +- docs/html/v3-migration-guide.html | 724 ++++ .../clients/dispenser_api_client/index.md | 3 + docs/markdown/capabilities/algorand-client.md | 10 +- 167 files changed, 56863 insertions(+), 8685 deletions(-) delete mode 100644 docs/html/_sources/apidocs/algokit_utils/algokit_utils.md.txt create mode 100644 docs/html/_sources/autoapi/algokit_utils/accounts/account_manager/index.rst.txt create mode 100644 docs/html/_sources/autoapi/algokit_utils/accounts/index.rst.txt create mode 100644 docs/html/_sources/autoapi/algokit_utils/accounts/kmd_account_manager/index.rst.txt create mode 100644 docs/html/_sources/autoapi/algokit_utils/algorand/index.rst.txt create mode 100644 docs/html/_sources/autoapi/algokit_utils/applications/abi/index.rst.txt create mode 100644 docs/html/_sources/autoapi/algokit_utils/applications/app_client/index.rst.txt create mode 100644 docs/html/_sources/autoapi/algokit_utils/applications/app_deployer/index.rst.txt create mode 100644 docs/html/_sources/autoapi/algokit_utils/applications/app_factory/index.rst.txt create mode 100644 docs/html/_sources/autoapi/algokit_utils/applications/app_manager/index.rst.txt create mode 100644 docs/html/_sources/autoapi/algokit_utils/applications/app_spec/arc32/index.rst.txt create mode 100644 docs/html/_sources/autoapi/algokit_utils/applications/app_spec/arc56/index.rst.txt create mode 100644 docs/html/_sources/autoapi/algokit_utils/applications/app_spec/index.rst.txt create mode 100644 docs/html/_sources/autoapi/algokit_utils/applications/enums/index.rst.txt create mode 100644 docs/html/_sources/autoapi/algokit_utils/applications/index.rst.txt create mode 100644 docs/html/_sources/autoapi/algokit_utils/assets/asset_manager/index.rst.txt create mode 100644 docs/html/_sources/autoapi/algokit_utils/assets/index.rst.txt create mode 100644 docs/html/_sources/autoapi/algokit_utils/clients/client_manager/index.rst.txt create mode 100644 docs/html/_sources/autoapi/algokit_utils/clients/dispenser_api_client/index.rst.txt create mode 100644 docs/html/_sources/autoapi/algokit_utils/clients/index.rst.txt create mode 100644 docs/html/_sources/autoapi/algokit_utils/config/index.rst.txt create mode 100644 docs/html/_sources/autoapi/algokit_utils/errors/index.rst.txt create mode 100644 docs/html/_sources/autoapi/algokit_utils/errors/logic_error/index.rst.txt create mode 100644 docs/html/_sources/autoapi/algokit_utils/index.rst.txt create mode 100644 docs/html/_sources/autoapi/algokit_utils/models/account/index.rst.txt create mode 100644 docs/html/_sources/autoapi/algokit_utils/models/amount/index.rst.txt create mode 100644 docs/html/_sources/autoapi/algokit_utils/models/application/index.rst.txt create mode 100644 docs/html/_sources/autoapi/algokit_utils/models/index.rst.txt create mode 100644 docs/html/_sources/autoapi/algokit_utils/models/network/index.rst.txt create mode 100644 docs/html/_sources/autoapi/algokit_utils/models/simulate/index.rst.txt create mode 100644 docs/html/_sources/autoapi/algokit_utils/models/state/index.rst.txt create mode 100644 docs/html/_sources/autoapi/algokit_utils/models/transaction/index.rst.txt create mode 100644 docs/html/_sources/autoapi/algokit_utils/protocols/account/index.rst.txt create mode 100644 docs/html/_sources/autoapi/algokit_utils/protocols/index.rst.txt create mode 100644 docs/html/_sources/autoapi/algokit_utils/protocols/typed_clients/index.rst.txt create mode 100644 docs/html/_sources/autoapi/algokit_utils/transactions/index.rst.txt create mode 100644 docs/html/_sources/autoapi/algokit_utils/transactions/transaction_composer/index.rst.txt create mode 100644 docs/html/_sources/autoapi/algokit_utils/transactions/transaction_creator/index.rst.txt create mode 100644 docs/html/_sources/autoapi/algokit_utils/transactions/transaction_sender/index.rst.txt create mode 100644 docs/html/_sources/autoapi/index.rst.txt create mode 100644 docs/html/_sources/capabilities/algorand-client.md.txt create mode 100644 docs/html/_sources/capabilities/amount.md.txt create mode 100644 docs/html/_sources/capabilities/app.md.txt create mode 100644 docs/html/_sources/capabilities/asset.md.txt create mode 100644 docs/html/_sources/capabilities/debugging.md.txt create mode 100644 docs/html/_sources/capabilities/testing.md.txt create mode 100644 docs/html/_sources/capabilities/transaction-composer.md.txt create mode 100644 docs/html/_sources/capabilities/transaction.md.txt create mode 100644 docs/html/_sources/capabilities/typed-app-clients.md.txt create mode 100644 docs/html/_sources/v3-migration-guide.md.txt delete mode 100644 docs/html/_static/_sphinx_javascript_frameworks_compat.js delete mode 100644 docs/html/_static/css/badge_only.css delete mode 100644 docs/html/_static/css/fonts/Roboto-Slab-Bold.woff delete mode 100644 docs/html/_static/css/fonts/Roboto-Slab-Bold.woff2 delete mode 100644 docs/html/_static/css/fonts/Roboto-Slab-Regular.woff delete mode 100644 docs/html/_static/css/fonts/Roboto-Slab-Regular.woff2 delete mode 100644 docs/html/_static/css/fonts/fontawesome-webfont.eot delete mode 100644 docs/html/_static/css/fonts/fontawesome-webfont.svg delete mode 100644 docs/html/_static/css/fonts/fontawesome-webfont.ttf delete mode 100644 docs/html/_static/css/fonts/fontawesome-webfont.woff delete mode 100644 docs/html/_static/css/fonts/fontawesome-webfont.woff2 delete mode 100644 docs/html/_static/css/fonts/lato-bold-italic.woff delete mode 100644 docs/html/_static/css/fonts/lato-bold-italic.woff2 delete mode 100644 docs/html/_static/css/fonts/lato-bold.woff delete mode 100644 docs/html/_static/css/fonts/lato-bold.woff2 delete mode 100644 docs/html/_static/css/fonts/lato-normal-italic.woff delete mode 100644 docs/html/_static/css/fonts/lato-normal-italic.woff2 delete mode 100644 docs/html/_static/css/fonts/lato-normal.woff delete mode 100644 docs/html/_static/css/fonts/lato-normal.woff2 delete mode 100644 docs/html/_static/css/theme.css create mode 100644 docs/html/_static/debug.css create mode 100644 docs/html/_static/graphviz.css delete mode 100644 docs/html/_static/jquery.js delete mode 100644 docs/html/_static/js/badge_only.js delete mode 100644 docs/html/_static/js/html5shiv-printshiv.min.js delete mode 100644 docs/html/_static/js/html5shiv.min.js delete mode 100644 docs/html/_static/js/theme.js create mode 100644 docs/html/_static/scripts/furo-extensions.js create mode 100644 docs/html/_static/scripts/furo.js create mode 100644 docs/html/_static/scripts/furo.js.LICENSE.txt create mode 100644 docs/html/_static/scripts/furo.js.map create mode 100644 docs/html/_static/skeleton.css create mode 100644 docs/html/_static/styles/furo-extensions.css create mode 100644 docs/html/_static/styles/furo-extensions.css.map create mode 100644 docs/html/_static/styles/furo.css create mode 100644 docs/html/_static/styles/furo.css.map delete mode 100644 docs/html/apidocs/algokit_utils/algokit_utils.html create mode 100644 docs/html/autoapi/algokit_utils/accounts/account_manager/index.html create mode 100644 docs/html/autoapi/algokit_utils/accounts/index.html create mode 100644 docs/html/autoapi/algokit_utils/accounts/kmd_account_manager/index.html create mode 100644 docs/html/autoapi/algokit_utils/algorand/index.html create mode 100644 docs/html/autoapi/algokit_utils/applications/abi/index.html create mode 100644 docs/html/autoapi/algokit_utils/applications/app_client/index.html create mode 100644 docs/html/autoapi/algokit_utils/applications/app_deployer/index.html create mode 100644 docs/html/autoapi/algokit_utils/applications/app_factory/index.html create mode 100644 docs/html/autoapi/algokit_utils/applications/app_manager/index.html create mode 100644 docs/html/autoapi/algokit_utils/applications/app_spec/arc32/index.html create mode 100644 docs/html/autoapi/algokit_utils/applications/app_spec/arc56/index.html create mode 100644 docs/html/autoapi/algokit_utils/applications/app_spec/index.html create mode 100644 docs/html/autoapi/algokit_utils/applications/enums/index.html create mode 100644 docs/html/autoapi/algokit_utils/applications/index.html create mode 100644 docs/html/autoapi/algokit_utils/assets/asset_manager/index.html create mode 100644 docs/html/autoapi/algokit_utils/assets/index.html create mode 100644 docs/html/autoapi/algokit_utils/clients/client_manager/index.html create mode 100644 docs/html/autoapi/algokit_utils/clients/dispenser_api_client/index.html create mode 100644 docs/html/autoapi/algokit_utils/clients/index.html create mode 100644 docs/html/autoapi/algokit_utils/config/index.html create mode 100644 docs/html/autoapi/algokit_utils/errors/index.html create mode 100644 docs/html/autoapi/algokit_utils/errors/logic_error/index.html create mode 100644 docs/html/autoapi/algokit_utils/index.html create mode 100644 docs/html/autoapi/algokit_utils/models/account/index.html create mode 100644 docs/html/autoapi/algokit_utils/models/amount/index.html create mode 100644 docs/html/autoapi/algokit_utils/models/application/index.html create mode 100644 docs/html/autoapi/algokit_utils/models/index.html create mode 100644 docs/html/autoapi/algokit_utils/models/network/index.html create mode 100644 docs/html/autoapi/algokit_utils/models/simulate/index.html create mode 100644 docs/html/autoapi/algokit_utils/models/state/index.html create mode 100644 docs/html/autoapi/algokit_utils/models/transaction/index.html create mode 100644 docs/html/autoapi/algokit_utils/protocols/account/index.html create mode 100644 docs/html/autoapi/algokit_utils/protocols/index.html create mode 100644 docs/html/autoapi/algokit_utils/protocols/typed_clients/index.html create mode 100644 docs/html/autoapi/algokit_utils/transactions/index.html create mode 100644 docs/html/autoapi/algokit_utils/transactions/transaction_composer/index.html create mode 100644 docs/html/autoapi/algokit_utils/transactions/transaction_creator/index.html create mode 100644 docs/html/autoapi/algokit_utils/transactions/transaction_sender/index.html create mode 100644 docs/html/autoapi/index.html create mode 100644 docs/html/capabilities/algorand-client.html create mode 100644 docs/html/capabilities/amount.html create mode 100644 docs/html/capabilities/app.html create mode 100644 docs/html/capabilities/asset.html delete mode 100644 docs/html/capabilities/debugger.html create mode 100644 docs/html/capabilities/debugging.html create mode 100644 docs/html/capabilities/testing.html create mode 100644 docs/html/capabilities/transaction-composer.html create mode 100644 docs/html/capabilities/transaction.html create mode 100644 docs/html/capabilities/typed-app-clients.html create mode 100644 docs/html/v3-migration-guide.html diff --git a/.github/workflows/check-python.yaml b/.github/workflows/check-python.yaml index e70bde62..25d6f083 100644 --- a/.github/workflows/check-python.yaml +++ b/.github/workflows/check-python.yaml @@ -48,8 +48,8 @@ jobs: - name: Check docstrings are up to date run: poetry run poe docstrings-check - # TODO: Restore before prod release of v3 - # - name: Check docs are up to date - # run: | - # poetry run poe docs-md-only - # git diff --exit-code ':!docs/markdown/autoapi/index.md' ':!docs/markdown/autoapi/algokit_utils/applications/app_factory/index.md' docs + TODO: Restore before prod release of v3 + - name: Check docs are up to date + run: | + poetry run poe docs-md-only + git diff --exit-code ':!docs/markdown/autoapi/index.md' ':!docs/markdown/autoapi/algokit_utils/applications/app_factory/index.md' docs diff --git a/docs/html/.buildinfo b/docs/html/.buildinfo index e97a8474..ffc6fde6 100644 --- a/docs/html/.buildinfo +++ b/docs/html/.buildinfo @@ -1,4 +1,4 @@ # Sphinx build info version 1 -# This file hashes the configuration used when building these files. When it is not found, a full rebuild will be done. -config: 8b79d003fcc06bc866328aa37206c6ac +# This file records the configuration used when building these files. When it is not found, a full rebuild will be done. +config: a0ddb94c9519cbe4048eaa2307361694 tags: 645f666f9bcd5a90fca523b33c5a78b7 diff --git a/docs/html/_sources/apidocs/algokit_utils/algokit_utils.md.txt b/docs/html/_sources/apidocs/algokit_utils/algokit_utils.md.txt deleted file mode 100644 index be0e90b8..00000000 --- a/docs/html/_sources/apidocs/algokit_utils/algokit_utils.md.txt +++ /dev/null @@ -1,1841 +0,0 @@ ---- -orphan: true ---- - -# {py:mod}`algokit_utils` - -```{py:module} algokit_utils -``` - -```{autodoc2-docstring} algokit_utils -:parser: myst -:allowtitles: -``` - -## Data - -````{py:data} AppSpecStateDict -:canonical: algokit_utils.application_specification.AppSpecStateDict -:type: typing.TypeAlias -:value: > - None - -```{autodoc2-docstring} algokit_utils.application_specification.AppSpecStateDict -:parser: myst -``` - -```` - - -````{py:data} DELETABLE_TEMPLATE_NAME -:canonical: algokit_utils.deploy.DELETABLE_TEMPLATE_NAME -:value: > - None - -```{autodoc2-docstring} algokit_utils.deploy.DELETABLE_TEMPLATE_NAME -:parser: myst -``` - -```` - - -````{py:data} DefaultArgumentType -:canonical: algokit_utils.application_specification.DefaultArgumentType -:type: typing.TypeAlias -:value: > - None - -```{autodoc2-docstring} algokit_utils.application_specification.DefaultArgumentType -:parser: myst -``` - -```` - - -````{py:data} MethodConfigDict -:canonical: algokit_utils.application_specification.MethodConfigDict -:type: typing.TypeAlias -:value: > - None - -```{autodoc2-docstring} algokit_utils.application_specification.MethodConfigDict -:parser: myst -``` - -```` - - -````{py:data} NOTE_PREFIX -:canonical: algokit_utils.deploy.NOTE_PREFIX -:value: > - 'ALGOKIT_DEPLOYER:j' - -```{autodoc2-docstring} algokit_utils.deploy.NOTE_PREFIX -:parser: myst -``` - -```` - - -````{py:data} OnCompleteActionName -:canonical: algokit_utils.application_specification.OnCompleteActionName -:type: typing.TypeAlias -:value: > - None - -```{autodoc2-docstring} algokit_utils.application_specification.OnCompleteActionName -:parser: myst -``` - -```` - - -````{py:data} TemplateValueDict -:canonical: algokit_utils.deploy.TemplateValueDict -:type: typing.TypeAlias -:value: > - None - -```{autodoc2-docstring} algokit_utils.deploy.TemplateValueDict -:parser: myst -``` - -```` - - -````{py:data} TemplateValueMapping -:canonical: algokit_utils.deploy.TemplateValueMapping -:type: typing.TypeAlias -:value: > - None - -```{autodoc2-docstring} algokit_utils.deploy.TemplateValueMapping -:parser: myst -``` - -```` - - -````{py:data} UPDATABLE_TEMPLATE_NAME -:canonical: algokit_utils.deploy.UPDATABLE_TEMPLATE_NAME -:value: > - None - -```{autodoc2-docstring} algokit_utils.deploy.UPDATABLE_TEMPLATE_NAME -:parser: myst -``` - -```` - - -## Classes - -````{py:class} ABICallArgs -:canonical: algokit_utils.deploy.ABICallArgs - -Bases: {py:obj}`algokit_utils.deploy.DeployCallArgs`, {py:obj}`algokit_utils.deploy.ABICall` - -```{autodoc2-docstring} algokit_utils.deploy.ABICallArgs -:parser: myst -``` - -```` - - -````{py:class} ABICallArgsDict() -:canonical: algokit_utils.deploy.ABICallArgsDict - -Bases: {py:obj}`algokit_utils.deploy.DeployCallArgsDict`, {py:obj}`typing.TypedDict` - -```{autodoc2-docstring} algokit_utils.deploy.ABICallArgsDict -:parser: myst -``` - -```{rubric} Initialization -``` - -```{autodoc2-docstring} algokit_utils.deploy.ABICallArgsDict.__init__ -:parser: myst -``` - -```` - - -````{py:class} ABICreateCallArgs -:canonical: algokit_utils.deploy.ABICreateCallArgs - -Bases: {py:obj}`algokit_utils.deploy.DeployCreateCallArgs`, {py:obj}`algokit_utils.deploy.ABICall` - -```{autodoc2-docstring} algokit_utils.deploy.ABICreateCallArgs -:parser: myst -``` - -```` - - -````{py:class} ABICreateCallArgsDict() -:canonical: algokit_utils.deploy.ABICreateCallArgsDict - -Bases: {py:obj}`algokit_utils.deploy.DeployCreateCallArgsDict`, {py:obj}`typing.TypedDict` - -```{autodoc2-docstring} algokit_utils.deploy.ABICreateCallArgsDict -:parser: myst -``` - -```{rubric} Initialization -``` - -```{autodoc2-docstring} algokit_utils.deploy.ABICreateCallArgsDict.__init__ -:parser: myst -``` - -```` - - -`````{py:class} ABITransactionResponse -:canonical: algokit_utils.models.ABITransactionResponse - -Bases: {py:obj}`algokit_utils.models.TransactionResponse`, {py:obj}`typing.Generic`\[{py:obj}`algokit_utils.models.ReturnType`\] - -```{autodoc2-docstring} algokit_utils.models.ABITransactionResponse -:parser: myst -``` - -````{py:attribute} decode_error -:canonical: algokit_utils.models.ABITransactionResponse.decode_error -:type: Exception | None -:value: > - None - -```{autodoc2-docstring} algokit_utils.models.ABITransactionResponse.decode_error -:parser: myst -``` - -```` - -````{py:attribute} method -:canonical: algokit_utils.models.ABITransactionResponse.method -:type: algosdk.abi.Method -:value: > - None - -```{autodoc2-docstring} algokit_utils.models.ABITransactionResponse.method -:parser: myst -``` - -```` - -````{py:attribute} raw_value -:canonical: algokit_utils.models.ABITransactionResponse.raw_value -:type: bytes -:value: > - None - -```{autodoc2-docstring} algokit_utils.models.ABITransactionResponse.raw_value -:parser: myst -``` - -```` - -````{py:attribute} return_value -:canonical: algokit_utils.models.ABITransactionResponse.return_value -:type: algokit_utils.models.ReturnType -:value: > - None - -```{autodoc2-docstring} algokit_utils.models.ABITransactionResponse.return_value -:parser: myst -``` - -```` - -````{py:attribute} tx_info -:canonical: algokit_utils.models.ABITransactionResponse.tx_info -:type: dict -:value: > - None - -```{autodoc2-docstring} algokit_utils.models.ABITransactionResponse.tx_info -:parser: myst -``` - -```` - -````` - - -`````{py:class} Account -:canonical: algokit_utils.models.Account - -```{autodoc2-docstring} algokit_utils.models.Account -:parser: myst -``` - -````{py:attribute} address -:canonical: algokit_utils.models.Account.address -:type: str -:value: > - 'field(...)' - -```{autodoc2-docstring} algokit_utils.models.Account.address -:parser: myst -``` - -```` - -````{py:attribute} private_key -:canonical: algokit_utils.models.Account.private_key -:type: str -:value: > - None - -```{autodoc2-docstring} algokit_utils.models.Account.private_key -:parser: myst -``` - -```` - -````{py:property} public_key -:canonical: algokit_utils.models.Account.public_key -:type: bytes - -```{autodoc2-docstring} algokit_utils.models.Account.public_key -:parser: myst -``` - -```` - -````{py:property} signer -:canonical: algokit_utils.models.Account.signer -:type: algosdk.atomic_transaction_composer.AccountTransactionSigner - -```{autodoc2-docstring} algokit_utils.models.Account.signer -:parser: myst -``` - -```` - -````` - - -`````{py:class} AlgoClientConfig -:canonical: algokit_utils.network_clients.AlgoClientConfig - -```{autodoc2-docstring} algokit_utils.network_clients.AlgoClientConfig -:parser: myst -``` - -````{py:attribute} server -:canonical: algokit_utils.network_clients.AlgoClientConfig.server -:type: str -:value: > - None - -```{autodoc2-docstring} algokit_utils.network_clients.AlgoClientConfig.server -:parser: myst -``` - -```` - -````{py:attribute} token -:canonical: algokit_utils.network_clients.AlgoClientConfig.token -:type: str -:value: > - None - -```{autodoc2-docstring} algokit_utils.network_clients.AlgoClientConfig.token -:parser: myst -``` - -```` - -````` - - -````{py:class} AppDeployMetaData -:canonical: algokit_utils.deploy.AppDeployMetaData - -```{autodoc2-docstring} algokit_utils.deploy.AppDeployMetaData -:parser: myst -``` - -```` - - -````{py:class} AppLookup -:canonical: algokit_utils.deploy.AppLookup - -```{autodoc2-docstring} algokit_utils.deploy.AppLookup -:parser: myst -``` - -```` - - -````{py:class} AppMetaData -:canonical: algokit_utils.deploy.AppMetaData - -Bases: {py:obj}`algokit_utils.deploy.AppReference`, {py:obj}`algokit_utils.deploy.AppDeployMetaData` - -```{autodoc2-docstring} algokit_utils.deploy.AppMetaData -:parser: myst -``` - -```` - - -````{py:class} AppReference -:canonical: algokit_utils.deploy.AppReference - -```{autodoc2-docstring} algokit_utils.deploy.AppReference -:parser: myst -``` - -```` - - -`````{py:class} ApplicationClient(algod_client: algosdk.v2client.algod.AlgodClient, app_spec: algokit_utils.application_specification.ApplicationSpecification | pathlib.Path, *, app_id: int = 0, creator: str | algokit_utils.models.Account | None = None, indexer_client: IndexerClient | None = None, existing_deployments: algokit_utils.deploy.AppLookup | None = None, signer: algosdk.atomic_transaction_composer.TransactionSigner | algokit_utils.models.Account | None = None, sender: str | None = None, suggested_params: algosdk.transaction.SuggestedParams | None = None, template_values: algokit_utils.deploy.TemplateValueMapping | None = None, app_name: str | None = None) -:canonical: algokit_utils.application_client.ApplicationClient - -```{autodoc2-docstring} algokit_utils.application_client.ApplicationClient -:parser: myst -``` - -```{rubric} Initialization -``` - -```{autodoc2-docstring} algokit_utils.application_client.ApplicationClient.__init__ -:parser: myst -``` - -````{py:method} add_method_call(atc: algosdk.atomic_transaction_composer.AtomicTransactionComposer, abi_method: algokit_utils.models.ABIMethod | bool | None = None, *, abi_args: algokit_utils.models.ABIArgsDict | None = None, app_id: int | None = None, parameters: algokit_utils.models.TransactionParameters | algokit_utils.models.TransactionParametersDict | None = None, on_complete: algosdk.transaction.OnComplete = transaction.OnComplete.NoOpOC, local_schema: algosdk.transaction.StateSchema | None = None, global_schema: algosdk.transaction.StateSchema | None = None, approval_program: bytes | None = None, clear_program: bytes | None = None, extra_pages: int | None = None, app_args: list[bytes] | None = None, call_config: algokit_utils.application_specification.CallConfig = au_spec.CallConfig.CALL) -> None -:canonical: algokit_utils.application_client.ApplicationClient.add_method_call - -```{autodoc2-docstring} algokit_utils.application_client.ApplicationClient.add_method_call -:parser: myst -``` - -```` - -````{py:method} call(call_abi_method: algokit_utils.models.ABIMethod | bool | None = None, transaction_parameters: algokit_utils.models.OnCompleteCallParameters | algokit_utils.models.OnCompleteCallParametersDict | None = None, **abi_kwargs: algokit_utils.models.ABIArgType) -> algokit_utils.models.TransactionResponse | algokit_utils.models.ABITransactionResponse -:canonical: algokit_utils.application_client.ApplicationClient.call - -```{autodoc2-docstring} algokit_utils.application_client.ApplicationClient.call -:parser: myst -``` - -```` - -````{py:method} clear_state(transaction_parameters: algokit_utils.models.TransactionParameters | algokit_utils.models.TransactionParametersDict | None = None, app_args: list[bytes] | None = None) -> algokit_utils.models.TransactionResponse -:canonical: algokit_utils.application_client.ApplicationClient.clear_state - -```{autodoc2-docstring} algokit_utils.application_client.ApplicationClient.clear_state -:parser: myst -``` - -```` - -````{py:method} close_out(call_abi_method: algokit_utils.models.ABIMethod | bool | None = None, transaction_parameters: algokit_utils.models.TransactionParameters | algokit_utils.models.TransactionParametersDict | None = None, **abi_kwargs: algokit_utils.models.ABIArgType) -> algokit_utils.models.TransactionResponse | algokit_utils.models.ABITransactionResponse -:canonical: algokit_utils.application_client.ApplicationClient.close_out - -```{autodoc2-docstring} algokit_utils.application_client.ApplicationClient.close_out -:parser: myst -``` - -```` - -````{py:method} compose_call(atc: algosdk.atomic_transaction_composer.AtomicTransactionComposer, /, call_abi_method: algokit_utils.models.ABIMethod | bool | None = None, transaction_parameters: algokit_utils.models.OnCompleteCallParameters | algokit_utils.models.OnCompleteCallParametersDict | None = None, **abi_kwargs: algokit_utils.models.ABIArgType) -> None -:canonical: algokit_utils.application_client.ApplicationClient.compose_call - -```{autodoc2-docstring} algokit_utils.application_client.ApplicationClient.compose_call -:parser: myst -``` - -```` - -````{py:method} compose_clear_state(atc: algosdk.atomic_transaction_composer.AtomicTransactionComposer, /, transaction_parameters: algokit_utils.models.TransactionParameters | algokit_utils.models.TransactionParametersDict | None = None, app_args: list[bytes] | None = None) -> None -:canonical: algokit_utils.application_client.ApplicationClient.compose_clear_state - -```{autodoc2-docstring} algokit_utils.application_client.ApplicationClient.compose_clear_state -:parser: myst -``` - -```` - -````{py:method} compose_close_out(atc: algosdk.atomic_transaction_composer.AtomicTransactionComposer, /, call_abi_method: algokit_utils.models.ABIMethod | bool | None = None, transaction_parameters: algokit_utils.models.TransactionParameters | algokit_utils.models.TransactionParametersDict | None = None, **abi_kwargs: algokit_utils.models.ABIArgType) -> None -:canonical: algokit_utils.application_client.ApplicationClient.compose_close_out - -```{autodoc2-docstring} algokit_utils.application_client.ApplicationClient.compose_close_out -:parser: myst -``` - -```` - -````{py:method} compose_create(atc: algosdk.atomic_transaction_composer.AtomicTransactionComposer, /, call_abi_method: algokit_utils.models.ABIMethod | bool | None = None, transaction_parameters: algokit_utils.models.CreateCallParameters | algokit_utils.models.CreateCallParametersDict | None = None, **abi_kwargs: algokit_utils.models.ABIArgType) -> None -:canonical: algokit_utils.application_client.ApplicationClient.compose_create - -```{autodoc2-docstring} algokit_utils.application_client.ApplicationClient.compose_create -:parser: myst -``` - -```` - -````{py:method} compose_delete(atc: algosdk.atomic_transaction_composer.AtomicTransactionComposer, /, call_abi_method: algokit_utils.models.ABIMethod | bool | None = None, transaction_parameters: algokit_utils.models.TransactionParameters | algokit_utils.models.TransactionParametersDict | None = None, **abi_kwargs: algokit_utils.models.ABIArgType) -> None -:canonical: algokit_utils.application_client.ApplicationClient.compose_delete - -```{autodoc2-docstring} algokit_utils.application_client.ApplicationClient.compose_delete -:parser: myst -``` - -```` - -````{py:method} compose_opt_in(atc: algosdk.atomic_transaction_composer.AtomicTransactionComposer, /, call_abi_method: algokit_utils.models.ABIMethod | bool | None = None, transaction_parameters: algokit_utils.models.TransactionParameters | algokit_utils.models.TransactionParametersDict | None = None, **abi_kwargs: algokit_utils.models.ABIArgType) -> None -:canonical: algokit_utils.application_client.ApplicationClient.compose_opt_in - -```{autodoc2-docstring} algokit_utils.application_client.ApplicationClient.compose_opt_in -:parser: myst -``` - -```` - -````{py:method} compose_update(atc: algosdk.atomic_transaction_composer.AtomicTransactionComposer, /, call_abi_method: algokit_utils.models.ABIMethod | bool | None = None, transaction_parameters: algokit_utils.models.TransactionParameters | algokit_utils.models.TransactionParametersDict | None = None, **abi_kwargs: algokit_utils.models.ABIArgType) -> None -:canonical: algokit_utils.application_client.ApplicationClient.compose_update - -```{autodoc2-docstring} algokit_utils.application_client.ApplicationClient.compose_update -:parser: myst -``` - -```` - -````{py:method} create(call_abi_method: algokit_utils.models.ABIMethod | bool | None = None, transaction_parameters: algokit_utils.models.CreateCallParameters | algokit_utils.models.CreateCallParametersDict | None = None, **abi_kwargs: algokit_utils.models.ABIArgType) -> algokit_utils.models.TransactionResponse | algokit_utils.models.ABITransactionResponse -:canonical: algokit_utils.application_client.ApplicationClient.create - -```{autodoc2-docstring} algokit_utils.application_client.ApplicationClient.create -:parser: myst -``` - -```` - -````{py:method} delete(call_abi_method: algokit_utils.models.ABIMethod | bool | None = None, transaction_parameters: algokit_utils.models.TransactionParameters | algokit_utils.models.TransactionParametersDict | None = None, **abi_kwargs: algokit_utils.models.ABIArgType) -> algokit_utils.models.TransactionResponse | algokit_utils.models.ABITransactionResponse -:canonical: algokit_utils.application_client.ApplicationClient.delete - -```{autodoc2-docstring} algokit_utils.application_client.ApplicationClient.delete -:parser: myst -``` - -```` - -````{py:method} deploy(version: str | None = None, *, signer: algosdk.atomic_transaction_composer.TransactionSigner | None = None, sender: str | None = None, allow_update: bool | None = None, allow_delete: bool | None = None, on_update: algokit_utils.deploy.OnUpdate = au_deploy.OnUpdate.Fail, on_schema_break: algokit_utils.deploy.OnSchemaBreak = au_deploy.OnSchemaBreak.Fail, template_values: algokit_utils.deploy.TemplateValueMapping | None = None, create_args: algokit_utils.deploy.ABICreateCallArgs | algokit_utils.deploy.ABICreateCallArgsDict | algokit_utils.deploy.DeployCreateCallArgs | None = None, update_args: algokit_utils.deploy.ABICallArgs | algokit_utils.deploy.ABICallArgsDict | algokit_utils.deploy.DeployCallArgs | None = None, delete_args: algokit_utils.deploy.ABICallArgs | algokit_utils.deploy.ABICallArgsDict | algokit_utils.deploy.DeployCallArgs | None = None) -> algokit_utils.deploy.DeployResponse -:canonical: algokit_utils.application_client.ApplicationClient.deploy - -```{autodoc2-docstring} algokit_utils.application_client.ApplicationClient.deploy -:parser: myst -``` - -```` - -````{py:method} export_source_map() -> str | None -:canonical: algokit_utils.application_client.ApplicationClient.export_source_map - -```{autodoc2-docstring} algokit_utils.application_client.ApplicationClient.export_source_map -:parser: myst -``` - -```` - -````{py:method} get_global_state(*, raw: bool = False) -> dict[bytes | str, bytes | str | int] -:canonical: algokit_utils.application_client.ApplicationClient.get_global_state - -```{autodoc2-docstring} algokit_utils.application_client.ApplicationClient.get_global_state -:parser: myst -``` - -```` - -````{py:method} get_local_state(account: str | None = None, *, raw: bool = False) -> dict[bytes | str, bytes | str | int] -:canonical: algokit_utils.application_client.ApplicationClient.get_local_state - -```{autodoc2-docstring} algokit_utils.application_client.ApplicationClient.get_local_state -:parser: myst -``` - -```` - -````{py:method} get_signer_sender(signer: algosdk.atomic_transaction_composer.TransactionSigner | None = None, sender: str | None = None) -> tuple[algosdk.atomic_transaction_composer.TransactionSigner | None, str | None] -:canonical: algokit_utils.application_client.ApplicationClient.get_signer_sender - -```{autodoc2-docstring} algokit_utils.application_client.ApplicationClient.get_signer_sender -:parser: myst -``` - -```` - -````{py:method} import_source_map(source_map_json: str) -> None -:canonical: algokit_utils.application_client.ApplicationClient.import_source_map - -```{autodoc2-docstring} algokit_utils.application_client.ApplicationClient.import_source_map -:parser: myst -``` - -```` - -````{py:method} opt_in(call_abi_method: algokit_utils.models.ABIMethod | bool | None = None, transaction_parameters: algokit_utils.models.TransactionParameters | algokit_utils.models.TransactionParametersDict | None = None, **abi_kwargs: algokit_utils.models.ABIArgType) -> algokit_utils.models.TransactionResponse | algokit_utils.models.ABITransactionResponse -:canonical: algokit_utils.application_client.ApplicationClient.opt_in - -```{autodoc2-docstring} algokit_utils.application_client.ApplicationClient.opt_in -:parser: myst -``` - -```` - -````{py:method} prepare(signer: algosdk.atomic_transaction_composer.TransactionSigner | algokit_utils.models.Account | None = None, sender: str | None = None, app_id: int | None = None, template_values: algokit_utils.deploy.TemplateValueDict | None = None) -> algokit_utils.application_client.ApplicationClient -:canonical: algokit_utils.application_client.ApplicationClient.prepare - -```{autodoc2-docstring} algokit_utils.application_client.ApplicationClient.prepare -:parser: myst -``` - -```` - -````{py:method} resolve(to_resolve: algokit_utils.application_specification.DefaultArgumentDict) -> int | str | bytes -:canonical: algokit_utils.application_client.ApplicationClient.resolve - -```{autodoc2-docstring} algokit_utils.application_client.ApplicationClient.resolve -:parser: myst -``` - -```` - -````{py:method} resolve_signer_sender(signer: algosdk.atomic_transaction_composer.TransactionSigner | None = None, sender: str | None = None) -> tuple[algosdk.atomic_transaction_composer.TransactionSigner, str] -:canonical: algokit_utils.application_client.ApplicationClient.resolve_signer_sender - -```{autodoc2-docstring} algokit_utils.application_client.ApplicationClient.resolve_signer_sender -:parser: myst -``` - -```` - -````{py:method} update(call_abi_method: algokit_utils.models.ABIMethod | bool | None = None, transaction_parameters: algokit_utils.models.TransactionParameters | algokit_utils.models.TransactionParametersDict | None = None, **abi_kwargs: algokit_utils.models.ABIArgType) -> algokit_utils.models.TransactionResponse | algokit_utils.models.ABITransactionResponse -:canonical: algokit_utils.application_client.ApplicationClient.update - -```{autodoc2-docstring} algokit_utils.application_client.ApplicationClient.update -:parser: myst -``` - -```` - -````` - - -`````{py:class} ApplicationSpecification -:canonical: algokit_utils.application_specification.ApplicationSpecification - -```{autodoc2-docstring} algokit_utils.application_specification.ApplicationSpecification -:parser: myst -``` - -````{py:method} export(directory: pathlib.Path | str | None = None) -> None -:canonical: algokit_utils.application_specification.ApplicationSpecification.export - -```{autodoc2-docstring} algokit_utils.application_specification.ApplicationSpecification.export -:parser: myst -``` - -```` - -````` - - -`````{py:class} CallConfig() -:canonical: algokit_utils.application_specification.CallConfig - -Bases: {py:obj}`enum.IntFlag` - -```{autodoc2-docstring} algokit_utils.application_specification.CallConfig -:parser: myst -``` - -```{rubric} Initialization -``` - -```{autodoc2-docstring} algokit_utils.application_specification.CallConfig.__init__ -:parser: myst -``` - -````{py:attribute} ALL -:canonical: algokit_utils.application_specification.CallConfig.ALL -:value: > - 3 - -```{autodoc2-docstring} algokit_utils.application_specification.CallConfig.ALL -:parser: myst -``` - -```` - -````{py:attribute} CALL -:canonical: algokit_utils.application_specification.CallConfig.CALL -:value: > - 1 - -```{autodoc2-docstring} algokit_utils.application_specification.CallConfig.CALL -:parser: myst -``` - -```` - -````{py:attribute} CREATE -:canonical: algokit_utils.application_specification.CallConfig.CREATE -:value: > - 2 - -```{autodoc2-docstring} algokit_utils.application_specification.CallConfig.CREATE -:parser: myst -``` - -```` - -````{py:attribute} NEVER -:canonical: algokit_utils.application_specification.CallConfig.NEVER -:value: > - 0 - -```{autodoc2-docstring} algokit_utils.application_specification.CallConfig.NEVER -:parser: myst -``` - -```` - -````` - - -````{py:class} CreateCallParameters -:canonical: algokit_utils.models.CreateCallParameters - -Bases: {py:obj}`algokit_utils.models.OnCompleteCallParameters` - -```{autodoc2-docstring} algokit_utils.models.CreateCallParameters -:parser: myst -``` - -```` - - -````{py:class} CreateCallParametersDict() -:canonical: algokit_utils.models.CreateCallParametersDict - -Bases: {py:obj}`typing.TypedDict`, {py:obj}`algokit_utils.models.OnCompleteCallParametersDict` - -```{autodoc2-docstring} algokit_utils.models.CreateCallParametersDict -:parser: myst -``` - -```{rubric} Initialization -``` - -```{autodoc2-docstring} algokit_utils.models.CreateCallParametersDict.__init__ -:parser: myst -``` - -```` - - -````{py:class} CreateTransactionParameters -:canonical: algokit_utils.models.CreateTransactionParameters - -Bases: {py:obj}`algokit_utils.models.TransactionParameters` - -```{autodoc2-docstring} algokit_utils.models.CreateTransactionParameters -:parser: myst -``` - -```` - - -````{py:class} DefaultArgumentDict() -:canonical: algokit_utils.application_specification.DefaultArgumentDict - -Bases: {py:obj}`typing.TypedDict` - -```{autodoc2-docstring} algokit_utils.application_specification.DefaultArgumentDict -:parser: myst -``` - -```{rubric} Initialization -``` - -```{autodoc2-docstring} algokit_utils.application_specification.DefaultArgumentDict.__init__ -:parser: myst -``` - -```` - - -````{py:class} DeployCallArgs -:canonical: algokit_utils.deploy.DeployCallArgs - -```{autodoc2-docstring} algokit_utils.deploy.DeployCallArgs -:parser: myst -``` - -```` - - -````{py:class} DeployCallArgsDict() -:canonical: algokit_utils.deploy.DeployCallArgsDict - -Bases: {py:obj}`typing.TypedDict` - -```{autodoc2-docstring} algokit_utils.deploy.DeployCallArgsDict -:parser: myst -``` - -```{rubric} Initialization -``` - -```{autodoc2-docstring} algokit_utils.deploy.DeployCallArgsDict.__init__ -:parser: myst -``` - -```` - - -````{py:class} DeployCreateCallArgs -:canonical: algokit_utils.deploy.DeployCreateCallArgs - -Bases: {py:obj}`algokit_utils.deploy.DeployCallArgs` - -```{autodoc2-docstring} algokit_utils.deploy.DeployCreateCallArgs -:parser: myst -``` - -```` - - -````{py:class} DeployCreateCallArgsDict() -:canonical: algokit_utils.deploy.DeployCreateCallArgsDict - -Bases: {py:obj}`algokit_utils.deploy.DeployCallArgsDict`, {py:obj}`typing.TypedDict` - -```{autodoc2-docstring} algokit_utils.deploy.DeployCreateCallArgsDict -:parser: myst -``` - -```{rubric} Initialization -``` - -```{autodoc2-docstring} algokit_utils.deploy.DeployCreateCallArgsDict.__init__ -:parser: myst -``` - -```` - - -````{py:class} DeployResponse -:canonical: algokit_utils.deploy.DeployResponse - -```{autodoc2-docstring} algokit_utils.deploy.DeployResponse -:parser: myst -``` - -```` - - -`````{py:class} EnsureBalanceParameters -:canonical: algokit_utils._ensure_funded.EnsureBalanceParameters - -```{autodoc2-docstring} algokit_utils._ensure_funded.EnsureBalanceParameters -:parser: myst -``` - -````{py:attribute} account_to_fund -:canonical: algokit_utils._ensure_funded.EnsureBalanceParameters.account_to_fund -:type: algokit_utils.models.Account | algosdk.atomic_transaction_composer.AccountTransactionSigner | str -:value: > - None - -```{autodoc2-docstring} algokit_utils._ensure_funded.EnsureBalanceParameters.account_to_fund -:parser: myst -``` - -```` - -````{py:attribute} fee_micro_algos -:canonical: algokit_utils._ensure_funded.EnsureBalanceParameters.fee_micro_algos -:type: int | None -:value: > - None - -```{autodoc2-docstring} algokit_utils._ensure_funded.EnsureBalanceParameters.fee_micro_algos -:parser: myst -``` - -```` - -````{py:attribute} funding_source -:canonical: algokit_utils._ensure_funded.EnsureBalanceParameters.funding_source -:type: algokit_utils.models.Account | algosdk.atomic_transaction_composer.AccountTransactionSigner | algokit_utils.dispenser_api.TestNetDispenserApiClient | None -:value: > - None - -```{autodoc2-docstring} algokit_utils._ensure_funded.EnsureBalanceParameters.funding_source -:parser: myst -``` - -```` - -````{py:attribute} max_fee_micro_algos -:canonical: algokit_utils._ensure_funded.EnsureBalanceParameters.max_fee_micro_algos -:type: int | None -:value: > - None - -```{autodoc2-docstring} algokit_utils._ensure_funded.EnsureBalanceParameters.max_fee_micro_algos -:parser: myst -``` - -```` - -````{py:attribute} min_funding_increment_micro_algos -:canonical: algokit_utils._ensure_funded.EnsureBalanceParameters.min_funding_increment_micro_algos -:type: int -:value: > - 0 - -```{autodoc2-docstring} algokit_utils._ensure_funded.EnsureBalanceParameters.min_funding_increment_micro_algos -:parser: myst -``` - -```` - -````{py:attribute} min_spending_balance_micro_algos -:canonical: algokit_utils._ensure_funded.EnsureBalanceParameters.min_spending_balance_micro_algos -:type: int -:value: > - None - -```{autodoc2-docstring} algokit_utils._ensure_funded.EnsureBalanceParameters.min_spending_balance_micro_algos -:parser: myst -``` - -```` - -````{py:attribute} note -:canonical: algokit_utils._ensure_funded.EnsureBalanceParameters.note -:type: str | bytes | None -:value: > - None - -```{autodoc2-docstring} algokit_utils._ensure_funded.EnsureBalanceParameters.note -:parser: myst -``` - -```` - -````{py:attribute} suggested_params -:canonical: algokit_utils._ensure_funded.EnsureBalanceParameters.suggested_params -:type: algosdk.transaction.SuggestedParams | None -:value: > - None - -```{autodoc2-docstring} algokit_utils._ensure_funded.EnsureBalanceParameters.suggested_params -:parser: myst -``` - -```` - -````` - - -`````{py:class} EnsureFundedResponse -:canonical: algokit_utils._ensure_funded.EnsureFundedResponse - -```{autodoc2-docstring} algokit_utils._ensure_funded.EnsureFundedResponse -:parser: myst -``` - -````{py:attribute} transaction_id -:canonical: algokit_utils._ensure_funded.EnsureFundedResponse.transaction_id -:type: str -:value: > - None - -```{autodoc2-docstring} algokit_utils._ensure_funded.EnsureFundedResponse.transaction_id -:parser: myst -``` - -```` - -````` - - -````{py:class} MethodHints -:canonical: algokit_utils.application_specification.MethodHints - -```{autodoc2-docstring} algokit_utils.application_specification.MethodHints -:parser: myst -``` - -```` - - -````{py:class} OnCompleteCallParameters -:canonical: algokit_utils.models.OnCompleteCallParameters - -Bases: {py:obj}`algokit_utils.models.TransactionParameters` - -```{autodoc2-docstring} algokit_utils.models.OnCompleteCallParameters -:parser: myst -``` - -```` - - -````{py:class} OnCompleteCallParametersDict() -:canonical: algokit_utils.models.OnCompleteCallParametersDict - -Bases: {py:obj}`typing.TypedDict`, {py:obj}`algokit_utils.models.TransactionParametersDict` - -```{autodoc2-docstring} algokit_utils.models.OnCompleteCallParametersDict -:parser: myst -``` - -```{rubric} Initialization -``` - -```{autodoc2-docstring} algokit_utils.models.OnCompleteCallParametersDict.__init__ -:parser: myst -``` - -```` - - -`````{py:class} OnSchemaBreak(*args, **kwds) -:canonical: algokit_utils.deploy.OnSchemaBreak - -Bases: {py:obj}`enum.Enum` - -```{autodoc2-docstring} algokit_utils.deploy.OnSchemaBreak -:parser: myst -``` - -```{rubric} Initialization -``` - -```{autodoc2-docstring} algokit_utils.deploy.OnSchemaBreak.__init__ -:parser: myst -``` - -````{py:attribute} AppendApp -:canonical: algokit_utils.deploy.OnSchemaBreak.AppendApp -:value: > - 3 - -```{autodoc2-docstring} algokit_utils.deploy.OnSchemaBreak.AppendApp -:parser: myst -``` - -```` - -````{py:attribute} Fail -:canonical: algokit_utils.deploy.OnSchemaBreak.Fail -:value: > - 0 - -```{autodoc2-docstring} algokit_utils.deploy.OnSchemaBreak.Fail -:parser: myst -``` - -```` - -````{py:attribute} ReplaceApp -:canonical: algokit_utils.deploy.OnSchemaBreak.ReplaceApp -:value: > - 2 - -```{autodoc2-docstring} algokit_utils.deploy.OnSchemaBreak.ReplaceApp -:parser: myst -``` - -```` - -````` - - -`````{py:class} OnUpdate(*args, **kwds) -:canonical: algokit_utils.deploy.OnUpdate - -Bases: {py:obj}`enum.Enum` - -```{autodoc2-docstring} algokit_utils.deploy.OnUpdate -:parser: myst -``` - -```{rubric} Initialization -``` - -```{autodoc2-docstring} algokit_utils.deploy.OnUpdate.__init__ -:parser: myst -``` - -````{py:attribute} AppendApp -:canonical: algokit_utils.deploy.OnUpdate.AppendApp -:value: > - 3 - -```{autodoc2-docstring} algokit_utils.deploy.OnUpdate.AppendApp -:parser: myst -``` - -```` - -````{py:attribute} Fail -:canonical: algokit_utils.deploy.OnUpdate.Fail -:value: > - 0 - -```{autodoc2-docstring} algokit_utils.deploy.OnUpdate.Fail -:parser: myst -``` - -```` - -````{py:attribute} ReplaceApp -:canonical: algokit_utils.deploy.OnUpdate.ReplaceApp -:value: > - 2 - -```{autodoc2-docstring} algokit_utils.deploy.OnUpdate.ReplaceApp -:parser: myst -``` - -```` - -````{py:attribute} UpdateApp -:canonical: algokit_utils.deploy.OnUpdate.UpdateApp -:value: > - 1 - -```{autodoc2-docstring} algokit_utils.deploy.OnUpdate.UpdateApp -:parser: myst -``` - -```` - -````` - - -`````{py:class} OperationPerformed(*args, **kwds) -:canonical: algokit_utils.deploy.OperationPerformed - -Bases: {py:obj}`enum.Enum` - -```{autodoc2-docstring} algokit_utils.deploy.OperationPerformed -:parser: myst -``` - -```{rubric} Initialization -``` - -```{autodoc2-docstring} algokit_utils.deploy.OperationPerformed.__init__ -:parser: myst -``` - -````{py:attribute} Create -:canonical: algokit_utils.deploy.OperationPerformed.Create -:value: > - 1 - -```{autodoc2-docstring} algokit_utils.deploy.OperationPerformed.Create -:parser: myst -``` - -```` - -````{py:attribute} Nothing -:canonical: algokit_utils.deploy.OperationPerformed.Nothing -:value: > - 0 - -```{autodoc2-docstring} algokit_utils.deploy.OperationPerformed.Nothing -:parser: myst -``` - -```` - -````{py:attribute} Replace -:canonical: algokit_utils.deploy.OperationPerformed.Replace -:value: > - 3 - -```{autodoc2-docstring} algokit_utils.deploy.OperationPerformed.Replace -:parser: myst -``` - -```` - -````{py:attribute} Update -:canonical: algokit_utils.deploy.OperationPerformed.Update -:value: > - 2 - -```{autodoc2-docstring} algokit_utils.deploy.OperationPerformed.Update -:parser: myst -``` - -```` - -````` - - -````{py:class} Program(program: str, client: algosdk.v2client.algod.AlgodClient) -:canonical: algokit_utils.common.Program - -```{autodoc2-docstring} algokit_utils.common.Program -:parser: myst -``` - -```{rubric} Initialization -``` - -```{autodoc2-docstring} algokit_utils.common.Program.__init__ -:parser: myst -``` - -```` - - -`````{py:class} TestNetDispenserApiClient(auth_token: str | None = None, request_timeout: int = DISPENSER_REQUEST_TIMEOUT) -:canonical: algokit_utils.dispenser_api.TestNetDispenserApiClient - -```{autodoc2-docstring} algokit_utils.dispenser_api.TestNetDispenserApiClient -:parser: myst -``` - -```{rubric} Initialization -``` - -```{autodoc2-docstring} algokit_utils.dispenser_api.TestNetDispenserApiClient.__init__ -:parser: myst -``` - -````{py:method} fund(address: str, amount: int, asset_id: int) -> algokit_utils.dispenser_api.DispenserFundResponse -:canonical: algokit_utils.dispenser_api.TestNetDispenserApiClient.fund - -```{autodoc2-docstring} algokit_utils.dispenser_api.TestNetDispenserApiClient.fund -:parser: myst -``` - -```` - -````{py:method} get_limit(address: str) -> algokit_utils.dispenser_api.DispenserLimitResponse -:canonical: algokit_utils.dispenser_api.TestNetDispenserApiClient.get_limit - -```{autodoc2-docstring} algokit_utils.dispenser_api.TestNetDispenserApiClient.get_limit -:parser: myst -``` - -```` - -````{py:method} refund(refund_txn_id: str) -> None -:canonical: algokit_utils.dispenser_api.TestNetDispenserApiClient.refund - -```{autodoc2-docstring} algokit_utils.dispenser_api.TestNetDispenserApiClient.refund -:parser: myst -``` - -```` - -````` - - -`````{py:class} TransactionParameters -:canonical: algokit_utils.models.TransactionParameters - -```{autodoc2-docstring} algokit_utils.models.TransactionParameters -:parser: myst -``` - -````{py:attribute} accounts -:canonical: algokit_utils.models.TransactionParameters.accounts -:type: list[str] | None -:value: > - None - -```{autodoc2-docstring} algokit_utils.models.TransactionParameters.accounts -:parser: myst -``` - -```` - -````{py:attribute} boxes -:canonical: algokit_utils.models.TransactionParameters.boxes -:type: collections.abc.Sequence[tuple[int, bytes | bytearray | str | int]] | None -:value: > - None - -```{autodoc2-docstring} algokit_utils.models.TransactionParameters.boxes -:parser: myst -``` - -```` - -````{py:attribute} foreign_apps -:canonical: algokit_utils.models.TransactionParameters.foreign_apps -:type: list[int] | None -:value: > - None - -```{autodoc2-docstring} algokit_utils.models.TransactionParameters.foreign_apps -:parser: myst -``` - -```` - -````{py:attribute} foreign_assets -:canonical: algokit_utils.models.TransactionParameters.foreign_assets -:type: list[int] | None -:value: > - None - -```{autodoc2-docstring} algokit_utils.models.TransactionParameters.foreign_assets -:parser: myst -``` - -```` - -````{py:attribute} lease -:canonical: algokit_utils.models.TransactionParameters.lease -:type: bytes | str | None -:value: > - None - -```{autodoc2-docstring} algokit_utils.models.TransactionParameters.lease -:parser: myst -``` - -```` - -````{py:attribute} note -:canonical: algokit_utils.models.TransactionParameters.note -:type: bytes | str | None -:value: > - None - -```{autodoc2-docstring} algokit_utils.models.TransactionParameters.note -:parser: myst -``` - -```` - -````{py:attribute} rekey_to -:canonical: algokit_utils.models.TransactionParameters.rekey_to -:type: str | None -:value: > - None - -```{autodoc2-docstring} algokit_utils.models.TransactionParameters.rekey_to -:parser: myst -``` - -```` - -````{py:attribute} sender -:canonical: algokit_utils.models.TransactionParameters.sender -:type: str | None -:value: > - None - -```{autodoc2-docstring} algokit_utils.models.TransactionParameters.sender -:parser: myst -``` - -```` - -````{py:attribute} signer -:canonical: algokit_utils.models.TransactionParameters.signer -:type: algosdk.atomic_transaction_composer.TransactionSigner | None -:value: > - None - -```{autodoc2-docstring} algokit_utils.models.TransactionParameters.signer -:parser: myst -``` - -```` - -````{py:attribute} suggested_params -:canonical: algokit_utils.models.TransactionParameters.suggested_params -:type: algosdk.transaction.SuggestedParams | None -:value: > - None - -```{autodoc2-docstring} algokit_utils.models.TransactionParameters.suggested_params -:parser: myst -``` - -```` - -````` - - -`````{py:class} TransactionParametersDict() -:canonical: algokit_utils.models.TransactionParametersDict - -Bases: {py:obj}`typing.TypedDict` - -```{autodoc2-docstring} algokit_utils.models.TransactionParametersDict -:parser: myst -``` - -```{rubric} Initialization -``` - -```{autodoc2-docstring} algokit_utils.models.TransactionParametersDict.__init__ -:parser: myst -``` - -````{py:attribute} accounts -:canonical: algokit_utils.models.TransactionParametersDict.accounts -:type: list[str] -:value: > - None - -```{autodoc2-docstring} algokit_utils.models.TransactionParametersDict.accounts -:parser: myst -``` - -```` - -````{py:attribute} boxes -:canonical: algokit_utils.models.TransactionParametersDict.boxes -:type: collections.abc.Sequence[tuple[int, bytes | bytearray | str | int]] -:value: > - None - -```{autodoc2-docstring} algokit_utils.models.TransactionParametersDict.boxes -:parser: myst -``` - -```` - -````{py:attribute} foreign_apps -:canonical: algokit_utils.models.TransactionParametersDict.foreign_apps -:type: list[int] -:value: > - None - -```{autodoc2-docstring} algokit_utils.models.TransactionParametersDict.foreign_apps -:parser: myst -``` - -```` - -````{py:attribute} foreign_assets -:canonical: algokit_utils.models.TransactionParametersDict.foreign_assets -:type: list[int] -:value: > - None - -```{autodoc2-docstring} algokit_utils.models.TransactionParametersDict.foreign_assets -:parser: myst -``` - -```` - -````{py:attribute} lease -:canonical: algokit_utils.models.TransactionParametersDict.lease -:type: bytes | str -:value: > - None - -```{autodoc2-docstring} algokit_utils.models.TransactionParametersDict.lease -:parser: myst -``` - -```` - -````{py:attribute} note -:canonical: algokit_utils.models.TransactionParametersDict.note -:type: bytes | str -:value: > - None - -```{autodoc2-docstring} algokit_utils.models.TransactionParametersDict.note -:parser: myst -``` - -```` - -````{py:attribute} rekey_to -:canonical: algokit_utils.models.TransactionParametersDict.rekey_to -:type: str -:value: > - None - -```{autodoc2-docstring} algokit_utils.models.TransactionParametersDict.rekey_to -:parser: myst -``` - -```` - -````{py:attribute} sender -:canonical: algokit_utils.models.TransactionParametersDict.sender -:type: str -:value: > - None - -```{autodoc2-docstring} algokit_utils.models.TransactionParametersDict.sender -:parser: myst -``` - -```` - -````{py:attribute} signer -:canonical: algokit_utils.models.TransactionParametersDict.signer -:type: algosdk.atomic_transaction_composer.TransactionSigner -:value: > - None - -```{autodoc2-docstring} algokit_utils.models.TransactionParametersDict.signer -:parser: myst -``` - -```` - -````{py:attribute} suggested_params -:canonical: algokit_utils.models.TransactionParametersDict.suggested_params -:type: algosdk.transaction.SuggestedParams -:value: > - None - -```{autodoc2-docstring} algokit_utils.models.TransactionParametersDict.suggested_params -:parser: myst -``` - -```` - -````` - - -`````{py:class} TransactionResponse -:canonical: algokit_utils.models.TransactionResponse - -```{autodoc2-docstring} algokit_utils.models.TransactionResponse -:parser: myst -``` - -````{py:attribute} confirmed_round -:canonical: algokit_utils.models.TransactionResponse.confirmed_round -:type: int | None -:value: > - None - -```{autodoc2-docstring} algokit_utils.models.TransactionResponse.confirmed_round -:parser: myst -``` - -```` - -````{py:method} from_atr(result: algosdk.atomic_transaction_composer.AtomicTransactionResponse | algosdk.atomic_transaction_composer.SimulateAtomicTransactionResponse, transaction_index: int = -1) -> algokit_utils.models.TransactionResponse -:canonical: algokit_utils.models.TransactionResponse.from_atr -:staticmethod: - -```{autodoc2-docstring} algokit_utils.models.TransactionResponse.from_atr -:parser: myst -``` - -```` - -````{py:attribute} tx_id -:canonical: algokit_utils.models.TransactionResponse.tx_id -:type: str -:value: > - None - -```{autodoc2-docstring} algokit_utils.models.TransactionResponse.tx_id -:parser: myst -``` - -```` - -````` - - -````{py:class} TransferAssetParameters -:canonical: algokit_utils._transfer.TransferAssetParameters - -Bases: {py:obj}`algokit_utils._transfer.TransferParametersBase` - -```{autodoc2-docstring} algokit_utils._transfer.TransferAssetParameters -:parser: myst -``` - -```` - - -````{py:class} TransferParameters -:canonical: algokit_utils._transfer.TransferParameters - -Bases: {py:obj}`algokit_utils._transfer.TransferParametersBase` - -```{autodoc2-docstring} algokit_utils._transfer.TransferParameters -:parser: myst -``` - -```` - - -## Functions - -````{py:function} create_kmd_wallet_account(kmd_client: algosdk.kmd.KMDClient, name: str) -> algokit_utils.models.Account -:canonical: algokit_utils.account.create_kmd_wallet_account - -```{autodoc2-docstring} algokit_utils.account.create_kmd_wallet_account -:parser: myst -``` -```` - - -````{py:function} ensure_funded(client: algosdk.v2client.algod.AlgodClient, parameters: algokit_utils._ensure_funded.EnsureBalanceParameters) -> algokit_utils._ensure_funded.EnsureFundedResponse | None -:canonical: algokit_utils._ensure_funded.ensure_funded - -```{autodoc2-docstring} algokit_utils._ensure_funded.ensure_funded -:parser: myst -``` -```` - - -````{py:function} execute_atc_with_logic_error(atc: algosdk.atomic_transaction_composer.AtomicTransactionComposer, algod_client: algosdk.v2client.algod.AlgodClient, approval_program: str, wait_rounds: int = 4, approval_source_map: algosdk.source_map.SourceMap | typing.Callable[[], algosdk.source_map.SourceMap | None] | None = None) -> algosdk.atomic_transaction_composer.AtomicTransactionResponse -:canonical: algokit_utils.application_client.execute_atc_with_logic_error - -```{autodoc2-docstring} algokit_utils.application_client.execute_atc_with_logic_error -:parser: myst -``` -```` - - -````{py:function} get_account(client: algosdk.v2client.algod.AlgodClient, name: str, fund_with_algos: float = 1000, kmd_client: KMDClient | None = None) -> algokit_utils.models.Account -:canonical: algokit_utils.account.get_account - -```{autodoc2-docstring} algokit_utils.account.get_account -:parser: myst -``` -```` - - -````{py:function} get_account_from_mnemonic(mnemonic: str) -> algokit_utils.models.Account -:canonical: algokit_utils.account.get_account_from_mnemonic - -```{autodoc2-docstring} algokit_utils.account.get_account_from_mnemonic -:parser: myst -``` -```` - - -````{py:function} get_algod_client(config: algokit_utils.network_clients.AlgoClientConfig | None = None) -> algosdk.v2client.algod.AlgodClient -:canonical: algokit_utils.network_clients.get_algod_client - -```{autodoc2-docstring} algokit_utils.network_clients.get_algod_client -:parser: myst -``` -```` - - -````{py:function} get_app_id_from_tx_id(algod_client: algosdk.v2client.algod.AlgodClient, tx_id: str) -> int -:canonical: algokit_utils.deploy.get_app_id_from_tx_id - -```{autodoc2-docstring} algokit_utils.deploy.get_app_id_from_tx_id -:parser: myst -``` -```` - - -````{py:function} get_creator_apps(indexer: algosdk.v2client.indexer.IndexerClient, creator_account: algokit_utils.models.Account | str) -> algokit_utils.deploy.AppLookup -:canonical: algokit_utils.deploy.get_creator_apps - -```{autodoc2-docstring} algokit_utils.deploy.get_creator_apps -:parser: myst -``` -```` - - -````{py:function} get_default_localnet_config(config: typing.Literal[algod, indexer, kmd]) -> algokit_utils.network_clients.AlgoClientConfig -:canonical: algokit_utils.network_clients.get_default_localnet_config - -```{autodoc2-docstring} algokit_utils.network_clients.get_default_localnet_config -:parser: myst -``` -```` - - -````{py:function} get_dispenser_account(client: algosdk.v2client.algod.AlgodClient) -> algokit_utils.models.Account -:canonical: algokit_utils.account.get_dispenser_account - -```{autodoc2-docstring} algokit_utils.account.get_dispenser_account -:parser: myst -``` -```` - - -````{py:function} get_indexer_client(config: algokit_utils.network_clients.AlgoClientConfig | None = None) -> algosdk.v2client.indexer.IndexerClient -:canonical: algokit_utils.network_clients.get_indexer_client - -```{autodoc2-docstring} algokit_utils.network_clients.get_indexer_client -:parser: myst -``` -```` - - -````{py:function} get_kmd_client_from_algod_client(client: algosdk.v2client.algod.AlgodClient) -> algosdk.kmd.KMDClient -:canonical: algokit_utils.network_clients.get_kmd_client_from_algod_client - -```{autodoc2-docstring} algokit_utils.network_clients.get_kmd_client_from_algod_client -:parser: myst -``` -```` - - -````{py:function} get_kmd_wallet_account(client: algosdk.v2client.algod.AlgodClient, kmd_client: algosdk.kmd.KMDClient, name: str, predicate: Callable[[dict[str, Any]], bool] | None = None) -> algokit_utils.models.Account | None -:canonical: algokit_utils.account.get_kmd_wallet_account - -```{autodoc2-docstring} algokit_utils.account.get_kmd_wallet_account -:parser: myst -``` -```` - - -````{py:function} get_localnet_default_account(client: algosdk.v2client.algod.AlgodClient) -> algokit_utils.models.Account -:canonical: algokit_utils.account.get_localnet_default_account - -```{autodoc2-docstring} algokit_utils.account.get_localnet_default_account -:parser: myst -``` -```` - - -````{py:function} get_next_version(current_version: str) -> str -:canonical: algokit_utils.application_client.get_next_version - -```{autodoc2-docstring} algokit_utils.application_client.get_next_version -:parser: myst -``` -```` - - -````{py:function} get_or_create_kmd_wallet_account(client: algosdk.v2client.algod.AlgodClient, name: str, fund_with_algos: float = 1000, kmd_client: KMDClient | None = None) -> algokit_utils.models.Account -:canonical: algokit_utils.account.get_or_create_kmd_wallet_account - -```{autodoc2-docstring} algokit_utils.account.get_or_create_kmd_wallet_account -:parser: myst -``` -```` - - -````{py:function} get_sender_from_signer(signer: algosdk.atomic_transaction_composer.TransactionSigner | None) -> str | None -:canonical: algokit_utils.application_client.get_sender_from_signer - -```{autodoc2-docstring} algokit_utils.application_client.get_sender_from_signer -:parser: myst -``` -```` - - -````{py:function} is_localnet(client: algosdk.v2client.algod.AlgodClient) -> bool -:canonical: algokit_utils.network_clients.is_localnet - -```{autodoc2-docstring} algokit_utils.network_clients.is_localnet -:parser: myst -``` -```` - - -````{py:function} is_mainnet(client: algosdk.v2client.algod.AlgodClient) -> bool -:canonical: algokit_utils.network_clients.is_mainnet - -```{autodoc2-docstring} algokit_utils.network_clients.is_mainnet -:parser: myst -``` -```` - - -````{py:function} is_testnet(client: algosdk.v2client.algod.AlgodClient) -> bool -:canonical: algokit_utils.network_clients.is_testnet - -```{autodoc2-docstring} algokit_utils.network_clients.is_testnet -:parser: myst -``` -```` - - -````{py:function} num_extra_program_pages(approval: bytes, clear: bytes) -> int -:canonical: algokit_utils.application_client.num_extra_program_pages - -```{autodoc2-docstring} algokit_utils.application_client.num_extra_program_pages -:parser: myst -``` -```` - - -````{py:function} opt_in(algod_client: algosdk.v2client.algod.AlgodClient, account: algokit_utils.models.Account, asset_ids: list[int]) -> dict[int, str] -:canonical: algokit_utils.asset.opt_in - -```{autodoc2-docstring} algokit_utils.asset.opt_in -:parser: myst -``` -```` - - -````{py:function} opt_out(algod_client: algosdk.v2client.algod.AlgodClient, account: algokit_utils.models.Account, asset_ids: list[int]) -> dict[int, str] -:canonical: algokit_utils.asset.opt_out - -```{autodoc2-docstring} algokit_utils.asset.opt_out -:parser: myst -``` -```` - - -````{py:function} persist_sourcemaps(*, sources: list[algokit_utils._debugging.PersistSourceMapInput], project_root: pathlib.Path, client: algosdk.v2client.algod.AlgodClient, with_sources: bool = True, persist_mappings: bool = False) -> None -:canonical: algokit_utils._debugging.persist_sourcemaps - -```{autodoc2-docstring} algokit_utils._debugging.persist_sourcemaps -:parser: myst -``` -```` - - -````{py:function} replace_template_variables(program: str, template_values: algokit_utils.deploy.TemplateValueMapping) -> str -:canonical: algokit_utils.deploy.replace_template_variables - -```{autodoc2-docstring} algokit_utils.deploy.replace_template_variables -:parser: myst -``` -```` - - -````{py:function} simulate_and_persist_response(atc: algosdk.atomic_transaction_composer.AtomicTransactionComposer, project_root: pathlib.Path, algod_client: algosdk.v2client.algod.AlgodClient, buffer_size_mb: float = 256) -> algosdk.atomic_transaction_composer.SimulateAtomicTransactionResponse -:canonical: algokit_utils._debugging.simulate_and_persist_response - -```{autodoc2-docstring} algokit_utils._debugging.simulate_and_persist_response -:parser: myst -``` -```` - - -````{py:function} transfer(client: algosdk.v2client.algod.AlgodClient, parameters: algokit_utils._transfer.TransferParameters) -> algosdk.transaction.PaymentTxn -:canonical: algokit_utils._transfer.transfer - -```{autodoc2-docstring} algokit_utils._transfer.transfer -:parser: myst -``` -```` - - -````{py:function} transfer_asset(client: algosdk.v2client.algod.AlgodClient, parameters: algokit_utils._transfer.TransferAssetParameters) -> algosdk.transaction.AssetTransferTxn -:canonical: algokit_utils._transfer.transfer_asset - -```{autodoc2-docstring} algokit_utils._transfer.transfer_asset -:parser: myst -``` -```` - diff --git a/docs/html/_sources/autoapi/algokit_utils/accounts/account_manager/index.rst.txt b/docs/html/_sources/autoapi/algokit_utils/accounts/account_manager/index.rst.txt new file mode 100644 index 00000000..05c5db16 --- /dev/null +++ b/docs/html/_sources/autoapi/algokit_utils/accounts/account_manager/index.rst.txt @@ -0,0 +1,743 @@ +algokit_utils.accounts.account_manager +====================================== + +.. py:module:: algokit_utils.accounts.account_manager + + +Classes +------- + +.. autoapisummary:: + + algokit_utils.accounts.account_manager.EnsureFundedResult + algokit_utils.accounts.account_manager.EnsureFundedFromTestnetDispenserApiResult + algokit_utils.accounts.account_manager.AccountInformation + algokit_utils.accounts.account_manager.AccountManager + + +Module Contents +--------------- + +.. py:class:: EnsureFundedResult + + Bases: :py:obj:`algokit_utils.transactions.transaction_sender.SendSingleTransactionResult`, :py:obj:`_CommonEnsureFundedParams` + + + Result from performing an ensure funded call. + + +.. py:class:: EnsureFundedFromTestnetDispenserApiResult + + Bases: :py:obj:`_CommonEnsureFundedParams` + + + Result from performing an ensure funded call using TestNet dispenser API. + + +.. py:class:: AccountInformation + + Information about an Algorand account's current status, balance and other properties. + + See `https://developer.algorand.org/docs/rest-apis/algod/#account` for detailed field descriptions. + + + .. py:attribute:: address + :type: str + + The account's address + + + + .. py:attribute:: amount + :type: algokit_utils.models.amount.AlgoAmount + + The account's current balance + + + + .. py:attribute:: amount_without_pending_rewards + :type: algokit_utils.models.amount.AlgoAmount + + The account's balance without the pending rewards + + + + .. py:attribute:: min_balance + :type: algokit_utils.models.amount.AlgoAmount + + The account's minimum required balance + + + + .. py:attribute:: pending_rewards + :type: algokit_utils.models.amount.AlgoAmount + + The amount of pending rewards + + + + .. py:attribute:: rewards + :type: algokit_utils.models.amount.AlgoAmount + + The amount of rewards earned + + + + .. py:attribute:: round + :type: int + + The round for which this information is relevant + + + + .. py:attribute:: status + :type: str + + The account's status (e.g., 'Offline', 'Online') + + + + .. py:attribute:: total_apps_opted_in + :type: int | None + :value: None + + + Number of applications this account has opted into + + + + .. py:attribute:: total_assets_opted_in + :type: int | None + :value: None + + + Number of assets this account has opted into + + + + .. py:attribute:: total_box_bytes + :type: int | None + :value: None + + + Total number of box bytes used by this account + + + + .. py:attribute:: total_boxes + :type: int | None + :value: None + + + Total number of boxes used by this account + + + + .. py:attribute:: total_created_apps + :type: int | None + :value: None + + + Number of applications created by this account + + + + .. py:attribute:: total_created_assets + :type: int | None + :value: None + + + Number of assets created by this account + + + + .. py:attribute:: apps_local_state + :type: list[dict] | None + :value: None + + + Local state of applications this account has opted into + + + + .. py:attribute:: apps_total_extra_pages + :type: int | None + :value: None + + + Number of extra pages allocated to applications + + + + .. py:attribute:: apps_total_schema + :type: dict | None + :value: None + + + Total schema for all applications + + + + .. py:attribute:: assets + :type: list[dict] | None + :value: None + + + Assets held by this account + + + + .. py:attribute:: auth_addr + :type: str | None + :value: None + + + If rekeyed, the authorized address + + + + .. py:attribute:: closed_at_round + :type: int | None + :value: None + + + Round when this account was closed + + + + .. py:attribute:: created_apps + :type: list[dict] | None + :value: None + + + Applications created by this account + + + + .. py:attribute:: created_assets + :type: list[dict] | None + :value: None + + + Assets created by this account + + + + .. py:attribute:: created_at_round + :type: int | None + :value: None + + + Round when this account was created + + + + .. py:attribute:: deleted + :type: bool | None + :value: None + + + Whether this account is deleted + + + + .. py:attribute:: incentive_eligible + :type: bool | None + :value: None + + + Whether this account is eligible for incentives + + + + .. py:attribute:: last_heartbeat + :type: int | None + :value: None + + + Last heartbeat round for this account + + + + .. py:attribute:: last_proposed + :type: int | None + :value: None + + + Last round this account proposed a block + + + + .. py:attribute:: participation + :type: dict | None + :value: None + + + Participation information for this account + + + + .. py:attribute:: reward_base + :type: int | None + :value: None + + + Base reward for this account + + + + .. py:attribute:: sig_type + :type: str | None + :value: None + + + Signature type for this account + + + +.. py:class:: AccountManager(client_manager: algokit_utils.clients.client_manager.ClientManager) + + Creates and keeps track of signing accounts that can sign transactions for a sending address. + + This class provides functionality to create, track, and manage various types of accounts including + mnemonic-based, rekeyed, multisig, and logic signature accounts. + + :param client_manager: The ClientManager client to use for algod and kmd clients + + :example: + >>> account_manager = AccountManager(client_manager) + + + .. py:property:: kmd + :type: algokit_utils.accounts.kmd_account_manager.KmdAccountManager + + + KMD account manager that allows you to easily get and create accounts using KMD. + + :return KmdAccountManager: The 'KmdAccountManager' instance + :example: + >>> kmd_manager = account_manager.kmd + + + + .. py:method:: set_default_signer(signer: algosdk.atomic_transaction_composer.TransactionSigner | algokit_utils.protocols.account.TransactionSignerAccountProtocol) -> typing_extensions.Self + + Sets the default signer to use if no other signer is specified. + + If this isn't set and a transaction needs signing for a given sender + then an error will be thrown from `get_signer` / `get_account`. + + :param signer: A `TransactionSigner` signer to use. + :returns: The `AccountManager` so method calls can be chained + + :example: + >>> signer_account = account_manager.random() + >>> account_manager.set_default_signer(signer_account) + + + + .. py:method:: set_signer(sender: str, signer: algosdk.atomic_transaction_composer.TransactionSigner) -> typing_extensions.Self + + Tracks the given `TransactionSigner` against the given sender address for later signing. + + :param sender: The sender address to use this signer for + :param signer: The `TransactionSigner` to sign transactions with for the given sender + :returns: The `AccountManager` instance for method chaining + + :example: + >>> account_manager.set_signer("SENDERADDRESS", transaction_signer) + + + + .. py:method:: set_signers(*, another_account_manager: AccountManager, overwrite_existing: bool = True) -> typing_extensions.Self + + Merges the given `AccountManager` into this one. + + :param another_account_manager: The `AccountManager` to merge into this one + :param overwrite_existing: Whether to overwrite existing signers in this manager + :returns: The `AccountManager` instance for method chaining + + :example: + >>> accountManager2.set_signers(accountManager1) + + + + .. py:method:: set_signer_from_account(account: algokit_utils.protocols.account.TransactionSignerAccountProtocol) -> typing_extensions.Self + + Tracks the given account for later signing. + + Note: If you are generating accounts via the various methods on `AccountManager` + (like `random`, `from_mnemonic`, `logic_sig`, etc.) then they automatically get tracked. + + :param account: The account to register + :returns: The `AccountManager` instance for method chaining + + :example: + >>> account_manager = AccountManager(client_manager) + >>> account_manager.set_signer_from_account(SigningAccount(private_key=algosdk.account.generate_account()[0])) + >>> account_manager.set_signer_from_account(LogicSigAccount(AlgosdkLogicSigAccount(program, args))) + >>> account_manager.set_signer_from_account(MultiSigAccount(multisig_params, [account1, account2])) + + + + .. py:method:: get_signer(sender: str | algokit_utils.protocols.account.TransactionSignerAccountProtocol) -> algosdk.atomic_transaction_composer.TransactionSigner + + Returns the `TransactionSigner` for the given sender address. + + If no signer has been registered for that address then the default signer is used if registered. + + :param sender: The sender address or account + :returns: The `TransactionSigner` + :raises ValueError: If no signer is found and no default signer is set + + :example: + >>> signer = account_manager.get_signer("SENDERADDRESS") + + + + .. py:method:: get_account(sender: str) -> algokit_utils.protocols.account.TransactionSignerAccountProtocol + + Returns the `TransactionSignerAccountProtocol` for the given sender address. + + :param sender: The sender address + :returns: The `TransactionSignerAccountProtocol` + :raises ValueError: If no account is found or if the account is not a regular account + + :example: + >>> sender = account_manager.random().address + >>> # ... + >>> # Returns the `TransactionSignerAccountProtocol` for `sender` that has previously been registered + >>> account = account_manager.get_account(sender) + + + + .. py:method:: get_information(sender: str | algokit_utils.protocols.account.TransactionSignerAccountProtocol) -> AccountInformation + + Returns the given sender account's current status, balance and spendable amounts. + + See ``_ + for response data schema details. + + :param sender: The address or account compliant with `TransactionSignerAccountProtocol` protocol to look up + :returns: The account information + + :example: + >>> address = "XBYLS2E6YI6XXL5BWCAMOA4GTWHXWENZMX5UHXMRNWWUQ7BXCY5WC5TEPA" + >>> account_info = account_manager.get_information(address) + + + + .. py:method:: from_mnemonic(*, mnemonic: str, sender: str | None = None) -> algokit_utils.models.account.SigningAccount + + Tracks and returns an Algorand account with secret key loaded by taking the mnemonic secret. + + :param mnemonic: The mnemonic secret representing the private key of an account + :param sender: Optional address to use as the sender + :returns: The account + + .. warning:: + Be careful how the mnemonic is handled. Never commit it into source control and ideally load it + from the environment (ideally via a secret storage service) rather than the file system. + + :example: + >>> account = account_manager.from_mnemonic("mnemonic secret ...") + + + + .. py:method:: from_environment(name: str, fund_with: algokit_utils.models.amount.AlgoAmount | None = None) -> algokit_utils.models.account.SigningAccount + + Tracks and returns an Algorand account with private key loaded by convention from environment variables. + + This allows you to write code that will work seamlessly in production and local development (LocalNet) + without manual config locally (including when you reset the LocalNet). + + :param name: The name identifier of the account + :param fund_with: Optional amount to fund the account with when it gets created + (when targeting LocalNet) + :returns: The account + :raises ValueError: If environment variable {NAME}_MNEMONIC is missing when looking for account {NAME} + + .. note:: + Convention: + * **Non-LocalNet:** will load `{NAME}_MNEMONIC` as a mnemonic secret. + If `{NAME}_SENDER` is defined then it will use that for the sender address + (i.e. to support rekeyed accounts) + * **LocalNet:** will load the account from a KMD wallet called {NAME} and if that wallet doesn't exist + it will create it and fund the account for you + + :example: + >>> # If you have a mnemonic secret loaded into `MY_ACCOUNT_MNEMONIC` then you can call: + >>> account = account_manager.from_environment('MY_ACCOUNT') + >>> # If that code runs against LocalNet then a wallet called `MY_ACCOUNT` will automatically be created + >>> # with an account that is automatically funded with the specified amount from the LocalNet dispenser + + + + .. py:method:: from_kmd(name: str, predicate: collections.abc.Callable[[dict[str, Any]], bool] | None = None, sender: str | None = None) -> algokit_utils.models.account.SigningAccount + + Tracks and returns an Algorand account with private key loaded from the given KMD wallet. + + :param name: The name of the wallet to retrieve an account from + :param predicate: Optional filter to use to find the account + :param sender: Optional sender address to use this signer for (aka a rekeyed account) + :returns: The account + :raises ValueError: If unable to find KMD account with given name and predicate + + :example: + >>> # Get default funded account in a LocalNet: + >>> defaultDispenserAccount = account.from_kmd('unencrypted-default-wallet', + ... lambda a: a.status != 'Offline' and a.amount > 1_000_000_000 + ... ) + + + + .. py:method:: logicsig(program: bytes, args: list[bytes] | None = None) -> algokit_utils.models.account.LogicSigAccount + + Tracks and returns an account that represents a logic signature. + + :param program: The bytes that make up the compiled logic signature + :param args: Optional (binary) arguments to pass into the logic signature + :returns: A logic signature account wrapper + + :example: + >>> account = account.logicsig(program, [new Uint8Array(3, ...)]) + + + + .. py:method:: multisig(metadata: algokit_utils.models.account.MultisigMetadata, signing_accounts: list[algokit_utils.models.account.SigningAccount]) -> algokit_utils.models.account.MultiSigAccount + + Tracks and returns an account that supports partial or full multisig signing. + + :param metadata: The metadata for the multisig account + :param signing_accounts: The signers that are currently present + :returns: A multisig account wrapper + + :example: + >>> account = account_manager.multi_sig( + ... version=1, + ... threshold=1, + ... addrs=["ADDRESS1...", "ADDRESS2..."], + ... signing_accounts=[account1, account2] + ... ) + + + + .. py:method:: random() -> algokit_utils.models.account.SigningAccount + + Tracks and returns a new, random Algorand account. + + :returns: The account + + :example: + >>> account = account_manager.random() + + + + .. py:method:: localnet_dispenser() -> algokit_utils.models.account.SigningAccount + + Returns an Algorand account with private key loaded for the default LocalNet dispenser account. + + This account can be used to fund other accounts. + + :returns: The account + + :example: + >>> account = account_manager.localnet_dispenser() + + + + .. py:method:: dispenser_from_environment() -> algokit_utils.models.account.SigningAccount + + Returns an account (with private key loaded) that can act as a dispenser from environment variables. + + If environment variables are not present, returns the default LocalNet dispenser account. + + :returns: The account + + :example: + >>> account = account_manager.dispenser_from_environment() + + + + .. py:method:: rekeyed(*, sender: str, account: algokit_utils.protocols.account.TransactionSignerAccountProtocol) -> algokit_utils.models.account.TransactionSignerAccount | algokit_utils.models.account.SigningAccount + + Tracks and returns an Algorand account that is a rekeyed version of the given account to a new sender. + + :param sender: The account or address to use as the sender + :param account: The account to use as the signer for this new rekeyed account + :returns: The rekeyed account + + :example: + >>> account = account.from_mnemonic("mnemonic secret ...") + >>> rekeyed_account = account_manager.rekeyed(account, "SENDERADDRESS...") + + + + .. py:method:: rekey_account(account: str, rekey_to: str | algokit_utils.protocols.account.TransactionSignerAccountProtocol, *, signer: algosdk.atomic_transaction_composer.TransactionSigner | None = None, note: bytes | None = None, lease: bytes | None = None, static_fee: algokit_utils.models.amount.AlgoAmount | None = None, extra_fee: algokit_utils.models.amount.AlgoAmount | None = None, max_fee: algokit_utils.models.amount.AlgoAmount | None = None, validity_window: int | None = None, first_valid_round: int | None = None, last_valid_round: int | None = None, suppress_log: bool | None = None) -> algokit_utils.transactions.transaction_composer.SendAtomicTransactionComposerResults + + Rekey an account to a new address. + + :param account: The account to rekey + :param rekey_to: The address or account to rekey to + :param signer: Optional transaction signer + :param note: Optional transaction note + :param lease: Optional transaction lease + :param static_fee: Optional static fee + :param extra_fee: Optional extra fee + :param max_fee: Optional max fee + :param validity_window: Optional validity window + :param first_valid_round: Optional first valid round + :param last_valid_round: Optional last valid round + :param suppress_log: Optional flag to suppress logging + :returns: The result of the transaction and the transaction that was sent + + .. warning:: + Please be careful with this function and be sure to read the + `official rekey guidance `_. + + :example: + >>> # Basic example (with string addresses): + >>> algorand.account.rekey_account("ACCOUNTADDRESS", "NEWADDRESS") + >>> # Basic example (with signer accounts): + >>> algorand.account.rekey_account(account1, newSignerAccount) + >>> # Advanced example: + >>> algorand.account.rekey_account( + ... account="ACCOUNTADDRESS", + ... rekey_to="NEWADDRESS", + ... lease='lease', + ... note='note', + ... first_valid_round=1000, + ... validity_window=10, + ... extra_fee=AlgoAmount.from_micro_algo(1000), + ... static_fee=AlgoAmount.from_micro_algo(1000), + ... max_fee=AlgoAmount.from_micro_algo(3000), + ... suppress_log=True, + ... ) + + + + .. py:method:: ensure_funded(account_to_fund: str | algokit_utils.models.account.SigningAccount, dispenser_account: str | algokit_utils.models.account.SigningAccount, min_spending_balance: algokit_utils.models.amount.AlgoAmount, min_funding_increment: algokit_utils.models.amount.AlgoAmount | None = None, send_params: algokit_utils.models.transaction.SendParams | None = None, signer: algosdk.atomic_transaction_composer.TransactionSigner | None = None, rekey_to: str | None = None, note: bytes | None = None, lease: bytes | None = None, static_fee: algokit_utils.models.amount.AlgoAmount | None = None, extra_fee: algokit_utils.models.amount.AlgoAmount | None = None, max_fee: algokit_utils.models.amount.AlgoAmount | None = None, validity_window: int | None = None, first_valid_round: int | None = None, last_valid_round: int | None = None) -> EnsureFundedResult | None + + Funds a given account using a dispenser account as a funding source. + + Ensures the given account has a certain amount of Algo free to spend (accounting for + Algo locked in minimum balance requirement). + + See ``_ for details. + + :param account_to_fund: The account to fund + :param dispenser_account: The account to use as a dispenser funding source + :param min_spending_balance: The minimum balance of Algo that the account + should have available to spend + :param min_funding_increment: Optional minimum funding increment + :param send_params: Parameters for the send operation, defaults to None + :param signer: Optional transaction signer + :param rekey_to: Optional rekey address + :param note: Optional transaction note + :param lease: Optional transaction lease + :param static_fee: Optional static fee + :param extra_fee: Optional extra fee + :param max_fee: Optional maximum fee + :param validity_window: Optional validity window + :param first_valid_round: Optional first valid round + :param last_valid_round: Optional last valid round + :returns: The result of executing the dispensing transaction and the `amountFunded` if funds were needed, + or None if no funds were needed + + :example: + >>> # Basic example: + >>> algorand.account.ensure_funded("ACCOUNTADDRESS", "DISPENSERADDRESS", AlgoAmount.from_algo(1)) + >>> # With configuration: + >>> algorand.account.ensure_funded( + ... "ACCOUNTADDRESS", + ... "DISPENSERADDRESS", + ... AlgoAmount.from_algo(1), + ... min_funding_increment=AlgoAmount.from_algo(2), + ... fee=AlgoAmount.from_micro_algo(1000), + ... suppress_log=True + ... ) + + + + .. py:method:: ensure_funded_from_environment(account_to_fund: str | algokit_utils.models.account.SigningAccount, min_spending_balance: algokit_utils.models.amount.AlgoAmount, *, min_funding_increment: algokit_utils.models.amount.AlgoAmount | None = None, send_params: algokit_utils.models.transaction.SendParams | None = None, signer: algosdk.atomic_transaction_composer.TransactionSigner | None = None, rekey_to: str | None = None, note: bytes | None = None, lease: bytes | None = None, static_fee: algokit_utils.models.amount.AlgoAmount | None = None, extra_fee: algokit_utils.models.amount.AlgoAmount | None = None, max_fee: algokit_utils.models.amount.AlgoAmount | None = None, validity_window: int | None = None, first_valid_round: int | None = None, last_valid_round: int | None = None) -> EnsureFundedResult | None + + Ensure an account is funded from a dispenser account configured in environment. + + Uses a dispenser account retrieved from the environment, per the `dispenser_from_environment` method, + as a funding source such that the given account has a certain amount of Algo free to spend + (accounting for Algo locked in minimum balance requirement). + + See ``_ for details. + + :param account_to_fund: The account to fund + :param min_spending_balance: The minimum balance of Algo that the account should have available to + spend + :param min_funding_increment: Optional minimum funding increment + :param send_params: Parameters for the send operation, defaults to None + :param signer: Optional transaction signer + :param rekey_to: Optional rekey address + :param note: Optional transaction note + :param lease: Optional transaction lease + :param static_fee: Optional static fee + :param extra_fee: Optional extra fee + :param max_fee: Optional maximum fee + :param validity_window: Optional validity window + :param first_valid_round: Optional first valid round + :param last_valid_round: Optional last valid round + :returns: The result of executing the dispensing transaction and the `amountFunded` if funds were needed, or + None if no funds were needed + + .. note:: + The dispenser account is retrieved from the account mnemonic stored in + process.env.DISPENSER_MNEMONIC and optionally process.env.DISPENSER_SENDER + if it's a rekeyed account, or against default LocalNet if no environment variables present. + + :example: + >>> # Basic example: + >>> algorand.account.ensure_funded_from_environment("ACCOUNTADDRESS", AlgoAmount.from_algo(1)) + >>> # With configuration: + >>> algorand.account.ensure_funded_from_environment( + ... "ACCOUNTADDRESS", + ... AlgoAmount.from_algo(1), + ... min_funding_increment=AlgoAmount.from_algo(2), + ... fee=AlgoAmount.from_micro_algo(1000), + ... suppress_log=True + ... ) + + + + .. py:method:: ensure_funded_from_testnet_dispenser_api(account_to_fund: str | algokit_utils.models.account.SigningAccount, dispenser_client: algokit_utils.clients.dispenser_api_client.TestNetDispenserApiClient, min_spending_balance: algokit_utils.models.amount.AlgoAmount, *, min_funding_increment: algokit_utils.models.amount.AlgoAmount | None = None) -> EnsureFundedFromTestnetDispenserApiResult | None + + Ensure an account is funded using the TestNet Dispenser API. + + Uses the TestNet Dispenser API as a funding source such that the account has a certain amount + of Algo free to spend (accounting for Algo locked in minimum balance requirement). + + See ``_ for details. + + :param account_to_fund: The account to fund + :param dispenser_client: The TestNet dispenser funding client + :param min_spending_balance: The minimum balance of Algo that the account should have + available to spend + :param min_funding_increment: Optional minimum funding increment + :returns: The result of executing the dispensing transaction and the `amountFunded` if funds were needed, or + None if no funds were needed + :raises ValueError: If attempting to fund on non-TestNet network + + :example: + >>> # Basic example: + >>> account_manager.ensure_funded_from_testnet_dispenser_api( + ... "ACCOUNTADDRESS", + ... algorand.client.get_testnet_dispenser_from_environment(), + ... AlgoAmount.from_algo(1) + ... ) + >>> # With configuration: + >>> account_manager.ensure_funded_from_testnet_dispenser_api( + ... "ACCOUNTADDRESS", + ... algorand.client.get_testnet_dispenser_from_environment(), + ... AlgoAmount.from_algo(1), + ... min_funding_increment=AlgoAmount.from_algo(2) + ... ) + + + diff --git a/docs/html/_sources/autoapi/algokit_utils/accounts/index.rst.txt b/docs/html/_sources/autoapi/algokit_utils/accounts/index.rst.txt new file mode 100644 index 00000000..679f280f --- /dev/null +++ b/docs/html/_sources/autoapi/algokit_utils/accounts/index.rst.txt @@ -0,0 +1,16 @@ +algokit_utils.accounts +====================== + +.. py:module:: algokit_utils.accounts + + +Submodules +---------- + +.. toctree:: + :maxdepth: 1 + + /autoapi/algokit_utils/accounts/account_manager/index + /autoapi/algokit_utils/accounts/kmd_account_manager/index + + diff --git a/docs/html/_sources/autoapi/algokit_utils/accounts/kmd_account_manager/index.rst.txt b/docs/html/_sources/autoapi/algokit_utils/accounts/kmd_account_manager/index.rst.txt new file mode 100644 index 00000000..5a780301 --- /dev/null +++ b/docs/html/_sources/autoapi/algokit_utils/accounts/kmd_account_manager/index.rst.txt @@ -0,0 +1,82 @@ +algokit_utils.accounts.kmd_account_manager +========================================== + +.. py:module:: algokit_utils.accounts.kmd_account_manager + + +Classes +------- + +.. autoapisummary:: + + algokit_utils.accounts.kmd_account_manager.KmdAccount + algokit_utils.accounts.kmd_account_manager.KmdAccountManager + + +Module Contents +--------------- + +.. py:class:: KmdAccount(private_key: str, address: str | None = None) + + Bases: :py:obj:`algokit_utils.models.account.SigningAccount` + + + Account retrieved from KMD with signing capabilities, extending base Account. + + Provides an account implementation that can be used to sign transactions using keys stored in KMD. + + :param private_key: Base64 encoded private key + :param address: Optional address override for rekeyed accounts, defaults to None + + +.. py:class:: KmdAccountManager(client_manager: algokit_utils.clients.client_manager.ClientManager) + + Provides abstractions over KMD that makes it easier to get and manage accounts. + + + .. py:method:: kmd() -> algosdk.kmd.KMDClient + + Returns the KMD client, initializing it if needed. + + :raises Exception: If KMD client is not configured and not running against LocalNet + :return: The KMD client + + + + .. py:method:: get_wallet_account(wallet_name: str, predicate: collections.abc.Callable[[dict[str, Any]], bool] | None = None, sender: str | None = None) -> KmdAccount | None + + Returns an Algorand signing account with private key loaded from the given KMD wallet. + + Retrieves an account from a KMD wallet that matches the given predicate, or a random account + if no predicate is provided. + + :param wallet_name: The name of the wallet to retrieve an account from + :param predicate: Optional filter to use to find the account (otherwise gets a random account from the wallet) + :param sender: Optional sender address to use this signer for (aka a rekeyed account) + :return: The signing account or None if no matching wallet or account was found + + + + .. py:method:: get_or_create_wallet_account(name: str, fund_with: algokit_utils.models.amount.AlgoAmount | None = None) -> KmdAccount + + Gets or creates a funded account in a KMD wallet of the given name. + + Provides idempotent access to accounts from LocalNet without specifying the private key. + + :param name: The name of the wallet to retrieve / create + :param fund_with: The number of Algos to fund the account with when created + :return: An Algorand account with private key loaded + + + + .. py:method:: get_localnet_dispenser_account() -> KmdAccount + + Returns an Algorand account with private key loaded for the default LocalNet dispenser account. + + Retrieves the default funded account from LocalNet that can be used to fund other accounts. + + :raises Exception: If not running against LocalNet or dispenser account not found + :return: The default LocalNet dispenser account + + + diff --git a/docs/html/_sources/autoapi/algokit_utils/algorand/index.rst.txt b/docs/html/_sources/autoapi/algokit_utils/algorand/index.rst.txt new file mode 100644 index 00000000..f88aba0d --- /dev/null +++ b/docs/html/_sources/autoapi/algokit_utils/algorand/index.rst.txt @@ -0,0 +1,291 @@ +algokit_utils.algorand +====================== + +.. py:module:: algokit_utils.algorand + + +Classes +------- + +.. autoapisummary:: + + algokit_utils.algorand.AlgorandClient + + +Module Contents +--------------- + +.. py:class:: AlgorandClient(config: algokit_utils.models.network.AlgoClientConfigs | algokit_utils.clients.client_manager.AlgoSdkClients) + + A client that brokers easy access to Algorand functionality. + + + .. py:method:: set_default_validity_window(validity_window: int) -> typing_extensions.Self + + Sets the default validity window for transactions. + + :param validity_window: The number of rounds between the first and last valid rounds + :return: The `AlgorandClient` so method calls can be chained + :example: + >>> algorand = AlgorandClient.mainnet().set_default_validity_window(1000); + + + + .. py:method:: set_default_signer(signer: algosdk.atomic_transaction_composer.TransactionSigner | algokit_utils.protocols.account.TransactionSignerAccountProtocol) -> typing_extensions.Self + + Sets the default signer to use if no other signer is specified. + + :param signer: The signer to use, either a `TransactionSigner` or a `TransactionSignerAccountProtocol` + :return: The `AlgorandClient` so method calls can be chained + :example: + >>> signer = SigningAccount(private_key=..., address=...) + >>> algorand = AlgorandClient.mainnet().set_default_signer(signer) + + + + .. py:method:: set_signer(sender: str, signer: algosdk.atomic_transaction_composer.TransactionSigner) -> typing_extensions.Self + + Tracks the given account for later signing. + + :param sender: The sender address to use this signer for + :param signer: The signer to sign transactions with for the given sender + :return: The `AlgorandClient` so method calls can be chained + :example: + >>> signer = SigningAccount(private_key=..., address=...) + >>> algorand = AlgorandClient.mainnet().set_signer(signer.addr, signer.signer) + + + + .. py:method:: set_signer_from_account(signer: algokit_utils.protocols.account.TransactionSignerAccountProtocol) -> typing_extensions.Self + + Sets the default signer to use if no other signer is specified. + + :param signer: The signer to use, either a `TransactionSigner` or a `TransactionSignerAccountProtocol` + :return: The `AlgorandClient` so method calls can be chained + :example: + >>> accountManager = AlgorandClient.mainnet() + >>> accountManager.set_signer_from_account(TransactionSignerAccount(address=..., signer=...)) + >>> accountManager.set_signer_from_account(algosdk.LogicSigAccount(program, args)) + >>> accountManager.set_signer_from_account(SigningAccount(private_key=..., address=...)) + >>> accountManager.set_signer_from_account(MultisigAccount(metadata, signing_accounts)) + >>> accountManager.set_signer_from_account(account) + + + + .. py:method:: set_suggested_params_cache(suggested_params: algosdk.transaction.SuggestedParams, until: float | None = None) -> typing_extensions.Self + + Sets a cache value to use for suggested params. + + :param suggested_params: The suggested params to use + :param until: A timestamp until which to cache, or if not specified then the timeout is used + :return: The `AlgorandClient` so method calls can be chained + :example: + >>> algorand = AlgorandClient.mainnet().set_suggested_params_cache(suggested_params, time.time() + 3.6e6) + + + + .. py:method:: set_suggested_params_cache_timeout(timeout: int) -> typing_extensions.Self + + Sets the timeout for caching suggested params. + + :param timeout: The timeout in milliseconds + :return: The `AlgorandClient` so method calls can be chained + :example: + >>> algorand = AlgorandClient.mainnet().set_suggested_params_cache_timeout(10_000) + + + + .. py:method:: get_suggested_params() -> algosdk.transaction.SuggestedParams + + Get suggested params for a transaction (either cached or from algod if the cache is stale or empty) + + :example: + >>> algorand = AlgorandClient.mainnet().get_suggested_params() + + + + .. py:method:: new_group() -> algokit_utils.transactions.transaction_composer.TransactionComposer + + Start a new `TransactionComposer` transaction group + + :example: + >>> composer = AlgorandClient.mainnet().new_group() + >>> result = await composer.add_transaction(payment).send() + + + + .. py:property:: client + :type: algokit_utils.clients.client_manager.ClientManager + + + Get clients, including algosdk clients and app clients. + + :example: + >>> clientManager = AlgorandClient.mainnet().client + + + + .. py:property:: account + :type: algokit_utils.accounts.account_manager.AccountManager + + + Get or create accounts that can sign transactions. + + :example: + >>> accountManager = AlgorandClient.mainnet().account + + + + .. py:property:: asset + :type: algokit_utils.assets.asset_manager.AssetManager + + + Get or create assets. + + :example: + >>> assetManager = AlgorandClient.mainnet().asset + + + + .. py:property:: app + :type: algokit_utils.applications.app_manager.AppManager + + + Get or create applications. + + :example: + >>> appManager = AlgorandClient.mainnet().app + + + + .. py:property:: app_deployer + :type: algokit_utils.applications.app_deployer.AppDeployer + + + Get or create applications. + + :example: + >>> appDeployer = AlgorandClient.mainnet().app_deployer + + + + .. py:property:: send + :type: algokit_utils.transactions.transaction_sender.AlgorandClientTransactionSender + + + Methods for sending a transaction and waiting for confirmation + + :example: + >>> result = await AlgorandClient.mainnet().send.payment( + >>> PaymentParams( + >>> sender="SENDERADDRESS", + >>> receiver="RECEIVERADDRESS", + >>> amount=AlgoAmount(algo-1) + >>> )) + + + + .. py:property:: create_transaction + :type: algokit_utils.transactions.transaction_creator.AlgorandClientTransactionCreator + + + Methods for building transactions + + :example: + >>> transaction = AlgorandClient.mainnet().create_transaction.payment( + >>> PaymentParams( + >>> sender="SENDERADDRESS", + >>> receiver="RECEIVERADDRESS", + >>> amount=AlgoAmount(algo=1) + >>> )) + + + + .. py:method:: default_localnet() -> AlgorandClient + :staticmethod: + + + Returns an `AlgorandClient` pointing at default LocalNet ports and API token. + + :return: The `AlgorandClient` + + :example: + >>> algorand = AlgorandClient.default_localnet() + + + + .. py:method:: testnet() -> AlgorandClient + :staticmethod: + + + Returns an `AlgorandClient` pointing at TestNet using AlgoNode. + + :return: The `AlgorandClient` + + :example: + >>> algorand = AlgorandClient.testnet() + + + + .. py:method:: mainnet() -> AlgorandClient + :staticmethod: + + + Returns an `AlgorandClient` pointing at MainNet using AlgoNode. + + :return: The `AlgorandClient` + + :example: + >>> algorand = AlgorandClient.mainnet() + + + + .. py:method:: from_clients(algod: algosdk.v2client.algod.AlgodClient, indexer: algosdk.v2client.indexer.IndexerClient | None = None, kmd: algosdk.kmd.KMDClient | None = None) -> AlgorandClient + :staticmethod: + + + Returns an `AlgorandClient` pointing to the given client(s). + + :param algod: The algod client to use + :param indexer: The indexer client to use + :param kmd: The kmd client to use + :return: The `AlgorandClient` + + :example: + >>> algorand = AlgorandClient.from_clients(algod, indexer, kmd) + + + + .. py:method:: from_environment() -> AlgorandClient + :staticmethod: + + + Returns an `AlgorandClient` loading the configuration from environment variables. + + Retrieve configurations from environment variables when defined or get defaults. + + Expects to be called from a Python environment. + + :return: The `AlgorandClient` + + :example: + >>> algorand = AlgorandClient.from_environment() + + + + .. py:method:: from_config(algod_config: algokit_utils.models.network.AlgoClientNetworkConfig, indexer_config: algokit_utils.models.network.AlgoClientNetworkConfig | None = None, kmd_config: algokit_utils.models.network.AlgoClientNetworkConfig | None = None) -> AlgorandClient + :staticmethod: + + + Returns an `AlgorandClient` from the given config. + + :param algod_config: The config to use for the algod client + :param indexer_config: The config to use for the indexer client + :param kmd_config: The config to use for the kmd client + :return: The `AlgorandClient` + + :example: + >>> algorand = AlgorandClient.from_config(algod_config, indexer_config, kmd_config) + + + diff --git a/docs/html/_sources/autoapi/algokit_utils/applications/abi/index.rst.txt b/docs/html/_sources/autoapi/algokit_utils/applications/abi/index.rst.txt new file mode 100644 index 00000000..92953f86 --- /dev/null +++ b/docs/html/_sources/autoapi/algokit_utils/applications/abi/index.rst.txt @@ -0,0 +1,222 @@ +algokit_utils.applications.abi +============================== + +.. py:module:: algokit_utils.applications.abi + + +Attributes +---------- + +.. autoapisummary:: + + algokit_utils.applications.abi.ABIValue + algokit_utils.applications.abi.ABIStruct + algokit_utils.applications.abi.Arc56ReturnValueType + algokit_utils.applications.abi.ABIType + algokit_utils.applications.abi.ABIArgumentType + + +Classes +------- + +.. autoapisummary:: + + algokit_utils.applications.abi.ABIReturn + algokit_utils.applications.abi.BoxABIValue + + +Functions +--------- + +.. autoapisummary:: + + algokit_utils.applications.abi.get_arc56_value + algokit_utils.applications.abi.get_abi_encoded_value + algokit_utils.applications.abi.get_abi_decoded_value + algokit_utils.applications.abi.get_abi_tuple_from_abi_struct + algokit_utils.applications.abi.get_abi_tuple_type_from_abi_struct_definition + algokit_utils.applications.abi.get_abi_struct_from_abi_tuple + + +Module Contents +--------------- + +.. py:data:: ABIValue + :type: TypeAlias + :value: bool | int | str | bytes | bytearray | list['ABIValue'] | tuple['ABIValue'] | dict[str, 'ABIValue'] + + +.. py:data:: ABIStruct + :type: TypeAlias + :value: dict[str, list[dict[str, 'ABIValue']]] + + +.. py:data:: Arc56ReturnValueType + :type: TypeAlias + :value: ABIValue | ABIStruct | None + + +.. py:data:: ABIType + :type: TypeAlias + :value: algosdk.abi.ABIType + + +.. py:data:: ABIArgumentType + :type: TypeAlias + :value: algosdk.abi.ABIType | algosdk.abi.ABITransactionType | algosdk.abi.ABIReferenceType + + +.. py:class:: ABIReturn(result: algosdk.atomic_transaction_composer.ABIResult) + + Represents the return value from an ABI method call. + + Wraps the raw return value and decoded value along with any decode errors. + + + .. py:attribute:: raw_value + :type: bytes | None + :value: None + + + The raw return value from the method call + + + + .. py:attribute:: value + :type: ABIValue | None + :value: None + + + The decoded return value from the method call + + + + .. py:attribute:: method + :type: algosdk.abi.method.Method | None + :value: None + + + The ABI method definition + + + + .. py:attribute:: decode_error + :type: Exception | None + :value: None + + + The exception that occurred during decoding, if any + + + + .. py:attribute:: tx_info + :type: dict[str, Any] | None + :value: None + + + The transaction info for the method call from raw algosdk `ABIResult` + + + + .. py:property:: is_success + :type: bool + + + Returns True if the ABI call was successful (no decode error) + + :return: True if no decode error occurred, False otherwise + + + + .. py:method:: get_arc56_value(method: algokit_utils.applications.app_spec.arc56.Method | algosdk.abi.method.Method, structs: dict[str, list[algokit_utils.applications.app_spec.arc56.StructField]]) -> Arc56ReturnValueType + + Gets the ARC-56 formatted return value. + + :param method: The ABI method definition + :param structs: Dictionary of struct definitions + :return: The decoded return value in ARC-56 format + + + +.. py:function:: get_arc56_value(abi_return: ABIReturn, method: algokit_utils.applications.app_spec.arc56.Method | algosdk.abi.method.Method, structs: dict[str, list[algokit_utils.applications.app_spec.arc56.StructField]]) -> Arc56ReturnValueType + + Gets the ARC-56 formatted return value from an ABI return. + + :param abi_return: The ABI return value to decode + :param method: The ABI method definition + :param structs: Dictionary of struct definitions + :raises ValueError: If there was an error decoding the return value + :return: The decoded return value in ARC-56 format + + +.. py:function:: get_abi_encoded_value(value: Any, type_str: str, structs: dict[str, list[algokit_utils.applications.app_spec.arc56.StructField]]) -> bytes + + Encodes a value according to its ABI type. + + :param value: The value to encode + :param type_str: The ABI type string + :param structs: Dictionary of struct definitions + :raises ValueError: If the value cannot be encoded for the given type + :return: The ABI encoded bytes + + +.. py:function:: get_abi_decoded_value(value: bytes | int | str, type_str: str | ABIArgumentType, structs: dict[str, list[algokit_utils.applications.app_spec.arc56.StructField]]) -> ABIValue + + Decodes a value according to its ABI type. + + :param value: The value to decode + :param type_str: The ABI type string or type object + :param structs: Dictionary of struct definitions + :return: The decoded ABI value + + +.. py:function:: get_abi_tuple_from_abi_struct(struct_value: dict[str, Any], struct_fields: list[algokit_utils.applications.app_spec.arc56.StructField], structs: dict[str, list[algokit_utils.applications.app_spec.arc56.StructField]]) -> list[Any] + + Converts an ABI struct to a tuple representation. + + :param struct_value: The struct value as a dictionary + :param struct_fields: List of struct field definitions + :param structs: Dictionary of struct definitions + :raises ValueError: If a required field is missing from the struct + :return: The struct as a tuple + + +.. py:function:: get_abi_tuple_type_from_abi_struct_definition(struct_def: list[algokit_utils.applications.app_spec.arc56.StructField], structs: dict[str, list[algokit_utils.applications.app_spec.arc56.StructField]]) -> algosdk.abi.TupleType + + Creates a TupleType from a struct definition. + + :param struct_def: The struct field definitions + :param structs: Dictionary of struct definitions + :raises ValueError: If a field type is invalid + :return: The TupleType representing the struct + + +.. py:function:: get_abi_struct_from_abi_tuple(decoded_tuple: Any, struct_fields: list[algokit_utils.applications.app_spec.arc56.StructField], structs: dict[str, list[algokit_utils.applications.app_spec.arc56.StructField]]) -> dict[str, Any] + + Converts a decoded tuple to an ABI struct. + + :param decoded_tuple: The tuple to convert + :param struct_fields: List of struct field definitions + :param structs: Dictionary of struct definitions + :return: The tuple as a struct dictionary + + +.. py:class:: BoxABIValue + + Represents an ABI value stored in a box. + + + .. py:attribute:: name + :type: algokit_utils.models.state.BoxName + + The name of the box + + + + .. py:attribute:: value + :type: ABIValue + + The ABI value stored in the box + + + diff --git a/docs/html/_sources/autoapi/algokit_utils/applications/app_client/index.rst.txt b/docs/html/_sources/autoapi/algokit_utils/applications/app_client/index.rst.txt new file mode 100644 index 00000000..94c33900 --- /dev/null +++ b/docs/html/_sources/autoapi/algokit_utils/applications/app_client/index.rst.txt @@ -0,0 +1,852 @@ +algokit_utils.applications.app_client +===================================== + +.. py:module:: algokit_utils.applications.app_client + + +Attributes +---------- + +.. autoapisummary:: + + algokit_utils.applications.app_client.CreateOnComplete + + +Classes +------- + +.. autoapisummary:: + + algokit_utils.applications.app_client.AppClientCompilationResult + algokit_utils.applications.app_client.AppClientCompilationParams + algokit_utils.applications.app_client.CommonAppCallParams + algokit_utils.applications.app_client.AppClientCreateSchema + algokit_utils.applications.app_client.CommonAppCallCreateParams + algokit_utils.applications.app_client.FundAppAccountParams + algokit_utils.applications.app_client.AppClientBareCallParams + algokit_utils.applications.app_client.AppClientBareCallCreateParams + algokit_utils.applications.app_client.BaseAppClientMethodCallParams + algokit_utils.applications.app_client.AppClientMethodCallParams + algokit_utils.applications.app_client.AppClientMethodCallCreateParams + algokit_utils.applications.app_client.AppClientParams + algokit_utils.applications.app_client.AppClient + + +Functions +--------- + +.. autoapisummary:: + + algokit_utils.applications.app_client.get_constant_block_offset + + +Module Contents +--------------- + +.. py:function:: get_constant_block_offset(program: bytes) -> int + + Calculate the offset after constant blocks in TEAL program. + + Analyzes a compiled TEAL program to find the ending offset position after any bytecblock and intcblock operations. + + :param program: The compiled TEAL program as bytes + :return: The maximum offset position after any constant block operations + + +.. py:data:: CreateOnComplete + +.. py:class:: AppClientCompilationResult + + Result of compiling an application's TEAL code. + + Contains the compiled approval and clear state programs along with optional compilation artifacts. + + + .. py:attribute:: approval_program + :type: bytes + + The compiled approval program bytes + + + + .. py:attribute:: clear_state_program + :type: bytes + + The compiled clear state program bytes + + + + .. py:attribute:: compiled_approval + :type: algokit_utils.models.application.CompiledTeal | None + :value: None + + + Optional compilation artifacts for approval program + + + + .. py:attribute:: compiled_clear + :type: algokit_utils.models.application.CompiledTeal | None + :value: None + + + Optional compilation artifacts for clear state program + + + +.. py:class:: AppClientCompilationParams + + Bases: :py:obj:`TypedDict` + + + Parameters for compiling an application's TEAL code. + + :ivar deploy_time_params: Optional template parameters to use during compilation + :ivar updatable: Optional flag indicating if app should be updatable + :ivar deletable: Optional flag indicating if app should be deletable + + + .. py:attribute:: deploy_time_params + :type: algokit_utils.models.state.TealTemplateParams | None + + + .. py:attribute:: updatable + :type: bool | None + + + .. py:attribute:: deletable + :type: bool | None + + +.. py:class:: CommonAppCallParams + + Common configuration for app call transaction parameters + + + .. py:attribute:: account_references + :type: list[str] | None + :value: None + + + List of account addresses to reference + + + + .. py:attribute:: app_references + :type: list[int] | None + :value: None + + + List of app IDs to reference + + + + .. py:attribute:: asset_references + :type: list[int] | None + :value: None + + + List of asset IDs to reference + + + + .. py:attribute:: box_references + :type: list[algokit_utils.models.state.BoxReference | algokit_utils.models.state.BoxIdentifier] | None + :value: None + + + List of box references to include + + + + .. py:attribute:: extra_fee + :type: algokit_utils.models.amount.AlgoAmount | None + :value: None + + + Additional fee to add to transaction + + + + .. py:attribute:: lease + :type: bytes | None + :value: None + + + Transaction lease value + + + + .. py:attribute:: max_fee + :type: algokit_utils.models.amount.AlgoAmount | None + :value: None + + + Maximum fee allowed for transaction + + + + .. py:attribute:: note + :type: bytes | None + :value: None + + + Custom note for the transaction + + + + .. py:attribute:: rekey_to + :type: str | None + :value: None + + + Address to rekey account to + + + + .. py:attribute:: sender + :type: str | None + :value: None + + + Sender address override + + + + .. py:attribute:: signer + :type: algosdk.atomic_transaction_composer.TransactionSigner | None + :value: None + + + Custom transaction signer + + + + .. py:attribute:: static_fee + :type: algokit_utils.models.amount.AlgoAmount | None + :value: None + + + Fixed fee for transaction + + + + .. py:attribute:: validity_window + :type: int | None + :value: None + + + Number of rounds valid + + + + .. py:attribute:: first_valid_round + :type: int | None + :value: None + + + First valid round number + + + + .. py:attribute:: last_valid_round + :type: int | None + :value: None + + + Last valid round number + + + + .. py:attribute:: on_complete + :type: algosdk.transaction.OnComplete | None + :value: None + + + Optional on complete action + + + +.. py:class:: AppClientCreateSchema + + Schema for application creation. + + + .. py:attribute:: extra_program_pages + :type: int | None + :value: None + + + Optional number of extra program pages + + + + .. py:attribute:: schema + :type: algokit_utils.transactions.transaction_composer.AppCreateSchema | None + :value: None + + + Optional application creation schema + + + +.. py:class:: CommonAppCallCreateParams + + Bases: :py:obj:`AppClientCreateSchema`, :py:obj:`CommonAppCallParams` + + + Common configuration for app create call transaction parameters. + + + .. py:attribute:: on_complete + :type: CreateOnComplete | None + :value: None + + + Optional on complete action + + + +.. py:class:: FundAppAccountParams + + Bases: :py:obj:`CommonAppCallParams` + + + Parameters for funding an application's account. + + + .. py:attribute:: amount + :type: algokit_utils.models.amount.AlgoAmount + + Amount to fund + + + + .. py:attribute:: close_remainder_to + :type: str | None + :value: None + + + Optional address to close remainder to + + + +.. py:class:: AppClientBareCallParams + + Bases: :py:obj:`CommonAppCallParams` + + + Parameters for bare application calls. + + + .. py:attribute:: args + :type: list[bytes] | None + :value: None + + + Optional arguments + + + +.. py:class:: AppClientBareCallCreateParams + + Bases: :py:obj:`CommonAppCallCreateParams` + + + Parameters for creating application with bare call. + + + .. py:attribute:: on_complete + :type: CreateOnComplete | None + :value: None + + + Optional on complete action + + + +.. py:class:: BaseAppClientMethodCallParams + + Bases: :py:obj:`Generic`\ [\ :py:obj:`ArgsT`\ , :py:obj:`MethodT`\ ], :py:obj:`CommonAppCallParams` + + + Base parameters for application method calls. + + + .. py:attribute:: method + :type: MethodT + + Method to call + + + + .. py:attribute:: args + :type: ArgsT | None + :value: None + + + Arguments to pass to the application method call + + + +.. py:class:: AppClientMethodCallParams + + Bases: :py:obj:`BaseAppClientMethodCallParams`\ [\ :py:obj:`collections.abc.Sequence`\ [\ :py:obj:`algokit_utils.applications.abi.ABIValue | algokit_utils.applications.abi.ABIStruct | algokit_utils.transactions.transaction_composer.AppMethodCallTransactionArgument | None`\ ]\ , :py:obj:`str`\ ] + + + Parameters for application method calls. + + +.. py:class:: AppClientMethodCallCreateParams + + Bases: :py:obj:`AppClientCreateSchema`, :py:obj:`AppClientMethodCallParams` + + + Parameters for creating application with method call + + + .. py:attribute:: on_complete + :type: CreateOnComplete | None + :value: None + + + Optional on complete action + + + +.. py:class:: AppClientParams + + Full parameters for creating an app client + + + .. py:attribute:: app_spec + :type: algokit_utils.applications.app_spec.arc56.Arc56Contract | algokit_utils.applications.app_spec.arc32.Arc32Contract | str + + The application specification + + + + .. py:attribute:: algorand + :type: algokit_utils.algorand.AlgorandClient + + The Algorand client + + + + .. py:attribute:: app_id + :type: int + + The application ID + + + + .. py:attribute:: app_name + :type: str | None + :value: None + + + The application name + + + + .. py:attribute:: default_sender + :type: str | None + :value: None + + + The default sender address + + + + .. py:attribute:: default_signer + :type: algosdk.atomic_transaction_composer.TransactionSigner | None + :value: None + + + The default transaction signer + + + + .. py:attribute:: approval_source_map + :type: algosdk.source_map.SourceMap | None + :value: None + + + The approval source map + + + + .. py:attribute:: clear_source_map + :type: algosdk.source_map.SourceMap | None + :value: None + + + The clear source map + + + +.. py:class:: AppClient(params: AppClientParams) + + A client for interacting with an Algorand smart contract application. + + Provides a high-level interface for interacting with Algorand smart contracts, including + methods for calling application methods, managing state, and handling transactions. + + :param params: Parameters for creating the app client + + :example: + >>> params = AppClientParams( + ... app_spec=Arc56Contract.from_json(app_spec_json), + ... algorand=algorand, + ... app_id=1234567890, + ... app_name="My App", + ... default_sender="SENDERADDRESS", + ... default_signer=TransactionSigner( + ... account="SIGNERACCOUNT", + ... private_key="SIGNERPRIVATEKEY", + ... ), + ... approval_source_map=SourceMap( + ... source="APPROVALSOURCE", + ... ), + ... clear_source_map=SourceMap( + ... source="CLEARSOURCE", + ... ), + ... ) + >>> client = AppClient(params) + + + .. py:property:: algorand + :type: algokit_utils.algorand.AlgorandClient + + + Get the Algorand client instance. + + :return: The Algorand client used by this app client + + + + .. py:property:: app_id + :type: int + + + Get the application ID. + + :return: The ID of the Algorand application + + + + .. py:property:: app_address + :type: str + + + Get the application's Algorand address. + + :return: The Algorand address associated with this application + + + + .. py:property:: app_name + :type: str + + + Get the application name. + + :return: The name of the application + + + + .. py:property:: app_spec + :type: algokit_utils.applications.app_spec.arc56.Arc56Contract + + + Get the application specification. + + :return: The ARC-56 contract specification for this application + + + + .. py:property:: state + :type: _StateAccessor + + + Get the state accessor. + + :return: The state accessor for this application + + + + .. py:property:: params + :type: _MethodParamsBuilder + + + Get the method parameters builder. + + :return: The method parameters builder for this application + + :example: + >>> # Create a transaction in the future using Algorand Client + >>> my_method_call = app_client.params.call(AppClientMethodCallParams( + method='my_method', + args=[123, 'hello'])) + >>> # ... + >>> await algorand.send.AppMethodCall(my_method_call) + >>> # Define a nested transaction as an ABI argument + >>> my_method_call = app_client.params.call(AppClientMethodCallParams( + method='my_method', + args=[123, 'hello'])) + >>> app_client.send.call(AppClientMethodCallParams(method='my_method2', args=[my_method_call])) + + + + .. py:property:: send + :type: _TransactionSender + + + Get the transaction sender. + + :return: The transaction sender for this application + + + + .. py:property:: create_transaction + :type: _TransactionCreator + + + Get the transaction creator. + + :return: The transaction creator for this application + + + + .. py:method:: normalise_app_spec(app_spec: algokit_utils.applications.app_spec.arc56.Arc56Contract | algokit_utils.applications.app_spec.arc32.Arc32Contract | str) -> algokit_utils.applications.app_spec.arc56.Arc56Contract + :staticmethod: + + + Normalize an application specification to ARC-56 format. + + :param app_spec: The application specification to normalize. Can be raw arc32 or arc56 json, + or an Arc32Contract or Arc56Contract instance + :return: The normalized ARC-56 contract specification + :raises ValueError: If the app spec format is invalid + + :example: + >>> spec = AppClient.normalise_app_spec(app_spec_json) + + + + .. py:method:: from_network(app_spec: algokit_utils.applications.app_spec.arc56.Arc56Contract | algokit_utils.applications.app_spec.arc32.Arc32Contract | str, algorand: algokit_utils.algorand.AlgorandClient, app_name: str | None = None, default_sender: str | None = None, default_signer: algosdk.atomic_transaction_composer.TransactionSigner | None = None, approval_source_map: algosdk.source_map.SourceMap | None = None, clear_source_map: algosdk.source_map.SourceMap | None = None) -> AppClient + :staticmethod: + + + Create an AppClient instance from network information. + + :param app_spec: The application specification + :param algorand: The Algorand client instance + :param app_name: Optional application name + :param default_sender: Optional default sender address + :param default_signer: Optional default transaction signer + :param approval_source_map: Optional approval program source map + :param clear_source_map: Optional clear program source map + :return: A new AppClient instance + :raises Exception: If no app ID is found for the network + + :example: + >>> client = AppClient.from_network( + ... app_spec=Arc56Contract.from_json(app_spec_json), + ... algorand=algorand, + ... app_name="My App", + ... default_sender="SENDERADDRESS", + ... default_signer=TransactionSigner( + ... account="SIGNERACCOUNT", + ... private_key="SIGNERPRIVATEKEY", + ... ), + ... approval_source_map=SourceMap( + ... source="APPROVALSOURCE", + ... ), + ... clear_source_map=SourceMap( + ... source="CLEARSOURCE", + ... ), + ... ) + + + + .. py:method:: from_creator_and_name(creator_address: str, app_name: str, app_spec: algokit_utils.applications.app_spec.arc56.Arc56Contract | algokit_utils.applications.app_spec.arc32.Arc32Contract | str, algorand: algokit_utils.algorand.AlgorandClient, default_sender: str | None = None, default_signer: algosdk.atomic_transaction_composer.TransactionSigner | None = None, approval_source_map: algosdk.source_map.SourceMap | None = None, clear_source_map: algosdk.source_map.SourceMap | None = None, ignore_cache: bool | None = None, app_lookup_cache: algokit_utils.applications.app_deployer.ApplicationLookup | None = None) -> AppClient + :staticmethod: + + + Create an AppClient instance from creator address and application name. + + :param creator_address: The address of the application creator + :param app_name: The name of the application + :param app_spec: The application specification + :param algorand: The Algorand client instance + :param default_sender: Optional default sender address + :param default_signer: Optional default transaction signer + :param approval_source_map: Optional approval program source map + :param clear_source_map: Optional clear program source map + :param ignore_cache: Optional flag to ignore cache + :param app_lookup_cache: Optional app lookup cache + :return: A new AppClient instance + :raises ValueError: If the app is not found for the creator and name + + :example: + >>> client = AppClient.from_creator_and_name( + ... creator_address="CREATORADDRESS", + ... app_name="APPNAME", + ... app_spec=Arc56Contract.from_json(app_spec_json), + ... algorand=algorand, + ... ) + + + + .. py:method:: compile(app_spec: algokit_utils.applications.app_spec.arc56.Arc56Contract, app_manager: algokit_utils.applications.app_manager.AppManager, compilation_params: AppClientCompilationParams | None = None) -> AppClientCompilationResult + :staticmethod: + + + Compile the application's TEAL code. + + :param app_spec: The application specification + :param app_manager: The application manager instance + :param compilation_params: Optional compilation parameters + :return: The compilation result + :raises ValueError: If attempting to compile without source or byte code + + + + .. py:method:: compile_app(compilation_params: AppClientCompilationParams | None = None) -> AppClientCompilationResult + + Compile the application's TEAL code. + + :param compilation_params: Optional compilation parameters + :return: The compilation result + + + + .. py:method:: clone(app_name: str | None = _MISSING, default_sender: str | None = _MISSING, default_signer: algosdk.atomic_transaction_composer.TransactionSigner | None = _MISSING, approval_source_map: algosdk.source_map.SourceMap | None = _MISSING, clear_source_map: algosdk.source_map.SourceMap | None = _MISSING) -> AppClient + + Create a cloned AppClient instance with optionally overridden parameters. + + :param app_name: Optional new application name + :param default_sender: Optional new default sender + :param default_signer: Optional new default signer + :param approval_source_map: Optional new approval source map + :param clear_source_map: Optional new clear source map + :return: A new AppClient instance + + :example: + >>> client = AppClient(params) + >>> cloned_client = client.clone(app_name="Cloned App", default_sender="NEW_SENDER") + + + + .. py:method:: export_source_maps() -> algokit_utils.models.application.AppSourceMaps + + Export the application's source maps. + + :return: The application's source maps + :raises ValueError: If source maps haven't been loaded + + + + .. py:method:: import_source_maps(source_maps: algokit_utils.models.application.AppSourceMaps) -> None + + Import source maps for the application. + + :param source_maps: The source maps to import + :raises ValueError: If source maps are invalid or missing + + + + .. py:method:: get_local_state(address: str) -> dict[str, algokit_utils.models.application.AppState] + + Get local state for an account. + + :param address: The account address + :return: The account's local state for this application + + + + .. py:method:: get_global_state() -> dict[str, algokit_utils.models.application.AppState] + + Get the application's global state. + + :return: The application's global state + :example: + >>> global_state = client.get_global_state() + + + + .. py:method:: get_box_names() -> list[algokit_utils.models.state.BoxName] + + Get all box names for the application. + + :return: List of box names + + :example: + >>> box_names = client.get_box_names() + + + + .. py:method:: get_box_value(name: algokit_utils.models.state.BoxIdentifier) -> bytes + + Get the value of a box. + + :param name: The box identifier + :return: The box value as bytes + + :example: + >>> box_value = client.get_box_value(box_name) + + + + .. py:method:: get_box_value_from_abi_type(name: algokit_utils.models.state.BoxIdentifier, abi_type: algokit_utils.applications.abi.ABIType) -> algokit_utils.applications.abi.ABIValue + + Get a box value decoded according to an ABI type. + + :param name: The box identifier + :param abi_type: The ABI type to decode as + :return: The decoded box value + + :example: + >>> box_value = client.get_box_value_from_abi_type(box_name, abi_type) + + + + .. py:method:: get_box_values(filter_func: collections.abc.Callable[[algokit_utils.models.state.BoxName], bool] | None = None) -> list[algokit_utils.models.state.BoxValue] + + Get values for multiple boxes. + + :param filter_func: Optional function to filter box names + :return: List of box values + + :example: + >>> box_values = client.get_box_values() + + + + .. py:method:: get_box_values_from_abi_type(abi_type: algokit_utils.applications.abi.ABIType, filter_func: collections.abc.Callable[[algokit_utils.models.state.BoxName], bool] | None = None) -> list[algokit_utils.applications.abi.BoxABIValue] + + Get multiple box values decoded according to an ABI type. + + :param abi_type: The ABI type to decode as + :param filter_func: Optional function to filter box names + :return: List of decoded box values + + :example: + >>> box_values = client.get_box_values_from_abi_type(abi_type) + + + + .. py:method:: fund_app_account(params: FundAppAccountParams, send_params: algokit_utils.models.transaction.SendParams | None = None) -> algokit_utils.transactions.transaction_sender.SendSingleTransactionResult + + Fund the application's account. + + :param params: The funding parameters + :param send_params: Send parameters, defaults to None + :return: The transaction result + + :example: + >>> result = client.fund_app_account(params) + + + diff --git a/docs/html/_sources/autoapi/algokit_utils/applications/app_deployer/index.rst.txt b/docs/html/_sources/autoapi/algokit_utils/applications/app_deployer/index.rst.txt new file mode 100644 index 00000000..b2c68143 --- /dev/null +++ b/docs/html/_sources/autoapi/algokit_utils/applications/app_deployer/index.rst.txt @@ -0,0 +1,373 @@ +algokit_utils.applications.app_deployer +======================================= + +.. py:module:: algokit_utils.applications.app_deployer + + +Attributes +---------- + +.. autoapisummary:: + + algokit_utils.applications.app_deployer.APP_DEPLOY_NOTE_DAPP + + +Classes +------- + +.. autoapisummary:: + + algokit_utils.applications.app_deployer.AppDeploymentMetaData + algokit_utils.applications.app_deployer.ApplicationReference + algokit_utils.applications.app_deployer.ApplicationMetaData + algokit_utils.applications.app_deployer.ApplicationLookup + algokit_utils.applications.app_deployer.AppDeployParams + algokit_utils.applications.app_deployer.AppDeployResult + algokit_utils.applications.app_deployer.AppDeployer + + +Module Contents +--------------- + +.. py:data:: APP_DEPLOY_NOTE_DAPP + :type: str + :value: 'ALGOKIT_DEPLOYER' + + +.. py:class:: AppDeploymentMetaData + + Metadata about an application stored in a transaction note during creation. + + + .. py:attribute:: name + :type: str + + + .. py:attribute:: version + :type: str + + + .. py:attribute:: deletable + :type: bool | None + + + .. py:attribute:: updatable + :type: bool | None + + + .. py:method:: dictify() -> dict[str, str | bool] + + +.. py:class:: ApplicationReference + + Information about an Algorand app + + + .. py:attribute:: app_id + :type: int + + + .. py:attribute:: app_address + :type: str + + +.. py:class:: ApplicationMetaData + + Complete metadata about a deployed app + + + .. py:attribute:: reference + :type: ApplicationReference + + + .. py:attribute:: deploy_metadata + :type: AppDeploymentMetaData + + + .. py:attribute:: created_round + :type: int + + + .. py:attribute:: updated_round + :type: int + + + .. py:attribute:: deleted + :type: bool + :value: False + + + + .. py:property:: app_id + :type: int + + + + .. py:property:: app_address + :type: str + + + + .. py:property:: name + :type: str + + + + .. py:property:: version + :type: str + + + + .. py:property:: deletable + :type: bool | None + + + + .. py:property:: updatable + :type: bool | None + + + +.. py:class:: ApplicationLookup + + Cache of {py:class}`ApplicationMetaData` for a specific `creator` + + Can be used as an argument to {py:class}`ApplicationClient` to reduce the number of calls when deploying multiple + apps or discovering multiple app_ids + + + .. py:attribute:: creator + :type: str + + + .. py:attribute:: apps + :type: dict[str, ApplicationMetaData] + + +.. py:class:: AppDeployParams + + Parameters for deploying an app + + + .. py:attribute:: metadata + :type: AppDeploymentMetaData + + The deployment metadata + + + + .. py:attribute:: deploy_time_params + :type: algokit_utils.models.state.TealTemplateParams | None + :value: None + + + Optional template parameters to use during compilation + + + + .. py:attribute:: on_schema_break + :type: Literal['replace', 'fail', 'append'] | algokit_utils.applications.enums.OnSchemaBreak | None + :value: None + + + Optional on schema break action + + + + .. py:attribute:: on_update + :type: Literal['update', 'replace', 'fail', 'append'] | algokit_utils.applications.enums.OnUpdate | None + :value: None + + + Optional on update action + + + + .. py:attribute:: create_params + :type: algokit_utils.transactions.transaction_composer.AppCreateParams | algokit_utils.transactions.transaction_composer.AppCreateMethodCallParams + + The creation parameters + + + + .. py:attribute:: update_params + :type: algokit_utils.transactions.transaction_composer.AppUpdateParams | algokit_utils.transactions.transaction_composer.AppUpdateMethodCallParams + + The update parameters + + + + .. py:attribute:: delete_params + :type: algokit_utils.transactions.transaction_composer.AppDeleteParams | algokit_utils.transactions.transaction_composer.AppDeleteMethodCallParams + + The deletion parameters + + + + .. py:attribute:: existing_deployments + :type: ApplicationLookup | None + :value: None + + + Optional existing deployments + + + + .. py:attribute:: ignore_cache + :type: bool + :value: False + + + Whether to ignore the cache + + + + .. py:attribute:: max_fee + :type: int | None + :value: None + + + Optional maximum fee + + + + .. py:attribute:: send_params + :type: algokit_utils.models.transaction.SendParams | None + :value: None + + + Optional send parameters + + + +.. py:class:: AppDeployResult + + The result of a deployment + + + .. py:attribute:: app + :type: ApplicationMetaData + + The application metadata + + + + .. py:attribute:: operation_performed + :type: algokit_utils.applications.enums.OperationPerformed + + The operation performed + + + + .. py:attribute:: create_result + :type: algokit_utils.transactions.transaction_sender.SendAppCreateTransactionResult[algokit_utils.applications.abi.ABIReturn] | None + :value: None + + + The create result + + + + .. py:attribute:: update_result + :type: algokit_utils.transactions.transaction_sender.SendAppUpdateTransactionResult[algokit_utils.applications.abi.ABIReturn] | None + :value: None + + + The update result + + + + .. py:attribute:: delete_result + :type: algokit_utils.transactions.transaction_sender.SendAppTransactionResult[algokit_utils.applications.abi.ABIReturn] | None + :value: None + + + The delete result + + + +.. py:class:: AppDeployer(app_manager: algokit_utils.applications.app_manager.AppManager, transaction_sender: algokit_utils.transactions.transaction_sender.AlgorandClientTransactionSender, indexer: algosdk.v2client.indexer.IndexerClient | None = None) + + Manages deployment and deployment metadata of applications + + :param app_manager: The app manager to use + :param transaction_sender: The transaction sender to use + :param indexer: The indexer to use + + :example: + >>> deployer = AppDeployer(app_manager, transaction_sender, indexer) + + + .. py:method:: deploy(deployment: AppDeployParams) -> AppDeployResult + + Idempotently deploy (create if not exists, update if changed) an app against the given name for the given + creator account, including deploy-time TEAL template placeholder substitutions (if specified). + + To understand the architecture decisions behind this functionality please see + https://github.com/algorandfoundation/algokit-cli/blob/main/docs/architecture-decisions/2023-01-12_smart-contract-deployment.md + + **Note:** When using the return from this function be sure to check `operation_performed` to get access to + return properties like `transaction`, `confirmation` and `delete_result`. + + **Note:** if there is a breaking state schema change to an existing app (and `on_schema_break` is set to + `'replace'`) the existing app will be deleted and re-created. + + **Note:** if there is an update (different TEAL code) to an existing app (and `on_update` is set to `'replace'`) + the existing app will be deleted and re-created. + + :param deployment: The arguments to control the app deployment + :returns: The result of the deployment + :raises ValueError: If the app spec format is invalid + + :example: + >>> deployer.deploy(AppDeployParams( + ... create_params=AppCreateParams( + ... sender='SENDER_ADDRESS', + ... approval_program='APPROVAL PROGRAM', + ... clear_state_program='CLEAR PROGRAM', + ... schema={ + ... 'global_byte_slices': 0, + ... 'global_ints': 0, + ... 'local_byte_slices': 0, + ... 'local_ints': 0 + ... } + ... ), + ... update_params=AppUpdateParams( + ... sender='SENDER_ADDRESS' + ... ), + ... delete_params=AppDeleteParams( + ... sender='SENDER_ADDRESS' + ... ), + ... metadata=AppDeploymentMetaData( + ... name='my_app', + ... version='2.0', + ... updatable=False, + ... deletable=False + ... ), + ... on_schema_break=OnSchemaBreak.AppendApp, + ... on_update=OnUpdate.AppendApp + ... ) + ... ) + + + + .. py:method:: get_creator_apps_by_name(*, creator_address: str, ignore_cache: bool = False) -> ApplicationLookup + + Returns a lookup of name => app metadata (id, address, ...metadata) for all apps created by the given account + that have an [ARC-2](https://github.com/algorandfoundation/ARCs/blob/main/ARCs/arc-0002.md) `AppDeployNote` as + the transaction note of the app creation transaction. + + This function caches the result for the given creator account so that subsequent calls won't require an indexer + lookup. + + If the `AppManager` instance wasn't created with an indexer client, this function will throw an error. + + :param creator_address: The address of the account that is the creator of the apps you want to search for + :param ignore_cache: Whether or not to ignore the cache and force a lookup, default: use the cache + :returns: A name-based lookup of the app metadata + :raises ValueError: If the app spec format is invalid + :example: + >>> result = await deployer.get_creator_apps_by_name(creator) + + + diff --git a/docs/html/_sources/autoapi/algokit_utils/applications/app_factory/index.rst.txt b/docs/html/_sources/autoapi/algokit_utils/applications/app_factory/index.rst.txt new file mode 100644 index 00000000..84c46f07 --- /dev/null +++ b/docs/html/_sources/autoapi/algokit_utils/applications/app_factory/index.rst.txt @@ -0,0 +1,429 @@ +algokit_utils.applications.app_factory +====================================== + +.. py:module:: algokit_utils.applications.app_factory + + +Classes +------- + +.. autoapisummary:: + + algokit_utils.applications.app_factory.AppFactoryParams + algokit_utils.applications.app_factory.AppFactoryCreateParams + algokit_utils.applications.app_factory.AppFactoryCreateMethodCallParams + algokit_utils.applications.app_factory.AppFactoryCreateMethodCallResult + algokit_utils.applications.app_factory.SendAppFactoryTransactionResult + algokit_utils.applications.app_factory.SendAppUpdateFactoryTransactionResult + algokit_utils.applications.app_factory.SendAppCreateFactoryTransactionResult + algokit_utils.applications.app_factory.AppFactoryDeployResult + algokit_utils.applications.app_factory.AppFactory + + +Module Contents +--------------- + +.. py:class:: AppFactoryParams + + .. py:attribute:: algorand + :type: algokit_utils.algorand.AlgorandClient + + + .. py:attribute:: app_spec + :type: algokit_utils.applications.app_spec.arc56.Arc56Contract | algokit_utils._legacy_v2.application_specification.ApplicationSpecification | str + + + .. py:attribute:: app_name + :type: str | None + :value: None + + + + .. py:attribute:: default_sender + :type: str | None + :value: None + + + + .. py:attribute:: default_signer + :type: algosdk.atomic_transaction_composer.TransactionSigner | None + :value: None + + + + .. py:attribute:: version + :type: str | None + :value: None + + + + .. py:attribute:: compilation_params + :type: algokit_utils.applications.app_client.AppClientCompilationParams | None + :value: None + + + +.. py:class:: AppFactoryCreateParams + + Bases: :py:obj:`algokit_utils.applications.app_client.AppClientBareCallCreateParams` + + + Parameters for creating application with bare call. + + + .. py:attribute:: on_complete + :type: algokit_utils.applications.app_client.CreateOnComplete | None + :value: None + + + Optional on complete action + + + +.. py:class:: AppFactoryCreateMethodCallParams + + Bases: :py:obj:`algokit_utils.applications.app_client.AppClientMethodCallCreateParams` + + + Parameters for creating application with method call + + +.. py:class:: AppFactoryCreateMethodCallResult + + Bases: :py:obj:`algokit_utils.transactions.transaction_sender.SendSingleTransactionResult`, :py:obj:`Generic`\ [\ :py:obj:`ABIReturnT`\ ] + + + Base class for transaction results. + + Represents the result of sending a single transaction. + + + .. py:attribute:: app_id + :type: int + + + .. py:attribute:: app_address + :type: str + + + .. py:attribute:: compiled_approval + :type: Any | None + :value: None + + + + .. py:attribute:: compiled_clear + :type: Any | None + :value: None + + + + .. py:attribute:: abi_return + :type: ABIReturnT | None + :value: None + + + +.. py:class:: SendAppFactoryTransactionResult + + Bases: :py:obj:`algokit_utils.transactions.transaction_sender.SendAppTransactionResult`\ [\ :py:obj:`algokit_utils.applications.abi.Arc56ReturnValueType`\ ] + + + Result of an application transaction. + + Contains the ABI return value if applicable. + + +.. py:class:: SendAppUpdateFactoryTransactionResult + + Bases: :py:obj:`algokit_utils.transactions.transaction_sender.SendAppUpdateTransactionResult`\ [\ :py:obj:`algokit_utils.applications.abi.Arc56ReturnValueType`\ ] + + + Result of updating an application. + + Contains the compiled approval and clear programs. + + +.. py:class:: SendAppCreateFactoryTransactionResult + + Bases: :py:obj:`algokit_utils.transactions.transaction_sender.SendAppCreateTransactionResult`\ [\ :py:obj:`algokit_utils.applications.abi.Arc56ReturnValueType`\ ] + + + Result of creating a new application. + + Contains the app ID and address of the newly created application. + + +.. py:class:: AppFactoryDeployResult + + Result from deploying an application via AppFactory + + + .. py:attribute:: app + :type: algokit_utils.applications.app_deployer.ApplicationMetaData + + The application metadata + + + + .. py:attribute:: operation_performed + :type: algokit_utils.applications.app_deployer.OperationPerformed + + The operation performed + + + + .. py:attribute:: create_result + :type: SendAppCreateFactoryTransactionResult | None + :value: None + + + The create result + + + + .. py:attribute:: update_result + :type: SendAppUpdateFactoryTransactionResult | None + :value: None + + + The update result + + + + .. py:attribute:: delete_result + :type: SendAppFactoryTransactionResult | None + :value: None + + + The delete result + + + + .. py:method:: from_deploy_result(response: algokit_utils.applications.app_deployer.AppDeployResult, deploy_params: algokit_utils.applications.app_deployer.AppDeployParams, app_spec: algokit_utils.applications.app_spec.arc56.Arc56Contract, app_compilation_data: algokit_utils.applications.app_client.AppClientCompilationResult | None = None) -> typing_extensions.Self + :classmethod: + + + Construct an AppFactoryDeployResult from a deployment result. + + :param response: The deployment response. + :param deploy_params: The deployment parameters. + :param app_spec: The application specification. + :param app_compilation_data: Optional app compilation data. + :return: An instance of AppFactoryDeployResult. + + + +.. py:class:: AppFactory(params: AppFactoryParams) + + ARC-56/ARC-32 app factory that, for a given app spec, allows you to create + and deploy one or more app instances and to create one or more app clients + to interact with those (or other) app instances. + + :param params: The parameters for the factory + + :example: + >>> factory = AppFactory(AppFactoryParams( + >>> algorand=AlgorandClient.mainnet(), + >>> app_spec=app_spec, + >>> ) + >>> ) + + + .. py:property:: app_name + :type: str + + + The name of the app + + + + .. py:property:: app_spec + :type: algokit_utils.applications.app_spec.arc56.Arc56Contract + + + The app spec + + + + .. py:property:: algorand + :type: algokit_utils.algorand.AlgorandClient + + + The algorand client + + + + .. py:property:: params + :type: _MethodParamsBuilder + + + Get parameters to create transactions (create and deploy related calls) for the current app. + + A good mental model for this is that these parameters represent a deferred transaction creation. + + :example: Create a transaction in the future using Algorand Client + >>> create_app_params = app_factory.params.create( + ... AppFactoryCreateMethodCallParams( + ... method='create_method', + ... args=[123, 'hello'] + ... ) + ... ) + >>> # ... + >>> algorand.send.app_create_method_call(create_app_params) + + :example: Define a nested transaction as an ABI argument + >>> create_app_params = appFactory.params.create( + ... AppFactoryCreateMethodCallParams( + ... method='create_method', + ... args=[123, 'hello'] + ... ) + ... ) + >>> app_client.send.call( + ... AppClientMethodCallParams( + ... method='my_method', + ... args=[create_app_params] + ... ) + ... ) + + + + .. py:property:: send + :type: _TransactionSender + + + Get the transaction sender. + + :return: The _TransactionSender instance. + + + + .. py:property:: create_transaction + :type: _TransactionCreator + + + Get the transaction creator. + + :return: The _TransactionCreator instance. + + + + .. py:method:: deploy(*, on_update: algokit_utils.applications.app_deployer.OnUpdate | None = None, on_schema_break: algokit_utils.applications.app_deployer.OnSchemaBreak | None = None, create_params: algokit_utils.applications.app_client.AppClientMethodCallCreateParams | algokit_utils.applications.app_client.AppClientBareCallCreateParams | None = None, update_params: algokit_utils.applications.app_client.AppClientMethodCallParams | algokit_utils.applications.app_client.AppClientBareCallParams | None = None, delete_params: algokit_utils.applications.app_client.AppClientMethodCallParams | algokit_utils.applications.app_client.AppClientBareCallParams | None = None, existing_deployments: algokit_utils.applications.app_deployer.ApplicationLookup | None = None, ignore_cache: bool = False, app_name: str | None = None, send_params: algokit_utils.models.transaction.SendParams | None = None, compilation_params: algokit_utils.applications.app_client.AppClientCompilationParams | None = None) -> tuple[algokit_utils.applications.app_client.AppClient, AppFactoryDeployResult] + + Idempotently deploy (create if not exists, update if changed) an app against the given name for the given + creator account, including deploy-time TEAL template placeholder substitutions (if specified). + + **Note:** When using the return from this function be sure to check `operationPerformed` to get access to + various return properties like `transaction`, `confirmation` and `deleteResult`. + + **Note:** if there is a breaking state schema change to an existing app (and `onSchemaBreak` is set to + `'replace'`) the existing app will be deleted and re-created. + + **Note:** if there is an update (different TEAL code) to an existing app (and `onUpdate` is set to + `'replace'`) the existing app will be deleted and re-created. + + :param on_update: The action to take if there is an update to the app + :param on_schema_break: The action to take if there is a breaking state schema change to the app + :param create_params: The arguments to create the app + :param update_params: The arguments to update the app + :param delete_params: The arguments to delete the app + :param existing_deployments: The existing deployments to use + :param ignore_cache: Whether to ignore the cache + :param app_name: The name of the app + :param send_params: The parameters for the send call + :param compilation_params: The parameters for the compilation + :returns: The app client and the result of the deployment + + :example: + >>> app_client, result = factory.deploy({ + >>> create_params=AppClientMethodCallCreateParams( + >>> sender='SENDER_ADDRESS', + >>> approval_program='APPROVAL PROGRAM', + >>> clear_state_program='CLEAR PROGRAM', + >>> schema={ + >>> "global_byte_slices": 0, + >>> "global_ints": 0, + >>> "local_byte_slices": 0, + >>> "local_ints": 0 + >>> } + >>> ), + >>> update_params=AppClientMethodCallParams( + >>> sender='SENDER_ADDRESS' + >>> ), + >>> delete_params=AppClientMethodCallParams( + >>> sender='SENDER_ADDRESS' + >>> ), + >>> compilation_params=AppClientCompilationParams( + >>> updatable=False, + >>> deletable=False + >>> ), + >>> app_name='my_app', + >>> on_schema_break=OnSchemaBreak.AppendApp, + >>> on_update=OnUpdate.AppendApp + >>> }) + + + + .. py:method:: get_app_client_by_id(app_id: int, app_name: str | None = None, default_sender: str | None = None, default_signer: algosdk.atomic_transaction_composer.TransactionSigner | None = None, approval_source_map: algosdk.source_map.SourceMap | None = None, clear_source_map: algosdk.source_map.SourceMap | None = None) -> algokit_utils.applications.app_client.AppClient + + Returns a new `AppClient` client for an app instance of the given ID. + + :param app_id: The id of the app + :param app_name: The name of the app + :param default_sender: The default sender address + :param default_signer: The default signer + :param approval_source_map: The approval source map + :param clear_source_map: The clear source map + :return AppClient: The app client + + :example: + >>> app_client = factory.get_app_client_by_id(app_id=123) + + + + .. py:method:: get_app_client_by_creator_and_name(creator_address: str, app_name: str, default_sender: str | None = None, default_signer: algosdk.atomic_transaction_composer.TransactionSigner | None = None, ignore_cache: bool | None = None, app_lookup_cache: algokit_utils.applications.app_deployer.ApplicationLookup | None = None, approval_source_map: algosdk.source_map.SourceMap | None = None, clear_source_map: algosdk.source_map.SourceMap | None = None) -> algokit_utils.applications.app_client.AppClient + + Returns a new `AppClient` client, resolving the app by creator address and name + using AlgoKit app deployment semantics (i.e. looking for the app creation transaction note). + + :param creator_address: The creator address + :param app_name: The name of the app + :param default_sender: The default sender address + :param default_signer: The default signer + :param ignore_cache: Whether to ignore the cache and force a lookup + :param app_lookup_cache: Optional cache of existing app deployments to use instead of querying the indexer + :param approval_source_map: Optional source map for the approval program + :param clear_source_map: Optional source map for the clear state program + :return: An AppClient instance configured for the resolved application + + :example: + >>> app_client = factory.get_app_client_by_creator_and_name( + ... creator_address='SENDER_ADDRESS', + ... app_name='my_app' + ... ) + + + + .. py:method:: export_source_maps() -> algokit_utils.models.application.AppSourceMaps + + + .. py:method:: import_source_maps(source_maps: algokit_utils.models.application.AppSourceMaps) -> None + + Import the provided source maps into the factory. + + :param source_maps: An AppSourceMaps instance containing the approval and clear source maps. + + + + .. py:method:: compile(compilation_params: algokit_utils.applications.app_client.AppClientCompilationParams | None = None) -> algokit_utils.applications.app_client.AppClientCompilationResult + + Compile the app's TEAL code. + + :param compilation_params: The compilation parameters + :return AppClientCompilationResult: The compilation result + + :example: + >>> compilation_result = factory.compile() + + + diff --git a/docs/html/_sources/autoapi/algokit_utils/applications/app_manager/index.rst.txt b/docs/html/_sources/autoapi/algokit_utils/applications/app_manager/index.rst.txt new file mode 100644 index 00000000..f9bade83 --- /dev/null +++ b/docs/html/_sources/autoapi/algokit_utils/applications/app_manager/index.rst.txt @@ -0,0 +1,337 @@ +algokit_utils.applications.app_manager +====================================== + +.. py:module:: algokit_utils.applications.app_manager + + +Attributes +---------- + +.. autoapisummary:: + + algokit_utils.applications.app_manager.UPDATABLE_TEMPLATE_NAME + algokit_utils.applications.app_manager.DELETABLE_TEMPLATE_NAME + + +Classes +------- + +.. autoapisummary:: + + algokit_utils.applications.app_manager.AppManager + + +Module Contents +--------------- + +.. py:data:: UPDATABLE_TEMPLATE_NAME + :value: 'TMPL_UPDATABLE' + + + The name of the TEAL template variable for deploy-time immutability control. + + +.. py:data:: DELETABLE_TEMPLATE_NAME + :value: 'TMPL_DELETABLE' + + + The name of the TEAL template variable for deploy-time permanence control. + + +.. py:class:: AppManager(algod_client: algosdk.v2client.algod.AlgodClient) + + A manager class for interacting with Algorand applications. + + Provides functionality for compiling TEAL code, managing application state, + and interacting with application boxes. + + :param algod_client: The Algorand client instance to use for interacting with the network + + :example: + >>> app_manager = AppManager(algod_client) + + + .. py:method:: compile_teal(teal_code: str) -> algokit_utils.models.application.CompiledTeal + + Compile TEAL source code. + + :param teal_code: The TEAL source code to compile + :return: The compiled TEAL code and associated metadata + + + + .. py:method:: compile_teal_template(teal_template_code: str, template_params: algokit_utils.models.state.TealTemplateParams | None = None, deployment_metadata: collections.abc.Mapping[str, bool | None] | None = None) -> algokit_utils.models.application.CompiledTeal + + Compile a TEAL template with parameters. + + :param teal_template_code: The TEAL template code to compile + :param template_params: Parameters to substitute in the template + :param deployment_metadata: Deployment control parameters + :return: The compiled TEAL code and associated metadata + + :example: + >>> app_manager = AppManager(algod_client) + >>> teal_template_code = + ... # This is a TEAL template + ... # It can contain template variables like {TMPL_UPDATABLE} and {TMPL_DELETABLE} + ... + >>> compiled_teal = app_manager.compile_teal_template(teal_template_code) + + + + .. py:method:: get_compilation_result(teal_code: str) -> algokit_utils.models.application.CompiledTeal | None + + Get cached compilation result for TEAL code if available. + + :param teal_code: The TEAL source code + :return: The cached compilation result if available, None otherwise + + :example: + >>> app_manager = AppManager(algod_client) + >>> teal_code = "RETURN 1" + >>> compiled_teal = app_manager.compile_teal(teal_code) + >>> compilation_result = app_manager.get_compilation_result(teal_code) + + + + .. py:method:: get_by_id(app_id: int) -> algokit_utils.models.application.AppInformation + + Get information about an application by ID. + + :param app_id: The application ID + :return: Information about the application + + :example: + >>> app_manager = AppManager(algod_client) + >>> app_id = 1234567890 + >>> app_info = app_manager.get_by_id(app_id) + + + + .. py:method:: get_global_state(app_id: int) -> dict[str, algokit_utils.models.application.AppState] + + Get the global state of an application. + + :param app_id: The application ID + :return: The application's global state + + :example: + >>> app_manager = AppManager(algod_client) + >>> app_id = 123 + >>> global_state = app_manager.get_global_state(app_id) + + + + .. py:method:: get_local_state(app_id: int, address: str) -> dict[str, algokit_utils.models.application.AppState] + + Get the local state for an account in an application. + + :param app_id: The application ID + :param address: The account address + :return: The account's local state for the application + :raises ValueError: If local state is not found + + :example: + >>> app_manager = AppManager(algod_client) + >>> app_id = 123 + >>> address = "SENDER_ADDRESS" + >>> local_state = app_manager.get_local_state(app_id, address) + + + + .. py:method:: get_box_names(app_id: int) -> list[algokit_utils.models.state.BoxName] + + Get names of all boxes for an application. + + :param app_id: The application ID + :return: List of box names + + :example: + >>> app_manager = AppManager(algod_client) + >>> app_id = 123 + >>> box_names = app_manager.get_box_names(app_id) + + + + .. py:method:: get_box_value(app_id: int, box_name: algokit_utils.models.state.BoxIdentifier) -> bytes + + Get the value stored in a box. + + :param app_id: The application ID + :param box_name: The box identifier + :return: The box value as bytes + + :example: + >>> app_manager = AppManager(algod_client) + >>> app_id = 123 + >>> box_name = "BOX_NAME" + >>> box_value = app_manager.get_box_value(app_id, box_name) + + + + .. py:method:: get_box_values(app_id: int, box_names: list[algokit_utils.models.state.BoxIdentifier]) -> list[bytes] + + Get values for multiple boxes. + + :param app_id: The application ID + :param box_names: List of box identifiers + :return: List of box values as bytes + + :example: + >>> app_manager = AppManager(algod_client) + >>> app_id = 123 + >>> box_names = ["BOX_NAME_1", "BOX_NAME_2"] + >>> box_values = app_manager.get_box_values(app_id, box_names) + + + + .. py:method:: get_box_value_from_abi_type(app_id: int, box_name: algokit_utils.models.state.BoxIdentifier, abi_type: algokit_utils.applications.abi.ABIType) -> algokit_utils.applications.abi.ABIValue + + Get and decode a box value using an ABI type. + + :param app_id: The application ID + :param box_name: The box identifier + :param abi_type: The ABI type to decode with + :return: The decoded box value + :raises ValueError: If decoding fails + + :example: + >>> app_manager = AppManager(algod_client) + >>> app_id = 123 + >>> box_name = "BOX_NAME" + >>> abi_type = ABIType.UINT + >>> box_value = app_manager.get_box_value_from_abi_type(app_id, box_name, abi_type) + + + + .. py:method:: get_box_values_from_abi_type(app_id: int, box_names: list[algokit_utils.models.state.BoxIdentifier], abi_type: algokit_utils.applications.abi.ABIType) -> list[algokit_utils.applications.abi.ABIValue] + + Get and decode multiple box values using an ABI type. + + :param app_id: The application ID + :param box_names: List of box identifiers + :param abi_type: The ABI type to decode with + :return: List of decoded box values + + :example: + >>> app_manager = AppManager(algod_client) + >>> app_id = 123 + >>> box_names = ["BOX_NAME_1", "BOX_NAME_2"] + >>> abi_type = ABIType.UINT + >>> box_values = app_manager.get_box_values_from_abi_type(app_id, box_names, abi_type) + + + + .. py:method:: get_box_reference(box_id: algokit_utils.models.state.BoxIdentifier | algokit_utils.models.state.BoxReference) -> tuple[int, bytes] + :staticmethod: + + + Get standardized box reference from various identifier types. + + :param box_id: The box identifier + :return: Tuple of (app_id, box_name_bytes) + :raises ValueError: If box identifier type is invalid + + :example: + >>> app_manager = AppManager(algod_client) + >>> app_id = 123 + >>> box_name = "BOX_NAME" + >>> box_reference = app_manager.get_box_reference(box_name) + + + + .. py:method:: get_abi_return(confirmation: algosdk.v2client.algod.AlgodResponseType, method: algosdk.abi.Method | None = None) -> algokit_utils.applications.abi.ABIReturn | None + :staticmethod: + + + Get the ABI return value from a transaction confirmation. + + :param confirmation: The transaction confirmation + :param method: The ABI method + :return: The parsed ABI return value, or None if not available + + :example: + >>> app_manager = AppManager(algod_client) + >>> app_id = 123 + >>> method = "METHOD_NAME" + >>> confirmation = algod_client.pending_transaction_info(tx_id) + >>> abi_return = app_manager.get_abi_return(confirmation, method) + + + + .. py:method:: decode_app_state(state: list[dict[str, Any]]) -> dict[str, algokit_utils.models.application.AppState] + :staticmethod: + + + Decode application state from raw format. + + :param state: The raw application state + :return: Decoded application state + :raises ValueError: If unknown state data type is encountered + + :example: + >>> app_manager = AppManager(algod_client) + >>> app_id = 123 + >>> state = app_manager.get_global_state(app_id) + >>> decoded_state = app_manager.decode_app_state(state) + + + + .. py:method:: replace_template_variables(program: str, template_values: algokit_utils.models.state.TealTemplateParams) -> str + :staticmethod: + + + Replace template variables in TEAL code. + + :param program: The TEAL program code + :param template_values: Template variable values to substitute + :return: TEAL code with substituted values + :raises ValueError: If template value type is unexpected + + :example: + >>> app_manager = AppManager(algod_client) + >>> app_id = 123 + >>> program = "RETURN 1" + >>> template_values = {"TMPL_UPDATABLE": True, "TMPL_DELETABLE": True} + >>> updated_program = app_manager.replace_template_variables(program, template_values) + + + + .. py:method:: replace_teal_template_deploy_time_control_params(teal_template_code: str, params: collections.abc.Mapping[str, bool | None]) -> str + :staticmethod: + + + Replace deploy-time control parameters in TEAL template. + + :param teal_template_code: The TEAL template code + :param params: The deploy-time control parameters + :return: TEAL code with substituted control parameters + :raises ValueError: If template variables not found in code + + :example: + >>> app_manager = AppManager(algod_client) + >>> app_id = 123 + >>> teal_template_code = "RETURN 1" + >>> params = {"TMPL_UPDATABLE": True, "TMPL_DELETABLE": True} + >>> updated_teal_code = app_manager.replace_teal_template_deploy_time_control_params( + teal_template_code, params + ) + + + + .. py:method:: strip_teal_comments(teal_code: str) -> str + :staticmethod: + + + Strip comments from TEAL code. + + :param teal_code: The TEAL code to strip comments from + :return: The TEAL code with comments stripped + + :example: + >>> app_manager = AppManager(algod_client) + >>> teal_code = "RETURN 1" + >>> stripped_teal_code = app_manager.strip_teal_comments(teal_code) + + + diff --git a/docs/html/_sources/autoapi/algokit_utils/applications/app_spec/arc32/index.rst.txt b/docs/html/_sources/autoapi/algokit_utils/applications/app_spec/arc32/index.rst.txt new file mode 100644 index 00000000..ccca2384 --- /dev/null +++ b/docs/html/_sources/autoapi/algokit_utils/applications/app_spec/arc32/index.rst.txt @@ -0,0 +1,244 @@ +algokit_utils.applications.app_spec.arc32 +========================================= + +.. py:module:: algokit_utils.applications.app_spec.arc32 + + +Attributes +---------- + +.. autoapisummary:: + + algokit_utils.applications.app_spec.arc32.AppSpecStateDict + algokit_utils.applications.app_spec.arc32.OnCompleteActionName + algokit_utils.applications.app_spec.arc32.MethodConfigDict + algokit_utils.applications.app_spec.arc32.DefaultArgumentType + algokit_utils.applications.app_spec.arc32.StateDict + + +Classes +------- + +.. autoapisummary:: + + algokit_utils.applications.app_spec.arc32.CallConfig + algokit_utils.applications.app_spec.arc32.StructArgDict + algokit_utils.applications.app_spec.arc32.DefaultArgumentDict + algokit_utils.applications.app_spec.arc32.MethodHints + algokit_utils.applications.app_spec.arc32.Arc32Contract + + +Module Contents +--------------- + +.. py:data:: AppSpecStateDict + :type: TypeAlias + :value: dict[str, dict[str, dict]] + + + Type defining Application Specification state entries + + +.. py:class:: CallConfig + + Bases: :py:obj:`enum.IntFlag` + + + Describes the type of calls a method can be used for based on {py:class}`algosdk.transaction.OnComplete` type + + + .. py:attribute:: NEVER + :value: 0 + + + Never handle the specified on completion type + + + + .. py:attribute:: CALL + :value: 1 + + + Only handle the specified on completion type for application calls + + + + .. py:attribute:: CREATE + :value: 2 + + + Only handle the specified on completion type for application create calls + + + + .. py:attribute:: ALL + :value: 3 + + + Handle the specified on completion type for both create and normal application calls + + + +.. py:class:: StructArgDict + + Bases: :py:obj:`TypedDict` + + + dict() -> new empty dictionary + dict(mapping) -> new dictionary initialized from a mapping object's + (key, value) pairs + dict(iterable) -> new dictionary initialized as if via: + d = {} + for k, v in iterable: + d[k] = v + dict(**kwargs) -> new dictionary initialized with the name=value pairs + in the keyword argument list. For example: dict(one=1, two=2) + + + .. py:attribute:: name + :type: str + + + .. py:attribute:: elements + :type: list[list[str]] + + +.. py:data:: OnCompleteActionName + :type: TypeAlias + :value: Literal['no_op', 'opt_in', 'close_out', 'clear_state', 'update_application', 'delete_application'] + + + String literals representing on completion transaction types + + +.. py:data:: MethodConfigDict + :type: TypeAlias + :value: dict[OnCompleteActionName, CallConfig] + + + Dictionary of `dict[OnCompletionActionName, CallConfig]` representing allowed actions for each on completion type + + +.. py:data:: DefaultArgumentType + :type: TypeAlias + :value: Literal['abi-method', 'local-state', 'global-state', 'constant'] + + + Literal values describing the types of default argument sources + + +.. py:class:: DefaultArgumentDict + + Bases: :py:obj:`TypedDict` + + + DefaultArgument is a container for any arguments that may + be resolved prior to calling some target method + + + .. py:attribute:: source + :type: DefaultArgumentType + + + .. py:attribute:: data + :type: int | str | bytes | algosdk.abi.method.MethodDict + + +.. py:data:: StateDict + +.. py:class:: MethodHints + + MethodHints provides hints to the caller about how to call the method + + + .. py:attribute:: read_only + :type: bool + :value: False + + + + .. py:attribute:: structs + :type: dict[str, StructArgDict] + + + .. py:attribute:: default_arguments + :type: dict[str, DefaultArgumentDict] + + + .. py:attribute:: call_config + :type: MethodConfigDict + + + .. py:method:: empty() -> bool + + + .. py:method:: dictify() -> dict[str, Any] + + + .. py:method:: undictify(data: dict[str, Any]) -> MethodHints + :staticmethod: + + + +.. py:class:: Arc32Contract + + ARC-0032 application specification + + See + + + .. py:attribute:: approval_program + :type: str + + + .. py:attribute:: clear_program + :type: str + + + .. py:attribute:: contract + :type: algosdk.abi.Contract + + + .. py:attribute:: hints + :type: dict[str, MethodHints] + + + .. py:attribute:: schema + :type: StateDict + + + .. py:attribute:: global_state_schema + :type: algosdk.transaction.StateSchema + + + .. py:attribute:: local_state_schema + :type: algosdk.transaction.StateSchema + + + .. py:attribute:: bare_call_config + :type: MethodConfigDict + + + .. py:method:: dictify() -> dict + + + .. py:method:: to_json(indent: int | None = None) -> str + + + .. py:method:: from_json(application_spec: str) -> Arc32Contract + :staticmethod: + + + + .. py:method:: export(directory: pathlib.Path | str | None = None) -> None + + Write out the artifacts generated by the application to disk. + + Writes the approval program, clear program, contract specification and application specification + to files in the specified directory. + + :param directory: Path to the directory where the artifacts should be written. If not specified, + uses the current working directory + + + diff --git a/docs/html/_sources/autoapi/algokit_utils/applications/app_spec/arc56/index.rst.txt b/docs/html/_sources/autoapi/algokit_utils/applications/app_spec/arc56/index.rst.txt new file mode 100644 index 00000000..b386bc23 --- /dev/null +++ b/docs/html/_sources/autoapi/algokit_utils/applications/app_spec/arc56/index.rst.txt @@ -0,0 +1,1304 @@ +algokit_utils.applications.app_spec.arc56 +========================================= + +.. py:module:: algokit_utils.applications.app_spec.arc56 + + +Classes +------- + +.. autoapisummary:: + + algokit_utils.applications.app_spec.arc56.StructField + algokit_utils.applications.app_spec.arc56.CallEnum + algokit_utils.applications.app_spec.arc56.CreateEnum + algokit_utils.applications.app_spec.arc56.BareActions + algokit_utils.applications.app_spec.arc56.ByteCode + algokit_utils.applications.app_spec.arc56.Compiler + algokit_utils.applications.app_spec.arc56.CompilerVersion + algokit_utils.applications.app_spec.arc56.CompilerInfo + algokit_utils.applications.app_spec.arc56.Network + algokit_utils.applications.app_spec.arc56.ScratchVariables + algokit_utils.applications.app_spec.arc56.Source + algokit_utils.applications.app_spec.arc56.Global + algokit_utils.applications.app_spec.arc56.Local + algokit_utils.applications.app_spec.arc56.Schema + algokit_utils.applications.app_spec.arc56.TemplateVariables + algokit_utils.applications.app_spec.arc56.EventArg + algokit_utils.applications.app_spec.arc56.Event + algokit_utils.applications.app_spec.arc56.Actions + algokit_utils.applications.app_spec.arc56.DefaultValue + algokit_utils.applications.app_spec.arc56.MethodArg + algokit_utils.applications.app_spec.arc56.Boxes + algokit_utils.applications.app_spec.arc56.Recommendations + algokit_utils.applications.app_spec.arc56.Returns + algokit_utils.applications.app_spec.arc56.Method + algokit_utils.applications.app_spec.arc56.PcOffsetMethod + algokit_utils.applications.app_spec.arc56.SourceInfo + algokit_utils.applications.app_spec.arc56.StorageKey + algokit_utils.applications.app_spec.arc56.StorageMap + algokit_utils.applications.app_spec.arc56.Keys + algokit_utils.applications.app_spec.arc56.Maps + algokit_utils.applications.app_spec.arc56.State + algokit_utils.applications.app_spec.arc56.ProgramSourceInfo + algokit_utils.applications.app_spec.arc56.SourceInfoModel + algokit_utils.applications.app_spec.arc56.Arc56Contract + + +Module Contents +--------------- + +.. py:class:: StructField + + Represents a field in a struct type. + + + .. py:attribute:: name + :type: str + + The name of the struct field + + + + .. py:attribute:: type + :type: list[StructField] | str + + The type of the struct field, either a string or list of StructFields + + + + .. py:method:: from_dict(data: dict[str, Any]) -> StructField + :staticmethod: + + + +.. py:class:: CallEnum + + Bases: :py:obj:`str`, :py:obj:`enum.Enum` + + + Enum representing different call types for application transactions. + + + .. py:attribute:: CLEAR_STATE + :value: 'ClearState' + + + + .. py:attribute:: CLOSE_OUT + :value: 'CloseOut' + + + + .. py:attribute:: DELETE_APPLICATION + :value: 'DeleteApplication' + + + + .. py:attribute:: NO_OP + :value: 'NoOp' + + + + .. py:attribute:: OPT_IN + :value: 'OptIn' + + + + .. py:attribute:: UPDATE_APPLICATION + :value: 'UpdateApplication' + + + +.. py:class:: CreateEnum + + Bases: :py:obj:`str`, :py:obj:`enum.Enum` + + + Enum representing different create types for application transactions. + + + .. py:attribute:: DELETE_APPLICATION + :value: 'DeleteApplication' + + + + .. py:attribute:: NO_OP + :value: 'NoOp' + + + + .. py:attribute:: OPT_IN + :value: 'OptIn' + + + +.. py:class:: BareActions + + Represents bare call and create actions for an application. + + + .. py:attribute:: call + :type: list[CallEnum] + + The list of allowed call actions + + + + .. py:attribute:: create + :type: list[CreateEnum] + + The list of allowed create actions + + + + .. py:method:: from_dict(data: dict[str, Any]) -> BareActions + :staticmethod: + + + +.. py:class:: ByteCode + + Represents the approval and clear program bytecode. + + + .. py:attribute:: approval + :type: str + + The base64 encoded approval program bytecode + + + + .. py:attribute:: clear + :type: str + + The base64 encoded clear program bytecode + + + + .. py:method:: from_dict(data: dict[str, Any]) -> ByteCode + :staticmethod: + + + +.. py:class:: Compiler + + Bases: :py:obj:`str`, :py:obj:`enum.Enum` + + + Enum representing different compiler types. + + + .. py:attribute:: ALGOD + :value: 'algod' + + + + .. py:attribute:: PUYA + :value: 'puya' + + + +.. py:class:: CompilerVersion + + Represents compiler version information. + + + .. py:attribute:: commit_hash + :type: str | None + :value: None + + + The git commit hash of the compiler + + + + .. py:attribute:: major + :type: int | None + :value: None + + + The major version number + + + + .. py:attribute:: minor + :type: int | None + :value: None + + + The minor version number + + + + .. py:attribute:: patch + :type: int | None + :value: None + + + The patch version number + + + + .. py:method:: from_dict(data: dict[str, Any]) -> CompilerVersion + :staticmethod: + + + +.. py:class:: CompilerInfo + + Information about the compiler used. + + + .. py:attribute:: compiler + :type: Compiler + + The type of compiler used + + + + .. py:attribute:: compiler_version + :type: CompilerVersion + + Version information for the compiler + + + + .. py:method:: from_dict(data: dict[str, Any]) -> CompilerInfo + :staticmethod: + + + +.. py:class:: Network + + Network-specific application information. + + + .. py:attribute:: app_id + :type: int + + The application ID on the network + + + + .. py:method:: from_dict(data: dict[str, Any]) -> Network + :staticmethod: + + + +.. py:class:: ScratchVariables + + Information about scratch space variables. + + + .. py:attribute:: slot + :type: int + + The scratch slot number + + + + .. py:attribute:: type + :type: str + + The type of the scratch variable + + + + .. py:method:: from_dict(data: dict[str, Any]) -> ScratchVariables + :staticmethod: + + + +.. py:class:: Source + + Source code for approval and clear programs. + + + .. py:attribute:: approval + :type: str + + The base64 encoded approval program source + + + + .. py:attribute:: clear + :type: str + + The base64 encoded clear program source + + + + .. py:method:: from_dict(data: dict[str, Any]) -> Source + :staticmethod: + + + + .. py:method:: get_decoded_approval() -> str + + Get decoded approval program source. + + :return: Decoded approval program source code + + + + .. py:method:: get_decoded_clear() -> str + + Get decoded clear program source. + + :return: Decoded clear program source code + + + +.. py:class:: Global + + Global state schema. + + + .. py:attribute:: bytes + :type: int + + The number of byte slices in global state + + + + .. py:attribute:: ints + :type: int + + The number of integers in global state + + + + .. py:method:: from_dict(data: dict[str, Any]) -> Global + :staticmethod: + + + +.. py:class:: Local + + Local state schema. + + + .. py:attribute:: bytes + :type: int + + The number of byte slices in local state + + + + .. py:attribute:: ints + :type: int + + The number of integers in local state + + + + .. py:method:: from_dict(data: dict[str, Any]) -> Local + :staticmethod: + + + +.. py:class:: Schema + + Application state schema. + + + .. py:attribute:: global_state + :type: Global + + The global state schema + + + + .. py:attribute:: local_state + :type: Local + + The local state schema + + + + .. py:method:: from_dict(data: dict[str, Any]) -> Schema + :staticmethod: + + + +.. py:class:: TemplateVariables + + Template variable information. + + + .. py:attribute:: type + :type: str + + The type of the template variable + + + + .. py:attribute:: value + :type: str | None + :value: None + + + The optional value of the template variable + + + + .. py:method:: from_dict(data: dict[str, Any]) -> TemplateVariables + :staticmethod: + + + +.. py:class:: EventArg + + Event argument information. + + + .. py:attribute:: type + :type: str + + The type of the event argument + + + + .. py:attribute:: desc + :type: str | None + :value: None + + + The optional description of the argument + + + + .. py:attribute:: name + :type: str | None + :value: None + + + The optional name of the argument + + + + .. py:attribute:: struct + :type: str | None + :value: None + + + The optional struct type name + + + + .. py:method:: from_dict(data: dict[str, Any]) -> EventArg + :staticmethod: + + + +.. py:class:: Event + + Event information. + + + .. py:attribute:: args + :type: list[EventArg] + + The list of event arguments + + + + .. py:attribute:: name + :type: str + + The name of the event + + + + .. py:attribute:: desc + :type: str | None + :value: None + + + The optional description of the event + + + + .. py:method:: from_dict(data: dict[str, Any]) -> Event + :staticmethod: + + + +.. py:class:: Actions + + Method actions information. + + + .. py:attribute:: call + :type: list[CallEnum] | None + :value: None + + + The optional list of allowed call actions + + + + .. py:attribute:: create + :type: list[CreateEnum] | None + :value: None + + + The optional list of allowed create actions + + + + .. py:method:: from_dict(data: dict[str, Any]) -> Actions + :staticmethod: + + + +.. py:class:: DefaultValue + + Default value information for method arguments. + + + .. py:attribute:: data + :type: str + + The default value data + + + + .. py:attribute:: source + :type: Literal['box', 'global', 'local', 'literal', 'method'] + + The source of the default value + + + + .. py:attribute:: type + :type: str | None + :value: None + + + The optional type of the default value + + + + .. py:method:: from_dict(data: dict[str, Any]) -> DefaultValue + :staticmethod: + + + +.. py:class:: MethodArg + + Method argument information. + + + .. py:attribute:: type + :type: str + + The type of the argument + + + + .. py:attribute:: default_value + :type: DefaultValue | None + :value: None + + + The optional default value + + + + .. py:attribute:: desc + :type: str | None + :value: None + + + The optional description + + + + .. py:attribute:: name + :type: str | None + :value: None + + + The optional name + + + + .. py:attribute:: struct + :type: str | None + :value: None + + + The optional struct type name + + + + .. py:method:: from_dict(data: dict[str, Any]) -> MethodArg + :staticmethod: + + + +.. py:class:: Boxes + + Box storage requirements. + + + .. py:attribute:: key + :type: str + + The box key + + + + .. py:attribute:: read_bytes + :type: int + + The number of bytes to read + + + + .. py:attribute:: write_bytes + :type: int + + The number of bytes to write + + + + .. py:attribute:: app + :type: int | None + :value: None + + + The optional application ID + + + + .. py:method:: from_dict(data: dict[str, Any]) -> Boxes + :staticmethod: + + + +.. py:class:: Recommendations + + Method execution recommendations. + + + .. py:attribute:: accounts + :type: list[str] | None + :value: None + + + The optional list of accounts + + + + .. py:attribute:: apps + :type: list[int] | None + :value: None + + + The optional list of applications + + + + .. py:attribute:: assets + :type: list[int] | None + :value: None + + + The optional list of assets + + + + .. py:attribute:: boxes + :type: Boxes | None + :value: None + + + The optional box storage requirements + + + + .. py:attribute:: inner_transaction_count + :type: int | None + :value: None + + + The optional inner transaction count + + + + .. py:method:: from_dict(data: dict[str, Any]) -> Recommendations + :staticmethod: + + + +.. py:class:: Returns + + Method return information. + + + .. py:attribute:: type + :type: str + + The type of the return value + + + + .. py:attribute:: desc + :type: str | None + :value: None + + + The optional description + + + + .. py:attribute:: struct + :type: str | None + :value: None + + + The optional struct type name + + + + .. py:method:: from_dict(data: dict[str, Any]) -> Returns + :staticmethod: + + + +.. py:class:: Method + + Method information. + + + .. py:attribute:: actions + :type: Actions + + The allowed actions + + + + .. py:attribute:: args + :type: list[MethodArg] + + The method arguments + + + + .. py:attribute:: name + :type: str + + The method name + + + + .. py:attribute:: returns + :type: Returns + + The return information + + + + .. py:attribute:: desc + :type: str | None + :value: None + + + The optional description + + + + .. py:attribute:: events + :type: list[Event] | None + :value: None + + + The optional list of events + + + + .. py:attribute:: readonly + :type: bool | None + :value: None + + + The optional readonly flag + + + + .. py:attribute:: recommendations + :type: Recommendations | None + :value: None + + + The optional execution recommendations + + + + .. py:method:: to_abi_method() -> algosdk.abi.Method + + Convert to ABI method. + + :raises ValueError: If underlying ABI method is not initialized + :return: ABI method + + + + .. py:method:: from_dict(data: dict[str, Any]) -> Method + :staticmethod: + + + +.. py:class:: PcOffsetMethod + + Bases: :py:obj:`str`, :py:obj:`enum.Enum` + + + PC offset method types. + + + .. py:attribute:: CBLOCKS + :value: 'cblocks' + + + + .. py:attribute:: NONE + :value: 'none' + + + +.. py:class:: SourceInfo + + Source code location information. + + + .. py:attribute:: pc + :type: list[int] + + The list of program counter values + + + + .. py:attribute:: error_message + :type: str | None + :value: None + + + The optional error message + + + + .. py:attribute:: source + :type: str | None + :value: None + + + The optional source code + + + + .. py:attribute:: teal + :type: int | None + :value: None + + + The optional TEAL version + + + + .. py:method:: from_dict(data: dict[str, Any]) -> SourceInfo + :staticmethod: + + + +.. py:class:: StorageKey + + Storage key information. + + + .. py:attribute:: key + :type: str + + The storage key + + + + .. py:attribute:: key_type + :type: str + + The type of the key + + + + .. py:attribute:: value_type + :type: str + + The type of the value + + + + .. py:attribute:: desc + :type: str | None + :value: None + + + The optional description + + + + .. py:method:: from_dict(data: dict[str, Any]) -> StorageKey + :staticmethod: + + + +.. py:class:: StorageMap + + Storage map information. + + + .. py:attribute:: key_type + :type: str + + The type of the map keys + + + + .. py:attribute:: value_type + :type: str + + The type of the map values + + + + .. py:attribute:: desc + :type: str | None + :value: None + + + The optional description + + + + .. py:attribute:: prefix + :type: str | None + :value: None + + + The optional key prefix + + + + .. py:method:: from_dict(data: dict[str, Any]) -> StorageMap + :staticmethod: + + + +.. py:class:: Keys + + Storage keys for different storage types. + + + .. py:attribute:: box + :type: dict[str, StorageKey] + + The box storage keys + + + + .. py:attribute:: global_state + :type: dict[str, StorageKey] + + The global state storage keys + + + + .. py:attribute:: local_state + :type: dict[str, StorageKey] + + The local state storage keys + + + + .. py:method:: from_dict(data: dict[str, Any]) -> Keys + :staticmethod: + + + +.. py:class:: Maps + + Storage maps for different storage types. + + + .. py:attribute:: box + :type: dict[str, StorageMap] + + The box storage maps + + + + .. py:attribute:: global_state + :type: dict[str, StorageMap] + + The global state storage maps + + + + .. py:attribute:: local_state + :type: dict[str, StorageMap] + + The local state storage maps + + + + .. py:method:: from_dict(data: dict[str, Any]) -> Maps + :staticmethod: + + + +.. py:class:: State + + Application state information. + + + .. py:attribute:: keys + :type: Keys + + The storage keys + + + + .. py:attribute:: maps + :type: Maps + + The storage maps + + + + .. py:attribute:: schema + :type: Schema + + The state schema + + + + .. py:method:: from_dict(data: dict[str, Any]) -> State + :staticmethod: + + + +.. py:class:: ProgramSourceInfo + + Program source information. + + + .. py:attribute:: pc_offset_method + :type: PcOffsetMethod + + The PC offset method + + + + .. py:attribute:: source_info + :type: list[SourceInfo] + + The list of source info entries + + + + .. py:method:: from_dict(data: dict[str, Any]) -> ProgramSourceInfo + :staticmethod: + + + +.. py:class:: SourceInfoModel + + Source information for approval and clear programs. + + + .. py:attribute:: approval + :type: ProgramSourceInfo + + The approval program source info + + + + .. py:attribute:: clear + :type: ProgramSourceInfo + + The clear program source info + + + + .. py:method:: from_dict(data: dict[str, Any]) -> SourceInfoModel + :staticmethod: + + + +.. py:class:: Arc56Contract + + ARC-0056 application specification. + + See https://github.com/algorandfoundation/ARCs/blob/main/ARCs/arc-0056.md + + + .. py:attribute:: arcs + :type: list[int] + + The list of supported ARC version numbers + + + + .. py:attribute:: bare_actions + :type: BareActions + + The bare call and create actions + + + + .. py:attribute:: methods + :type: list[Method] + + The list of contract methods + + + + .. py:attribute:: name + :type: str + + The contract name + + + + .. py:attribute:: state + :type: State + + The contract state information + + + + .. py:attribute:: structs + :type: dict[str, list[StructField]] + + The contract struct definitions + + + + .. py:attribute:: byte_code + :type: ByteCode | None + :value: None + + + The optional bytecode for approval and clear programs + + + + .. py:attribute:: compiler_info + :type: CompilerInfo | None + :value: None + + + The optional compiler information + + + + .. py:attribute:: desc + :type: str | None + :value: None + + + The optional contract description + + + + .. py:attribute:: events + :type: list[Event] | None + :value: None + + + The optional list of contract events + + + + .. py:attribute:: networks + :type: dict[str, Network] | None + :value: None + + + The optional network deployment information + + + + .. py:attribute:: scratch_variables + :type: dict[str, ScratchVariables] | None + :value: None + + + The optional scratch variable information + + + + .. py:attribute:: source + :type: Source | None + :value: None + + + The optional source code + + + + .. py:attribute:: source_info + :type: SourceInfoModel | None + :value: None + + + The optional source code information + + + + .. py:attribute:: template_variables + :type: dict[str, TemplateVariables] | None + :value: None + + + The optional template variable information + + + + .. py:method:: from_dict(application_spec: dict) -> Arc56Contract + :staticmethod: + + + Create Arc56Contract from dictionary. + + :param application_spec: Dictionary containing contract specification + :return: Arc56Contract instance + + + + .. py:method:: from_json(application_spec: str) -> Arc56Contract + :staticmethod: + + + + .. py:method:: from_arc32(arc32_application_spec: str | algokit_utils.applications.app_spec.arc32.Arc32Contract) -> Arc56Contract + :staticmethod: + + + + .. py:method:: get_abi_struct_from_abi_tuple(decoded_tuple: Any, struct_fields: list[StructField], structs: dict[str, list[StructField]]) -> dict[str, Any] + :staticmethod: + + + + .. py:method:: to_json(indent: int | None = None) -> str + + + .. py:method:: dictify() -> dict + + + .. py:method:: get_arc56_method(method_name_or_signature: str) -> Method + + diff --git a/docs/html/_sources/autoapi/algokit_utils/applications/app_spec/index.rst.txt b/docs/html/_sources/autoapi/algokit_utils/applications/app_spec/index.rst.txt new file mode 100644 index 00000000..2aec2e36 --- /dev/null +++ b/docs/html/_sources/autoapi/algokit_utils/applications/app_spec/index.rst.txt @@ -0,0 +1,16 @@ +algokit_utils.applications.app_spec +=================================== + +.. py:module:: algokit_utils.applications.app_spec + + +Submodules +---------- + +.. toctree:: + :maxdepth: 1 + + /autoapi/algokit_utils/applications/app_spec/arc32/index + /autoapi/algokit_utils/applications/app_spec/arc56/index + + diff --git a/docs/html/_sources/autoapi/algokit_utils/applications/enums/index.rst.txt b/docs/html/_sources/autoapi/algokit_utils/applications/enums/index.rst.txt new file mode 100644 index 00000000..f69e2fc0 --- /dev/null +++ b/docs/html/_sources/autoapi/algokit_utils/applications/enums/index.rst.txt @@ -0,0 +1,131 @@ +algokit_utils.applications.enums +================================ + +.. py:module:: algokit_utils.applications.enums + + +Classes +------- + +.. autoapisummary:: + + algokit_utils.applications.enums.OnSchemaBreak + algokit_utils.applications.enums.OnUpdate + algokit_utils.applications.enums.OperationPerformed + + +Module Contents +--------------- + +.. py:class:: OnSchemaBreak(*args, **kwds) + + Bases: :py:obj:`enum.Enum` + + + Action to take if an Application's schema has breaking changes + + + .. py:attribute:: Fail + :value: 0 + + + Fail the deployment + + + + .. py:attribute:: ReplaceApp + :value: 2 + + + Create a new Application and delete the old Application in a single transaction + + + + .. py:attribute:: AppendApp + :value: 3 + + + Create a new Application + + + +.. py:class:: OnUpdate(*args, **kwds) + + Bases: :py:obj:`enum.Enum` + + + Action to take if an Application has been updated + + + .. py:attribute:: Fail + :value: 0 + + + Fail the deployment + + + + .. py:attribute:: UpdateApp + :value: 1 + + + Update the Application with the new approval and clear programs + + + + .. py:attribute:: ReplaceApp + :value: 2 + + + Create a new Application and delete the old Application in a single transaction + + + + .. py:attribute:: AppendApp + :value: 3 + + + Create a new application + + + +.. py:class:: OperationPerformed(*args, **kwds) + + Bases: :py:obj:`enum.Enum` + + + Describes the actions taken during deployment + + + .. py:attribute:: Nothing + :value: 0 + + + An existing Application was found + + + + .. py:attribute:: Create + :value: 1 + + + No existing Application was found, created a new Application + + + + .. py:attribute:: Update + :value: 2 + + + An existing Application was found, but was out of date, updated to latest version + + + + .. py:attribute:: Replace + :value: 3 + + + An existing Application was found, but was out of date, created a new Application and deleted the original + + + diff --git a/docs/html/_sources/autoapi/algokit_utils/applications/index.rst.txt b/docs/html/_sources/autoapi/algokit_utils/applications/index.rst.txt new file mode 100644 index 00000000..102a7e6d --- /dev/null +++ b/docs/html/_sources/autoapi/algokit_utils/applications/index.rst.txt @@ -0,0 +1,21 @@ +algokit_utils.applications +========================== + +.. py:module:: algokit_utils.applications + + +Submodules +---------- + +.. toctree:: + :maxdepth: 1 + + /autoapi/algokit_utils/applications/abi/index + /autoapi/algokit_utils/applications/app_client/index + /autoapi/algokit_utils/applications/app_deployer/index + /autoapi/algokit_utils/applications/app_factory/index + /autoapi/algokit_utils/applications/app_manager/index + /autoapi/algokit_utils/applications/app_spec/index + /autoapi/algokit_utils/applications/enums/index + + diff --git a/docs/html/_sources/autoapi/algokit_utils/assets/asset_manager/index.rst.txt b/docs/html/_sources/autoapi/algokit_utils/assets/asset_manager/index.rst.txt new file mode 100644 index 00000000..65741915 --- /dev/null +++ b/docs/html/_sources/autoapi/algokit_utils/assets/asset_manager/index.rst.txt @@ -0,0 +1,310 @@ +algokit_utils.assets.asset_manager +================================== + +.. py:module:: algokit_utils.assets.asset_manager + + +Classes +------- + +.. autoapisummary:: + + algokit_utils.assets.asset_manager.AccountAssetInformation + algokit_utils.assets.asset_manager.AssetInformation + algokit_utils.assets.asset_manager.BulkAssetOptInOutResult + algokit_utils.assets.asset_manager.AssetManager + + +Module Contents +--------------- + +.. py:class:: AccountAssetInformation + + Information about an account's holding of a particular asset. + + + .. py:attribute:: asset_id + :type: int + + The ID of the asset + + + + .. py:attribute:: balance + :type: int + + The amount of the asset held by the account + + + + .. py:attribute:: frozen + :type: bool + + Whether the asset is frozen for this account + + + + .. py:attribute:: round + :type: int + + The round this information was retrieved at + + + +.. py:class:: AssetInformation + + Information about an Algorand Standard Asset (ASA). + + + .. py:attribute:: asset_id + :type: int + + The ID of the asset + + + + .. py:attribute:: creator + :type: str + + The address of the account that created the asset + + + + .. py:attribute:: total + :type: int + + The total amount of the smallest divisible units that were created of the asset + + + + .. py:attribute:: decimals + :type: int + + The amount of decimal places the asset was created with + + + + .. py:attribute:: default_frozen + :type: bool | None + :value: None + + + Whether the asset was frozen by default for all accounts, defaults to None + + + + .. py:attribute:: manager + :type: str | None + :value: None + + + The address of the optional account that can manage the configuration of the asset and destroy it, + defaults to None + + + + .. py:attribute:: reserve + :type: str | None + :value: None + + + The address of the optional account that holds the reserve (uncirculated supply) units of the asset, + defaults to None + + + + .. py:attribute:: freeze + :type: str | None + :value: None + + + The address of the optional account that can be used to freeze or unfreeze holdings of this asset, + defaults to None + + + + .. py:attribute:: clawback + :type: str | None + :value: None + + + The address of the optional account that can clawback holdings of this asset from any account, + defaults to None + + + + .. py:attribute:: unit_name + :type: str | None + :value: None + + + The optional name of the unit of this asset (e.g. ticker name), defaults to None + + + + .. py:attribute:: unit_name_b64 + :type: bytes | None + :value: None + + + The optional name of the unit of this asset as bytes, defaults to None + + + + .. py:attribute:: asset_name + :type: str | None + :value: None + + + The optional name of the asset, defaults to None + + + + .. py:attribute:: asset_name_b64 + :type: bytes | None + :value: None + + + The optional name of the asset as bytes, defaults to None + + + + .. py:attribute:: url + :type: str | None + :value: None + + + The optional URL where more information about the asset can be retrieved, defaults to None + + + + .. py:attribute:: url_b64 + :type: bytes | None + :value: None + + + The optional URL where more information about the asset can be retrieved as bytes, defaults to None + + + + .. py:attribute:: metadata_hash + :type: bytes | None + :value: None + + + The 32-byte hash of some metadata that is relevant to the asset and/or asset holders, defaults to None + + + +.. py:class:: BulkAssetOptInOutResult + + Result from performing a bulk opt-in or bulk opt-out for an account against a series of assets. + + :ivar asset_id: The ID of the asset opted into / out of + :ivar transaction_id: The transaction ID of the resulting opt in / out + + + .. py:attribute:: asset_id + :type: int + + The ID of the asset opted into / out of + + + + .. py:attribute:: transaction_id + :type: str + + The transaction ID of the resulting opt in / out + + + +.. py:class:: AssetManager(algod_client: algosdk.v2client.algod.AlgodClient, new_group: collections.abc.Callable[[], algokit_utils.transactions.transaction_composer.TransactionComposer]) + + A manager for Algorand Standard Assets (ASAs). + + :param algod_client: An algod client + :param new_group: A function that creates a new TransactionComposer transaction group + + :example: + >>> asset_manager = AssetManager(algod_client) + + + .. py:method:: get_by_id(asset_id: int) -> AssetInformation + + Returns the current asset information for the asset with the given ID. + + :param asset_id: The ID of the asset + :return: The asset information + + :example: + >>> asset_manager = AssetManager(algod_client) + >>> asset_info = asset_manager.get_by_id(1234567890) + + + + .. py:method:: get_account_information(sender: str | algokit_utils.models.account.SigningAccount | algosdk.atomic_transaction_composer.TransactionSigner, asset_id: int) -> AccountAssetInformation + + Returns the given sender account's asset holding for a given asset. + + :param sender: The address of the sender/account to look up + :param asset_id: The ID of the asset to return a holding for + :return: The account asset holding information + + :example: + >>> asset_manager = AssetManager(algod_client) + >>> account_asset_info = asset_manager.get_account_information(sender, asset_id) + + + + .. py:method:: bulk_opt_in(account: str, asset_ids: list[int], signer: algosdk.atomic_transaction_composer.TransactionSigner | None = None, rekey_to: str | None = None, note: bytes | None = None, lease: bytes | None = None, static_fee: algokit_utils.models.amount.AlgoAmount | None = None, extra_fee: algokit_utils.models.amount.AlgoAmount | None = None, max_fee: algokit_utils.models.amount.AlgoAmount | None = None, validity_window: int | None = None, first_valid_round: int | None = None, last_valid_round: int | None = None, send_params: algokit_utils.models.transaction.SendParams | None = None) -> list[BulkAssetOptInOutResult] + + Opt an account in to a list of Algorand Standard Assets. + + :param account: The account to opt-in + :param asset_ids: The list of asset IDs to opt-in to + :param signer: The signer to use for the transaction, defaults to None + :param rekey_to: The address to rekey the account to, defaults to None + :param note: The note to include in the transaction, defaults to None + :param lease: The lease to include in the transaction, defaults to None + :param static_fee: The static fee to include in the transaction, defaults to None + :param extra_fee: The extra fee to include in the transaction, defaults to None + :param max_fee: The maximum fee to include in the transaction, defaults to None + :param validity_window: The validity window to include in the transaction, defaults to None + :param first_valid_round: The first valid round to include in the transaction, defaults to None + :param last_valid_round: The last valid round to include in the transaction, defaults to None + :param send_params: The send parameters to use for the transaction, defaults to None + :return: An array of records matching asset ID to transaction ID of the opt in + + :example: + >>> asset_manager = AssetManager(algod_client) + >>> results = asset_manager.bulk_opt_in(account, asset_ids) + + + + .. py:method:: bulk_opt_out(*, account: str, asset_ids: list[int], ensure_zero_balance: bool = True, signer: algosdk.atomic_transaction_composer.TransactionSigner | None = None, rekey_to: str | None = None, note: bytes | None = None, lease: bytes | None = None, static_fee: algokit_utils.models.amount.AlgoAmount | None = None, extra_fee: algokit_utils.models.amount.AlgoAmount | None = None, max_fee: algokit_utils.models.amount.AlgoAmount | None = None, validity_window: int | None = None, first_valid_round: int | None = None, last_valid_round: int | None = None, send_params: algokit_utils.models.transaction.SendParams | None = None) -> list[BulkAssetOptInOutResult] + + Opt an account out of a list of Algorand Standard Assets. + + :param account: The account to opt-out + :param asset_ids: The list of asset IDs to opt-out of + :param ensure_zero_balance: Whether to check if the account has a zero balance first, defaults to True + :param signer: The signer to use for the transaction, defaults to None + :param rekey_to: The address to rekey the account to, defaults to None + :param note: The note to include in the transaction, defaults to None + :param lease: The lease to include in the transaction, defaults to None + :param static_fee: The static fee to include in the transaction, defaults to None + :param extra_fee: The extra fee to include in the transaction, defaults to None + :param max_fee: The maximum fee to include in the transaction, defaults to None + :param validity_window: The validity window to include in the transaction, defaults to None + :param first_valid_round: The first valid round to include in the transaction, defaults to None + :param last_valid_round: The last valid round to include in the transaction, defaults to None + :param send_params: The send parameters to use for the transaction, defaults to None + :raises ValueError: If ensure_zero_balance is True and account has non-zero balance or is not opted in + :return: An array of records matching asset ID to transaction ID of the opt out + + :example: + >>> asset_manager = AssetManager(algod_client) + >>> results = asset_manager.bulk_opt_out(account, asset_ids) + + + diff --git a/docs/html/_sources/autoapi/algokit_utils/assets/index.rst.txt b/docs/html/_sources/autoapi/algokit_utils/assets/index.rst.txt new file mode 100644 index 00000000..5ec73261 --- /dev/null +++ b/docs/html/_sources/autoapi/algokit_utils/assets/index.rst.txt @@ -0,0 +1,15 @@ +algokit_utils.assets +==================== + +.. py:module:: algokit_utils.assets + + +Submodules +---------- + +.. toctree:: + :maxdepth: 1 + + /autoapi/algokit_utils/assets/asset_manager/index + + diff --git a/docs/html/_sources/autoapi/algokit_utils/clients/client_manager/index.rst.txt b/docs/html/_sources/autoapi/algokit_utils/clients/client_manager/index.rst.txt new file mode 100644 index 00000000..8482887c --- /dev/null +++ b/docs/html/_sources/autoapi/algokit_utils/clients/client_manager/index.rst.txt @@ -0,0 +1,520 @@ +algokit_utils.clients.client_manager +==================================== + +.. py:module:: algokit_utils.clients.client_manager + + +Classes +------- + +.. autoapisummary:: + + algokit_utils.clients.client_manager.AlgoSdkClients + algokit_utils.clients.client_manager.NetworkDetail + algokit_utils.clients.client_manager.ClientManager + + +Module Contents +--------------- + +.. py:class:: AlgoSdkClients(algod: algosdk.v2client.algod.AlgodClient, indexer: algosdk.v2client.indexer.IndexerClient | None = None, kmd: algosdk.kmd.KMDClient | None = None) + + Container for Algorand SDK client instances. + + Holds references to Algod, Indexer and KMD clients. + + :param algod: Algod client instance + :param indexer: Optional Indexer client instance + :param kmd: Optional KMD client instance + + + .. py:attribute:: algod + + + .. py:attribute:: indexer + :value: None + + + + .. py:attribute:: kmd + :value: None + + + +.. py:class:: NetworkDetail + + Details about an Algorand network. + + Contains network type flags and genesis information. + + + .. py:attribute:: is_testnet + :type: bool + + Whether the network is a testnet + + + + .. py:attribute:: is_mainnet + :type: bool + + Whether the network is a mainnet + + + + .. py:attribute:: is_localnet + :type: bool + + Whether the network is a localnet + + + + .. py:attribute:: genesis_id + :type: str + + The genesis ID of the network + + + + .. py:attribute:: genesis_hash + :type: str + + The genesis hash of the network + + + +.. py:class:: ClientManager(clients_or_configs: algokit_utils.models.network.AlgoClientConfigs | AlgoSdkClients, algorand_client: algokit_utils.algorand.AlgorandClient) + + Manager for Algorand SDK clients. + + Provides access to Algod, Indexer and KMD clients and helper methods for working with them. + + :param clients_or_configs: Either client instances or client configurations + :param algorand_client: AlgorandClient instance + + :example: + >>> # Algod only + >>> client_manager = ClientManager(algod_client) + >>> # Algod and Indexer + >>> client_manager = ClientManager(algod_client, indexer_client) + >>> # Algod config only + >>> client_manager = ClientManager(ClientManager.get_algod_config_from_environment()) + >>> # Algod and Indexer config + >>> client_manager = ClientManager(ClientManager.get_algod_config_from_environment(), + ... ClientManager.get_indexer_config_from_environment()) + + + .. py:property:: algod + :type: algosdk.v2client.algod.AlgodClient + + + Returns an algosdk Algod API client. + + :return: Algod client instance + + + + .. py:property:: indexer + :type: algosdk.v2client.indexer.IndexerClient + + + Returns an algosdk Indexer API client. + + :raises ValueError: If no Indexer client is configured + :return: Indexer client instance + + + + .. py:property:: indexer_if_present + :type: algosdk.v2client.indexer.IndexerClient | None + + + Returns the Indexer client if configured, otherwise None. + + :return: Indexer client instance or None + + + + .. py:property:: kmd + :type: algosdk.kmd.KMDClient + + + Returns an algosdk KMD API client. + + :raises ValueError: If no KMD client is configured + :return: KMD client instance + + + + .. py:method:: network() -> NetworkDetail + + Get details about the connected Algorand network. + + :return: Network details including type and genesis information + + :example: + >>> client_manager = ClientManager(algod_client) + >>> network_detail = client_manager.network() + + + + .. py:method:: is_localnet() -> bool + + Check if connected to a local network. + + :return: True if connected to a local network + + + + .. py:method:: is_testnet() -> bool + + Check if connected to TestNet. + + :return: True if connected to TestNet + + + + .. py:method:: is_mainnet() -> bool + + Check if connected to MainNet. + + :return: True if connected to MainNet + + + + .. py:method:: get_testnet_dispenser(auth_token: str | None = None, request_timeout: int | None = None) -> algokit_utils.clients.dispenser_api_client.TestNetDispenserApiClient + + Get a TestNet dispenser API client. + + :param auth_token: Optional authentication token + :param request_timeout: Optional request timeout in seconds + :return: TestNet dispenser client instance + + + + .. py:method:: get_app_factory(app_spec: algokit_utils.applications.app_spec.arc56.Arc56Contract | algokit_utils._legacy_v2.application_specification.ApplicationSpecification | str, app_name: str | None = None, default_sender: str | None = None, default_signer: algosdk.atomic_transaction_composer.TransactionSigner | None = None, version: str | None = None, compilation_params: algokit_utils.applications.app_client.AppClientCompilationParams | None = None) -> algokit_utils.applications.app_factory.AppFactory + + Get an application factory for deploying smart contracts. + + :param app_spec: Application specification + :param app_name: Optional application name + :param default_sender: Optional default sender address + :param default_signer: Optional default transaction signer + :param version: Optional version string + :param compilation_params: Optional compilation parameters + :raises ValueError: If no Algorand client is configured + :return: Application factory instance + + + + .. py:method:: get_app_client_by_id(app_spec: algokit_utils.applications.app_spec.arc56.Arc56Contract | algokit_utils._legacy_v2.application_specification.ApplicationSpecification | str, app_id: int, app_name: str | None = None, default_sender: str | None = None, default_signer: algosdk.atomic_transaction_composer.TransactionSigner | None = None, approval_source_map: algosdk.source_map.SourceMap | None = None, clear_source_map: algosdk.source_map.SourceMap | None = None) -> algokit_utils.applications.app_client.AppClient + + Get an application client for an existing application by ID. + + :param app_spec: Application specification + :param app_id: Application ID + :param app_name: Optional application name + :param default_sender: Optional default sender address + :param default_signer: Optional default transaction signer + :param approval_source_map: Optional approval program source map + :param clear_source_map: Optional clear program source map + :raises ValueError: If no Algorand client is configured + :return: Application client instance + + + + .. py:method:: get_app_client_by_network(app_spec: algokit_utils.applications.app_spec.arc56.Arc56Contract | algokit_utils._legacy_v2.application_specification.ApplicationSpecification | str, app_name: str | None = None, default_sender: str | None = None, default_signer: algosdk.atomic_transaction_composer.TransactionSigner | None = None, approval_source_map: algosdk.source_map.SourceMap | None = None, clear_source_map: algosdk.source_map.SourceMap | None = None) -> algokit_utils.applications.app_client.AppClient + + Get an application client for an existing application by network. + + :param app_spec: Application specification + :param app_name: Optional application name + :param default_sender: Optional default sender address + :param default_signer: Optional default transaction signer + :param approval_source_map: Optional approval program source map + :param clear_source_map: Optional clear program source map + :raises ValueError: If no Algorand client is configured + :return: Application client instance + + + + .. py:method:: get_app_client_by_creator_and_name(creator_address: str, app_name: str, app_spec: algokit_utils.applications.app_spec.arc56.Arc56Contract | algokit_utils._legacy_v2.application_specification.ApplicationSpecification | str, default_sender: str | None = None, default_signer: algosdk.atomic_transaction_composer.TransactionSigner | None = None, ignore_cache: bool | None = None, app_lookup_cache: algokit_utils.applications.app_deployer.ApplicationLookup | None = None, approval_source_map: algosdk.source_map.SourceMap | None = None, clear_source_map: algosdk.source_map.SourceMap | None = None) -> algokit_utils.applications.app_client.AppClient + + Get an application client by creator address and name. + + :param creator_address: Creator address + :param app_name: Application name + :param app_spec: Application specification + :param default_sender: Optional default sender address + :param default_signer: Optional default transaction signer + :param ignore_cache: Optional flag to ignore cache + :param app_lookup_cache: Optional app lookup cache + :param approval_source_map: Optional approval program source map + :param clear_source_map: Optional clear program source map + :return: Application client instance + + + + .. py:method:: get_algod_client(config: algokit_utils.models.network.AlgoClientNetworkConfig) -> algosdk.v2client.algod.AlgodClient + :staticmethod: + + + Get an Algod client from config or environment. + + :param config: Optional client configuration + :return: Algod client instance + + + + .. py:method:: get_algod_client_from_environment() -> algosdk.v2client.algod.AlgodClient + :staticmethod: + + + Get an Algod client from environment variables. + + :return: Algod client instance + + + + .. py:method:: get_kmd_client(config: algokit_utils.models.network.AlgoClientNetworkConfig) -> algosdk.kmd.KMDClient + :staticmethod: + + + Get a KMD client from config or environment. + + :param config: Optional client configuration + :return: KMD client instance + + + + .. py:method:: get_kmd_client_from_environment() -> algosdk.kmd.KMDClient + :staticmethod: + + + Get a KMD client from environment variables. + + :return: KMD client instance + + + + .. py:method:: get_indexer_client(config: algokit_utils.models.network.AlgoClientNetworkConfig) -> algosdk.v2client.indexer.IndexerClient + :staticmethod: + + + Get an Indexer client from config or environment. + + :param config: Optional client configuration + :return: Indexer client instance + + + + .. py:method:: get_indexer_client_from_environment() -> algosdk.v2client.indexer.IndexerClient + :staticmethod: + + + Get an Indexer client from environment variables. + + :return: Indexer client instance + + + + .. py:method:: genesis_id_is_localnet(genesis_id: str | None) -> bool + :staticmethod: + + + Check if a genesis ID indicates a local network. + + :param genesis_id: Genesis ID to check + :return: True if genesis ID indicates a local network + + :example: + >>> ClientManager.genesis_id_is_localnet("devnet-v1") + + + + .. py:method:: get_typed_app_client_by_creator_and_name(typed_client: type[TypedAppClientT], *, creator_address: str, app_name: str, default_sender: str | None = None, default_signer: algosdk.atomic_transaction_composer.TransactionSigner | None = None, ignore_cache: bool | None = None, app_lookup_cache: algokit_utils.applications.app_deployer.ApplicationLookup | None = None) -> TypedAppClientT + + Get a typed application client by creator address and name. + + :param typed_client: Typed client class + :param creator_address: Creator address + :param app_name: Application name + :param default_sender: Optional default sender address + :param default_signer: Optional default transaction signer + :param ignore_cache: Optional flag to ignore cache + :param app_lookup_cache: Optional app lookup cache + :raises ValueError: If no Algorand client is configured + :return: Typed application client instance + + :example: + >>> client_manager = ClientManager(algod_client) + >>> typed_app_client = client_manager.get_typed_app_client_by_creator_and_name( + ... typed_client=MyAppClient, + ... creator_address="creator_address", + ... app_name="app_name", + ... ) + + + + .. py:method:: get_typed_app_client_by_id(typed_client: type[TypedAppClientT], *, app_id: int, app_name: str | None = None, default_sender: str | None = None, default_signer: algosdk.atomic_transaction_composer.TransactionSigner | None = None, approval_source_map: algosdk.source_map.SourceMap | None = None, clear_source_map: algosdk.source_map.SourceMap | None = None) -> TypedAppClientT + + Get a typed application client by ID. + + :param typed_client: Typed client class + :param app_id: Application ID + :param app_name: Optional application name + :param default_sender: Optional default sender address + :param default_signer: Optional default transaction signer + :param approval_source_map: Optional approval program source map + :param clear_source_map: Optional clear program source map + :raises ValueError: If no Algorand client is configured + :return: Typed application client instance + + :example: + >>> client_manager = ClientManager(algod_client) + >>> typed_app_client = client_manager.get_typed_app_client_by_id( + ... typed_client=MyAppClient, + ... app_id=1234567890, + ... ) + + + + .. py:method:: get_typed_app_client_by_network(typed_client: type[TypedAppClientT], *, app_name: str | None = None, default_sender: str | None = None, default_signer: algosdk.atomic_transaction_composer.TransactionSigner | None = None, approval_source_map: algosdk.source_map.SourceMap | None = None, clear_source_map: algosdk.source_map.SourceMap | None = None) -> TypedAppClientT + + Returns a new typed client, resolves the app ID for the current network. + + Uses pre-determined network-specific app IDs specified in the ARC-56 app spec. + If no IDs are in the app spec or the network isn't recognised, an error is thrown. + + :param typed_client: The typed client class to instantiate + :param app_name: Optional application name + :param default_sender: Optional default sender address + :param default_signer: Optional default transaction signer + :param approval_source_map: Optional approval program source map + :param clear_source_map: Optional clear program source map + :raises ValueError: If no Algorand client is configured + :return: The typed client instance + + :example: + >>> client_manager = ClientManager(algod_client) + >>> typed_app_client = client_manager.get_typed_app_client_by_network( + ... typed_client=MyAppClient, + ... app_name="app_name", + ... ) + + + + .. py:method:: get_typed_app_factory(typed_factory: type[TypedFactoryT], *, app_name: str | None = None, default_sender: str | None = None, default_signer: algosdk.atomic_transaction_composer.TransactionSigner | None = None, version: str | None = None, compilation_params: algokit_utils.applications.app_client.AppClientCompilationParams | None = None) -> TypedFactoryT + + Get a typed application factory. + + :param typed_factory: Typed factory class + :param app_name: Optional application name + :param default_sender: Optional default sender address + :param default_signer: Optional default transaction signer + :param version: Optional version string + :param compilation_params: Optional compilation parameters + :raises ValueError: If no Algorand client is configured + :return: Typed application factory instance + + :example: + >>> client_manager = ClientManager(algod_client) + >>> typed_app_factory = client_manager.get_typed_app_factory( + ... typed_factory=MyAppFactory, + ... app_name="app_name", + ... ) + + + + .. py:method:: get_config_from_environment_or_localnet() -> algokit_utils.models.network.AlgoClientConfigs + :staticmethod: + + + Retrieve client configuration from environment variables or fallback to localnet defaults. + + If ALGOD_SERVER is set in environment variables, it will use environment configuration, + otherwise it will use default localnet configuration. + + :return: Configuration for algod, indexer, and optionally kmd + + :example: + >>> client_manager = ClientManager(algod_client) + >>> config = client_manager.get_config_from_environment_or_localnet() + + + + .. py:method:: get_default_localnet_config(config_or_port: Literal['algod', 'indexer', 'kmd'] | int) -> algokit_utils.models.network.AlgoClientNetworkConfig + :staticmethod: + + + Get default configuration for local network services. + + :param config_or_port: Service name or port number + :return: Client configuration for local network + + :example: + >>> client_manager = ClientManager(algod_client) + >>> config = client_manager.get_default_localnet_config("algod") + + + + .. py:method:: get_algod_config_from_environment() -> algokit_utils.models.network.AlgoClientNetworkConfig + :staticmethod: + + + Retrieve the algod configuration from environment variables. + Will raise an error if ALGOD_SERVER environment variable is not set + + :return: Algod client configuration + + :example: + >>> client_manager = ClientManager(algod_client) + >>> config = client_manager.get_algod_config_from_environment() + + + + .. py:method:: get_indexer_config_from_environment() -> algokit_utils.models.network.AlgoClientNetworkConfig + :staticmethod: + + + Retrieve the indexer configuration from environment variables. + Will raise an error if INDEXER_SERVER environment variable is not set + + :return: Indexer client configuration + + :example: + >>> client_manager = ClientManager(algod_client) + >>> config = client_manager.get_indexer_config_from_environment() + + + + .. py:method:: get_kmd_config_from_environment() -> algokit_utils.models.network.AlgoClientNetworkConfig + :staticmethod: + + + Retrieve the kmd configuration from environment variables. + + :return: KMD client configuration + + :example: + >>> client_manager = ClientManager(algod_client) + >>> config = client_manager.get_kmd_config_from_environment() + + + + .. py:method:: get_algonode_config(network: Literal['testnet', 'mainnet'], config: Literal['algod', 'indexer']) -> algokit_utils.models.network.AlgoClientNetworkConfig + :staticmethod: + + + Returns the Algorand configuration to point to the free tier of the AlgoNode service. + + :param network: Which network to connect to - TestNet or MainNet + :param config: Which algod config to return - Algod or Indexer + :return: Configuration for the specified network and service + + :example: + >>> client_manager = ClientManager(algod_client) + >>> config = client_manager.get_algonode_config("testnet", "algod") + + + diff --git a/docs/html/_sources/autoapi/algokit_utils/clients/dispenser_api_client/index.rst.txt b/docs/html/_sources/autoapi/algokit_utils/clients/dispenser_api_client/index.rst.txt new file mode 100644 index 00000000..4e1ff351 --- /dev/null +++ b/docs/html/_sources/autoapi/algokit_utils/clients/dispenser_api_client/index.rst.txt @@ -0,0 +1,159 @@ +algokit_utils.clients.dispenser_api_client +========================================== + +.. py:module:: algokit_utils.clients.dispenser_api_client + + +Attributes +---------- + +.. autoapisummary:: + + algokit_utils.clients.dispenser_api_client.DISPENSER_ASSETS + algokit_utils.clients.dispenser_api_client.DISPENSER_REQUEST_TIMEOUT + algokit_utils.clients.dispenser_api_client.DISPENSER_ACCESS_TOKEN_KEY + + +Classes +------- + +.. autoapisummary:: + + algokit_utils.clients.dispenser_api_client.DispenserApiConfig + algokit_utils.clients.dispenser_api_client.DispenserAssetName + algokit_utils.clients.dispenser_api_client.DispenserAsset + algokit_utils.clients.dispenser_api_client.DispenserFundResponse + algokit_utils.clients.dispenser_api_client.DispenserLimitResponse + algokit_utils.clients.dispenser_api_client.TestNetDispenserApiClient + + +Module Contents +--------------- + +.. py:class:: DispenserApiConfig + + .. py:attribute:: BASE_URL + :value: 'https://api.dispenser.algorandfoundation.tools' + + + +.. py:class:: DispenserAssetName + + Bases: :py:obj:`enum.IntEnum` + + + Enum where members are also (and must be) ints + + + .. py:attribute:: ALGO + :value: 0 + + + +.. py:class:: DispenserAsset + + .. py:attribute:: asset_id + :type: int + + The ID of the asset + + + + .. py:attribute:: decimals + :type: int + + The amount of decimal places the asset was created with + + + + .. py:attribute:: description + :type: str + + The description of the asset + + + +.. py:class:: DispenserFundResponse + + .. py:attribute:: tx_id + :type: str + + The transaction ID of the funded transaction + + + + .. py:attribute:: amount + :type: int + + The amount of Algos funded + + + +.. py:class:: DispenserLimitResponse + + .. py:attribute:: amount + :type: int + + The amount of Algos that can be funded + + + +.. py:data:: DISPENSER_ASSETS + +.. py:data:: DISPENSER_REQUEST_TIMEOUT + :value: 15 + + +.. py:data:: DISPENSER_ACCESS_TOKEN_KEY + :value: 'ALGOKIT_DISPENSER_ACCESS_TOKEN' + + +.. py:class:: TestNetDispenserApiClient(auth_token: str | None = None, request_timeout: int = DISPENSER_REQUEST_TIMEOUT) + + Client for interacting with the [AlgoKit TestNet Dispenser API](https://github.com/algorandfoundation/algokit/blob/main/docs/testnet_api.md). + To get started create a new access token via `algokit dispenser login --ci` + and pass it to the client constructor as `auth_token`. + Alternatively set the access token as environment variable `ALGOKIT_DISPENSER_ACCESS_TOKEN`, + and it will be auto loaded. If both are set, the constructor argument takes precedence. + + Default request timeout is 15 seconds. Modify by passing `request_timeout` to the constructor. + + + .. py:attribute:: auth_token + :type: str + + + .. py:attribute:: request_timeout + :value: 15 + + + + .. py:method:: fund(address: str, amount: int) -> DispenserFundResponse + fund(address: str, amount: int, asset_id: int | None = None) -> DispenserFundResponse + + Fund an account with Algos from the dispenser API + + :param address: The address to fund + :param amount: The amount of Algos to fund + :param asset_id: The asset ID to fund (deprecated) + :return: The transaction ID of the funded transaction + :raises Exception: If the dispenser API request fails + + :example: + >>> dispenser_client = TestNetDispenserApiClient() + >>> dispenser_client.fund(address="SENDER_ADDRESS", amount=1000000) + + + + .. py:method:: refund(refund_txn_id: str) -> None + + Register a refund for a transaction with the dispenser API + + + + .. py:method:: get_limit(address: str) -> DispenserLimitResponse + + Get current limit for an account with Algos from the dispenser API + + + diff --git a/docs/html/_sources/autoapi/algokit_utils/clients/index.rst.txt b/docs/html/_sources/autoapi/algokit_utils/clients/index.rst.txt new file mode 100644 index 00000000..150b9635 --- /dev/null +++ b/docs/html/_sources/autoapi/algokit_utils/clients/index.rst.txt @@ -0,0 +1,16 @@ +algokit_utils.clients +===================== + +.. py:module:: algokit_utils.clients + + +Submodules +---------- + +.. toctree:: + :maxdepth: 1 + + /autoapi/algokit_utils/clients/client_manager/index + /autoapi/algokit_utils/clients/dispenser_api_client/index + + diff --git a/docs/html/_sources/autoapi/algokit_utils/config/index.rst.txt b/docs/html/_sources/autoapi/algokit_utils/config/index.rst.txt new file mode 100644 index 00000000..2f33b25a --- /dev/null +++ b/docs/html/_sources/autoapi/algokit_utils/config/index.rst.txt @@ -0,0 +1,145 @@ +algokit_utils.config +==================== + +.. py:module:: algokit_utils.config + + +Attributes +---------- + +.. autoapisummary:: + + algokit_utils.config.ALGOKIT_PROJECT_ROOT + algokit_utils.config.ALGOKIT_CONFIG_FILENAME + algokit_utils.config.config + + +Classes +------- + +.. autoapisummary:: + + algokit_utils.config.AlgoKitLogger + algokit_utils.config.UpdatableConfig + + +Module Contents +--------------- + +.. py:data:: ALGOKIT_PROJECT_ROOT + +.. py:data:: ALGOKIT_CONFIG_FILENAME + :value: '.algokit.toml' + + +.. py:class:: AlgoKitLogger(name: str = 'algokit-utils-py', level: int = logging.NOTSET) + + Bases: :py:obj:`logging.Logger` + + + Instances of the Logger class represent a single logging channel. A + "logging channel" indicates an area of an application. Exactly how an + "area" is defined is up to the application developer. Since an + application can have any number of areas, logging channels are identified + by a unique string. Application areas can be nested (e.g. an area + of "input processing" might include sub-areas "read CSV files", "read + XLS files" and "read Gnumeric files"). To cater for this natural nesting, + channel names are organized into a namespace hierarchy where levels are + separated by periods, much like the Java or Python package namespace. So + in the instance given above, channel names might be "input" for the upper + level, and "input.csv", "input.xls" and "input.gnu" for the sub-levels. + There is no arbitrary limit to the depth of nesting. + + + .. py:method:: get_null_logger() -> logging.Logger + :classmethod: + + + Return a logger that does nothing (a null logger). + + + +.. py:class:: UpdatableConfig + + Class to manage and update configuration settings for the AlgoKit project. + + Attributes: + debug (bool): Indicates whether debug mode is enabled. + project_root (Path | None): The path to the project root directory. + trace_all (bool): Indicates whether to trace all operations. + trace_buffer_size_mb (int | float): The size of the trace buffer in megabytes. + max_search_depth (int): The maximum depth to search for a specific file. + populate_app_call_resources (bool): Whether to populate app call resources. + logger (logging.Logger): The logger instance to use. Defaults to an AlgoKitLogger instance. + + + .. py:property:: logger + :type: logging.Logger + + + Returns the logger instance. + + + + .. py:property:: debug + :type: bool + + + Returns the debug status. + + + + .. py:property:: project_root + :type: pathlib.Path | None + + + Returns the project root path. + + + + .. py:property:: trace_all + :type: bool + + + Indicates whether simulation traces for all operations should be stored. + + + + .. py:property:: trace_buffer_size_mb + :type: int | float + + + Returns the size of the trace buffer in megabytes. + + + + .. py:property:: populate_app_call_resource + :type: bool + + + Indicates whether or not to populate app call resources. + + + + .. py:method:: with_debug(func: collections.abc.Callable[[], str | None]) -> None + + Executes a function with debug mode temporarily enabled. + + + + .. py:method:: configure(*, debug: bool | None = None, project_root: pathlib.Path | None = None, trace_all: bool = False, trace_buffer_size_mb: float = 256, max_search_depth: int = 10, populate_app_call_resources: bool = False, logger: logging.Logger | None = None) -> None + + Configures various settings for the application. + + :param debug: Whether debug mode is enabled. + :param project_root: The path to the project root directory. + :param trace_all: Whether to trace all operations. Defaults to False. + :param trace_buffer_size_mb: The trace buffer size in megabytes. Defaults to 256. + :param max_search_depth: The maximum depth to search for a specific file. Defaults to 10. + :param populate_app_call_resources: Whether to populate app call resources. Defaults to False. + :param logger: A custom logger to use. Defaults to AlgoKitLogger instance. + + + +.. py:data:: config + diff --git a/docs/html/_sources/autoapi/algokit_utils/errors/index.rst.txt b/docs/html/_sources/autoapi/algokit_utils/errors/index.rst.txt new file mode 100644 index 00000000..578eccd9 --- /dev/null +++ b/docs/html/_sources/autoapi/algokit_utils/errors/index.rst.txt @@ -0,0 +1,15 @@ +algokit_utils.errors +==================== + +.. py:module:: algokit_utils.errors + + +Submodules +---------- + +.. toctree:: + :maxdepth: 1 + + /autoapi/algokit_utils/errors/logic_error/index + + diff --git a/docs/html/_sources/autoapi/algokit_utils/errors/logic_error/index.rst.txt b/docs/html/_sources/autoapi/algokit_utils/errors/logic_error/index.rst.txt new file mode 100644 index 00000000..48f59877 --- /dev/null +++ b/docs/html/_sources/autoapi/algokit_utils/errors/logic_error/index.rst.txt @@ -0,0 +1,105 @@ +algokit_utils.errors.logic_error +================================ + +.. py:module:: algokit_utils.errors.logic_error + + +Exceptions +---------- + +.. autoapisummary:: + + algokit_utils.errors.logic_error.LogicError + + +Classes +------- + +.. autoapisummary:: + + algokit_utils.errors.logic_error.LogicErrorData + + +Functions +--------- + +.. autoapisummary:: + + algokit_utils.errors.logic_error.parse_logic_error + + +Module Contents +--------------- + +.. py:class:: LogicErrorData + + Bases: :py:obj:`TypedDict` + + + dict() -> new empty dictionary + dict(mapping) -> new dictionary initialized from a mapping object's + (key, value) pairs + dict(iterable) -> new dictionary initialized as if via: + d = {} + for k, v in iterable: + d[k] = v + dict(**kwargs) -> new dictionary initialized with the name=value pairs + in the keyword argument list. For example: dict(one=1, two=2) + + + .. py:attribute:: transaction_id + :type: str + + + .. py:attribute:: message + :type: str + + + .. py:attribute:: pc + :type: int + + +.. py:function:: parse_logic_error(error_str: str) -> LogicErrorData | None + +.. py:exception:: LogicError(*, logic_error_str: str, program: str, source_map: AlgoSourceMap | None, transaction_id: str, message: str, pc: int, logic_error: Exception | None = None, traces: list[algokit_utils.models.simulate.SimulationTrace] | None = None, get_line_for_pc: collections.abc.Callable[[int], int | None] | None = None) + + Bases: :py:obj:`Exception` + + + Common base class for all non-exit exceptions. + + + .. py:attribute:: logic_error + :value: None + + + + .. py:attribute:: logic_error_str + + + .. py:attribute:: source_map + + + .. py:attribute:: lines + + + .. py:attribute:: transaction_id + + + .. py:attribute:: message + + + .. py:attribute:: pc + + + .. py:attribute:: traces + :value: None + + + + .. py:attribute:: line_no + + + .. py:method:: trace(lines: int = 5) -> str + + diff --git a/docs/html/_sources/autoapi/algokit_utils/index.rst.txt b/docs/html/_sources/autoapi/algokit_utils/index.rst.txt new file mode 100644 index 00000000..4752fb49 --- /dev/null +++ b/docs/html/_sources/autoapi/algokit_utils/index.rst.txt @@ -0,0 +1,37 @@ +algokit_utils +============= + +.. py:module:: algokit_utils + +.. autoapi-nested-parse:: + + AlgoKit Python Utilities - a set of utilities for building solutions on Algorand + + This module provides commonly used utilities and types at the root level for convenience. + For more specific functionality, import directly from the relevant submodules: + + from algokit_utils.accounts import KmdAccountManager + from algokit_utils.applications import AppClient + from algokit_utils.applications.app_spec import Arc52Contract + etc. + + + +Submodules +---------- + +.. toctree:: + :maxdepth: 1 + + /autoapi/algokit_utils/accounts/index + /autoapi/algokit_utils/algorand/index + /autoapi/algokit_utils/applications/index + /autoapi/algokit_utils/assets/index + /autoapi/algokit_utils/clients/index + /autoapi/algokit_utils/config/index + /autoapi/algokit_utils/errors/index + /autoapi/algokit_utils/models/index + /autoapi/algokit_utils/protocols/index + /autoapi/algokit_utils/transactions/index + + diff --git a/docs/html/_sources/autoapi/algokit_utils/models/account/index.rst.txt b/docs/html/_sources/autoapi/algokit_utils/models/account/index.rst.txt new file mode 100644 index 00000000..88de425f --- /dev/null +++ b/docs/html/_sources/autoapi/algokit_utils/models/account/index.rst.txt @@ -0,0 +1,229 @@ +algokit_utils.models.account +============================ + +.. py:module:: algokit_utils.models.account + + +Attributes +---------- + +.. autoapisummary:: + + algokit_utils.models.account.DISPENSER_ACCOUNT_NAME + + +Classes +------- + +.. autoapisummary:: + + algokit_utils.models.account.TransactionSignerAccount + algokit_utils.models.account.SigningAccount + algokit_utils.models.account.MultisigMetadata + algokit_utils.models.account.MultiSigAccount + algokit_utils.models.account.LogicSigAccount + + +Module Contents +--------------- + +.. py:data:: DISPENSER_ACCOUNT_NAME + :value: 'DISPENSER' + + +.. py:class:: TransactionSignerAccount + + A basic transaction signer account. + + + .. py:attribute:: address + :type: str + + + .. py:attribute:: signer + :type: algosdk.atomic_transaction_composer.TransactionSigner + + +.. py:class:: SigningAccount + + Holds the private key and address for an account. + + Provides access to the account's private key, address, public key and transaction signer. + + + .. py:attribute:: private_key + :type: str + + Base64 encoded private key + + + + .. py:attribute:: address + :type: str + :value: '' + + + Address for this account + + + + .. py:property:: public_key + :type: bytes + + + The public key for this account. + + :return: The public key as bytes + + + + .. py:property:: signer + :type: algosdk.atomic_transaction_composer.AccountTransactionSigner + + + Get an AccountTransactionSigner for this account. + + :return: A transaction signer for this account + + + + .. py:method:: new_account() -> SigningAccount + :staticmethod: + + + Create a new random account. + + :return: A new Account instance + + + +.. py:class:: MultisigMetadata + + Metadata for a multisig account. + + Contains the version, threshold and addresses for a multisig account. + + + .. py:attribute:: version + :type: int + + + .. py:attribute:: threshold + :type: int + + + .. py:attribute:: addresses + :type: list[str] + + +.. py:class:: MultiSigAccount(multisig_params: MultisigMetadata, signing_accounts: list[SigningAccount]) + + Account wrapper that supports partial or full multisig signing. + + Provides functionality to manage and sign transactions for a multisig account. + + :param multisig_params: The parameters for the multisig account + :param signing_accounts: The list of accounts that can sign + + + .. py:property:: multisig + :type: algosdk.transaction.Multisig + + + Get the underlying `algosdk.transaction.Multisig` object instance. + + :return: The `algosdk.transaction.Multisig` object instance + + + + .. py:property:: params + :type: MultisigMetadata + + + Get the parameters for the multisig account. + + :return: The multisig account parameters + + + + .. py:property:: signing_accounts + :type: list[SigningAccount] + + + Get the list of accounts that are present to sign. + + :return: The list of signing accounts + + + + .. py:property:: address + :type: str + + + Get the address of the multisig account. + + :return: The multisig account address + + + + .. py:property:: signer + :type: algosdk.atomic_transaction_composer.TransactionSigner + + + Get the transaction signer for this multisig account. + + :return: The multisig transaction signer + + + + .. py:method:: sign(transaction: algosdk.transaction.Transaction) -> algosdk.transaction.MultisigTransaction + + Sign the given transaction with all present signers. + + :param transaction: Either a transaction object or a raw, partially signed transaction + :return: The transaction signed by the present signers + + + +.. py:class:: LogicSigAccount(program: bytes, args: list[bytes] | None) + + Account wrapper that supports logic sig signing. + + Provides functionality to manage and sign transactions for a logic sig account. + + + .. py:property:: lsig + :type: algosdk.transaction.LogicSigAccount + + + Get the underlying `algosdk.transaction.LogicSigAccount` object instance. + + :return: The `algosdk.transaction.LogicSigAccount` object instance + + + + .. py:property:: address + :type: str + + + Get the address of the logic sig account. + + If the LogicSig is delegated to another account, this will return the address of that account. + + If the LogicSig is not delegated to another account, this will return an escrow address that is the hash of + the LogicSig's program code. + + :return: The logic sig account address + + + + .. py:property:: signer + :type: algosdk.atomic_transaction_composer.LogicSigTransactionSigner + + + Get the transaction signer for this multisig account. + + :return: The multisig transaction signer + + + diff --git a/docs/html/_sources/autoapi/algokit_utils/models/amount/index.rst.txt b/docs/html/_sources/autoapi/algokit_utils/models/amount/index.rst.txt new file mode 100644 index 00000000..64b6b524 --- /dev/null +++ b/docs/html/_sources/autoapi/algokit_utils/models/amount/index.rst.txt @@ -0,0 +1,121 @@ +algokit_utils.models.amount +=========================== + +.. py:module:: algokit_utils.models.amount + + +Attributes +---------- + +.. autoapisummary:: + + algokit_utils.models.amount.ALGORAND_MIN_TX_FEE + + +Classes +------- + +.. autoapisummary:: + + algokit_utils.models.amount.AlgoAmount + + +Functions +--------- + +.. autoapisummary:: + + algokit_utils.models.amount.algo + algokit_utils.models.amount.micro_algo + algokit_utils.models.amount.transaction_fees + + +Module Contents +--------------- + +.. py:class:: AlgoAmount(*, micro_algo: int) + AlgoAmount(*, algo: int | decimal.Decimal) + + Wrapper class to ensure safe, explicit conversion between µAlgo, Algo and numbers. + + :example: + >>> amount = AlgoAmount(algo=1) + >>> amount = AlgoAmount.from_algo(1) + >>> amount = AlgoAmount(micro_algo=1_000_000) + >>> amount = AlgoAmount.from_micro_algo(1_000_000) + + + .. py:property:: micro_algo + :type: int + + + Return the amount as a number in µAlgo. + + :returns: The amount in µAlgo. + + + + .. py:property:: algo + :type: decimal.Decimal + + + Return the amount as a number in Algo. + + :returns: The amount in Algo. + + + + .. py:method:: from_algo(amount: int | decimal.Decimal) -> AlgoAmount + :staticmethod: + + + Create an AlgoAmount object representing the given number of Algo. + + :param amount: The amount in Algo. + :returns: An AlgoAmount instance. + + :example: + >>> amount = AlgoAmount.from_algo(1) + + + + .. py:method:: from_micro_algo(amount: int) -> AlgoAmount + :staticmethod: + + + Create an AlgoAmount object representing the given number of µAlgo. + + :param amount: The amount in µAlgo. + :returns: An AlgoAmount instance. + + :example: + >>> amount = AlgoAmount.from_micro_algo(1_000_000) + + + +.. py:function:: algo(algo: int) -> AlgoAmount + + Create an AlgoAmount object representing the given number of Algo. + + :param algo: The number of Algo to create an AlgoAmount object for. + :return: An AlgoAmount object representing the given number of Algo. + + +.. py:function:: micro_algo(micro_algo: int) -> AlgoAmount + + Create an AlgoAmount object representing the given number of µAlgo. + + :param micro_algo: The number of µAlgo to create an AlgoAmount object for. + :return: An AlgoAmount object representing the given number of µAlgo. + + +.. py:data:: ALGORAND_MIN_TX_FEE + +.. py:function:: transaction_fees(number_of_transactions: int) -> AlgoAmount + + Calculate the total transaction fees for a given number of transactions. + + :param number_of_transactions: The number of transactions to calculate the fees for. + :return: The total transaction fees. + + diff --git a/docs/html/_sources/autoapi/algokit_utils/models/application/index.rst.txt b/docs/html/_sources/autoapi/algokit_utils/models/application/index.rst.txt new file mode 100644 index 00000000..dd512a80 --- /dev/null +++ b/docs/html/_sources/autoapi/algokit_utils/models/application/index.rst.txt @@ -0,0 +1,216 @@ +algokit_utils.models.application +================================ + +.. py:module:: algokit_utils.models.application + + +Classes +------- + +.. autoapisummary:: + + algokit_utils.models.application.AppState + algokit_utils.models.application.AppInformation + algokit_utils.models.application.CompiledTeal + algokit_utils.models.application.AppCompilationResult + algokit_utils.models.application.AppSourceMaps + + +Module Contents +--------------- + +.. py:class:: AppState + + .. py:attribute:: key_raw + :type: bytes + + The key of the state as raw bytes + + + + .. py:attribute:: key_base64 + :type: str + + The key of the state + + + + .. py:attribute:: value_raw + :type: bytes | None + + The value of the state as raw bytes + + + + .. py:attribute:: value_base64 + :type: str | None + + The value of the state as base64 encoded string + + + + .. py:attribute:: value + :type: str | int + + The value of the state as a string or integer + + + +.. py:class:: AppInformation + + .. py:attribute:: app_id + :type: int + + The ID of the application + + + + .. py:attribute:: app_address + :type: str + + The address of the application + + + + .. py:attribute:: approval_program + :type: bytes + + The approval program + + + + .. py:attribute:: clear_state_program + :type: bytes + + The clear state program + + + + .. py:attribute:: creator + :type: str + + The creator of the application + + + + .. py:attribute:: global_state + :type: dict[str, AppState] + + The global state of the application + + + + .. py:attribute:: local_ints + :type: int + + The number of local ints + + + + .. py:attribute:: local_byte_slices + :type: int + + The number of local byte slices + + + + .. py:attribute:: global_ints + :type: int + + The number of global ints + + + + .. py:attribute:: global_byte_slices + :type: int + + The number of global byte slices + + + + .. py:attribute:: extra_program_pages + :type: int | None + + The number of extra program pages + + + +.. py:class:: CompiledTeal + + The compiled teal code + + + .. py:attribute:: teal + :type: str + + The teal code + + + + .. py:attribute:: compiled + :type: str + + The compiled teal code + + + + .. py:attribute:: compiled_hash + :type: str + + The compiled hash + + + + .. py:attribute:: compiled_base64_to_bytes + :type: bytes + + The compiled base64 to bytes + + + + .. py:attribute:: source_map + :type: algosdk.source_map.SourceMap | None + + +.. py:class:: AppCompilationResult + + The compiled teal code + + + .. py:attribute:: compiled_approval + :type: CompiledTeal + + The compiled approval program + + + + .. py:attribute:: compiled_clear + :type: CompiledTeal + + The compiled clear state program + + + +.. py:class:: AppSourceMaps + + The source maps for the application + + + .. py:attribute:: approval_source_map + :type: algosdk.source_map.SourceMap | None + :value: None + + + The source map for the approval program + + + + .. py:attribute:: clear_source_map + :type: algosdk.source_map.SourceMap | None + :value: None + + + The source map for the clear state program + + + diff --git a/docs/html/_sources/autoapi/algokit_utils/models/index.rst.txt b/docs/html/_sources/autoapi/algokit_utils/models/index.rst.txt new file mode 100644 index 00000000..72a26073 --- /dev/null +++ b/docs/html/_sources/autoapi/algokit_utils/models/index.rst.txt @@ -0,0 +1,21 @@ +algokit_utils.models +==================== + +.. py:module:: algokit_utils.models + + +Submodules +---------- + +.. toctree:: + :maxdepth: 1 + + /autoapi/algokit_utils/models/account/index + /autoapi/algokit_utils/models/amount/index + /autoapi/algokit_utils/models/application/index + /autoapi/algokit_utils/models/network/index + /autoapi/algokit_utils/models/simulate/index + /autoapi/algokit_utils/models/state/index + /autoapi/algokit_utils/models/transaction/index + + diff --git a/docs/html/_sources/autoapi/algokit_utils/models/network/index.rst.txt b/docs/html/_sources/autoapi/algokit_utils/models/network/index.rst.txt new file mode 100644 index 00000000..8ca64c28 --- /dev/null +++ b/docs/html/_sources/autoapi/algokit_utils/models/network/index.rst.txt @@ -0,0 +1,66 @@ +algokit_utils.models.network +============================ + +.. py:module:: algokit_utils.models.network + + +Classes +------- + +.. autoapisummary:: + + algokit_utils.models.network.AlgoClientNetworkConfig + algokit_utils.models.network.AlgoClientConfigs + + +Module Contents +--------------- + +.. py:class:: AlgoClientNetworkConfig + + Connection details for connecting to an {py:class}`algosdk.v2client.algod.AlgodClient` or + {py:class}`algosdk.v2client.indexer.IndexerClient` + + + .. py:attribute:: server + :type: str + + URL for the service e.g. `http://localhost` or `https://testnet-api.algonode.cloud` + + + + .. py:attribute:: token + :type: str | None + :value: None + + + API Token to authenticate with the service e.g '4001' or '8980' + + + + .. py:attribute:: port + :type: str | int | None + :value: None + + + + .. py:method:: full_url() -> str + + Returns the full URL for the service + + + +.. py:class:: AlgoClientConfigs + + .. py:attribute:: algod_config + :type: AlgoClientNetworkConfig + + + .. py:attribute:: indexer_config + :type: AlgoClientNetworkConfig | None + + + .. py:attribute:: kmd_config + :type: AlgoClientNetworkConfig | None + + diff --git a/docs/html/_sources/autoapi/algokit_utils/models/simulate/index.rst.txt b/docs/html/_sources/autoapi/algokit_utils/models/simulate/index.rst.txt new file mode 100644 index 00000000..8b95ecad --- /dev/null +++ b/docs/html/_sources/autoapi/algokit_utils/models/simulate/index.rst.txt @@ -0,0 +1,35 @@ +algokit_utils.models.simulate +============================= + +.. py:module:: algokit_utils.models.simulate + + +Classes +------- + +.. autoapisummary:: + + algokit_utils.models.simulate.SimulationTrace + + +Module Contents +--------------- + +.. py:class:: SimulationTrace + + .. py:attribute:: app_budget_added + :type: int | None + + + .. py:attribute:: app_budget_consumed + :type: int | None + + + .. py:attribute:: failure_message + :type: str | None + + + .. py:attribute:: exec_trace + :type: dict[str, object] + + diff --git a/docs/html/_sources/autoapi/algokit_utils/models/state/index.rst.txt b/docs/html/_sources/autoapi/algokit_utils/models/state/index.rst.txt new file mode 100644 index 00000000..7e446c9b --- /dev/null +++ b/docs/html/_sources/autoapi/algokit_utils/models/state/index.rst.txt @@ -0,0 +1,114 @@ +algokit_utils.models.state +========================== + +.. py:module:: algokit_utils.models.state + + +Attributes +---------- + +.. autoapisummary:: + + algokit_utils.models.state.TealTemplateParams + algokit_utils.models.state.BoxIdentifier + + +Classes +------- + +.. autoapisummary:: + + algokit_utils.models.state.BoxName + algokit_utils.models.state.BoxValue + algokit_utils.models.state.DataTypeFlag + algokit_utils.models.state.BoxReference + + +Module Contents +--------------- + +.. py:class:: BoxName + + The name of the box + + + .. py:attribute:: name + :type: str + + The name of the box as a string + + + + .. py:attribute:: name_raw + :type: bytes + + The name of the box as raw bytes + + + + .. py:attribute:: name_base64 + :type: str + + The name of the box as a base64 encoded string + + + +.. py:class:: BoxValue + + The value of the box + + + .. py:attribute:: name + :type: BoxName + + The name of the box + + + + .. py:attribute:: value + :type: bytes + + The value of the box as raw bytes + + + +.. py:class:: DataTypeFlag + + Bases: :py:obj:`enum.IntEnum` + + + Enum where members are also (and must be) ints + + + .. py:attribute:: BYTES + :value: 1 + + + + .. py:attribute:: UINT + :value: 2 + + + +.. py:data:: TealTemplateParams + :type: TypeAlias + :value: Mapping[str, str | int | bytes] | dict[str, str | int | bytes] + + +.. py:data:: BoxIdentifier + :type: TypeAlias + :value: str | bytes | AccountTransactionSigner + + +.. py:class:: BoxReference(app_id: int, name: bytes | str) + + Bases: :py:obj:`algosdk.box_reference.BoxReference` + + + Represents a box reference with a foreign app index and the box name. + + Args: + app_index (int): index of the application in the foreign app array + name (bytes): key for the box in bytes + + diff --git a/docs/html/_sources/autoapi/algokit_utils/models/transaction/index.rst.txt b/docs/html/_sources/autoapi/algokit_utils/models/transaction/index.rst.txt new file mode 100644 index 00000000..9e5c0481 --- /dev/null +++ b/docs/html/_sources/autoapi/algokit_utils/models/transaction/index.rst.txt @@ -0,0 +1,150 @@ +algokit_utils.models.transaction +================================ + +.. py:module:: algokit_utils.models.transaction + + +Attributes +---------- + +.. autoapisummary:: + + algokit_utils.models.transaction.Arc2TransactionNote + algokit_utils.models.transaction.TransactionNoteData + algokit_utils.models.transaction.TransactionNote + + +Classes +------- + +.. autoapisummary:: + + algokit_utils.models.transaction.BaseArc2Note + algokit_utils.models.transaction.StringFormatArc2Note + algokit_utils.models.transaction.JsonFormatArc2Note + algokit_utils.models.transaction.TransactionWrapper + algokit_utils.models.transaction.SendParams + + +Module Contents +--------------- + +.. py:class:: BaseArc2Note + + Bases: :py:obj:`TypedDict` + + + Base ARC-0002 transaction note structure + + + .. py:attribute:: dapp_name + :type: str + + +.. py:class:: StringFormatArc2Note + + Bases: :py:obj:`BaseArc2Note` + + + ARC-0002 note for string-based formats (m/b/u) + + + .. py:attribute:: format + :type: Literal['m', 'b', 'u'] + + + .. py:attribute:: data + :type: str + + +.. py:class:: JsonFormatArc2Note + + Bases: :py:obj:`BaseArc2Note` + + + ARC-0002 note for JSON format + + + .. py:attribute:: format + :type: Literal['j'] + + + .. py:attribute:: data + :type: str | dict[str, Any] | list[Any] | int | None + + +.. py:data:: Arc2TransactionNote + +.. py:data:: TransactionNoteData + +.. py:data:: TransactionNote + +.. py:class:: TransactionWrapper(transaction: algosdk.transaction.Transaction) + + Wrapper around algosdk.transaction.Transaction with optional property validators + + + .. py:property:: raw + :type: algosdk.transaction.Transaction + + + + .. py:property:: payment + :type: algosdk.transaction.PaymentTxn + + + + .. py:property:: keyreg + :type: algosdk.transaction.KeyregTxn + + + + .. py:property:: asset_config + :type: algosdk.transaction.AssetConfigTxn + + + + .. py:property:: asset_transfer + :type: algosdk.transaction.AssetTransferTxn + + + + .. py:property:: asset_freeze + :type: algosdk.transaction.AssetFreezeTxn + + + + .. py:property:: application_call + :type: algosdk.transaction.ApplicationCallTxn + + + + .. py:property:: state_proof + :type: algosdk.transaction.StateProofTxn + + + +.. py:class:: SendParams + + Bases: :py:obj:`TypedDict` + + + Parameters for sending a transaction + + + .. py:attribute:: max_rounds_to_wait + :type: int | None + + + .. py:attribute:: suppress_log + :type: bool | None + + + .. py:attribute:: populate_app_call_resources + :type: bool | None + + + .. py:attribute:: cover_app_call_inner_transaction_fees + :type: bool | None + + diff --git a/docs/html/_sources/autoapi/algokit_utils/protocols/account/index.rst.txt b/docs/html/_sources/autoapi/algokit_utils/protocols/account/index.rst.txt new file mode 100644 index 00000000..5d72bfef --- /dev/null +++ b/docs/html/_sources/autoapi/algokit_utils/protocols/account/index.rst.txt @@ -0,0 +1,42 @@ +algokit_utils.protocols.account +=============================== + +.. py:module:: algokit_utils.protocols.account + + +Classes +------- + +.. autoapisummary:: + + algokit_utils.protocols.account.TransactionSignerAccountProtocol + + +Module Contents +--------------- + +.. py:class:: TransactionSignerAccountProtocol + + Bases: :py:obj:`Protocol` + + + An account that has a transaction signer. + Implemented by SigningAccount, LogicSigAccount, MultiSigAccount and TransactionSignerAccount abstractions. + + + .. py:property:: address + :type: str + + + The address of the account. + + + + .. py:property:: signer + :type: algosdk.atomic_transaction_composer.TransactionSigner + + + The transaction signer for the account. + + + diff --git a/docs/html/_sources/autoapi/algokit_utils/protocols/index.rst.txt b/docs/html/_sources/autoapi/algokit_utils/protocols/index.rst.txt new file mode 100644 index 00000000..b03c5e89 --- /dev/null +++ b/docs/html/_sources/autoapi/algokit_utils/protocols/index.rst.txt @@ -0,0 +1,16 @@ +algokit_utils.protocols +======================= + +.. py:module:: algokit_utils.protocols + + +Submodules +---------- + +.. toctree:: + :maxdepth: 1 + + /autoapi/algokit_utils/protocols/account/index + /autoapi/algokit_utils/protocols/typed_clients/index + + diff --git a/docs/html/_sources/autoapi/algokit_utils/protocols/typed_clients/index.rst.txt b/docs/html/_sources/autoapi/algokit_utils/protocols/typed_clients/index.rst.txt new file mode 100644 index 00000000..bbf65f5c --- /dev/null +++ b/docs/html/_sources/autoapi/algokit_utils/protocols/typed_clients/index.rst.txt @@ -0,0 +1,105 @@ +algokit_utils.protocols.typed_clients +===================================== + +.. py:module:: algokit_utils.protocols.typed_clients + + +Classes +------- + +.. autoapisummary:: + + algokit_utils.protocols.typed_clients.TypedAppClientProtocol + algokit_utils.protocols.typed_clients.TypedAppFactoryProtocol + + +Module Contents +--------------- + +.. py:class:: TypedAppClientProtocol(*, app_id: int, app_name: str | None = None, default_sender: str | None = None, default_signer: algosdk.atomic_transaction_composer.TransactionSigner | None = None, algorand: algokit_utils.algorand.AlgorandClient, approval_source_map: algosdk.source_map.SourceMap | None = None, clear_source_map: algosdk.source_map.SourceMap | None = None) + + Bases: :py:obj:`Protocol` + + + Base class for protocol classes. + + Protocol classes are defined as:: + + class Proto(Protocol): + def meth(self) -> int: + ... + + Such classes are primarily used with static type checkers that recognize + structural subtyping (static duck-typing). + + For example:: + + class C: + def meth(self) -> int: + return 0 + + def func(x: Proto) -> int: + return x.meth() + + func(C()) # Passes static type check + + See PEP 544 for details. Protocol classes decorated with + @typing.runtime_checkable act as simple-minded runtime protocols that check + only the presence of given attributes, ignoring their type signatures. + Protocol classes can be generic, they are defined as:: + + class GenProto[T](Protocol): + def meth(self) -> T: + ... + + + .. py:method:: from_creator_and_name(*, creator_address: str, app_name: str, default_sender: str | None = None, default_signer: algosdk.atomic_transaction_composer.TransactionSigner | None = None, ignore_cache: bool | None = None, app_lookup_cache: algokit_utils.applications.app_deployer.ApplicationLookup | None = None, algorand: algokit_utils.algorand.AlgorandClient) -> typing_extensions.Self + :classmethod: + + + + .. py:method:: from_network(*, app_name: str | None = None, default_sender: str | None = None, default_signer: algosdk.atomic_transaction_composer.TransactionSigner | None = None, approval_source_map: algosdk.source_map.SourceMap | None = None, clear_source_map: algosdk.source_map.SourceMap | None = None, algorand: algokit_utils.algorand.AlgorandClient) -> typing_extensions.Self + :classmethod: + + + +.. py:class:: TypedAppFactoryProtocol(algorand: algokit_utils.algorand.AlgorandClient, **kwargs: Any) + + Bases: :py:obj:`Protocol`, :py:obj:`Generic`\ [\ :py:obj:`CreateParamsT`\ , :py:obj:`UpdateParamsT`\ , :py:obj:`DeleteParamsT`\ ] + + + Base class for protocol classes. + + Protocol classes are defined as:: + + class Proto(Protocol): + def meth(self) -> int: + ... + + Such classes are primarily used with static type checkers that recognize + structural subtyping (static duck-typing). + + For example:: + + class C: + def meth(self) -> int: + return 0 + + def func(x: Proto) -> int: + return x.meth() + + func(C()) # Passes static type check + + See PEP 544 for details. Protocol classes decorated with + @typing.runtime_checkable act as simple-minded runtime protocols that check + only the presence of given attributes, ignoring their type signatures. + Protocol classes can be generic, they are defined as:: + + class GenProto[T](Protocol): + def meth(self) -> T: + ... + + + .. py:method:: deploy(*, on_update: algokit_utils.applications.app_deployer.OnUpdate | None = None, on_schema_break: algokit_utils.applications.app_deployer.OnSchemaBreak | None = None, create_params: CreateParamsT | None = None, update_params: UpdateParamsT | None = None, delete_params: DeleteParamsT | None = None, existing_deployments: algokit_utils.applications.app_deployer.ApplicationLookup | None = None, ignore_cache: bool = False, app_name: str | None = None, send_params: algokit_utils.models.SendParams | None = None, compilation_params: algokit_utils.applications.app_client.AppClientCompilationParams | None = None) -> tuple[TypedAppClientProtocol, algokit_utils.applications.app_factory.AppFactoryDeployResult] + + diff --git a/docs/html/_sources/autoapi/algokit_utils/transactions/index.rst.txt b/docs/html/_sources/autoapi/algokit_utils/transactions/index.rst.txt new file mode 100644 index 00000000..7ab9a27f --- /dev/null +++ b/docs/html/_sources/autoapi/algokit_utils/transactions/index.rst.txt @@ -0,0 +1,17 @@ +algokit_utils.transactions +========================== + +.. py:module:: algokit_utils.transactions + + +Submodules +---------- + +.. toctree:: + :maxdepth: 1 + + /autoapi/algokit_utils/transactions/transaction_composer/index + /autoapi/algokit_utils/transactions/transaction_creator/index + /autoapi/algokit_utils/transactions/transaction_sender/index + + diff --git a/docs/html/_sources/autoapi/algokit_utils/transactions/transaction_composer/index.rst.txt b/docs/html/_sources/autoapi/algokit_utils/transactions/transaction_composer/index.rst.txt new file mode 100644 index 00000000..1889d7cb --- /dev/null +++ b/docs/html/_sources/autoapi/algokit_utils/transactions/transaction_composer/index.rst.txt @@ -0,0 +1,1591 @@ +algokit_utils.transactions.transaction_composer +=============================================== + +.. py:module:: algokit_utils.transactions.transaction_composer + + +Attributes +---------- + +.. autoapisummary:: + + algokit_utils.transactions.transaction_composer.MethodCallParams + algokit_utils.transactions.transaction_composer.AppMethodCallTransactionArgument + algokit_utils.transactions.transaction_composer.TxnParams + + +Classes +------- + +.. autoapisummary:: + + algokit_utils.transactions.transaction_composer.PaymentParams + algokit_utils.transactions.transaction_composer.AssetCreateParams + algokit_utils.transactions.transaction_composer.AssetConfigParams + algokit_utils.transactions.transaction_composer.AssetFreezeParams + algokit_utils.transactions.transaction_composer.AssetDestroyParams + algokit_utils.transactions.transaction_composer.OnlineKeyRegistrationParams + algokit_utils.transactions.transaction_composer.OfflineKeyRegistrationParams + algokit_utils.transactions.transaction_composer.AssetTransferParams + algokit_utils.transactions.transaction_composer.AssetOptInParams + algokit_utils.transactions.transaction_composer.AssetOptOutParams + algokit_utils.transactions.transaction_composer.AppCallParams + algokit_utils.transactions.transaction_composer.AppCreateSchema + algokit_utils.transactions.transaction_composer.AppCreateParams + algokit_utils.transactions.transaction_composer.AppUpdateParams + algokit_utils.transactions.transaction_composer.AppDeleteParams + algokit_utils.transactions.transaction_composer.AppCallMethodCallParams + algokit_utils.transactions.transaction_composer.AppCreateMethodCallParams + algokit_utils.transactions.transaction_composer.AppUpdateMethodCallParams + algokit_utils.transactions.transaction_composer.AppDeleteMethodCallParams + algokit_utils.transactions.transaction_composer.BuiltTransactions + algokit_utils.transactions.transaction_composer.TransactionComposerBuildResult + algokit_utils.transactions.transaction_composer.SendAtomicTransactionComposerResults + algokit_utils.transactions.transaction_composer.TransactionComposer + + +Functions +--------- + +.. autoapisummary:: + + algokit_utils.transactions.transaction_composer.calculate_extra_program_pages + algokit_utils.transactions.transaction_composer.populate_app_call_resources + algokit_utils.transactions.transaction_composer.prepare_group_for_sending + algokit_utils.transactions.transaction_composer.send_atomic_transaction_composer + + +Module Contents +--------------- + +.. py:class:: PaymentParams + + Bases: :py:obj:`_CommonTxnParams` + + + Parameters for a payment transaction. + + + .. py:attribute:: receiver + :type: str + + The account that will receive the ALGO + + + + .. py:attribute:: amount + :type: algokit_utils.models.amount.AlgoAmount + + Amount to send + + + + .. py:attribute:: close_remainder_to + :type: str | None + :value: None + + + If given, close the sender account and send the remaining balance to this address, defaults to None + + + +.. py:class:: AssetCreateParams + + Bases: :py:obj:`_CommonTxnParams` + + + Parameters for creating a new asset. + + + .. py:attribute:: total + :type: int + + The total amount of the smallest divisible unit to create + + + + .. py:attribute:: asset_name + :type: str | None + :value: None + + + The full name of the asset + + + + .. py:attribute:: unit_name + :type: str | None + :value: None + + + The short ticker name for the asset + + + + .. py:attribute:: url + :type: str | None + :value: None + + + The metadata URL for the asset + + + + .. py:attribute:: decimals + :type: int | None + :value: None + + + The amount of decimal places the asset should have + + + + .. py:attribute:: default_frozen + :type: bool | None + :value: None + + + Whether the asset is frozen by default in the creator address + + + + .. py:attribute:: manager + :type: str | None + :value: None + + + The address that can change the manager, reserve, clawback, and freeze addresses + + + + .. py:attribute:: reserve + :type: str | None + :value: None + + + The address that holds the uncirculated supply + + + + .. py:attribute:: freeze + :type: str | None + :value: None + + + The address that can freeze the asset in any account + + + + .. py:attribute:: clawback + :type: str | None + :value: None + + + The address that can clawback the asset from any account + + + + .. py:attribute:: metadata_hash + :type: bytes | None + :value: None + + + Hash of the metadata contained in the metadata URL + + + +.. py:class:: AssetConfigParams + + Bases: :py:obj:`_CommonTxnParams` + + + Parameters for configuring an existing asset. + + + .. py:attribute:: asset_id + :type: int + + The ID of the asset + + + + .. py:attribute:: manager + :type: str | None + :value: None + + + The address that can change the manager, reserve, clawback, and freeze addresses, defaults to None + + + + .. py:attribute:: reserve + :type: str | None + :value: None + + + The address that holds the uncirculated supply, defaults to None + + + + .. py:attribute:: freeze + :type: str | None + :value: None + + + The address that can freeze the asset in any account, defaults to None + + + + .. py:attribute:: clawback + :type: str | None + :value: None + + + The address that can clawback the asset from any account, defaults to None + + + +.. py:class:: AssetFreezeParams + + Bases: :py:obj:`_CommonTxnParams` + + + Parameters for freezing an asset. + + + .. py:attribute:: asset_id + :type: int + + The ID of the asset + + + + .. py:attribute:: account + :type: str + + The account to freeze or unfreeze + + + + .. py:attribute:: frozen + :type: bool + + Whether the assets in the account should be frozen + + + +.. py:class:: AssetDestroyParams + + Bases: :py:obj:`_CommonTxnParams` + + + Parameters for destroying an asset. + + + .. py:attribute:: asset_id + :type: int + + The ID of the asset + + + +.. py:class:: OnlineKeyRegistrationParams + + Bases: :py:obj:`_CommonTxnParams` + + + Parameters for online key registration. + + + .. py:attribute:: vote_key + :type: str + + The root participation public key + + + + .. py:attribute:: selection_key + :type: str + + The VRF public key + + + + .. py:attribute:: vote_first + :type: int + + The first round that the participation key is valid + + + + .. py:attribute:: vote_last + :type: int + + The last round that the participation key is valid + + + + .. py:attribute:: vote_key_dilution + :type: int + + The dilution for the 2-level participation key + + + + .. py:attribute:: state_proof_key + :type: bytes | None + :value: None + + + The 64 byte state proof public key commitment, defaults to None + + + +.. py:class:: OfflineKeyRegistrationParams + + Bases: :py:obj:`_CommonTxnParams` + + + Parameters for offline key registration. + + + .. py:attribute:: prevent_account_from_ever_participating_again + :type: bool + + Whether to prevent the account from ever participating again + + + +.. py:class:: AssetTransferParams + + Bases: :py:obj:`_CommonTxnParams` + + + Parameters for transferring an asset. + + + .. py:attribute:: asset_id + :type: int + + The ID of the asset + + + + .. py:attribute:: amount + :type: int + + The amount of the asset to transfer (smallest divisible unit) + + + + .. py:attribute:: receiver + :type: str + + The account to send the asset to + + + + .. py:attribute:: clawback_target + :type: str | None + :value: None + + + The account to take the asset from, defaults to None + + + + .. py:attribute:: close_asset_to + :type: str | None + :value: None + + + The account to close the asset to, defaults to None + + + +.. py:class:: AssetOptInParams + + Bases: :py:obj:`_CommonTxnParams` + + + Parameters for opting into an asset. + + + .. py:attribute:: asset_id + :type: int + + The ID of the asset + + + +.. py:class:: AssetOptOutParams + + Bases: :py:obj:`_CommonTxnParams` + + + Parameters for opting out of an asset. + + + .. py:attribute:: asset_id + :type: int + + The ID of the asset + + + + .. py:attribute:: creator + :type: str + + The creator address of the asset + + + +.. py:class:: AppCallParams + + Bases: :py:obj:`_CommonTxnParams` + + + Parameters for calling an application. + + + .. py:attribute:: on_complete + :type: algosdk.transaction.OnComplete + + The OnComplete action, defaults to None + + + + .. py:attribute:: app_id + :type: int | None + :value: None + + + The ID of the application, defaults to None + + + + .. py:attribute:: approval_program + :type: str | bytes | None + :value: None + + + The program to execute for all OnCompletes other than ClearState, defaults to None + + + + .. py:attribute:: clear_state_program + :type: str | bytes | None + :value: None + + + The program to execute for ClearState OnComplete, defaults to None + + + + .. py:attribute:: schema + :type: dict[str, int] | None + :value: None + + + The state schema for the app, defaults to None + + + + .. py:attribute:: args + :type: list[bytes] | None + :value: None + + + Application arguments, defaults to None + + + + .. py:attribute:: account_references + :type: list[str] | None + :value: None + + + Account references, defaults to None + + + + .. py:attribute:: app_references + :type: list[int] | None + :value: None + + + App references, defaults to None + + + + .. py:attribute:: asset_references + :type: list[int] | None + :value: None + + + Asset references, defaults to None + + + + .. py:attribute:: extra_pages + :type: int | None + :value: None + + + Number of extra pages required for the programs, defaults to None + + + + .. py:attribute:: box_references + :type: list[algokit_utils.models.state.BoxReference | algokit_utils.models.state.BoxIdentifier] | None + :value: None + + + Box references, defaults to None + + + +.. py:class:: AppCreateSchema + + Bases: :py:obj:`TypedDict` + + + dict() -> new empty dictionary + dict(mapping) -> new dictionary initialized from a mapping object's + (key, value) pairs + dict(iterable) -> new dictionary initialized as if via: + d = {} + for k, v in iterable: + d[k] = v + dict(**kwargs) -> new dictionary initialized with the name=value pairs + in the keyword argument list. For example: dict(one=1, two=2) + + + .. py:attribute:: global_ints + :type: int + + The number of global ints in the schema + + + + .. py:attribute:: global_byte_slices + :type: int + + The number of global byte slices in the schema + + + + .. py:attribute:: local_ints + :type: int + + The number of local ints in the schema + + + + .. py:attribute:: local_byte_slices + :type: int + + The number of local byte slices in the schema + + + +.. py:class:: AppCreateParams + + Bases: :py:obj:`_CommonTxnParams` + + + Parameters for creating an application. + + + .. py:attribute:: approval_program + :type: str | bytes + + The program to execute for all OnCompletes other than ClearState + + + + .. py:attribute:: clear_state_program + :type: str | bytes + + The program to execute for ClearState OnComplete + + + + .. py:attribute:: schema + :type: AppCreateSchema | None + :value: None + + + The state schema for the app, defaults to None + + + + .. py:attribute:: on_complete + :type: algosdk.transaction.OnComplete | None + :value: None + + + The OnComplete action, defaults to None + + + + .. py:attribute:: args + :type: list[bytes] | None + :value: None + + + Application arguments, defaults to None + + + + .. py:attribute:: account_references + :type: list[str] | None + :value: None + + + Account references, defaults to None + + + + .. py:attribute:: app_references + :type: list[int] | None + :value: None + + + App references, defaults to None + + + + .. py:attribute:: asset_references + :type: list[int] | None + :value: None + + + Asset references, defaults to None + + + + .. py:attribute:: box_references + :type: list[algokit_utils.models.state.BoxReference | algokit_utils.models.state.BoxIdentifier] | None + :value: None + + + Box references, defaults to None + + + + .. py:attribute:: extra_program_pages + :type: int | None + :value: None + + + Number of extra pages required for the programs, defaults to None + + + +.. py:class:: AppUpdateParams + + Bases: :py:obj:`_CommonTxnParams` + + + Parameters for updating an application. + + + .. py:attribute:: app_id + :type: int + + The ID of the application + + + + .. py:attribute:: approval_program + :type: str | bytes + + The program to execute for all OnCompletes other than ClearState + + + + .. py:attribute:: clear_state_program + :type: str | bytes + + The program to execute for ClearState OnComplete + + + + .. py:attribute:: args + :type: list[bytes] | None + :value: None + + + Application arguments, defaults to None + + + + .. py:attribute:: account_references + :type: list[str] | None + :value: None + + + Account references, defaults to None + + + + .. py:attribute:: app_references + :type: list[int] | None + :value: None + + + App references, defaults to None + + + + .. py:attribute:: asset_references + :type: list[int] | None + :value: None + + + Asset references, defaults to None + + + + .. py:attribute:: box_references + :type: list[algokit_utils.models.state.BoxReference | algokit_utils.models.state.BoxIdentifier] | None + :value: None + + + Box references, defaults to None + + + + .. py:attribute:: on_complete + :type: algosdk.transaction.OnComplete | None + :value: None + + + The OnComplete action, defaults to None + + + +.. py:class:: AppDeleteParams + + Bases: :py:obj:`_CommonTxnParams` + + + Parameters for deleting an application. + + + .. py:attribute:: app_id + :type: int + + The ID of the application + + + + .. py:attribute:: args + :type: list[bytes] | None + :value: None + + + Application arguments, defaults to None + + + + .. py:attribute:: account_references + :type: list[str] | None + :value: None + + + Account references, defaults to None + + + + .. py:attribute:: app_references + :type: list[int] | None + :value: None + + + App references, defaults to None + + + + .. py:attribute:: asset_references + :type: list[int] | None + :value: None + + + Asset references, defaults to None + + + + .. py:attribute:: box_references + :type: list[algokit_utils.models.state.BoxReference | algokit_utils.models.state.BoxIdentifier] | None + :value: None + + + Box references, defaults to None + + + + .. py:attribute:: on_complete + :type: algosdk.transaction.OnComplete + + The OnComplete action, defaults to DeleteApplicationOC + + + +.. py:class:: AppCallMethodCallParams + + Bases: :py:obj:`_BaseAppMethodCall` + + + Parameters for a regular ABI method call. + + + .. py:attribute:: app_id + :type: int + + The ID of the application + + + + .. py:attribute:: on_complete + :type: algosdk.transaction.OnComplete | None + :value: None + + + The OnComplete action, defaults to None + + + +.. py:class:: AppCreateMethodCallParams + + Bases: :py:obj:`_BaseAppMethodCall` + + + Parameters for an ABI method call that creates an application. + + + .. py:attribute:: approval_program + :type: str | bytes + + The program to execute for all OnCompletes other than ClearState + + + + .. py:attribute:: clear_state_program + :type: str | bytes + + The program to execute for ClearState OnComplete + + + + .. py:attribute:: schema + :type: AppCreateSchema | None + :value: None + + + The state schema for the app, defaults to None + + + + .. py:attribute:: on_complete + :type: algosdk.transaction.OnComplete | None + :value: None + + + The OnComplete action (cannot be ClearState), defaults to None + + + + .. py:attribute:: extra_program_pages + :type: int | None + :value: None + + + Number of extra pages required for the programs, defaults to None + + + +.. py:class:: AppUpdateMethodCallParams + + Bases: :py:obj:`_BaseAppMethodCall` + + + Parameters for an ABI method call that updates an application. + + + .. py:attribute:: app_id + :type: int + + The ID of the application + + + + .. py:attribute:: approval_program + :type: str | bytes + + The program to execute for all OnCompletes other than ClearState + + + + .. py:attribute:: clear_state_program + :type: str | bytes + + The program to execute for ClearState OnComplete + + + + .. py:attribute:: on_complete + :type: algosdk.transaction.OnComplete + + The OnComplete action + + + +.. py:class:: AppDeleteMethodCallParams + + Bases: :py:obj:`_BaseAppMethodCall` + + + Parameters for an ABI method call that deletes an application. + + + .. py:attribute:: app_id + :type: int + + The ID of the application + + + + .. py:attribute:: on_complete + :type: algosdk.transaction.OnComplete + + The OnComplete action + + + +.. py:data:: MethodCallParams + +.. py:data:: AppMethodCallTransactionArgument + +.. py:data:: TxnParams + +.. py:class:: BuiltTransactions + + Set of transactions built by TransactionComposer. + + + .. py:attribute:: transactions + :type: list[algosdk.transaction.Transaction] + + The built transactions + + + + .. py:attribute:: method_calls + :type: dict[int, algosdk.abi.Method] + + Map of transaction index to ABI method + + + + .. py:attribute:: signers + :type: dict[int, algosdk.atomic_transaction_composer.TransactionSigner] + + Map of transaction index to TransactionSigner + + + +.. py:class:: TransactionComposerBuildResult + + Result of building transactions with TransactionComposer. + + + .. py:attribute:: atc + :type: algosdk.atomic_transaction_composer.AtomicTransactionComposer + + The AtomicTransactionComposer instance + + + + .. py:attribute:: transactions + :type: list[algosdk.atomic_transaction_composer.TransactionWithSigner] + + The list of transactions with signers + + + + .. py:attribute:: method_calls + :type: dict[int, algosdk.abi.Method] + + Map of transaction index to ABI method + + + +.. py:class:: SendAtomicTransactionComposerResults + + Results from sending an AtomicTransactionComposer transaction group. + + + .. py:attribute:: group_id + :type: str + + The group ID if this was a transaction group + + + + .. py:attribute:: confirmations + :type: list[algosdk.v2client.algod.AlgodResponseType] + + The confirmation info for each transaction + + + + .. py:attribute:: tx_ids + :type: list[str] + + The transaction IDs that were sent + + + + .. py:attribute:: transactions + :type: list[algokit_utils.models.transaction.TransactionWrapper] + + The transactions that were sent + + + + .. py:attribute:: returns + :type: list[algokit_utils.applications.abi.ABIReturn] + + The ABI return values from any ABI method calls + + + + .. py:attribute:: simulate_response + :type: dict[str, Any] | None + :value: None + + + The simulation response if simulation was performed, defaults to None + + + +.. py:function:: calculate_extra_program_pages(approval: bytes | None, clear: bytes | None) -> int + + Calculate minimum number of extra_pages required for provided approval and clear programs + + +.. py:function:: populate_app_call_resources(atc: algosdk.atomic_transaction_composer.AtomicTransactionComposer, algod: algosdk.v2client.algod.AlgodClient) -> algosdk.atomic_transaction_composer.AtomicTransactionComposer + + Populate application call resources based on simulation results. + + :param atc: The AtomicTransactionComposer containing transactions + :param algod: Algod client for simulation + :return: Modified AtomicTransactionComposer with populated resources + + +.. py:function:: prepare_group_for_sending(atc: algosdk.atomic_transaction_composer.AtomicTransactionComposer, algod: algosdk.v2client.algod.AlgodClient, populate_app_call_resources: bool | None = None, cover_app_call_inner_transaction_fees: bool | None = None, additional_atc_context: AdditionalAtcContext | None = None) -> algosdk.atomic_transaction_composer.AtomicTransactionComposer + + Prepare a transaction group for sending by handling execution info and resources. + + :param atc: The AtomicTransactionComposer containing transactions + :param algod: Algod client for simulation + :param populate_app_call_resources: Whether to populate app call resources + :param cover_app_call_inner_transaction_fees: Whether to cover inner txn fees + :param additional_atc_context: Additional context for the AtomicTransactionComposer + :return: Modified AtomicTransactionComposer ready for sending + + +.. py:function:: send_atomic_transaction_composer(atc: algosdk.atomic_transaction_composer.AtomicTransactionComposer, algod: algosdk.v2client.algod.AlgodClient, *, max_rounds_to_wait: int | None = 5, skip_waiting: bool = False, suppress_log: bool | None = None, populate_app_call_resources: bool | None = None, cover_app_call_inner_transaction_fees: bool | None = None, additional_atc_context: AdditionalAtcContext | None = None) -> SendAtomicTransactionComposerResults + + Send an AtomicTransactionComposer transaction group. + + Executes a group of transactions atomically using the AtomicTransactionComposer. + + :param atc: The AtomicTransactionComposer instance containing the transaction group to send + :param algod: The Algod client to use for sending the transactions + :param max_rounds_to_wait: Maximum number of rounds to wait for confirmation, defaults to 5 + :param skip_waiting: If True, don't wait for transaction confirmation, defaults to False + :param suppress_log: If True, suppress logging, defaults to None + :param populate_app_call_resources: If True, populate app call resources, defaults to None + :param cover_app_call_inner_transaction_fees: If True, cover app call inner transaction fees, defaults to None + :param additional_atc_context: Additional context for the AtomicTransactionComposer + :return: Results from sending the transaction group + :raises Exception: If there is an error sending the transactions + :raises error: If there is an error from the Algorand node + + +.. py:class:: TransactionComposer(algod: algosdk.v2client.algod.AlgodClient, get_signer: collections.abc.Callable[[str], algosdk.atomic_transaction_composer.TransactionSigner], get_suggested_params: collections.abc.Callable[[], algosdk.transaction.SuggestedParams] | None = None, default_validity_window: int | None = None, app_manager: algokit_utils.applications.app_manager.AppManager | None = None) + + A class for composing and managing Algorand transactions. + + Provides a high-level interface for building and executing transaction groups using the Algosdk library. + Supports various transaction types including payments, asset operations, application calls, and key registrations. + + :param algod: An instance of AlgodClient used to get suggested params and send transactions + :param get_signer: A function that takes an address and returns a TransactionSigner for that address + :param get_suggested_params: Optional function to get suggested transaction parameters, + defaults to using algod.suggested_params() + :param default_validity_window: Optional default validity window for transactions in rounds, defaults to 10 + :param app_manager: Optional AppManager instance for compiling TEAL programs, defaults to None + + + .. py:method:: add_transaction(transaction: algosdk.transaction.Transaction, signer: algosdk.atomic_transaction_composer.TransactionSigner | None = None) -> TransactionComposer + + Add a raw transaction to the composer. + + :param transaction: The transaction to add + :param signer: Optional transaction signer, defaults to getting signer from transaction sender + :return: The transaction composer instance for chaining + + :example: + >>> composer.add_transaction(transaction) + + + + .. py:method:: add_payment(params: PaymentParams) -> TransactionComposer + + Add a payment transaction. + + :example: + >>> params = PaymentParams( + ... sender="SENDER_ADDRESS", + ... receiver="RECEIVER_ADDRESS", + ... amount=AlgoAmount.from_algo(1), + ... close_remainder_to="CLOSE_ADDRESS" + ... ... (see PaymentParams for more options) + ... ) + >>> composer.add_payment(params) + + :param params: The payment transaction parameters + :return: The transaction composer instance for chaining + + + + .. py:method:: add_asset_create(params: AssetCreateParams) -> TransactionComposer + + Add an asset creation transaction. + + :example: + >>> params = AssetCreateParams( + ... sender="SENDER_ADDRESS", + ... total=1000, + ... asset_name="MyAsset", + ... unit_name="MA", + ... url="https://example.com", + ... decimals=0, + ... default_frozen=False, + ... manager="MANAGER_ADDRESS", + ... reserve="RESERVE_ADDRESS", + ... freeze="FREEZE_ADDRESS", + ... clawback="CLAWBACK_ADDRESS" + ... ... (see AssetCreateParams for more options) + >>> composer.add_asset_create(params) + + :param params: The asset creation parameters + :return: The transaction composer instance for chaining + + + + .. py:method:: add_asset_config(params: AssetConfigParams) -> TransactionComposer + + Add an asset configuration transaction. + + :example: + >>> params = AssetConfigParams( + ... sender="SENDER_ADDRESS", + ... asset_id=123456, + ... manager="NEW_MANAGER_ADDRESS", + ... reserve="NEW_RESERVE_ADDRESS", + ... freeze="NEW_FREEZE_ADDRESS", + ... clawback="NEW_CLAWBACK_ADDRESS" + ... ... (see AssetConfigParams for more options) + ... ) + >>> composer.add_asset_config(params) + + :param params: The asset configuration parameters + :return: The transaction composer instance for chaining + + + + .. py:method:: add_asset_freeze(params: AssetFreezeParams) -> TransactionComposer + + Add an asset freeze transaction. + + :example: + >>> params = AssetFreezeParams( + ... sender="SENDER_ADDRESS", + ... asset_id=123456, + ... account="ACCOUNT_TO_FREEZE", + ... frozen=True + ... ... (see AssetFreezeParams for more options) + ... ) + >>> composer.add_asset_freeze(params) + + :param params: The asset freeze parameters + :return: The transaction composer instance for chaining + + + + .. py:method:: add_asset_destroy(params: AssetDestroyParams) -> TransactionComposer + + Add an asset destruction transaction. + + :example: + >>> params = AssetDestroyParams( + ... sender="SENDER_ADDRESS", + ... asset_id=123456 + ... ... (see AssetDestroyParams for more options) + >>> composer.add_asset_destroy(params) + + :param params: The asset destruction parameters + :return: The transaction composer instance for chaining + + + + .. py:method:: add_asset_transfer(params: AssetTransferParams) -> TransactionComposer + + Add an asset transfer transaction. + + :example: + >>> params = AssetTransferParams( + ... sender="SENDER_ADDRESS", + ... asset_id=123456, + ... amount=10, + ... receiver="RECEIVER_ADDRESS", + ... clawback_target="CLAWBACK_TARGET_ADDRESS", + ... close_asset_to="CLOSE_ADDRESS" + ... ... (see AssetTransferParams for more options) + >>> composer.add_asset_transfer(params) + + :param params: The asset transfer parameters + :return: The transaction composer instance for chaining + + + + .. py:method:: add_asset_opt_in(params: AssetOptInParams) -> TransactionComposer + + Add an asset opt-in transaction. + + :example: + >>> params = AssetOptInParams( + ... sender="SENDER_ADDRESS", + ... asset_id=123456 + ... ... (see AssetOptInParams for more options) + ... ) + >>> composer.add_asset_opt_in(params) + + :param params: The asset opt-in parameters + :return: The transaction composer instance for chaining + + + + .. py:method:: add_asset_opt_out(params: AssetOptOutParams) -> TransactionComposer + + Add an asset opt-out transaction. + + :example: + >>> params = AssetOptOutParams( + ... sender="SENDER_ADDRESS", + ... asset_id=123456, + ... creator="CREATOR_ADDRESS" + ... ... (see AssetOptOutParams for more options) + >>> composer.add_asset_opt_out(params) + + :param params: The asset opt-out parameters + :return: The transaction composer instance for chaining + + + + .. py:method:: add_app_create(params: AppCreateParams) -> TransactionComposer + + Add an application creation transaction. + + :example: + >>> params = AppCreateParams( + ... sender="SENDER_ADDRESS", + ... approval_program="TEAL_APPROVAL_CODE", + ... clear_state_program="TEAL_CLEAR_CODE", + ... schema={'global_ints': 1, 'global_byte_slices': 1, 'local_ints': 1, 'local_byte_slices': 1}, + ... on_complete=OnComplete.NoOpOC, + ... args=[b'arg1'], + ... account_references=["ACCOUNT1"], + ... app_references=[789], + ... asset_references=[123], + ... box_references=[], + ... extra_program_pages=0 + ... ... (see AppCreateParams for more options) + ... ) + >>> composer.add_app_create(params) + + :param params: The application creation parameters + :return: The transaction composer instance for chaining + + + + .. py:method:: add_app_update(params: AppUpdateParams) -> TransactionComposer + + Add an application update transaction. + + :example: + >>> params = AppUpdateParams( + ... sender="SENDER_ADDRESS", + ... app_id=789, + ... approval_program="TEAL_NEW_APPROVAL_CODE", + ... clear_state_program="TEAL_NEW_CLEAR_CODE", + ... args=[b'new_arg1'], + ... account_references=["ACCOUNT1"], + ... app_references=[789], + ... asset_references=[123], + ... box_references=[], + ... on_complete=OnComplete.UpdateApplicationOC + ... ... (see AppUpdateParams for more options) + >>> composer.add_app_update(params) + + :param params: The application update parameters + :return: The transaction composer instance for chaining + + + + .. py:method:: add_app_delete(params: AppDeleteParams) -> TransactionComposer + + Add an application deletion transaction. + + :example: + >>> params = AppDeleteParams( + ... sender="SENDER_ADDRESS", + ... app_id=789, + ... args=[b'delete_arg'], + ... account_references=["ACCOUNT1"], + ... app_references=[789], + ... asset_references=[123], + ... box_references=[], + ... on_complete=OnComplete.DeleteApplicationOC + ... ... (see AppDeleteParams for more options) + >>> composer.add_app_delete(params) + + :param params: The application deletion parameters + :return: The transaction composer instance for chaining + + + + .. py:method:: add_app_call(params: AppCallParams) -> TransactionComposer + + Add an application call transaction. + + :example: + >>> params = AppCallParams( + ... sender="SENDER_ADDRESS", + ... on_complete=OnComplete.NoOpOC, + ... app_id=789, + ... approval_program="TEAL_APPROVAL_CODE", + ... clear_state_program="TEAL_CLEAR_CODE", + ... schema={'global_ints': 1, 'global_byte_slices': 1, 'local_ints': 1, 'local_byte_slices': 1}, + ... ... (see AppCallParams for more options) + ... ) + >>> composer.add_app_call(params) + + :param params: The application call parameters + :return: The transaction composer instance for chaining + + + + .. py:method:: add_app_create_method_call(params: AppCreateMethodCallParams) -> TransactionComposer + + Add an application creation method call transaction. + + :param params: The application creation method call parameters + :return: The transaction composer instance for chaining + + :example: + >>> # Basic example + >>> method = algosdk.abi.Method( + ... name="method", + ... args=[...], + ... returns="string" + ... ) + >>> composer.add_app_create_method_call( + ... AppCreateMethodCallParams( + ... sender="CREATORADDRESS", + ... approval_program="TEALCODE", + ... clear_state_program="TEALCODE", + ... method=method, + ... args=["arg1_value"] + ... ) + ... ) + >>> + >>> # Advanced example + >>> method = ABIMethod( + ... name="method", + ... args=[{"name": "arg1", "type": "string"}], + ... returns={"type": "string"} + ... ) + >>> composer.add_app_create_method_call( + ... AppCreateMethodCallParams( + ... sender="CREATORADDRESS", + ... method=method, + ... args=["arg1_value"], + ... approval_program="TEALCODE", + ... clear_state_program="TEALCODE", + ... schema={ + ... "global_ints": 1, + ... "global_byte_slices": 2, + ... "local_ints": 3, + ... "local_byte_slices": 4 + ... }, + ... extra_pages=1, + ... on_complete=OnComplete.OptInOC, + ... args=[bytes([1, 2, 3, 4])], + ... account_references=["ACCOUNT_1"], + ... app_references=[123, 1234], + ... asset_references=[12345], + ... box_references=["box1", {"app_id": 1234, "name": "box2"}], + ... lease="lease", + ... note="note", + ... first_valid_round=1000, + ... validity_window=10, + ... extra_fee=AlgoAmount.from_micro_algos(1000), + ... static_fee=AlgoAmount.from_micro_algos(1000), + ... max_fee=AlgoAmount.from_micro_algos(3000) + ... ) + ... ) + + + + .. py:method:: add_app_update_method_call(params: AppUpdateMethodCallParams) -> TransactionComposer + + Add an application update method call transaction. + + :param params: The application update method call parameters + :return: The transaction composer instance for chaining + + + + .. py:method:: add_app_delete_method_call(params: AppDeleteMethodCallParams) -> TransactionComposer + + Add an application deletion method call transaction. + + :param params: The application deletion method call parameters + :return: The transaction composer instance for chaining + + + + .. py:method:: add_app_call_method_call(params: AppCallMethodCallParams) -> TransactionComposer + + Add an application call method call transaction. + + :param params: The application call method call parameters + :return: The transaction composer instance for chaining + + + + .. py:method:: add_online_key_registration(params: OnlineKeyRegistrationParams) -> TransactionComposer + + Add an online key registration transaction. + + :param params: The online key registration parameters + :return: The transaction composer instance for chaining + + + + .. py:method:: add_offline_key_registration(params: OfflineKeyRegistrationParams) -> TransactionComposer + + Add an offline key registration transaction. + + :param params: The offline key registration parameters + :return: The transaction composer instance for chaining + + + + .. py:method:: add_atc(atc: algosdk.atomic_transaction_composer.AtomicTransactionComposer) -> TransactionComposer + + Add an existing AtomicTransactionComposer's transactions. + + :param atc: The AtomicTransactionComposer to add + :return: The transaction composer instance for chaining + + :example: + >>> atc = AtomicTransactionComposer() + >>> atc.add_transaction(TransactionWithSigner(transaction, signer)) + >>> composer.add_atc(atc) + + + + .. py:method:: count() -> int + + Get the total number of transactions. + + :return: The number of transactions + + + + .. py:method:: build() -> TransactionComposerBuildResult + + Build the transaction group. + + :return: The built transaction group result + + + + .. py:method:: rebuild() -> TransactionComposerBuildResult + + Rebuild the transaction group from scratch. + + :return: The rebuilt transaction group result + + + + .. py:method:: build_transactions() -> BuiltTransactions + + Build and return the transactions without executing them. + + :return: The built transactions result + + + + .. py:method:: execute(*, max_rounds_to_wait: int | None = None) -> SendAtomicTransactionComposerResults + + + .. py:method:: send(params: algokit_utils.models.transaction.SendParams | None = None) -> SendAtomicTransactionComposerResults + + Send the transaction group to the network. + + :param params: Parameters for the send operation + :return: The transaction send results + :raises Exception: If the transaction fails + + + + .. py:method:: simulate(allow_more_logs: bool | None = None, allow_empty_signatures: bool | None = None, allow_unnamed_resources: bool | None = None, extra_opcode_budget: int | None = None, exec_trace_config: algosdk.v2client.models.SimulateTraceConfig | None = None, simulation_round: int | None = None, skip_signatures: bool | None = None) -> SendAtomicTransactionComposerResults + + Simulate transaction group execution with configurable validation rules. + + :param allow_more_logs: Whether to allow more logs than the standard limit + :param allow_empty_signatures: Whether to allow transactions with empty signatures + :param allow_unnamed_resources: Whether to allow unnamed resources. + :param extra_opcode_budget: Additional opcode budget to allocate + :param exec_trace_config: Configuration for execution tracing + :param simulation_round: Round number to simulate at + :param skip_signatures: Whether to skip signature validation + :return: The simulation results + + :example: + >>> result = composer.simulate(extra_opcode_budget=1000, skip_signatures=True, ...) + + + + .. py:method:: arc2_note(note: algokit_utils.models.transaction.Arc2TransactionNote) -> bytes + :staticmethod: + + + Create an encoded transaction note that follows the ARC-2 spec. + + https://github.com/algorandfoundation/ARCs/blob/main/ARCs/arc-0002.md + + :param note: The ARC-2 note to encode + :return: The encoded note bytes + :raises ValueError: If the dapp_name is invalid + + + diff --git a/docs/html/_sources/autoapi/algokit_utils/transactions/transaction_creator/index.rst.txt b/docs/html/_sources/autoapi/algokit_utils/transactions/transaction_creator/index.rst.txt new file mode 100644 index 00000000..4f799016 --- /dev/null +++ b/docs/html/_sources/autoapi/algokit_utils/transactions/transaction_creator/index.rst.txt @@ -0,0 +1,685 @@ +algokit_utils.transactions.transaction_creator +============================================== + +.. py:module:: algokit_utils.transactions.transaction_creator + + +Classes +------- + +.. autoapisummary:: + + algokit_utils.transactions.transaction_creator.AlgorandClientTransactionCreator + + +Module Contents +--------------- + +.. py:class:: AlgorandClientTransactionCreator(new_group: collections.abc.Callable[[], algokit_utils.transactions.transaction_composer.TransactionComposer]) + + A creator for Algorand transactions. + + Provides methods to create various types of Algorand transactions including payments, + asset operations, application calls and key registrations. + + :param new_group: A lambda that starts a new TransactionComposer transaction group + + :example: + >>> creator = AlgorandClientTransactionCreator(lambda: TransactionComposer()) + >>> creator.payment(PaymentParams(sender="sender", receiver="receiver", amount=AlgoAmount.from_algo(1))) + + + .. py:property:: payment + :type: collections.abc.Callable[[algokit_utils.transactions.transaction_composer.PaymentParams], algosdk.transaction.Transaction] + + + Create a payment transaction to transfer Algo between accounts. + + :example: + >>> #Basic example + >>> creator = AlgorandClientTransactionCreator(lambda: TransactionComposer()) + >>> creator.payment(PaymentParams(sender="sender", receiver="receiver", amount=AlgoAmount.from_algo(4))) + :example: + >>> #Advanced example + >>> creator.payment(PaymentParams( + sender="SENDERADDRESS", + receiver="RECEIVERADDRESS", + amount=AlgoAmount.from_algo(4), + close_remainder_to="CLOSEREMAINDERTOADDRESS", + lease="lease", + note=b"note", + rekey_to="REKEYTOADDRESS", + first_valid_round=1000, + validity_window=10, + extra_fee=AlgoAmount.from_micro_algo(1000), + static_fee=AlgoAmount.from_micro_algo(1000), + max_fee=AlgoAmount.from_micro_algo(3000) + )) + + + + .. py:property:: asset_create + :type: collections.abc.Callable[[algokit_utils.transactions.transaction_composer.AssetCreateParams], algosdk.transaction.Transaction] + + + Create a create Algorand Standard Asset transaction. + + :example: + >>> #Basic example + >>> creator = AlgorandClientTransactionCreator(lambda: TransactionComposer()) + >>> params = AssetCreateParams(sender="SENDER_ADDRESS", total=1000) + >>> txn = creator.asset_create(params) + :example: + >>> #Advanced example + >>> creator.asset_create(AssetCreateParams( + sender="SENDER_ADDRESS", + total=1000, + asset_name="MyAsset", + unit_name="MA", + url="https://example.com/asset", + decimals=0, + default_frozen=False, + manager="MANAGER_ADDRESS", + reserve="RESERVE_ADDRESS", + freeze="FREEZE_ADDRESS", + clawback="CLAWBACK_ADDRESS", + lease="lease", + note=b"note", + rekey_to="REKEYTOADDRESS", + first_valid_round=1000, + validity_window=10, + extra_fee=AlgoAmount.from_micro_algo(1000), + static_fee=AlgoAmount.from_micro_algo(1000), + max_fee=AlgoAmount.from_micro_algo(3000) + )) + + + + .. py:property:: asset_config + :type: collections.abc.Callable[[algokit_utils.transactions.transaction_composer.AssetConfigParams], algosdk.transaction.Transaction] + + + Create an asset config transaction to reconfigure an existing Algorand Standard Asset. + + :example: + >>> #Basic example + >>> creator = AlgorandClientTransactionCreator(lambda: TransactionComposer()) + >>> params = AssetConfigParams(sender="SENDER_ADDRESS", asset_id=123456, manager="NEW_MANAGER_ADDRESS") + >>> txn = creator.asset_config(params) + :example: + >>> #Advanced example + >>> creator.asset_config(AssetConfigParams( + sender="SENDER_ADDRESS", + asset_id=123456, + manager="NEW_MANAGER_ADDRESS", + reserve="NEW_RESERVE_ADDRESS", + freeze="NEW_FREEZE_ADDRESS", + clawback="NEW_CLAWBACK_ADDRESS", + lease="lease", + note=b"note", + rekey_to="REKEYTOADDRESS", + first_valid_round=1000, + validity_window=10, + extra_fee=AlgoAmount.from_micro_algo(1000), + static_fee=AlgoAmount.from_micro_algo(1000), + max_fee=AlgoAmount.from_micro_algo(3000) + )) + + + + .. py:property:: asset_freeze + :type: collections.abc.Callable[[algokit_utils.transactions.transaction_composer.AssetFreezeParams], algosdk.transaction.Transaction] + + + Create an Algorand Standard Asset freeze transaction. + + :example: + >>> #Basic example + >>> creator = AlgorandClientTransactionCreator(lambda: TransactionComposer()) + >>> params = AssetFreezeParams(sender="SENDER_ADDRESS", + asset_id=123456, + account="ACCOUNT_TO_FREEZE", + frozen=True) + >>> txn = creator.asset_freeze(params) + + :example: + >>> #Advanced example + >>> creator.asset_freeze(AssetFreezeParams( + sender="SENDER_ADDRESS", + asset_id=123456, + account="ACCOUNT_TO_FREEZE", + frozen=True, + lease="lease", + note=b"note", + rekey_to="REKEYTOADDRESS", + first_valid_round=1000, + validity_window=10, + extra_fee=AlgoAmount.from_micro_algo(1000), + static_fee=AlgoAmount.from_micro_algo(1000), + max_fee=AlgoAmount.from_micro_algo(3000) + )) + + + + .. py:property:: asset_destroy + :type: collections.abc.Callable[[algokit_utils.transactions.transaction_composer.AssetDestroyParams], algosdk.transaction.Transaction] + + + Create an Algorand Standard Asset destroy transaction. + + :example: + >>> #Basic example + >>> creator = AlgorandClientTransactionCreator(lambda: TransactionComposer()) + >>> params = AssetDestroyParams(sender="SENDER_ADDRESS", asset_id=123456) + >>> txn = creator.asset_destroy(params) + + :example: + >>> #Advanced example + >>> creator.asset_destroy(AssetDestroyParams( + sender="SENDER_ADDRESS", + asset_id=123456, + lease="lease", + note=b"note", + rekey_to="REKEYTOADDRESS", + first_valid_round=1000, + validity_window=10, + extra_fee=AlgoAmount.from_micro_algo(1000), + static_fee=AlgoAmount.from_micro_algo(1000), + max_fee=AlgoAmount.from_micro_algo(3000) + )) + + + + .. py:property:: asset_transfer + :type: collections.abc.Callable[[algokit_utils.transactions.transaction_composer.AssetTransferParams], algosdk.transaction.Transaction] + + + Create an Algorand Standard Asset transfer transaction. + + :example: + >>> #Basic example + >>> creator = AlgorandClientTransactionCreator(lambda: TransactionComposer()) + >>> params = AssetTransferParams(sender="SENDER_ADDRESS", + asset_id=123456, + amount=10, + receiver="RECEIVER_ADDRESS") + >>> txn = creator.asset_transfer(params) + + :example: + >>> #Advanced example + >>> creator.asset_transfer(AssetTransferParams( + sender="SENDER_ADDRESS", + asset_id=123456, + amount=10, + receiver="RECEIVER_ADDRESS", + clawback_target="CLAWBACK_TARGET_ADDRESS", + close_asset_to="CLOSE_ASSET_TO_ADDRESS", + lease="lease", + note=b"note", + rekey_to="REKEYTOADDRESS", + first_valid_round=1000, + validity_window=10, + extra_fee=AlgoAmount.from_micro_algo(1000), + static_fee=AlgoAmount.from_micro_algo(1000), + max_fee=AlgoAmount.from_micro_algo(3000) + )) + + + + .. py:property:: asset_opt_in + :type: collections.abc.Callable[[algokit_utils.transactions.transaction_composer.AssetOptInParams], algosdk.transaction.Transaction] + + + Create an Algorand Standard Asset opt-in transaction. + + :example: + >>> # Basic example + >>> creator = AlgorandClientTransactionCreator(lambda: TransactionComposer()) + >>> params = AssetOptInParams(sender="SENDER_ADDRESS", asset_id=123456) + >>> txn = creator.asset_opt_in(params) + + :example: + >>> # Advanced example + >>> creator.asset_opt_in(AssetOptInParams( + sender="SENDER_ADDRESS", + asset_id=123456, + lease="lease", + note=b"note", + rekey_to="REKEYTOADDRESS", + first_valid_round=1000, + validity_window=10, + extra_fee=AlgoAmount.from_micro_algo(1000), + static_fee=AlgoAmount.from_micro_algo(1000), + max_fee=AlgoAmount.from_micro_algo(3000) + )) + + + + .. py:property:: asset_opt_out + :type: collections.abc.Callable[[algokit_utils.transactions.transaction_composer.AssetOptOutParams], algosdk.transaction.Transaction] + + + Create an asset opt-out transaction. + + :example: + >>> #Basic example + >>> creator = AlgorandClientTransactionCreator(lambda: TransactionComposer()) + >>> params = AssetOptOutParams(sender="SENDER_ADDRESS", asset_id=123456, creator="CREATOR_ADDRESS") + >>> txn = creator.asset_opt_out(params) + + :example: + >>> #Advanced example + >>> creator.asset_opt_out(AssetOptOutParams( + sender="SENDER_ADDRESS", + asset_id=123456, + creator="CREATOR_ADDRESS", + lease="lease", + note=b"note", + rekey_to="REKEYTOADDRESS", + first_valid_round=1000, + validity_window=10, + extra_fee=AlgoAmount.from_micro_algo(1000), + static_fee=AlgoAmount.from_micro_algo(1000), + max_fee=AlgoAmount.from_micro_algo(3000) + )) + + + + .. py:property:: app_create + :type: collections.abc.Callable[[algokit_utils.transactions.transaction_composer.AppCreateParams], algosdk.transaction.Transaction] + + + Create an application create transaction. + + :example: + >>> #Basic example + >>> creator = AlgorandClientTransactionCreator(lambda: TransactionComposer()) + >>> params = AppCreateParams( + ... sender="SENDER_ADDRESS", + ... approval_program="TEAL_APPROVAL_CODE", + ... clear_state_program="TEAL_CLEAR_CODE", + ... schema={ + ... 'global_ints': 1, + ... 'global_byte_slices': 1, + ... 'local_ints': 1, + ... 'local_byte_slices': 1 + ... } + ... ) + >>> txn = creator.app_create(params) + + :example: + >>> #Advanced example + >>> creator.app_create(AppCreateParams( + sender="SENDER_ADDRESS", + approval_program="TEAL_APPROVAL_CODE", + clear_state_program="TEAL_CLEAR_CODE", + schema={'global_ints': 1, 'global_byte_slices': 1, 'local_ints': 1, 'local_byte_slices': 1}, + on_complete=OnComplete.NoOpOC, + args=[b'arg1', b'arg2'], + account_references=["ACCOUNT1"], + app_references=[789], + asset_references=[123], + box_references=[], + extra_program_pages=0, + lease="lease", + note=b"note", + rekey_to="REKEYTOADDRESS", + first_valid_round=1000, + validity_window=10, + extra_fee=AlgoAmount.from_micro_algo(1000), + static_fee=AlgoAmount.from_micro_algo(1000), + max_fee=AlgoAmount.from_micro_algo(3000) + )) + + + + .. py:property:: app_update + :type: collections.abc.Callable[[algokit_utils.transactions.transaction_composer.AppUpdateParams], algosdk.transaction.Transaction] + + + Create an application update transaction. + + :example: + >>> #Basic example + >>> creator = AlgorandClientTransactionCreator(lambda: TransactionComposer()) + >>> txn = creator.app_update(AppUpdateParams(sender="SENDER_ADDRESS", + app_id=789, + approval_program="TEAL_NEW_APPROVAL_CODE", + clear_state_program="TEAL_NEW_CLEAR_CODE", + args=[b'new_arg1', b'new_arg2'])) + + :example: + >>> #Advanced example + >>> creator.app_update(AppUpdateParams( + sender="SENDER_ADDRESS", + app_id=789, + approval_program="TEAL_NEW_APPROVAL_CODE", + clear_state_program="TEAL_NEW_CLEAR_CODE", + args=[b'new_arg1', b'new_arg2'], + account_references=["ACCOUNT1"], + app_references=[789], + asset_references=[123], + box_references=[], + on_complete=OnComplete.UpdateApplicationOC, + lease="lease", + note=b"note", + rekey_to="REKEYTOADDRESS", + first_valid_round=1000, + validity_window=10, + extra_fee=AlgoAmount.from_micro_algo(1000), + static_fee=AlgoAmount.from_micro_algo(1000), + max_fee=AlgoAmount.from_micro_algo(3000) + )) + + + + .. py:property:: app_delete + :type: collections.abc.Callable[[algokit_utils.transactions.transaction_composer.AppDeleteParams], algosdk.transaction.Transaction] + + + Create an application delete transaction. + + :example: + >>> #Basic example + >>> creator = AlgorandClientTransactionCreator(lambda: TransactionComposer()) + >>> params = AppDeleteParams(sender="SENDER_ADDRESS", app_id=789, args=[b'delete_arg']) + >>> txn = creator.app_delete(params) + + :example: + >>> #Advanced example + >>> creator.app_delete(AppDeleteParams( + sender="SENDER_ADDRESS", + app_id=789, + args=[b'delete_arg'], + account_references=["ACCOUNT1"], + app_references=[789], + asset_references=[123], + box_references=[], + on_complete=OnComplete.DeleteApplicationOC, + lease="lease", + note=b"note", + rekey_to="REKEYTOADDRESS", + first_valid_round=1000, + validity_window=10, + extra_fee=AlgoAmount.from_micro_algo(1000), + static_fee=AlgoAmount.from_micro_algo(1000), + max_fee=AlgoAmount.from_micro_algo(3000) + )) + + + + .. py:property:: app_call + :type: collections.abc.Callable[[algokit_utils.transactions.transaction_composer.AppCallParams], algosdk.transaction.Transaction] + + + Create an application call transaction. + + :example: + >>> #Basic example + >>> creator = AlgorandClientTransactionCreator(lambda: TransactionComposer()) + >>> params = AppCallParams( + ... sender="SENDER_ADDRESS", + ... on_complete=OnComplete.NoOpOC, + ... app_id=789, + ... approval_program="TEAL_APPROVAL_CODE", + ... clear_state_program="TEAL_CLEAR_CODE", + ... schema={ + ... 'global_ints': 1, + ... 'global_byte_slices': 1, + ... 'local_ints': 1, + ... 'local_byte_slices': 1 + ... }, + ... args=[b'arg1', b'arg2'], + ... account_references=["ACCOUNT1"], + ... app_references=[789], + ... asset_references=[123], + ... extra_pages=0, + ... box_references=[] + ... ) + >>> txn = creator.app_call(params) + + :example: + >>> #Advanced example + >>> creator.app_call(AppCallParams( + sender="SENDER_ADDRESS", + on_complete=OnComplete.NoOpOC, + app_id=789, + approval_program="TEAL_APPROVAL_CODE", + clear_state_program="TEAL_CLEAR_CODE", + schema={'global_ints': 1, 'global_byte_slices': 1, 'local_ints': 1, 'local_byte_slices': 1}, + args=[b'arg1', b'arg2'], + account_references=["ACCOUNT1"], + app_references=[789], + asset_references=[123], + extra_pages=0, + box_references=[], + lease="lease", + note=b"note", + rekey_to="REKEYTOADDRESS", + first_valid_round=1000, + validity_window=10, + extra_fee=AlgoAmount.from_micro_algo(1000), + static_fee=AlgoAmount.from_micro_algo(1000), + max_fee=AlgoAmount.from_micro_algo(3000) + )) + + + + .. py:property:: app_create_method_call + :type: collections.abc.Callable[[algokit_utils.transactions.transaction_composer.AppCreateMethodCallParams], algokit_utils.transactions.transaction_composer.BuiltTransactions] + + + Create an application create call with ABI method call transaction. + + :example: + >>> #Basic example + >>> creator = AlgorandClientTransactionCreator(lambda: TransactionComposer()) + >>> params = AppCreateMethodCallParams(sender="SENDER_ADDRESS", app_id=0, method=some_abi_method_object) + >>> built_txns = creator.app_create_method_call(params) + + :example: + >>> #Advanced example + >>> creator.app_create_method_call(AppCreateMethodCallParams( + sender="SENDER_ADDRESS", + app_id=0, + method=some_abi_method_object, + args=[b'method_arg'], + account_references=["ACCOUNT1"], + app_references=[789], + asset_references=[123], + box_references=[], + schema={'global_ints': 1, 'global_byte_slices': 1, 'local_ints': 1, 'local_byte_slices': 1}, + approval_program="TEAL_APPROVAL_CODE", + clear_state_program="TEAL_CLEAR_CODE", + on_complete=OnComplete.NoOpOC, + extra_program_pages=0, + lease="lease", + note=b"note", + rekey_to="REKEYTOADDRESS", + first_valid_round=1000, + validity_window=10, + extra_fee=AlgoAmount.from_micro_algo(1000), + static_fee=AlgoAmount.from_micro_algo(1000), + max_fee=AlgoAmount.from_micro_algo(3000) + )) + + + + .. py:property:: app_update_method_call + :type: collections.abc.Callable[[algokit_utils.transactions.transaction_composer.AppUpdateMethodCallParams], algokit_utils.transactions.transaction_composer.BuiltTransactions] + + + Create an application update call with ABI method call transaction. + + :example: + >>> #Basic example + >>> creator = AlgorandClientTransactionCreator(lambda: TransactionComposer()) + >>> params = AppUpdateMethodCallParams(sender="SENDER_ADDRESS", app_id=789, method=some_abi_method_object) + >>> built_txns = creator.app_update_method_call(params) + + :example: + >>> #Advanced example + >>> creator.app_update_method_call(AppUpdateMethodCallParams( + sender="SENDER_ADDRESS", + app_id=789, + method=some_abi_method_object, + args=[b'method_arg'], + account_references=["ACCOUNT1"], + app_references=[789], + asset_references=[123], + box_references=[], + schema={'global_ints': 1, 'global_byte_slices': 1, 'local_ints': 1, 'local_byte_slices': 1}, + approval_program="TEAL_NEW_APPROVAL_CODE", + clear_state_program="TEAL_NEW_CLEAR_CODE", + on_complete=OnComplete.UpdateApplicationOC, + lease="lease", + note=b"note", + rekey_to="REKEYTOADDRESS", + first_valid_round=1000, + validity_window=10, + extra_fee=AlgoAmount.from_micro_algo(1000), + static_fee=AlgoAmount.from_micro_algo(1000), + max_fee=AlgoAmount.from_micro_algo(3000) + )) + + + + .. py:property:: app_delete_method_call + :type: collections.abc.Callable[[algokit_utils.transactions.transaction_composer.AppDeleteMethodCallParams], algokit_utils.transactions.transaction_composer.BuiltTransactions] + + + Create an application delete call with ABI method call transaction. + + :example: + >>> #Basic example + >>> creator = AlgorandClientTransactionCreator(lambda: TransactionComposer()) + >>> params = AppDeleteMethodCallParams(sender="SENDER_ADDRESS", app_id=789, method=some_abi_method_object) + >>> built_txns = creator.app_delete_method_call(params) + + :example: + >>> #Advanced example + >>> creator.app_delete_method_call(AppDeleteMethodCallParams( + sender="SENDER_ADDRESS", + app_id=789, + method=some_abi_method_object, + args=[b'method_arg'], + account_references=["ACCOUNT1"], + app_references=[789], + asset_references=[123], + box_references=[], + lease="lease", + note=b"note", + rekey_to="REKEYTOADDRESS", + first_valid_round=1000, + validity_window=10, + extra_fee=AlgoAmount.from_micro_algo(1000), + static_fee=AlgoAmount.from_micro_algo(1000), + max_fee=AlgoAmount.from_micro_algo(3000) + )) + + + + .. py:property:: app_call_method_call + :type: collections.abc.Callable[[algokit_utils.transactions.transaction_composer.AppCallMethodCallParams], algokit_utils.transactions.transaction_composer.BuiltTransactions] + + + Create an application call with ABI method call transaction. + + :example: + >>> #Basic example + >>> creator = AlgorandClientTransactionCreator(lambda: TransactionComposer()) + >>> params = AppCallMethodCallParams(sender="SENDER_ADDRESS", app_id=789, method=some_abi_method_object) + >>> built_txns = creator.app_call_method_call(params) + :example: Advanced example + >>> creator.app_call_method_call(AppCallMethodCallParams( + sender="SENDER_ADDRESS", + app_id=789, + method=some_abi_method_object, + args=[b'method_arg'], + account_references=["ACCOUNT1"], + app_references=[789], + asset_references=[123], + box_references=[], + lease="lease", + note=b"note", + rekey_to="REKEYTOADDRESS", + first_valid_round=1000, + validity_window=10, + extra_fee=AlgoAmount.from_micro_algo(1000), + static_fee=AlgoAmount.from_micro_algo(1000), + max_fee=AlgoAmount.from_micro_algo(3000) + )) + + + + .. py:property:: online_key_registration + :type: collections.abc.Callable[[algokit_utils.transactions.transaction_composer.OnlineKeyRegistrationParams], algosdk.transaction.Transaction] + + + Create an online key registration transaction. + + :example: + >>> #Basic example + >>> creator = AlgorandClientTransactionCreator(lambda: TransactionComposer()) + >>> params = OnlineKeyRegistrationParams( + sender="SENDER_ADDRESS", + vote_key="VOTE_KEY", + selection_key="SELECTION_KEY", + vote_first=1000, + vote_last=2000, + vote_key_dilution=10, + state_proof_key=b"state_proof_key_bytes" + ) + >>> txn = creator.online_key_registration(params) + + :example: + >>> #Advanced example + >>> creator.online_key_registration(OnlineKeyRegistrationParams( + sender="SENDER_ADDRESS", + vote_key="VOTE_KEY", + selection_key="SELECTION_KEY", + vote_first=1000, + vote_last=2000, + vote_key_dilution=10, + state_proof_key=b"state_proof_key_bytes", + lease="lease", + note=b"note", + rekey_to="REKEYTOADDRESS", + first_valid_round=1000, + validity_window=10, + extra_fee=AlgoAmount.from_micro_algo(1000), + static_fee=AlgoAmount.from_micro_algo(1000), + max_fee=AlgoAmount.from_micro_algo(3000) + )) + + + + .. py:property:: offline_key_registration + :type: collections.abc.Callable[[algokit_utils.transactions.transaction_composer.OfflineKeyRegistrationParams], algosdk.transaction.Transaction] + + + Create an offline key registration transaction. + + :example: + >>> #Basic example + >>> creator = AlgorandClientTransactionCreator(lambda: TransactionComposer()) + >>> txn = creator.offline_key_registration(OfflineKeyRegistrationParams(sender="SENDER_ADDRESS", + prevent_account_from_ever_participating_again=True)) + + :example: + >>> #Advanced example + >>> creator.offline_key_registration(OfflineKeyRegistrationParams( + sender="SENDER_ADDRESS", + prevent_account_from_ever_participating_again=True, + lease="lease", + note=b"note", + rekey_to="REKEYTOADDRESS", + first_valid_round=1000, + validity_window=10, + extra_fee=AlgoAmount.from_micro_algo(1000), + static_fee=AlgoAmount.from_micro_algo(1000), + max_fee=AlgoAmount.from_micro_algo(3000) + )) + + + diff --git a/docs/html/_sources/autoapi/algokit_utils/transactions/transaction_sender/index.rst.txt b/docs/html/_sources/autoapi/algokit_utils/transactions/transaction_sender/index.rst.txt new file mode 100644 index 00000000..2133f700 --- /dev/null +++ b/docs/html/_sources/autoapi/algokit_utils/transactions/transaction_sender/index.rst.txt @@ -0,0 +1,1004 @@ +algokit_utils.transactions.transaction_sender +============================================= + +.. py:module:: algokit_utils.transactions.transaction_sender + + +Classes +------- + +.. autoapisummary:: + + algokit_utils.transactions.transaction_sender.SendSingleTransactionResult + algokit_utils.transactions.transaction_sender.SendSingleAssetCreateTransactionResult + algokit_utils.transactions.transaction_sender.SendAppTransactionResult + algokit_utils.transactions.transaction_sender.SendAppUpdateTransactionResult + algokit_utils.transactions.transaction_sender.SendAppCreateTransactionResult + algokit_utils.transactions.transaction_sender.AlgorandClientTransactionSender + + +Module Contents +--------------- + +.. py:class:: SendSingleTransactionResult + + Base class for transaction results. + + Represents the result of sending a single transaction. + + + .. py:attribute:: transaction + :type: algokit_utils.models.transaction.TransactionWrapper + + The last transaction + + + + .. py:attribute:: confirmation + :type: algosdk.v2client.algod.AlgodResponseType + + The last confirmation + + + + .. py:attribute:: group_id + :type: str + + The group ID + + + + .. py:attribute:: tx_id + :type: str | None + :value: None + + + The transaction ID + + + + .. py:attribute:: tx_ids + :type: list[str] + + The full array of transaction IDs + + + + .. py:attribute:: transactions + :type: list[algokit_utils.models.transaction.TransactionWrapper] + + The full array of transactions + + + + .. py:attribute:: confirmations + :type: list[algosdk.v2client.algod.AlgodResponseType] + + The full array of confirmations + + + + .. py:attribute:: returns + :type: list[algokit_utils.applications.abi.ABIReturn] | None + :value: None + + + The ABI return value if applicable + + + + .. py:method:: from_composer_result(result: algokit_utils.transactions.transaction_composer.SendAtomicTransactionComposerResults, index: int = -1) -> typing_extensions.Self + :classmethod: + + + +.. py:class:: SendSingleAssetCreateTransactionResult + + Bases: :py:obj:`SendSingleTransactionResult` + + + Result of creating a new ASA (Algorand Standard Asset). + + Contains the asset ID of the newly created asset. + + + .. py:attribute:: asset_id + :type: int + + The ID of the newly created asset + + + +.. py:class:: SendAppTransactionResult + + Bases: :py:obj:`SendSingleTransactionResult`, :py:obj:`Generic`\ [\ :py:obj:`ABIReturnT`\ ] + + + Result of an application transaction. + + Contains the ABI return value if applicable. + + + .. py:attribute:: abi_return + :type: ABIReturnT | None + :value: None + + + The ABI return value if applicable + + + +.. py:class:: SendAppUpdateTransactionResult + + Bases: :py:obj:`SendAppTransactionResult`\ [\ :py:obj:`ABIReturnT`\ ] + + + Result of updating an application. + + Contains the compiled approval and clear programs. + + + .. py:attribute:: compiled_approval + :type: Any | None + :value: None + + + The compiled approval program + + + + .. py:attribute:: compiled_clear + :type: Any | None + :value: None + + + The compiled clear state program + + + +.. py:class:: SendAppCreateTransactionResult + + Bases: :py:obj:`SendAppUpdateTransactionResult`\ [\ :py:obj:`ABIReturnT`\ ] + + + Result of creating a new application. + + Contains the app ID and address of the newly created application. + + + .. py:attribute:: app_id + :type: int + + The ID of the newly created application + + + + .. py:attribute:: app_address + :type: str + + The address of the newly created application + + + +.. py:class:: AlgorandClientTransactionSender(new_group: collections.abc.Callable[[], algokit_utils.transactions.transaction_composer.TransactionComposer], asset_manager: algokit_utils.assets.asset_manager.AssetManager, app_manager: algokit_utils.applications.app_manager.AppManager, algod_client: algosdk.v2client.algod.AlgodClient) + + Orchestrates sending transactions for AlgorandClient. + + Provides methods to send various types of transactions including payments, + asset operations, and application calls. + + + .. py:method:: new_group() -> algokit_utils.transactions.transaction_composer.TransactionComposer + + Create a new transaction group. + + :return: A new TransactionComposer instance + + :example: + >>> sender = AlgorandClientTransactionSender(new_group, asset_manager, app_manager, algod_client) + >>> composer = sender.new_group() + >>> composer(PaymentParams(sender="sender", receiver="receiver", amount=AlgoAmount(algo=1))) + >>> composer.send() + + + + .. py:method:: payment(params: algokit_utils.transactions.transaction_composer.PaymentParams, send_params: algokit_utils.models.transaction.SendParams | None = None) -> SendSingleTransactionResult + + Send a payment transaction to transfer Algo between accounts. + + :param params: Payment transaction parameters + :param send_params: Send parameters + :return: Result of the payment transaction + + :example: + >>> result = algorand.send.payment(PaymentParams( + >>> sender="SENDERADDRESS", + >>> receiver="RECEIVERADDRESS", + >>> amount=AlgoAmount(algo=4), + >>> )) + + >>> # Advanced example + >>> result = algorand.send.payment(PaymentParams( + >>> amount=AlgoAmount(algo=4), + >>> receiver="RECEIVERADDRESS", + >>> sender="SENDERADDRESS", + >>> close_remainder_to="CLOSEREMAINDERTOADDRESS", + >>> lease="lease", + >>> note="note", + >>> rekey_to="REKEYTOADDRESS", + >>> first_valid_round=1000, + >>> validity_window=10, + >>> extra_fee=AlgoAmount(micro_algo=1000), + >>> static_fee=AlgoAmount(micro_algo=1000), + >>> max_fee=AlgoAmount(micro_algo=3000), + >>> signer=transactionSigner + >>> ), send_params=SendParams( + >>> max_rounds_to_wait_for_confirmation=5, + >>> suppress_log=True, + >>> )) + + + + .. py:method:: asset_create(params: algokit_utils.transactions.transaction_composer.AssetCreateParams, send_params: algokit_utils.models.transaction.SendParams | None = None) -> SendSingleAssetCreateTransactionResult + + Create a new Algorand Standard Asset. + + :param params: Asset creation parameters + :param send_params: Send parameters + :return: Result containing the new asset ID + + :example: + >>> result = algorand.send.asset_create(AssetCreateParams( + >>> sender="SENDERADDRESS", + >>> asset_name="ASSETNAME", + >>> unit_name="UNITNAME", + >>> total=1000, + >>> )) + + >>> # Advanced example + >>> result = algorand.send.asset_create(AssetCreateParams( + >>> sender="CREATORADDRESS", + >>> total=100, + >>> decimals=2, + >>> asset_name="asset", + >>> unit_name="unit", + >>> url="url", + >>> metadata_hash="metadataHash", + >>> default_frozen=False, + >>> manager="MANAGERADDRESS", + >>> reserve="RESERVEADDRESS", + >>> freeze="FREEZEADDRESS", + >>> clawback="CLAWBACKADDRESS", + >>> lease="lease", + >>> note="note", + >>> # You wouldn't normally set this field + >>> first_valid_round=1000, + >>> validity_window=10, + >>> extra_fee=AlgoAmount(micro_algo=1000), + >>> static_fee=AlgoAmount(micro_algo=1000), + >>> # Max fee doesn't make sense with extraFee AND staticFee + >>> # already specified, but here for completeness + >>> max_fee=AlgoAmount(micro_algo=3000), + >>> # Signer only needed if you want to provide one, + >>> # generally you'd register it with AlgorandClient + >>> # against the sender and not need to pass it in + >>> signer=transactionSigner + >>> ), send_params=SendParams( + >>> max_rounds_to_wait_for_confirmation=5, + >>> suppress_log=True, + >>> )) + + + + .. py:method:: asset_config(params: algokit_utils.transactions.transaction_composer.AssetConfigParams, send_params: algokit_utils.models.transaction.SendParams | None = None) -> SendSingleTransactionResult + + Configure an existing Algorand Standard Asset. + + :param params: Asset configuration parameters + :param send_params: Send parameters + :return: Result of the configuration transaction + + :example: + >>> result = algorand.send.asset_config(AssetConfigParams( + >>> sender="MANAGERADDRESS", + >>> asset_id=123456, + >>> manager="MANAGERADDRESS", + >>> reserve="RESERVEADDRESS", + >>> freeze="FREEZEADDRESS", + >>> clawback="CLAWBACKADDRESS", + >>> lease="lease", + >>> note="note", + >>> # You wouldn't normally set this field + >>> first_valid_round=1000, + >>> validity_window=10, + >>> extra_fee=AlgoAmount(micro_algo=1000), + >>> static_fee=AlgoAmount(micro_algo=1000), + >>> # Max fee doesn't make sense with extraFee AND staticFee + >>> # already specified, but here for completeness + >>> max_fee=AlgoAmount(micro_algo=3000), + >>> # Signer only needed if you want to provide one, + >>> # generally you'd register it with AlgorandClient + >>> # against the sender and not need to pass it in + >>> signer=transactionSigner + >>> ), send_params=SendParams( + >>> max_rounds_to_wait_for_confirmation=5, + >>> suppress_log=True, + >>> )) + + + + .. py:method:: asset_freeze(params: algokit_utils.transactions.transaction_composer.AssetFreezeParams, send_params: algokit_utils.models.transaction.SendParams | None = None) -> SendSingleTransactionResult + + Freeze or unfreeze an Algorand Standard Asset for an account. + + :param params: Asset freeze parameters + :param send_params: Send parameters + :return: Result of the freeze transaction + + :example: + >>> result = algorand.send.asset_freeze(AssetFreezeParams( + >>> sender="MANAGERADDRESS", + >>> asset_id=123456, + >>> account="ACCOUNTADDRESS", + >>> frozen=True, + >>> )) + + >>> # Advanced example + >>> result = algorand.send.asset_freeze(AssetFreezeParams( + >>> sender="MANAGERADDRESS", + >>> asset_id=123456, + >>> account="ACCOUNTADDRESS", + >>> frozen=True, + >>> lease="lease", + >>> note="note", + >>> # You wouldn't normally set this field + >>> first_valid_round=1000, + >>> validity_window=10, + >>> extra_fee=AlgoAmount(micro_algo=1000), + >>> static_fee=AlgoAmount(micro_algo=1000), + >>> # Max fee doesn't make sense with extraFee AND staticFee + >>> # already specified, but here for completeness + >>> max_fee=AlgoAmount(micro_algo=3000), + >>> # Signer only needed if you want to provide one, + >>> # generally you'd register it with AlgorandClient + >>> # against the sender and not need to pass it in + >>> signer=transactionSigner + >>> ), send_params=SendParams( + >>> max_rounds_to_wait_for_confirmation=5, + >>> suppress_log=True, + >>> )) + + + + .. py:method:: asset_destroy(params: algokit_utils.transactions.transaction_composer.AssetDestroyParams, send_params: algokit_utils.models.transaction.SendParams | None = None) -> SendSingleTransactionResult + + Destroys an Algorand Standard Asset. + + :param params: Asset destruction parameters + :param send_params: Send parameters + :return: Result of the destroy transaction + + :example: + >>> result = algorand.send.asset_destroy(AssetDestroyParams( + >>> sender="MANAGERADDRESS", + >>> asset_id=123456, + >>> )) + + >>> # Advanced example + >>> result = algorand.send.asset_destroy(AssetDestroyParams( + >>> sender="MANAGERADDRESS", + >>> asset_id=123456, + >>> lease="lease", + >>> note="note", + >>> # You wouldn't normally set this field + >>> first_valid_round=1000, + >>> validity_window=10, + >>> extra_fee=AlgoAmount(micro_algo=1000), + >>> static_fee=AlgoAmount(micro_algo=1000), + >>> # Max fee doesn't make sense with extraFee AND staticFee + >>> # already specified, but here for completeness + >>> max_fee=AlgoAmount(micro_algo=3000), + >>> # Signer only needed if you want to provide one, + >>> # generally you'd register it with AlgorandClient + >>> # against the sender and not need to pass it in + >>> signer=transactionSigner + >>> ), send_params=SendParams( + >>> max_rounds_to_wait_for_confirmation=5, + >>> suppress_log=True, + >>> )) + + + + .. py:method:: asset_transfer(params: algokit_utils.transactions.transaction_composer.AssetTransferParams, send_params: algokit_utils.models.transaction.SendParams | None = None) -> SendSingleTransactionResult + + Transfer an Algorand Standard Asset. + + :param params: Asset transfer parameters + :param send_params: Send parameters + :return: Result of the transfer transaction + + :example: + >>> result = algorand.send.asset_transfer(AssetTransferParams( + >>> sender="HOLDERADDRESS", + >>> asset_id=123456, + >>> amount=1, + >>> receiver="RECEIVERADDRESS", + >>> )) + + >>> # Advanced example (with clawback) + >>> result = algorand.send.asset_transfer(AssetTransferParams( + >>> sender="CLAWBACKADDRESS", + >>> asset_id=123456, + >>> amount=1, + >>> receiver="RECEIVERADDRESS", + >>> clawback_target="HOLDERADDRESS", + >>> # This field needs to be used with caution + >>> close_asset_to="ADDRESSTOCLOSETO", + >>> lease="lease", + >>> note="note", + >>> # You wouldn't normally set this field + >>> first_valid_round=1000, + >>> validity_window=10, + >>> extra_fee=AlgoAmount(micro_algo=1000), + >>> static_fee=AlgoAmount(micro_algo=1000), + >>> # Max fee doesn't make sense with extraFee AND staticFee + >>> # already specified, but here for completeness + >>> max_fee=AlgoAmount(micro_algo=3000), + >>> # Signer only needed if you want to provide one, + >>> # generally you'd register it with AlgorandClient + >>> # against the sender and not need to pass it in + >>> signer=transactionSigner + >>> ), send_params=SendParams( + >>> max_rounds_to_wait_for_confirmation=5, + >>> suppress_log=True, + >>> )) + + + + .. py:method:: asset_opt_in(params: algokit_utils.transactions.transaction_composer.AssetOptInParams, send_params: algokit_utils.models.transaction.SendParams | None = None) -> SendSingleTransactionResult + + Opt an account into an Algorand Standard Asset. + + :param params: Asset opt-in parameters + :param send_params: Send parameters + :return: Result of the opt-in transaction + + :example: + >>> result = algorand.send.asset_opt_in(AssetOptInParams( + >>> sender="SENDERADDRESS", + >>> asset_id=123456, + >>> )) + + >>> # Advanced example + >>> result = algorand.send.asset_opt_in(AssetOptInParams( + >>> sender="SENDERADDRESS", + >>> asset_id=123456, + >>> lease="lease", + >>> note="note", + >>> # You wouldn't normally set this field + >>> first_valid_round=1000, + >>> validity_window=10, + >>> extra_fee=AlgoAmount(micro_algo=1000), + >>> static_fee=AlgoAmount(micro_algo=1000), + >>> # Max fee doesn't make sense with extraFee AND staticFee + >>> # already specified, but here for completeness + >>> max_fee=AlgoAmount(micro_algo=3000), + >>> # Signer only needed if you want to provide one, + >>> # generally you'd register it with AlgorandClient + >>> # against the sender and not need to pass it in + >>> signer=transactionSigner + >>> ), send_params=SendParams( + >>> max_rounds_to_wait_for_confirmation=5, + >>> suppress_log=True, + >>> )) + + + + .. py:method:: asset_opt_out(*, params: algokit_utils.transactions.transaction_composer.AssetOptOutParams, send_params: algokit_utils.models.transaction.SendParams | None = None, ensure_zero_balance: bool = True) -> SendSingleTransactionResult + + Opt an account out of an Algorand Standard Asset. + + :param params: Asset opt-out parameters + :param send_params: Send parameters + :param ensure_zero_balance: Check if account has zero balance before opt-out, defaults to True + :raises ValueError: If account has non-zero balance or is not opted in + :return: Result of the opt-out transaction + + :example: + >>> result = algorand.send.asset_opt_out(AssetOptOutParams( + >>> sender="SENDERADDRESS", + >>> creator="CREATORADDRESS", + >>> asset_id=123456, + >>> ensure_zero_balance=True, + >>> )) + + >>> # Advanced example + >>> result = algorand.send.asset_opt_out(AssetOptOutParams( + >>> sender="SENDERADDRESS", + >>> asset_id=123456, + >>> creator="CREATORADDRESS", + >>> ensure_zero_balance=True, + >>> lease="lease", + >>> note="note", + >>> # You wouldn't normally set this field + >>> first_valid_round=1000, + >>> validity_window=10, + >>> extra_fee=AlgoAmount(micro_algo=1000), + >>> static_fee=AlgoAmount(micro_algo=1000), + >>> # Max fee doesn't make sense with extraFee AND staticFee + >>> # already specified, but here for completeness + >>> max_fee=AlgoAmount(micro_algo=3000), + >>> # Signer only needed if you want to provide one, + >>> # generally you'd register it with AlgorandClient + >>> # against the sender and not need to pass it in + >>> signer=transactionSigner + >>> ), send_params=SendParams( + >>> max_rounds_to_wait_for_confirmation=5, + >>> suppress_log=True, + >>> )) + + + + .. py:method:: app_create(params: algokit_utils.transactions.transaction_composer.AppCreateParams, send_params: algokit_utils.models.transaction.SendParams | None = None) -> SendAppCreateTransactionResult[algokit_utils.applications.abi.ABIReturn] + + Create a new application. + + :param params: Application creation parameters + :param send_params: Send parameters + :return: Result containing the new application ID and address + + :example: + >>> result = algorand.send.app_create(AppCreateParams( + >>> sender="CREATORADDRESS", + >>> approval_program="TEALCODE", + >>> clear_state_program="TEALCODE", + >>> )) + + >>> # Advanced example + >>> result = algorand.send.app_create(AppCreateParams( + >>> sender="CREATORADDRESS", + >>> approval_program="TEALCODE", + >>> clear_state_program="TEALCODE", + >>> )) + >>> # algorand.send.appCreate(AppCreateParams( + >>> # sender='CREATORADDRESS', + >>> # approval_program="TEALCODE", + >>> # clear_state_program="TEALCODE", + >>> # schema={ + >>> # "global_ints": 1, + >>> # "global_byte_slices": 2, + >>> # "local_ints": 3, + >>> # "local_byte_slices": 4 + >>> # }, + >>> # extra_program_pages: 1, + >>> # on_complete: algosdk.transaction.OnComplete.OptInOC, + >>> # args: [b'some_bytes'] + >>> # account_references: ["ACCOUNT_1"] + >>> # app_references: [123, 1234] + >>> # asset_references: [12345] + >>> # box_references: ["box1", {app_id: 1234, name: "box2"}] + >>> # lease: 'lease', + >>> # note: 'note', + >>> # # You wouldn't normally set this field + >>> # first_valid_round: 1000, + >>> # validity_window: 10, + >>> # extra_fee: AlgoAmount(micro_algo=1000), + >>> # static_fee: AlgoAmount(micro_algo=1000), + >>> # # Max fee doesn't make sense with extraFee AND staticFee + >>> # # already specified, but here for completeness + >>> # max_fee: AlgoAmount(micro_algo=3000), + >>> # # Signer only needed if you want to provide one, + >>> # # generally you'd register it with AlgorandClient + >>> # # against the sender and not need to pass it in + >>> # signer: transactionSigner + >>> #}, send_params=SendParams( + >>> # max_rounds_to_wait_for_confirmation=5, + >>> # suppress_log=True, + >>> #)) + + + + .. py:method:: app_update(params: algokit_utils.transactions.transaction_composer.AppUpdateParams, send_params: algokit_utils.models.transaction.SendParams | None = None) -> SendAppUpdateTransactionResult[algokit_utils.applications.abi.ABIReturn] + + Update an application. + + :param params: Application update parameters + :param send_params: Send parameters + :return: Result containing the compiled programs + + :example: + >>> # Basic example + >>> algorand.send.app_update(AppUpdateParams( + >>> sender="CREATORADDRESS", + >>> approval_program="TEALCODE", + >>> clear_state_program="TEALCODE", + >>> )) + >>> # Advanced example + >>> algorand.send.app_update(AppUpdateParams( + >>> sender="CREATORADDRESS", + >>> approval_program="TEALCODE", + >>> clear_state_program="TEALCODE", + >>> on_complete=OnComplete.UpdateApplicationOC, + >>> args=[b'some_bytes'], + >>> account_references=["ACCOUNT_1"], + >>> app_references=[123, 1234], + >>> asset_references=[12345], + >>> box_references=[...], + >>> lease="lease", + >>> note="note", + >>> # You wouldn't normally set this field + >>> first_valid_round=1000, + >>> validity_window=10, + >>> extra_fee=AlgoAmount(micro_algo=1000), + >>> static_fee=AlgoAmount(micro_algo=1000), + >>> # Max fee doesn't make sense with extraFee AND staticFee + >>> # already specified, but here for completeness + >>> max_fee=AlgoAmount(micro_algo=3000), + >>> # Signer only needed if you want to provide one, + >>> # generally you'd register it with AlgorandClient + >>> # against the sender and not need to pass it in + >>> signer=transactionSigner + >>> ), send_params=SendParams( + >>> max_rounds_to_wait_for_confirmation=5, + >>> suppress_log=True, + >>> )) + + + + .. py:method:: app_delete(params: algokit_utils.transactions.transaction_composer.AppDeleteParams, send_params: algokit_utils.models.transaction.SendParams | None = None) -> SendAppTransactionResult[algokit_utils.applications.abi.ABIReturn] + + Delete an application. + + :param params: Application deletion parameters + :param send_params: Send parameters + :return: Result of the deletion transaction + + :example: + >>> # Basic example + >>> algorand.send.app_delete(AppDeleteParams( + >>> sender="CREATORADDRESS", + >>> app_id=123456, + >>> )) + >>> # Advanced example + >>> algorand.send.app_delete(AppDeleteParams( + >>> sender="CREATORADDRESS", + >>> on_complete=OnComplete.DeleteApplicationOC, + >>> args=[b'some_bytes'], + >>> account_references=["ACCOUNT_1"], + >>> app_references=[123, 1234], + >>> asset_references=[12345], + >>> box_references=[...], + >>> lease="lease", + >>> note="note", + >>> # You wouldn't normally set this field + >>> first_valid_round=1000, + >>> validity_window=10, + >>> extra_fee=AlgoAmount(micro_algo=1000), + >>> static_fee=AlgoAmount(micro_algo=1000), + >>> # Max fee doesn't make sense with extraFee AND staticFee + >>> # already specified, but here for completeness + >>> max_fee=AlgoAmount(micro_algo=3000), + >>> # Signer only needed if you want to provide one, + >>> # generally you'd register it with AlgorandClient + >>> # against the sender and not need to pass it in + >>> signer=transactionSigner, + >>> ), send_params=SendParams( + >>> max_rounds_to_wait_for_confirmation=5, + >>> suppress_log=True, + >>> )) + + + + .. py:method:: app_call(params: algokit_utils.transactions.transaction_composer.AppCallParams, send_params: algokit_utils.models.transaction.SendParams | None = None) -> SendAppTransactionResult[algokit_utils.applications.abi.ABIReturn] + + Call an application. + + :param params: Application call parameters + :param send_params: Send parameters + :return: Result containing any ABI return value + + :example: + >>> # Basic example + >>> algorand.send.app_call(AppCallParams( + >>> sender="CREATORADDRESS", + >>> app_id=123456, + >>> )) + >>> # Advanced example + >>> algorand.send.app_call(AppCallParams( + >>> sender="CREATORADDRESS", + >>> on_complete=OnComplete.OptInOC, + >>> args=[b'some_bytes'], + >>> account_references=["ACCOUNT_1"], + >>> app_references=[123, 1234], + >>> asset_references=[12345], + >>> box_references=[...], + >>> lease="lease", + >>> note="note", + >>> # You wouldn't normally set this field + >>> first_valid_round=1000, + >>> validity_window=10, + >>> extra_fee=AlgoAmount(micro_algo=1000), + >>> static_fee=AlgoAmount(micro_algo=1000), + >>> # Max fee doesn't make sense with extraFee AND staticFee + >>> # already specified, but here for completeness + >>> max_fee=AlgoAmount(micro_algo=3000), + >>> # Signer only needed if you want to provide one, + >>> # generally you'd register it with AlgorandClient + >>> # against the sender and not need to pass it in + >>> signer=transactionSigner, + >>> ), send_params=SendParams( + >>> max_rounds_to_wait_for_confirmation=5, + >>> suppress_log=True, + >>> )) + + + + .. py:method:: app_create_method_call(params: algokit_utils.transactions.transaction_composer.AppCreateMethodCallParams, send_params: algokit_utils.models.transaction.SendParams | None = None) -> SendAppCreateTransactionResult[algokit_utils.applications.abi.ABIReturn] + + Call an application's create method. + + :param params: Method call parameters for application creation + :param send_params: Send parameters + :return: Result containing the new application ID and address + + :example: + >>> # Note: you may prefer to use `algorand.client` to get an app client for more advanced functionality. + >>> # + >>> # @param params The parameters for the app creation transaction + >>> # Basic example + >>> method = algorand.abi.Method( + >>> name='method', + >>> args=[b'arg1'], + >>> returns='string' + >>> ) + >>> result = algorand.send.app_create_method_call({ sender: 'CREATORADDRESS', + >>> approval_program: 'TEALCODE', + >>> clear_state_program: 'TEALCODE', + >>> method: method, + >>> args: ["arg1_value"] }) + >>> created_app_id = result.app_id + >>> ... + >>> # Advanced example + >>> method = algorand.abi.Method( + >>> name='method', + >>> args=[b'arg1'], + >>> returns='string' + >>> ) + >>> result = algorand.send.app_create_method_call({ + >>> sender: 'CREATORADDRESS', + >>> method: method, + >>> args: ["arg1_value"], + >>> approval_program: "TEALCODE", + >>> clear_state_program: "TEALCODE", + >>> schema: { + >>> "global_ints": 1, + >>> "global_byte_slices": 2, + >>> "local_ints": 3, + >>> "local_byte_slices": 4 + >>> }, + >>> extra_program_pages: 1, + >>> on_complete: algosdk.transaction.OnComplete.OptInOC, + >>> args: [new Uint8Array(1, 2, 3, 4)], + >>> account_references: ["ACCOUNT_1"], + >>> app_references: [123, 1234], + >>> asset_references: [12345], + >>> box_references: [...], + >>> lease: 'lease', + >>> note: 'note', + >>> # You wouldn't normally set this field + >>> first_valid_round: 1000, + >>> validity_window: 10, + >>> extra_fee: AlgoAmount(micro_algo=1000), + >>> static_fee: AlgoAmount(micro_algo=1000), + >>> # Max fee doesn't make sense with extraFee AND staticFee + >>> # already specified, but here for completeness + >>> max_fee: AlgoAmount(micro_algo=3000), + >>> # Signer only needed if you want to provide one, + >>> # generally you'd register it with AlgorandClient + >>> # against the sender and not need to pass it in + >>> signer: transactionSigner, + >>> }, send_params=SendParams( + >>> max_rounds_to_wait_for_confirmation=5, + >>> suppress_log=True, + >>> )) + + + + .. py:method:: app_update_method_call(params: algokit_utils.transactions.transaction_composer.AppUpdateMethodCallParams, send_params: algokit_utils.models.transaction.SendParams | None = None) -> SendAppUpdateTransactionResult[algokit_utils.applications.abi.ABIReturn] + + Call an application's update method. + + :param params: Method call parameters for application update + :param send_params: Send parameters + :return: Result containing the compiled programs + + :example: + # Basic example: + >>> method = algorand.abi.Method( + ... name="updateMethod", + ... args=[{"type": "string", "name": "arg1"}], + ... returns="string" + ... ) + >>> params = AppUpdateMethodCallParams( + ... sender="CREATORADDRESS", + ... app_id=123, + ... method=method, + ... args=["new_value"], + ... approval_program="TEALCODE", + ... clear_state_program="TEALCODE" + ... ) + >>> result = algorand.send.app_update_method_call(params) + >>> print(result.compiled_approval, result.compiled_clear) + + # Advanced example: + >>> method = algorand.abi.Method( + ... name="updateMethod", + ... args=[{"type": "string", "name": "arg1"}, {"type": "uint64", "name": "arg2"}], + ... returns="string" + ... ) + >>> params = AppUpdateMethodCallParams( + ... sender="CREATORADDRESS", + ... app_id=456, + ... method=method, + ... args=["new_value", 42], + ... approval_program="TEALCODE_ADVANCED", + ... clear_state_program="TEALCLEAR_ADVANCED", + ... account_references=["ACCOUNT1", "ACCOUNT2"], + ... app_references=[789], + ... asset_references=[101112] + ... ) + >>> result = algorand.send.app_update_method_call(params) + >>> print(result.compiled_approval, result.compiled_clear) + + + + .. py:method:: app_delete_method_call(params: algokit_utils.transactions.transaction_composer.AppDeleteMethodCallParams, send_params: algokit_utils.models.transaction.SendParams | None = None) -> SendAppTransactionResult[algokit_utils.applications.abi.ABIReturn] + + Call an application's delete method. + + :param params: Method call parameters for application deletion + :param send_params: Send parameters + :return: Result of the deletion transaction + + :example: + # Basic example: + >>> method = algorand.abi.Method( + ... name="deleteMethod", + ... args=[], + ... returns="void" + ... ) + >>> params = AppDeleteMethodCallParams( + ... sender="CREATORADDRESS", + ... app_id=123, + ... method=method + ... ) + >>> result = algorand.send.app_delete_method_call(params) + >>> print(result.tx_id) + + # Advanced example: + >>> method = algorand.abi.Method( + ... name="deleteMethod", + ... args=[{"type": "uint64", "name": "confirmation"}], + ... returns="void" + ... ) + >>> params = AppDeleteMethodCallParams( + ... sender="CREATORADDRESS", + ... app_id=123, + ... method=method, + ... args=[1], + ... account_references=["ACCOUNT1"], + ... app_references=[456] + ... ) + >>> result = algorand.send.app_delete_method_call(params) + >>> print(result.tx_id) + + + + .. py:method:: app_call_method_call(params: algokit_utils.transactions.transaction_composer.AppCallMethodCallParams, send_params: algokit_utils.models.transaction.SendParams | None = None) -> SendAppTransactionResult[algokit_utils.applications.abi.ABIReturn] + + Call an application's call method. + + :param params: Method call parameters + :param send_params: Send parameters + :return: Result containing any ABI return value + + :example: + # Basic example: + >>> method = algorand.abi.Method( + ... name="callMethod", + ... args=[{"type": "uint64", "name": "arg1"}], + ... returns="uint64" + ... ) + >>> params = AppCallMethodCallParams( + ... sender="CALLERADDRESS", + ... app_id=123, + ... method=method, + ... args=[12345] + ... ) + >>> result = algorand.send.app_call_method_call(params) + >>> print(result.abi_return) + + # Advanced example: + >>> method = algorand.abi.Method( + ... name="callMethod", + ... args=[{"type": "uint64", "name": "arg1"}, {"type": "string", "name": "arg2"}], + ... returns="uint64" + ... ) + >>> params = AppCallMethodCallParams( + ... sender="CALLERADDRESS", + ... app_id=123, + ... method=method, + ... args=[12345, "extra"], + ... account_references=["ACCOUNT1"], + ... asset_references=[101112], + ... app_references=[789] + ... ) + >>> result = algorand.send.app_call_method_call(params) + >>> print(result.abi_return) + + + + .. py:method:: online_key_registration(params: algokit_utils.transactions.transaction_composer.OnlineKeyRegistrationParams, send_params: algokit_utils.models.transaction.SendParams | None = None) -> SendSingleTransactionResult + + Register an online key. + + :param params: Key registration parameters + :param send_params: Send parameters + :return: Result of the registration transaction + + :example: + # Basic example: + >>> params = OnlineKeyRegistrationParams( + ... sender="ACCOUNTADDRESS", + ... vote_key="VOTEKEY", + ... selection_key="SELECTIONKEY", + ... vote_first=1000, + ... vote_last=2000, + ... vote_key_dilution=10 + ... ) + >>> result = algorand.send.online_key_registration(params) + >>> print(result.tx_id) + + # Advanced example: + >>> params = OnlineKeyRegistrationParams( + ... sender="ACCOUNTADDRESS", + ... vote_key="VOTEKEY", + ... selection_key="SELECTIONKEY", + ... vote_first=1000, + ... vote_last=2100, + ... vote_key_dilution=10, + ... state_proof_key=b'' * 64 + ... ) + >>> result = algorand.send.online_key_registration(params) + >>> print(result.tx_id) + + + + .. py:method:: offline_key_registration(params: algokit_utils.transactions.transaction_composer.OfflineKeyRegistrationParams, send_params: algokit_utils.models.transaction.SendParams | None = None) -> SendSingleTransactionResult + + Register an offline key. + + :param params: Key registration parameters + :param send_params: Send parameters + :return: Result of the registration transaction + + :example: + # Basic example: + >>> params = OfflineKeyRegistrationParams( + ... sender="ACCOUNTADDRESS", + ... prevent_account_from_ever_participating_again=True + ... ) + >>> result = algorand.send.offline_key_registration(params) + >>> print(result.tx_id) + + # Advanced example: + >>> params = OfflineKeyRegistrationParams( + ... sender="ACCOUNTADDRESS", + ... prevent_account_from_ever_participating_again=True, + ... note=b'Offline registration' + ... ) + >>> result = algorand.send.offline_key_registration(params) + >>> print(result.tx_id) + + + diff --git a/docs/html/_sources/autoapi/index.rst.txt b/docs/html/_sources/autoapi/index.rst.txt new file mode 100644 index 00000000..fda982fe --- /dev/null +++ b/docs/html/_sources/autoapi/index.rst.txt @@ -0,0 +1,11 @@ +API Reference +============= + +This page contains auto-generated API reference documentation [#f1]_. + +.. toctree:: + :titlesonly: + + /autoapi/algokit_utils/index + +.. [#f1] Created with `sphinx-autoapi `_ \ No newline at end of file diff --git a/docs/html/_sources/capabilities/account.md.txt b/docs/html/_sources/capabilities/account.md.txt index d0c2b42f..8a3b405a 100644 --- a/docs/html/_sources/capabilities/account.md.txt +++ b/docs/html/_sources/capabilities/account.md.txt @@ -1,31 +1,215 @@ # Account management -Account management is one of the core capabilities provided by AlgoKit Utils. It allows you to create mnemonic, idempotent KMD and environment variable injected accounts -that can be used to sign transactions as well as representing a sender address at the same time. - -(account)= -## `Account` - -Encapsulates a private key with convenience properties for `address`, `signer` and `public_key`. - -There are various methods of obtaining an `Account` instance - -* `get_account`: Returns an `Account` instance with the private key loaded by convention based on the given name identifier: - * from an environment variable containing a mnemonic `{NAME}_MNEMONIC` OR - * loading the account from KMD ny name if it exists (LocalNet only) OR - * creating the account in KMD with associated name (LocalNet only) - - This allows you to have powerful code that will automatically create and fund an account by name locally and when deployed against - TestNet/MainNet will automatically resolve from environment variables - -* `Account.new_account`: Returns a new `Account` using `algosdk.account.generate_account()` -* `Account(private_key)`: Load an existing account from a private key -* `Account(private_key, address)`: Load an existing account from a private key and address, useful for re-keyed accounts -* `get_account_from_mnemonic`: Load an existing account from a mnemonic -* `get_dispenser_account`: Gets a dispenser account that is funded by either: - * Using the LocalNet default account (LocalNet only) OR - * Loading an account from `DISPENSER_MNEMONIC` - -If working with a LocalNet instance, there are some additional functions that rely on a KMD service being exposed: -* `create_kmd_wallet_account`, `get_kmd_wallet_account` or `get_or_create_kmd_wallet_account`: These functions allow retrieving a KMD wallet account by name, -* `get_localnet_default_account`: Gets default localnet account that is funded with algos +Account management is one of the core capabilities provided by AlgoKit Utils. It allows you to create mnemonic, rekeyed, multisig, transaction signer, idempotent KMD and environment variable injected accounts that can be used to sign transactions as well as representing a sender address at the same time. This significantly simplifies management of transaction signing. + +## `AccountManager` + +The {py:obj}`AccountManager ` is a class that is used to get, create, and fund accounts and perform account-related actions such as funding. The `AccountManager` also keeps track of signers for each address so when using the [`TransactionComposer`](./transaction-composer.md) to send transactions, a signer function does not need to manually be specified for each transaction - instead it can be inferred from the sender address automatically! + +To get an instance of `AccountManager`, you can use either [`AlgorandClient`](./algorand-client.md) via `algorand.account` or instantiate it directly: + +```python +from algokit_utils import AccountManager + +account_manager = AccountManager(client_manager) +``` + +## `TransactionSignerAccountProtocol` + +The core internal type that holds information about a signer/sender pair for a transaction is {py:obj}`TransactionSignerAccountProtocol `, which represents an `algosdk.transaction.TransactionSigner` (`signer`) along with a sender address (`address`) as the encoded string address. + +The following conform to `TransactionSignerAccountProtocol`: + +- {py:obj}`TransactionSignerAccount ` - a basic transaction signer account that holds an address and a signer conforming to `TransactionSignerAccountProtocol` +- {py:obj}`SigningAccount ` - an abstraction that used to be available under `Account` in previous versions of AlgoKit Utils. Renamed for consistency with equivalent `ts` version. Holds private key and conforms to `TransactionSignerAccountProtocol` +- {py:obj}`LogicSigAccount ` - a wrapper class around `algosdk` logicsig abstractions conforming to `TransactionSignerAccountProtocol` +- {py:obj}`MultisigAccount ` - a wrapper class around `algosdk` multisig abstractions conforming to `TransactionSignerAccountProtocol` + +## Registering a signer + +The `AccountManager` keeps track of which signer is associated with a given sender address. This is used by [`AlgorandClient`](./algorand-client.md) to automatically sign transactions by that sender. Any of the [methods](#accounts) within `AccountManager` that return an account will automatically register the signer with the sender. + +There are two methods that can be used for this, `set_signer_from_account`, which takes any number of [account based objects](#underlying-account-classes) that combine signer and sender (`TransactionSignerAccount` | `SigningAccount` | `LogicSigAccount` | `MultisigAccount`), or `set_signer` which takes the sender address and the `TransactionSigner`: + +```python +algorand.account + .set_signer_from_account(TransactionSignerAccount(your_address, your_signer)) + .set_signer_from_account(SigningAccount.new_account()) + .set_signer_from_account( + LogicSigAccount(algosdk.transaction.LogicSigAccount(program, args)) + ) + .set_signer_from_account( + MultisigAccount( + MultisigMetadata( + version = 1, + threshold = 1, + addresses = ["ADDRESS1...", "ADDRESS2..."] + ), + [account1, account2] + ) + ) + .set_signer("SENDERADDRESS", transaction_signer) +``` + +## Default signer + +If you want to have a default signer that is used to sign transactions without a registered signer (rather than throwing an exception) then you can {py:meth}`set_default_signer `: + +```python +algorand.account.set_default_signer(my_default_signer) +``` + +## Get a signer + +[`AlgorandClient`](./algorand-client.md) will automatically retrieve a signer when signing a transaction, but if you need to get a `TransactionSigner` externally to do something more custom then you can {py:meth}`get_signer ` for a given sender address: + +```python +signer = algorand.account.get_signer("SENDER_ADDRESS") +``` + +If there is no signer registered for that sender address it will either return the default signer ([if registered](#default-signer)) or throw an exception. + +## Accounts + +In order to get/register accounts for signing operations you can use the following methods on [`AccountManager`](#accountmanager) (expressed here as `algorand.account` to denote the syntax via an [`AlgorandClient`](./algorand-client.md)): + +- {py:meth}`from_environment ` - Registers and returns an account with private key loaded by convention based on the given name identifier - either by idempotently creating the account in KMD or from environment variable via `process.env['{NAME}_MNEMONIC']` and (optionally) `process.env['{NAME}_SENDER']` (if account is rekeyed) + - This allows you to have powerful code that will automatically create and fund an account by name locally and when deployed against TestNet/MainNet will automatically resolve from environment variables, without having to have different code + - Note: `fund_with` allows you to control how many Algo are seeded into an account created in KMD +- {py:meth}`from_mnemonic ` - Registers and returns an account with secret key loaded by taking the mnemonic secret +- {py:meth}`multisig ` - Registers and returns a multisig account with one or more signing keys loaded +- {py:meth}`rekeyed ` - Registers and returns an account representing the given rekeyed sender/signer combination +- {py:meth}`random ` - Returns a new, cryptographically randomly generated account with private key loaded +- {py:meth}`from_kmd ` - Returns an account with private key loaded from the given KMD wallet (identified by name) +- {py:meth}`logicsig ` - Returns an account that represents a logic signature + +### Underlying account classes + +While `TransactionSignerAccount` is the main class used to represent an account that can sign, there are underlying account classes that can underpin the signer within the transaction signer account. + +- {py:obj}`TransactionSignerAccount ` - A default class conforming to `TransactionSignerAccountProtocol` that holds an address and a signer +- {py:obj}`SigningAccount ` - An abstraction around `algosdk.Account` that supports rekeyed accounts +- {py:obj}`LogicSigAccount ` - An abstraction around `algosdk.LogicSigAccount` and `algosdk.LogicSig` that supports logic sig signing. Exposes access to the underlying algosdk `algosdk.transaction.LogicSigAccount` object instance via `lsig` property. +- {py:obj}`MultisigAccount ` - An abstraction around `algosdk.MultisigMetadata`, `algosdk.makeMultiSigAccountTransactionSigner`, `algosdk.multisigAddress`, `algosdk.signMultisigTransaction` and `algosdk.appendSignMultisigTransaction` that supports multisig accounts with one or more signers present. Exposes access to the underlying algosdk `algosdk.transaction.Multisig` object instance via `multisig` property. + +### Dispenser + +- {py:meth}`dispenser_from_environment ` - Returns an account (with private key loaded) that can act as a dispenser from environment variables, or against default LocalNet if no environment variables present +- {py:meth}`localnet_dispenser ` - Returns an account with private key loaded that can act as a dispenser for the default LocalNet dispenser account + +## Rekey account + +One of the unique features of Algorand is the ability to change the private key that can authorise transactions for an account. This is called [rekeying](https://developer.algorand.org/docs/get-details/accounts/rekey/). + +> [!WARNING] +> Rekeying should be done with caution as a rekey transaction can result in permanent loss of control of an account. + +You can issue a transaction to rekey an account by using the {py:meth}`rekey_account ` function: + +- `account: string | TransactionSignerAccount` - The account address or signing account of the account that will be rekeyed +- `rekeyTo: string | TransactionSignerAccount` - The account address or signing account of the account that will be used to authorise transactions for the rekeyed account going forward. If a signing account is provided that will now be tracked as the signer for `account` in the `AccountManager` instance. +- An `options` object, which has: + - [Common transaction parameters](./algorand-client.md#transaction-parameters) + - [Execution parameters](./algorand-client.md#sending-a-single-transaction) + +You can also pass in `rekeyTo` as a [common transaction parameter](./algorand-client.md#transaction-parameters) to any transaction. + +### Examples + +```python +# Basic example (with string addresses) + +algorand.account.rekey_account({ + account: "ACCOUNTADDRESS", + rekey_to: "NEWADDRESS", +}) + +# Basic example (with signer accounts) + +algorand.account.rekey_account({ + account: account1, + rekey_to: new_signer_account, +}) + +# Advanced example + +algorand.account.rekey_account({ + account: "ACCOUNTADDRESS", + rekey_to: "NEWADDRESS", + lease: "lease", + note: "note", + first_valid_round: 1000, + validity_window: 10, + extra_fee: AlgoAmount.from_micro_algos(1000), + static_fee: AlgoAmount.from_micro_algos(1000), + # Max fee doesn't make sense with extra_fee AND static_fee + # already specified, but here for completeness + max_fee: AlgoAmount.from_micro_algos(3000), + max_rounds_to_wait_for_confirmation: 5, + suppress_log: True, +}) + + +# Using a rekeyed account + +Note: if a signing account is passed into `algorand.account.rekey_account` then you don't need to call `rekeyed_account` to register the new signer + +rekeyed_account = algorand.account.rekey_account(account, new_account) +# rekeyed_account can be used to sign transactions on behalf of account... +``` + +## KMD account management + +When running LocalNet, you have an instance of the [Key Management Daemon](https://github.com/algorand/go-algorand/blob/master/daemon/kmd/README.md), which is useful for: + +- Accessing the private key of the default accounts that are pre-seeded with Algo so that other accounts can be funded and it's possible to use LocalNet +- Idempotently creating new accounts against a name that will stay intact while the LocalNet instance is running without you needing to store private keys anywhere (i.e. completely automated) + +The KMD SDK is fairly low level so to make use of it there is a fair bit of boilerplate code that's needed. This code has been abstracted away into the `KmdAccountManager` class. + +To get an instance of the `KmdAccountManager` class you can access it from [`AlgorandClient`](./algorand-client.md) via `algorand.account.kmd` or instantiate it directly (passing in a [`ClientManager`](./client.md)): + +```python +from algokit_utils import KmdAccountManager + +kmd_account_manager = KmdAccountManager(client_manager) +``` + +The methods that are available are: + +- {py:meth}`get_wallet_account ` - Returns an Algorand signing account with private key loaded from the given KMD wallet (identified by name). +- {py:meth}`get_or_create_wallet_account ` - Gets an account with private key loaded from a KMD wallet of the given name, or alternatively creates one with funds in it via a KMD wallet of the given name. +- {py:meth}`get_localnet_dispenser_account ` - Returns an Algorand account with private key loaded for the default LocalNet dispenser account (that can be used to fund other accounts) + +```python +# Get a wallet account that seeded the LocalNet network +default_dispenser_account = kmd_account_manager.get_wallet_account( + "unencrypted-default-wallet", + lambda a: a["status"] != "Offline" and a["amount"] > 1_000_000_000 +) +# Same as above, but dedicated method call for convenience +localnet_dispenser_account = kmd_account_manager.get_localnet_dispenser_account() +# Idempotently get (if exists) or create (if it doesn't exist yet) an account by name using KMD +# if creating it then fund it with 2 ALGO from the default dispenser account +new_account = kmd_account_manager.get_or_create_wallet_account( + "account1", + AlgoAmount.from_algos(2) +) +# This will return the same account as above since the name matches +existing_account = kmd_account_manager.get_or_create_wallet_account( + "account1" +) +``` + +Some of this functionality is directly exposed from [`AccountManager`](#accountmanager), which has the added benefit of registering the account as a signer so they can be automatically used to sign transactions when using via [`AlgorandClient`](./algorand-client.md): + +```python +# Get and register LocalNet dispenser +localnet_dispenser = algorand.account.localnet_dispenser() +# Get and register a dispenser by environment variable, or if not set then LocalNet dispenser via KMD +dispenser = algorand.account.dispenser_from_environment() +# Get an account from KMD idempotently by name. In this case we'll get the default dispenser account +dispenser_via_kmd = algorand.account.from_kmd('unencrypted-default-wallet', lambda a: a.status != 'Offline' and a.amount > 1_000_000_000) +# Get / create and register account from KMD idempotently by name +fresh_account_via_kmd = algorand.account.kmd.get_or_create_wallet_account('account1', AlgoAmount.from_algos(2)) +``` diff --git a/docs/html/_sources/capabilities/algorand-client.md.txt b/docs/html/_sources/capabilities/algorand-client.md.txt new file mode 100644 index 00000000..adde5f4b --- /dev/null +++ b/docs/html/_sources/capabilities/algorand-client.md.txt @@ -0,0 +1,190 @@ +# Algorand client + +`AlgorandClient` is a client class that brokers easy access to Algorand functionality. It's the [default entrypoint](../index.md#usage) into AlgoKit Utils functionality. + +The main entrypoint to the bulk of the functionality in AlgoKit Utils is the `AlgorandClient` class, most of the time you can get started by typing `AlgorandClient.` and choosing one of the static initialisation methods to create an {py:class}`algokit_utils.algorand.AlgorandClient`, e.g.: + +```python +# Point to the network configured through environment variables or +# if no environment variables it will point to the default LocalNet +# configuration +algorand = AlgorandClient.from_environment() +# Point to default LocalNet configuration +algorand = AlgorandClient.default_localnet() +# Point to TestNet using AlgoNode free tier +algorand = AlgorandClient.testnet() +# Point to MainNet using AlgoNode free tier +algorand = AlgorandClient.mainnet() +# Point to a pre-created algod client +algorand = AlgorandClient.from_clients(algod=algod) +# Point to pre-created algod, indexer and kmd clients +algorand = AlgorandClient.from_clients(algod=algod, indexer=indexer, kmd=kmd) +# Point to custom configuration for algod +algorand = AlgorandClient.from_config(algod_config=algod_config) +# Point to custom configuration for algod, indexer and kmd +algorand = AlgorandClient.from_config( + algod_config=algod_config, + indexer_config=indexer_config, + kmd_config=kmd_config +) +``` + +## Accessing SDK clients + +Once you have an `AlgorandClient` instance, you can access the SDK clients for the various Algorand APIs via the `algorand.client` property. + +```py +algorand = AlgorandClient.default_localnet() + +algod_client = algorand.client.algod +indexer_client = algorand.client.indexer +kmd_client = algorand.client.kmd +``` + +## Accessing manager class instances + +The `AlgorandClient` has a number of manager class instances that help you quickly use intellisense to get access to advanced functionality. + +- [`AccountManager`](./account.md) via `algorand.account`, there are also some chainable convenience methods which wrap specific methods in `AccountManager`: + - `algorand.setDefaultSigner(signer)` - + - `algorand.setSignerFromAccount(account)` - + - `algorand.setSigner(sender, signer)` +- [`AssetManager`](./asset.md) via `algorand.asset` +- [`ClientManager`](./client.md) via `algorand.client` + +## Creating and issuing transactions + +`AlgorandClient` exposes a series of methods that allow you to create, execute, and compose groups of transactions (all via the [`TransactionComposer`](./transaction-composer.md)). + +### Creating transactions + +You can compose a transaction via `algorand.create_transaction.`, which gives you an instance of the {py:class}`algokit_utils.transactions.AlgorandClientTransactionCreator` class. Intellisense will guide you on the different options. + +The signature for the calls to send a single transaction usually look like: + +```python +algorand.create_transaction.{method}(params=TxnParams(...), send_params=SendParams(...)) -> Transaction: +``` + +- `TxnParams` is a union type that can be any of the Algorand transaction types, exact dataclasses can be imported from `algokit_utils` and consist of: + - `AppCallParams`, + - `AppCreateParams`, + - `AppDeleteParams`, + - `AppUpdateParams`, + - `AssetConfigParams`, + - `AssetCreateParams`, + - `AssetDestroyParams`, + - `AssetFreezeParams`, + - `AssetOptInParams`, + - `AssetOptOutParams`, + - `AssetTransferParams`, + - `OfflineKeyRegistrationParams`, + - `OnlineKeyRegistrationParams`, + - `PaymentParams`, +- `SendParams` is a typed dictionary exposing setting to apply during send operation: + - `max_rounds_to_wait_for_confirmation: int | None` - The number of rounds to wait for confirmation. By default until the latest lastValid has past. + - `suppress_log: bool | None` - Whether to suppress log messages from transaction send, default: do not suppress. + - `populate_app_call_resources: bool | None` - Whether to use simulate to automatically populate app call resources in the txn objects. Defaults to `Config.populateAppCallResources`. + - `cover_app_call_inner_transaction_fees: bool | None` - Whether to use simulate to automatically calculate required app call inner transaction fees and cover them in the parent app call transaction fee + +The return type for the ABI method call methods are slightly different: + +```python +algorand.createTransaction.app{call_type}_method_call(params=MethodCallParams(...), send_params=SendParams(...)) -> BuiltTransactions +``` + +MethodCallParams is a union type that can be any of the Algorand method call types, exact dataclasses can be imported from `algokit_utils` and consist of: + +- `AppCreateMethodCallParams`, +- `AppCallMethodCallParams`, +- `AppDeleteMethodCallParams`, +- `AppUpdateMethodCallParams`, + +Where `BuiltTransactions` looks like this: + +```python +@dataclass(frozen=True) +class BuiltTransactions: + transactions: list[algosdk.transaction.Transaction] + method_calls: dict[int, Method] + signers: dict[int, TransactionSigner] +``` + +This signifies the fact that an ABI method call can actually result in multiple transactions (which in turn may have different signers), that you need ABI metadata to be able to extract the return value from the transaction result. + +### Sending a single transaction + +You can compose a single transaction via `algorand.send...`, which gives you an instance of the {py:class}`algokit_utils.transactions.AlgorandClientTransactionSender` class. Intellisense will guide you on the different options. + +Further documentation is present in the related capabilities: + +- [App management](./app.md) +- [Asset management](./asset.md) +- [Algo transfers](./transfer.md) + +The signature for the calls to send a single transaction usually look like: + +`algorand.send.{method}(params=TxnParams, send_params=SendParams) -> SingleSendTransactionResult` + +- To get intellisense on the params, use your IDE's intellisense keyboard shortcut (e.g. ctrl+space). +- `TxnParams` is a union type that can be any of the Algorand transaction types, exact dataclasses can be imported from `algokit_utils`. +- {py:class}`algokit_utils.transactions.SendParams` a typed dictionary exposing setting to apply during send operation. +- {py:class}`algokit_utils.transactions.SendSingleTransactionResult` is all of the information that is relevant when [sending a single transaction to the network](./transaction.md#transaction-results) + +Generally, the functions to immediately send a single transaction will emit log messages before and/or after sending the transaction. You can opt-out of this by sending `suppressLog: true`. + +### Composing a group of transactions + +You can compose a group of transactions for execution by using the `new_group()` method on `AlgorandClient` and then use the various `.add_{Type}()` methods on [`TransactionComposer`](./transaction-composer.md) to add a series of transactions. + +```python +result = (algorand + .new_group() + .add_payment( + PaymentParams( + sender="SENDERADDRESS", + receiver="RECEIVERADDRESS", + amount=1_000_000 # 1 Algo in microAlgos + ) + ) + .add_asset_opt_in( + AssetOptInParams( + sender="SENDERADDRESS", + asset_id=12345 + ) + ) + .send()) +``` + +`new_group()` returns a new [`TransactionComposer`](./transaction-composer.md) instance, which can also return the group of transactions, simulate them and other things. + +### Transaction parameters + +To create a transaction you instantiate a relevant Transaction parameters dataclass from `algokit_utils.transactions import *` or `from algokit_utils import PaymentParams, AssetOptInParams, etc`. + +All transaction parameters share the following common base parameters: + +- `sender: str` - The address of the account sending the transaction. +- `signer: algosdk.TransactionSigner | TransactionSignerAccount | None` - The function used to sign transaction(s); if not specified then an attempt will be made to find a registered signer for the given `sender` or use a default signer (if configured). +- `rekey_to: string | None` - Change the signing key of the sender to the given address. **Warning:** Please be careful with this parameter and be sure to read the [official rekey guidance](https://developer.algorand.org/docs/get-details/accounts/rekey/). +- `note: bytes | str | None` - Note to attach to the transaction. Max of 1000 bytes. +- `lease: bytes | str | None` - Prevent multiple transactions with the same lease being included within the validity window. A [lease](https://developer.algorand.org/articles/leased-transactions-securing-advanced-smart-contract-design/) enforces a mutually exclusive transaction (useful to prevent double-posting and other scenarios). +- Fee management + - `static_fee: AlgoAmount | None` - The static transaction fee. In most cases you want to use `extra_fee` unless setting the fee to 0 to be covered by another transaction. + - `extra_fee: AlgoAmount | None` - The fee to pay IN ADDITION to the suggested fee. Useful for covering inner transaction fees. + - `max_fee: AlgoAmount | None` - Throw an error if the fee for the transaction is more than this amount; prevents overspending on fees during high congestion periods. +- Round validity management + - `validity_window: int | None` - How many rounds the transaction should be valid for, if not specified then the registered default validity window will be used. + - `first_valid_round: int | None` - Set the first round this transaction is valid. If left undefined, the value from algod will be used. We recommend you only set this when you intentionally want this to be some time in the future. + - `last_valid_round: int | None` - The last round this transaction is valid. It is recommended to use `validity_window` instead. + +Then on top of that the base type gets extended for the specific type of transaction you are issuing. These are all defined as part of [`TransactionComposer`](./transaction-composer.md) and we recommend reading these docs, especially when leveraging either `populate_app_call_resources` or `cover_app_call_inner_transaction_fees`. + +### Transaction configuration + +AlgorandClient caches network provided transaction values for you automatically to reduce network traffic. It has a set of default configurations that control this behaviour, but you have the ability to override and change the configuration of this behaviour: + +- `algorand.set_default_validity_window(validity_window)` - Set the default validity window (number of rounds from the current known round that the transaction will be valid to be accepted for), having a smallish value for this is usually ideal to avoid transactions that are valid for a long future period and may be submitted even after you think it failed to submit if waiting for a particular number of rounds for the transaction to be successfully submitted. The validity window defaults to `10`, except localnet environments where it's set to `1000`. +- `algorand.set_suggested_params(suggested_params, until?)` - Set the suggested network parameters to use (optionally until the given time) +- `algorand.set_suggested_params_timeout(timeout)` - Set the timeout that is used to cache the suggested network parameters (by default 3 seconds) +- `algorand.get_suggested_params()` - Get the current suggested network parameters object, either the cached value, or if the cache has expired a fresh value diff --git a/docs/html/_sources/capabilities/amount.md.txt b/docs/html/_sources/capabilities/amount.md.txt new file mode 100644 index 00000000..9030f612 --- /dev/null +++ b/docs/html/_sources/capabilities/amount.md.txt @@ -0,0 +1,55 @@ +# Algo amount handling + +Algo amount handling is one of the core capabilities provided by AlgoKit Utils. It allows you to reliably and tersely specify amounts of microAlgo and Algo and safely convert between them. + +Any AlgoKit Utils function that needs an Algo amount will take an `AlgoAmount` object, which ensures that there is never any confusion about what value is being passed around. Whenever an AlgoKit Utils function calls into an underlying algosdk function, or if you need to take an `AlgoAmount` and pass it into an underlying algosdk function (per the {ref}`modularity principle `) you can safely and explicitly convert to microAlgo or Algo. + +To see some usage examples check out the automated tests. Alternatively, you can see the reference documentation for `AlgoAmount`. + +## `AlgoAmount` + +The `AlgoAmount` class provides a safe wrapper around an underlying amount of microAlgo where any value entering or existing the `AlgoAmount` class must be explicitly stated to be in microAlgo or Algo. This makes it much safer to handle Algo amounts rather than passing them around as raw numbers where it's easy to make a (potentially costly!) mistake and not perform a conversion when one is needed (or perform one when it shouldn't be!). + +To import the AlgoAmount class you can access it via: + +```python +from algokit_utils import AlgoAmount +``` + +### Creating an `AlgoAmount` + +There are a few ways to create an `AlgoAmount`: + +- Algo + - Constructor: `AlgoAmount(algo=10)` + - Static helper: `AlgoAmount.from_algo(10)` +- microAlgo + - Constructor: `AlgoAmount(micro_algo=10_000)` + - Static helper: `AlgoAmount.from_micro_algo(10_000)` + +### Extracting a value from `AlgoAmount` + +The `AlgoAmount` class has properties to return Algo and microAlgo: + +- `amount.algo` - Returns the value in Algo as a python `Decimal` object +- `amount.micro_algo` - Returns the value in microAlgo as an integer + +`AlgoAmount` will coerce to an integer automatically (in microAlgo) when using `int(amount)`, which allows you to use `AlgoAmount` objects in comparison operations such as `<` and `>=` etc. + +You can also call `str(amount)` or use an `AlgoAmount` directly in string interpolation to convert it to a nice user-facing formatted amount expressed in microAlgo. + +### Additional Features + +The `AlgoAmount` class supports arithmetic operations: + +- Addition: `amount1 + amount2` +- Subtraction: `amount1 - amount2` +- Comparison operations: `<`, `<=`, `>`, `>=`, `==`, `!=` + +Example: + +```python +amount1 = AlgoAmount(algo=1) +amount2 = AlgoAmount(micro_algo=500_000) +total = amount1 + amount2 # Results in 1.5 Algo +``` diff --git a/docs/html/_sources/capabilities/app-client.md.txt b/docs/html/_sources/capabilities/app-client.md.txt index d76f27b7..0b257d34 100644 --- a/docs/html/_sources/capabilities/app-client.md.txt +++ b/docs/html/_sources/capabilities/app-client.md.txt @@ -1,157 +1,347 @@ -# App client +# App client and App factory -Application client that works with ARC-0032 application spec defined smart contracts (e.g. via Beaker). +> [!NOTE] +> This page covers the untyped app client, but we recommend using typed clients (coming soon), which will give you a better developer experience with strong typing specific to the app itself. -App client is a high productivity application client that works with ARC-0032 application spec defined smart contracts, which you can use to create, update, delete, deploy and call a smart contract and access state data for it. +App client and App factory are higher-order use case capabilities provided by AlgoKit Utils that builds on top of the core capabilities, particularly [App deployment](./app-deploy.md) and [App management](./app.md). They allow you to access high productivity application clients that work with [ARC-56](https://github.com/algorandfoundation/ARCs/pull/258) and [ARC-32](https://github.com/algorandfoundation/ARCs/blob/main/ARCs/arc-0032.md) application spec defined smart contracts, which you can use to create, update, delete, deploy and call a smart contract and access state data for it. -To see some usage examples check out the [automated tests](https://github.com/algorandfoundation/algokit-utils-py/blob/main/tests/test_app_client_call.py). +> [!NOTE] +> If you are confused about when to use the factory vs client the mental model is: use the client if you know the app ID, use the factory if you don't know the app ID (deferred knowledge or the instance doesn't exist yet on the blockchain) or you have multiple app IDs -## Design +## `AppFactory` -The design for the app client is based on a wrapper for parsing an [ARC-0032](https://github.com/algorandfoundation/ARCs/pull/150) application spec and wrapping the [App deployment](./app-deploy.md) functionality and corresponding [design](./app-deploy.md#design). +The `AppFactory` is a class that, for a given app spec, allows you to create and deploy one or more app instances and to create one or more app clients to interact with those (or other) app instances. -## Creating an application client +To get an instance of `AppFactory` you can use `AlgorandClient` via `algorand.get_app_factory`: -There are two key ways of instantiating an ApplicationClient: +```python +# Minimal example +factory = algorand.get_app_factory( + app_spec="{/* ARC-56 or ARC-32 compatible JSON */}", +) + +# Advanced example +factory = algorand.get_app_factory( + app_spec=parsed_arc32_or_arc56_app_spec, + default_sender="SENDERADDRESS", + app_name="OverriddenAppName", + version="2.0.0", + compilation_params={ + "updatable": True, + "deletable": False, + "deploy_time_params": { "ONE": 1, "TWO": "value" }, + } +) +``` + +## `AppClient` + +The `AppClient` is a class that, for a given app spec, allows you to manage calls and state for a specific deployed instance of an app (with a known app ID). + +To get an instance of `AppClient` you can use either `AlgorandClient` or instantiate it directly: -1. By app ID - When needing to call an existing app by app ID or unconditionally create a new app. -The signature `ApplicationClient(algod_client, app_spec, app_id=..., ...)` requires: - * `algod_client`: An `AlgodClient` - * `app_spec`: An `ApplicationSpecification` - * `app_id`: The app_id of an existing application, or 0 if creating a new app +```python +# Minimal examples +app_client = AppClient.from_creator_and_name( + app_spec="{/* ARC-56 or ARC-32 compatible JSON */}", + creator_address="CREATORADDRESS", + algorand=algorand, +) + +app_client = AppClient( + AppClientParams( + app_spec="{/* ARC-56 or ARC-32 compatible JSON */}", + app_id=12345, + algorand=algorand, + ) +) + +app_client = AppClient.from_network( + app_spec="{/* ARC-56 or ARC-32 compatible JSON */}", + algorand=algorand, +) + +# Advanced example +app_client = AppClient( + AppClientParams( + app_spec=parsed_app_spec, + app_id=12345, + algorand=algorand, + app_name="OverriddenAppName", + default_sender="SENDERADDRESS", + approval_source_map=approval_teal_source_map, + clear_source_map=clear_teal_source_map, + ) +) +``` -2. By creator and app name - When needing to deploy or find an app associated with a specific creator account and app name. -The signature `ApplicationClient(algod_client, app_spec, creator=..., indexer=..., app_lookup)` requires: - * `algod_client`: An `AlgodClient` - * `app_spec`: An `ApplicationSpecification` - * `creator`: The address or `Account` of the creator of the app for which to search for the deployed app under - * `indexer`: - * `app_lookup`: Optional if an indexer is provided, - * `app_name`: An overridden name to identify the contract with, otherwise `contract.name` is used from the app spec +You can access `app_id`, `app_address`, `app_name` and `app_spec` as properties on the `AppClient`. -Both approaches also allow specifying the following parameters that will be used as defaults for all application calls: -* `signer`: `TransactionSigner` to sign transactions with. -* `sender`: Address to use for transaction signing, will be derived from the signer if not provided. -* `suggested_params`: Default `SuggestedParams` to use, will use current network suggested params by default - -Both approaches also allow specifying a mapping of template values via the `template_values` parameter, this will be used before compiling the application to replace any -`TMPL_` variables that may be in the TEAL. The `TMPL_UPDATABLE` and `TMPL_DELETABLE` variables used in some AlgoKit templates are handled by the `deploy` method, but should be included if -using `create` or `update` directly. +## Dynamically creating clients for a given app spec -## Calling methods on the app +The `AppFactory` allows you to conveniently create multiple `AppClient` instances on-the-fly with information pre-populated. -There are various methods available on `ApplicationClient` that can be used to call an app: +This is possible via two methods on the app factory: -* `call`: Used to call methods with an on complete action of `no_op` -* `create`: Used to create an instance of the app, by using an `app_id` of 0, includes the approval and clear programs in the call -* `update`: Used to update an existing app, includes the approval and clear programs in the call, and is called with an on complete action of `update_application` -* `delete`: Used to remove an existing app, is called with an on complete action of `delete_application` -* `opt_in`: Used to opt in to an existing app, is called with an on complete action of `opt_in` -* `close_out`: Used to close out of an existing app, is called with an on complete action of `opt_in` -* `clear_state`: Used to unconditionally close out from an app, calls the clear program of an app +- `factory.get_app_client_by_id(app_id, ...)` - Returns a new `AppClient` for an app instance of the given ID. Automatically populates app_name, default_sender and source maps from the factory if not specified. +- `factory.get_app_client_by_creator_and_name(creator_address, app_name, ...)` - Returns a new `AppClient`, resolving the app by creator address and name using AlgoKit app deployment semantics. Automatically populates app_name, default_sender and source maps from the factory if not specified. -### Specifying which method +```python +app_client1 = factory.get_app_client_by_id(app_id=12345) +app_client2 = factory.get_app_client_by_id(app_id=12346) +app_client3 = factory.get_app_client_by_id( + app_id=12345, + default_sender="SENDER2ADDRESS" +) + +app_client4 = factory.get_app_client_by_creator_and_name( + creator_address="CREATORADDRESS" +) +app_client5 = factory.get_app_client_by_creator_and_name( + creator_address="CREATORADDRESS", + app_name="NonDefaultAppName" +) +app_client6 = factory.get_app_client_by_creator_and_name( + creator_address="CREATORADDRESS", + app_name="NonDefaultAppName", + ignore_cache=True, # Perform fresh indexer lookups + default_sender="SENDER2ADDRESS" +) +``` -All methods for calling an app that support ABI methods (everything except `clear_state`) take a parameter `call_abi_method` which can be used to specify which method to call. -The method selected can be specified explicitly, or allow the client to infer the method where possible, supported values are: +## Creating and deploying an app -* `None`: The default value, when `None` is passed the client will attempt to find any ABI method or bare method that is compatible with the provided arguments -* `False`: Indicates that an ABI method should not be used, and instead a bare method call is made -* `True`: Indicates that an ABI method should be used, and the client will attempt to find an ABI method that is compatible with the provided arguments -* `str`: If a string is provided, it will be interpreted as either an ABI signature specifying a method, or as an ABI method name -* `algosdk.abi.Method`: The specified ABI method will be called -* `ABIReturnSubroutine`: Any type that has a `method_spec` function that returns an `algosd.abi.Method` +Once you have an app factory you can perform the following actions: -### ABI arguments +- `factory.send.bare.create(...)` - Signs and sends a transaction to create an app and returns the result of that call and an `AppClient` instance for the created app +- `factory.deploy(...)` - Uses the creator address and app name pattern to find if the app has already been deployed or not and either creates, updates or replaces that app based on the deployment rules (i.e. it's an idempotent deployment) and returns the result of the deployment and an `AppClient` instance for the created/updated/existing app. -ABI arguments are passed as python keyword arguments e.g. to pass the ABI parameter `name` for the ABI method `hello` the following syntax is used `client.call("hello", name="world")` +> See {py:func}`API docs ` for details on parameter signatures. -### Transaction Parameters +### Create -All methods for calling an app take an optional `transaction_parameters` argument, with the following supported parameters: +The create method is a wrapper over the `app_create` (bare calls) and `app_create_method_call` (ABI method calls) methods, with the following differences: -* `signer`: The `TransactionSigner` to use on the call. This overrides any signer specified on the client -* `sender`: The address of the sender to use on the call, must be able to be signed for by the `signer`. This overrides any sender specified on the client -* `suggested_params`: `SuggestedParams` to use on the call. This overrides any suggested_params specified on the client -* `note`: Note to include in the transaction -* `lease`: Lease parameter for the transaction -* `boxes`: A sequence of boxes to use in the transaction, this is a list of (app_index, box_name) tuples `[(0, "box_name"), (0, ...)]` -* `accounts`: Account references to include in the transaction -* `foreign_apps`: Foreign apps to include in the transaction -* `foreign_assets`: Foreign assets to include in the transaction -* `on_complete`: The on complete action to use for the transaction, only available when using `call` or `create` -* `extra_pages`: Additional pages to allocate when calling `create`, by default a sufficient amount will be calculated based on the current approval and clear. This can be overridden, if more is required - for a future update +- You don't need to specify the `approval_program`, `clear_state_program`, or `schema` because these are all specified or calculated from the app spec +- `sender` is optional and if not specified then the `default_sender` from the `AppFactory` constructor is used +- `deploy_time_params`, `updatable` and `deletable` can be passed in to control deploy-time parameter replacements and deploy-time immutability and permanence control. Note these are consolidated under the `compilation_params` `TypedDict`, see {py:func}`API docs ` for details. -Parameters can be passed as one of the dataclasses `CommonCallParameters`, `OnCompleteCallParameters`, `CreateCallParameters` (exact type depends on method used) ```python -client.call("hello", transaction_parameters=algokit_utils.OnCompleteCallParameters(signer=...)) +# Use no-argument bare-call +result, app_client = factory.send.bare.create() + +# Specify parameters for bare-call and override other parameters +result, app_client = factory.send.bare.create( + params=AppClientBareCallParams( + args=[bytes([1, 2, 3, 4])], + static_fee=AlgoAmount.from_microalgos(3000), + on_complete=OnComplete.OptIn, + ), + compilation_params={ + "deploy_time_params": { + "ONE": 1, + "TWO": "two", + }, + "updatable": True, + "deletable": False, + } +) + +# Specify parameters for ABI method call +result, app_client = factory.send.create( + AppClientMethodCallParams( + method="create_application", + args=[1, "something"] + ) +) ``` -Alternatively, parameters can be passed as a dictionary e.g. +## Updating and deleting an app + +Deploy method aside, the ability to make update and delete calls happens after there is an instance of an app created via `AppClient`. The semantics of this are no different than other calls, with the caveat that the update call is a bit different since the code will be compiled when constructing the update params and the update calls thus optionally takes compilation parameters (`compilation_params`) for deploy-time parameter replacements and deploy-time immutability and permanence control. + +## Calling the app + +You can construct a params object, transaction(s) and sign and send a transaction to call the app that a given `AppClient` instance is pointing to. + +This is done via the following properties: + +- `app_client.params.{method}(params)` - Params for an ABI method call +- `app_client.params.bare.{method}(params)` - Params for a bare call +- `app_client.create_transaction.{method}(params)` - Transaction(s) for an ABI method call +- `app_client.create_transaction.bare.{method}(params)` - Transaction for a bare call +- `app_client.send.{method}(params)` - Sign and send an ABI method call +- `app_client.send.bare.{method}(params)` - Sign and send a bare call + +Where `{method}` is one of: + +- `update` - An update call +- `opt_in` - An opt-in call +- `delete` - A delete application call +- `clear_state` - A clear state call (note: calls the clear program and only applies to bare calls) +- `close_out` - A close-out call +- `call` - A no-op call (or other call if `on_complete` is specified to anything other than update) + ```python -client.call("hello", transaction_parameters={"signer":...}) +call1 = app_client.send.update( + AppClientMethodCallParams( + method="update_abi", + args=["string_io"], + ), + compilation_params={"deploy_time_params": deploy_time_params} +) + +call2 = app_client.send.delete( + AppClientMethodCallParams( + method="delete_abi", + args=["string_io"] + ) +) + +call3 = app_client.send.opt_in( + AppClientMethodCallParams(method="opt_in") +) + +call4 = app_client.send.bare.clear_state() + +transaction = app_client.create_transaction.bare.close_out( + AppClientBareCallParams( + args=[bytes([1, 2, 3])] + ) +) + +params = app_client.params.opt_in( + AppClientMethodCallParams(method="optin") +) ``` -## Composing calls +## Funding the app account -If multiple calls need to be made in a single transaction, the `compose_` method variants can be used. All these methods take an `AtomicTransactionComposer` as their first argument. -Once all the calls have been added to the ATC, it can then be executed. For example: +Often there is a need to fund an app account to cover minimum balance requirements for boxes and other scenarios. There is an app client method that will do this for you via `fund_app_account(params)`. -```python -from algokit_utils import ApplicationClient -from algosdk.atomic_transaction_composer import AtomicTransactionComposer +The input parameters are: -client = ApplicationClient(...) -atc = AtomicTransactionComposer() -client.compose_call(atc, "hello", name="world") -... # additional compose calls +- A `FundAppAccountParams` object, which has the same properties as a payment transaction except `receiver` is not required and `sender` is optional (if not specified then it will be set to the app client's default sender if configured). -response = client.execute_atc(atc) +Note: If you are passing the funding payment in as an ABI argument so it can be validated by the ABI method then you'll want to get the funding call as a transaction, e.g.: + +```python +result = app_client.send.call( + AppClientMethodCallParams( + method="bootstrap", + args=[ + app_client.create_transaction.fund_app_account( + FundAppAccountParams( + amount=AlgoAmount.from_microalgos(200_000) + ) + ) + ], + box_references=["Box1"] + ) +) ``` +You can also get the funding call as a params object via `app_client.params.fund_app_account(params)`. ## Reading state +`AppClient` has a number of mechanisms to read state (global, local and box storage) from the app instance. + +### App spec methods + +The ARC-56 app spec can specify detailed information about the encoding format of state values and as such allows for a more advanced ability to automatically read state values and decode them as their high-level language types rather than the limited `int` / `bytes` / `str` ability that the generic methods give you. + +You can access this functionality via: + +- `app_client.state.global_state.{method}()` - Global state +- `app_client.state.local_state(address).{method}()` - Local state +- `app_client.state.box.{method}()` - Box storage + +Where `{method}` is one of: + +- `get_all()` - Returns all single-key state values in a dict keyed by the key name and the value a decoded ABI value. +- `get_value(name)` - Returns a single state value for the current app with the value a decoded ABI value. +- `get_map_value(map_name, key)` - Returns a single value from the given map for the current app with the value a decoded ABI value. Key can either be bytes with the binary value of the key value on-chain (without the map prefix) or the high level (decoded) value that will be encoded to bytes for the app spec specified `key_type` +- `get_map(map_name)` - Returns all map values for the given map in a key=>value dict. It's recommended that this is only done when you have a unique `prefix` for the map otherwise there's a high risk that incorrect values will be included in the map. + +```python +values = app_client.state.global_state.get_all() +value = app_client.state.local_state("ADDRESS").get_value("value1") +map_value = app_client.state.box.get_map_value("map1", "mapKey") +map_dict = app_client.state.global_state.get_map("myMap") +``` + +### Generic methods + There are various methods defined that let you read state from the smart contract app: -* `get_global_state` - Gets the current global state of the app -* `get_local_state` - Gets the current local state for the given account address +- `get_global_state()` - Gets the current global state using {py:func}`algorand.app.get_global_state `. +- `get_local_state(address: str)` - Gets the current local state for the given account address using {py:func}`algorand.app.get_local_state `. +- `get_box_names()` - Gets the current box names using {py:func}`algorand.app.get_box_names `. +- `get_box_value(name)` - Gets the current value of the given box using {py:func}`algorand.app.get_box_value `. +- `get_box_value_from_abi_type(name)` - Gets the current value of the given box from an ABI type using {py:func}`algorand.app.get_box_value_from_abi_type `. +- `get_box_values(filter)` - Gets the current values of the boxes using {py:func}`algorand.app.get_box_values `. +- `get_box_values_from_abi_type(type, filter)` - Gets the current values of the boxes from an ABI type using {py:func}`algorand.app.get_box_values_from_abi_type `. + +```python +global_state = app_client.get_global_state() +local_state = app_client.get_local_state("ACCOUNTADDRESS") + +box_name: BoxReference = BoxReference(app_id=app_client.app_id, name="my-box") +box_name2: BoxReference = BoxReference(app_id=app_client.app_id, name="my-box2") + +box_names = app_client.get_box_names() +box_value = app_client.get_box_value(box_name) +box_values = app_client.get_box_values([box_name, box_name2]) +box_abi_value = app_client.get_box_value_from_abi_type( + box_name, + algosdk.ABIStringType +) +box_abi_values = app_client.get_box_values_from_abi_type( + [box_name, box_name2], + algosdk.ABIStringType +) +``` ## Handling logic errors and diagnosing errors -Often when calling a smart contract during development you will get logic errors that cause an exception to throw. This may be because of a failing assertion, a lack of fees, -exhaustion of opcode budget, or any number of other reasons. +Often when calling a smart contract during development you will get logic errors that cause an exception to throw. This may be because of a failing assertion, a lack of fees, exhaustion of opcode budget, or any number of other reasons. When this occurs, you will generally get an error that looks something like: `TransactionPool.Remember: transaction {TRANSACTION_ID}: logic eval error: {ERROR_MESSAGE}. Details: pc={PROGRAM_COUNTER_VALUE}, opcodes={LIST_OF_OP_CODES}`. -The information in that error message can be parsed and when combined with the [source map from compilation](./app-deploy.md#compilation-and-template-substitution) you can expose debugging -information that makes it much easier to understand what's happening. +The information in that error message can be parsed and when combined with the [source map from compilation](./app-deploy.md#compilation-and-template-substitution) you can expose debugging information that makes it much easier to understand what's happening. The ARC-56 app spec, if provided, can also specify human-readable error messages against certain program counter values and further augment the error message. + +The app client and app factory automatically provide this functionality for all smart contract calls. They also expose a function that can be used for any custom calls you manually construct and need to add into your own try/catch `expose_logic_error(e: Error, is_clear: bool = False)`. -When an error is thrown then the resulting error that is re-thrown will be a `LogicError`, which has the following fields: +When an error is thrown then the resulting error that is re-thrown will be a {py:obj}`LogicError `, which has the following fields: -* `logic_error`: Original exception -* `program`: Program source (if available) -* `source_map`: Source map used (if available) -* `transaction_id`: Transaction ID of failing transaction -* `message`: The error message -* `line_no`: The line number in the TEAL program that -* `traces`: A list of Trace objects providing additional insights on simulation when debug mode is active. +- `logic_error: Exception` - The original logic error exception +- `logic_error_str: str` - The string representation of the logic error +- `program: str` - The TEAL program source code +- `source_map: AlgoSourceMap | None` - The source map if available +- `transaction_id: str` - The transaction ID that triggered the error +- `message: str` - Combined error message with debugging information +- `pc: int` - The program counter value where error occurred +- `traces: list[SimulationTrace] | None` - Simulation traces if debug enabled +- `line_no: int | None` - The line number in the TEAL source code +- `lines: list[str]` - The TEAL program split into individual lines -The function `trace()` will provide a formatted output of the surrounding TEAL where the error occurred. +Note: This information will only show if the app client / app factory has a source map. This will occur if: -```{note} -The extended information will only show if the Application Client has a source map. This will occur if: +- You have called `create`, `update` or `deploy` +- You have called `import_source_maps(source_maps)` and provided the source maps (which you can get by calling `export_source_maps()` after variously calling `create`, `update`, or `deploy` and it returns a serialisable value) +- You had source maps present in an app factory and then used it to [create an app client](#dynamically-creating-clients-for-a-given-app-spec) (they are automatically passed through) -1.) The ApplicationClient instance has already called, `create, `update` or `deploy` OR -2.) `template_values` are provided when creating the ApplicationClient, so a SourceMap can be obtained automatically OR -3.) `approval_source_map` on `ApplicationClient` has been set from a previously compiled approval program OR -4.) A source map has been exported/imported using `export_source_map`/`import_source_map`""" +If you want to go a step further and automatically issue a [simulated transaction](https://algorand.github.io/js-algorand-sdk/classes/modelsv2.SimulateTransactionResult.html) and get trace information when there is an error when an ABI method is called you can turn on debug mode: + +```python +config.configure(debug=True) ``` -### Debug Mode and traces Field -When debug mode is active, the LogicError will contain a field named traces. This field will include raw simulate execution traces, providing a detailed account of the transaction simulation. These traces are crucial for diagnosing complex issues and are automatically included in all application client calls when debug mode is active. +If you do that then the exception will have the `traces` property within the underlying exception will have key information from the simulation within it and this will get populated into the `led.traces` property of the thrown error. + +When this debug flag is set, it will also emit debugging symbols to allow break-point debugging of the calls if the [project root is also configured](./debugging.md). + +## Default arguments -```{note} -Remember to enable debug mode (`config.debug = True`) to include raw simulate execution traces in the `LogicError`. -``` \ No newline at end of file +If an ABI method call specifies default argument values for any of its arguments you can pass in `None` for the value of that argument for the default value to be automatically populated. diff --git a/docs/html/_sources/capabilities/app-deploy.md.txt b/docs/html/_sources/capabilities/app-deploy.md.txt index d041576e..3f85dd52 100644 --- a/docs/html/_sources/capabilities/app-deploy.md.txt +++ b/docs/html/_sources/capabilities/app-deploy.md.txt @@ -1,19 +1,16 @@ # App deployment -Idempotent (safely retryable) deployment of an app, including deploy-time immutability and permanence control and TEAL template substitution +AlgoKit contains advanced smart contract deployment capabilities that allow you to have idempotent (safely retryable) deployment of a named app, including deploy-time immutability and permanence control and TEAL template substitution. This allows you to control the smart contract development lifecycle of a single-instance app across multiple environments (e.g. LocalNet, TestNet, MainNet). -App deployment is a higher-order use case capability provided by AlgoKit Utils that builds on top of the core capabilities, -particularly [App management](./app-client.md). It allows you to idempotently (with safe retryability) deploy an app, including deploy-time immutability and permanence control and -TEAL template substitution. +It's optional to use this functionality, since you can construct your own deployment logic using create / update / delete calls and your own mechanism to maintaining app metadata (like app IDs etc.), but this capability is an opinionated out-of-the-box solution that takes care of the heavy lifting for you. -To see some usage examples check out the [automated tests](https://github.com/algorandfoundation/algokit-utils-py/blob/main/tests/test_deploy_scenarios.py). +App deployment is a higher-order use case capability provided by AlgoKit Utils that builds on top of the core capabilities, particularly [App management](./app.md). -(design)= +To see some usage examples check out the [automated tests](https://github.com/algorandfoundation/algokit-utils-py/blob/main/tests/test_deploy_scenarios.py). -## Design +## Smart contract development lifecycle -The architecture design behind app deployment is articulated in an [architecture decision record](https://github.com/algorandfoundation/algokit-cli/blob/main/docs/architecture-decisions/2023-01-12_smart-contract-deployment.md). -While the implementation will naturally evolve over time and diverge from this record, the principles and design goals behind the design are comprehensively explained. +The design behind the deployment capability is unique. The architecture design behind app deployment is articulated in an [architecture decision record](https://github.com/algorandfoundation/algokit-cli/blob/main/docs/architecture-decisions/2023-01-12_smart-contract-deployment.md). While the implementation will naturally evolve over time and diverge from this record, the principles and design goals behind the design are comprehensively explained. Namely, it described the concept of a smart contract development lifecycle: @@ -36,86 +33,182 @@ The App deployment capability provided by AlgoKit Utils helps implement **#2 Dep Furthermore, the implementation contains the following implementation characteristics per the original architecture design: - Deploy-time parameters can be provided and substituted into a TEAL Template by convention (by replacing `TMPL_{KEY}`) -- Contracts can be built by any smart contract framework that supports [ARC-0032](https://arc.algorand.foundation/ARCs/arc-0032) and - [ARC-0004](https://arc.algorand.foundation/ARCs/arc-0004) ([Beaker](https://beaker.algo.xyz/) or otherwise), which also means the deployment language can be - different to the development language e.g. you can deploy a Python smart contract with TypeScript for instance -- There is explicit control of the immutability (updatability / upgradeability) and permanence (deletability) of the smart contract, which can be varied per environment to allow for easier - development and testing in non-MainNet environments (by replacing `TMPL_UPDATABLE` and `TMPL_DELETABLE` at deploy-time by convention, if present) -- Contracts are resolvable by a string "name" for a given creator to allow automated determination of whether that contract had been deployed previously or not, but can also be resolved by ID - instead +- Contracts can be built by any smart contract framework that supports [ARC-56](https://github.com/algorandfoundation/ARCs/blob/main/ARCs/arc-0056.md) and [ARC-32](https://github.com/algorandfoundation/ARCs/pull/150), which also means the deployment language can be different to the development language e.g. you can deploy a Python smart contract with TypeScript for instance +- There is explicit control of the immutability (updatability / upgradeability) and permanence (deletability) of the smart contract, which can be varied per environment to allow for easier development and testing in non-MainNet environments (by replacing `TMPL_UPDATABLE` and `TMPL_DELETABLE` at deploy-time by convention, if present) +- Contracts are resolvable by a string "name" for a given creator to allow automated determination of whether that contract had been deployed previously or not, but can also be resolved by ID instead + +This design allows you to have the same deployment code across environments without having to specify an ID for each environment. This makes it really easy to apply [continuous delivery](https://continuousdelivery.com/) practices to your smart contract deployment and make the deployment process completely automated. + +## `AppDeployer` -## Finding apps by creator +The {py:obj}`AppDeployer ` is a class that is used to manage app deployments and deployment metadata. -There is a method `algokit.get_creator_apps(creatorAccount, indexer)`, which performs a series of indexer lookups that return all apps created by the given creator. These are indexed by the name it -was deployed under if the creation transaction contained the following payload in the transaction note field: +To get an instance of `AppDeployer` you can use either [`AlgorandClient`](./algorand-client.md) via `algorand.appDeployer` or instantiate it directly (passing in an [`AppManager`](./app.md#appmanager), [`AlgorandClientTransactionSender`](./algorand-client.md#sending-a-single-transaction) and optionally an indexer client instance): +```python +from algokit_utils.app_deployer import AppDeployer + +app_deployer = AppDeployer(app_manager, transaction_sender, indexer) ``` -ALGOKIT_DEPLOYER:j{name:string, version:string, updatable?:boolean, deletable?:boolean} + +## Deployment metadata + +When AlgoKit performs a deployment of an app it creates metadata to describe that deployment and includes this metadata in an [ARC-2](https://github.com/algorandfoundation/ARCs/blob/main/ARCs/arc-0002.md) transaction note on any creation and update transactions. + +The deployment metadata is defined in {py:obj}`AppDeployMetadata `, which is an object with: + +- `name: str` - The unique name identifier of the app within the creator account +- `version: str` - The version of app that is / will be deployed; can be an arbitrary string, but we recommend using [semver](https://semver.org/) +- `deletable: bool | None` - Whether or not the app is deletable (`true`) / permanent (`false`) / unspecified (`None`) +- `updatable: bool | None` - Whether or not the app is updatable (`true`) / immutable (`false`) / unspecified (`None`) + +An example of the ARC-2 transaction note that is attached as an app creation / update transaction note to specify this metadata is: + +``` +ALGOKIT_DEPLOYER:j{name:"MyApp",version:"1.0",updatable:true,deletable:false} ``` -Any creation transactions or update transactions are then retrieved and processed in chronological order to result in an `AppLookup` object +## Lookup deployed apps by name -Given there are a number of indexer calls to retrieve this data it's a non-trivial object to create, and it's recommended that for the duration you are performing a single deployment -you hold a value of it rather than recalculating it. Most AlgoKit Utils functions that need it will also take an optional value of it that will be used in preference to retrieving a -fresh version. +In order to resolve what apps have been previously deployed and their metadata, AlgoKit provides a method that does a series of indexer lookups and returns a map of name to app metadata via `get_creator_apps_by_name(creator_address)`. -## Deploying an application +```python +app_lookup = algorand.app_deployer.get_creator_apps_by_name("CREATORADDRESS") +app1_metadata = app_lookup.apps["app1"] +``` -The method that performs the deployment logic is the instance method `ApplicationClient.deploy`. It performs an idempotent (safely retryable) deployment. It will detect if the app already -exists and if it doesn't it will create it. If the app does already exist then it will: +This method caches the result of the lookup, since it's a reasonably heavyweight call (N+1 indexer calls for N deployed apps by the creator). If you want to skip the cache to get a fresh version then you can pass in a second parameter `ignore_cache=True`. This should only be needed if you are performing parallel deployments outside of the current `AppDeployer` instance, since it will keep its cache updated based on its own deployments. -- Detect if the app has been updated (i.e. the logic has changed) and either fail or perform either an update or a replacement based on the deployment configuration. -- Detect if the app has a breaking schema change (i.e. more global or local storage is needed than was originally requested) and either fail or perform a replacement based on the - deployment configuration. +The return type of `get_creator_apps_by_name` is {py:obj}`ApplicationLookup `, which is an object with: -It will automatically add metadata to the transaction note of the create or update calls that indicates the name, version, updatability and deletability of the contract. -This metadata works in concert with `get_creator_apps` to allow the app to be reliably retrieved against that creator in it's currently deployed state. +```python +@dataclasses.dataclass +class ApplicationLookup: + creator: str + apps: dict[str, ApplicationMetaData] = dataclasses.field(default_factory=dict) +``` -`deploy` automatically executes [template substitution](#compilation-and-template-substitution) including deploy-time control of permanence and immutability. +The `apps` property contains a lookup by app name that resolves to the current {py:obj}`ApplicationMetaData `. + +> Refer to the {py:obj}`ApplicationLookup ` for latest information on exact types. + +## Performing a deployment + +In order to perform a deployment, AlgoKit provides the {py:meth}`deploy ` method. + +For example: + +```python +deployment_result = algorand.app_deployer.deploy( + AppDeployParams( + metadata=AppDeploymentMetaData( + name="MyApp", + version="1.0.0", + deletable=False, + updatable=False, + ), + create_params=AppCreateParams( + sender="CREATORADDRESS", + approval_program=approval_teal_template_or_byte_code, + clear_state_program=clear_state_teal_template_or_byte_code, + schema=StateSchema( + global_ints=1, + global_byte_slices=2, + local_ints=3, + local_byte_slices=4, + ), + # Other parameters if a create call is made... + ), + update_params=AppUpdateParams( + sender="SENDERADDRESS", + # Other parameters if an update call is made... + ), + delete_params=AppDeleteParams( + sender="SENDERADDRESS", + # Other parameters if a delete call is made... + ), + deploy_time_params={ + "VALUE": 1, # TEAL template variables to replace + }, + on_schema_break=OnSchemaBreak.Append, + on_update=OnUpdate.Update, + send_params=SendParams( + populate_app_call_resources=True, + # Other execution control parameters + ), + ) +) +``` + +This method performs an idempotent (safely retryable) deployment. It will detect if the app already exists and if it doesn't it will create it. If the app does already exist then it will: + +- Detect if the app has been updated (i.e. the program logic has changed) and either fail, perform an update, deploy a new version or perform a replacement (delete old app and create new app) based on the deployment configuration. +- Detect if the app has a breaking schema change (i.e. more global or local storage is needed than were originally requested) and either fail, deploy a new version or perform a replacement (delete old app and create new app) based on the deployment configuration. + +It will automatically [add metadata to the transaction note of the create or update transactions](#deployment-metadata) that indicates the name, version, updatability and deletability of the contract. This metadata works in concert with [`appDeployer.get_creator_apps_by_name`](#lookup-deployed-apps-by-name) to allow the app to be reliably retrieved against that creator in it's currently deployed state. It will automatically update it's lookup cache so subsequent calls to `get_creator_apps_by_name` or `deploy` will use the latest metadata without needing to call indexer again. + +`deploy` also automatically executes [template substitution](#compilation-and-template-substitution) including deploy-time control of permanence and immutability if the requisite template parameters are specified in the provided TEAL template. ### Input parameters -The following inputs are used when deploying an App +The first parameter `deployment` is an {py:obj}`AppDeployParams `, which is an object with: -- `version`: The version string for the app defined in app_spec, if not specified the version will automatically increment for existing apps that are updated, and set to 1.0 for new apps -- `signer`, `sender`: Optional signer and sender for deployment operations, sender must be the same as the creator specified -- `allow_update`, `allow_delete`: Control the updatability and deletability of the app, used to populate `TMPL_UPDATABLE` and `TMPL_DELETABLE` template values -- `on_update`: Determines what should happen if an update to the smart contract is detected (e.g. the TEAL code has changed since last deployment) -- `on_schema_break`: Determines what should happen if a breaking change to the schema is detected (e.g. if you need more global or local state that was previously requested when the contract was originally created) -- `create_args`: Args to use if a create operation is performed -- `update_args`: Args to use if an update operation is performed -- `delete_args`: Args to use if a delete operation is performed -- `template_values`: Values to use for automatic substitution of [deploy-time parameter values](#design) is mapping of `key: value` that will result in `TMPL_{key}` being replaced with `value` +- `metadata: AppDeployMetadata` - determines the [deployment metadata](#deployment-metadata) of the deployment +- `create_params: AppCreateParams | CreateCallABI` - the parameters for an [app creation call](./app.md) (raw parameters or ABI method call) +- `update_params: AppUpdateParams | UpdateCallABI` - the parameters for an [app update call](./app.md) (raw parameters or ABI method call) without the `app_id`, `approval_program`, or `clear_state_program` as these are handled by the deploy logic +- `delete_params: AppDeleteParams | DeleteCallABI` - the parameters for an [app delete call](./app.md) (raw parameters or ABI method call) without the `app_id` parameter +- `deploy_time_params: TealTemplateParams | None` - optional parameters for [TEAL template substitution](#compilation-and-template-substitution) + - {py:obj}`TealTemplateParams ` is a dict that replaces `TMPL_{key}` with `value` (strings/Uint8Arrays are properly encoded) +- `on_schema_break: OnSchemaBreak | str | None` - determines {py:obj}`OnSchemaBreak ` if schema requirements increase (values: 'replace', 'fail', 'append') +- `on_update: OnUpdate | str | None` - determines {py:obj}`OnUpdate ` if contract logic changes (values: 'update', 'replace', 'fail', 'append') +- `existing_deployments: ApplicationLookup | None` - optional pre-fetched app lookup data to skip indexer queries +- `ignore_cache: bool | None` - if True, bypasses cached deployment metadata +- Additional fields from {py:obj}`SendParams ` - transaction execution parameters ### Idempotency -`deploy` is idempotent which means you can safely call it again multiple times, and it will only apply any changes it detects. If you call it again straight after calling it then it will -do nothing. This also means it can be used to find an existing app based on the supplied creator and app_spec or name. - -(compilation-and-template-substitution)= +`deploy` is idempotent which means you can safely call it again multiple times and it will only apply any changes it detects. If you call it again straight after calling it then it will do nothing. ### Compilation and template substitution -When compiling TEAL template code, the capabilities described in the [design above](#design) are present, namely the ability to supply deploy-time parameters and the ability to control immutability and permanence of the smart contract at deploy-time. +When compiling TEAL template code, the capabilities described in the [above design](#smart-contract-development-lifecycle) are present, namely the ability to supply deploy-time parameters and the ability to control immutability and permanence of the smart contract at deploy-time. -In order for a smart contract to be able to use this functionality, it must have a TEAL Template that contains the following: +In order for a smart contract to opt-in to use this functionality, it must have a TEAL Template that contains the following: -- `TMPL_{key}` - Which can be replaced with a number or a string / byte array which wil be automatically hexadecimal encoded +- `TMPL_{key}` - Which can be replaced with a number or a string / byte array which will be automatically hexadecimal encoded (for any number of `{key}` => `{value}` pairs) - `TMPL_UPDATABLE` - Which will be replaced with a `1` if an app should be updatable and `0` if it shouldn't (immutable) - `TMPL_DELETABLE` - Which will be replaced with a `1` if an app should be deletable and `0` if it shouldn't (permanent) -If you are building a smart contract using the [beaker_production AlgoKit template](https://github.com/algorandfoundation/algokit-beaker-default-template) if provides a reference implementation out of the box for the deploy-time immutability and permanence control. +If you are building a smart contract using the production [AlgoKit init templates](https://github.com/algorandfoundation/algokit-cli/blob/main/docs/features/init.md) provide a reference implementation out of the box for the deploy-time immutability and permanence control. + +If you passed in a TEAL template for the `approval_program` or `clear_state_program` (i.e. a `str` rather than a `bytes`) then `deploy` will return the {py:obj}`CompiledTeal ` of substituting then compiling the TEAL template(s) in the following properties of the return value: + +- `compiled_approval: CompiledTeal | None` +- `compiled_clear: CompiledTeal | None` + +Template substitution is done by executing `algorand.app.compile_teal_template(teal_template_code, template_params, deployment_metadata)`, which in turn calls the following in order and returns the compilation result per above (all of which can also be invoked directly): + +- `AppManager.strip_teal_comments(teal_code)` - Strips out any TEAL comments to reduce the payload that is sent to algod and reduce the likelihood of hitting the max payload limit +- `AppManager.replace_template_variables(teal_template_code, template_values)` - Replaces the template variables by looking for `TMPL_{key}` +- `AppManager.replace_teal_template_deploy_time_control_params(teal_template_code, params)` - If `params` is provided, it allows for deploy-time immutability and permanence control by replacing `TMPL_UPDATABLE` with `params.get("updatable")` if not `None` and replacing `TMPL_DELETABLE` with `params.get("deletable")` if not `None` +- `algorand.app.compile_teal(teal_code)` - Sends the final TEAL to algod for compilation and returns the result including the source map and caches the compilation result within the `AppManager` instance ### Return value -`deploy` returns a `DeployResponse` object, that describes the action taken. - -- `action_taken`: Describes what happened during deployment - - `Create` - The smart contract app is created. - - `Update` - The smart contract app is updated - - `Replace` - The smart contract app was deleted and created again (in an atomic transaction) - - `Nothing` - Nothing was done since an existing up-to-date app was found -- `create_response`: If action taken was `Create` or `Replace`, the result of the create transaction. Can be a `TransactionResponse` or `ABITransactionResponse` depending on the method used -- `update_response`: If action taken was `Update`, the result of the update transaction. Can be a `TransactionResponse` or `ABITransactionResponse` depending on the method used -- `delete_response`: If action taken was `Replace`, the result of the delete transaction. Can be a `TransactionResponse` or `ABITransactionResponse` depending on the method used -- `app`: An `AppMetaData` object, describing the final app state +When `deploy` executes it will return a {py:obj}`AppDeployResult ` object that describes exactly what it did and has comprehensive metadata to describe the end result of the deployed app. + +The `deploy` call itself may do one of the following (which you can determine by looking at the `operation_performed` field on the return value from the function): + +- `OperationPerformed.CREATE` - The smart contract app was created +- `OperationPerformed.UPDATE` - The smart contract app was updated +- `OperationPerformed.REPLACE` - The smart contract app was deleted and created again (in an atomic transaction) +- `OperationPerformed.NOTHING` - Nothing was done since it was detected the existing smart contract app deployment was up to date + +As well as the `operation_performed` parameter and the [optional compilation result](#compilation-and-template-substitution), the return value will have the {py:obj}`ApplicationMetaData ` [fields](#deployment-metadata) present. + +Based on the value of `operation_performed`, there will be other data available in the return value: + +- If `CREATE`, `UPDATE` or `REPLACE` then it will have the relevant {py:obj}`SendAppTransactionResult ` values: + - `create_result` for create operations + - `update_result` for update operations +- If `REPLACE` then it will also have `delete_result` to capture the result of deleting the existing app diff --git a/docs/html/_sources/capabilities/app.md.txt b/docs/html/_sources/capabilities/app.md.txt new file mode 100644 index 00000000..55d30b17 --- /dev/null +++ b/docs/html/_sources/capabilities/app.md.txt @@ -0,0 +1,163 @@ +# App management + +App management is a higher-order use case capability provided by AlgoKit Utils that builds on top of the core capabilities. It allows you to create, update, delete, call (ABI and otherwise) smart contract apps and the metadata associated with them (including state and boxes). + +## `AppManager` + +The `AppManager` is a class that is used to manage app information. To get an instance of `AppManager` you can use either [`AlgorandClient`](./algorand-client.md) via `algorand.app` or instantiate it directly (passing in an algod client instance): + +```python +from algokit_utils import AppManager + +app_manager = AppManager(algod_client) +``` + +## Calling apps + +### App Clients + +The recommended way of interacting with apps is via [App clients](./app-client.md) and [App factory](./app-client.md#appfactory). The methods shown on this page are the underlying mechanisms that app clients use and are for advanced use cases when you want more control. + +### Compilation + +The `AppManager` class allows you to compile TEAL code with caching semantics that allows you to avoid duplicate compilation and keep track of source maps from compiled code. + +```python +# Basic compilation +teal_code = "return 1" +compilation_result = app_manager.compile_teal(teal_code) + +# Get cached compilation result +cached_result = app_manager.get_compilation_result(teal_code) + +# Compile with template substitution +template_code = "int TMPL_VALUE" +template_params = {"VALUE": 1} +compilation_result = app_manager.compile_teal_template( + template_code, + template_params=template_params +) + +# Compile with deployment control (updatable/deletable) +control_template = f"""#pragma version 8 +int {UPDATABLE_TEMPLATE_NAME} +int {DELETABLE_TEMPLATE_NAME}""" +deployment_metadata = {"updatable": True, "deletable": True} +compilation_result = app_manager.compile_teal_template( + control_template, + deployment_metadata=deployment_metadata +) +``` + +The compilation result contains: + +- `teal` - Original TEAL code +- `compiled` - Base64 encoded compiled bytecode +- `compiled_hash` - Hash of compiled bytecode +- `compiled_base64_to_bytes` - Raw bytes of compiled bytecode +- `source_map` - Source map for debugging + +## Accessing state + +### Global state + +To access global state you can use: + +```python +# Get global state for app +global_state = app_manager.get_global_state(app_id) + +# Parse raw state from algod +decoded_state = AppManager.decode_app_state(raw_state) + +# Access state values +key_raw = decoded_state["value1"].key_raw # Raw bytes +key_base64 = decoded_state["value1"].key_base64 # Base64 encoded +value = decoded_state["value1"].value # Parsed value (str or int) +value_raw = decoded_state["value1"].value_raw # Raw bytes if bytes value +value_base64 = decoded_state["value1"].value_base64 # Base64 if bytes value +``` + +### Local state + +To access local state you can use: + +```python +local_state = app_manager.get_local_state(app_id, "ACCOUNT_ADDRESS") +``` + +### Boxes + +To access box storage: + +```python +# Get box names +box_names = app_manager.get_box_names(app_id) + +# Get box values +box_value = app_manager.get_box_value(app_id, box_name) +box_values = app_manager.get_box_values(app_id, [box_name1, box_name2]) + +# Get decoded ABI values +abi_value = app_manager.get_box_value_from_abi_type( + app_id, box_name, algosdk.abi.StringType() +) +abi_values = app_manager.get_box_values_from_abi_type( + app_id, [box_name1, box_name2], algosdk.abi.StringType() +) + +# Get box reference for transaction +box_ref = AppManager.get_box_reference(box_id) +``` + +## Getting app information + +To get app information: + +```python +# Get app info by ID +app_info = app_manager.get_by_id(app_id) + +# Get ABI return value from transaction +abi_return = AppManager.get_abi_return(confirmation, abi_method) +``` + +## Box references + +Box references can be specified in several ways: + +```python +# String name (encoded to bytes) +box_ref = "my_box" + +# Raw bytes +box_ref = b"my_box" + +# Account signer (uses address as name) +box_ref = account_signer + +# Box reference with app ID +box_ref = BoxReference(app_id=123, name=b"my_box") +``` + +## Common app parameters + +When interacting with apps (creating, updating, deleting, calling), there are common parameters that can be passed: + +- `app_id` - ID of the application +- `sender` - Address of transaction sender +- `signer` - Transaction signer (optional) +- `args` - Arguments to pass to the smart contract +- `account_references` - Account addresses to reference +- `app_references` - App IDs to reference +- `asset_references` - Asset IDs to reference +- `box_references` - Box references to load +- `on_complete` - On complete action +- Other common transaction parameters like `note`, `lease`, etc. + +For ABI method calls, additional parameters: + +- `method` - The ABI method to call +- `args` - ABI typed arguments to pass + +See [App client](./app-client.md) for more details on constructing app calls. diff --git a/docs/html/_sources/capabilities/asset.md.txt b/docs/html/_sources/capabilities/asset.md.txt new file mode 100644 index 00000000..731af016 --- /dev/null +++ b/docs/html/_sources/capabilities/asset.md.txt @@ -0,0 +1,134 @@ +# Assets + +The Algorand Standard Asset (ASA) management functions include creating, opting in and transferring assets, which are fundamental to asset interaction in a blockchain environment. + +## `AssetManager` + +The `AssetManager` class provides functionality for managing Algorand Standard Assets (ASAs). It can be accessed through the `AlgorandClient` via `algorand.asset` or instantiated directly: + +```python +from algokit_utils import AssetManager, TransactionComposer +from algosdk.v2client import algod + +asset_manager = AssetManager( + algod_client=algod_client, + new_group=lambda: TransactionComposer() +) +``` + +## Asset Information + +The `AssetManager` provides two key data classes for asset information: + +### `AssetInformation` + +Contains details about an Algorand Standard Asset (ASA): + +```python +@dataclass +class AssetInformation: + asset_id: int # The ID of the asset + creator: str # Address of the creator account + total: int # Total units created + decimals: int # Number of decimal places + default_frozen: bool | None = None # Whether asset is frozen by default + manager: str | None = None # Optional manager address + reserve: str | None = None # Optional reserve address + freeze: str | None = None # Optional freeze address + clawback: str | None = None # Optional clawback address + unit_name: str | None = None # Optional unit name (e.g. ticker) + asset_name: str | None = None # Optional asset name + url: str | None = None # Optional URL for more info + metadata_hash: bytes | None = None # Optional 32-byte metadata hash +``` + +### `AccountAssetInformation` + +Contains information about an account's holding of a particular asset: + +```python +@dataclass +class AccountAssetInformation: + asset_id: int # The ID of the asset + balance: int # Amount held by the account + frozen: bool # Whether frozen for this account + round: int # Round this info was retrieved at +``` + +## Bulk Operations + +The `AssetManager` provides methods for bulk opt-in/opt-out operations: + +### Bulk Opt-In + +```python +# Basic example +result = asset_manager.bulk_opt_in( + account="ACCOUNT_ADDRESS", + asset_ids=[12345, 67890] +) + +# Advanced example with optional parameters +result = asset_manager.bulk_opt_in( + account="ACCOUNT_ADDRESS", + asset_ids=[12345, 67890], + signer=transaction_signer, + note=b"opt-in note", + lease=b"lease", + static_fee=AlgoAmount(1000), + extra_fee=AlgoAmount(500), + max_fee=AlgoAmount(2000), + validity_window=10, + send_params=SendParams(...) +) +``` + +### Bulk Opt-Out + +```python +# Basic example +result = asset_manager.bulk_opt_out( + account="ACCOUNT_ADDRESS", + asset_ids=[12345, 67890] +) + +# Advanced example with optional parameters +result = asset_manager.bulk_opt_out( + account="ACCOUNT_ADDRESS", + asset_ids=[12345, 67890], + ensure_zero_balance=True, + signer=transaction_signer, + note=b"opt-out note", + lease=b"lease", + static_fee=AlgoAmount(1000), + extra_fee=AlgoAmount(500), + max_fee=AlgoAmount(2000), + validity_window=10, + send_params=SendParams(...) +) +``` + +The bulk operations return a list of `BulkAssetOptInOutResult` objects containing: + +- `asset_id`: The ID of the asset opted into/out of +- `transaction_id`: The transaction ID of the opt-in/out + +## Get Asset Information + +### Getting Asset Parameters + +You can get the current parameters of an asset from algod using `get_by_id()`: + +```python +asset_info = asset_manager.get_by_id(12345) +``` + +### Getting Account Holdings + +You can get an account's current holdings of an asset using `get_account_information()`: + +```python +address = "XBYLS2E6YI6XXL5BWCAMOA4GTWHXWENZMX5UHXMRNWWUQ7BXCY5WC5TEPA" +asset_id = 12345 +account_info = asset_manager.get_account_information(address, asset_id) +``` diff --git a/docs/html/_sources/capabilities/client.md.txt b/docs/html/_sources/capabilities/client.md.txt index 851c66ff..00b92731 100644 --- a/docs/html/_sources/capabilities/client.md.txt +++ b/docs/html/_sources/capabilities/client.md.txt @@ -1,29 +1,111 @@ # Client management -Client management is one of the core capabilities provided by AlgoKit Utils. -It allows you to create [algod](https://developer.algorand.org/docs/rest-apis/algod), [indexer](https://developer.algorand.org/docs/rest-apis/indexer) -and [kmd](https://developer.algorand.org/docs/rest-apis/kmd) clients against various networks resolved from environment or specified configuration. +Client management is one of the core capabilities provided by AlgoKit Utils. It allows you to create (auto-retry) [algod](https://developer.algorand.org/docs/rest-apis/algod), [indexer](https://developer.algorand.org/docs/rest-apis/indexer) and [kmd](https://developer.algorand.org/docs/rest-apis/kmd) clients against various networks resolved from environment or specified configuration. -Any AlgoKit Utils function that needs one of these clients will take the underlying `algosdk` classes (`algosdk.v2client.algod.AlgodClient`, `algosdk.v2client.indexer.IndexerClient`, -`algosdk.kmd.KMDClient`) so inline with the [Modularity](../index.md#core-principles) principle you can use existing logic to get instances of these clients without needing to use the -Client management capability if you prefer. +Any AlgoKit Utils function that needs one of these clients will take the underlying algosdk classes (`algosdk.v2client.algod.AlgodClient`, `algosdk.v2client.indexer.IndexerClient`, `algosdk.kmd.KMDClient`) so inline with the [Modularity](../index.md#core-principles) principle you can use existing logic to get instances of these clients without needing to use the Client management capability if you prefer. To see some usage examples check out the [automated tests](https://github.com/algorandfoundation/algokit-utils-py/blob/main/tests/test_network_clients.py). +## `ClientManager` + +The `ClientManager` is a class that is used to manage client instances. + +To get an instance of `ClientManager` you can instantiate it directly: + +```python +from algokit_utils import ClientManager, AlgoSdkClients, AlgoClientConfigs +from algosdk.v2client.algod import AlgodClient + +# Using AlgoSdkClients +algod_client = AlgodClient(...) +algorand_client = ... # Get AlgorandClient instance from somewhere +clients = AlgoSdkClients(algod=algod_client, indexer=indexer_client, kmd=kmd_client) +client_manager = ClientManager(clients, algorand_client) + +# Using AlgoClientConfigs +algod_config = AlgoClientNetworkConfig(server="https://...", token="") +configs = AlgoClientConfigs(algod_config=algod_config) +client_manager = ClientManager(configs, algorand_client) +``` + ## Network configuration -The network configuration is specified using the `AlgoClientConfig` class. This same interface is used to specify the config for algod, indexer and kmd clients. +The network configuration is specified using the `AlgoClientConfig` type. This same type is used to specify the config for [algod](https://developer.algorand.org/docs/sdks/python/), [indexer](https://developer.algorand.org/docs/sdks/python/) and [kmd](https://developer.algorand.org/docs/sdks/python/) SDK clients. There are a number of ways to produce one of these configuration objects: -- Manually creating the object, e.g. `AlgoClientConfig(server="https://myalgodnode.com", token="SECRET_TOKEN")` -- `algokit_utils.get_algonode_config(network, config, token)`: Loads an Algod or indexer config against [Nodely](https://nodely.io/docs/free/start) to either MainNet or TestNet -- `algokit_utils.get_default_localnet_config(configOrPort)`: Loads an Algod, Indexer or Kmd config against [LocalNet](https://github.com/algorandfoundation/algokit-cli/blob/main/docs/features/localnet.md) using the default configuration +- Manually specifying a dataclass, e.g. + + ```python + from algokit_utils import AlgoClientNetworkConfig + + config = AlgoClientNetworkConfig( + server="https://myalgodnode.com", + token="SECRET_TOKEN" # optional + ) + ``` + +- `ClientManager.get_config_from_environment_or_localnet()` - Loads the Algod client config, the Indexer client config and the Kmd config from well-known environment variables or if not found then default LocalNet; this is useful to have code that can work across multiple blockchain environments (including LocalNet), without having to change +- `ClientManager.get_algod_config_from_environment()` - Loads an Algod client config from well-known environment variables +- `ClientManager.get_indexer_config_from_environment()` - Loads an Indexer client config from well-known environment variables; useful to have code that can work across multiple blockchain environments (including LocalNet), without having to change +- `ClientManager.get_algonode_config(network)` - Loads an Algod or indexer config against [AlgoNode free tier](https://nodely.io/docs/free/start) to either MainNet or TestNet +- `ClientManager.get_default_localnet_config()` - Loads an Algod, Indexer or Kmd config against [LocalNet](https://github.com/algorandfoundation/algokit-cli/blob/main/docs/features/localnet.md) using the default configuration ## Clients -Once you have the configuration for a client, to get the client you can use the following functions: +### Creating an SDK client instance + +Once you have the configuration for a client, to get a new client you can use the following functions: + +- `ClientManager.get_algod_client(config)` - Returns an Algod client for the given configuration; the client automatically retries on transient HTTP errors +- `ClientManager.get_indexer_client(config)` - Returns an Indexer client for given configuration +- `ClientManager.get_kmd_client(config)` - Returns a Kmd client for the given configuration + +You can also shortcut needing to write the likes of `ClientManager.get_algod_client(ClientManager.get_algod_config_from_environment())` with environment shortcut methods: + +- `ClientManager.get_algod_client_from_environment()` - Returns an Algod client by loading the config from environment variables +- `ClientManager.get_indexer_client_from_environment()` - Returns an indexer client by loading the config from environment variables +- `ClientManager.get_kmd_client_from_environment()` - Returns a kmd client by loading the config from environment variables + +### Accessing SDK clients via ClientManager instance + +Once you have a `ClientManager` instance, you can access the SDK clients: + +```python +client_manager = ClientManager(algod=algod_client, indexer=indexer_client, kmd=kmd_client) + +algod_client = client_manager.algod +indexer_client = client_manager.indexer +kmd_client = client_manager.kmd +``` + +If the method to create the `ClientManager` doesn't configure indexer or kmd (both of which are optional), then accessing those clients will trigger an error. + +### Creating a TestNet dispenser API client instance + +You can also create a [TestNet dispenser API client instance](./dispenser-client.md) from `ClientManager` too. + +## Automatic retry + +When receiving an Algod or Indexer client from AlgoKit Utils, it will be a special wrapper client that handles retrying transient failures. + +## Network information + +You can get information about the current network you are connected to: + +```python +# Get network information +network = client_manager.network() +print(f"Is mainnet: {network.is_mainnet}") +print(f"Is testnet: {network.is_testnet}") +print(f"Is localnet: {network.is_localnet}") +print(f"Genesis ID: {network.genesis_id}") +print(f"Genesis hash: {network.genesis_hash}") + +# Convenience methods +is_mainnet = client_manager.is_mainnet() +is_testnet = client_manager.is_testnet() +is_localnet = client_manager.is_localnet() +``` -- `algokit_utils.get_algod_client(config)`: Returns an Algod client for the given configuration or if none is provided retrieves a configuration from the environment using `ALGOD_SERVER`, `ALGOD_TOKEN` and optionally `ALGOD_PORT`. -- `algokit_utils.get_indexer_client(config)`: Returns an Indexer client for given configuration or if none is provided retrieves a configuration from the environment using `INDEXER_SERVER`, `INDEXER_TOKEN` and optionally `INDEXER_PORT` -- `algokit_utils.get_kmd_client_from_algod_client(config)`: - Returns a Kmd client based on the provided algod client configuration, with the assumption the KMD services is running on the same host but a different port (either `KMD_PORT` environment variable or `4002` by default) +The first time `network()` is called it will make a HTTP call to algod to get the network parameters, but from then on it will be cached within that `ClientManager` instance for subsequent calls. diff --git a/docs/html/_sources/capabilities/debugging.md.txt b/docs/html/_sources/capabilities/debugging.md.txt new file mode 100644 index 00000000..996cee6b --- /dev/null +++ b/docs/html/_sources/capabilities/debugging.md.txt @@ -0,0 +1,93 @@ +# Debugger + +The AlgoKit Python Utilities package provides a set of debugging tools that can be used to simulate and trace transactions on the Algorand blockchain. These tools and methods are optimized for developers who are building applications on Algorand and need to test and debug their smart contracts via [AlgoKit AVM Debugger extension](https://marketplace.visualstudio.com/items?itemName=algorandfoundation.algokit-avm-vscode-debugger). + +## Configuration + +The `config.py` file contains the `UpdatableConfig` class which manages and updates configuration settings for the AlgoKit project. + +- `debug`: Indicates whether debug mode is enabled. +- `project_root`: The path to the project root directory. Can be ignored if you are using `algokit_utils` inside an `algokit` compliant project (containing `.algokit.toml` file). For non algokit compliant projects, simply provide the path to the folder where you want to store sourcemaps and traces to be used with [`AlgoKit AVM Debugger`](https://github.com/algorandfoundation/algokit-avm-vscode-debugger). Alternatively you can also set the value via the `ALGOKIT_PROJECT_ROOT` environment variable. +- `trace_all`: Indicates whether to trace all operations. Defaults to false, this means that when debug mode is enabled, any (or all) application client calls performed via `algokit_utils` will store responses from `simulate` endpoint. These files are called traces, and can be used with `AlgoKit AVM Debugger` to debug TEAL source codes, transactions in the atomic group and etc. +- `trace_buffer_size_mb`: The size of the trace buffer in megabytes. By default uses 256 megabytes. When output folder containing debug trace files exceedes the size, oldest files are removed to optimize for storage consumption. +- `max_search_depth`: The maximum depth to search for a an `algokit` config file. By default it will traverse at most 10 folders searching for `.algokit.toml` file which will be used to assume algokit compliant project root path. +- `populate_app_call_resources`: Indicates whether to populate app call resources. Defaults to false, which means that when debug mode is enabled, any (or all) application client calls performed via `algokit_utils` will not populate app call resources. +- `logger`: A custom logger to use. Defaults to {py:class}`algokit_utils.config.AlgoKitLogger` instance. + +The `configure` method can be used to set these attributes. + +To enable debug mode in your project you can configure it as follows: + +```python +from algokit_utils.config import config + +config.configure( + debug=True, + project_root=Path("./my-project"), + trace_all=True, + trace_buffer_size_mb=512, + max_search_depth=15, + populate_app_call_resources=True, +) +``` + +## `AlgoKitLogger` + +The `AlgoKitLogger` is a custom logger that is used to log messages in the AlgoKit project. +It is a subclass of the `logging.Logger` class and extends it to provide additional functionality. + +### Suppressing log messages per log call + +To supress log messages for individual log calls you can pass `'suppress_log':True` to the log call's `extra` argument. + +### Suppressing log messages globally + +To supress log messages globally you can configure the config object to use a custom logger that does not log anything. + +```python +config.configure(logger=AlgoKitLogger.get_null_logger()) +``` + +## Debugging Utilities + +When debug mode is enabled, AlgoKit Utils will automatically: + +- Generate transaction traces compatible with the AVM Debugger +- Manage trace file storage with automatic cleanup +- Provide source map generation for TEAL contracts + +The following methods are provided for manual debugging operations: + +- `persist_sourcemaps`: Persists sourcemaps for given TEAL contracts as AVM Debugger-compliant artifacts. Parameters: + + - `sources`: List of TEAL sources to generate sourcemaps for + - `project_root`: Project root directory for storage + - `client`: AlgodClient instance + - `with_sources`: Whether to include TEAL source files (default: True) + +- `simulate_and_persist_response`: Simulates transactions and persists debug traces. Parameters: + - `atc`: AtomicTransactionComposer containing transactions + - `project_root`: Project root directory for storage + - `algod_client`: AlgodClient instance + - `buffer_size_mb`: Maximum trace storage in MB (default: 256) + - `allow_empty_signatures`: Allow unsigned transactions (default: True) + - `allow_unnamed_resources`: Allow unnamed resources (default: True) + - `extra_opcode_budget`: Additional opcode budget + - `exec_trace_config`: Custom trace configuration + - `simulation_round`: Specific round to simulate + +### Trace filename format + +The trace files are named in a specific format to provide useful information about the transactions they contain. The format is as follows: + +``` +${timestamp}_lr${last_round}_${transaction_types}.trace.avm.json +``` + +Where: + +- `timestamp`: The time when the trace file was created, in ISO 8601 format, with colons and periods removed. +- `last_round`: The last round when the simulation was performed. +- `transaction_types`: A string representing the types and counts of transactions in the atomic group. Each transaction type is represented as `${count}${type}`, and different transaction types are separated by underscores. + +For example, a trace file might be named `20220301T123456Z_lr1000_2pay_1axfer.trace.avm.json`, indicating that the trace file was created at `2022-03-01T12:34:56Z`, the last round was `1000`, and the atomic group contained 2 payment transactions and 1 asset transfer transaction. diff --git a/docs/html/_sources/capabilities/dispenser-client.md.txt b/docs/html/_sources/capabilities/dispenser-client.md.txt index 315b52f4..d9370f0a 100644 --- a/docs/html/_sources/capabilities/dispenser-client.md.txt +++ b/docs/html/_sources/capabilities/dispenser-client.md.txt @@ -7,54 +7,85 @@ The TestNet Dispenser Client is a utility for interacting with the AlgoKit TestN To create a Dispenser Client, you need to provide an authorization token. This can be done in two ways: 1. Pass the token directly to the client constructor as `auth_token`. -2. Set the token as an environment variable `ALGOKIT_DISPENSER_ACCESS_TOKEN` (see [docs](https://github.com/algorandfoundation/algokit/blob/main/docs/testnet_api.md#error-handling) on how to obtain the token). +2. Set the token as an environment variable `ALGOKIT_DISPENSER_ACCESS_TOKEN` (see [docs](https://github.com/algorandfoundation/algokit-cli/blob/main/docs/features/dispenser.md#login) on how to obtain the token). If both methods are used, the constructor argument takes precedence. -```py +```python +import algokit_utils + +# With auth token +dispenser = algorand.client.get_testnet_dispenser( + auth_token="your_auth_token", +) + +# With auth token and timeout +dispenser = algorand.client.get_testnet_dispenser( + auth_token="your_auth_token", + request_timeout=2, # seconds +) + +# From environment variables +# i.e. os.environ['ALGOKIT_DISPENSER_ACCESS_TOKEN'] = 'your_auth_token' +dispenser = algorand.client.get_testnet_dispenser_from_environment() + +# Alternatively, you can construct it directly from algokit_utils import TestNetDispenserApiClient # Using constructor argument - client = TestNetDispenserApiClient(auth_token="your_auth_token") # Using environment variable - import os -os.environ["ALGOKIT_DISPENSER_ACCESS_TOKEN"] = "your_auth_token" +os.environ['ALGOKIT_DISPENSER_ACCESS_TOKEN'] = 'your_auth_token' client = TestNetDispenserApiClient() ``` ## Funding an Account -To fund an account with Algos from the dispenser API, use the `fund` method. This method requires the receiver's address, the amount to be funded, and the asset ID. +To fund an account with Algo from the dispenser API, use the `fund` method. This method requires the receiver's address and the amount to be funded. -```py -response = client.fund(address="receiver_address", amount=1000, asset_id=0) +```python +response = dispenser.fund( + receiver="RECEIVER_ADDRESS", + amount=1000, # Amount in microAlgos +) ``` -The `fund` method returns a `FundResponse` object, which contains the transaction ID (`tx_id`) and the amount funded. +The `fund` method returns a `DispenserFundResponse` object, which contains the transaction ID (`tx_id`) and the amount funded. ## Registering a Refund To register a refund for a transaction with the dispenser API, use the `refund` method. This method requires the transaction ID of the refund transaction. -```py -client.refund(refund_txn_id="transaction_id") +```python +dispenser.refund("transaction_id") ``` -> Keep in mind, to perform a refund you need to perform a payment transaction yourself first by send funds back to TestNet Dispenser, then you can invoke this `refund` endpoint and pass the txn_id of your refund txn. You can obtain dispenser address by inspecting the `sender` field of any issued `fund` transaction initiated via [`fund`](#funding-an-account). +> Keep in mind, to perform a refund you need to perform a payment transaction yourself first by sending funds back to TestNet Dispenser, then you can invoke this refund endpoint and pass the txn_id of your refund txn. You can obtain dispenser address by inspecting the sender field of any issued fund transaction initiated via [fund](#funding-an-account). ## Getting Current Limit -To get the current limit for an account with Algos from the dispenser API, use the `get_limit` method. This method requires the account address. +To get the current limit for an account with Algo from the dispenser API, use the `get_limit` method. -```py -response = client.get_limit(address="account_address") +```python +response = dispenser.get_limit() ``` -The `get_limit` method returns a `LimitResponse` object, which contains the current limit amount. +The `get_limit` method returns a `DispenserLimitResponse` object, which contains the current limit amount. ## Error Handling If an error occurs while making a request to the dispenser API, an exception will be raised with a message indicating the type of error. Refer to [Error Handling docs](https://github.com/algorandfoundation/algokit/blob/main/docs/testnet_api.md#error-handling) for details on how you can handle each individual error `code`. + +Here's an example of handling errors: + +```python +try: + response = dispenser.fund( + receiver="RECEIVER_ADDRESS", + amount=1000, + ) +except Exception as e: + print(f"Error occurred: {str(e)}") +``` diff --git a/docs/html/_sources/capabilities/testing.md.txt b/docs/html/_sources/capabilities/testing.md.txt new file mode 100644 index 00000000..bdc6ff7a --- /dev/null +++ b/docs/html/_sources/capabilities/testing.md.txt @@ -0,0 +1,204 @@ +# Testing + +The following is a collection of useful snippets that can help you get started with testing your Algorand applications using AlgoKit utils. For the sake of simplicity, we'll use [pytest](https://docs.pytest.org/en/latest/) in the examples below. + +## Basic Test Setup + +Here's a basic test setup using pytest fixtures that provides common testing utilities: + +```python +import pytest +from algokit_utils import Account, SigningAccount +from algokit_utils.algorand import AlgorandClient +from algokit_utils.models.amount import AlgoAmount + +@pytest.fixture +def algorand() -> AlgorandClient: + """Get an AlgorandClient instance configured for LocalNet""" + return AlgorandClient.default_localnet() + +@pytest.fixture +def funded_account(algorand: AlgorandClient) -> SigningAccount: + """Create and fund a test account with ALGOs""" + new_account = algorand.account.random() + dispenser = algorand.account.localnet_dispenser() + algorand.account.ensure_funded( + new_account, + dispenser, + min_spending_balance=AlgoAmount.from_algos(100), + min_funding_increment=AlgoAmount.from_algos(1) + ) + algorand.set_signer(sender=new_account.address, signer=new_account.signer) + return new_account +``` + +Refer to [pytest fixture scopes](https://docs.pytest.org/en/latest/how-to/fixtures.html#fixture-scopes) for more information on how to control lifecycle of fixtures. + +## Creating Test Assets + +Here's a helper function to create test ASAs (Algorand Standard Assets): + +```python +def generate_test_asset(algorand: AlgorandClient, sender: Account, total: int | None = None) -> int: + """Create a test asset and return its ID""" + if total is None: + total = random.randint(20, 120) + + create_result = algorand.send.asset_create( + AssetCreateParams( + sender=sender.address, + total=total, + decimals=0, + default_frozen=False, + unit_name="TST", + asset_name=f"Test Asset {random.randint(1,100)}", + url="https://example.com", + manager=sender.address, + reserve=sender.address, + freeze=sender.address, + clawback=sender.address, + ) + ) + + return int(create_result.confirmation["asset-index"]) +``` + +## Testing Application Deployments + +Here's how one can test smart contract application deployments: + +```python +def test_app_deployment(algorand: AlgorandClient, funded_account: SigningAccount): + """Test deploying a smart contract application""" + + # Load the application spec + app_spec = Path("artifacts/application.json").read_text() + + # Create app factory + factory = algorand.client.get_app_factory( + app_spec=app_spec, + default_sender=funded_account.address + ) + + # Deploy the app + app_client, deploy_response = factory.deploy( + compilation_params={ + "deletable": True, + "updatable": True, + "deploy_time_params": {"VERSION": 1}, + }, + ) + + # Verify deployment + assert deploy_response.app.app_id > 0 + assert deploy_response.app.app_address +``` + +## Testing Asset Transfers + +Here's how one can test ASA transfers between accounts: + +```python +def test_asset_transfer(algorand: AlgorandClient, funded_account: SigningAccount): + """Test ASA transfers between accounts""" + + # Create receiver account + receiver = algorand.account.random() + algorand.account.ensure_funded( + account_to_fund=receiver, + dispenser_account=funded_account, + min_spending_balance=AlgoAmount.from_algos(1) + ) + + # Create test asset + asset_id = generate_test_asset(algorand, funded_account, 100) + + # Opt receiver into asset + algorand.send.asset_opt_in( + AssetOptInParams( + sender=receiver.address, + asset_id=asset_id, + signer=receiver.signer + ) + ) + + # Transfer asset + transfer_amount = 5 + result = algorand.send.asset_transfer( + AssetTransferParams( + sender=funded_account.address, + receiver=receiver.address, + asset_id=asset_id, + amount=transfer_amount + ) + ) + + # Verify transfer + receiver_balance = algorand.asset.get_account_information(receiver, asset_id) + assert receiver_balance.balance == transfer_amount +``` + +## Testing Application Calls + +Here's how to test application method calls: + +```python +def test_app_method_call(algorand: AlgorandClient, funded_account: SigningAccount): + """Test calling ABI methods on an application""" + + # Deploy application first + app_spec = Path("artifacts/application.json").read_text() + factory = algorand.client.get_app_factory( + app_spec=app_spec, + default_sender=funded_account.address + ) + app_client, _ = factory.deploy() + + # Call application method + result = app_client.send.call( + AppClientMethodCallParams( + method="hello", + args=["world"] + ) + ) + + # Verify result + assert result.abi_return == "Hello, world" +``` + +## Testing Box Storage + +Here's how to test application box storage: + +```python +def test_box_storage(algorand: AlgorandClient, funded_account: SigningAccount): + """Test application box storage""" + + # Deploy application + app_spec = Path("artifacts/application.json").read_text() + factory = algorand.client.get_app_factory( + app_spec=app_spec, + default_sender=funded_account.address + ) + app_client, _ = factory.deploy() + + # Fund app account for box storage MBR + app_client.fund_app_account( + FundAppAccountParams(amount=AlgoAmount.from_algos(1)) + ) + + # Store value in box + box_name = b"test_box" + box_value = "test_value" + app_client.send.call( + AppClientMethodCallParams( + method="set_box", + args=[box_name, box_value], + box_references=[box_name] + ) + ) + + # Verify box value + stored_value = app_client.get_box_value(box_name) + assert stored_value == box_value.encode() +``` diff --git a/docs/html/_sources/capabilities/transaction-composer.md.txt b/docs/html/_sources/capabilities/transaction-composer.md.txt new file mode 100644 index 00000000..ad4ba9a6 --- /dev/null +++ b/docs/html/_sources/capabilities/transaction-composer.md.txt @@ -0,0 +1,345 @@ +# Transaction composer + +The `TransactionComposer` class allows you to easily compose one or more compliant Algorand transactions and execute and/or simulate them. + +It's the core of how the `AlgorandClient` class composes and sends transactions. + +```python +from algokit_utils import TransactionComposer, AppManager +from algokit_utils.transactions import ( + PaymentParams, + AppCallMethodCallParams, + AssetCreateParams, + AppCreateParams, + # ... other transaction parameter types +) +``` + +To get an instance of `TransactionComposer` you can either get it from an app client, from an `AlgorandClient`, or by instantiating via the constructor. + +```python +# From AlgorandClient +composer_from_algorand = algorand.new_group() + +# From AppClient +composer_from_app_client = app_client.algorand.new_group() + +# From constructor +composer_from_constructor = TransactionComposer( + algod=algod, + # Return the TransactionSigner for this address + get_signer=lambda address: signer +) + +# From constructor with optional params +composer_from_constructor = TransactionComposer( + algod=algod, + # Return the TransactionSigner for this address + get_signer=lambda address: signer, + # Custom function to get suggested params + get_suggested_params=lambda: algod.suggested_params(), + # Number of rounds the transaction should be valid for + default_validity_window=1000, + # Optional AppManager instance for TEAL compilation + app_manager=AppManager(algod) +) +``` + +## Constructing a transaction + +To construct a transaction you need to add it to the composer, passing in the relevant params object for that transaction. Params are Python dataclasses aavailable for import from `algokit_utils.transactions`. + +Parameter types include: + +- `PaymentParams` - For ALGO transfers +- `AssetCreateParams` - For creating ASAs +- `AssetConfigParams` - For reconfiguring ASAs +- `AssetTransferParams` - For ASA transfers +- `AssetOptInParams` - For opting in to ASAs +- `AssetOptOutParams` - For opting out of ASAs +- `AssetDestroyParams` - For destroying ASAs +- `AssetFreezeParams` - For freezing ASA balances +- `AppCreateParams` - For creating applications +- `AppCreateMethodCallParams` - For creating applications with ABI method calls +- `AppCallParams` - For calling applications +- `AppCallMethodCallParams` - For calling ABI methods on applications +- `AppUpdateParams` - For updating applications +- `AppUpdateMethodCallParams` - For updating applications with ABI method calls +- `AppDeleteParams` - For deleting applications +- `AppDeleteMethodCallParams` - For deleting applications with ABI method calls +- `OnlineKeyRegistrationParams` - For online key registration transactions +- `OfflineKeyRegistrationParams` - For offline key registration transactions + +The methods to construct a transaction are all named `add_{transaction_type}` and return an instance of the composer so they can be chained together fluently to construct a transaction group. + +For example: + +```python +from algokit_utils import AlgoAmount +from algokit_utils.transactions import AppCallMethodCallParams, PaymentParams + +result = ( + algorand.new_group() + .add_payment(PaymentParams( + sender="SENDER", + receiver="RECEIVER", + amount=AlgoAmount.from_micro_algos(100), + note=b"Payment note" + )) + .add_app_call_method_call(AppCallMethodCallParams( + sender="SENDER", + app_id=123, + method=abi_method, + args=[1, 2, 3], + boxes=[box_reference] # Optional box references + )) +) +``` + +## Simulating a transaction + +Transactions can be simulated using the simulate endpoint in algod, which enables evaluating the transaction on the network without it actually being committed to a block. +This is a powerful feature, which has a number of options which are detailed in the [simulate API docs](https://developer.algorand.org/docs/rest-apis/algod/#post-v2transactionssimulate). + +The `simulate()` method accepts several optional parameters that are passed through to the algod simulate endpoint: + +- `allow_more_logs: bool | None` - Allow more logs than standard +- `allow_empty_signatures: bool | None` - Allow transactions without signatures +- `allow_unnamed_resources: bool | None` - Allow unnamed resources in app calls +- `extra_opcode_budget: int | None` - Additional opcode budget +- `exec_trace_config: SimulateTraceConfig | None` - Execution trace configuration +- `simulation_round: int | None` - Round to simulate at +- `skip_signatures: int | None` - Skip signature verification + +For example: + +```python +result = ( + algorand.new_group() + .add_payment(PaymentParams( + sender="SENDER", + receiver="RECEIVER", + amount=AlgoAmount.from_micro_algos(100) + )) + .add_app_call_method_call(AppCallMethodCallParams( + sender="SENDER", + app_id=123, + method=abi_method, + args=[1, 2, 3] + )) + .simulate() +) + +# Access simulation results +simulate_response = result.simulate_response +confirmations = result.confirmations +transactions = result.transactions +returns = result.returns # ABI returns if any +``` + +### Simulate without signing + +There are situations where you may not be able to (or want to) sign the transactions when executing simulate. +In these instances you should set `skip_signatures=True` which automatically builds empty transaction signers and sets both `fix-signers` and `allow-empty-signatures` to `True` when sending the algod API call. + +For example: + +```python +result = ( + algorand.new_group() + .add_payment(PaymentParams( + sender="SENDER", + receiver="RECEIVER", + amount=AlgoAmount.from_micro_algos(100) + )) + .add_app_call_method_call(AppCallMethodCallParams( + sender="SENDER", + app_id=123, + method=abi_method, + args=[1, 2, 3] + )) + .simulate( + skip_signatures=True, + allow_more_logs=True, # Optional: allow more logs + extra_opcode_budget=700 # Optional: increase opcode budget + ) +) +``` + +### Resource Population + +The `TransactionComposer` includes automatic resource population capabilities for application calls. When sending or simulating transactions, it can automatically detect and populate required references for: + +- Account references +- Application references +- Asset references +- Box references + +This happens automatically when either: + +1. The global `algokit_utils.config` instance is set to `populate_app_call_resources=True` (default is `False`) +2. The `populate_app_call_resources` parameter is explicitly passed as `True` when sending transactions + +```python +# Automatic resource population +result = ( + algorand.new_group() + .add_app_call_method_call(AppCallMethodCallParams( + sender="SENDER", + app_id=123, + method=abi_method, + args=[1, 2, 3] + # Resources will be automatically populated! + )) + .send(params=SendParams(populate_app_call_resources=True)) +) + +# Or disable automatic population +result = ( + algorand.new_group() + .add_app_call_method_call(AppCallMethodCallParams( + sender="SENDER", + app_id=123, + method=abi_method, + args=[1, 2, 3], + # Explicitly specify required resources + account_references=["ACCOUNT"], + app_references=[456], + asset_references=[789], + box_references=[box_reference] + )) + .send(params=SendParams(populate_app_call_resources=False)) +) +``` + +The resource population: + +- Respects the maximum limits (4 for accounts, 8 for foreign references) +- Handles cross-reference resources efficiently (e.g., asset holdings and local state) +- Automatically distributes resources across multiple transactions in a group when needed +- Raises descriptive errors if resource limits are exceeded + +This feature is particularly useful when: + +- Working with complex smart contracts that access various resources +- Building transaction groups where resources need to be coordinated +- Developing applications where resource requirements may change dynamically + +Note: Resource population uses simulation under the hood to detect required resources, so it may add a small overhead to transaction preparation time. + +### Covering App Call Inner Transaction Fees + +`cover_app_call_inner_transaction_fees` automatically calculate the required fee for a parent app call transaction that sends inner transactions. It leverages the simulate endpoint to discover the inner transactions sent and calculates a fee delta to resolve the optimal fee. This feature also takes care of accounting for any surplus transaction fee at the various levels, so as to effectively minimise the fees needed to successfully handle complex scenarios. This setting only applies when you have constucted at least one app call transaction. + +For example: + +```python +myMethod = algosdk.ABIMethod.fromSignature('my_method()void') +result = algorand + .new_group() + .add_app_call_method_call(AppCallMethodCallParams( + sender: 'SENDER', + app_id=123, + method=myMethod, + args=[1, 2, 3], + max_fee=AlgoAmount.from_micro_algo(5000), # NOTE: a maxFee value is required when enabling coverAppCallInnerTransactionFees + )) + .send(send_params={"cover_app_call_inner_transaction_fees": True}) +``` + +Assuming the app account is not covering any of the inner transaction fees, if `my_method` in the above example sends 2 inner transactions, then the fee calculated for the parent transaction will be 3000 µALGO when the transaction is sent to the network. + +The above example also has a `max_fee` of 5000 µALGO specified. An exception will be thrown if the transaction fee execeeds that value, which allows you to set fee limits. The `max_fee` field is required when enabling `cover_app_call_inner_transaction_fees`. + +Because `max_fee` is required and an `algosdk.Transaction` does not hold any max fee information, you cannot use the generic `add_transaction()` method on the composer with `cover_app_call_inner_transaction_fees` enabled. Instead use the below, which provides a better overall experience: + +```python +my_method = algosdk.abi.Method.from_signature('my_method()void') + +# Does not work +result = algorand + .new_group() + .add_transaction(localnet.algorand.create_transaction.app_call_method_call( + AppCallMethodCallParams( + sender='SENDER', + app_id=123, + method=my_method, + args=[1, 2, 3], + max_fee=AlgoAmount.from_micro_algos(5000), # This is only used to create the algosdk.Transaction object and isn't made available to the composer. + ) + ).transactions[0] + ) + .send(send_params={"cover_app_call_inner_transaction_fees": True}) + +# Works as expected +result = algorand + .new_group() + .add_app_call_method_call(AppCallMethodCallParams( + sender='SENDER', + app_id=123, + method=my_method, + args=[1, 2, 3], + max_fee=AlgoAmount.from_micro_algos(5000), + )) + .send(send_params={"cover_app_call_inner_transaction_fees": True}) +``` + +A more complex valid scenario which leverages an app client to send an ABI method call with ABI method call transactions argument is below: + +```python +app_factory = algorand.client.get_app_factory( + app_spec='APP_SPEC', + default_sender=sender.addr, +) + +app_client_1, _ = app_factory.send.bare.create() +app_client_2, _ = app_factory.send.bare.create() + +payment_arg = algorand.create_transaction.payment( + PaymentParams( + sender=sender.addr, + receiver=receiver.addr, + amount=AlgoAmount.from_micro_algos(1), + ) +) + +# Note the use of .params. here, this ensure that maxFee is still available to the composer +app_call_arg = app_client_2.params.call( + AppCallMethodCallParams( + method='my_other_method', + args=[], + max_fee=AlgoAmount.from_micro_algos(2000), + ) +) + +result = app_client_1.algorand + .new_group() + .add_app_call_method_call( + app_client_1.params.call( + AppClientMethodCallParams( + method='my_method', + args=[payment_arg, app_call_arg], + max_fee=AlgoAmount.from_micro_algos(5000), + ) + ), + ) + .send({"cover_app_call_inner_transaction_fees": True}) +``` + +This feature should efficiently calculate the minimum fee needed to execute an app call transaction with inners, however we always recommend testing your specific scenario behaves as expected before releasing. + +#### Read-only calls + +When invoking a readonly method, the transaction is simulated rather than being fully processed by the network. This allows users to call these methods without paying a fee. + +Even though no actual fee is paid, the simulation still evaluates the transaction as if a fee was being paid, therefore op budget and fee coverage checks are still performed. + +Because no fee is actually paid, calculating the minimum fee required to successfully execute the transaction is not required, and therefore we don't need to send an additional simulate call to calculate the minimum fee, like we do with a non readonly method call. + +The behaviour of enabling `cover_app_call_inner_transaction_fees` for readonly method calls is very similar to non readonly method calls, however is subtly different as we use `max_fee` as the transaction fee when executing the readonly method call. + +### Covering App Call Op Budget + +The high level Algorand contract authoring languages all have support for ensuring appropriate app op budget is available via `ensure_budget` in Algorand Python, `ensureBudget` in Algorand TypeScript and `increaseOpcodeBudget` in TEALScript. This is great, as it allows contract authors to ensure appropriate budget is available by automatically sending op-up inner transactions to increase the budget available. These op-up inner transactions require the fees to be covered by an account, which is generally the responsibility of the application consumer. + +Application consumers may not be immediately aware of the number of op-up inner transactions sent, so it can be difficult for them to determine the exact fees required to successfully execute an application call. Fortunately the `cover_app_call_inner_transaction_fees` setting above can be leveraged to automatically cover the fees for any op-up inner transaction that an application sends. Additionally if a contract author decides to cover the fee for an op-up inner transaction, then the application consumer will not be charged a fee for that transaction. diff --git a/docs/html/_sources/capabilities/transaction.md.txt b/docs/html/_sources/capabilities/transaction.md.txt new file mode 100644 index 00000000..e10a8e7b --- /dev/null +++ b/docs/html/_sources/capabilities/transaction.md.txt @@ -0,0 +1,147 @@ +# Transaction management + +Transaction management is one of the core capabilities provided by AlgoKit Utils. It allows you to construct, simulate and send single or grouped transactions with consistent and highly configurable semantics, including configurable control of transaction notes, logging, fees, multiple sender account types, and sending behavior. + +## Transaction Results + +All AlgoKit Utils functions that send transactions return either a `SendSingleTransactionResult` or `SendAtomicTransactionComposerResults`, providing consistent mechanisms to interpret transaction outcomes. + +### SendSingleTransactionResult + +The base `SendSingleTransactionResult` class is used for single transactions: + +```python +@dataclass(frozen=True, kw_only=True) +class SendSingleTransactionResult: + transaction: TransactionWrapper # Last transaction + confirmation: AlgodResponseType # Last confirmation + group_id: str + tx_id: str | None = None # Transaction ID of the last transaction + tx_ids: list[str] # All transaction IDs in the group + transactions: list[TransactionWrapper] + confirmations: list[AlgodResponseType] + returns: list[ABIReturn] | None = None # ABI returns if applicable +``` + +Common variations include: + +- `SendSingleAssetCreateTransactionResult` - Adds `asset_id` +- `SendAppTransactionResult` - Adds `abi_return` +- `SendAppUpdateTransactionResult` - Adds compilation results +- `SendAppCreateTransactionResult` - Adds `app_id` and `app_address` + +### SendAtomicTransactionComposerResults + +When using the atomic transaction composer directly via `TransactionComposer.send()` or `TransactionComposer.simulate()`, you'll receive a `SendAtomicTransactionComposerResults`: + +```python +@dataclass +class SendAtomicTransactionComposerResults: + group_id: str # The group ID if this was a transaction group + confirmations: list[AlgodResponseType] # The confirmation info for each transaction + tx_ids: list[str] # The transaction IDs that were sent + transactions: list[TransactionWrapper] # The transactions that were sent + returns: list[ABIReturn] # The ABI return values from any ABI method calls + simulate_response: dict[str, Any] | None = None # Simulation response if simulated +``` + +### Application-specific Result Types + +When working with applications via `AppClient` or `AppFactory`, you'll get enhanced result types that provide direct access to parsed ABI values: + +- `SendAppFactoryTransactionResult` +- `SendAppUpdateFactoryTransactionResult` +- `SendAppCreateFactoryTransactionResult` + +These types extend the base transaction results to add an `abi_value` field that contains the parsed ABI return value according to the ARC-56 specification. The `Arc56ReturnValueType` can be: + +- A primitive ABI value (bool, int, str, bytes) +- An ABI struct (as a Python dict) +- None (for void returns) + +### Where You'll Encounter Each Result Type + +Different interfaces return different result types: + +1. **Direct Transaction Composer** + + - `TransactionComposer.send()` → `SendAtomicTransactionComposerResults` + - `TransactionComposer.simulate()` → `SendAtomicTransactionComposerResults` + +2. **AlgorandClient Methods** + + - `.send.payment()` → `SendSingleTransactionResult` + - `.send.asset_create()` → `SendSingleAssetCreateTransactionResult` + - `.send.app_call()` → `SendAppTransactionResult` (contains raw ABI return) + - `.send.app_create()` → `SendAppCreateTransactionResult` (with app ID/address) + - `.send.app_update()` → `SendAppUpdateTransactionResult` (with compilation info) + +3. **AppClient Methods** + + - `.call()` → `SendAppTransactionResult` + - `.create()` → `SendAppCreateTransactionResult` + - `.update()` → `SendAppUpdateTransactionResult` + +4. **AppFactory Methods** + - `.create()` → `SendAppCreateFactoryTransactionResult` + - `.call()` → `SendAppFactoryTransactionResult` + - `.update()` → `SendAppUpdateFactoryTransactionResult` + +Example usage with AppFactory for easy access to ABI returns: + +```python +# Using AppFactory +result = app_factory.send.call(AppCallMethodCallParams( + method="my_method", + args=[1, 2, 3], + sender=sender +)) +# Access the parsed ABI return value directly +parsed_value = result.abi_value # Already decoded per ARC-56 spec + +# Compared to base AppClient where you need to parse manually +base_result = app_client.send.call(AppCallMethodCallParams( + method="my_method", + args=[1, 2, 3], + sender=sender +)) +# Need to manually handle ABI return parsing +if base_result.abi_return: + parsed_value = base_result.abi_return.value +``` + +Key differences between result types: + +1. **Base Transaction Results** (`SendSingleTransactionResult`) + + - Focus on transaction confirmation details + - Include group support but optimized for single transactions + - No direct ABI value parsing + +2. **Atomic Transaction Results** (`SendAtomicTransactionComposerResults`) + + - Built for transaction groups + - Include simulation support + - Raw ABI returns via `.returns` + - No single transaction convenience fields + +3. **Application Results** (`SendAppTransactionResult` family) + + - Add application-specific fields (`app_id`, compilation results) + - Include raw ABI returns via `.abi_return` + - Base application transaction support + +4. **Factory Results** (`SendAppFactoryTransactionResult` family) + - Highest level of abstraction + - Direct access to parsed ABI values via `.abi_value` + - Automatic ARC-56 compliant value parsing + - Combines app-specific fields with parsed ABI returns + +## Further reading + +To understand how to create, simulate and send transactions consult: + +- The [`TransactionComposer`](./transaction-composer.md) documentation for composing transaction groups +- The [`AlgorandClient`](./algorand-client.md) documentation for a high-level interface to send transactions + +The transaction composer documentation covers the details of constructing transactions and transaction groups, while the Algorand client documentation covers the high-level interface for sending transactions. diff --git a/docs/html/_sources/capabilities/transfer.md.txt b/docs/html/_sources/capabilities/transfer.md.txt index af28b6d1..2f61e8e2 100644 --- a/docs/html/_sources/capabilities/transfer.md.txt +++ b/docs/html/_sources/capabilities/transfer.md.txt @@ -1,58 +1,151 @@ -# Algo transfers - -Algo transfers is a higher-order use case capability provided by AlgoKit Utils allows you to easily initiate algo transfers between accounts, including dispenser management and -idempotent account funding. - -To see some usage examples check out the [automated tests](https://github.com/algorandfoundation/algokit-utils-py/blob/main/tests/test_transfer.py). - -## Transferring Algos - -The key function to facilitate Algo transfers is `algokit.transfer(algod_client, transfer_parameters)`, which returns the underlying `EnsureFundedResponse` and takes a `TransferParameters` - -The following fields on `TransferParameters` are required to transfer ALGOs: - -- `from_account`: The account or signer that will send the ALGOs -- `to_address`: The address of the account that will receive the ALGOs -- `micro_algos`: The amount of micro ALGOs to send - -## Ensuring minimum Algos - -The ability to automatically fund an account to have a minimum amount of disposable ALGOs to spend is incredibly useful for automation and deployment scripts. -The function to facilitate this is `ensure_funded(client, parameters)`, which takes an `EnsureBalanceParameters` instance and returns the underlying `EnsureFundedResponse` if a payment was made, a string if the dispenser API was used, or None otherwise. - -The following fields on `EnsureBalanceParameters` are required to ensure minimum ALGOs: - -- `account_to_fund`: The account address that will receive the ALGOs. This can be an `Account` instance, an `AccountTransactionSigner` instance, or a string. -- `min_spending_balance_micro_algos`: The minimum balance of micro ALGOs that the account should have available to spend (i.e. on top of minimum balance requirement). -- `min_funding_increment_micro_algos`: When issuing a funding amount, the minimum amount to transfer (avoids many small transfers if this gets called often on an active account). Default is 0. -- `funding_source`: The account (with private key) or signer that will send the ALGOs. If not set, it will use `get_dispenser_account`. This can be an `Account` instance, an `AccountTransactionSigner` instance, [`TestNetDispenserApiClient`](https://github.com/algorandfoundation/algokit-utils-py/blob/main/docs/source/capabilities/dispenser-client.md) instance, or None. -- `suggested_params`: (optional) Transaction parameters, an instance of `SuggestedParams`. -- `note`: (optional) The transaction note, default is "Funding account to meet minimum requirement". -- `fee_micro_algos`: (optional) The flat fee you want to pay, useful for covering extra fees in a transaction group or app call. -- `max_fee_micro_algos`: (optional) The maximum fee that you are happy to pay (default: unbounded). If this is set it's possible the transaction could get rejected during network congestion. - -The function calls Algod to find the current balance and minimum balance requirement, gets the difference between those two numbers and checks to see if it's more than the `min_spending_balance_micro_algos`. If so, it will send the difference, or the `min_funding_increment_micro_algos` if that is specified. If the account is on TestNet and `use_dispenser_api` is True, the [AlgoKit TestNet Dispenser API](https://github.com/algorandfoundation/algokit-cli/blob/main/docs/features/dispenser.md) will be used to fund the account. - -> Please note, if you are attempting to fund via Dispenser API, make sure to set `ALGOKIT_DISPENSER_ACCESS_TOKEN` environment variable prior to invoking `ensure_funded`. To generate the token refer to [AlgoKit CLI documentation](https://github.com/algorandfoundation/algokit-cli/blob/main/docs/features/dispenser.md#login) - -## Transfering Assets - -The key function to facilitate asset transfers is `transfer_asset(algod_client, transfer_parameters)`, which returns a `AssetTransferTxn` and takes a `TransferAssetParameters`: - -The following fields on `TransferAssetParameters` are required to transfer assets: - -- `from_account`: The account or signer that will send the ALGOs -- `to_address`: The address of the account that will receive the ALGOs -- `asset_id`: The asset id that will be transfered -- `amount`: The amount to send as the smallest divisible unit value +# Algo transfers (payments) + +Algo transfers, or [payments](https://developer.algorand.org/docs/get-details/transactions/#payment-transaction), is a higher-order use case capability provided by AlgoKit Utils that builds on top of the core capabilities, particularly [Algo amount handling](./amount.md) and [Transaction management](./transaction.md). It allows you to easily initiate Algo transfers between accounts, including dispenser management and idempotent account funding. + +To see some usage examples check out the automated tests in the repository. + +## `payment` + +The key function to facilitate Algo transfers is `algorand.send.payment(params)` (immediately send a single payment transaction), `algorand.create_transaction.payment(params)` (construct a payment transaction), or `algorand.new_group().add_payment(params)` (add payment to a group of transactions) per [`AlgorandClient`](./algorand-client.md) [transaction semantics](./algorand-client.md#creating-and-issuing-transactions). + +The base type for specifying a payment transaction is `PaymentParams`, which has the following parameters in addition to the [common transaction parameters](./algorand-client.md#transaction-parameters): + +- `receiver: str` - The address of the account that will receive the Algo +- `amount: AlgoAmount` - The amount of Algo to send +- `close_remainder_to: Optional[str]` - If given, close the sender account and send the remaining balance to this address (**warning:** use this carefully as it can result in loss of funds if used incorrectly) + +```python +# Minimal example +result = algorand_client.send.payment( + PaymentParams( + sender="SENDERADDRESS", + receiver="RECEIVERADDRESS", + amount=AlgoAmount(4, "algo") + ) +) + +# Advanced example +result2 = algorand_client.send.payment( + PaymentParams( + sender="SENDERADDRESS", + receiver="RECEIVERADDRESS", + amount=AlgoAmount(4, "algo"), + close_remainder_to="CLOSEREMAINDERTOADDRESS", + lease="lease", + note=b"note", + # Use this with caution, it's generally better to use algorand_client.account.rekey_account + rekey_to="REKEYTOADDRESS", + # You wouldn't normally set this field + first_valid_round=1000, + validity_window=10, + extra_fee=AlgoAmount(1000, "microalgo"), + static_fee=AlgoAmount(1000, "microalgo"), + # Max fee doesn't make sense with extra_fee AND static_fee + # already specified, but here for completeness + max_fee=AlgoAmount(3000, "microalgo"), + # Signer only needed if you want to provide one, + # generally you'd register it with AlgorandClient + # against the sender and not need to pass it in + signer=transaction_signer, + ), + send_params=SendParams( + max_rounds_to_wait=5, + suppress_log=True, + ) +) +``` + +## `ensure_funded` + +The `ensure_funded` function automatically funds an account to maintain a minimum amount of [disposable Algo](https://developer.algorand.org/docs/get-details/accounts/#minimum-balance). This is particularly useful for automation and deployment scripts that get run multiple times and consume Algo when run. + +There are 3 variants of this function: + +- `algorand_client.account.ensure_funded(account_to_fund, dispenser_account, min_spending_balance, options)` - Funds a given account using a dispenser account as a funding source such that the given account has a certain amount of Algo free to spend (accounting for Algo locked in minimum balance requirement). +- `algorand_client.account.ensure_funded_from_environment(account_to_fund, min_spending_balance, options)` - Funds a given account using a dispenser account retrieved from the environment, per the `dispenser_from_environment` method, as a funding source such that the given account has a certain amount of Algo free to spend (accounting for Algo locked in minimum balance requirement). + - **Note:** requires environment variables to be set. + - The dispenser account is retrieved from the account mnemonic stored in `DISPENSER_MNEMONIC` and optionally `DISPENSER_SENDER` + if it's a rekeyed account, or against default LocalNet if no environment variables present. +- `algorand_client.account.ensure_funded_from_testnet_dispenser_api(account_to_fund, dispenser_client, min_spending_balance, options)` - Funds a given account using the [TestNet Dispenser API](https://github.com/algorandfoundation/algokit/blob/main/docs/testnet_api.md) as a funding source such that the account has a certain amount of Algo free to spend (accounting for Algo locked in minimum balance requirement). + +The general structure of these calls is similar, they all take: + +- `account_to_fund: str | Account` - Address or signing account of the account to fund +- The source (dispenser): + - In `ensure_funded`: `dispenser_account: str | Account` - the address or signing account of the account to use as a dispenser + - In `ensure_funded_from_environment`: Not specified, loaded automatically from the ephemeral environment + - In `ensure_funded_from_testnet_dispenser_api`: `dispenser_client: TestNetDispenserApiClient` - a client instance of the TestNet dispenser API +- `min_spending_balance: AlgoAmount` - The minimum balance of Algo that the account should have available to spend (i.e., on top of the minimum balance requirement) +- An `options` object, which has: + - [Common transaction parameters](./algorand-client.md#transaction-parameters) (not for TestNet Dispenser API) + - [Execution parameters](./algorand-client.md#sending-a-single-transaction) (not for TestNet Dispenser API) + - `min_funding_increment: Optional[AlgoAmount]` - When issuing a funding amount, the minimum amount to transfer; this avoids many small transfers if this function gets called often on an active account + +### Examples + +```python +# From account + +# Basic example +algorand_client.account.ensure_funded("ACCOUNTADDRESS", "DISPENSERADDRESS", AlgoAmount(1, "algo")) +# With configuration +algorand_client.account.ensure_funded( + "ACCOUNTADDRESS", + "DISPENSERADDRESS", + AlgoAmount(1, "algo"), + min_funding_increment=AlgoAmount(2, "algo"), + fee=AlgoAmount(1000, "microalgo"), + send_params=SendParams( + suppress_log=True, + ), +) + +# From environment + +# Basic example +algorand_client.account.ensure_funded_from_environment("ACCOUNTADDRESS", AlgoAmount(1, "algo")) +# With configuration +algorand_client.account.ensure_funded_from_environment( + "ACCOUNTADDRESS", + AlgoAmount(1, "algo"), + min_funding_increment=AlgoAmount(2, "algo"), + fee=AlgoAmount(1000, "microalgo"), + send_params=SendParams( + suppress_log=True, + ), +) + +# TestNet Dispenser API + +# Basic example +algorand_client.account.ensure_funded_from_testnet_dispenser_api( + "ACCOUNTADDRESS", + algorand_client.client.get_testnet_dispenser_from_environment(), + AlgoAmount(1, "algo") +) +# With configuration +algorand_client.account.ensure_funded_from_testnet_dispenser_api( + "ACCOUNTADDRESS", + algorand_client.client.get_testnet_dispenser_from_environment(), + AlgoAmount(1, "algo"), + min_funding_increment=AlgoAmount(2, "algo"), +) +``` + +All 3 variants return an `EnsureFundedResponse` (and the first two also return a [single transaction result](./algorand-client.md#sending-a-single-transaction)) if a funding transaction was needed, or `None` if no transaction was required: + +- `amount_funded: AlgoAmount` - The number of Algo that was paid +- `transaction_id: str` - The ID of the transaction that funded the account + +If you are using the TestNet Dispenser API then the `transaction_id` is useful if you want to use the [refund functionality](./dispenser-client.md#registering-a-refund). ## Dispenser -If you want to programmatically send funds then you will often need a "dispenser" account that has a store of ALGOs that can be sent and a private key available for that dispenser account. +If you want to programmatically send funds to an account so it can transact then you will often need a "dispenser" account that has a store of Algo that can be sent and a private key available for that dispenser account. -There is a standard AlgoKit Utils function to get access to a [dispenser account](./account.md#account): `get_dispenser_account`. When running against -[LocalNet](https://github.com/algorandfoundation/algokit-cli/blob/main/docs/features/localnet.md), the dispenser account can be automatically determined using the -[Kmd API](https://developer.algorand.org/docs/rest-apis/kmd). When running against other networks like TestNet or MainNet the mnemonic of the dispenser account can be provided via environment -variable `DISPENSER_MNEMONIC` +There's a number of ways to get a dispensing account in AlgoKit Utils: -Please note that this does not refer to the [AlgoKit TestNet Dispenser API](./dispenser-client.md) which is a separate abstraction that can be used to fund accounts on TestNet via dedicated API service. +- Get a dispenser via [account manager](./account.md#dispenser) - either automatically from [LocalNet](https://github.com/algorandfoundation/algokit-cli/blob/main/docs/features/localnet.md) or from the environment +- By programmatically creating one of the many account types via [account manager](./account.md#accounts) +- By programmatically interacting with [KMD](./account.md#kmd-account-management) if running against LocalNet +- By using the [AlgoKit TestNet Dispenser API client](./dispenser-client.md) which can be used to fund accounts on TestNet via a dedicated API service diff --git a/docs/html/_sources/capabilities/typed-app-clients.md.txt b/docs/html/_sources/capabilities/typed-app-clients.md.txt new file mode 100644 index 00000000..710323c1 --- /dev/null +++ b/docs/html/_sources/capabilities/typed-app-clients.md.txt @@ -0,0 +1,200 @@ +# Typed application clients + +Typed application clients are automatically generated, typed Python deployment and invocation clients for smart contracts that have a defined [ARC-56](https://github.com/algorandfoundation/ARCs/pull/258) or [ARC-32](https://github.com/algorandfoundation/ARCs/blob/main/ARCs/arc-0032.md) application specification so that the development experience is easier with less upskill ramp-up and less deployment errors. These clients give you a type-safe, intellisense-driven experience for invoking the smart contract. + +Typed application clients are the recommended way of interacting with smart contracts. If you don't have/want a typed client, but have an ARC-56/ARC-32 app spec then you can use the [non-typed application clients](./app-client.md) and if you want to call a smart contract you don't have an app spec file for you can use the underlying [app management](./app.md) and [app deployment](./app-deploy.md) functionality to manually construct transactions. + +## Generating an app spec + +You can generate an app spec file: + +- Using [Algorand Python](https://algorandfoundation.github.io/puya/#quick-start) +- Using [TEALScript](https://tealscript.netlify.app/tutorials/hello-world/0004-artifacts/) +- By hand by following the specification [ARC-56](https://github.com/algorandfoundation/ARCs/pull/258)/[ARC-32](https://github.com/algorandfoundation/ARCs/blob/main/ARCs/arc-0032.md) +- Using [Beaker](https://algorand-devrel.github.io/beaker/html/usage.html) (PyTEAL) _(DEPRECATED)_ + +## Generating a typed client + +To generate a typed client from an app spec file you can use [AlgoKit CLI](https://github.com/algorandfoundation/algokit-cli/blob/main/docs/features/generate.md#1-typed-clients): + +``` +> algokit generate client application.json --output /absolute/path/to/client.py +``` + +Note: AlgoKit Utils >= 3.0.0 is compatible with the older 1.x.x generated typed clients, however if you want to utilise the new features or leverage ARC-56 support, you will need to generate using >= 2.x.x. See [AlgoKit CLI generator version pinning](https://github.com/algorandfoundation/algokit-cli/blob/main/docs/features/generate.md#version-pinning) for more information on how to lock to a specific version. + +## Getting a typed client instance + +To get an instance of a typed client you can use an [`AlgorandClient`](./algorand-client.md) instance or a typed app [`Factory`](#creating-a-typed-factory-instance) instance. + +The approach to obtaining a client instance depends on how many app clients you require for a given app spec and if the app has already been deployed, which is summarised below: + +### App is deployed + + + + + + + + + + + + + + + + + + + + + + +
Resolve App by IDResolve App by Creator and Name
Single App Client InstanceMultiple App Client InstancesSingle App Client InstanceMultiple App Client Instances
+ +```python +app_client = algorand.client.get_typed_app_client_by_id(MyContractClient, { + app_id=1234, + # ... +}) +# or +app_client = MyContractClient({ + algorand, + app_id=1234, + # ... +}) +``` + + + +```python +app_client1 = factory.get_app_client_by_id( + app_id=1234, + # ... +) +app_client2 = factory.get_app_client_by_id( + app_id=4321, + # ... +) +``` + + + +```python +app_client = algorand.client.get_typed_app_client_by_creator_and_name( + MyContractClient, + creator_address="CREATORADDRESS", + app_name="contract-name", + # ... +) +# or +app_client = MyContractClient.from_creator_and_name( + algorand, + creator_address="CREATORADDRESS", + app_name="contract-name", + # ... +) +``` + + + +```python +app_client1 = factory.get_app_client_by_creator_and_name( + creator_address="CREATORADDRESS", + app_name="contract-name", + # ... +) +app_client2 = factory.get_app_client_by_creator_and_name( + creator_address="CREATORADDRESS", + app_name="contract-name-2", + # ... +) +``` + +
+ +To understand the difference between resolving by ID vs by creator and name see the underlying [app client documentation](./app-client.md#appclient). + +### App is not deployed + + + + + + + + + + + + + + +
Deploy a New AppDeploy or Resolve App Idempotently by Creator and Name
+ +```python +app_client, response = factory.deploy( + args=[], + # ... +) +# or +app_client, response = factory.send.create.METHODNAME( + args=[], + # ... +) +``` + + + +```python +app_client, response = factory.deploy( + app_name="contract-name", + # ... +) +``` + +
+ +### Creating a typed factory instance + +If your scenario calls for an app factory, you can create one using the below: + +```python +factory = algorand.client.get_typed_app_factory(MyContractFactory) +# or +factory = MyContractFactory(algorand) +``` + +## Client usage + +See the [official usage docs](https://github.com/algorandfoundation/algokit-client-generator-py/blob/main/docs/usage.md) for full details. + +For a simple example that deploys a contract and calls a `"hello"` method, see below: + +```python +# A similar working example can be seen in the AlgoKit init production smart contract templates, when using Python deployment +# In this case the generated factory is called `HelloWorldAppFactory` and is in `./artifacts/HelloWorldApp/client.py` +from artifacts.hello_world_app.client import HelloWorldAppClient, HelloArgs +from algokit_utils import AlgorandClient + +# These require environment variables to be present, or it will retrieve from default LocalNet +algorand = AlgorandClient.from_environment() +deployer = algorand.account.from_environment("DEPLOYER", AlgoAmount.from_algo(1)) + +# Create the typed app factory +factory = algorand.client.get_typed_app_factory(HelloWorldAppFactory, + creator_address=deployer, + default_sender=deployer, +) + +# Create the app and get a typed app client for the created app (note: this creates a new instance of the app every time, +# you can use .deploy() to deploy idempotently if the app wasn't previously +# deployed or needs to be updated if that's allowed) +app_client, response = factory.send.create() + +# Make a call to an ABI method and print the result +response = app_client.send.hello(args=HelloArgs(name="world")) +print(response) +``` diff --git a/docs/html/_sources/index.md.txt b/docs/html/_sources/index.md.txt index ede55d1b..f3378aed 100644 --- a/docs/html/_sources/index.md.txt +++ b/docs/html/_sources/index.md.txt @@ -1,16 +1,14 @@ # AlgoKit Python Utilities -A set of core Algorand utilities written in Python and released via PyPi that make it easier to build solutions on Algorand. -This project is part of [AlgoKit](https://github.com/algorandfoundation/algokit-cli). +A set of core Algorand utilities written in Python and released via PyPi that make it easier to build solutions on Algorand. This project is part of [AlgoKit](https://github.com/algorandfoundation/algokit-cli). -The goal of this library is to provide intuitive, productive utility functions that make it easier, quicker and safer to build applications on Algorand. -Largely these functions wrap the underlying Algorand SDK, but provide a higher level interface with sensible defaults and capabilities for common tasks. +The goal of this library is to provide intuitive, productive utility functions that make it easier, quicker and safer to build applications on Algorand. Largely these functions wrap the underlying Algorand SDK, but provide a higher level interface with sensible defaults and capabilities for common tasks. ```{note} If you prefer TypeScript there's an equivalent [TypeScript utility library](https://github.com/algorandfoundation/algokit-utils-ts). ``` -[Core principles](#core-principles) | [Installation](#installation) | [Usage](#usage) | [Capabilities](#capabilities) | [Reference docs](#reference-documentation) +{ref}`Core principles ` | {ref}`Installation ` | {ref}`Usage ` | {ref}`Config and logging ` | {ref}`Capabilities ` | {ref}`Reference docs ` ```{toctree} --- @@ -19,34 +17,42 @@ caption: Contents --- capabilities/account -capabilities/client +capabilities/algorand-client +capabilities/amount capabilities/app-client capabilities/app-deploy -capabilities/transfer +capabilities/app +capabilities/asset +capabilities/client +capabilities/debugging capabilities/dispenser-client -capabilities/debugger -apidocs/algokit_utils/algokit_utils +capabilities/testing +capabilities/transaction-composer +capabilities/transaction +capabilities/transfer +capabilities/typed-app-clients +v3-migration-guide ``` (core-principles)= # Core principles -This library is designed with the following principles: +This library follows the [Guiding Principles of AlgoKit](https://github.com/algorandfoundation/algokit-cli/blob/main/docs/algokit.md#guiding-principles) and is designed with the following principles: -- **Modularity** - This library is a thin wrapper of modular building blocks over the Algorand SDK; the primitives from the underlying Algorand SDK are - exposed and used wherever possible so you can opt-in to which parts of this library you want to use without having to use an all or nothing approach. -- **Type-safety** - This library provides strong TypeScript support with effort put into creating types that provide good type safety and intellisense. -- **Productivity** - This library is built to make solution developers highly productive; it has a number of mechanisms to make common code easier and terser to write +- **Modularity** - This library is a thin wrapper of modular building blocks over the Algorand SDK; the primitives from the underlying Algorand SDK are exposed and used wherever possible so you can opt-in to which parts of this library you want to use without having to use an all or nothing approach. +- **Type-safety** - This library provides strong type hints with effort put into creating types that provide good type safety and intellisense when used with tools like MyPy. +- **Productivity** - This library is built to make solution developers highly productive; it has a number of mechanisms to make common code easier and terser to write. (installation)= # Installation -This library can be installed from PyPi using pip or poetry, e.g.: +This library can be installed from PyPi using pip or poetry: -``` +```bash pip install algokit-utils +# or poetry add algokit-utils ``` @@ -54,50 +60,96 @@ poetry add algokit-utils # Usage -To use this library simply include the following at the top of your file: +The main entrypoint to the bulk of the functionality in AlgoKit Utils is the `AlgorandClient` class. You can get started by using one of the static initialization methods to create an Algorand client: ```python -import algokit_utils +# Point to the network configured through environment variables or +# if no environment variables it will point to the default LocalNet configuration +algorand = AlgorandClient.from_environment() +# Point to default LocalNet configuration +algorand = AlgorandClient.default_localnet() +# Point to TestNet using AlgoNode free tier +algorand = AlgorandClient.testnet() +# Point to MainNet using AlgoNode free tier +algorand = AlgorandClient.mainnet() +# Point to a pre-created algod client +algorand = AlgorandClient.from_clients(algod=...) +# Point to a pre-created algod and indexer client +algorand = AlgorandClient.from_clients(algod=..., indexer=..., kmd=...) +# Point to custom configuration for algod +algod_config = AlgoClientNetworkConfig(server=..., token=..., port=...) +algorand = AlgorandClient.from_config(algod_config=algod_config) +# Point to custom configuration for algod and indexer and kmd +algod_config = AlgoClientNetworkConfig(server=..., token=..., port=...) +indexer_config = AlgoClientNetworkConfig(server=..., token=..., port=...) +kmd_config = AlgoClientNetworkConfig(server=..., token=..., port=...) +algorand = AlgorandClient.from_config(algod_config=algod_config, indexer_config=indexer_config, kmd_config=kmd_config) ``` -Then you can use intellisense to auto-complete the various functions and types that are available by typing `algokit_utils.` in your favourite Integrated Development Environment (IDE), -or you can refer to the [reference documentation](apidocs/algokit_utils/algokit_utils.md). +# Testing -## Types +AlgoKit Utils provides a dedicated documentation page on various useful snippets that can be reused for testing with tools like [Pytest](https://docs.pytest.org/en/latest/): -The library contains extensive type hinting combined with a tool like MyPy this can help identify issues where incorrect types have been used, or used incorrectly. +- [Testing](capabilities/testing) -(capabilities)= +# Types -# Capabilities +The library leverages Python's native type hints and is fully compatible with [MyPy](https://mypy-lang.org/) for static type checking. -The library helps you with the following capabilities: +All public abstractions and methods are organized in logical modules matching their domain functionality. You can import types either directly from the root module or from their source submodules. Refer to [API documentation](autoapi/index) for more details. -- Core capabilities - - [**Client management**](capabilities/client.md) - Creation of algod, indexer and kmd clients against various networks resolved from environment or specified configuration - - [**Account management**](capabilities/account.md) - Creation and use of accounts including mnemonic, multisig, transaction signer, idempotent KMD accounts and environment variable injected -- Higher-order use cases - - [**ARC-0032 Application Spec client**](capabilities/app-client.md) - Builds on top of the App management and App deployment capabilities to provide a high productivity application client that works with ARC-0032 application spec defined smart contracts (e.g. via Beaker) - - [**App deployment**](capabilities/app-deploy.md) - Idempotent (safely retryable) deployment of an app, including deploy-time immutability and permanence control and TEAL template substitution - - [**Algo transfers**](capabilities/transfer.md) - Ability to easily initiate algo transfers between accounts, including dispenser management and idempotent account funding - - [**Debugger**](capabilities/debugger.md) - Provides a set of debugging tools that can be used to simulate and trace transactions on the Algorand blockchain. These tools and methods are optimized for developers who are building applications on Algorand and need to test and debug their smart contracts via [AVM Debugger extension](https://github.com/algorandfoundation/algokit-avm-vscode-debugger). +(config-logging)= -(reference-documentation)= +# Config and logging -# Reference documentation +To configure the AlgoKit Utils library you can make use of the [`Config`](autoapi/algokit_utils/config/index) object, which has a configure method that lets you configure some or all of the configuration options. + +## Config singleton + +The AlgoKit Utils configuration singleton can be updated using `config.configure()`. Refer to the [Config API documentation](autoapi/algokit_utils/config/index) for more details. + +## Logging -We have [auto-generated reference documentation for the code](apidocs/algokit_utils/algokit_utils.md). +AlgoKit has an in-built logging abstraction through the {py:obj}`algokit_utils.config.AlgoKitLogger` class that provides standardized logging capabilities. The logger is accessible through the `config.logger` property and provides various logging levels. -# Roadmap +Each method supports optional suppression of output using the `suppress_log` parameter. -This library will naturally evolve with any logical developer experience improvements needed to facilitate the [AlgoKit](https://github.com/algorandfoundation/algokit-cli) roadmap as it evolves. +## Debug mode -Likely future capability additions include: +To turn on debug mode you can use the following: -- Typed application client -- Asset management -- Expanded indexer API wrapper support +```python +from algokit_utils.config import config +config.configure(debug=True) +``` + +To retrieve the current debug state you can use `debug` property. + +This will turn on things like automatic tracing, more verbose logging and [advanced debugging](capabilities/debugging). It's likely this option will result in extra HTTP calls to algod and it's worth being careful when it's turned on. + +(capabilities)= -# Indices and tables +# Capabilities + +The library helps you interact with and develop against the Algorand blockchain with a series of end-to-end capabilities as described below: + +- [**AlgorandClient**](./capabilities/algorand-client.md) - The key entrypoint to the AlgoKit Utils functionality +- **Core capabilities** + - [**Client management**](./capabilities/client.md) - Creation of (auto-retry) algod, indexer and kmd clients against various networks resolved from environment or specified configuration, and creation of other API clients (e.g. TestNet Dispenser API and app clients) + - [**Account management**](./capabilities/account.md) - Creation, use, and management of accounts including mnemonic, rekeyed, multisig, transaction signer, idempotent KMD accounts and environment variable injected + - [**Algo amount handling**](./capabilities/amount.md) - Reliable, explicit, and terse specification of microAlgo and Algo amounts and safe conversion between them + - [**Transaction management**](./capabilities/transaction.md) - Ability to construct, simulate and send transactions with consistent and highly configurable semantics, including configurable control of transaction notes, logging, fees, validity, signing, and sending behaviour +- **Higher-order use cases** + - [**Asset management**](./capabilities/asset.md) - Creation, transfer, destroying, opting in and out and managing Algorand Standard Assets + - [**Typed application clients**](./capabilities/typed-app-clients.md) - Type-safe application clients that are [generated](https://github.com/algorandfoundation/algokit-cli/blob/main/docs/features/generate.md#1-typed-clients) from ARC-56 or ARC-32 application spec files and allow you to intuitively and productively interact with a deployed app, which is the recommended way of interacting with apps and builds on top of the following capabilities: + - [**ARC-56 / ARC-32 App client and App factory**](./capabilities/app-client.md) - Builds on top of the App management and App deployment capabilities (below) to provide a high productivity application client that works with ARC-56 and ARC-32 application spec defined smart contracts + - [**App management**](./capabilities/app.md) - Creation, updating, deleting, calling (ABI and otherwise) smart contract apps and the metadata associated with them (including state and boxes) + - [**App deployment**](./capabilities/app-deploy.md) - Idempotent (safely retryable) deployment of an app, including deploy-time immutability and permanence control and TEAL template substitution + - [**Algo transfers (payments)**](./capabilities/transfer.md) - Ability to easily initiate Algo transfers between accounts, including dispenser management and idempotent account funding + - [**Automated testing**](./capabilities/testing.md) - Reusable snippets to leverage AlgoKit Utils abstractions in a manner that are useful for when writing tests in tools like [Pytest](https://docs.pytest.org/en/latest/). + +(reference-documentation)= + +# Reference documentation -- {ref}`genindex` +For detailed API documentation, see the {py:obj}`algokit_utils` diff --git a/docs/html/_sources/v3-migration-guide.md.txt b/docs/html/_sources/v3-migration-guide.md.txt new file mode 100644 index 00000000..674ae165 --- /dev/null +++ b/docs/html/_sources/v3-migration-guide.md.txt @@ -0,0 +1,284 @@ +# Migration Guide - v3 + +Version 3 of `algokit-utils-ts` moved from a stateless function-based interface to a stateful class-based interfaces. This change allows for: + +- Easier and simpler consumption experience guided by IDE autocompletion +- Less redundant parameter passing (e.g., `algod` client) +- Better performance through caching of commonly retrieved values like transaction parameters +- More consistent and intuitive API design +- Stronger type safety and better error messages +- Improved ARC-56 compatibility +- Feature parity with `algokit-utils-ts` >= `v7` interfaces + +The entry point to most functionality in AlgoKit Utils is now available via a single entry-point, the `AlgorandClient` class. + +The v2 interfaces and abstractions will be removed in future major version bumps, however in order to ensure gradual migration, _all v2 abstractions are available_ with respective deprecation warnings. The new way to use AlgoKit Utils is via the `AlgorandClient` class, which is easier, simpler, and more convenient to use and has powerful new features. + +> BREAKING CHANGE: the `beta` module is now removed, any imports from `algokit_utils.beta` will now raise an error with a link to a new expected import path. This is due to the fact that the interfaces introduced in `beta` are now refined and available in the main module. + +## Migration Steps + +In general, your codebase might fall into one of the following migration scenarios: + +- Using `algokit-utils-py` v2.x only without use of abstractions from `beta` module +- Using `algokit-utils-py` v2.x only and with use of abstractions from `beta` module +- Using `algokit-utils-py` v2.x with `algokit-client-generator-py` v1.x +- Using `algokit-client-generator-py` v1.x only (implies implicit dependency on `algokit-utils-py` v2.x) + +Given that `algokit-utils-py` v3.x is backwards compatible with `algokit-client-generator-py` v1.x, the following general guidelines are applicable to all scenarios (note that the order of operations is important to ensure straight-forward migration): + +1. Upgrade to `algokit-utils-py` v3.x + - 1.1 (If used) Update imports from `algokit_utils.beta` to `algokit_utils` + - 1.2 Follow hints in deprecation warnings to update your codebase to rely on latest v3 interfaces +2. Upgrade to `algokit-client-generator-py` v2.x and regenerate typed clients + - 2.1 Follow `algokit-client-generator-py` [v2.x migration guide](https://github.com/algorandfoundation/algokit-client-generator-py/blob/main/docs/v2-migration-guide.md) + +The remaining set of guidelines are outlining migrations for specific abstractions that had direct equivalents in `algokit-utils-py` v2.x. + +### Prerequisites + +It is important to reiterate that if you have previously relied on `beta` versions of `algokit-utils-py` v2.x, you will need to update your imports to rely on the new interfaces. Errors thrown during import from `beta` will provide a description of the new expected import path. + +> As with `v2.x` all public abstractions in `algokit_utils` are available for direct imports `from algokit_utils import ...`, however underlying modules have been refined to be structured loosely around common AVM domains such as `applications`, `transactions`, `accounts`, `assets`, etc. See [API reference](https://algokit-utils-py.readthedocs.io/en/latest/api_reference/index.html) for latest and detailed overview. + +### Step 1 - Replace SDK Clients with AlgorandClient + +First, replace your SDK client initialization with `AlgorandClient`. Look for `get_algod_client` calls and replace with an appropriate `AlgorandClient` initialization: + +```python +"""Before""" +import algokit_utils +algod = algokit_utils.get_algod_client() +indexer = algokit_utils.get_indexer_client() + +"""After""" +from algokit_utils import AlgorandClient +algorand = AlgorandClient.from_environment() # or .testnet(), .mainnet(), etc. +``` + +During migration, you can still access SDK clients if needed: + +```python +algod = algorand.client.algod +indexer = algorand.client.indexer +kmd = algorand.client.kmd +``` + +### Step 2 - Update Account Management + +Account management has moved to `algorand.account`: + +#### Before: + +```python +account = algokit_utils.get_account_from_mnemonic( + mnemonic=os.getenv("MY_ACCOUNT_MNEMONIC"), +) +dispenser = algokit_utils.get_dispenser_account(algod) +``` + +#### After: + +```python +account = algorand.account.from_mnemonic(os.getenv("MY_ACCOUNT_MNEMONIC")) +dispenser = algorand.account.dispenser_from_environment() +``` + +Key changes: + +- `get_account` → `account.from_environment` +- `get_account_from_mnemonic` → `account.from_mnemonic` +- `get_dispenser_account` → `account.dispenser_from_environment` +- `get_localnet_default_account` → `account.localnet_dispenser` + +### Step 3 - Update Transaction Management + +Transaction creation and sending is now more structured: + +#### Before: + +```python +# Single transaction +result = algokit_utils.transfer_algos( + from_account=account, + to_addr="RECEIVER", + amount=algokit_utils.algos(1), + algod_client=algod, +) + +# Transaction groups +atc = AtomicTransactionComposer() +# ... add transactions ... +result = algokit_utils.execute_atc_with_logic_error(atc, algod) +``` + +#### After: + +```python +# Single transaction +result = algorand.send.payment( + sender=account.address, + receiver="RECEIVER", + amount=AlgoAmount.from_algo(1), +) + +# Transaction groups +composer = algorand.new_group() +# ... add transactions ... +result = composer.send() +``` + +Key changes: + +- `transfer_algos` → `algorand.send.payment` +- `transfer_asset` → `algorand.send.asset_transfer` +- `execute_atc_with_logic_error` → `composer.send()` +- Transaction parameters are now more consistently named (e.g., `sender` instead of `from_account`) +- Improved amount handling with dedicated `AlgoAmount` class (e.g., `AlgoAmount.from_algo(1)`) + +### Step 4 - Update `ApplicationSpecification` usage + +`ApplicationSpecification` abstraction is largely identical to v2, however it's been renamed to `Arc32Contract` to better reflect the fact that it's a contract specification for a specific ARC and addition of `Arc56Contract` supporting the latest recommended conventions. Hence the main actionable change is to update your import to `from algokit_utils import Arc32Contract` and rename `ApplicationSpecification` to `Arc32Contract`. + +You can instantiate an `Arc56Contract` instance from an `Arc32Contract` instance using the `Arc56Contract.from_arc32` method. For instance: + +```python +testing_app_arc32_app_spec = Arc32Contract.from_json(app_spec_json) +arc56_app_spec = Arc56Contract.from_arc32(testing_app_arc32_app_spec) +``` + +> Despite auto conversion of ARC-32 to ARC-56, we recommend recompiling your contract to a fully compliant ARC-56 specification given that auto conversion would skip populating information that can't be parsed from raw ARC-32. + +### Step 5 - Replace `ApplicationClient` usage + +The existing `ApplicationClient` (untyped app client) class is still present until at least v4, but it's worthwhile migrating to the new [`AppClient` and `AppFactory` classes](./capabilities/app-client.md). These new clients are [ARC-56](https://github.com/algorandfoundation/ARCs/pull/258) compatible, but also support [ARC-32](https://github.com/algorandfoundation/ARCs/blob/main/ARCs/arc-0032.md) app specs and will continue to support this indefinitely until such time the community deems they are deprecated. + +All of the functionality in `ApplicationClient` is available within the new classes, but their interface is slightly different to make it easier to use and more consistent with the new `AlgorandClient` functionality. The key existing methods that have changed all have `@deprecation` notices to help guide you on this, but broadly the changes are: + +- The app resolution semantics, now have static methods that determine different ways of constructing a client and the constructor itself is very simple (requiring `app_id`) +- If you want to call `create` or `deploy` then you need an `AppFactory` to do that, and then it will in turn give you an `AppClient` instance that is connected to the app you just created / deployed. This significantly simplifies the app client because now the app client has a clear operating purpose: allow for calls and state management for an _instance_ of an app, whereas the app factory handles all of the calls when you don't have an instance yet (or may or may not have an instance in the case of `deploy`). +- This means that you can simply access `client.app_id` and `client.app_address` on `AppClient` since these values are known statically and won't change (previously associated calls to `app_address`, `app_id` properties potentially required extra API calls as the values weren't always available). +- Adding `fund_app_account` which serves as a convenience method to top up the balance of address associated with application. +- All of the methods that return or execute a transaction (`update`, `call`, `opt_in`, etc.) are now exposed in an interface similar to the one in [`AlgorandClient`](./capabilities/algorand-client.md#creating-and-issuing-transactions), namely (where `{call_type}` is one of: `update` / `delete` / `opt_in` / `close_out` / `clear_state` / `call`): + - `appClient.create_transaction.{callType}` to get a transaction for an ABI method call + - `appClient.send.{call_type}` to sign and send a transaction for an ABI method call + - `appClient.params.{call_type}` to get a [params object](./capabilities/algorand-client.md#transaction-parameters) for an ABI method call + - `appClient.create_transaction.bare.{call_type}` to get a transaction for a bare app call + - `appClient.send.bare.{call_type}` to sign and send a transaction for a bare app call + - `appClient.params.bare.{call_type}` to get a [params object](./capabilities/algorand-client.md#transaction-parameters) for a bare app call +- The semantics to resolve the application is now available via [simpler entrypoints within `algorand.client`](./capabilities/app-client.md#appclient) +- When making an ABI method call, the method arguments property is are now passed via explicit `args` field in a parameters dataclass applicable to the method call. +- The foreign reference arrays have been renamed to align with typed parameters on `ts` and related core `algosdk`: + - `boxes` -> `box_references` + - `apps` -> `app_references` + - `assets` -> `asset_references` + - `accounts` -> `account_references` +- The return value for methods that send a transaction will have any ABI return value directly in the `abi_return` property rather than the low level algosdk `ABIResult` type while also automatically decoding values based on provided ARC56 spec. + +### Step 6 - Replace typed app client usage + +Version 2 of the Python typed app client generator introduces breaking changes to the generated client that support the new `AppFactory` and `AppClient` functionality along with adding ARC-56 support. The generated client has better typing support for things like state commensurate with the new capabilities within ARC-56. + +It's worth noting that because we have maintained backwards compatibility with the pre v2 `algokit-utils-py` stateless functions, older typed clients generated using version 1 of the Python typed client generator will work against v3 of utils, however you won't have access to the new features or ARC-56 support. + +If you want to convert from an older typed client to a new one you will need to make certain changes. Refer to [client generator v2 migration guide](https://github.com/algorandfoundation/algokit-client-generator-py/blob/main/docs/v2-migration.md). + +### Step 7 - Update `AppClient` State Management + +State management is now more structured and type-safe: + +```python +"""Before""" +global_state = app_client.get_global_state() +local_state = app_client.get_local_state(account_address) +box_value = app_client.get_box_value("box_name") + +"""After""" +# Global state +global_state = app_client.state.global_state.get_all() +value = app_client.state.global_state.get_value("key_name") +map_value = app_client.state.global_state.get_map_value("map_name", "key") + +# Local state +local_state = app_client.state.local_state(account_address).get_all() +value = app_client.state.local_state(account_address).get_value("key_name") +map_value = app_client.state.local_state(account_address).get_map_value("map_name", "key") + +# Box storage +box_value = app_client.state.box.get_value("box_name") +boxes = app_client.state.box.get_all() +map_value = app_client.state.box.get_map_value("map_name", "key") +``` + +### Step 8 - Update Asset Management + +Asset management is now more consistent: + +```python +"""Before""" +result = algokit_utils.opt_in(algod, account, [asset_id]) + +"""After""" +result = algorand.send.asset_opt_in( + params=AssetOptInParams( + sender=account.address, + asset_id=asset_id, + ) +) +``` + +## Breaking Changes + +1. **Client Management** + + - Removal of standalone client creation functions + - All clients now accessed through `AlgorandClient` + +2. **Account Management** + + - Account creation functions moved to `AccountManager` accessible via `algorand.account` property + - Unified `TransactionSignerAccountProtocol` with compliant and typed `SigningAccount`, `TransactionSignerAccount`, `LogicSigAccount`, `MultiSigAccount` classes encapsulating low level `algosdk` abstractions. + - Improved typing for account operations, such as obtaining account information from `algod`, returning a typed information object. + +3. **Transaction Management** + + - Consistent and intuitive transaction creation and sending interface accessible via `algorand.{send|params|create_transaction}` properties + - New transaction composition interface accessible via `algorand.new_group` + - Removing necessity to interact with low level and untyped `algosdk` abstractions for assembling, signing and sending transaction(s). + +4. **Application Client** + + - Split into `AppClient`, `AppDeployer` and `AppFactory` + - New intuitive structured interface for creating or sending `AppCall`|`AppMethodCall` transactions + - ARC-56 support along with automatic conversion of specs from ARC-32 to ARC-56 + +5. **State Management** + + - New hierarchical state access available via `app_client.state.{global_state|local_state|box}` properties + - Improved typing for state values + - Support for ARC-56 state schemas + +6. **Asset Management** + - Dedicated `AssetManager` class for asset management accessible via `algorand.asset` property + - Improved typing for asset operations, such as obtaining asset information from `algod`, returning a typed information object. + - Consistent interface for asset opt-in, transfer, freeze, etc. + +## Best Practices + +1. Use the new `AlgorandClient` as the main entry point +2. Leverage IDE autocompletion to discover available functionality, consult with [API reference](https://algokit-utils-py.readthedocs.io/en/latest/api_reference/index.html) when unsure +3. Use the transaction parameter builders for type-safe transaction creation (`algorand.params.{}`) +4. Use the state accessor patterns for cleaner state management {`algorand.state.{}`} +5. Use high level `TransactionComposer` interface over low level `algosdk` abstractions (where possible) +6. Use source maps and debug mode to quickly troubleshoot on-chain errors +7. Use idempotent deployment patterns with versioning + +## Troubleshooting + +### A v2 interface/method/class does not display a deprecation warning correctly or at all + +Submit an issue to [algokit-utils-py](https://github.com/algorandfoundation/algokit-utils-py/issues) with a description of the problem and the code that is causing it. + +### Useful scenario of converting v2 to v3 not covered in generic migration guide + +If you have a scenario that you think is useful and not covered in the generic migration guide, please submit an issue to [algokit-utils-py](https://github.com/algorandfoundation/algokit-utils-py/issues) with a scenario. diff --git a/docs/html/_static/_sphinx_javascript_frameworks_compat.js b/docs/html/_static/_sphinx_javascript_frameworks_compat.js deleted file mode 100644 index 81415803..00000000 --- a/docs/html/_static/_sphinx_javascript_frameworks_compat.js +++ /dev/null @@ -1,123 +0,0 @@ -/* Compatability shim for jQuery and underscores.js. - * - * Copyright Sphinx contributors - * Released under the two clause BSD licence - */ - -/** - * small helper function to urldecode strings - * - * See https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/decodeURIComponent#Decoding_query_parameters_from_a_URL - */ -jQuery.urldecode = function(x) { - if (!x) { - return x - } - return decodeURIComponent(x.replace(/\+/g, ' ')); -}; - -/** - * small helper function to urlencode strings - */ -jQuery.urlencode = encodeURIComponent; - -/** - * This function returns the parsed url parameters of the - * current request. Multiple values per key are supported, - * it will always return arrays of strings for the value parts. - */ -jQuery.getQueryParameters = function(s) { - if (typeof s === 'undefined') - s = document.location.search; - var parts = s.substr(s.indexOf('?') + 1).split('&'); - var result = {}; - for (var i = 0; i < parts.length; i++) { - var tmp = parts[i].split('=', 2); - var key = jQuery.urldecode(tmp[0]); - var value = jQuery.urldecode(tmp[1]); - if (key in result) - result[key].push(value); - else - result[key] = [value]; - } - return result; -}; - -/** - * highlight a given string on a jquery object by wrapping it in - * span elements with the given class name. - */ -jQuery.fn.highlightText = function(text, className) { - function highlight(node, addItems) { - if (node.nodeType === 3) { - var val = node.nodeValue; - var pos = val.toLowerCase().indexOf(text); - if (pos >= 0 && - !jQuery(node.parentNode).hasClass(className) && - !jQuery(node.parentNode).hasClass("nohighlight")) { - var span; - var isInSVG = jQuery(node).closest("body, svg, foreignObject").is("svg"); - if (isInSVG) { - span = document.createElementNS("http://www.w3.org/2000/svg", "tspan"); - } else { - span = document.createElement("span"); - span.className = className; - } - span.appendChild(document.createTextNode(val.substr(pos, text.length))); - node.parentNode.insertBefore(span, node.parentNode.insertBefore( - document.createTextNode(val.substr(pos + text.length)), - node.nextSibling)); - node.nodeValue = val.substr(0, pos); - if (isInSVG) { - var rect = document.createElementNS("http://www.w3.org/2000/svg", "rect"); - var bbox = node.parentElement.getBBox(); - rect.x.baseVal.value = bbox.x; - rect.y.baseVal.value = bbox.y; - rect.width.baseVal.value = bbox.width; - rect.height.baseVal.value = bbox.height; - rect.setAttribute('class', className); - addItems.push({ - "parent": node.parentNode, - "target": rect}); - } - } - } - else if (!jQuery(node).is("button, select, textarea")) { - jQuery.each(node.childNodes, function() { - highlight(this, addItems); - }); - } - } - var addItems = []; - var result = this.each(function() { - highlight(this, addItems); - }); - for (var i = 0; i < addItems.length; ++i) { - jQuery(addItems[i].parent).before(addItems[i].target); - } - return result; -}; - -/* - * backward compatibility for jQuery.browser - * This will be supported until firefox bug is fixed. - */ -if (!jQuery.browser) { - jQuery.uaMatch = function(ua) { - ua = ua.toLowerCase(); - - var match = /(chrome)[ \/]([\w.]+)/.exec(ua) || - /(webkit)[ \/]([\w.]+)/.exec(ua) || - /(opera)(?:.*version|)[ \/]([\w.]+)/.exec(ua) || - /(msie) ([\w.]+)/.exec(ua) || - ua.indexOf("compatible") < 0 && /(mozilla)(?:.*? rv:([\w.]+)|)/.exec(ua) || - []; - - return { - browser: match[ 1 ] || "", - version: match[ 2 ] || "0" - }; - }; - jQuery.browser = {}; - jQuery.browser[jQuery.uaMatch(navigator.userAgent).browser] = true; -} diff --git a/docs/html/_static/basic.css b/docs/html/_static/basic.css index 7577acb1..7ebbd6d0 100644 --- a/docs/html/_static/basic.css +++ b/docs/html/_static/basic.css @@ -1,12 +1,5 @@ /* - * basic.css - * ~~~~~~~~~ - * * Sphinx stylesheet -- basic theme. - * - * :copyright: Copyright 2007-2023 by the Sphinx team, see AUTHORS. - * :license: BSD, see LICENSE for details. - * */ /* -- main layout ----------------------------------------------------------- */ @@ -115,15 +108,11 @@ img { /* -- search page ----------------------------------------------------------- */ ul.search { - margin: 10px 0 0 20px; - padding: 0; + margin-top: 10px; } ul.search li { - padding: 5px 0 5px 20px; - background-image: url(file.png); - background-repeat: no-repeat; - background-position: 0 7px; + padding: 5px 0; } ul.search li a { @@ -237,6 +226,10 @@ a.headerlink { visibility: hidden; } +a:visited { + color: #551A8B; +} + h1:hover > a.headerlink, h2:hover > a.headerlink, h3:hover > a.headerlink, @@ -670,6 +663,16 @@ dd { margin-left: 30px; } +.sig dd { + margin-top: 0px; + margin-bottom: 0px; +} + +.sig dl { + margin-top: 0px; + margin-bottom: 0px; +} + dl > dd:last-child, dl > dd:last-child > :last-child { margin-bottom: 0; @@ -738,6 +741,14 @@ abbr, acronym { cursor: help; } +.translated { + background-color: rgba(207, 255, 207, 0.2) +} + +.untranslated { + background-color: rgba(255, 207, 207, 0.2) +} + /* -- code displays --------------------------------------------------------- */ pre { diff --git a/docs/html/_static/css/badge_only.css b/docs/html/_static/css/badge_only.css deleted file mode 100644 index c718cee4..00000000 --- a/docs/html/_static/css/badge_only.css +++ /dev/null @@ -1 +0,0 @@ -.clearfix{*zoom:1}.clearfix:after,.clearfix:before{display:table;content:""}.clearfix:after{clear:both}@font-face{font-family:FontAwesome;font-style:normal;font-weight:400;src:url(fonts/fontawesome-webfont.eot?674f50d287a8c48dc19ba404d20fe713?#iefix) format("embedded-opentype"),url(fonts/fontawesome-webfont.woff2?af7ae505a9eed503f8b8e6982036873e) format("woff2"),url(fonts/fontawesome-webfont.woff?fee66e712a8a08eef5805a46892932ad) format("woff"),url(fonts/fontawesome-webfont.ttf?b06871f281fee6b241d60582ae9369b9) format("truetype"),url(fonts/fontawesome-webfont.svg?912ec66d7572ff821749319396470bde#FontAwesome) format("svg")}.fa:before{font-family:FontAwesome;font-style:normal;font-weight:400;line-height:1}.fa:before,a .fa{text-decoration:inherit}.fa:before,a .fa,li .fa{display:inline-block}li .fa-large:before{width:1.875em}ul.fas{list-style-type:none;margin-left:2em;text-indent:-.8em}ul.fas li .fa{width:.8em}ul.fas li .fa-large:before{vertical-align:baseline}.fa-book:before,.icon-book:before{content:"\f02d"}.fa-caret-down:before,.icon-caret-down:before{content:"\f0d7"}.fa-caret-up:before,.icon-caret-up:before{content:"\f0d8"}.fa-caret-left:before,.icon-caret-left:before{content:"\f0d9"}.fa-caret-right:before,.icon-caret-right:before{content:"\f0da"}.rst-versions{position:fixed;bottom:0;left:0;width:300px;color:#fcfcfc;background:#1f1d1d;font-family:Lato,proxima-nova,Helvetica Neue,Arial,sans-serif;z-index:400}.rst-versions a{color:#2980b9;text-decoration:none}.rst-versions .rst-badge-small{display:none}.rst-versions .rst-current-version{padding:12px;background-color:#272525;display:block;text-align:right;font-size:90%;cursor:pointer;color:#27ae60}.rst-versions .rst-current-version:after{clear:both;content:"";display:block}.rst-versions .rst-current-version .fa{color:#fcfcfc}.rst-versions .rst-current-version .fa-book,.rst-versions .rst-current-version .icon-book{float:left}.rst-versions .rst-current-version.rst-out-of-date{background-color:#e74c3c;color:#fff}.rst-versions .rst-current-version.rst-active-old-version{background-color:#f1c40f;color:#000}.rst-versions.shift-up{height:auto;max-height:100%;overflow-y:scroll}.rst-versions.shift-up .rst-other-versions{display:block}.rst-versions .rst-other-versions{font-size:90%;padding:12px;color:grey;display:none}.rst-versions .rst-other-versions hr{display:block;height:1px;border:0;margin:20px 0;padding:0;border-top:1px solid #413d3d}.rst-versions .rst-other-versions dd{display:inline-block;margin:0}.rst-versions .rst-other-versions dd a{display:inline-block;padding:6px;color:#fcfcfc}.rst-versions.rst-badge{width:auto;bottom:20px;right:20px;left:auto;border:none;max-width:300px;max-height:90%}.rst-versions.rst-badge .fa-book,.rst-versions.rst-badge .icon-book{float:none;line-height:30px}.rst-versions.rst-badge.shift-up .rst-current-version{text-align:right}.rst-versions.rst-badge.shift-up .rst-current-version .fa-book,.rst-versions.rst-badge.shift-up .rst-current-version .icon-book{float:left}.rst-versions.rst-badge>.rst-current-version{width:auto;height:30px;line-height:30px;padding:0 6px;display:block;text-align:center}@media screen and (max-width:768px){.rst-versions{width:85%;display:none}.rst-versions.shift{display:block}} \ No newline at end of file diff --git a/docs/html/_static/css/fonts/Roboto-Slab-Bold.woff b/docs/html/_static/css/fonts/Roboto-Slab-Bold.woff deleted file mode 100644 index 6cb60000181dbd348963953ac8ac54afb46c63d5..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 87624 zcmaI71zemx*C#x!Tp zndIaoGr4k-bN9U&_Lhd8SbF`U&{aS5&tGC24eIF6>x)sAOb&v zfVhIZGKkgz05Gxu09p-Ln#TZfWmRDSfawxMKLh|EoVkQZ`Q(-Vma{B@>M4POeg`;B zkdcjnJpjN;2LM2A0syd<0h`_}My}4p000*vh=&mrIB6Qd!%gkYY(O+#0043i0Dy~+ zMDP?cGjIac*g%2((WW-Z z97F_wef;$GNYK zfxA5bOcYe@pSr|Q_wavg4Qxz6G!PGXCa5nlCp;7+_I6Ir05EaTdqH{!{e&2vHVd-7 zqY0?4Du@P%1cew_u&6xu6(fCPef=#1e*gtEa_Fq!$Vh2VDfAaI9A$rFawGD%3Zn{` zgy^VfK}VWhXJU_#D|iSpz)(AE6ae79l9T`z{7Dgec+=K{^=9K?!wUkQ%eaTrpjIC> zLC8Nb@pFsd7ck_Sk!=816dlWeVYWSNRMZzZ%}6%bZDUA)+~NZV;g9^cr|GFKyZe`} zidYTZm7dU!k6>K<5q`*>Dao$Y2>XfSh@4lX_chMROUufP07Bu;w~|>J@*~h z8aP=_3{}bwwX%57OdFGJj?3eh?_+r|_=znRWSa|kViSC$RK)Ok@HyQrquqh1QhUm2 zD#axlDzU|}+qJuj4PN`wdW1Q8w#UyVncX4X1;k;KqNy&nG-avs3m&sQqsS_7#K?e| z)9F;OQ!VEQ%1Qf(Y|eN+2lxU}?rMDt1nhIO>18ni9TBcQ4`8!U*6eXw%5OuafEU=M zwS%l$`22YQyA8YF*h3ZaT_6lZIAm*v7dFfhg1$5=H^f)z%E@iat(7w-QOoT{3(4)~ z>cHV9nMzvk=|x;0r~8FU5u%2{?xjU`UU^#WHgM&BANT1*`K1sX!83!8KiG*V82yx5 zBx8pm+K>F!(2D-b6Co81jUK2|S8E@zTp#2Ufm(hT5V@_Z#HZsaf1oaKyOv{%w0H5_ zF}kq>VThTK0kHmIOHDSb|MS6asI}pF(lz)h3>i=(L~5xZ5%ZO4hJ>e&6bqi1`$qxf zPTr?6Vz4nNi~<%Q37jRQ@=rM?^5Z;yB?B2Iqyy+#Lx?6~f+hnP79({gynD#{T|p)o zE{8-e&8OK-0s?8KfNj9tEK4B8RC$x-Zs2hl zAp%2Vnc`G2)ij&Z?P;4h& z%<3zlRmIRw#E=zlj%7Z@PCA7ZOO6$=cqgRTid)aJ*mNh^)QV8gDgbk<6Vn2X|4&Ik zY*WE@yAd}X`%_M8*u61)~Lr`Cu}mS*kN&o^z+?JT)oEtJwN%`de{ zVV>CI9!cW0fy3_Tw4QBdHKB)(uvSlLu?{uzk2GPAejn44UHjTur#xN#)V|xzS;r{v zJ#o#?|rTB2Nzj~0wg0)B;Y#eq$=S|I=H05;jlVrq)OouufyhCVv;G4ikyye zt9q-1t4$@If8|ZvNPa&3zQx9AskF&!-ihX(=c0qn&$u%+orBbFAUaBYypyzpbOL_c z*PY#7AjL9BvkGHSftjR&+ZpD8JnlJ%7|jvtVNhYUmpHpEvYE-CD(rE+XuXd|Z6hJS zvLj?n&L%}=GSS(ko?AI{$pWil$->0!=c5EonyH#sgUWN`B;tY^#&}h{imd_c1B(QD zL$vZnQa1XCB`RWbX7Y;dLZFM`?oO-fi%eE<8YCS1DAQN>V61MQONDas4iiV=ysO`y zPFV|%GlZ;SC>gCNUrg>lX8F zy_yfLhE{;u%TviO#PqKJrbQVu4`B*EUA6-0De%WuSFgR)+}qiuLfrYt)hnrA~eu9CPLJY7CI>6paS zWnopw;$U)dp^e}K+3}Y&a@*xhfM}R|{p`3LBacr-0@@jdb$DYK?&I$w^NSzRrP_ObwH`u$VHUzG=(mgYH-8BkFliqhRIf0BGd z#SQg;0fKNb#@807bm?Drgy!lpM{LR48+WFs5(5dCRWWRk+F6%u!UC!_e|G-NAr_e& zkhjKs_ucr>s~%Vl?bq@7jQ0$36KTUBuL?@_DYrCJsOXJ$Y<%D<#UD9hAiKhziB?l{ z+@3`ziu0ITPg|%c2ncA@g=VtiSPCbJ6n%WEhX-?xw^!rQv@vT8nwRq?U+&teVHix6 z?zsBZFV{XuCaJAy)0DX&{jBMtI-uo7(#+pMpP{GQ%-HqM&}N zunOPt%jUEFRew`XR|b8$R#@!TW*RD)Lmyx8k9~^#iXhmW%OvI9{o5gwvKwbxO-Pr9 zrHL8uC0;lh1-W>*+wP)oZXv-n8PSUr9c@>~L*?3tB`{h`R5jcBC;`!sC*ay}P3YF- zOHx+}f^xY%^qt^rl;*2M-0sVu0O`#xK|d|V2Qchx2z-oqKg=uf{9PTB-=1CMHOX}w z5ik+PI%J9ATOLj_NS9a6sqdVXRmc$`@|{FPde3Ld@i=>DCcZ9vU4_8Pt@60L=3{Ddonu+Kt8=A&#Vn{1Ypkd|)aXDP#76Yobb7n%}Flnxrd9qH4- zWI~QjPwDfrhjA9no=4E%bL6QaE@56ZdTHg}5v+wEZ3?%SxQv=RuOi0^w~E>&huyhO z<&aJvb9)GNqf>5R2$CP~*2xmZXFtOc67KBLCroJ-^HXR(Q@yh1Ym~M$BF}dXymZb; zk>B~hz{vA7M=mt7RyFZ=*!h6O412ly#z@538Xo1Q%QXY_ zis@n>*p35+Jl|D=G8Wpv4CII7V^V(+HiL=1WJu)d#D2=;A^ULM(34*W-VzRN^APY1 zkhD6f&96yS+dXkE;QJKLjtK>wH@ItlmA*cE0+Tn$X1zfoxOK#8Y4e!KSQ016l1FTS_y;IU~ zH0H@KQe66>d{J0yJF!U30V2p|jjwpP~RQcZ^;^$KDSF(j~Z6 zm9$oU#i>!atd#+3?Gb6T65}nLkV@-?ZE6^KF87fk5twD`FPTW)uDAlX;VGsO6izN0 z^Zi9Jr}G(4_W~ix1M(=E*;L`Y@`9b|Z2{J5;X$4yw4?MBL<>5=7ipHZ#He$Bqkw_h z>4)%&V#x$ZWi(mi=BQKlg!ONdCONiu3p90^w&(fiDJNQ-2N{i*E`OJRb7xXANuFPP zVjbTG#N|@OJ2&oQu6BsxlSt>6I9Z#v zu$#o3+v4i?$vn9P%7?nx1O>)%-!huKh1e5ei4WyQ{69$o*73?hEi4^L|PM6o3OZtv{obc z&^9FkXsSNueb?fEWGBaqZYg-?9Qn2HM|E(mEA%4SDm-WRD+CQ*>BTHu_sCe zEtvvN11~9xQ;IPTSwyAbnKP=K5s6$OK;z-+S*|Q88@U2xmolu#**gnC5nKlfGY9rV zdxpco&ZC=Fe*_EMZh4N~d?JoQ#(VzBeWE?`x)AH5mQ+t&+GVY#cpDR*Wj)tIR^67U z@gpgY)%J11x{_0J&>yI)?jUKBh@B%W@(Jru-XOn7F{-F=h%yW0k~4%?PM?xFNV_3@ zQBO0A%1qcBMv_GG(4vz&9`2MBS?2W3&B|N<#-pA?r2R$qY_ZR`(%eS0Df&C*ne~Mr zCAXI>*0SuqQO#R*?R4Wkk>x9HdeV}K4-Zj$_{=(WXD)GN$W#jAL$20vwPD&q*& zK6rc#Y2OZv}J>(0U_y@);yb6iiTJo;V=z!?!ju|Jm2_o zeZI|odXun6**3LT8a}ZYBi?#LNzbO*)~oWrGO0CemvCPDZ z1(^{WXJFJ+&azKH<)Mk2kSY^ zs_$-lh>7D>*`2%tSFhX~ToY9-EVe&G0ec~2T10UPwF?%n|KQT*k>M1Ur@yL($D8Or z)F&&Q#7w$_DuBlT{iTg?5>b6 zYI7KuM$~c#OI*9xvk7l^EQ^^VO}s~>Vp=v4zEY&#-xi|;?RGi;Uw&cd&HLDA)S{sP zLl=9j5^2bH^Z0$FOIYKAE;p%JVi&ebtG%nIoo|6Y?R;51!W5 z4I~R;7{UWIc#X+n?>@7NeJA#h*Ynkmm!{kFtik21{?@1+x$~ISgwU^f5GXgWP!$J8 z{M)Px*Ib#q><@;GJ4AEY*9kVy>MKsQ*YWO{TclTJc(4wN8)>!f7IE>_Yv%VIyuKyAL;H1Rq5w!h1 zZ3dp0Cd~Z8wS`U4=kabMC9TDrQ8r;rZ8iB5-o;#yOs)j(4EtM1y2|z!xr0x@nFO_l zJc9Kv{y7B*P}H^thk@Ac1kxpe%J z?z4G+@&$3N#InXh@s5(_Y-?iP@G{mVb#9muk>f`e)PcufO+CCAn~ZE{Ev->nohPzA zlx4J+d{4(6Tz^d`8ycfJq#EX&LaFt5Ce3hy`&{dh@GGeoG^PiaoHrUhiF7+SIVQ~0 zH>A>&yH#=faF(iV9xT895kg+G`^8ri?7pvWniK3zG7KE|c{-ysM&i7YaB~j>HMJ8( ze4R)A`qw+1W!|Bzf$>**n{P1x(GhyQas0UmEpf$HIL07TCx{)F&2+-ZVT_ zbJ&9`s^g||GWesGPnS(}}GYKk(r;UoZ) z6}B*CNMKeQ!>V>1^_kNMYD%T7US;bviJKM*_+9+&q|}#SzPjMqMWs!pNLuyZNU#V& zr9x#;O7*`*f{jwD<^Mz~$?z(rf+3(N27X>Kj~l4`lLiW?@Dm;sZDAxoe=FiwER$C` z{$I&0jL(nXpnBU7bLy{~-PF{dihLS7rkY4z?-{IG-#0fb=IXmH;zbHxkdNjUUgMpWGnm6Db@C4DYp!#4C1!9gGMp3NT0*>ixyB&R zBxMYWeQVdI!F;)%Ro|}{f`JXuqP|wL4sR=XI^7eNshR|^B72VTHjJc3FKW5BCy&{h zgqL2{Khn>yGb^a(19;`vZg8ex#fI3D7dg~FoLPqk@^3kZSXUqMjjCKEi8JvJ^O~$r zfu4C|O);X9ct+WGAAh_GGEc3%1dfh;S^NXm@JqflV~^LOT`i-$38<-)I@c6fQ!|L7jN(7}5EZUu~;6m0s| zrqi%14?Y3i18989elP}u(YTUBcw`E%E)Lcyd||y`&hJze?Y>9!iamRw-X<=>&yOm= z-wlQ@DZ^q^xOysESRvT^Tt}%s#A5bSlO}gNO5fP}0I?%(O7+U%pOrD%9{)45wtwNHWt9ByY zo#Zu}_4iV``Kb(@Jw=s0MVBiDCJ)AHe=_0#2>gu;zkG_XjolPWw(^XnH_Ur31cU_kp_LQ2fz5B%l*`Fo_a{Vnln~e>#6}#BP93D9^)@Yw zs_(KRF#8{kXQ0k?VWdZOhZ(ok;@p?LW?r`WB-t;yUPuy?5@^R9xW+zwEeoz3d z7Qf&*q3C8uyY&O+I}-wQO8P`JrdFRrny_lcy#&bd3zI~W9FmN(!Z(X%T22(7+>|RD zc}8fBryq5>Q;W}IGMHs}{tl0fHwRzL)dcfPo9Tu|Q_Ka$StHMk=7)S8?Rvutv&4&- z?eD3>4@-f8e?-0QA5lj>0lnd<=^LeaPK`exYra?Nywd@yzl|yr5%c|Cz4gGl&=Hg!_dL#Oj(iKoa^q7eX z11JO35!+{3*s)a|FVz})_8NO$wRx+oeV3~2W?T4PMq{eNZ1k3_;YYskJ>u@6Q_8gB zANpPM>R-k)wck-cOjVpy@0y36X&c|Wn%}$Bx1;{asUAg1nW=Cay`3Q&^>gK*W|er# zT1e8qqBO8xRv!Cdh@HrT6z*v|$aqGu`Ci^B*Dm1|c}tImJmUCKoe9rXMswZ=9ObUd zsfDgXE13;W8Cn@dzLt7Hn&BrM|BpUXX{iVHNoGw@s}!Y}m1BiuIXf}r71jRl769|r z>OZpfGGP*b1%H8|%IMCX8JtxZ>e}RLlX2Yq%TDy<(Pn0GN#AJkc(cMUvm={#w;*bB z)clP(s-HuWW!~41nLm?@cZwJD@=K(9sF~)(O~;6mnrE!4_W&+`QJl-C+5p7Nr9Qoz zC2_bZ*?kV>kk@ivwC>3DO^!f#`=^%K}HM`PYgIBz{T zbh0iz^YfaVr5Qy>AmG#VuG8%TzP!h2XycLB-mtJ>hWFO>%rT6T0I~%>zz7?CNE6fZ zzI)u&`w)>Qd7UxWBdh4GPh7pl5wvRzZ-x{%6n;Jr7k2af6cF%IQfB&RVWt@D~I23E1I$WZhcfCB}R>nOS&Es=nE5-K9_M6eF zT&nEIye;MG_{Ob4+`ImhTdnl5t5oSFpH4_3XS#B!6yGN2zj)AeEuBBIo-53Wi}74C zcN$7ZVzz~PJt}2mSE<^9Tzj0ouF@LRPKN7M_`wT*M&lsm1pq8WMDeJAh z(*GM=yIldV)+JXTkKG$~jDG#*OCyjN;#jFeDUd4a*tuvI_kAR4jf!J*vdJ!9`>y-? zse7BJsXlT2G;fLb!O0)~h7T=w%2NOA`$Z=2ONkXFfk@>qNe1S7^pKU4C{;byeaxoN z<7Br*7;DCd$xQg=GD{7cvJ~g7F$G$e0S%me{C(`mmEB2r_@ z-V!O}rU|&lgq3UIZt_gr@(wlJ6Iz&)O}ZOwTkE8EkX86r`bNo;KCCjXN}X=-$~e(9 zjZbJsh~S+cA6lB~Odi$ymkLx%lYM*3ktvqLU%bYH zYYNFt4tY|C!0QBsQr!W05G+<%Gsju%-bEglutKx9`4ter*<0VTb3(|c=6Ruu=u-!7wkn7h8 z7c8(wqt^NsS}5_uy_Bi7#2!v`aNIJEkXhGr{x&{LVA@6oXPk)fFTYXKY9jly&)p4n z)f*sog*|?B;@1a4{jMJCM*L|(uwykJrkg30BPZKA+YP}s9qXp)LHUGdrsf6HiH&LJ zScTgw?}=eO1N-0HWW^+>E$gn0X~!g@`WtV%jcGFt&J@I}uUh$pWtisY%u#k$O%sap z3FENzPhrodiWRP5lle=C_|eF<8a~J+!z2Gp&NX*VIAi6^g^kAQ38R1EuGumn102N8 zf;~AzD+wW@-8kPTtBchCrctz&Ewr4V_;weZ8Tv=eILUSv3K`ChMu>KM_dseRs3jh4 zh;Z+(%5XM4CQ32EUyO0EQllZ905Vu5oISp~Q86H>wlbuIkkG}Nls)ean*3{OJAe*L zHQR8UbY}5p(`|1H{B%-4BhmclkTpP3CNJ#`-#)5B;hcIU$R zMVs)BsQ=Rk`mLODM}2U~##|63KF`iGZ%_s1mVy4leD(Z2@h$C2{6 zqMjF}+wgp{d?Vf%MZ@elG0!LiV$pROTepwlTaC}qnE0OGzJ*J`o7xR??j?@ZQ`RQ` z=tjkbg{%9-Qz;J6F+{KV(f5xWis$wRU;q5|;$hng2t_--C0`4!mCjt0fS0u>Ha5TA zTB{5E3wTEn*p&Yo3}hmc&P`JL_B4%L(cE)Idfo!MxzJw=(LRPg`rn_|9t^9WAn04> zx+*QCy|`!68FYsBor`$*j%2_4-uSf%2tfFDUw^pL=7LF=_uzPg(jGjcV~0K0-*X@q zWk7b5Rersd_I|zoUx2|AwK>T53|c%;yt-?z(Vkw+`Yv8VSJNgMKQJcDNaU}+e)I@j z<1^L-r@Akn{4W51MfA3L>$%#kPnLPtJhsUzet*`+oOOL;HxyKsw8^ea;LubNN9nzo zWvR_!1^nV%0@K-&VKHHdLsXXlk*CHJ3;2=DCCC_x z{txVgC!H{BE>79Tl%$O_#J4v57G(mo%Jz6kYD`Go|Nnp@sgOm_u40--o#d*>i!c(p zlC_e$zFAp|A^c=p8MC(EvDzblVRoO&g%;i473~e9c5kud0){rXi?Kvw^<$z$>2(t0 zag*0Y;L(oP#m!{fO@94Om)7rNZ+%(L!ID?!$tDL*l`npj?5~MbSc3nC<4-A^{84>r zLsiV{yY;w9LFOJ;_RPBPK+_;UfYR~NoV*y5Z%p&q-B!n=Av&gsIa&NK?2+(ee8cJK z@jIBn)!%{-{4>{N6V@1*p=guoa9sMsDpTm6Q|zV1)P7^X4?;?h4^!6`r$`7JrDAz` zzfn#`GZ$)VQPD3j=er2UyReq%hI;y_#TggaeKCWw?m}5#a*jt1u^G6`Psn)DEDcS) zO4n$2Xbc8-==65bD28-jj3oVg{7~qaIW}JCvwTaKq47Y#aYBw6aC*p!H>9|#Br&AV zR=zoLhRD~QuE$aRZ(rhSc@D7YNfc{V#z`ENUP^-jPEX#fN4jPFjQMZ2YrUGR z1MPj6pJjK$JBW)1$;F_6PpkYENRf)e^y03{l0kRagIX zeubVE=Zo`?#?$$`xI|*`jCGx8HwY_7DqJYBgYAT;@x{9wSfb=r8Q!=;SRRb~N8p;} zKEDSogq717k++(ycA#drrgsT8rc{ictlGKAmMD3L>-=fDB<{SPdKDReJ1dmoo(f52 z0dT?nWKuFq`6&2{WDDACpGUq&dqPXd;e<{_#k>nXlIidd^O9nZthovvG%H2?iKxT( z?6AbD_Q)mR%!ps`8pMbm7$9WZ>EdF$`L7rpn%Y@3oiPn8H^nn&8jRGtaXV>Ugq5#F zG#@@hf7mPyg!}10d71XbYZ61E)qMM!K%xsaMJ0sOq0n1M+auo=D4?au#QiG*)wux6 zAg;=vU@4jk-@t*hcgG=y{14K>HyxAFmR==$1h@DfFLW3vnwW(3*1RTM?o*Ce3H#e@ zAe!V&O;=%1y?X_6#Ws8UN6$QAR{@`ba%g?RpeC;P1*#Ws|uD=b_R9Bc~@ zxABJ=VuEfW&bLPIx!3dvX0?#WI@PyEcnVxmgXXOao*wTFYopu*<;N-@TeM$@j}bQ;K2hj0MOP`2v_ zoCcEDA*75kXppq)7o7&GGDRzCu=p)8`z_T2IO_nxED#10=-U(EXcO?i!vi8T7El}} zkgqCG(Boh+BqzW}D;Q_e*;q6LjO*S<3}Z%2??()fM@;0X3>c_PY^jW@O7+i6O$k9e zeSVo~lo{!n>|4>u2SIWNA+`sRga;vd2PLX41~B!#45oQD?iP52E1{W9Xr(r3E1`V0 z%oxq-1m{c`Zt3+4hL-fj3+Sbdke2jKT9MTYJH?HV+ZYIaW(UQSkQS^$I+1w1NN)WE zZ%8N%!;#|=JFLIOzFJ3NSBINza8wt{TpesBImFe( z#+!xT=Wq)@&I+!dc%}JeYGBI6dexOgOZ4<~XITsr*Yz!=dTPmRO@e|DeL5VLLP(4* zKw}I(Y1V+L)bO)%sZoZ-Tv$}X*UaT8MD3*jI-cbqaIfVsd>GCx{xHrx?mo0d#Te32 z=9s)3IaX$Q`@T~djGIp-6LRd#)AmEB-WVg|kG!M|_Fxtaj=wtw$ZuFuCuwzuDrI79zZY#UZ>| z^6ta9p_ZRC9_uTT3!qb}F<{}lTQzFf~9F|^Moi;*E%F?zXS zCZ$|D+fW?8P+`hf$u&t*{7(eqh7(+Q5bTscY zHQ%wPv|(RxK;LY+aYIbxar;J@& zJ2dFap_C|1{8AEtwjXVte6PSfx1Ya@-~)!eMc&>$;xnb8n;F0N!BHevC}8UR3UN>zvy~$n;Aj)N?>07Uu*G zgUg632*7FbA>GKRLw~J6bpYh7BUAaxC>Rk70YNFIQLh64CnO^6( zIpsL3`|AmpPg7y^iP>tv)J9v;X1MWegM0IQBAV+-J`Q6K^gy@ny>(0u_->dA_+(O( z6q`Y&h)XcUg~iLGDOi6_(nwG${~47bNKaeTBt(EvChhYx;H_)z*AmOuJg#4T!dkcu zb#V*OHguxe<0aYqzc%WQ^hKQ;9Jw{mb6?g&as(NrXIFosyoLXjB4O4pfhaf#g=AT(9inJv;j_mEz>Y2Q|CXb7C}u1j;TF@o&r8jXWS}Up-)~j zCak7CfE(1P*2B#Xz^hD>#jIPFTJDq6PZd37UoryoT1N4c+94kH-_0W4DeR@D-TG?g zU!O9~g}`OE6WA*{eu%E_U#>RAW((kuU8_U4b%JTJ3R&9)yZp7o%i?aG>|uDBWH#Vo zJJ_+6{9qNtfqAvC(@~Fo@wD|8FW+Mpc{8|GKKL}`7KbK@KKO%LOh*%5Fi%+6gcfD* zzC;BI2oU`NyI)5l&45?;Sv^Y-jvO{w1wBb=jHmKzJjzCpu`zAGrA+t5Z+PCHn;Q8cQD z9kJUfpV%`;=~+S%W-x#}juf^Z+V9wJ(7MeuaOA-KgALlMLc^$L=zmWPcsLL`W)U5h zGlnC~VGV^GNA8f`4La05C$xO?vCsi_(b?*4nCU5P4OY>da;K(gM}JaTx1qJ5ZPM9T(LCm9rD>OZw@|l1b5hAc7&{DxS7p;r zj#stLw00Z1UHoCkc^7$wj>Ll^w5ksSi`yWiFx?VZRrTjf zU8WuFO|a5-B#=f<(a99S7tXWwS0iXY1zIhXa!wfZOp%${L+hWB$2h9+4Kb^v5OMXw z-4#y2WZKOg1WhhZ7j%a5icJM&r+U<7!SFDydMKZD#AI_A9)8XlQ&!aWYPdfRy-#Rd zY`p)`sD2}p6Jd}u=mf|acT!yS8+||7hw1>-fO~nMF)ED*9!tB!>7zB#_Zg$fZ6|lY z*C3QEh5XbVIVt^I;=*Z2V7f7)4LGT}WZwwQXud)2QR3}WlIh5FE4U=w2%7NnAkybK z2qjo;GO8mm;BmDct~!IA%2&(B+=D%Ir>7AI9*)M>kRf0>py|tETGbiJy0&J~f>rI% z%;`+dAG7HMt&B~mQMBfq%!3>^L-1PBmd`TQeBON}nes~GYCJB%@?P6CmB8G)8C6qNfs4WN zJ)rOJarGzFw>qpErHW@&MgtSgyA!+I8UOos!y+YPUSSDg8Q{ zG**gjt+T-q=Kmuh`2f)~G|A3jvu3?J^Z%b{P1c@YZ9xiIZPo1z;+f-VRql*zpCh^! zF}6y3O(QB7*rudPaTsT*qT5X|(Q)8#gIMe5JMLU7-x&5eep{>N?}0cD;w|ML5IOGW ztyq9ZOIBTP0w(^?2%|dz*lYJhZ@G&5nllp_!j~*?E#5PAzO=0S-uIm;y8Buk(r?%9 zc=L&;?>+QQcXgBCr9G2W7D_3ZW{#ah$?jNHdgJ(gu9{E+;*VsI+Ohi-LYYAa>BgVr_ezF+Ga?CQ9Y1q8aiH9MWxQc0 zx?vNzX$BxP5F<40VjAXQnr>qn#ABLJo)%`;&AL+L>V7|~$V$9%6k-@NX(d(P&(KN5 zb5yn+wP~e&*z4kr3%iyeT*Uyn-|w|{#HFIsGo#ZwpfkcHP)R1xQ76z?TubSV<9X0t z>~(s_#a>JDk7GSqZtk_e#u+gs341gEei4#wMa|CutcplBulR7U3fKfOtgLlwmfBYJ zE1C`13B0U}>4Tap8&o+htj>t#u-w0I@#UDjXXI;59hKxUNja8Jov#&lVo~WjzQ-Q_ z0HN<|G@={o+$%2Sw6U+)u#`zqbyg95YmiclytQLLgZDCy3e7=YDm~akEVw{nQ58{< z261u33DqNiVHrafj5306dADtCDi40jXcrftaW>L7Z5?a~3rG$KaKS8RhJYyG4L0o> zi5nX5MUuv;Amn=>J;;WIY&;R`DZQ;kNgEuh>8 z9B>kis{2=VqGBOFtxJ6poz6~IUzMSJ>i#be{C3?^o7FLCoAya*JDbx+SI!l{9;H!0 z4`dk_-1B8s;2xMg4j(FHBLFryG{QD5fL!CpxR`WR5=m}O35d^fv>fA|*KxcQ@?|YF ztz+ds%C&&4$ED9@BF7DmbF4&9eNUvg#>O1axUo@`L*<;JE)oQqcq=nk&hXhaMCPS==>GO03P_=zpXcgEg2INif8f+D94i9{r?_yBA(|5dE z$_1f=(X6cwI8FK-F6nmQPk_R7IGVL{bQw$8pi*dw~1y4k5-~5XRi^Zq2(d z_9vVhxWLW8Q9Ogw{dMYKXmFEF?R^gWJ#&bg2sZ+6(~+#Kbc400T}HH%K52FpQ302o zD>F@YWXNo{rWosYLCIL#R_WZu68fk z^X2&rVe8D&m5V1Vd+279Cp{MdusEg{>Fu&OpQ=u)>*LE7tc+$a#W|RrFPB4Gn?} z)aqZIrOycVDXOun7P%|nSP|hB8hCH+dV&Narxx-@C$Ih0age8qhA-9b)lxXvBHMnWX$3- zMY>@Ij%j+LwC#bWemr@~etha@HBF;zB=-HpTpQOVlUN_*PYQ7&F`Ng%${`iJii%6X zANE6BSUQe_jrnW#;{*@9mm?U{Kd7e=synWxU~;{w^S*4pUXBxea3(3?auB{k!lKt@ z%vTO$;?(Vp><)xr<-*g$B z-Ekj^?*YGodmEGgkmP+CUnj3ps&tdijr867ZqiNQ^)`}%zWXgtHjIJK?}%0Z4-wgr zOxp8wl)R@@DU^R7Q`^VQS^xMNWSxx{c(W2$*l#c2mw2&QRw?($m+w5nwpR<tdPs!! zX+}9vY{1bEudIyuo$fc3=C!BqA0=ujnuZ~&3mRr3HkOAuFilHpVcg3Gix_;8x~Cp2 zFZkw4$~ni>TDuZ>E58}|ZndaTSwR!^luvVutLaT<`ec&coCHC8ARp7~3oIcrKImeZ z|Gu9XNU24?4O{F?wxi^BdB0qpOn3YLjH?MRO=}4*OlpX#$m$5pPpJC=%xDWOPHBp% z%IONoi?59+OK%M+N^Xp<%-NUV=6&ukAnED!P&9AiT4r}93h zAegU#Ybm>4JXCK_xKQP%p-WL0WWm#vhU zifUI3YG;vaPlmZcx!#JW}j;caDK1!iq_xMJvXwtj1XlmoM)!A<_;qfT?jSUB^}a=+wslVgq~^QWGqGEs-rg z(zDN;t(;@_1*6^J2kg;CuqWf3SA3gA!j~#+0ZEMsTkn)F0ZDXuaz!a%!fY$iMPqqU z_J2I}Nab)PmRT-;St#-$OS&;oWGnRt;VH^-jeU*;W>Lh2RvJtYp0z3ykukSszQ2`3j-vCIvh<(JduLoImwdDV(tKBr`P znDzU}zraBih6HOp^sG>4w_?8AeFAgdQah{S^GJ(mxWrIF>{m48un3tymPF-n72xSL zx7vgFC)04aqsB=}Il^9BNX9e1-q=_LaAt&`#!ro*xoVoWK>9F6fzwedXFu83+!mHCWg?pj`G;M{x| zU9|u4fmv+%Q+aQ5tM-EIS?+_?Io}nwVF}kc?+Kz3dX}5qs#iz_9TVeXLJX_jaJN~vm2p9{5aH$69``7IYg0Jf6pcFn~weNhR9C3%e znh=i8n44#Xo*_E$NNvwj^hQM9*`nhhF!M#$CDgnfI^CX?j*oBhOW{a2=M%3SR$rYv zU5tYd%MeXC=33c^^rKTuUn7#fyI%h?m&k{yIMr!=u3tkYV*w0n`ADM?J))N88k2J~ zqGQ4G1;Sui;9%g+wL&!FxNr-i%$6t5{QP7^KSUamY)Rjb<)BmY$FlSIaXp$ZwQ~<> zh(3a`FA}bD0>R&boFUJKxQ1_7-LG3&Z749?LQ0D?#~kL6xUlSmh6Am5n&Hh>!GDUP z^%DH@1BJr;C(Q{qACYrZXkGDhE&x+x|GP$U@yx~6Q$xc}d;3DIF6AgEm!Bz0UOqxa zg^o3K&9Ww~IHshbCD@a$}USiQ)4(>4Fj6C?{ z!amQ;OQ_jR$#zL;L?nEe%qP|b=cq72MbLzn8iaF)n(MQm%Od{nL$yKt-Mjat4Ld)K zq=2=?5lh%ViBd(QM!`nRpvmh9*&e<(hN`0?e+uCbnjB<8Rf^H9=vmdN^{Un zaIlXL01C+V)q>GcQNQOuOyM9laaYDZ{=m4_G1rhEt3PK!DAF;jf`L(CgtupTwkzk>M=Mod$@BAVV`Hp+vTODvy zDWX@gjJ6c;5DDGkhj3s$81^mud6h=a4h^Xg(Fp(`Sz3uWTIu`+1syVmz6%FNOFAkt z)j1To zT?$Nfpac9x3{DQc;WrT^*>j7mPS&5 zR|RZQLCEf^_OvFZzD(q1ajFM&wtP`YI!=1*eKz0T!m#Kdo-t-);n(wEFjP3`{GgR|X%6QJ;C<{3vm>Euq(><=7- z2t-?n!jHAoV&zax32XvD*6>281ds|nL8X|)=(m;9`Q(ve!tCP|mUs95Zm{A8a_IqOa#J(tbk@@erDy7!iqH7PMPTiDsEj`!QC)t;i;e~uMjt}Ff zp9SAKxE)WO)N?<93n0kRe!5tK=(0+LhabATL^)gcL)~EavN|jD66bR{A zK34!Wu8sySJX|b}#CcgUD9K%_kFC81gsgVW$FAdgBE@4f3Yzr*4f$qw!;fl@@_82ED|oCyilg-*VCoMT1# z=hv;7@N=2kR=N$|U*)wg$n-6*>1HV~jRZSXIMK~$cKgqs%)+m1BD~~ca=O}*j+d?& z+TSgV~rEHzD}$&)>AC^Ctt3o6ATWOCn7;7TELAO zmvxaKAgKdx(JWkR1ON*M*$NP8m4s@v0#*f#Iazsbj=huDmfJzL0t^(j!I>Mysd^ie zl`+=X)GNHW@Uh0LuDW8(^|JJ6XnXxUCe6L(=EdUFh1bO?PB3%sq^YxRy8bbG`HU+k zOslKVww^wI;EJu?3!a&M;G<)Ew998)Uw6}V*KKyYnUaz$IOUE9OM@OideEc$E%eF9AKwspVq@g5$)pzZB5QDzmPXvW z*1DUT+-uj;y)DBhg2f{7FlI!6lavF12Ryn>`ZL$7x0BxVduT~XX^GA0Acp&V(tR-pTYPqpP6uR& zxg9&+IPk5HBVQg6=Q+W&YpWaT8?UaawhM7N9mKAx7h$&_sc8B1EphSv9X$EU8S7^* zy7#i6P7B0y%6~O-4HYsDGQbbRLqjMcFeI2D*%)ynXNnS7P;nd;08pi&(J(nTV!=tv zvoaC9o=kt1-)Xld#c7a%8FAJEEJ}4*@(i%964@~2I$~LFmybDPt09k$Sve@sZ`#0R z4N2nrBOX*;M#TQHa7I*=j7qng1x|N3RPiB%T0EsTTd7CVR}U+> zxYd^|K1j|vyF1dFaF%g)M0_do#M5`)iTz3XxpjDh!7s|B-@MXqF7QG(=oad1rG#)C zpjrXtqy`xK*MgTTe>&x>&})+!!QWT~Lt}eQ=g>CSjLe)m^N-@oQ>Vojx6W+1Q5-#r zAjC~IHP>HXTXREB?Wob!6Dvp6u&y&UcPo5h)@vtDyf*v!!fu;q?0WazmS^f`&#u4f zrkUjYgz48zteHL?WLuH=v!nYyEHv1Sa;1nY4FO$9feo-A0~HH3zrus|FV7sVd&k=WPX{dT$w-zx38@u4T4ns>`a0BCK6 z8US3xdO{A%l$UvsauU!2DXk}I&uH&4cHUanw!g_A<}NVapCxD4XwkxcC{CW-YI#2uJy+HVg)-!%5$ z4ShmAlhGi12o$hRL&|~jhBh6Fb5;qAC9!eiSSdn16 zM2v&5^5(%~ubepSYLrciB0YMx^{(st<`Hoc^YFn{%W8Z5v1(G|gt6L=H!kd6e0*rP zE2>2OuL@(4=&ilYS3m&D;PO!AWqo^TjJ5Nl2Ki{wWTT>_9iiq?rxw$zBa){K33QiTTd9u_7RLu%dO=VoE z4Lluy67a}tmwZJBup1Ad`E+qf&~B7BZFl^aUsT+f)_M7a)%V!bzuYo&)mX{{mQJ}h zt&B?%N5oEXRNP~=;b1Hp`+WbrvLjQ(Oi`uV@Fd=f%W-3~XxB5;qb3(SySk-aHz_SiufOp>9cuvLS+o#HdaTxMCnckdcXs43|-J*4A~q-EPyIk_({+ zjlSsjSmZ5wsJCMy{tXN8rACo5H6-#wQ$-3%!HUPUCM)~4IoaCOWIJ%c)9rP z0C1K2BGmoC0O}sIG5TWsf^0{`4$~W!FBhLjBE=gvY`|PhnmMoWdU5KlS&J4g zI>5sR_D|iEpY_tsZysxMGp9S;@{X7^b;|S`UaOllwGJ+Eq;oPy+C$G!Nqa=i zi70~V>jWuj07PRjb}0BUUgY!IeO`lPc>O9&h#Z4$DsCic)0hkgu7sQ z^|nKAyfSXB-+f|&_-c!IU#!5H=-+}V)pYN!f+F$x>A-1mv8Z5|INNYD-i? z{!}xUm9IM+JueM2&iFiHTk~nVLo1SD?wt5^>Z#j{=F(Uo^7QCdzi0^>{~ zLP81F0R_d;s(}!w1jAVd8@H=A;ZQlDY)4HyJ!($qv0(%IKWWy7LXeG-$A2?=-8pf+ zoEi|i$@uxo&>;GS`XnJmDQ8i}0f8x&O*tjJ5jdlqH2|eCzQ7nO7=<{5tjsi*!=7S|qsn6nJ+g_! zh$)W7ZrSb5fL)hB?Lm*zqI-;u3dk#?jL7@uZ4Xkjk&M~65xpBXN|#BNE&p%e5DvS= zBz(**Z<{|;OdHoJ7b=%3T%`bHy~LFO?L%2|nAf<83kR56WsY$=(GBx4qot(AFv21B zvBt*%f?Mv(Y90nB$Z5-NBgl}(BSAIJCCYIw4UiHU6$~jg(k8YanW1#`6h+ebFV9tn z5{wH+j@`#)Ta-9{KlrEsVyicbFW!>#EGL+CZEfWZ8*w|A@LJw}`=`^#wVSS4ID>X^ zht0j<_eqRd&?{7$oX}3`7Z!vRWSEhj>a-zPD5L*rH&X5PSkxLG37~O{W?4sXG=NFf zor^JT9O?g{xF6TAk8GbPK7I7gh?&u9Q|9A6iQ#aj$cgMsZ)!@!$Hfd8*|D5jZ1kAo zP+_}xMi~KuMwZ9Y8z7p|%!CC1R

!pma|lSQ?8FBe{DRl|@FzhU7Cb>&@ataZS{g zrCQo@Lushkm71KyL3$%QD?KeSADp!x{f z=8g-xggQyFIyp&U(+DO4!2ygCg$vPu1pqEc^*Qa)IPstXB!i@fDLx<-```)5UsmT$Yl%a2onC zAFmUqUVZ7M=U;sB~=#ZhJ zS2lbGii8+5IZ#kxQUi*iaRi9X

#R4x5a04mzf2YJ>#U<-Nc81}`=EFMdUjIP>d| zG57p9Z{fmuKgy=mdh|^p{vLBqr2nl~Uvs`o<0(=ordV4cwH1`u!(29-sxfB~U?9oiFvwlQ~h zMtU+gNR!Fi+Hj^AdqXJb=<~`-ovK?Q2R#<$zZh3ihYT*KQsJfd{QuUW`+mlZ**7k| zA+K}pJ!@y)aP?O)&%QQq-p#X*@bHBL*FI8|_w@2%-GiKm@1IvS?Pe;LTypfH#`^kM zfQIh3iSL1qiZgXY5~NUv20JiatF#2(>ujRX)dcQ^917nje3D-C>7-LO9D|Qr2Cw)-tt>dQFl~e294@LmTlbdf46VkAe*1~ zyZBW!i|uL`RpE%lty{b14)U|xxc)&pr`-?go~fAw@C`=J=7)S%*=`Utg#?VnlSZ}r z*t%tNu^Wee=n9lZJBvr%l9KC?*fbsKwZt(`REc-Qn7PEk!O?Qh=n6XB5e}y`r?9V6 zOq5wG?G^EldQlJQp(*LT-5;TjsQ~KE`=E|BEJ*H*53j#E&bRx)^OO>avtf&Eg4ANuBcw@ z0pJUa{U`|K8;6dzlw{-ZfDuShv4GK(Gu)6WW0Tp{xD-WVZ`))kl{cRGxK!Lek93=J z?))rLI8WS;w=a$Co_X=JS&_p{X~ae1)5GB;u>q$hg~REQpCT8HK6|}bmuU9cTmU}G z;3|couJ$<2jD68ltnyStBS8M`21&8SW^9l>5XBUYOJkFU&pEH1pH2J=#7xDH#Qgch z&p{VCcv=sK9TA5(WN@$nF@mKjCL>Hq<7GEjOcIRMC* zOBs>`N$QZ;rZU8dve#2j5M_SY*_=ozHm99VZQe=ti9*+zR32X6yellOzn7JU@s8+O zmI#wR+J>k~LcusO1|-Bd+fXVA{-%=1Gc9$>Li(&;Ek@zfeD^PVk6S)7J}0qtIbC(> z>;eImn3EVi=dgRwlZYKiojA+Gzr3wppCH2c_e*vGC;?gx1d)scLaF6bq-$Pz#k3z{uaZ7|A27A7BNZ*ymotzA>JCQk;Q9_goe1Sd(4ICW{YBDkH2xns_xE~ z4Y;k_^09}Hi&M4Nmru^jykg)D6S4JMaeCD7Tlp~AHkOj63W=fyF$^xxuldM-}a(rbpFuYmT?3 zVjN5{Bsg=*SHhFgq2HT_xs-F<1N{G}-O0?Ki#tmf;nc z`?V7RdkyZ7x46T)ek@X);8bBuIXuA+=GW6JGMHqtI16sIyCo%y$S73Fs)+f+(VH%Iq?yw z6vJ7LjLB>$P*JI&2EJUvH5W3TqEtO3ln;>B&3rLZ#}vcLVnEZ0%psLUITDxM+-o`d zIau_7An@DSf#-KSUwP(W&5A;&5Z`?^=B0{~L8~gJPwT$y^8IHpx9$&RwOLuU{ijbM z4z=}_!*6T;_`TLH{zGo>vYCVXhS2xbnnw$};d_N8G6WDh0I;8A%x0@uk`jUj<&fVo zvgyf52(lzlr79#V)X^|tX1jO#oL&ca#H65T!7}@*nf>Zcx7Bh?3*0&J&pTH|-da>W zp>Iw5MUl58>02nX{odhK=ROm|jqdv5qH8+mM_w?-Y4iJ0N^E(X^^@^iFpe`H86CUy-&mlopl&gn;DN6iEUyOiyz<^pqqEW$com z0RSeJwxWg}m6-HEsX=RKlxlgSgMA0w-hcBI#Ia;I>eq?HK2I!^zF*B7!!2{ako+oJ zs+Ch+O-=1E@n?gGF9ZM+8=0YeZ=Uw3(rJ2LVKDt|kE%<0%+L;*E9#R~l~JD*?N5g3nx_fn$&)F%K9{y=mzAiX!ErdvVeRU=W% zbIU%gBBpV~Mt0XFb=!$Cjl*u7KswEX=b-0z-#_bz)~~)stN7;2Z^Sp4+c@)vYo^_J zV$1W3_@7q>VB=Wj;e`1Z< z^Ca$#61Nk)Dl#?Xkex*sw<2Z9Nm9HcRHBYi9ivCn%hfTja;k1rZG-u=DcUC5e^;!_ zP9L0bTcInW@}v9GF$Ydzu58kiva@SslQxTV#gJvcey^}%NuR#5X|H{}TUR{Sy?Fcm zWTJTHf4Iu7KWt zZs_vVRgpbrm_2y;WD6HR(xR@BZ&iGm`UO47M*NTZh3kLPFO0(JZ=+wR<9-w4Gke;* zYf48>9Jln~uI57v->jr>9fwQpOM473|vZ&RXhO)SWp9P8bdWAaMM|Ym>Ww?4bo-M z1U*hd))gl(H_~PDbHy8U{Bqm2;?C|aS?Ps!J??pQ(EyN0!P&AGY}KbtIeihqb5lkqdU!Y;BJ8t{TtFsv=N()rdfpz7J$Kxxkf zC85CY^$XR*8Z~69LNpjP-Wt;}?7E>C+0@CFg?f!&Q$Gk8zw%leIOF{H2epIWU6_Fv zZ)(t9+w+DtbtYbwnTOT%~RG z3%^C)beM{H;=`%<$&|+)o{Imd7Z=gjAoMAlw~m)mRtjE);Pq_Y*c7crqks+$8a2D@K!n|AB+eil6#t25q^0_DO;Jf}Lo_6~sLJC~j$xao ziW|E<@Sv}M=bU7B!q5t*M{Jo&Y&YL&)wa$fHoC&vd|}pui3#r#HaIwj&QFnoh8SIe z*y=DfrwIV`eTgYa@xLUbT>B4N25@d|D`m(XGr!5{GY=!t_`Z-6cVXAW|L5#G;G#OZ zx97~vy?2+sEK3(ymSquah=5{S6?;Xn02b`nHI~?GOt+<|38a`_Owczm%^1^TG^W3) z8jWeDnqHJ0zB%{aEf`|n@2@{#(Jg2CnRA}!IVT%eQzrfhKgA}Wk^s9sbk9~;c(49> z9M?h}(0O#-5{e9K4dZe2(Aok=reS<|MZa+qCXDM>(fRp%MpsvlzUTQPx|O%LZM%CWT6s(H z*$0nKoBQg#DMugtvDmPADy-nour4GC@c`<)x-xZ^_4eL0hO{W2`K6F+2&cXRZ@(Kpg-*>HU-Mc)w5Y zww~I7cy4YGSHr!$1Ti`-;)oEi><>Me&|bJ#d<<^=>uUDo?*Q125l!KoDcK|oqbZ4w zSZ3Vl!!48&7J98$fJ`S$&j?qmfcxceynbSoi_pG6(q$qb&W_nOk_B18yS+gkpt9#< z4R%5E8~y-!!?!YaG=H+>*o z2;t*p?j#Elf=QrRpf}Mhibbm-zzKmGD<}vU1cg@;i$yIbsv6gaL9;ku7RhpDX4>T; zgDLe03BE~?^TJq51#a)qUYwQtYwth4-dkn6N;G;snHCi@Dy(;sje^&u8A}pj9T?T}=Yra`$;pn7%j7ZUY30#824Jt)Q*8Pg z#R<4PbtV9W;52#1p-)bo_Qc@zo3F?(=v=sM^Oiw-C)NCC@b)b?6m%|Vf6bQ0WoI9J z;OyB49y~j{d+%P|FWYw2kVhs@dvf^o+qM^X>)!c>?K_7(K6TQ*!JD_!l}|K@Cm$Dr zfR69Me5i{I^A2`q$V4bn!>pJ-;2b^jFe|Z!ky;B7O-H|0sX!HAvcZ+%V6{f{F_2uY z%=EOBWSemu*G>`#Q{OiZX8h^omKFOa-CtJURySB z#arBpao`ASW@c93Wh}HBf}KI96GidEna!b2A_&s$uf9Jcjwlq8x6he<>GJ!3`=(+<-@cIY z{jU(KQ1RvRIhQP)zxR)CdOfg@9--hsW59?d7nOI z9lZzkjJ>*T$IX-Xy!FXpb?l-seFhKh;5`r%79Sozs6*MvPGNEQpnnyiWE=mSZ8gUu z-fIt%yzq<&f)Mop^H%Yj9PbGH&Od+cwbuw?7&BJhQ(nZgo)nTX-ij!o3=lXRK)Qs1 z33c%=F;0leNj1?l9k!}4tU@;Q6oN*>F>$3Lfv`GyA78<^xkbZsuMQv0tIBIOi9f|omWyHN zTAJx3#N&46W#-A(XJpH$xm9+33sG~2$CDihnumtW2U)_HbN;YPH{5^6Rb9LE9&k6P z4_tfsEfG=Tih?<|D+iUA(B~cPliPP+F>C&^f*!p(wU1OMZ`g9Vc)4I~?uKrz8Qykz zZ4npC$znE{U5~g}zL;dgk`GRR21{T{(+TuuWEfQ8pnKR1^lSvv?-~>^A7PKR$LauE zAeX>Wwx79)Lb@A#iFnEP>y`Z{51X`se%O3oLAML$-9w^*jl6PA$(Z!Cxq~{l?&XMal;sxnFTK25=K&=I z$aP8to2%^m2Y(N{ajwrzKUN~{HumFL>@Iq_@)Gu8Fs>5d#$g~15Wa52RZIdLqGm%* zyIHp{n0Mj9G>|{C;Ep>MTyo2;3k&=AD=Hc^$oMS0Aibxg$K^&#>O?kuzdFtUUv> z&wchePNs>pj((`TLXt6-5Cv2xuyUOhz!9XxaRQABa9f}hX*V%S9QKhrK)jLORDkrC z;G`e=w#(3kt9^cP=U1t^?}lx+%w9E@LKUs6YwXykwWqLKdv(^14NFI^o-tlEeA$t7 zEB#jH;d04H@9=P-5CEY1uYUXLTffp8Qx848+DP#!0cwO&@?X)xOXWcHw(ZlJzALHoqsT}{k zTol3wL?zJ}*8rdlK`D$N`WQ($rdMLZQQ~azXrnp&9>WtUhN0o!(U0G!6?F3sOIN#u zj~p?3-R{=8t)0piV}4GjH^Jj_{VOEV+=b2bI+X+K-+qxJ2amtK7Ru;Nbm?sggp#@R z5teCU&Qc_D67Od)Ca`@lGZ=eOqVU|OZ@u;4)3@Aquwm?|kz*^%E5`7pHyk){!;%}H zeDcOoGiHohQeInIZg4%kWGB0yJw{wS1s{`aSo#+M4VJ=ILNE>^*M-Wcekv)9GrfoL zLGWa3Fltiu!08N9C>6ffPm3EC zcJolk79Y|2%^Sy+Trsk$cJwIq(9zQ`to~qd+liy#*7L@>Mznk6o{~gbAzvjGfF?*J z4pB5Eh%{HjEQ+cF&ckqmgb|ApW@!#Q*G5`F(;~G}ls>SVCtz%NB8KX847yz!YR9W{ zC`ZH7`$~Eb`|D)5*bxK2hUj`-yK=hvxXWO;?}LphT=CMXSY{Clx=Gg5(SH;Ziz zsXOnEYM}jSE+99Xyup6qn@PCj5m}K(WCth)NC40PxQ23x^wY&+7 zpeuB}OB{isyQHV`(p^v_ju`xp0ZqG=1pyYZHFK6AZnJz>Y42^bR$MMlbZDoFwAM3wJ^7R`J=3Ma zhn{hrp4e}IU)#31^Xyc}*{1_J-L8fEr-@geq6?nx0gW%YvLuvq>iu1TwMjs5r-?Zr zgr7qUmoaxO8lxPDJr+})6laEtH%?`o9*f|#+L#BpVlhUW7T*dzPR?_(`m^kDWn~=i$S1A3pX&gCp(a*Z4LklxsQP#3&Q_e|7xFZN3VJIE%D3#k%P*{ zA^W-M-Rbvr?SAK!cYpRRrF_+@ajS+6?eSh?UCA2vBa`Qrv&@MTGzzmuIm(8VR_?#$ zwmn^kR}bzSt8RO`xKpQM@#pDV)dib!T0hZY;OpIU_m1t^wJ&{i+l_zL-DTg=5cl%v&a2`t}F$E<}7a_{xqvZdl=0!=7;sbdMWVU;5_IvzhD1F5h(3 zB}=YS=o0bL!66c?`4A+%c^YhOJbdtm!gUL0+S4OHa`ekzywF#W)9Kdr^KX9tUV~G1 z7w^U&(_<9jnByRZ6I6-Yzk=*Zg>z-7c?>8#RDGe)={7l(yxaLk&c$~0u<(m^|Lmc! z&;RhXv2P7&TEqwPL&m;^SOu#}RU$Vps!&s?f~$(k6{LT$**f5bn0S|9A~4bJF;FgM zhZPtXL}K8^FeHS#k_+_tV(dzGqZ5b7#B|$=)_v}nJZ-MbP8ZhX4Z35_gvs=yIJ+v& z#kNgeI8zLYj8c3tnKmx;*w1La(m zDQrqIMGfDgCSv{?;}Qvk;`z+s!W6b*A|L!fsEektZU3Ie&V)nlH;np+EVjf@`1X1G zUYN#KQyY&oOJfsCvI$Wn#-GUD3eVR}Cj#RUF|8pxN#}x4J^qQrP*xdXrO2`mS19^^ z7L|rz6bNaZkE?;ygn~DCk>)JH@clq77Wt~6QO|Ro6En!chTgIOB(=k4X%uZ;4mn5tvgd5~QTkNqCtQ@7_ZHhzyi$v8Yszba9 z^6pqDUKm-`@p=-_R_xFMtUs+#w~bz3fBZNSgw8)%clFh>!xfSyc6nd$iq?`SB)fTs z=LHWujevF_NrceZh;>38fM`<$#;_vF(42uNQwbnR&$<;GY@p!B!H3sfhaiTvYvrlR zuF8KQUugPh-jw@7E_Ir?`BE`hjl)Sa&8K43UWeZmGfWu^E1&$@7E&s0Bl;>eB|{ zv~l#f^?k(8q5+0ORNpPb*?k80v@xt?QRl9Uy4-NjeI^YxEF6Y_6*|bTArV%cj_R9j zwX$C<;RpAN*B^TZ&zo`5ulY@mM<(e&x}esW3L0?$qp9(fBNow0D6`VaFbmZ*KR`zX z#(22`I@P#ieoa~Vk1|dkKZ_3Z@$Q==5v$83 zVs+l6b%RIresANFgME4*SlkRO#qN_ZRthu5=%>)oe*K4p!dQn47%(IhLIwRySSye= zgwQi;TVltxX#tSoR3HX9%#3D8r_+RzWwBVCYR&MgII-GXt0PwvQ(LF@A5!PrFa5|b z5ViWgqLvM8Ou>Dq>3cDlX=+;o^^^>%Vg*VpfJ7?4npwP_rsQRa`i&06fs+6MDhQ6z ztE?G?vs@l(A3c0VbZ7E%Xj$ys>GlYKlH4P_PS&K5y>L;AK_FlOCDx!&tXv;fuvk}22K=gPap zg*XpqMq)y&P1XEjW4*8$3ZdgvjxoMaIU9$&&?S#7>AQh$B_`KH`BeqYxL3+hb=~lT zls$1$JRKlgx$Ej~MhX@@%WnpH<6X)ZKUjRf2l-Z^Of0lj*Q%S(cabd8)!RAKnGx@> zg2tK5=Q6-vMW=j%YJiB)DXX9c=TFb7yIgKpyhCT#_`4O?ho@y=6)#tNaC95EO`mB2&aro{^YiI#xMT|8C=X8u!me(1IAifYcEaxYSZ2>h5=U#oZwYg5b zGESRw=ym_fxIym^D)+?ixQ&nSWAx*I5j>ahGl;^eQfUJ7agGJx`VROfj6N73P!BQ; zoW=TzMIklRqwzQ~VHW)jB#J*iIq?&{95MQn*A0?8-mN3XM=()0nvW3ge3kQyI0~T2 z-EG!2IjtWp9N4&e<#Z)^!aRNas$}l8n~Zf>kmI8=yp`xsD@tbL3Z|v8u{MmK%ILf% zBd7(e+lO^GzYEFt^YaPUU6=f$9{ZK=(L?z)_#UPn3(Q7$EsFTxqqxAKxS+5Ap1My1CT3Zv47!xzYuV#tJVZ`y#fKr_D6nk~75zq!RPAs7qN-QQ+o8<_YjVcFj zy-nr=UM?Njzf{?)uHC(Rty(f{e-|*F-9T4ROJ!X%`6oCHU|2#W1U|qq9@0)UeAM+kNge<0cml%1_CQ zu-t4AZ!Hu;VDxiN%o1nat7f@K`fHq z&y|-}_uJPgE5Gj2s?LWxxeAomYOWa5t8MOtYsPrn6ROXthvl47NEqhh1DRD41#&9H z8u|DHaCw+Bfw}12ph-;3NAw2Z^v4s*52|QXKv9Gqmux3$;O3@#aSU*FnQS(MxR^cT zAB2Q|7=(7Sh7GB$9Wrdz!kqNf?CjL^9MONmg#P`;jqlsa<7t)Q@#tePj6VcVD_>%- z58i8)(Y^2x*~t_m^&4|x&LgGSvnneeF%fC30G{4=@GJS2UGRD1`G4Su@?CSC!YDBL zdj-t(`ImJ7Wd$hk0i z4P-6pLwajZ zzBHyM@E@;YX-;>>rrK)n0BbKJMkvSop5S;l6WNWm#Tp{JNY|4+BRP9R=r`gs3JG-3 zw?9&dO@9>#A*?bK?eW*Ds1p1mJ zN#;5R@o#TaCyN`f)#Ng1^WEwJBOZeqizqHcxKh~+JrWGUNWV#uU-(As?jL^e9sA*j zrI57udL2Xp;o?A3lRrO(V~3BKN|qARVmoX!)zsgTJ;=8sKNY}qwc}* zx_Rrh1@Yp3-gYmk=rTfbwyT3`E?c)DWgEvQf)M2Z;$s3#RE(0=62Gv{Nd2xJgvx-N zLg1q1kVm_pD}&4FUE)zy*?VrpDYlg03Xx}it@4t5WFzUA*9*k3O!8q|XhaDwU4cNB zauMwYwpv^UtKi#Lj8d_BeYM?(z%>3nodLxY_?+&I#Xn0tm2r~Co=SsE%SD&E=gDxo zBjV)w8+o5o5xxh)Pkk=gF;~NaZ4y1G;8;s-Ki}>T19M8XDSHi7Nn~SjDz7Qn5kM@c ztfWt==Dpwu&Z$5!!9TN*pfG0Y zO`8&d$b6Fhu=W06DXw1E^CnhA_})b`K}m?5B4vdyEaiVTWsHtELF$$yGt(CH71 zbkzL@1>)Fm*n8rat;-c<`Bv6-^D;%bbPF)`+|f7X_ugsu-=Ef76HRX%ZB)Cb-FIIa zwai)$6yBzE-Msm0DHZJ~tT42MRLs%kVEovfQh$^XGgAhSuuV1a14=eTZtJeJbM=G|ZjA^aD)Pq+|^9YrWLVuR)u z!2v;1iYee0pKVLXMzlmxta+2dZ2?Vnnn|$?f`M8M^PKNbU%Y+8x~)rQ2@8--cf%mC z$iGAH-Uy1&e#?Z&U)sO=_B)5$|0aHQ{`Oflw0p2EB43=s+1>IFAQm(|Ajyks(wXnz@Zbm-wG$RBT zn?&I3PK9PXhC5wZYB*0y?~+};E~CR$;|_oF$&rfn?c>FiiL<+nN`=&ll39~^7hlHU zZj`Ac@8zv`cgnZequ{zoTBG?TP>p+sNs@|p7~q`LWJhj%uG}iZNgTvkLuFXv{2-Q2S@r;8#}*$1 z=g?7a1FIRe>WZ^(47{$pI1aYwCyX6GYWP&ooIcZ*Etp=Ty!8H~lXmClJ+<+TFWlLp zSh@YVKYTl8P8mM$(wfHeY3a)+%vt-o$-S7!2k^cmg{<*LB_&1@4pgC(1T>3NjH3}L zO@uNs-Gtx}V$*%Kh<|uWg8wNOeS^x%$KvALS$2$2Xdqk60@p4aP(SB}52zOJi{sx! zWC?}1<2}^{x#`i<_?r_>+Vu(xSJ#nDw zB2LnttoMei03=&GMfp-jf@w5km93J_MXHOp$tmq%?xjIh40#J2M%nDoA<2a$*YZX zYmDp@4<9OLak+OyD^OI#se}Vi_BZuC3!wa7wO`Fyjx2yl5Bo=;Ss=}4ASbf^0pMIv z;Gn%~X4He$I(J^mah3Kd^XA6{8GZp;BV;_X{Jd{D7^$DW3r zRqLEt%LnYZ`;qNxk#|tX;+_ZfHVqc5*kROJ#yc&T92!Fz9m=TTWf}s?8R<+K=>P*+ zEuqz#DVkm+F#u?1Y_Yua7qY`**W7WEIZ%HkY#)0=yLM2}W6=J)F1zL!^))JccZ*T$ z53Q*j6`$B{@`4dBbe)?&HpA5+#@>G4j+-FyfuEIAdS5pQF^QL>P6J}v!`b~r&a zn}4UnP^}q2w=uLajikBka>v8-*$k6=nsI%d{^0pN68e^yl$O1sd(EY`qFX23^|&}b zazwAm87#bQmZH8Kms(a{R`uprQktxA@s##?jo<5M_a$;a9<1ZB;!VHO02QF`^mmyn zm)#T?Y_7o$PIHvOY3@>daC04YF&9)-V;6r^pb|T@9fq>(`ZziyN3kIo zJ5m`+O9S!8jtGGYBamanj-WXm5o1UHZPUJ0W@cLZisD=Dm020+)vKcx{&rmSgALSU zdlT<(iBp>FAFj zLL>vjuZ-H*K^%wh&%Zb? zj!&LBaXdiExYF5^ph@PjyO;O``}AAL6t9S;n-4v44KxuWlP$YMa>In4^BLp~XMoqL zcn5`^#(@;8s~b%ulo~=Q33v+G2vC?E`fruq2q1E2<|Gp`Il37^;*?1%G4?)_i6WhE zT6*|rPQ@Q%%jZwJbklv8DVxXcYTvd~r>{Q&l@B|4NF6orv1`*dT%|*jQb9^ z{1QX^(PwFo#sEk_x4$#Bi)T)rGHc;XHn#WvDUK83qzvjizJb=h5A@Lf6%RakxiR0| zlB0bOFEL_qctH%)#XF5mj$&kT079ho?Zl4LO|{Fj!Fl0iD`xkIqoK3x1K=emeP0IW zSNuuib7N)utNBnvK`;dvKySaI69<4G?9jNe>j@9D)!EeJl>R^r#m{WE@jKv?(k@e% zv%+=|U*J7|{?$)iS@xvFwCt7LFIf${7fw6AbuG}1wZeCkI4_?1=o6S{?*EII5=tsX zrt&fGPm+n-&<&xKq$EZWj(61Hq#^p8aXFKd>^6BsDp^FHh1drgUR^M~mOizH<6uZy&n+YW1-Vz#v)tB90?$M!kA9T{tDv5#fTtKh!~3*{;3^CTxE$ zh0-po9ukK>JSkqx5FO|tn)v93s~cRcLiouE$R2T^Oi_fvO^)~*H#sgoF33$*AcUC= zCNDWld^rs=A!cWgm;9MHeyhPtu7N7sUJ#cZ)_KVfin^EvxZ+);CF?pJB2z7r>#sG& z^jyG5W}-vm3T7AraUHy1b6uiCj-@9d(P4~b0^aD29`fJ>*SpM?Eu%5b$Ml<(b5z+! zTQ<@z`4HV@fZV#?6UTkxJ6Be0Or|lobnq=w0*;k6-ba&Oyne~g8>jrf{TJ~_n&<%U zWf*}1XzCT%)EQr=ifc&>tiEJdC3ML z*4=vSsvRf{z2mB5x2^-WUZ0}Bi05a|m@ylALc~pYHz0@+m$9yJ8amf+SU^x)#e2f?0jZ7GtF3+_EKhV+tEn_W8Bf^XEm= z`+FWdES?d6iQmP3=v4PZ)iAZSC$HeYd+VdVduYa!Cq6vr^U3A(A`JLTB7S}Sb{(QW zm0x0^FuYgqK3*gK#eY@~6Bp|4C8-pMEy}=vDL_Fn!~_gw?Km@8EiXKAhBH+Zaud+6 zKk&Ef4=e1xb3;Z)M-p>IxI4#+({fdvv3Jgj$YKd`9i1C@bh|NDwev@AT4f3U1bC-B zUyX3VcXWGRCk~&4TbAw;Ypbe^d(ap;FHXpL5l`BnN>mttiVR(%5>2gD7$wAnMPsG4 zz!hB1ia47i%dH>6uK4)o)1atWp1^>!9QO!g=Qh1U^~Acw)K^X~eki}-p-Vn{B_-)n z^>T3?Yn9Y^C^?n(88&PZbeuSRXkWH);4PzYLd=^rYaULB(YFkE)z>)m))B*R9d_Gm zSM4}9MvfGSJ(PgF@4i5*b%oB}XyDEm=$fPBZ>pR|wjF?1LR<0UO zMV5^6IkIBoTsA%2gh5^GZZ6lT+vCC69x9mQLiWBACd0j-^o$uMY7s5~Sk9p5+VslLF*T>~C&giiXGZw6g2p5Blz@1(U1c*)Ext@`H7#GGa zT>x4}(AUY*4i&Y~r2Qt|z;rtkoH}-+McMdgblLd( zUyWhZ<~z%xU%9ts`S_QmeEcW-)zj(|r&^GYr=%SrmY%xiWftaIlM*R#y^aaN95m78 z{gg6`F6^l4xmGjWnVL#SYF4V0=$EfecDig?uCO>=npEB(@Z3i)P8#bfl=j>7IJ+OG ztUOb9?i}QZ56<~ci#0L~_HACyj=A-G`neUGHmyM9oOnz8@#fp&PyU7&B&x-=r~ZK6 z@T$y3XNsunW=%KsczQ|OuQT;>hj<6tVhovV3nLlnSf51Y8t&*;uqezjjsQ_KP)w<8 z+5cS59D@k$a^<;lGwl*(U0{z3OYp~VgF@!PMwubqAn3YRoeupgLzUIKx^w4cyWT(N z>tE+SnrlmE|XGPZ4)2Cd8H3tY$A4EJE zjs^#=%UmZQy3vXV3oW=7P;01K1prGKu~-7)-_o;20VedV1B)PoJIsh>r@yTM{*w#{ z|K4?32MC93j99MQ++k&B1e84`=l?;R{|Bw%-~9YL8vgs{dEr)(8Jzt_tX%BE^=n`c z5kndo0mQ0F(?AdAHRD|9A&^Lpxr`Kh za%PrOT4rgc`)@+-gCp-X^F7X$(e{KH*f4?Q%4%5LUVr9U0-?E7dt zR6UvBFE`#9m*=W3oO9WL(>o=Cq`rRVCw(uQ+o>vBVvOSQ`n7)wM(*^zQ}O|>zG-_T!?tZXOUG>4? zsrR(cduY|GpTBoZ9kqB#^`hAy>-kecR0qb?&|^S`l+FxC@9cmal= z%R=iRYy{hw%jXx2b?0X!#I+k%{5f2IlkZTu`0>H!brG&wF+olnO_9^)u#6W>p%1(onpq?UHb(m2v#_oQ+GFZ4F=_>1=voC8 zeL0v``Do#5cZ|Y7iIXTqnSHV6RC*Izw{~W<&TrkJO|HkC zk>kw4gFh=XLT1h+X(t0|F3tk~)OHv*W2cUVx0?Yso6~;?P+Pqw(eDqy7_ezZWfKNA z7%T1-KQcKwH{QH=@68&xl$-YMy=h3=An^S9C*%)HyW@_uVdAYne--Z!O1pz^di?&o z9;W~C4cm9;{rk-`b+_7E*=y*zVTKYR4Hm+z785^DV32X5@(`UJyS>n_k!~ws{`0h; z*@606wD|6PrmpQDa-jNr&%?wEk5dDytDHg~3vrZbt>i8d9TjG^Qr)%9NC!O6nT{~y zl#F8l;Fp(i6iP%gO1$Yhff-qa{?u;}jp(1*Y*SsIyS!4J^J9HGU$>>ly}gZkAbPeO zrpDOL{PG7{_Q#evwitNRKgS6%_cBWg)(64)ot)$+gD@I_ctD&(Kznma{mFV|q>-SO zHEX2L=f|=KJL$p-Hhqy-C+(@Pr&V>Z%dB7XXKrYBHT#K{p+ z5fP>$2f~i099rvlpv?LR0Y8epP+#wNq59Q}_2DPkX5EiMlf@(GLg8Mv6&Coo=}B?i zW3?HGPtk8KIhgJ8WaB0)u?mDHCE|in0WBw1X);mAg=x&fO>_cOaN|gGyYU|5&T;1$ zcbSxAxz?jeRF*T`mIomwV+TVBv?FLe(*J)9*e|=Bd+Y0s+Cz<>>+P6Ouk7`GVYCCg z{#;WC0L1Sd(ndof0BcK{K5R5eB&o>MN=c54;DjPZfnkd@;EeEb7DZ)xgBXJf!&6L3 ziisg4DK#lICNU<#ZZq0qZJ{lp_EQ#WKV-FNwU0M96z}cd@i&y0jC(Hul|+JWpQb9R zrqmM3QF97~S2$I8rJpMo7aA_sZ@qS-mbi3(%pzpLdLM|<4WM>4SNlqcc>uByzal<) zK>S$wVOsXqv3EWbO$7rVjeh37>W#T+AM!7!tq`-tv-#pVF=yFy$apTVd zbj*7W{cwBJH`)f}MdX!WrYHqFR3(xM#N?eZ*+G#~4}@#Lt8}{qx5hvcL;AInM`AY> zdvSip8UPDDG!^h%p&35QE+@t{4wwoK$N>YD|ChKUYr9^kYOf!oWmLo(AltbV(OL02 zUaJhE#ASwmBre2jG19x~52Z-o13e@US1$#s@&o`Sw{{o~l`(Ti7zWLa`gq(V zXRj=}ZFa#JS9V;hxV-+JOLp#n)bsF{&%SEefB(CDCA6(q{L|khUR<;~IpMgb_DilynxP>UQ&>-YQJ#5KZTgq z3hM{9%1z6SwOLdm5h0q11UFL>v833K?^pF2wFyBXDHLvB@HtTN)7c-zPXKWzCyhVN z_*17AY_jv>>x&lF)-IA<1SZ5+CmmmkQ;_}THF8Whw23L~rar&MWxsl*lHcRg`jyd_ z-?Mv@V`aUuuB!>*PxF%hpPGo#|4U88P`wxb@^+ZZ+fz_vR`@ya!B5l1uUz}Zd%h~& z3IA&7p#CGi+BbB-$nxF1WY>-%OVblKRo+x@kg|MNebJ?J=WfqHr-H7<1V}eR*pIx# zz*y?igouS}31b-@#8@IK5Iw|TWt{ix*rSg}h}SXDz~;zH^2R#f5}edH&iUeL?$i4x z8FP1GR)up-ufRir;@#MMf7PNe0KcdOA;~gAf;k?{DrQ?HO}QlGr?2N^}EDQj<`gcld(t2hq{L$N8ug>zD60nB%5iVl4Ww^Dro@g7~!5$j0E zTd}UVhYlx`{bFyPX-@DnP78{gU05_bdP}-1O1G?D`=*$4!xw83d#5>KQ}R6{3Z`D! zb(_p9q^()9t>nsS9Y^Hkr^d#m_fA;z*^Oe(8ynX6PB)|-7PA}TVeO0VHi~v6F?HgE zA795tzy9NdiK&T4G^LIEMX^4<0d733b2)oAeaAlV<4G>2TlBZvZ-RdNtepvT|1n6K|MRIge;PZiYNGJH^`!Vi#k^}p*@zM4_4M){T{;c$7OC4G zxohXZ<*tmi<90o~=MJ^=pkZD5^?Hf`8HF{TYJHRy3kBHFd8xLrsO0JGF`6Ymc6Iyt2#=>dh8z&F=eUU+`u zexPV_PG#b*mKn(zQ5bQ60;uVjptN|qjSk#yZFsx2A<6vWGX;&Trlp&v-qHQ?sU1gn z^3$T@()uJ`d;WSc|GNd7d{5W2tAi83!rQrC6W1gf69A1heC&aQa9sb1m~)M@M@MnO z5b|c^841x>qq$p|zLi6Q=wpowfD@AoE>AJ;t-%W|y|G?2zVv-No-wssJ^RY^_USd> z%Jc4>FX67!O*k{L?})#@)SGyTQM*Bk&_}9@N&st9>fG9(a`M$Stubc@L^vl2~J`TQ>bUBDo_?t19#=Ppx zOaAxTnb9rR&U84N$5iCM83vA`-Pgd>)vJwL(F?0Z{Tkm3#?YNPgZ*S!_x}6ls0HWx zzhjuA{|5~7DCyXKA$#V9HR2}u$@m$;Po>x3E^gN9viH&2mwqWCB%5x32Bla!qwa zQP2efI0dD57${1VS*eKY3^EI78fG#UWK??W#4(M3luwFI zi;ij)T{Buu6v>g%etCqbi1)GA-;0R!qgkUOAYK-vY`p1N&U~{OyJySRyD6hP8GEKq zuc3WNN!N3O$wqz$dqVDagjuwZ8>p%&9M^AXFd-p9c29CbvV5%rZ=p7Mw8B5$K@0h+ zJLToGu}F6=Hf@6G^6S|;Ueb8C?-cY3%$LRVTK&8+YV|9z(zXn&E0)$u--s!y$;SgD z81vxBoj2)9;}lK-LZ(dyNtf%|jp4G;paM?Y;LsRR2Re84gaz(_*=uNzdMwE29-4Vp z_+&Y;?d>aYIvZ<9>x<_FVw;jMwV`la*SM;KafRsSaRrxj zM4ZNoHo6G^HVfp9!Z-(bAPYQt$fN$R7+lNPKdh?p9_%ADC%BeJibL86)ON@HB`LAR zc#xqp-#mo7T^a7^QYIZgHLnng+7&Opdw??^{mtejH zv$v{3IY_sb={Ikxa!gfW%z&!ZNYymT=bMCEbNeF%Q!epw@;zd+WY?kIDQ2d0nIpeb z8w?jftkhYbUw`!YU*|sdEs?j?qg7+aRI{;LV8PzBtuNhm-)p!ZiT{ZImh~>JAcW(& zp@r#tQWD7|*`&-n%$=1aH$s(A9LIl%6ht?R6u4Z;$%MGFUD?T*$<9_O7|UrEDF}7H zm4I4D^LuuR-)b2pe8tf5Xnan$zkR*j-|jT6$BquDdx%?&me3BkYW(+z1H9yaj1NTr z&+&oK7W|{#kkz8SzBfay1k&5AVU~$XEjEN-f(B_oG-e7k(OQD>BSXPKqkyDdv!({R zl4^yK7YBkV6NeqcNt$Y)-K>ZPxgap0r;muKv7>vAAf``NnfM-JsddK8HpAnb-?5$_ zul)m}#JQgjHc5l5r}hPX3rZk~MWtHw@7k9IDHl(7VweiDN@)>~?ebE9<*)hrY^ zpd5KC1%-&1VpJ2eBDsiwMyiO#(p-e7%jupqGxI#YM{$9&=dS6S zR^O!W(K1e<=yQIocNEs`O97Q<0B8yj;3)L3DqO9_77;+9R}JL51q=CEnicYsy^$JH z%n#@NMT`0Q;UaX5jWz()aqE;_R@V z-3Aas_4B$LFZn-ULZbg26Vlv44>rK`(gUrKzH*4S{@TZX$yQu%cCpmGVg(`OJwz@uY>p5HZbjy|OfQ**-hOVg7 zX<$Jx6QijXCeK-gbK`UZGCQF63nLBk8s=i$Cd2hY6i9I6sS+ndIwC=2$4+0fM!yP) zbObjvb1#FJMj&gXeh}6o&p>@cO|SZ`sdz6m05hb*sP1Vvlo^Ou$Z{cA(kx4;`;bAv zWblDz5kGxA|B)_T_s{!C`~vP7)itvrd-nJVwaVT`+v#6N3>!A$w@=yGM%$_t%U1_~ zqD^b%xl+SR{%%wBzu6Sv#$~r;lUno3;VHLtD%w5e6)Bf8WWdO=;2u6=&`@6DTYmhz ze)7+E$LSTmo}5)PkHL zeXjYPxP*j+^n|obxeI4GCHyYIK=lXKM{wQ+)_GD>lU&{BKa{Jx9;H%_R*oH8$-jS8 zeE31bK3N5h&3SZ!6l+cr4^13AU=lI#08QU%`4VSWAoWBi6y&-YSo5+dfk;r8D~)m` zGd-TET=^UFE)1v!h`p;K0M_zA5e&850=k!x-@a{|)-s-Ng76{|FABo*$M%EZuvi_G zr{(LQya!*6V(^WyQ_HIl2SIsf#Fm&XegH&${q`i71F->!-ltEf2b7n8^+WWQLTk}G zts#Inm${Sa*Ri#HVPA zs%kYH$<&HQbomsJodBSR=qwdsV6iwXrS03wk`^vkte%m{)H|V|=z=3g4l8y>@D%d6 zLLnb?n**$$2Tq(>wHp27PpV9s?mv=F3K6#z-ClGg>9V&#F;Ab%XDN>=^DZ~eCFR{e zg0U4!I+@&iJ4rAQ6+t$-334SW2MQ{!(&1bRqb3<&ueF7DpCC6~4xaqW49#3urv-2b z+Q8Ebgjzki>bK#e#|f1dL*i9xLp1;Sd{lHpgAFv%1zr(<*&66JxXsiKe@OSg9hjYu zM6N5^!c{J9q2R~cV(&tk-{A{0)49qp?v1BFk2zAT=cd_YKc|r_%$B4i({R03XpEwUwoEgia#lU$ z7pB)s3N+0n5m#xc*eaY1`kZ#!^)|7<7!)^ak3JN#IqOfEgD}?|m3;ARVB+pH#^oD2 z0>>jbJ{vCa&s*PKV~k2<8)hndQC}Ccq>fl>VYxspo@^W^j9UVUKzE#*LQ15XSS&^j zoIaXjP93}3AwzSHOlzW{KCcGwoLO$O0DpXZ2*y+2pup~=Z>*WWei4@bga|C0^RTkA zK{Wo-xLKa+i`R`>9V+c;fZD^-IB zz-5MB86j#PO>^wy-`Hfh^CTSZlUP)!gQi(rqAeK z7C`cHTj!wWZc1`Yw8Du8JSNi=TjNN`E-Gev6PcuQ78hb0v4v)1iwo>7x_jzaF?pq` zy!`BK`}iGuZ-4w*uC5f5Dkn$C7OvT@uJXZ_nw5_4zs9C_a(cQbS~~BcTRm2?O6LN2r&M~(JO2|&Qhz~9Mc>fUBD)a#=noI zf3)Kh#AR~nsjYEv{f9^?ywKvfhK_!}#T~>ofuSapBoJcRCC9px?2Xah@(3$q;e-N& zqqb#oCD^)ITxZ^9)Ep?XpmRi?iG1k zT>)G_dxV!~Yb&v?40;`1iVB!TGjO1)oZvF}%X<=w#xx77wPJvPXtWYHA&evia$!2? zB$x}s34v1gc{#28XwZ((G2EXI^O$JRqGo7NgX4+$9h8v@&Y3x9z>NDCtSNK^;Be z)n}I8+cx*XRYyK6XxnX2@`G82HgCIr_UL&FzGgT06~++1Jd7Pue0qOO@zz|lKbm)g zKR=|Ep}Kw4|Di_;i<;Fo`S%`qa$IHggbvk7Nw4=ly84r*38UvO@x7bhr~BZ-ksI%U zhi>jXeaWSl%&PPE2c0{lXHjoRv0eXX|DiYESh3peTvoB`e!V+x$vv=oUIO5G*X0m=GOh=+)U{qvE6EB?`ut z2hG%dK#z0D_S(_=!f=mx{kD$H+8n*wQdmjm>^can}P|y)!B))IIeO^(X z|CZaoKBOqme52bx4Ef@Gm|;J9S7!aeO247aHTGJzxp}2!@SDo~#t&;&ZCOm7VWDt4 zwa%PaGs8;7Bx<>^@G?|iF-KA6T;ZFrah{^g+erKvb!D9L0&$>riya8l#qEgh)YO`p zN9<#NVA*L3P$1t5*wqe^Hg+s5z2iBm3Hg^C2FrrpXn|dR!Nqi?y1e)zec=V#;h%-2 z_!M~gui@|}Z2DJuDc$}}+{+*J+mCn;g41k*UPJ|3p{m#lMWGYXY(t>}n^Ga0;!rMZ z0Fz(tixm8(TX*hMckJ*z^$&%=&%=}F-h!8p|8xCsMi$Du*SA_eX-B-IAF1_D>(_@8 zYwuq12!ajQm12m>6|O3^B!YxRMTAvHLu5EuNu;%!L`6mQLC}=}`IgQdC`y2g*S>w< z()Ql=J$oS6qM&03bQWSASu!LdJ=WqP?r0v5=#-U^fTdOc76OoswL9cf^aInSlO=fp zc#1u8OXTXi5Gj8CaL&Gxu6t);)FR@)YISWbMlRxKO{%J`t(upxUcA&gzi89)1^uAY zeBml9fyb2lC~y2q@H35r2MrqBcm^83YUK384I2dCxPJL+IS00{UcP=KG;Y`c-(0?| zpdi*gcg`|VUOeae^?JXJl6&OO%6n$N&GpVI?IruIPw&uvlc3_TC~K|1|3dmLEG(j& zL`1}ebY8-Ro!77LMLJKqR-u6t*(un0L9mz8|DeUrQ#9;7o~6FpboROG>+?HaSM~f4 z;)pt;YEbXK!@)7EU$4Q{!;dAb6EC*zP^@=c;e7Gjts}d_W4t$G-+y%M;~xg}??2#& zkB@!yJ!2m(UVLoH;zdjDzkkW1#Y>JYUJSnl`s|y>isx=J{4PCirD;SXIT*)uf`x+~ zJDU}bXnmNahx=qsg!!3ymI|wJkGEI|vE*2C5Gp1kg>kwTk$fk)S|VffK;GP)vUQ3r z&L2k#KH#z+^l-VHV^n2JLG0L1FRz_2ezy2%c1`sR@i9bxG;e>`E|1Lr7^2mk3l^+h z`&FZD_3{;~*xBIEPk+Pk*RQ8_ZV@%&UCO?TwMC(`jJ8DoU)lmKwFSr2ANq%{SZ7r< zJW5lC4jM6Bd^~pKfFa`ePp?ebUDWB8DTjYidSOe%Ultu=R_+vVk zd9^nzLPx$K!_CmUY(*$TT3&5)&1SPyu&IEV9C(shd(Qt{R+@70cR;lvi8wXO)7i3V zA?meckbv$3HoAaSh!gMp37rH`Naa*~zI@|`Yp>n#w73o?JE8Oka6&kY6u$4(%~!sC zpEz;V))OGR@txib_i`d0yyzf%Iv0pi5|hEK)G{@^|$J{btEC--~~?jhn7 zJhx}v1L8T@^5D7$q4vQI4?;gN`@yvj=%0Tzzk`ied_+SHb6p8^qA4O{()J<{nP^T` z9X;kLc6t&V&~+csOxUMntbrfqz;S%94N3xAr88!hYn^@7=W!x(!^o`pS|HdE(%PMCF!cbLP5Z3ksH9jyf|+5=>BM z5{1~jSdD>jT|a4(4Pqorp+HN}W;_EWWy8IwFtZVkJ1VR1f> zjOyQu+G3U78I0=UhP>7-Z+4oZs1{YR)Mlq7Wri!(u!t~gL~WK`KGilm4tP9Z7OgrF zEXg28JghnuBGN$e)}pHAz{{Bs8z|l!(Z`eC$`!3d%0HzG-b+G$fpOdK(Be0Am6QRUv@-r++B4;;|9PluizdUo%MCrd{A zjP`BwTFcESCOt-S1!M%kZb~WV$PxBrH!Dhe;qUf~|Np=L{x9#xVyLoUQq4k6Yx6sH zY!6>jWnoRtC7jOeP|&em8UCjKr~IwGc)QuJzA?>S>Ki5hH~6dgve}cnH+x_Hi#mM9 zjNxitNlBjgRvlI=AGhfuA6tWueSd}g`{(M2>C;EZ$6eYe$^O^=^Ye*5x29<0^m>z4 z5=HDJiKG!1$svQh{WG2MjL{rdT2g}C1dzQL775Ig-71w6(7CG2B-?Qa7HwCMNM=>! zc0oAdv1&}7k|4JR=8?Ms6e|w5+!|1I#GRljpeY_V^RQw&B-k~^)5BNP^ec&w-)LGS z3>EjBUmPhOfhtx{p;xI}G&TN0#j|}OJI{7Qua{Yk?Z)0Ob&C=Y!6bf16pWPMP+P>R z$^Ea2@DtI`|u|DVVS`}EV-%tX#pPs!BWYnaGUO81M6W+LbL z{W6nr{$wDL!}PuTG-~N$MKsK9+G8mvNH^lRkAp%1k*@%~2t#l=pzfl%6Poxhg{P$^ zN-A2ol{=I;H5w_3#SA(6+!d0Y0e?_{zc)<`npSxZoZ{rU-(_e_=fC~FV)g13ztfm; zaB4gp5>0QuCB#909NO1w(~Ox{Nqd`q6*as@o{bFIB6!D7(YRhWg;B2XI8;c`GqMV! zp|w+5E}P^)V1+ameV2bPoy2?36zgXAI>CKW9WJl@hZ0Ju-h-tYwf$yu<2%AuNky6yG3>%pxYR-rvyS(Mai}>3RHVEiVvJM+FF7H4As97)v!;IT0_Km9Nvx?0AR$zs0LfFR zby6t(UYzsIG_CK1c<3w6$t`-v47h#QouL}nVu^T1e0EM+Mqht@*Aq{Pc}6b3i+GJM z#{3K7GiCM#6pVRutV|LSj&Z(#76tOWFv_QwIE^+5pl*Af(@5!KSD^?+Jk?BD^w6v! z`~I;AajX;w6wzlNTQPO|_VuO4V6sGduv-CQf z0a=2=0!K^I1mKd6m)^sA(Z$W1%kOm_>wD$APE}d?4rg4OzWEP8uQjq`f9i5?`DWiE zLFRa4V?c7CV1W3`Eh(rO5#xq z&uRU#SRW^O1G{z|PpiYWxCqgb<@k88Ey&;JkO(TxcI*6oO;Hit%PH5V5JE&NtrqH+ zn85&vU)9<}JO-KHX$wm*z@Y{I!sf@FG*U82huv^-N`D=H9f6}4qx8$M1ASk^yw@N( zHg5Dhg6+X%P_lCI)HwFvl;pwZ>d&j|Dau3?J^}GmF$_pMPhRrJHCI2Uzqc38!w9l~F735h2 zZJveTEtY>W;_e{T0@K*ML}y!|!M??zbPH)N?(O?5g{WhNdwZ6_D0O8TWi~Aej|3gg zuJh4(wXQr$#}HLDw{~-aNGnmqDo87BX4N8b6fo*ZqFiG@u9#x#J6bH&%{Py#p%B1`dmLxw71F1!Nxv4aO<-^gDMSIeeb7Nx*i!`Yn`*$3^4g zoByn_T50&QSG?U1E`0aFx?AcAB@>#?aMTXXF{;H$;;2Hqw5F=!PM}=H7W3Xjp(<5$ zR18)5bY{qQhqSn;uwC06c{P@8)?x#tZ3#9|wprENtfPMQ7-+1+-(uNR&6SP+Z8V*W zsSge8cI5z{c;Wj4YL{MDFHrJ39=!Rsm;3c{4a*g;7PeM%JGF1Cwk=3ZPEJgMu0M`H z1`(Wos%@Atar0g)E4qFBjgNjW&b_>K>fTaKgT>pcF6Deq`Az+o<++yjCqPogZmk>E zB0vO)QHOv@hgqdGs0*i1WsnBwGlp5IA&Eh$I+ExoAt6}%TSo$6z92l&BpEqvp$t(! z-)Q`)@MTgH1LYn}os2ibPbzY~Z)uFx)e?eA86fvtV~^JHx$uqfinI=?Hs}9acUkyJq(yD@UCF8>v}TdXw7F(0EF?6b z-N8sUS?W#Abf%`*W96m^4C_&n?-EE?9#Sj=IR2gT8X&PRvY;qPpivg{@*wZS#QJnKE z?vk9OY?+mkmpsf${VOx6@!osa{sTGbEY+a&-}p&|(x|VMy?zcA1+EvqA-bTG&Zq*a zbEqf~T8-jE{(>bYhsxphbEqz&6o-~>tLuHY7e(Um6kop?hXkV;1lX`(*L{`Jqs z$ZVc#j}jg5A$RCCJoB2qmieC-5l@aaJe}cG1rAJ=vyi12JC;fqS6QV6f@R)uM)~V4 z;HH(H2E-+$Q`55(ar>RB!%$v6;={G$^Xwxq;Z@x>fd*MbFLl~&QfT>BqS+db2P*5qQ_HRu~Xx1v! zDadrTa;Lcy(4&dabgcqxmBd!+jcTcmC-c|qq+fh4zSfqkd|VzV=bx4}J6B)@yGiSY z4Da*bTV#1o2GhqlAnj!K3){MmO+D~wXoXI;!K}z>)Un;COjY(8y6H|Ua*=_AgQCL; zxvInh(;Gz;)u>d@I2&W&ob+XnchW>#fRBvMxsGd!^~-PKgz_K$rL?+kIxK>9_lh@9 zHtCKF?5Mqcr#O#O%J5lM)3UwEqC7)YiHT#iZ4<$&KiH1Po9eSRC_sF4#Vd(NzR z%m6!;WA#)=99~mF8VhV3TI*k~_VzY=oDvsA^%vL;?9qiTi>JO`s)CLE0VZGn*d342 zLyxVPG97Ndb{^iJP0ac0P`@`(eBJI;!)4;nt_Rz!o3MHXlIKkwr@^{5q8rZ!Ta2Mg zWWkw?%ppb27d0`oYpa5N+Q(lCDoMu@U~yM1K2)oy#cIKUibJ@IVnu5CQ&uK5xh>vi z1&Gl5zMxz%-6R(HZLbi6l_Fm9|7UyjzuWHjz6<_td*J>ltL03&7WUQEnYQOkUXHj$ zI<{u7o22K)IRR1*y!O6%4)ksMM#)lM!k8)YSM>Ukk(A=8r?9^lk&OGFibxvDE^gdw zoW(_dFCsY|M#3C%i=51Fhy(0V#$NpIrB4sdFFyI>)_bhfcgb$$C9z$+b%!`Et^$}1 zJ$9&1eeFs4G`0AA!fU&g^qZg5`@Fl{R|e_vp~2n(fITb?SHeLLi7K3NrG_xza$OUk z9O!g}v6rDfo18R3XpvEBLf-vl>J6y_3DB~t0_fGTcpiuw4jvO9e*cDe50wO$Oqwrq zhF8D{Cbpvg^SGFi{>>p>LvZw>CDmIuJO(q=fc|G!v4ju6IFZg%0YcL(R0SI-M$vIq zCp&SXa%n6Ew5Ah6%m9o@e!}P|nrgG*24WcH{3n~~TU1;tIiOF1*mdA&(CDQ#X!Mn= zT#@e26QVZb+h<<+;{Bs)#iAvZTQ{Ptnq<^mDyH&pP?L+NTuMkb*;6UM!`nZ`g9guo zr|G}Q-9qp%!N4WA@D$MG#8EYzx}vX5#fw~~J=2|~ zyLFDR%sf5zJy~qzy>uNF8*$=i1+`QxJQ*~Wbg|EhZuzsYBBV3cDL)IZxUm>jXm%mT zs&UM5K~eFX5GfY;!`Fu%Z1ebCvVw7xqho4LTQ*lJtX@`U+;X99o$q|ZeUDkJCsnma zw*~_Puf)oJw2@@e)7vd7QZ@i6mSy3zw|~dg6E7Sx{eTv zv1j#OWv`#RX4(b42?qtR^aBuufnu0uQ7O`GG(T|-OyXKXye(R{uN5A}LHo@8wm_Z_ zMY{gGrgB%%)@r}4Xl&o=DI7AShvLklT%0)~cK+S;CYU*4@IAw)?C5{&ct{%tG<~fu z(Rp7*sN{s0O2rAl3$iIu)N=@dc+X61wY_PIIoZL-{`0v19X^ zIhPDv=1hEV=-C_o0?W0VwyuG;o~o&e#X1wJGBW|Y?%pRYux85g&uZsRn8~s;c7r;8 z>c?*_z9-*x&#KZ6J>Y>|on{wB?Y;bwD(pIT=RP7!iZq>8Ch=jU6VB=s;H+a71!@Hq zbV9X;;(QvW1*a2AK&4O}^(%VHM#g42-EM3pPG1#G*IhG@+1{WQPfN{JQZnUq z{&DXU`@^~viY9u~gzD11y~m2*sPfYzZ+%`-Ryz*TvwIKZTv-5>^z`)W`oI4byJW-Q zj-3w=@7HYr^y{MTeBptcDpq-tE*+KMHXp8Bk=Dx@jXWR83*N=IDUT5k$;Z<#3V#;B}yp3T2*-&F~fcN9psy2x55Fn$jV$78B6J2JDhTgV;_K7 zFs0CWYX9cd%?5Jg>Pu&4=7_g*5|+-Rzb-1@=E((>Rv1H=o~#3?KYnY$-5pv#w03#7 z%hTgCZs@yY&I;fA(?1_Ltly2}KEid)#WG&W2a;^k0i&6CDUAo*WUzgCxq38``&TuSz*=>d%k9@#W<4S1z^1iFabH6DsKq zX6xXJ!y~-ihW6{M?s%c$<}vHCleWzt>Kq>%Wvgj7cu1MJEZ8&xq+Qb)Z4uU0L|+_b zGB{zaz$lo29v7`OMS{%m3{{GE(mP;#ay>eb1 zuc@oU&1p8bSa5|Io717U!}x2Wlek1|`OF6ya9Z~juhTcBg4xAUd(CZ$J!5DUoKcta zk`UV!w4I>sj4*`+Y>)m&+g&=pxmZ^?YT0(xuw8xal`{i*>#Cu3>|yDg59~RloNL-_ zsKkXO8V|kvQ5YNbm3Usf`7`W2D$sCYk%r%RS-YD2sJ$!qjQ(BxW!POR`}{N6=k0J$ zXcrxYnOtJwBpFnYe8wEv44vi=gaaOYDg)JjzhF$Mz=*R0BhIoN^8SMn=a8GlKlguO z;2wu@GCIs)G#W>Q#Tp!iXWkC;{U>;%!^=i+7;uXV8HTR|S34jTay)*Q$Ds{9x^i3&rJ%9OP5ooXbX@U>C1m9?;%;Ju^j^xY`|$IFpi@_8RZ6OJXn>@ zze&60A0!FY%S6(V3l+cs}FU8n96f8KivR?N*Fo*TIrF@VzEMAR=p9)RE8 zjC9(P!3m)TJAwu~)Sxy&z+i`AFfI({i;Uu5K6zf8fW)82Z*AAE{j$E7EMC33Z!sGV zV`);i+IA1_gObm3PeX|-{dj8Hfz`R|o`SC36TT72n9Eu3jf~RS*$al(wXJoS-uND zh2?@bH{KVV$SV$xGbb_|yV-v)Dv+^yoX6?tA?NndUx5KV zd-dZm8y3Xals_Jo8_8NTJS?gQa?M$pB+8co)gkD5jCL-Fh6NdZ{kzO-% z*tVS3zw`f0Io@BMyyKt4yEl6q)~kucia1StT~8e-Q;M$)ocIN>e%26qsQ;!^PCe0Y zc;6c*9MbU<;vifN>A}zJ>Hkc3@Re8Tul&8wloS2%v_B!+StdVor<#cUqd)EsGvRGQ zo&_&4(4_$@k|4$Gn`!JP>Qg)8Yw$72hFXPy2DLC63$%Hq45Pw1@d8K_l9B>_I*`3h zKQlfHAIsOxjKbH=gvq$~cw>#%^#m|J(0C=qw$YFEw%PIBqar!OXX)>rNNpi4RQ}dh z7;!SJc1D&q&z5Pc&6dapD}|?8EFAkM3PuOZ~gkYbJw%%sq5BGtD3fI)iiyq5G=O|2#ys#CfOv$g0$Zl_!R5v zdhHAV%q9fpzVSL`^o6e@9^-ZRdiEd8;&~GkM)3_erRF=}A2lP7sHBV3h8U*f@;#)G z^dV(r6vpK%Ae@hauy7SLQVyy%(oU(W^d@0MAz?~206~!bu#FzMXq@_IB;o6JGH@IzQUmt;E}_YquUhZlSMifoW?W z>YSh7`JuH#*X=2mbxQZFW9!yF{Ls3gYxnF~+jy)?+2Ec-yOaP&K)An^br~9XM87N< zKD=aTNm*IR`Tq{)mkcJR=KoG;VviA(q^!K5lzY&GNI}w7|R6CO!7C69VXFwrQoH=mzEPG6> zu!|KS3zgzC9b_(>rQ{+w?h#5LC$Cuc+@09=xu)@yU%+3A(q-3+eE3WLx=isM`2Y$s zvK9_nd*y$FvMc7NNq^)5hjz``%|x?1w>w@P)FCZOC|URV%QD$^WYcG^B{o(1ybY}P0Y%I$0ANPri689ckk`|wwu^bN8bOQQ}Nlj ze*H&qm?m~}sDUGNz@oO>#I{qBS4thNrF&+-{o~2U)tc(1vuDfS^cZO`$rpOsj4gIV zo*gzJ+=D?%=6sKa((sh|Np*^j_1ytbLN~g zXU?4X_b#gv?@(G)vNP!F zxPYLmE9xr*Tns@|A84jrZv)_1kP5l!>Pmg(T6RB`R@O}}b=;K-U|6+4gb|lj{M0tt zW%Qk0i8E%7=}@My3LO{GfG>YR-oW>5*l^O_V`%$PGhrvrfSpjUJ8iz1*#i?(Fn*}J zV%Z9#SKwr7Qg3RpdXCA8Wi;QD>SsQm;NwIv3T46>qbU9GjzMibT=iMblgNU#IyX-% zr9lGpBUP%lhUh z(?0&U`Kr+QoTpG)wS98RPT+T7JQ>{sZZ0MWd3qBGBiHzZj6w8fDj-i0 zobP+8X4$tlzRevG)yCP)Q;6?kjM!IKSzX;@dU{ZG>D94SUJLQb0qw?*WtBbwVLdbO zT?pOSgVK<&hVD1~cZBQBXjMN-L%FMirICObN<*^mYi~gcExNH{xrvtbj-`GUx>Hq0 zQG#m5SF2Zl{ne^9U)S{Np5Ci>w~U^5R^nT#{emW345(H# zyB8LAAK9&_s2fBQceXQo6&l|+*KzRymKXbqB(saTG_jwB4WXU2xh|z0NY$5VdOM1-Kr(0RMuV@G>Y-J%If<74{a3Ym-L$ zP$Y7xG@F2oZ*MJ*?XmwhEkN z?9dGIeKeR;n*}bgv}gCOC>uQhqz@d}8zWvF-C%KzlkR^;jb*{I&C8b-_mz87ymFcvba?(didPQB>ojAEmWX(r zk?;~rm^nnbwgq7Q3=slNL$pW*(l_!21AQORHPBHb7^Ph#UJnFA;EV(=i`Z}a21fcV zd!^A5n#N*wFEPf%t;$GOME(DG94j);|2ZgxT&)oF&Fa-7y=!t}LR^RTEjzmD3gC^r zP3+a@mOMhoAijpuF^|&mETfC&Q#vA6q9f-*z8gik$N`wvfIt8NnFG(Y^CV? zLBM_d}`+KQ4<9r1P9`cBbyj}4D2pG08?L2 ze#=?!4+qaJ@8=z|YRZrmQm-Ceevf!&753>PAoEh)DK_X5k~^9pmW&}* z1@_Q#O-l8GWs>P_rB$t6O?jQS_`$0c_Y#xuRlUOX;P7I_z2wCEU%mh*d~;OUq)o;~ zTP6${{eH)YVdYzm%{ERf8;Rf~&B!4@5 zFQ-n)p5LBV$L?^~57rsz|H2E(E+54Q@Gn15`Lq}EWy?`)-7yV z5@)7Euf{(6pNW3u(Fxf-60>5X%Ki2I%cEkm5_@DPM3?(ne)d1?ptw|U^>TMfiN6+~ z;^OY*3aN3wed2G@x{qi2vmdz4j0K^Exh`FI1qpbQkxviWi8@3^K5f{9Sf{!> zWoXtZ=sW~>M(qa=W$)IXu74J{nSA{*j_8oCOlx*8S3z}1*VarSu?no2yHQN&m!Jc) zo9?L25Na6c>2Roxx2UTJk>{^+bLsPg=<}`&&oq4Qc|zCLghy$=Ii4{g|1r{KMLCuM z&}w+Jke>zR*~MT3L-9iV6fZ<|2P_23eFw=GzE+0*Ist!VrO;T;)`xuItQePB>?z&?$0(s=5v zV|8_C5|NT^**-+<D0H)C zf$*xw*0P;yjhjj>Ycd;|pL)L^@w9YrYc*@jd#+i9owm1t}@zQT{9YInG zav*0>A{zv2g&CO1h{wV$h-M{%LR}Rr2!e>*s6Si&Y@yEMmGkN&AEljJi=Wx7$prERp^{KYx`S9vapmyYcl<@lB^ynfQj{a>tL)9nyd7 z*#5t!CHp2AnM8ObC8=)w8lRdPKO`C;IZhd541ZwzP*U@yE53b*%|nmVa!$`nD-E;1-E z#W5taSD)>wWKO@5)9981TqWZoo-^HD4MpAZ&yD^+_xW?M8NW0Y<(202!QXjW z_ekGYt=hF@$r5P2y?a*QZri!aZ#Lx4^LANK6lqptQ52}`nsH5(gEu7GxuI)(bdTox zhnydQ!Gy6SFpvV|0uuGHdPeFW3z7l3B-UYPZP_9wbzL(@;UHI?1`EL$-hN*|hb^c^ zU$Lq}$VV2^e)l)dfjvy5sN;Fje@8IV+VY4LsQUC?FgUW0yp^?|bC8>VU}U?wN%=$V z&A-$&^mg#;q+o!VimPA?v%aMrVJ3qu_$IW*RmecZp^*ELwH59Y9OMKCxgE=(W;a7f zi27t~K_?d_QSxcgzp-W@99_Nom<~GFMVXc~CnvuBTn{JrvDuxxmwGvP@U=qTq)B-~ zKv=jxm?oCS1-6!T85A4Pn#@_monc*c^vIm9WKKI%eQ{1L`StK{BXaH$L;^@dq(#+1 zxhbjXNr#ZmSL@au6#%E0b_(bDgczO8wHXn>*ZPNr`3nQe%LfQfgGhj~;9y(WH6gIQ z5X>;*oTpd^VOaB8eG*R(TKbH&1mW1~HOF+|V3IN|c}N}FzMNn)prT@c5D*y|@B@FC z_6^{kv);lfT6KYp=V-12bUYoo2l;SQgnWu%-sq>*Ykoptw|ZZ4N5849Y#s9xJGxc2 zvUcHK3xv^c{SwhP+RMo?A~&k7Gozm4rSJop!;Z{ht|!4P=gF=~K0H1mkQK7ug?~ps zty%pO>S+`a#BmX!I+e@11o77%3iIX(<43Tzc7n4*S@By^UG5nL^Hh;Q9xnC z%3<&Zu#tvg{qCVVTL?gO5Lm+Fza%{8uySGl|6pxMTPzvti1_c3aAB`ieF-v4FTLu2S8@Q2&tJ$;#4zVO!{^Pc;$oXjV{FzrHTYoiK%TAxsl9 zD&HtObyB|Bm7byOzKg5eu%_FTR<;ZKZ`h*NO8xQgkA;G1DRIvA{T^&55Lsor(je6+Xn&RM~0cbiiZp>%266ZrEu~hSU=zN5*#l6 zDCB0ZnZ0?&s-BWhiQ>7O;Aza*68f2%(6gGRf20OI-b~|OLyPW#JHCET^`(f^mi&r} ze6A9|y?pr!{!2pTj>><*kSk>iq`Y-bLB_V!=s|@v9*x+QF7D{*DwYhzX52NvN8t<( zf=&i^q=E3t=}pWL{B$~Ar5>v@8Ow~GAvo}CSrCA_aHR}&j=y7wH^E)(O0>0lm<3

b(7>T&1{%W+D%3_gwxcBR7_myM-&X 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 DnuPx& diff --git a/docs/html/_static/css/fonts/Roboto-Slab-Regular.woff b/docs/html/_static/css/fonts/Roboto-Slab-Regular.woff deleted file mode 100644 index f815f63f99da80ad2be69e4021023ec2981eaea0..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 86288 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 z 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

msZ%O|+*Z+LS;;x4v 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%0AU9xwl*jMUcB+ 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 NDMp1hFB${m{{V&DCTjoy diff --git a/docs/html/_static/css/fonts/lato-bold-italic.woff2 b/docs/html/_static/css/fonts/lato-bold-italic.woff2 deleted file mode 100644 index c4e3d804b57b625b16a36d767bfca6bbf63d414e..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 193308 zcmbrmV~{1$wl!L|ZQHKuvh6P0?6Pg!wr$(C-DTT;)#rTo#uxG4zn76abMMH^Scx&m zm~*U^+eJ>42>=iP008J72LSPB4e4_M0Cd*~00g}9^XvaLVMm?7;LMtU=>b%bK=_$J zrl2E2K*jX%M;-_PvH_6*Z*wCD`T{|3^8ef76A-T=D!!K0uMUtyCfbipnb@-6~>&vo<=5v&El{-By6>L{OV6 zw||(fG9&(2G32VVLaL}&V;soRBk|UGrXV;Q@4hqz++ES86zcsi!$pOBmaPXk>}RS> z$(yRVKUiZ@Ywu+rI2x8d%2-|=3USQcE(0I-vC}|TFL1SG zh8RjT1O)~p%^H&4y;e*I%RH_~fq7)k{-oMK>?y}Rm=5s!QOvPUm?bA5TLMuGSw19L z0tF}LLlNg;9wnO0(2yrq!)YYERts0XN!@9!vuKYy)C|mA<=Wu^_MigiFKG3d{KCh$ zd7O0Y0yjNxpo17;Xc+rhK?{LuWUB}!yT;a)1JbTC+td2P@$?L-)R_Pn%|6fZ%1Pn( z_#Mhg6$K(uy7Ms_-7GnU&fwQZ6@k$*B*j9qC^{Rh7H@_r>IM{vXXidJ^ym$8dZW1XKQ(OAR|H(~DV#0HtO@y|>qAhz zZ$+LQmpWJF_8a)hYbf;x`QFZqcV$qNL83-at%*!$Q5v`uqLLl4dmt6;Qp`P3BV#W5 z096uniju@dI1C%5hTbrjBDj?3)Qa`uQEwczH3bFLzoDK2-Um7rQzvs_+)e=g$QX#A zt^tSamwn_0=${}smMRN;_EKQgboTl=7gDm)7SmK&sSAbFC4KVqhlii<_Oepct%_XI zIoh#P(aSyUg*5n`gu2E%-)SWZg##grz>21|6SHGhBXy4F`lSrmN9C*hnc}Jq10_Q& zv$7pgpmGZ7o7-D)A4!FcJ6gcd%5CIG6dU4Io~wHo86y_yW*r5vyj8H|V!bI}e&Iwo zKR}~)(awps%)6*HqQ+&k-@aA2GmVnWVxUKrbk*57s?I}@iII=H?l6(+3nRbHuEc%J z`znQ|taoIRmq*i1+A*peKsy(@*y$fq1A}=)C^f{ zA6*wLgh~pJ07pNFgfzpbQnGco4Q4GL^edQC1Dg>x=lq?;5is0O7fk}hIdSplweyTY zg@ANudQIdQ4uw~hH!2NM%567J3Az%PRUCIbHQS{-{I@IMRKglt%e!rH^=S~&5tcT~ zfZCx{=c*n{XCNBpA(kVfa)VS%tgiG_KRsKwQg?3v-4tV+^j{Y5HezTHT=5hR$NI{r z)G@%;U>D~zs36rnYW0#&>FV}$(9UO2BV1i;CKvy4K8X*21WPlXCYIU&TnphSSAQEc z`@ieJATZ8)+v`{sO_TGYxhvWhs=7U^J7s-MbFUR=z)<#k?g1m6S&Q961zLP5G!99e zIC)R=7;=gNq)Q8%*ae;;ej!J(`9$Rcl4vdd3)VpUp0?|xSijMntCw=wrE7F>>8$uy zD)$t0_Cu|Q!rjyVbgm78(k-ns(ml!4QsLDJ9<5^fpVayw4UD8GA37)C4;~6`r%n`lhr}*l!ZQPk( z@?v-pv1w%6vdEknx?`Srtz=ptlDGRzQbZ1OokXwTCD+{rJj0+ybSi(BHm*aIbLCJd zqxEKSdO3W4cu%Dt^xObd0OW0v=Nom9f2h=subU9}XQ*aP(!#Ojg|4N~pdfX>tMp9T zz1MHtP>rC7nwqFaG_8XZK6BZl+EmJ%+$tV<82-uUgh)ej34TVrvMftM5>P1!d9f2v z6CA40!Wo7#NGQ95Wu@L<%+q}_W3-btjirP1>Ydl;PuDT+-ac|?5RdgS+Tl{=xC(Yn zg7XqiDnIVDfB2C+T3JHdHf(NVHQpe4mhOO4;<;i~yy|(-=<{evX#9EnBhPs}744n2 zszj6bkYY~10tVZvoS^D>fSlHWoz&}j?M#EyBe`AcLU1^K!` zaX8nF>0IV%3B|TUFpDL(B7tzDs12@W_h(n#l*=nDw~`a4<7U7XT{>L8AdN`TV`Wkbe61G?Y! zB8}K|Zp${C=P{eznK*&PJYZ9Ax8|@aRaLsW>xz*#8J#Oe`OukK3`8dX#3|>O2ElYi z(OLWi*c!|01Cc|CbD+X8Y7aV&==s?EyK0+I;_+3CPOjzbRH0fQ+dQqywmS{|CTA7L zYaiKobqHs{b#;0}*~cB3t9+Il@Y5|@s+CnJ`*ri8ny%|#!mkj>c0>z^^8UpB4DNj` z&kwPVZCk#tz}N2Uciwxi(jSDE-`)btdtXcZcHfx~p@a7)fB-@Z<5&LKBqKKv;(hn^ zCdc=l`JV&c4WN~R%H@|HCQej4!{?>y*)p=kKm`y$1bT@Oe-6;6IM@_S9W!D|gMl9m zv>iDbHgr>8)*{^uI^(74d1a&`RL$i3wapn;#M!cdx1OVpCRDP`$1`OrncmW96ILJj z+NO5v7VU&H1_v|_)pwGAyCLwcqsw(+N-iHNmx)1sh^Jcp_m7HzsgdXA*`nkVruZWI zInfhjB;}$_?a-NCZ2C5PKb@mByUKl#?fATr^Z2M!7DZ$V*2v-}r!A)DD}zH;hTl>r zzBJk0^b84gyJGaKXXO#2EBAF6bLp}XHs|yy#Vd`-Q{NfG;hiHb?xi2A4$jbXp}d|> za3eDhT#vD;trNbO`2_8IIC&f1WVgerC3RW|e3%1Yo*9G4`~KXtCs$>kb6bAnU#ggP z=AwR`ZmK0!w`{TU>qo~^h^MCO`WtUL=r$eMKUz##LJds2v$OiVT6XToTA0aI+5O!*cH!%5EYKY7%^WKUNN1 zUY61<6mX+VAumY2mB%O(3(-z>N55siZ0>wgzC%9b4!t3RUm*vEWS zx~abrUVk5IzP3#8DSj2)kxzVg1ib8v7wr&!^SvUz@{N59d{N##r^w|ha=K*jKO37trUp@^jhRp@GRRZ$1t zVf1RwhwPd30n!#8uO`!|qHku&Xz#q+&5llPm1am&P8lWNq_*AgWkUbvXB{`s=`uZ) z4z(KBs`=WNGy7Puw%}NddQT+eo5aQERV`xmUsQRAEKf-)Li;MBqLAf+V9h$E>3N_l zgz3jm#Xjm-cMUnLG-+Y-TdZd7Wsq@yKD!`fg~P$G5%#5v7OI`rh`UeuwWXOnGd(0E z#(V%cfU9gAfDgWJ@Xx2qsgGCs2LvQYlDT9b>N+BrLRpYp7>o@{;E3;>6?3wRu5Il& z3V95!JuTT~qb5T^Kx~p`k_ie;rtfcE{j*Elm*Vqp)hn;-`|#Cj2NfJ$g-Li&`fjPU zA;+RrR5NJJbs$>QBEROc5``?1f-w@q!>tn-RyKj zgLptg|9k|TX|VP<>-7CU-q|}xIUYNff+QLO3gdLb9vp`4NW>+rO$rgw_?O;F)%D#3 z$O0-ezOFCF@1IaUF4LW-Znyxoy&8oE(vhJcRPd2hG(8MGXLPAT!oN;g3-ZwxEuOBN zJ#-Nu!UUy21UV7~a^)#dpqwy4AjEE>*XVhEh-Tl?BGrNs~@_|DUQb%G5Ap9jbEuwLj z{;9mu&xl56Px|aA9*ZEHEFMFx=&s`?2qAaknoX4FI*%MpEmysN3PBi%AZSaY#gYAB zx4#auRU&0PM9Zp6GO z3+u;cDlK0CY)qdsZvWxX!!JR%P;53FfG`H1Rh@1(^u3b*ze4*s!sr~H!8k20T?`&(=b zE8S?B%bb^nnMSFf?-(0a4|F*Q>3H8v=y(s;KPhNoQz?-O85p+ocPP&Kt5Kq(1K+>R z>0p>`xL$AYL`Rrmb#*l~xjq(&p|78Yzf#bP_`GVxd#H5fTQ&50L<6!hw}|=kFhQ7X zume~Uq3-iEH6--Paq#8X^6}fsSUJ1$ePdN6KP^xoAEh4&kGOWAkO6ByRl8?>iJJ#t z0}LYEfg>tIBYES*l+JrPW&I_~%`G7$#DPOK+`-i~Bqhe7^%uL;I}fJ;HCYJ_o^3p_ zdr$QiNiKtZC}bTiK*#if@-U#KfH-{LCMO9PHVu(JHfDdQKulyGMr1gGKrMqAC@L^Y z0fVk|<*++2@Zt(R)VZ`XFKWL33vKlwq>brNB1|#?>1Qd2o-QbHJ`}mL0-ikFe5+%C zLqtABdcJvjG5ImT#*4&8P?=2Y++Ms)z!L$lULraQQ!T zRP>LQn6Y3*i7F)eZ_J;#NK4D9#P^%Dr0JnZ#M4A8Kz+MAE6QQ;=)?0-g06$D15(Aq zCw3Bzn@VZ;CvdzqrClix*`mtl9XL1@CEhS7JrItX z03SQ)uF>}Ua_eFi2{uIETh@c%?VLf|a)RSK|7ghBuNtxl7v{$DK1V_rSBo888OLP= zaRk>(IB`}H2*^NB?=Z80%}`-_swv`QL#uW4nlDT8hQXJR#?{ZVs6*LlmCnx9w>>QKwu>ifCs-$fweOIE-3zNn zLUX;~3#fGc*fremBScv6a=@9F4mMiiL34swXr2qYBAIEgg)7UZC0Mx40<-jdv+#WS z=l8(;OHV?}H7o)`iKG!#pku4%DH_u2g)40;m{|G5j5~N|WC)s2AV?b9&(#KJXidu% zJ$(bqf)35WCQ~FiAJ}AXtxzdxlu^K*+~6>#^N3!9Y@&?GS15@jK@5cec^L>0A%9%` z?*j_}&Ej9vX^QKH+%LJnPIG^Ts&4p{3gcR$e z&Gx-PLsDy%T0c=h-u-=WxX;l^d&lm`VKhj>&r=J!eHSVvN9kW&cDQqo2g(NtN-G>% z2E#TqZ34=p1_7PysL>bH2;`qjH|q?I?Q6NBRCN~QaP|KrBNe!#QYkkh6&8OQPeG7y zpJdhD-rFmGS(;k7zI?m=g1yTA@;K!8uUxx=8`xuaN zc@)3$M9jhr5r%+t9g8NiQF2^t-PMZ#zsXfK6Dx{mXB1?q&0{GYYb%pgt_zxqYRYSx zcLB~ropw65Q3Q3$096!=MA%123gP6mN6vktb#-LYy$li+{sql_Hbl7f-6iYc@vIzm zVYNL3$=m1Q+V%NlZ+aC9IH86CD0!Or9^kXD8%Bnd3FMVh*wI*(#Wd6P4GeDu42I$A zdaP#C65PwD6!vb)h&fy)aEkGSxO z%Uev`y?7k)$%~fzyay&e5Hh2KfvU}k0H@;?jf)oaXF+vgK4fi1$p@EC8#Gs8QQ);2)Ht;2 zBBh1P(x`p_{_zUiiB2v-3kf`9B%c zk1m-11ibQ3z$Xr)|9#elfuEa2!6K&o_?{^?R-L*2qE`>I#Cg`vkg0M1nnw?Xv$GXM zTEE=4SA_Tiv#DC(;s+WFb_D{*v9R^0CL0K4UZjzSc#&%|9yJ4I#$%3NfxjN8kx#q) zFst_FKvrf%$rUpN}m##es7w;TzAfs8{FenoG zC3n$m5z*}tH^e35OAx`uTn~_0^h)!Yx%Zg`4OzqsSmZ0_>yxueu9uWop1)FVQ~b=w zg8PDD*%AgP9nqybfu)a(<5<6#?t`{KouAw`po_JwOltrq}K z@`z_C6OAx6>ND`X()8AFNd&-mA)7JVZ$z=MIc3AuYt02atwKk(7N)JD4aq__+Fa;I zcpi6KL+-C=m%ZE&RxIb#Vw}YJY!&PP20?;0_l|757 zyDqAvt=5?kgAV*iE(#!8@3#}2NLM-xio~U@G@Fe&^*OnU8fh0&^(PCbwTkM0Z+~cR zQtq7UXSV-I&Z+FxPR!5p&k{>QO-a0nKt-=KB?Wz#vhyR$zig?SSghlo`QCmrxyIXL zu8yI34aBC_U5YVfEjtK2XgwfXIjH64c*dD34W`jF;JNwuuD?!NR=F@qC*?n);v+=O z1(J?bUOI<-U!k9Ay#MUV7UW%!EGltCB_@DFRF^kldw)Jwq~j@Z_MQgrf)Nj$U4_9~ z_a#yV^1Zp~dek^QA|w*&E&QcZ3C>7JbToar4gYP-RQKr)jDJHOZg zBl2`7^AH$B0Kq6OnXH^+qB%WjYaq2x9@~VzD#Oq!f^-3-q^Y)?)-9e|su*Tq84vOX z-ZAWyHx;EX){65ir*WLoQk8QwYz~+8<$6PP%K0EmU;TU{8Df90YbHLfPvvo~Tq@PP znYd&< zrDU^&WHaU34}Imr_$Nl>8@2dXXe6J1G=C;cJpRtlq;jn18h*@Fm#ePM##m`spTv=? zUX!^dvsy6VQIYY;@rd+Htjr>Oa^{-KBM;WrEzp+G{(X)BIS?--c=EoalXOJ6!rK9wB|I*ON(EGq^a>_X1 z#w@BGDBVLSK&^$GkCTO_6GjUG1;7WY4GL^Avxc`dcAlkh>N96^+B;ha_4Gzn?m7UaMpfR|2g1vsN!!9d?zl?u=COcGdGj%s zop1nY1c`sYcd&2pgH%}nGOiS`VS%f(bU4q1Q9-@F@0rU~(bdVyJ*~_z09HHgyw41_ z%my0&M90~=x~Bj3crM2xRK6cc*~JHF6}AAZxaq+EuNMrf%C!*L<5|H{cjUORS%;XxxOfK3`d#j*7j? zjW>fu|0z#nmpkZ70>R;k$)407gapj>;~0+z?+mzbb5Y~HVHeG>*QZ(OkBJ2UFhqk& zfrQ(e#;sl7aJ=K+X{rCv9H=gUk!}~=p;kgi^PL>!rh%^`Y!|_5Mn3+M0}xmc?+lK zn=MvP*=kB$#1TG~R;pekBN>SPPuUwf!oYoGe{}MFbtS8^V}n!sjU+ngQXLu!QxvEu zNm0ZXctI*M$n#0}(YLARnbFGX(; z5;t>)nLNTl6E8@j(;aN6gD~;KSYP4v&8)H<+|x5(U1I)|Ht7ow`jHF)jMEGlyDL|g z6G-dD55`q#%1Pz;*J(U4`4o{1!x%s3CmKou8Bf6Q!PP(|i5u;7@q4Bn966G)AA>m3 z)pMAw;yT62Djh*s7>ZI@&^2XXQulNE;GQhxKGVIl^tvJ(<2KTCQNu%nac1vZ&Yt5q zQAoL}+_XxgDW52x_oL+7vMt~RU9*x<`#jv>i;2>k!7ni{DMah_S`aP}_7DDK(KKLp z5#WWNKxng(!|v^xjl2e}a)ZFLMP(>!Xb1{DAoExwuMUyoG5)E}fi)d-_FVNw}vP#bq6-FYKoO74!o%m{S9)W6PE zfxW&P-q*mNS7NTNjodds|F*rKqHkV%XMOIW9b?Ad%~9;`e8%y~7RJQfw0=Woxb^#- zH0C3=uobc>xHW*xeE}KVMRN>?yI5f%5CoK44VduB3&bz`Gsm;M#c9 zpSbz%r-*U0bn}!v@s@ge7C(OrKMQ+tUCHU*YycP7*3k{jcArmQ_w4|e9K@u+`#u99 zkKwj0JTsWSweu?F5NZdY=Bikk zBn_le$<%Nk$z7=iRESnqX>AlfE^B6NO0=}^F26+Bfe%be`nLV_|3&#n(TQ1nANGn@ zZ5utUJA1Cbx~`0YKcBAxaHKheY^o2{= zWUG_uOYNwZ@@PJ-vf_0fewH6lmtv|C*PQyH@oUr@&XkcqVws2jm&wQ3A}ai7r(>TeMVkah2rqNV!6AoTeg z33-GQ0&+rvq%Z>dK~YRnklQh%C@(}!$T-QvTZ^6Mw`sHWSjvi1$Ae!&6N9Rltlpx7 zoIofc?nicds(#@DyfheCQvKR;>3SJR_k}dp67L0sAf^aLCJ|w#8G+6xp}v}+f)0)$ z;-@+2YlTqdPa|nr)O<|0PDSeu4ht5#+xaA`Gt~B|i;Wo9T_*FyqMERwPa?aT;XQfr zHo3s}3}hlIvz~%XmR@Sea35QKrI=dV`3&mXp@7)CqQ6@?;Z2ct%YKiH6LqfKj0yMJ zcYh;3C5M+=f6;jzeVI&N}FLvn5DN9D4B{u8aI9ru7FpnxO4&o5U2;T)l)aqS=QCnHvCro zx$$Pza=gv6b>3C<=vDX3KjJkj^n9PVI9gWRQGz*Sl7nr1<@RvoQ4loUGn8#c`M|Js z2;reAP#deVFG~W+wEHC@@1&O}Dskj;cinW8>%Av`U2a?M!Mb8nn&o=CpFOdh;^*u)L5=sl7JiNztc z!|pph$aS&qgS@MYvrmaj@80p=A)7~qo9?=$J7+G5Z*_B$56LT^JW zQ{wR;X@V;?YNNN0Vo&UI45J7fe{_Hz z2}5#Bx7iz?iy<2;MEh4Vk5LT(d~XbeDr(v{m4+>3VjsG((aEvxAOqqKPeOrZz#fpB zh=#hn_?RcgpUv>VXZjyi01G4rIkaH>>R;0EF*? zNUWI!AG-eRXuL=YAc$qvZN~ti07EVwZlXruZxEI^aZ@QhO`TZ2_t;~eh$+Z-lz%)p`5e+{Wf>C)Jg(NushB94s-7r%Eo3o6{eUY0T6Pqu?Hg;zPvAa(Ye0J*j|>5 zVH@BlfYukGz~C`EbIi9+Cd`&i(LExe8;u4-3=UzKhU( z>$XNHk4tQXjFcd#8dGFi?sVTKvNjIviUW|bce85Y>%vTq_iUo(J1F6tWB+of&t_!U zWDfpE&FKAuI^qdG50Xv~52F9)o~!4W7|Jc00&O3lfVm|+ax?j1wt?$X9r11D+*Iv& z<4<63f4q$~*u*G4Q~UXu_t6$wr>Zp9kcB-?{ehr1l8;FmSjMvY4H?T26|HD zYW24^ec(BXU4a7ntEbiuv4wGF5fdxy2Bj_AWT?094Y0+QhyZwpmtUZ>bsdqT=KYos z2q_|Yo%4*doGw?`JZk<;2dk|S=@bR2lr$})KWn=#b#Bb% zE&Y?#gHLGX?_>}cKExbSp6I+iPPQm#cV!s;LR0PYn^?`-F|p z=RMyBygwq!0A#$0S~R#n#aMW`#4rFVs=lC12COcMAE+%sHb2S#;2($M(*I6cZ8qi*uop&qyG3Vu$}i_>F3Fvf?%1*z@F5HG zpgkLpgNhy_4EZ8F!HNsp_@GIctR$Bc&3{$skzvS%t{wvuZ_1J;OTeWc524&XCQ6Cr zQYXTQ9C#zifijU5tg2uZ6`{jeMI_ak$6-|!?>WMDv$ky8vYYd#D&g4}aa*b4Ied^g z-!c)aEg-Z&ZcogrVFh!Lms*Igi*qP>@4A-7-|S3W@*K>(-Ll*Grm5iWuI5AU_=-4q zgX^e!ez*OkT|4*cV$W!6(P(Yatc~%ile2wa{P0pSo<)Do59H33m)OSQgSdV^OHJpE5#GVtFuH1<;4Xgx@fME2>cUEeMg+s6+Ll z5SHds_tyhiihd0Jo7|s_l?CXFP+3_vk0h5zXuf+;kh0~EEfRg&YKXV}ur^tRp*0s$ zA0N%&trs-#tQ!qA3$rDJAYlZRBx+iCn)%qVCd*araCyhEZ!DIybm3WrXSJOjX^)rS zd%CCG{PwbZ`mxY*H+ttIPAckScL^Gbk}m#tSqXm33aN!VuQbKJAQk^ViL)b2GGB{6fBlFT2hTSP z9-;c-O%?Vxk+`B+3>shH+y7h;zcgCLz~L>Z#yV#^8nAH(5rzO`CV_b{k5isIpunI1 zvS;$vu49|-tG|(h*ttAz(im975L8aP_UQ)?ZcTkneU!;6{8^x>+j71_3IK$8qt9Da zo96UR7XqYscywC?C=o@nxUTIx*TrP;;Z2G429qY`qX9WqRax2}04e^bb!#lB`k`HA0zB-7wx(WxGrAZf-L&;THQ z370dB96)I}$M&~38Gkji$=(Sq16r|oNURhWO6WnLhx>=2o1Wx?;1oENjt+)WDCB4g zgANOuBuhFSh^Pby)qbZHuFfTMw-3uwxmY$=u`YAF*gLU%2zerd<2U>T-Tb?0IMQv3 zxfK7!xXCD* zE*2Ii4@35#S#K_gD?7AAPPbY9mqa~(>QTPem&#b`MIUUKxQRLG!sKeewFK)bSM$9T z*+BK+zUvo&QAJxeX`7bjU&+tE#P=D1e4M=8zJ1TLR86bG*pk{J&)C>6^8BqTZLVZb zM*10LbF5kj*0$mq-!@N0uRGSkn_9416_sYtq-+Msy`RBu560+sD%$MoINL1;H0Q)L z*G4pr%U52w8fv&YTR6L}HQHP>KVz@8*GQbi>TZiGeujEPd~VkbNFCi)UgGLd^g8-9zgIWE!zRtr4-KUf8oD9rzcPqstpUp%=62$hv0guLG(V*@6`j;7 z&>na)*eqGLw%V&t!N<^?!P`>naJw>6S`pa+`w z3m%pXv&K3WtnAXw{PPJ8EC-|ls)=zMVb)j;Sa}cm1oo}s8eh@+G0{OTYSFE%0roal zzexM@Y4dV}dkEU5t%HTTX~`P(-bUpBcmjm1LB?1ev?2Ykh7K)a^HeTvCdf930iini zZ}*c*wQ1!rA0o)hM_>|tZ&OUBtv~tV{7fhAt-sBug9WzL2evq_=Ur2m6CAHdXAPeA zzS5BROqfz1^qj@DRP9_OQz|@*5?nj#oMcN8HhCGB_C=??54Mw9J&Zn^iVBU54i73! z;mFkR0V*4iB$v}5h0THy57nCmYd8(_ra3LWGz}JE$Rd7{-9RE3bX9tfS|NL}O&7s? z8}ELs@afnA^?ubS-t^nh_L4hzb`XqMctoGFs+hJ=ktt#+{&V11wMFjwqi;TAU8WDj z{1JYlo$ZWzj$xn-S}tvE0mTN#f@G=LC45*rm}*feg85ClhuIYI*p-n zF$7Y#M3MC}Kmrir(srS_6%GME6STqaZcqnBd&e!k zM}EJQytyQk6aRtRz*2~x998+OH<~QPkVZ=xL5C2*p!42tzW$XhiWn8}OSk%~S==@DCCxRe4om0K!PrAj%oslI>j>c^zdw!CnLox%V`Kv`aGFzuk zUSl}Qn6j6>B9!Rk3%7gcWJ+|;MGT(j*F$gcqR}n-GJNN8@k@vliAuc(C{VObm;fD< z>$n;@1V9ey1Wb@LX!vO`^FRZ2L$zR*-ibOn=0s#wxps>ISFlt_CtfDNF;Jk$oD5R* z1(_f7--=RBznqV^%IDkLTY(42ZML`YAHx>WPP|^O7q->CLzh+kKoO4n*^e%0qAha( zmY!Z+Pw9WbHM3`4vGmxz9SAoY&8$LhTA6LhkGJGQl||gbC=lMVdSG#_yW)Ol$_^B9 zEAh4~_iIE6ke*=U#!FZ z1|&<)>zhA1t0Pb{#s&AeM8!*$wctB-To4l`!3HYFux;=d`R z=*%x^QbHohVb?{EvaIMoA$AN$HVX!Dei0ZCdxIt>2pum*YuUEMl%h%NVJ8dr^TO0T z8s+VN!}Q1Kd(o|Q{r0Q~ju)TT>(f5_S3W%WGRuD@(~FIn%Re9o##9@GHcbt;jDfP< z0&;PInE};xbHA7~gIve`*KktOu_N8KdqqNMiQ;TxhFStWYfhE-dDgJ=-qTpAb7#B1 zT>V$|BTcE(s!DFtTVZp#H;y;nrj|?9FO6g6f2AU{z91&LBBWV6AVGg16I~%w4f?hv zax?)@*ne`BO{T{ zy8iicj{p9Ipp}2Un?T}$LNc2of$)E~_(6n|D$)(yGySTOFOMJod_aQ`F@XHvnsdND z9)bU-bO!!O_$N%X#K~vLECR!ZNEFkw@}!fqQyOF3Hv~m&Xo^j-5vYm9UJ2FqV8I`3Ru1 z%ax&9v{lY071tk^y0bhYY%E$Qci(4Vf}f3vFjy;(Mv;P@<67!roi%!r6W{S+NXPTm zLLLqNniE*UN76*JB}<_tQ|t*r={Kl$bj=2~sF^Nx6t`qm9UkeZtLeP`5+kQ?)?)I{ zU%&rqFTe#IRnOZ>5r@Uw(5RCOheOt;d9G`$#o3@J9d04rRD_js8TJO{&%IB_v4cPer!U#Q1`qkvXKLPg73IfEy( zo$Ejk8Hz)7-As?RjBf-~Vh(2F7RXopf6SHlU)mn)f(-K7g}X4c8>H19+*t&q%bz$# zy?`WwRfDgxN@X9BVP>^xs~22H_G~xKkSu%20K)d+8bdU+OYd;f6VoHm|7y*Db)p}^ zf8CLJ{N0Wk>nm)fZup8Xtv#CxsZ}Ggs!tOkQ6q(`m^ObQ2o^{c-$YSm&LxU0IG#~k zn7vFo#BnPu*b;RG*~nv*-U!qzX@fv7@L42cW|0gB{m#|JnX05rIF7#UfbHynJk*2{ z=R28fpxL@pZtI8H#0UIevY9c`FY0eG9eF0X$A-=DG3q}<4p&i7{>{xBJH>l1NmC;= z#yUHNAM1L@r4E%5ApC#95dPKN1#r@h!2CZ+etM#D#6Oqz|Ej=;4po{Q8~+(Tw{QJ! zVD0}xvu)pD1|A?(SmM71(RAID)JqPx$L-lv2Yin66I?e=*2j$$&a4)mE&)my>A%2J zDr42q25?3AZ(*K~88BzmtY$@5ZSB|rKRs^UjE&MUFx??RLj}sAWiF*C%WsYWT#}&n zbdD9{h{7|*&$74HX8i%S&E@lb@a|NCup5`tMGA~FZGxxenodAO@PrUqY8E?+a?Thv zZ988X#GGaDku>o1mVPtN&UV3(+!f$2?7M+uj-wMUMx_4 zs{g*?S^>3N4&(Tr@4kicO7SETNGDB7%F4?BS^TV(SDdu}GfTu5#*?(qkU~E1YB@Bc zYJ(*eC^%12&`=L=Zur1NXv+Y(Fd4Kin>uBX8Md=`IBlCOv_*ha?pHb;!-|Eg5-Wb3 z56zXQ2@G)&0Fzx@GR))%4REzKj~Pdbh4B?{mHtDfpNe5V|M$fVN}T$f1N8nR^|2>2 z*2FtPuCItmB7#X-!x?Vs+EWT)RX6YX_n?f9r;5NkoP&k7kgZhnv0NLW<8Qi1EOWG( zKS-O4Q&OXJd}44-d;Ahj)Rv3Qz{De-@g7^aq@BfNT^|J(ed!kj!ih0IT`8jq;CM)X z5dXK5ti_@Ku@GA~%aiG>Qj;%TJG*U@`{@6=#>6RNRTVN2iiz!I zz(!If^M;T(M0g6|?{T1@b;)vykZ1k!L_vMlV~AN&ng22Q0I648tPk#8% zXPt}eGh@=MWJ6bFcV9QHHgyTGmfw^zKuiS)cLeimw{bK(6$_`-{G`-8#>c8n|6aN1 zDQOk6)C6t>@Uv0n3`*TE#80UjDbd|)nL+c)O!j`moDsVMLqAWVYiZP>q-VU2?CG|L zXV}ZwL}n6S`L%rLMSr86yAu@&^=WyZ(RXq*Wb{Npk*@zs2LX3P*CQvWwn3sA#T|~N z$<`A%UlR!7$K*N5eEHf+yif>tkV zhJzgN#_7sUV7z+NBAaGxli{@0MOR_UZG={%t*^7gI;&cWjlrG)-6fhn^z|NDC~bd& z4!+X~I}Z+q!2sY37(=;#xr=2G>*x3HsZ>ti|26slqK$kZ*oAuBn3a}QR@Xr&hM~sx zVjc5PUQDZH-e-Yr?<_8(w)J_O-s}Dj=Uf`;gT&lf9cS}{CUf5@D>in5E zqGT)W>d^jD3JHTIZS-jJb#RUhEngDr3G?Y5)IT8P#A#V}Owh$)@h#!_U1<6(z12f< zuY>+Q_3di-Kz2A&icOw!?*)U1`=7J@!H`-r#82my{C|z|X!IW%`_T$1@*k{l;nmQi zUI`%m_}@R+iiRXj?3Eo$@<#{bg43sqp+^WGL@JZ6mM>q#s-gqn`+tLD!q|QG8Ky(a zAQIWxR<`PMC%Aw?A5|83L1N$vqaQL#9xHSm&4#sIUjE=(^bI9G8ur;UuqzpllTf^j$pe84EwEFqvF}ZvHPMPRzewxT2=*r(FPKBG6u=>nkH`U9+ZV=1 ze`=s8Q2#E&<;<2G+Ly!<`JCaCM-Cn zWHGvk=>v95+->=+4tEA9x7 zbU>tec0)(*VhYn!`)FR)vifjZLhtio?rvW011J7|GV{~0Z*Dmi$G^W5V8~K0kcTUe zD%g1j6QEqFZREQ5KlzdAJ0uMNu1Li(2AKa|;eVH%K8Y32>lL`w2}QOz26deYVcwDm zKqUd+Be!Fz)i=2)qVN7ej$Q^c_wcD6L6)cX@Wk`2AObA1`L`Y25~ zxKOLw{oX%4ecgo%Y4A~E(o@q4Ozt~MXuUDWc3Sni<&h?z=vov%t%4PV=R^H#-ItX> zQ6lDmsJaRAE3v@p0=@q?2FY%bOIgj40&BOI=q;F4{?Az#qL*Hi8E zz9Q_Pca&c1q>yN?$5zVIovfx6o&!CGXzCv|qVCef;oUBH$TSFy_$TTAH@3XO6C<)o z{&TN#LDS)C#(~P{Vyk6gjDawqp%)eJ+3|lbKH`k%7vKioC_(W_mLAnyii>#{H%QXY_GW_+Ihzy@{lzuL6==_H zQG0RC$I(+PaIrfpt|X^TZoi_-L8zPko=OKcYXY@H)&bXW8!B_DtThOTT?pp>cX`eY zlWP064dWwy!P5dyi{)o)%k4bIp7QSB;a%gJzFU)Sl2?c057fJ7{c7+1$p!*s2;~&u zBzwWf;w-f5lI2^i`}~E9hL{KIl6-a8t$kJ8XYXMa|F5D%Wu8^5-_ue_q^JHyH#J^Eq2|fp*UR^58NJGbPxf{LOtJ)8 z{EH1CyNTZ|yz||!-~*bxi_J14xRD8yBsHLpqT`d!59&F6P2(dF2A2$?Rs(( zMu_AGS!6Xa`$RkRE<7cqV7=1e&d6|X(`z3>oq?%&#Hu4<|+yx zLSdewGM>FfFpt?`_T1cLbQ>Gj1iM2%4(f~eh5zG47FUw({Xzo?0%3-TcN2yFCo2D) z+W@w-C8^ZMS==u)Go7xe8%5Ax1QOh%#F7>0^u;#zcCz_!DLvMBk@s$d+_8os!s=eH zX;#zLH^u$*%T)TaO3oGtc4|NUY`Bu3wK6{Tw=5XVsBpxLC1SBX=BaHtuOW% zbj&**zCcLSWiUWpCN#_}441=9kpMya(Nl;FECmV9?3UZAhb0ajmNGSqZb8aozGljr zCo#=fD@!&)0{KU`U2{;8lS)OVA~XuY~oBD$5VJ@D3Qop zal>19gz@jsKSY0Z2Wg?3P9wrE@0Tz^Eq&VnPtKIGT8ZvvB>3uDYJAv|*RMSg#m__u zPN!MKAA}nGfyuZ#vLe=?T}wdzO~`=4w1v{7>z-6g%s>nDSz z4T_OsV$z_JWMpJeondcars@HF2>;l8u(VvUe2SDf({VwVl&yiU85FNn<+ znMJVRLRy{&K1RLBLHddEllM?bO5tf?p<*;DQl*N3N-@Ym&y%cMo$XP;>voA`+shu0 zkuYsouzr%NE@;l+o#ukx8jGN#ia?;{z0D=Wv*z|t+5Nyw7(QBoJN(;~5c3d6=(Xz` zs6(Q^L8omUzM8#S{Iw(z_#kO%ZeIU+Q zG*;$XCM**yGeu4C*Q70m`C-#7!DJVBi-!DI^rSBu?3P9+sN+Q$2%d71%DCO-9w!Am z@wr^p8w6Y}D3iFb`k$whHS7pSqan&ty~PXNt&d|tiV&^$!x>Tc z-z8RRosl(|WQZjLp(27%2<8w5SY%`ux#!gGtRJSu&7xoIaz7#Se9&hv->la?^iIe_ zl}#K+VE%kTcJqYLstj#LvCSWY>tPv(zR$Mf*PmNWcGd8WZ#Qu-3Y7bo)gPgWKVLuw z$C-S3lAxdQ2MR3Lt9d>9FF5XuBf{Ma!IRbI&5PJ+lcmj`v|8kDb#C25;R}DRlvVS2 ztR;H>a!)K~wA;$^Sw|H5yyCzSgwjJTO?iU}_qN6bwVTQ!Ia%85d;=mXjsE-*g_Rpl zV^O$4XLoX;C3g=Vgd$Q%b)RC`Vdpdw(Yp$xvdqW2FhZ11HhTfzb0JiXx7y|C!>gp! z$GDY8ZR{+kesgO5*6v{enJc!$XCoD~c{fvg>RPM1Dhk;>zhOVnfXMtnDV@l@FA!cY zGLPZMzTd}9DJJe(_`ixL3BC)MCq0@QAUL>Y7jB zsC}gk?KfgZV9vpx8cpoy`4p3S=|q?B@Lc=Ei|* zXxB5y_=Q|m;8AgZ${Tk?&SOmuMG}^Z1Oi)|GM~LXz#s}o1~<vz{Z#kTZx3g?okvM!cvR1cph1b z0c3lpi~tc|vPe(KJ1CkY9N$23M=IUN07Fn2b&!@^sg4r@vYS9wp=_keX0gXgyHT_e z+&N{#SLGVFkOMv5qvf!8PZbh=E>xRSRH%%LxF1HNX-g*fBYe&mhzhs(?V##Ax(M#e z1d0Hi%bwr!h;Cq2&K+^O@NkiOTVXznPsW|o`avvHs^Mii@-w=fOCx;J1P8k~T+~h6 zv;(x|?az037&V*uvCXg7=pj%0h$(Txlv}FY#ka6AG9wGeK^;yoJ1hC2j|i!3K63N7 zlFjHJNO}jGMt@9%XJ8wVN$+ITmopA-j!JHtz`$;?v%wub_UuF|uQc@sIDxKRj5ed= zqC!B#Wx>katIw!j_>u7)gy3 z>Nzo%Mh?z&l@AyHiw1X^O$e?rvrX~qXh6ahSwF4bw>1WjWT^OnFEvYff!;i{S=I(O zX+aH66+1T;N?OKk#hxvSS24bCgZW0F*@R_;;Pjex{Gou4ELU&#>boM{u$5Xs%v7pK z#3y2kSn$V)Jz3mA+)&RSkV>d_m=q3}HJ)_~$}}BEf=>@0%9GlZ7J@RDZFf+fhm((= zRE3tyod>V7|A2p5BRZ+q3Tm;IvSKU{ZzZsP{*oYji$}pjM+p|(E3ia4p;mM!u3T;m zUMZ_vxe!BtpH$`OvoxSaN5C`m*!596bNQe#qcKK7eA(}|WndHXQyMcV)`y~^v&t$o zOrtk`xlnPDl2E1EpP^8yuktmK}YAzE)9qzi)b*)of;da=5mU`;rXG$cJX<0 z`%X?tB}{h*u^JhXKQ)xR3hGgc#ZrpF2*AJ1+S%9!xpWPvy#z>4O{qwZM4@KONrbUk zW2#&ff8WD>t7+Sd98HOE`>lIJBTVD%B_qR!8p)?Fs!9 zA%U~mYtR(7d8(pyNg3r3Z*7lE&h2u+dMS}m$fRI?T-LRTe`DQS76)bp2Z| z7K)k;9HaML)lt3N&GdrQv|7Xpc@I{0&^KSEP@)-!&U-5df>!dhDLwP2Uh7}xv~IFB zli9un=2nrC{rq4P-2FRphS$A#mH6btWipr!a+C3Auk^+<=%39KMpI>B!8i~Sgg<}7 zsbRbX+wNb#nzfi(x1Razt;fH@z-LzK$+3|0)`9=vhlm~R8Sg%=vz*1r0QdAIsywNs zm`EZQT@Dsf#x*T`)1ZF%F4)3ba@qLmwE6pdh(Wt@sht7-N9o%Mv)hh(rFPXg(M=uD1BbK=f#I{14Va7jZ1Ys;OBLh3H^1J( z@`vXbe|Cg4jP-{ooqZ8dq9UOrfB-^@BSNh@R15~_a{q1If`F<420kcMi!F8|;cj5& zy8x{QH?TK?a}Znw6l!o#0p~GQwhe+2k6gKV2m6KssREJzr_v-{)4>9uXT{ZA-yd4{ z`Z_Lwy!?V7t^;SvUbwlAK0Q+S!%DktyM*5lQ zJUznf11`3vC33q7xGBK|OHg*IYfwjL;t^3#L9cJjMgCjC8(;Nm?NGVZoNCi^rPiGq zp|^u`hi^+RcIvQ=D-*<|fpi6+<4-S4PIi8-`U1}bS5@Yzs4?~86;08Vi)6jXz5Hl# zKbE`nV8}b#`MR49{k@~$m+VM^<1ckh8Vj`N0zb$4_`t%gDT7{ZL^*lZ(N|EugDxV!l$iqe>!hZt^PQHQ=RS#*43$Nc8GM-ne?JS0U2-VS#rUn9nN*>jFVSQR!bQnN>|(aFg1z&yml& zv~;6j?xGw=GBXo}QR>FR1Hw?NmP(j8&lnrDrU(vzsvqJhOesN}7PqCY5dk$Cu#Evc z?nAZ^AJr1T0K}%s#A9#l_vkbgAihaQ7lDYMFzb&>DxPHt@TkBsHesqo36$ke26UL> zFsn&rQm&Z+PXP}#nwn&QvNLu`+DW*>>k%R>27?|HT_iy4tHpT}b@@q6Em5=AUgI^X zu(UGWOf3Ws>RA1Lz3TMUxo~+~2j^Q@(d24?tJTlfi z%=`Snh=O(4=VLKjp2@4HxuI?sk5KhM{fK!xjjy5PCYRoyFxl_;xCrD`$$G|LE(;Ya z9|gztDq5W7Y}eUtZnJ}%it%%M203DWU!Gi-YGy+QB+SeVK7C%hlHyR6rJESL8Zl|b zo70KDCv+hpritmW-hA1)F@R5wcjxIAwyhGSqaiTNB8=A;a`Gdh3z(fyye#u&iU@2A z*tC>GycEL3ri*vW8v>tb=v<IOqwQ`+#&Q+_L-%atX#M+uZgjH zouH?TZ5`1ZbFa6z@7l&Ab$sEr=bO-6nE(qb6S8vgXQ;LK8&0IwJg?In!o~3R*-S0` zM#}^pk&5Q0K>RlKB+1aur9HoFL+vXT zJx+W*?UA-4k)fcLd3--*X5N&^YURM((I98>x}gVW6iM=nrnsdjE6sgN{RBB+r#rIB z%fs@`);vz`w;rgbi+Yz1br3=wNtz_@AdXr1U^%SLi4FF*Tt)0|O7&Q)8zuQHfdeaz zAj500I zVwhXv^|3(c!0Er7>vmK`j*2`qIW?!!!Z1Nx-A%^c(@It4Ka_DgyH(?-_YU&H++8?% zDNxwqyB{K`;GsJbKgn$7(Vcjm(iQ#S`B2uHq|6Lma%csKRB-U|=yG04JxDG@5_L&Z z2jzlACK4_$^z4^mxFY8bns@=W(C;>*78vHcwnZmcL$CEViMF!d0Z12BpPxN$ea%m* zA0c3Z#l*Gx1>I%U^GJ=!qAOYE@5jb!>N2<@`{PTQL4-KD8-!L#*)#lnsfrZ&Txkel zl`Fwte}!45>edX)!j&SmG{qO7WmaWu2rSw-9vHQiCpo$!+-{KUlS9}jfQ^T#Z6|n7I8o2O+Y5`8vA_>^xuKP z*h0HcD-K|bydGEoEP={m*J+oak!0P%)P&p)GV)=B6309K7s9ko?J zcQo%!u))FRisW+Brsv+>$ou$oQqpv(z12pjAXLbZp46ON%1a=A9AAH`<)Kjm1t7fo zPx6Vey{eSW@t;Xua`5cmp*bW-^53k{dMz{Z_eT3wuAdbn7b#c}3;2E~28chjc8aN? zmTq0;N3f)Jup*i8t$++ zCSbKo!jNn@IKcILf4L~}cw{|+3i?!;0S>ygcw_0bnwXMu)hD;LmDx6d@wyi=717gN z{dVH={IG^T{R}`T<8IX%J-6%6BUR&1aoste!&$L83sxNu6LN(fj<;kPpZqP zdAxK+9ws%60{;1ghey8UNW-8Y+yqFGgAdnV#?5jh(e$Xbhf5@zSSBJ{q)jD+ZjOC z%zxbH@3haGGdaD-dQ6F`nPej+5J?qV8WvN+lOE2m&D0`@H~l*&Pz_e)Vc4VgUMtnC z5Z^U*lS(Cq(mG;PN~2Q6wxw&1iH;5c+kg^8QD>o{Qeog=tB`I2FctnjVL4qX%`5%7 zYs<)RE`r9a$tt%_dc706JWFm7$>1uWO#gqbB!xP$I-^9jdH^8+<{=uE&j#7qge$Rh z%fF)}n%pt2WwIYCKn7I*@oL{Y!=zM2u;9pB#4bVow{S>_iV>A+BvsnnWtaw8jiGW5 z*XAQo9-+Qs6z+=P@$bdSl-?xQE-_{WFnUVIC|b9!x)}4Ir1z=zMc2BT(%2 z4eve8!y6K&9fC8W=S)c{h}vJ%M_d`>dQeKgZxrdiqi z8C|2xO864xqm@M$7W(#+(8EgWF;SS{dxYiO&f}`61Vs@OGwJ}T64khJLUElf0M2o+ zpOIYfR{xn&^*w^a(Y^wsdDj3(-7&nP2X%MT{dnuJJ<$Zj4m<4GN4fX22VRVxUqGnT zy&-}|dc8bm&xC%6Xgntd7axS#gE+o_RpFi1mt)V~u6j3(Q+euxqWZe8iB+$IgngkA ze;(Q9Nrm~vh~@cqk8GEZ)Ho{N$Dx1?5-DedqwZF6SRDV>A(Wl8wSe+Pi za#(V7_Z2k;iE}2VDQ#jVRmgPOHzfa-H=!3}SmsN9z z(8QnazZLG>W{uBAQsmItv^vfWWpewcRd5tO8HE%d^(k(k6^Q=C3T`>NF+FjZ)74o|p_GPj1O}nMH zO8tvx;veYZw~ra}Pe^6QaSiI^wFnH_JCK*uZ|zdEnluR{r=*WZN;Sk0@#)4r2|vZJ%V;e? z!q^z|t^y%z3xBblf#I)o@N~IL*ipB8BHs&0Blr3Zxz?PDZ<$-v<+PtodUnPl_Ydr` z!KPt|G*Z5@BA_*rLX@hR+n!AJbKn}hAY3o8Rp;`tfO^13B9~r2&QD+$`?zG}!K%sHd@wM%NQM+N zdWb;g(|HEZZX>1SUi9TVtP4j|Ne!Mf2cXTYW8c$CchkY+b%AWjiaB6v~norU{lYxmTgL71*p31JTw8iGcNBt8_eL`!u?^atw++SLtTS`>AW?}8<))-4xhU%dIRtX7%(gBo5z|4Yj4CoUHc}B~TjMga5b3(O z@%1IOf2Q*|(j zV>A_3$K%XM#u3BglF*tony&MUDQvV!!ZecK%=FkJ`Z2>;MJ#a~G`Rgl1H>tkY1Q!Z zlc}bkhH9xhdq$4#jF(6AxIn`nTg0Vh(_uGgNIq1cjD#na8j;h+1dMt#tM(3h1k7Fk z+|t>kvEsCFrg6~8>1vQ9>)9SZbR>QA$a~8+j3-)*4DD2lgFj%&H3 zy+rplB8H>NPBw?sSc{U1ah^I5uVdrChwYa?wthnJ+SiX%{Nuyx>w=`=nx;0Q!(wUe z;B@H^;Q}vsifV*I_jwVL(ZlZLQdIEGc0=3t^CNX=AN3v?Qq&D&q7pB154mIuv{RwYiS)X2!%4NxNE_qUy3? z{WODg)YUL_lXPGo)bH#%q10oQsnur}zkOCNqn)r2#+QGlapI1PUUkF-DyRXp z#D)=zk7H36MPdeVDQ4h3s`2NITrP6WCE~HJ{ zj-k_P(+7rW3_5@r49YU>D=EUHKN%PaIgQ$FS5c)&2{(mE)5qX>@oaXvHywQZY1=V4 zCf5zX4G=c0@GBcjibvuU^FZ_*zeP%3G>V->iI*bX-oc(*e6uN8YHI`JC?Dg`%)&JI zHguZ!nW1}o*P4)Zg&R>A^6*#^Sm^C7WDmPUXNapkf_^nJ5RGvsY{>rfnH$Wx1@8xl z+9|9+@}e+4!v1GrC=BniR zHs9(dAD`li1v3pY*G}OiwwN3LjDB%oTLxeD8LL-2+wPVu4Rov08q}8KLcsbO>@|P^ zo?d|vE?dk-LiHE6X0RvJ@AWj7FC;`;cN#L$nDm_PLdqtsW3j zxw-XE&1!~tQ$p};R;`F}$RRf1FHix5~MU{mD!~Dn{4SipRRL%SriCk7say*mJnW7*8#b%RJG%o&s zMB*(#ByRfzl;Z&+ahBJAMB=sJ-<11N3oocwJhuJ7>a`!Cl8kY0Gf6k*U$Q&_Awc7q zl@{EW__Ycy`QNx9#(&|4a@r_>9pD|E2kug4%W2<9!%;I$iO|hO@#5LaQb_>y@IiRDjjHgmdvl2LN|apb~K2B3-U5-uX-LB6L*5?nuze^R|OkeZB>JGGj-{IH$NY234MaR z;rRW*Mf&6V%&%#sP8i~Mq$t5t@DL*Uc`gIZ^lj>^qj^ftY6o_aP%o4b7YZ&80DM=2Yw&9jvY zbiyBmXavp#VhVYT&&Q{O^(PKLl+>+FrXWF(@xSsyLwxE$F-Y^{1uby0P+pFOl?7o= zrI8IQNfYfUqo9d((HgeVhOPWu)j6=#A``l3RGl=jCr+j}IyyviPAu=>A(QOFF9=4Pc)KWzn`n0`O{9)@R43 z43)>@CxK9D7{mKC-1-j4qwr)jBkM#M^&#}|&@y-BH>yLB06ng_OJgqPzcQK)zEUAD zl=r$j1*+oqZbi}!0T{x3mA<2hW({Iv8H}@_3}Bvr39J{E52-5Zf7u(r&V|bixpfQ2CDVuSLg`l0jOmb1`Wl#$S429iA_s zmj)19n&fk-=Jx=XIS*4<+yllDKZsnsB?gsxhQ8id-->fdm{j+kv&#U{ajmG5EJh| z@;yA4N5d!RRJ!~YKJJ9QA^u~cIFDhO2;1akQmzsC2pF&}r!99T)54Q}E#gyrNTz;R z2o#7vWbDt_Mlpm@2&T)ME?*9pc%FCki-^QpJ?rGzOi#p(MaV8tO4S>XvwA7{iWqxP zQq1z=LSiBc5MEI%HdqHZXQDwf)17g02{P$AMfIY+c{Xm@Jb3nV%AHPk3nrbAYPHgo zo}#h+tup<6TwTGx7OQ$NDXwjaIYQj|<$2HPeYNm#q}lcf$TiqLeEM;~^Sm%enZU>( z5gLz$c-VPtlWl+nJ}-d3<*AQMfUM1O$BO=8RSUfBS8}>n$#ud{%$FG0{f#p^jN0aS zt4LYsn>>3bPY4?L(-m^kImRlb;p{qN{iCj6S9I)eFtL+mvN8$l4GtUncJh4g$P>1q ziX(+4WWq26WCL2yIMkE~6!PjN`qbpjx7!i%lS_>a;4xqyRu1A3vr*@i36Iav4_#NS zkaO$N62uqxR#n$K49e?~YpV-KKx#$ABI0rKD@-lnaY``$Lr%VVYBzs^lkaxdws#VX zEQO<>Mx@HFN)OBml#M<^k`8sV%&#Bo?`1qkY!tAh3`WQn@Nqtn^S$`_GbfJPaY6ip z%KuA>nko)LSLHzRvBH|NFo9l`h#)^M`!<(h*_#t7G%W<0Sg2`&zAKRV3GnI z&&kC|N%IvmJxyK3ysE5@1=bT#A(^VsV@j7SU^MrcxZxxR7&Y|Z5!EarsdDEr z0xA@MHNl5G%aPIl)0s^;yC$nrEa>&RJKTy?Z*Byla!0~{;*RD&oPFL1njEIr`5uiYPh6|2h&xp48fQ=TntU4slLAa`1AAZ-#HWk50MkIrr>= z>%8-A72K`sOJ8X`LDae(bF+X-OkqkCQ&bnVs>OX1L22(oqEHrFIf`cgw`UUKl1xIqEys7Dz0_qcd;N#YX!TH^i)II4yL4d zLPCDey~Iz%x?czF^0-=EuS9>M^po5tQnz%t>!S)8a|oBs!k}4Xt*q@fx~7+wb`a?v zV3tg^1r*|$QGZlej{jgtE>#X`%ilfK8f4l-i61}|NRNyID~c@l-lO)@h+v-t6Jpgh z1p=0!pi#_#flDR8nn!Q89IIWwHL)Zi)DfCgY_#^}&!bh7mi;BF&b>4zz(*)E>k+0S z24)f<%kVb8{5e{@%0s!=9V%bfLtB<((S>VK_a?mxeku?L(c$&!!M;oIV{_{>S7$v= zf6OAjHOUW|Y{7UoA=-kTbU|-;7cSQ!#1|Z@*rh`v&`t0H5}+|nalO?5G@KmPT4GZ~ zC5ZQRJiuC_Ov(BdCj=!G6MrllJS_eDQr$_b-sabh^sklqYvkOxQR7po;Crf}eEjB7 z^>V?pM*Ut*mr1}WQe_a(2Vx{#4Ve8MEflosw+8kgAqhH92<(LZ1=IcmwA1m3TsWA) zt`dItMY00=B9Z(*e32Yr{1LTyuPDK2Tr0xQNZT`nJL{r)0jEi;O~g zb&@$Ml6*L_VMqcKQ}<|i>x1Wq=m3W z#v*AW>T-2;tQyG=kBm;Wp&1n;o6cvsPun=ci+A%c;NQB);Kk*%PdHdY#-4WtNptGo|ny51#!6vmd|~AxopQBu}H;s75lx#ZWAA0v9u3 zDMt5&gx12m-W)oZ)X?xn_xr9`7&{iu7Fxg6zNPngaw~>pV0Ri-%z71eaI)&_SMj_58hUB$6OCb1h0KjXc(NcEbRC?} z6jI4L?Bcz|9aI@ta^0V%Vymh$;36{FH4E+pjRlLQBN6n((C8UMh6Y5-$&=i83FE0g zCy5h;NS6ySI%A{rS|z!@Mtd&MIbeB`4WD{x#tI}nkQzqaYR>DslN8HiRZsV#sQBKU zGXT;$JL+wBz^?2yagA%-mgWy(T2jYY4A0`Z@#oU+;$6lLB@ zarjTsp9mEW$R9DX6Lb>l(!ixYf>FZ{@Y8`H%a%2L_tU|&I?3X&6e*Mk1#C9&pgE7o zU)lqJs@4A>5Q}@S(Ed#b1Kn-P@_WUcOZXaB34jn-bSwmQ`gl5BtEBF&)xT-ke>@O_ z{>uY#*Wwx;I8A*wp*o2e|1io>aEptI)hPeYkzuL#)w&4(KsE&&d-LJRwRXLLA#1p4 z%H*D<$X(=xiPxYoTh>gt-jGrlSkp;lWlbBOls+~Ia)`5N!cidn^!p_O8E{8c z>)x<01f$M92DY_#{IfSyhW;rpQuE&TdZ*!$53Mfs4^gdl$oa!W40pq#oZB)fZbBKk zX;f&@;$+Fv6lmj}FR%^|a6DR2z8V#urA!1rlZr~FQPBI|juJj!8_`O?2j!rD#D2h` z@{ReIo0pgVx6H(t9F8F7Pjdd9kY^hg9^G3C)HR@`qBK0e;YxLi8F+8=@7`OH!1ooZ zc-*dWodmL?0?;1CdJf$CqIi22u@A_NAwU``PTY9&6^;(_GR(FA{lI!(1VGi$t-~4M zd66K(AT!{>eUx{zkKs7O16UIS~Ykl-;&`rA%+jQzS(;+L)Li?jvV${r5uC)$NyACb@jCnT9&T%^3(&av$jws6>V z0STf@Ki_%w5Fm;V`fneyf1*XVnW1wd!%o^WBnrDsR9F+Fa0V}E5G5=n@RtJ+zoTe9 zfSUzmfPm}*{v9L=QlzE+4)c8D1|3pBL!F8Qr2s)OOQC>8Doiqg0`X4KO1J%0q7wEu z99Th7ODnWgCR6UTA%3MquZB+c3Tu@nBYmISfJ3sFlJhtZw;Wagz4x%*eHv8O-N1nz zaXo2sL5en0dq{rZ`%N+4^kKY7w?pgWmbc!_>F*lN1T=oJ;auA@jK=d-zG;fIHk9Er ziq_&VMMu^!cEQ17i1p zG!irn2)+C)|5RI&@jGn(zxQ;;?>|V_Ea*Lw0r6DpBTaK@*A>=BktAT#&Ab>m>Qzoj zuc?C+mM&)K8~!i7;#TOh-2qyVF$lFrBIH)qcRB;GDGQRTuC=WJX_xe~TW5i@a?X|nr{=_o_@-IeiTSq^iBDYv+dIKn!CgDLa6X&YMW^PgER;+@}j z?BPIy2G4bBK7X|Q0RI9q7&R9PJf)$F&Nllb*5d-QEei1TIL#0rbVIIK{C!j3^>U+t z5C7}-2;hHA0VQSDTPx2@#tk^|JDnUgPZe`mLL6eTvF3y(H5)R2#wPz95_3CEf_>>! z>-}xj^vc zgu^k8+=o0rGyJCLV$Wg5T1;v2#G*E zz%v34V~YzAM!+UGHTC|AQz$^Zm^=tN0O3u#6NIQd8yzHz8xZ6GhwML#1_Mp|HV2v#o7SDe*j`uHTpPtiq?;M+v6vEosPzIqGMylZULe*E!1}Z8dX9 zle3f2IxujN!-`UqYN`Api^Jw)?pBEM3k{J{CdUnzwYjDeBlV~MsghmeBbH{lj63b% zY<=5ec&~dCU7wTxrTo~qwF)?@!Q_q?mF5v$;f$F4N{(RPpDbGV7g-@W=??>gN&bSh z0s-^MKTfukdYXcKPz^rXd(P@*8KO{!n&m+mBZBgGoRU%#4TO_LQ2gDPQG&C=8TwD4 zLFoM*3rLs@_|a%6RAkFi=A~6p>#+x&5{5gcj&8X8sm~udx7=|kcil{8DC>6PO=TSE zy{u8&g1=2^8fTs@#8rH+w7ws#^1HAf4(RIQO#Q$@M}Pe}F&U(;NSnllU>sXMgC^ov zITbD;`m%FFe==C)YBBEWue`aCe6`pVh-wm(Z| z$gXjK6z!k&e7~;V692E_6;QhdRnh*fU0Z9*>Vid02jIZDQ4~p1D%qii%m6iKa7Kc* zE7om#6F_~A2Jo+#Xb}RPqnUa(#fdQf-w(zoWfQ@|*~AnGs=%@WzL3+-9R-0cUpHqvUcg zlW;B^930akZ((mdVhRe0e9G@CLJfuLl_|70($o4nId!wJHC)IyqhcbGO8#o%ho$)+ zDBj6XUfQVk!}d1k3}PoM<=uFdc^ws__PCZ2@<^C@-0hRPPLZtN>1Oml+44H|T(BFE zf(cN>DGWF%W+c2n=D3IYA3iVMG$PGAnXxV#R@O@lYG{0n=vmRozaJ{`Kh9>q{LK z$XlN@Q3`LvV({KwVA`C51va*bD!otJxI`UV`g9Lsb`5(1Lk)9vb_)KiM8E?*909;} zFu=rUzAL`~`KWy{+48YM_lyQJ{jziTGS-@v$JyC^l2CvgPFT%fV%21`mGVkLoAm;s z+F^EZ+zA#rV5=^c%p-YKuxjIBj6A0$A7J%bfb!RIchH6Zy)XLTp1U)ZSIo`FLJ-EH zJR){F$v_KV)@tYneSYs6-C)E!IGM@l2?rBcL(armc&pyzAGl=FGb@RDZ6vpHP&`;J zJJ-!W0#HYO2-xiNe$>2#$L1OSNWOmX^F_eR{2DhTI-EkG>^6x?vO=E%iwyVE>nz{o zYLOgu3>3fOp?k+9YMnThQ}@IMH?he?_r)p)@758tnFbmrhHSYWezH51BiGNPF!=s* z^qXteYlJG4QYBt>gc1 zilRnXUZ?#Y0!>N9Ii%{XNXo)T?=~dmTBy>hpZDW(B!kK(cug51F184t92uy;HuK?C%BixsPw9Rl};)wn+{qjOCE_&1FH zvq;p=X&pT+vK1Mw3U3Kv+a~HPRnirwzn@OoM^fO;ACFzx<9~?({ciqq@Gkma^?-0T z46N!wh^(4E$KM>)6dqtH%Sz{Z3B42-c7Z_LKESp29lThP$-1t&?RHoqJkLj0Ft1rj zfyp+FSa`7a4BLjUYP9MnN5=t$@SUj08}{f6uk=W6gCaZ>tG7zPr>ZB-YDaxiU78lI zp+DuzkOvxTducy^i0ZSj1`|s14*M8-hVyO7W?kV(bj^E?y8SZK@yH##-~C>Fj2wXY z36p{=HQiN}W5cLx_Io^oh(IPX2q4o2G`oR+{4Rd{Ab6Db<@`^_Rs7eVnQxR0N))N| z1{Jt>_36x?Zqz7k+@OGszph^MIu<^CZuy0Ima+9yM32XXx|MHp6U{tP&XJPTWuhMz z2jdB=;3MyajtK&Do}@N9i_h2*gWz=udJT~Qu5#`ZZ@MRKc`x8K7hq6_qz{!UPxQk$bkpJRH>~A;ORQ5){4mydg`+bo{*RJ&1 zUZby{2x_1~f{cV4jQT?$;b%h6P?hSE*w)_dHL~{g#PqL1Nbh0>z1NJVc!xsK8GN@L z6m-9|59vFgm)|9?ji9Rcw%u`64%KUY06k|)3Vyd&`fI92YyWRkwcJBd(GEE@xNy-= zN`aSN3ms)rr_sxkmh97fZG(ah?qY)WaB*f6mEyo-bI><5dyODZZ!_D{o?xFm4HR3& z8eAUGIlLmu0i}0;&#AP3%1YP?lL2R*pC=g7Ma`?{-mMXJRwG#RNZ6=l{I;u}c+mQ{ zlj7Ql=EXa?U>-NAb2UA@da-q$K~d4MW~8=Hv)s!l{TE|%tYT5=6<&xUC@WNS?L*^5 z)7S5{_qqh-f32|~?;I6{*?14ejnEXgeR+a-yH`5IWU8~4_!6trEf+NCTIb1JC2Wqt zk3olO2Ds5G@D)~M3?L|d>dS|7u98kVe#0E@bS48@{QQsB6VRKUVY;YSE4b#*B?}@| z*s@|;gd%r4W`lw@_7p19C988CS{qgRJSD98863y#mV|?|I3xa)!~G@*&`cH@sf)XJ zv|-s#De=PpZXSd$Ku*Zj#@|a4L`A1@rv={h4BcjJl^YDXVD2GG8@b2vlSb5Z5hGdj zK5=*#tlK6U>M$abO=Xs*kan))Til_YUs^yg5jhU?L3p)vn}-7Owz6>G?S}tw;jP{U{Ib(J3hS!*7qW(0T}&}B zI~>6_tlKp^Xy#l=YTBKHGfa#K*6}_x<>^V>Q6pZ$>PS zMv8fU;PHVLU`47&^lG8GPSlyybK1jX+4FtH7LqxS9zTP#jBs_MOi>x#v zOhFi(xmK5c;OaDdH2N;jKEDSJPeu_%`I1=iHb9EUN$Ih1pJ(EvV2lJFUX|vIeq705=j zySdjXgEpU8jzxddTH{DwZg%HTf{?U!Mw2!7i9z!d81Ix(uA0~PH1<53G}ywXS18LJR&Al?0aQCKE&@{Sl8 z(+za+i$~i74q7#Hu09*4g+RswhZ$i^!*%U&0OHTdaK@~E8wgLf78<7EQXY5yiBO|Yo0ZWj-sTROA zi&ERUQ=MTe^{*in_6+NH_`lBX{}V=du;?m^-fidqis?#WVyyWRIRCfplQ81HWOe`J z3Ff&Xq#1Z~^)?Qvd{1mmX3sK{G^M2PCW#8#AA)Y@9umodj^UaO=+^(<4u&~|x1_jUa)RK}o`l#-Lv(_t6$ zqVYq>gG1dq@1pH($>ZM~hUf<(Zzk6_J1nk)pHWSNsWl zPtefqXpm)k;1pN24q`z{g7g&1q>&@N&*jlaxvTkeGeH{Q_DtjwEfn z^%Op&cBs?*cQjOgs62RL1kpg?bH|)ZtGS%q0k(lG|r6OXBD4NBM>?$Y16~)RqTBCU1c4>IIC!MqiV3^>g7#)-FYy?YBDEI$? z4@Gj5BEs=cuJ~Y7Qrbi~as&dZ82i{6r6gqu;Jp-cYkYm)5b%41-9B4sO>|FiU{utH zPTE(jrzmlmd(^e?JW*(|@LtJL+P5{kh98G%R;?Ra;740<09vhZ5GY%-*)Z&U{(aa~ zZ_#3XfG)w6(AKhMh>2r5#l06EnjyE^VEL8dtJ5MM#tFN8Hpd+)gg?}Z1(ZDz$tmL+ zC5el)L(UlGF@$vz^Rc~d2Fv7aIuoi1Gly38Lnlj-X6iEuoiB0&Iq*0lWbQj4cRe3! zjPzXmx8!r6_}PfyhO-$#Z^wk>KuJT+$uXXxPPh*9QKO8aj?&KurvsMpq$I?L8PeDO zh_F{xi}#YG4_Lh+%=RaC${re$pE2+7hO#Hw)8+L&M~oP#bN()=^Pa>Hm_)11EC*ve zB80PY>oQ!U=HiU!a|?!JjEm9NYYe9c;i(aI4#Nk|p0xzJ^S>)o-{3VCV{5jP6PaQT zXt5i^IzlRxWi~m^LKVChy%d7Exze!vKy&^mT$iE&Q@P*{5E=LpQI8&~OqGnO^yVyZ zCt}>Oow|*fnN69Q)#c>o8sa(0NfvN{aTOZqV`YD&nj%zgvvi@Cm8UJhd2*cRwq4u` zE;x_x?b|n*wIsDUc|UeTA%TR1GWB|st zT;&2X2e2~>&kB>ufAQ*x5)D(#;=5Eg;+M1>-G%psS4wgm(~XrXr25S& zZY&_Elee)6x=&j6wo2&z2f8OG&gk`qoI+#Z?xL)7eb~n{aoC&byxn&Bc*LGH2`HM-Q(`$oae06kh{D;k#g*YE&F7v zF(*?n$0J@_GyIS6^OmO+n)+pKb&olZdLhd+`*gS&-n}xj++Qk+2xb}5 zY-P@8wHZ;YEi+XH)-&fC#LGy_W6i&M#kDb-9{AGRy!aEd4WOX9ky))4_*u7Y$a2?- z7ao_;SZc1=iiB^Fc0>PBx>lTxQkdQnnuwlu%ogtw>!RMu=J}279>!O@wooR@XcVmxVJLZgeB>h-Vj9O& zQB!$JehEU!p(GL%S}E+|`GJ`H^tr7H;_=jPhK76!=B!amUSdeiF7@^LiKD{aJ zYOMNLqmBA>51CdqD1z_uuvzQJ_}lBSNBza>HKGc%%Ov&dr^=i9a&A+a6Xxe-+Hjfo zX`BwhDWg|krA+T<4ANRFM)lvXEB*FprA^P6>??Hl*lU0vS2~f0CGJ=E_IiWN?%qNm z%gQM*dRY$|E7?&q?z4g})3uD^_Qa;yr#5<>e;aAKZc(cVS~Z1h@wOimZr@qun0 zUo2L8)*4$({&soZ6ItlbdApyp%GGeg_B|#-z?f>*t2wuQ7h58HqH+@Pnl?K6v8;zq z<;!Wqa=H`p#0aeW1!>xpdDPBd@scQ+Wu$^(;16%LQ6*PBgU3Kc)RK?fv?&#<;TZJT zuyGA55Ed|pAh044c!58h9pn)3q<^DeZswPkx2&=jnSO;W>+$`pzi1ls9fnQan6bMPeUR0>^s@6)xswq3l_S_wqozb1$0=?yb=$T;EdQ|A$ zPnB+Z9GRV`7oFS~@h94u+t#j25sN|y8F2W}mW8WNAZ!rhugF-JC6n%xR6EK{>E&mJ zn(i`H2Lf4AtnJy?=+BuwJKY5B_{P``v9lvuBC%O0%qY;g>VwGgmGiFX(?m^RdMp;k zV;naY@X;Vkc&Zb(gaqzIV~jIy|XYnUqF_ywGV)Crt1TBv+;3n8tBnc*0%ih3ZFxauXP>fL%28qp18BTDGmQ1US8vmFB4t1s_Kq_2P+ zcPB2!Oyf^iX4OG!$<-ye(uR8qAwX%?%x?6RePpk#8i3Y?V?W#zbby%c^;D?Lx&|BO-ZXh6N0@`3rMd zTrjT_bEjrDR2M1YMrs-ATR6AikL4_~R?y`Kv+U!7q&`9>dRA$;Bu@rtAUjAP^W#`8 zup}@o%nZwd>>lnIdH>Q{eTeXFKHuy(_CMECl9hzk^fOw|81eY(j>D4M$ltw1@mwwS zo%am>Bul8`x{G2Y9nonzSmr`cf^aTTL z8GaT*`^!OoRL4>4arI}09THGh|3c^sgpCNZc&MNYK_MoZz}`1} z91&T8E**qo*WgGHrLHQswe2E}plFp<%E?WW=E$K4(dwR~5o zU|kr#D*)r;*S&Eu?#_vH@B85CmZK(`^7au!6_6$blw=DK?zq8hdfk-nZTc`=(#&}_*YWT zL7AK85goEa={jyNF7IC*CG<1-$GWQg0B^6Ew39^oWdz07rO_ z#k(8c-75=Ez;|>|0C{628f>6Hf{Xz^5W`{?+cS$iJ#p+W!e<4glIvKsIh4bz@=kT= z>pynseWn_|4K59>nwL0~0s)s;I}(lQEK~ejKAYdW6tT>f2!5AI3>=(BaU+gSPeG{2 z#y0w(R+%5t_+4f0U8*cIvAzWQcF`W$SE%%;?1u%s@kY+thmt;Z5{6Jw^(xj;w(siGfiyvi;pmbo5nY7pf)jrJbFso;=yW7s^owMn3p&GB z=NM0!MawvT+e39dC@7e2~<1zA&D7Fr1|F zaz!j|9{9I}9%Y27`_%9c5Y`s`OhsAJAdG#OU1n@&uIj-!K&u$j!#q{MOk@Cy!Gs}X zG>PuLsvi`&J@ytmY6V#Z|E>37x;TNgc-u{iCZ(CuCpPkw7)y>~i`}q0J@Yj}i2e3n zaJP}QI5$&ml~#wr(Y=djgEhUD<_iZ>U>B)Di4lTk#|mNv*Oo2hHP>SZ$8qWtu7p2c z1mgJv7`|k`Zx@f%9#5XGNl%I~w6V0DKq1}Z%g}BoI}sDG`*)csoMWsZXd$_9djROH z2A;Z52`ylk$y`)r22;FyhRRS(xXWm_j6N`4=IJ!Rp??IH3ArE&?RbYS_c8(9SRhc) zPx41yQhf}fpX3X2uOR9+g)^}T0xTAk^dj8h?||5s-#%bSjshB}M&sQ*I1}!AIV>J$ zf`HP_vvrH;)9LQy7Osq$UZ$U4YzZ<#)sM+Okhx7`=+v$YHIi;q$MblYs#|=7Eq0+r zD~tv2VenKwk4i6h5LBUt+OCUx``)Ry>gZ5EqIgLa6)st4ts6&aVI`%?t{FC~Ve*u~ zAjC!5U8yauqv{-esad%U^~rd+-K-0zDLDKzpF8APw4K`9t%@x?P*@f5-}sUfv7Z#M zt2xJEX5I`zhHzna3C+v zYUvD{FtoyP#W=JG8WIUE&i(U1lcNQ%CM~th@~K79VgZGNhkwPX*im`Sk_d8mArN*0l9LjupFp|96BfM z3`IPDcP67aP5NPb{M)spJg;oWZE`YNiVHrYxV{T={sC)DMq+iHWC41zc)K4huemfy zb|fg)gSKg`D~Jos&`D@y?X@{EQT+%nr&Sl1vi`vJ2w%_*(IM(_n5mBV)&fc?Zd+;n zmcp2d^7!e(C5K9=%Hr%}-JB6it1L66^YEgNNTBv}b9HiVCg+>|UJ+=W!Z@u-Ah?11 z$jX)4BY#Mrg{8*mmP!f`;<(r4?t=CPR)K&Oj^56@NFE9QsG=B2*VO3cf`FjOUqm1? z9V(inP0=Pug}N44sCYdf3gwWLuw5gD{UJm$L)MBZtO|+jdc6*Bc#b%PZG?nD5u5Au zi=QDkjLjT6)4(5z0E?7Zx$-PEolmHLzYJ;F^9vimk(&SoO`5iZjAyNz%|Bcr zb|>I#i{j?Ah%^jl*W@@cG(ENLZ9=`MQob1CGi~A(+44i$_D&oSaL0?~j5qdQ*J* z0PpFVa4&49=`o%}Ap!`jlq97yUomDh%?Bd{Oe96~r_DruVHj|<9n2{qX+fIn*MDbWk3-Qzjhab^AS)1!0p5xB@_x$*sH zQZTUtqs>OI{3IMDa^b1%Ns?> zC?Z!3?;q+n$$WxFTlL^os>1CqH8&mWvpYm*am=0TO)e>h9)`*16HXD?WZ$2qg| zyzwe)Sb$sxjpN4_sL2WLaOygOX&-?XBc@Lg48|IW`qMZWJ$Ls$5yXk4zZ?AFfB{Q> zM(pyWQVT(+a9tSd`Nla<7yOrL7$H~5gBcudZV;ThXQXp(i1r+)gQ>fo z>4z<@RA6FzptY3 zL>MqN3H0*d(!P{KDpWZmTcb^+F#2`g4n}hubB=_m2$j0zn+Gy69^urt_&Q%KQwF&h~i3v%6)v4&|4J%g&{ReQT~;K zrTH5L1P94$_$`z*RzlsJg^rtR0k*nBW$H`F1EQ&T2Ax`lCo$XwajtMLKpcAhS9q)W z;jrAV3-W^(^IQOFU>2JLPEEv=1!9F$G$cpgsUUZ75!*7S_ON!k+JzWXHYZ_gtf}o1 z8BKcV;Wk`aQ5@a5)I4wg(X3PKJa2zYqMql-o7rT*8dg>@#R9w1Pr{ppRMg0UEmEX$ z)H!f=?_T>*^hOazEb&vic`g)p=wPolL#xK^NjlPV1wKOh*SHszYFS;iGi4@Z&75Hl z(&3#p4HL9}xqR9%)xdSuM=m{GoyeAj7vSX*zRReDDOz|jH_fPWAXF>t${lh7&t$yfXQO&P=C9wM) zUuvwrg^YbrZPj8Mi;XA$;Fq&_ii^Ppomat+-+@buUmT=&J)#gTVb)PTV_jgN{uT9o zruFh?1`sjSF(}Za7nw4#(67?kPK7>y+UMIIZnRyUVnjOaoUVHrJDxxQs*KOjMSym5 zo(nY&MD;VomwRXXc>i2|S;Y+h)6FqVw`xDA)!@qOn<-)$tpEd%<<&1xNzo$-O(;+t zpi9@IMlB3+DhK=na#1c};|4XT`Kz9t;`Wg<%pb)NVyZWi4Wcbo{nxj$tpor<)mok3 zZ_@$N*uq=?Cz1YawaPJ(lh#^Ns?h!K?4QN0dGqfm+vqe9VCRhT%*AM=U z+hqJZL+VUOt)@bd;NKir`Pog`9(JOCay6Et2SW-BNc3=e98D|KVx+V{?aM*a!?v*ba)ktg`zV3Hx=~>dUHI zA#Cy3t+U!D8vU(CR*0`9VZsKZ&gh5Xg~YKIiku16{S zdnbv^gG>I)RbK6j09A3YTPz4<8PJb|gM-OebaJNmFbjB5zZSw zp46U)etV}a?VN^+3YcVnh|zK_*XrWls^|M`PPqveCa)LWsV&di#4eiLk11MTfL-p6 z`(!8Ufhr$QCUU!VRkv8Dd}uv1f7_o`Rl^)5x#M8+RY&#(y}+#7T!dVdkY2Mm@bN7z zJrL6BXwd1-XgEHt37@Csx41^9NHfgL}G~=r!i> zxugIk_*AX)37a9>5q~-XP;8&QHAm_Y0imM@$`$Qw`y9Y?0ueAlK|%9d*%3!6sA*ST zq}fL8e~i{2&>4Qc_$y>@X)}7%4N3B+VI~*Hs+%`VhDi1K^M0rP&h-@>72Qp3QRX(- zv1$9(&(s^!RjA%k=8}9d@j_H)EWW0;xY{hf*3b}zCJ2X=iI=|yo?POyw+|R`X3Q6X zG7ichV2K*EwDh#bt!)3mIGQyml7HaA{KsqAsIvVxbo?%v$St8puR7<9go(RYbhjR_B(_&e6lS1K%=ZmrjSUS4Bl>=r1xocvDpI6c+A-R~!*=UI@QPD)l+aovo;M zVUp2-aB;ihMf#Kes18#iX;9!XiuS=SDDpCn9??izcvw0@ejf=QfWnqfu+o9&I*iIs z1+93LwXA_X9B9eNUmaX|)l7*6G$W}%ftWHob(ZgP|I34SrZ`JWg!HL{ixH&xD^9nc z3i%iF@lQ;y+SSj5-9R9Zf?%WwV54vMFLI9?YC3hDTv$LrrBi|0ZK)a2&+$1+eF6g2 z=MldkUr&hj`QoLRPn&fq!x^kU^>d3)Q=N=dy43%-gB9(n8kfXP(d`7!)#M5wK|D@h zn+?P#W1sXeW&G?XHi8kw|28t0d>Y&oBR#x3=hEPGQEkI`ys@P-jX*Ye<_YmMfrRONCe{ zDHZxmsm^Sy`9ZhOE_;$mxkNCvP*y-~wSWzmaesDoMF;~ub)Qjp|I!9qSYtn)T zoZJEFch!q(YW#t8qA#(9qQoIXyQ+?SI|zC{{B|t}Sts(BHTP+P4^jba&;Baz01h=? z#2i8Hf2bvH3*h<92*V^+Zbb2#HujD!*yXe#!1lEn`lL2eovPJg%kd^0WeW$YT`md2mXs*KoY7J9YH6E?))L4DC9G?1W1smf%PrE`k&wz7ON) zh3g$J^u&m$4N<^rZ&~tKkw^#yXrMiuzk=AOf>muhQrL5jUfV#>?jRYA_`#Oe`G1<# z8g0$LWV41=b1^wZ@<+W$ff4`zO2KBSb4}30)cR2@a@4~9S@1#8L`IRDJMDzo2py}&?Cq?2R>XI@bt?DcF>zE@owf2mruUkA!b5A9OHk6v5 zA&A4&E5MubyHZy0F)}NIz3tWLYo)CJvX>e9nhO!dKWA?a=G1P}!C$H?5C!}#AQ(=5 z?oQp0D1zuOVEXTEeb>piCz;bFYAGDqG#m5Y`1bfQBk$lbb}za_^N;5W@ILX608$nO zxTNH7!nEoxe`TCI3e@sViz`oW5+e}M;Uh|)o*A<}v=p^DwkDU1ng$OB5N;@F3uILn zUuEzn4Q2Nhd>*rOnb|2X-{+T#3Q?qaO?q zrUjUWe%LbyJA7nPEo&tssn@N|ua7+?Ixe@(Xu#Lr&!RE<(;(HP+t2p|w6!bmp&lZP zUsLHE`&#ycj!J0PY;_xCBq4ZX;d-;P~9beW5J03p1?g> zj(@$C`yN~@P57%@V`7K*mp#UP5UEUG1DT;!P5Kv}{HRbHfJH=rfcW7#)fa`;zxs{h zCVVfpiqqeBdCjwBm1&!*jb2L5sHm`hO0dIl6nZ%QJ;3EPPb`SvWf4lJIM76+C~fM! zG|3#wj5cD(`Dv=u;Zn1!B5ydR<~~S^QWz2^({vBrD$)f4s!|mE?~WpCn-(`BBA&2a zQXsKFV*svi=rr_w6Xy)n0t*OAu^u|XU>haANT#>oGk%!gX}55A1roqV0bynd|DWzI zfd-(e0Hnx2faEr~QD~`Dz_9=ru5y@MH#yws-dXgiyvf%3anP{hsO~epUZ)Y~JmkL9z-0RX-Ff+T z&S4mx9H_g?(R|dj_>0Y^m89YKX+=z=^PubVbSs#rh!{8T`D9lsZ^NzcMl4?*9C!D! zs;)}yj@l^%;)a{j?s`C6Ab)jgRlxRCrpn=Zu!aOOuYNkY_$WJ+;ayi5}Evb3sq z;-7}7(Pg;G87u##N?Qy8UWY|GyiOW2+X{_HGxn*R0r{N*x}QG@d#08T_I_M^f! zk%B)F+21_N+*#9awLXr9UGwdE+Li#jN*k z6i-w~j^i}@bIG>4$aORp<2YQ<=w@=HzWUN*;1w1>2aDlNk2Pa*h7{3~XaJUOICsLg zDwjeVVZVP?_0uF!e+i)7P6gL4QTBJ}(zlb5$kD5_A6>7`vp}H!f`9g1SEapiBJrGY z%2}X+SKSN@M}xc}7rlv)s+f)GKY5YRvAstipKshu>$_328_#|TaFjz-ZtMVqyj@vw z1kr!ME5GIO&(|mzh@Amy>}EfDBz;XqcD@T}L!p1Dr2yo_KS59lqQEpXJ-cxWeYh__ zyAwX}7Ug|t!(4&n8sD+fiZ08Dikg7TN?EJQ^1|zZ1mnq$$^*$&xIZVfI2{_*PhI zkJ6M29K5A@xYC=dSSv3rNs(c;7saex+ZOgXyX(wT=vP)+!q7e;4a{EZVsy*O#=DB?bKqNc%emJBC-41p5$jiED%4*!exbw;q=>rC`R_S(jUO^NOHP4DDl ztC`zAmtgADi=fU8$_2dF-LivUa%)7BiNNxdE6nV&%-!L`wg6PiDGxMc{S}#*$t(~=L23&e6A&WFD0EKXxMeR2y@d~KQlvhPc)W=x!UmQbZgKsh&hDM(5~!3z0gJXV@r zrn|Up%A2W6QKTl#AwLY58aR->oXyRZ)>9VZe0rfHERzfTN8a|C$(3C&-!6vDsY@a$ zcRB-vN@od)-zw4w$=ZiM{8IRmyy|X2{m4TmoE>e)MV3irg9ve+24VbN!(a0=W|0V+ zF8G!?zPrzcmly@ zAX3Wx=lguUaE+++<=2%aJDq_7Fg!#DAT zISQ9(?!n3f*T$iX$^xioz(cFZuU6IJj}zc!2jJ%%}b$ z0{Ct}A9-Z7006T$T#vv&LAV%HS5=OFcfNTpcC_i2Kc9;}(9&OL9T3oovPaft2Wurp zA^h3K<+9R^02l&FmdLR}5tLlDWoJxt=pm45>-9wcww!`@8rh!C^;>FlA;G|`X0`Qg z=JMVfGqp^SfAeGUjuX+vKcyP$)Y(#W1VG*fp;3|Dd#vnS2_!vY;lPvjmIm zH>mDrF|z1(?G2JG14J;{x{f#_ZWGaIZf}NMNHUCdi?0V9{d@!`!SbwF`%ZXR{Gzbw ziHI+IbrnhkAxN=dDf#?F28Mj_!u7S;C8u+8&>Xy4h=044u(TyXHPXDes2Kg1i<7p| zCFVza-$yC-M?74X_B}OA@1rEJQ(-V8``HXJGeZ%PI~}SiCBoN-yFQMLrcS@kDRJY9 zJ3m~JdCcz9UYl@zbRVTH$NLU!G*Af=S)QdW6F*p^69^MG*$OWH)U?(SM~$fQ(Xb<;Q;KJ} zk;cU*O7Xd;f59#so}oAh6Id)_D(of!f;dGZ<8&h01z~)YhJqqa&ui{qDOLTmrxj>qhaAmO6DLr1D!is`}NKzY@gn1XZ4*&?4M3U z+WBVK>Z3&KHr?V;<@9E*2gkD~+=cS1AkKY@rT?qJ8$b(qS}`G+4tdWV~ZZvt35zp-y> zPJu~af7AP|izsPH`AV9HK-X=v5BTOc9UOTkwZPgF$$gFZxr7_r>S)!(V7)HWUm-A0 z<)|~pTsbqmEJj?+-nvVjj44m^rzf5{ zJMG=7&Q{{67WHQ?h8xf24}{Y1`7QD(Z8`SqX7T&Y*ZrPFbL87W1odYpqui3NZXU&n zlTc_t(a@^5g;$!?vVblT8%~sXKJZtb=|OnRH3P%nXQ7I7GfkE|-ZL~El=Yoboe--I z&Hz=jyP#o39b`R7J6o9ty_U`cM9&oLP!UDpQas$kFpg-X})L z>zmX_70PNzmhcXYy;`qn$4ACE*%c78A8KHT8=Xe?f{Juzzp-*;yT;L9X;rrRQ(oyM zWUVD)FuL1ZV4pdds29Nz4er2@k8kjNIVWWUtkf@`G!2C@5cB^Ew$Tng<0|G8fbHog zCoBBibnG(cSJA=h1_e7EZUlIUef6GM-Rw+$Ly-K1M;9WQFU|8lEpXCi&xO#g3nQ?h z86vxY;h*CVSpENv7X7clYO8;VfZ<^}pIggMWdDCC;&L8c_pz*eWO1?Xl91;12hdE0 z_|C&hbmSKdoTfRnv^8j-t2G=kd&$4@b^@q>v#!M!Tfj4}p;Iu@WX~(w0L;x_3yiC4w#r#2>Se$l(sor<%)6iI3POy!5 zcFw?Yg31RoVp0$g&p;_EnfRoV!E~EG6^edL4i|sfj4#$J6~BQ$uJ1e}94_K6Kxe#5 zMq^6usg-p|J)@M7NOq<|kozi0XSL=BYElIha{|5#T%5Ylnl{aX7MZ_CCo>b zT?f(ekmh~8)eG!ogprXuV-lB2O-U_TNmvz;*p1cT^Mms*6%CjmBD}z=%POE!7zx^t__n2~8 za~saXVVn@n`gh|3xlu6dl2DG3yBrIq?0!Cyw$-=~ogmPpbkzkl+I-h~7w4b!@ZwPm zZ0@DYwDfA@!nC7_YFk#5*`CU=l;rB%4R7C}XA3LJ7N!!It@=W~*0R^i8xK2p_vLq7 zv}`s3)G;vG1m4N}{j5Cuw?!jgZ8khBPaVFfU%s|*jbS{*h1w?V+Dxr;()?QNSiAQ) zOS->Xr@aY2S`#9ND>Hz=t{I`RM*`wggkZAQ-t7yKq||ArnLhN&fO7jtF>c(tIyWO zFO~=xM!ygPfJs?tLE3Y@O`Y#!!mV-f=3Us4?(BR zdQ^-g#PW9_V?)}=93TBeM)2rUfhH((wUNbks)qWxbC$O+KOJMV?O&gh1uH&Mq@8JS zEs3~Y;aZ};6lNN}5f}S6nt*>C54-N6(GX@tWo%Aatl4Q0o;ED^%EqA8AS;|AQ>dnr z(f$J5k4_d9lnk0Ncr`X)iNA&kCp4#3p-M`u>t_AUlLlA{r0GvWUrszCfjYx*N^JJq zB;B0irbOqzDzhqCowbg&mE@>f@tMGR@Y%tWD-_##=dxBg?GH>eJA9S20;>>MSKLfRvz9D9Z`LlYyg}iLweQdneYFSFcvGJ7>gMMEd zn_k-74zq)Ki)({l)vU?4(;+(eXcjw|Cmh1YZ(~konw5%k3#FgVL0gZmpd$4>kQdCQ zk9%t1$9Qma06y)-w!#t!sNtwq8PMd*X+qeXjzeix2{tOkGN)z;!F*B_imQq|i8 zi|oC_ugw6N$i)C2gq~xb?!j`GFZLlAkYHlAzsBXRres2lY3otC@2*yKg8>%f z6zhwVKKh*?TumwI9C=W}M$?J8PuxFX71WZ3(8?(kNmpvCmu=!@2q=l6=gL_Ee-Gp8 zKIF`58k8}pU({bnJH|*=RQ6{l(DNp)61ZFpyud~4esCy%yn8)ZnhH4Ri&tVA;wP!j zE*$Q5?@7S&ake4=pQ$B;$VN&=Pi8bv#xV{J4GiUeYRscLg%;IKJdly!K#K~+C_iTW zjk=DhTrnJtYQa-4FFR}Tf*L4+Iv>0>3`0rBZ`Io`d9ii!UNhxQLOR@FO6Ed#MN9h9 zLh2#RJ=`a^92=b;d^P_w>uT(qDf=5#GK{mP!@-7?(HClW`yg6cPi+KO_p9ZD!P?)H zmnBuN$_ zQeY6_;rDGlmy-6%mG8KkrgvupD_n|DbEG;=w#}~d8|@XH4T*J;6`5^6zKrPAe8!4U z^<2_rRZdr-4@QOvo)Sl<#|g5`eyJf)E7m7jTV{%{r04FdLu z2^kp~2(LZn-28!A&k6i3x#0U1_St40*H7W^yTxc47if@QWcBKDST|ZNsV9k5qIKbH zMDfRGsFAgO78`fBXfgS~_iY~ZB3%}P_OTc!8I#k~SHH_bnt{A(kc43N;JxdOnP&b@ zf7mub35LiD(j!q7j&E=Zt=Xk=JS-Hi3PD{m=M04fE?Qi6dCiH3dEg zt%F_q94dF#B-+LA)@~zV+?{~pH9{OkrKn5-sK{2#!!jr=+~9RN=o{$oRW1G(3q}%_ z9@jI-X&sI9GhgfF!L3yDqG0xzKw7n}nG1NZUta9fuv=*Qa3UN7nr#HQLVfOZikK^* zSoa{|!eIYQio83{v6@9^pi||qX#SvWz&e$O4E<6BUvR14)8Fj%g3>z|?JSxRq3UlE zk1{(?RGa#c(S~B*;HzOK-%}STt*4d(Ib+x#hoeqarl( zl|^saxrHdx6Q`MP@`e5izdMw~7j6&sW+u1iqo4L6+Oh+r?=ZHLm~n5rKQO$W8^6{6 z^S+0koFbrs%MTMUynX!$k_*+_?^~lKJz2d&j8uveU$^6I7&b&iS0F&IZ`4Md8W3q7 zeUnc~_bY`MQ|gb$00#lQ9v@JZq`HEv0TJZhPZ11e2y8NZ37A_VBJP9Wm0Z4W1l#w)| zYN*(667tvr_FEw33=Ee3@0J>q7Jp{Y#lZ7GQ#>SmtuQii!?y0v>jAfNR}n^y4LX}F zsEEfS^dWG75lnrvo&22h7o4Am=)>l>u{yY1IB*mZqdTyHByf}4^lEO*lF>?GT#6h7 zfjo}tv=U?lJdJ$QholU4YU2C}xT3>dhe5612tr1LOV}ptNbc;H7v?RO7M2`rb)_Zh zeMB$kyPJPy<~ic2V?wpgkK%8JA1ULDF{^0T3(cFTvVY*ljr}q+C5Ma%;S*TWdS|B> z@s(8O6yBUu-WY?^iioaEEoG@KYRdOB0YDlj{unNOSKX1Nn-61Wp8r#$sy7sRptb?0m6&v zL6>yu7l=EHbOMNO2!mxFMs2yk%*|9h_L>Xv#~WA83+=ef-}-J@n@~3FOByfl(u`EMy@Z(TDP1 z47%XG&(6rfK!44T=>$T?O{`P0(~BTX;S^^nt}4tB<)eyBhDAn>t&WrJm&cKf*zIha zvP96Y&K>G5c{aDpO9^~3C6}XFNZ6eRTEBN6E8aAvABKPbN&LY{sG4$=ItGm_XTX&t zH|hCe-50yxS7a%{`mv-LIkGvS+pp({27t>kkOR$+d`j%b&J zku=~t%ri7C+gTj;lkS^IoZ=W&bDT^nzwMWRb9 zr%L?tSQFRU9li8?(Y7?Bbd$#2ZAC}=c|hh15N0b9BbTSUE1DfP9kJ=cXqQ^m3)z#; z;#V$)8>+*DqFM7?erQe{mV+ypk=6adCD`;%eJ z^Wa1TyeuvF_X6gCYo3m*-d+bkRmH}}?sxJKL%t%o@*S2b_n{6dy>pdD*+;$MJeNSb7UU=_} z5G-*0HOf%s!jP#7nsJc*&|iB$VRPeBF$pcP;JUdYEB)t2{@ty8obu`BjGGGH(~jnf zqD|AOm`d<=Q?vxZz-0K2OzJv4q}_uG&`gS{AtFkFay!nyAdt%%&2TVxa~-CU82_(F z?w5{4bNRakpE__Pd#;-c7rU}3V$7mtLI?>w94(!XCQ1$-8|okX?Mt6*#L>Gp%J-<63piIyzC7L9_-@6nQHc)L{THMkbIr=S* zXtO66w{`w<2|usbRNfhHSuJZt!A>iM-X{M+bFWPJeCYyemoML<(n%&n;qdl!1Z(eZ zz+SlwC(!QakyBHF)K&jxx@{f7gGKy|@Ebn)Z1w`ip}yAp(CNtj-Ue^*Dzc^i65&xC zVQ_En9lRUMTg5l^lj&#zY_bB+dihn17n_djQoITYVgR`i@H>p0sIW@D{eHUK=}+@# zW`clo6GaCc(eL+Q+0Cw_1QFAGNinHE(=d6arNIc(4=_!!@pQg1XB4Id4Z|A>+OWfJ zi#V>d1j%lX(z9#G-?zdW@e3Q7q1?qBAbj>qU%s84;V7B~U|JS?$q>7L1BbNFVw2q@ z%Xdv~|9Ma40ySjxo$Pw(z_B?Cz+WpM0$k`Iqy~w@m%B6VNG#&E&!|^2?CF;B;{y+^ znxkq8z{8;5h>^kUt6a=o3kJNo%s!zuR`=~AnT-vE@OrCW+MxM4bdLz^4}(*f5c_9a zlpgQEeP5=l<}P?eFQRO3fGSo^mQ`3UO*>?&NqveU#(5|_G5eHnj zqNhy?JB33C+!3rR7K~Z-K-@o!cO?>&u?$qKnT-@XmL~c?d4j5=zr;p0AfUNVhqXBl z`>~?2-gRi6H4#>PO+N1B{MjVr5Y>zF{Gc?lKM&~s zfksj>n>%|ncD}XXQ$rLdxs%v7k=%x*I0AW1+Cz`N>c^7M@fBgNjPeIm?s=-T8xqBd zzYk2R?`?Q$#|ost!I}HgV$DnE7K_uLgi=FMT&w;9ii*rZs$c20@I5WV17>f+MN`S- zvW1Are5PIiE&UG#dBq*9D{T8kC$0Zo)aG=>sqNHJm@c}zA zdD+%AanW^kzxj?J&?685dV1sBh2s-ez08i(um+NJcdhs+em8A~#-~sW=65s96sQB+ zw{qFp{Jo`Qeh&nMZlL-c=`B2Nwj#0$!RZ!8vJZc$Z5&;OS}PdwfMCc)8qGf6^2+wW zCU8(Pz|6ctN00|$f0p5?f+joR0o+FS$F$6#vpg*Kp2`-TXiKa|{6{+pdT=ZZrTmMA zzG38&g63YZw0R8QLS^GzcEx3BbVsgo_Sd>!)kC)ksM+TP-sffqKE+v+Mr-vc`IcS5 zzksVkx9O1oO^^CpG1B@Ol`02mqHfER)$w?lx+S{DEXG>DeSEQi1itZW&2F&%8Rpbd zdUF>q3%hqb;x8Uh^5V)P;1J480uaEs#h9+BBKrX}gnYKb;U3i9OV{5vL9IW3+G?yi z`y-Rw``PsseIr7|mGAw5%A0GGM;dH4#5ADcPk@3X%@81RP6um2Xsk!A+r2x@ots;G zkXZSyAL(0axWg{P{!#g|lKy>f+9$9W(3%icN3nG-V#Pwz!E>FQb#JbfqSUff&P!d^ z!mxB#zGGX#Mpkm?`kkSp41%}NQ-=Rb(`9q)(lvA3elgx7pP00ZSm;J@j&nw8`kf@0 zGz`>W0~)Az6JMZ{?_CG(@)g?XXHKNv_>${+fM+p&bZK*A3jkdS7^1tcBLsF1_;4eX+`ZjPy z5bzPfnmhnT7X1%C`#GI;f-WyHupe2CInn{8{46~n;u4T%lf1(K9G; zeaRR%q20WSj~YvR@eiU}jn?ReuCb##xPH`}%BC>XT8#OLn=B^SNVos2_&BbE!$Jn5 z2{_>seyLV+TR79{`TuS4(gZAC9PQzsGCztzTg;+0MZR7v)D85gTDb%uDK1^z$z?sT zrvHzzcZ{*L>%wl!wr$&8w$-IBTV1wo+qP}nwr$(4uljkvlaurB{MlLA$xc?XbKjY3 zu4|6LkNm&4ngOK7)JMyi`c2Bcc7 zy|}e0f&L4-|1!tVV7;fjL8#{-}hydzuqX(ZdDfmHzvu05I%4 zEDPlRKS{#=>yd*F!BVQTEaM;DPCWIMuj#I*7<4E7zmofZ`Ivv7Kmb1D%g`Oa073qr zp6dSv!RY=-8vbAHTQSPDj4~DCPd2C!NIj9h1f`7Q|1#g8(;=Emakr;ghWvFXWs!6)=F<8i7DOjnhso{WEdH58^4hHL1Zc2s zxQ&#WaPG1Jkt96O>ns)XPZb1H{gq}i8tDbdKTIK9wxH~=+;4-6w4)-6F;J|yP7$#6 z>&VI)$`N^XLc~%kwNBvEcz+C>-S1|{x{PQzDL5?9A)bvR^nskS|Jk zK%B#^h!?vy%+LC7)Ys-~wxRie|5k_G->%ZXd3YHQW^D!&>}v9y-(`Jg-+eHn_GCtb zT+mOMN;-Y0+DG9Vlf)AnR5_6G((dt3r730WQjv3a6@HdTtE+z?lkj+@g!}~kfAgQ~c|D?@C!GE?;PjV3RN4oZ9B9NH5 z8a_I0dwGy`4>T;(IsAu~%pXod8v%9%jx{X>q^~hW;m#)HbXe{h9_`8{#zO#>H*?ka zhyq`Zi0~=zwbR_DV0rGin6c2WtbqmsHHRaoa8ocdxH{070!_Nith+i@bFiF5^)T~A%iZw#cnuAYa3!n$Q6N`EPkjWmbDDC+haCkc`aNzHVJ zbZ>39G<)q_{};4V*93Q~0`kGJxvA|D@-tzX!iee9;q`3`ztG&eQLUH1*LY38(BI1x zuVvPlOD@$t2J}EUl}(!`BU_OZ+1-=_;V2ck(%5fLOA z2SA*gF$jb|lPn4^R}6{#)iFO)*ufy8F?wOa2j>;M;56ylrxqC$3T-BuVz1}iciF?9 z)1oDm7hoc-H?4@fj%B!|He?Ik7`oT;X_1CS`61!6<3O!$vVYdvI9Z-Vdcvp-T}-yS zglVr2EyXuWyA=8)8XArYl{I0+Vdh0({Iye*Sr0pdfN3^G!#6}f=sND$u5S80?t|DT zt3Q`#(JMO(OUAp|SfQZl6M*z=mJj=l&?_a(_jCFUlUC~|sZAmH=hp9z*P6OQ^FO|+ zT-1}uC5@bEbWQ$%y06s-lVF`Q?lLtwnEu5o%-Z$)qThwi+V?g%o;+|~dHeGfHEWG& zTTq9)d!|nA+tMmzVoPf~{2=)O_4lPj7()c!lh<;{fh`pAC z#Cn`S@bZY^{I}q`D3b4D+Q8vz(PXH0hdNNX-Z!j&hdue6`KH2Ce8n>1%cE(tw|&e834X%lAL*DBE#wk}dNBs{_OWyO`5;I<2#2v3 zyvFE{jKpUVKmC%_GM&@*f=50& z!P0=g^Pt~NB=`YlHy=r4I{|#EYpgbz1435Hd9e6l>$`-({~Yr|UEFlc^4(i$`LnEr zsr5qVsJw?i72j9n6|=c4qo$MXle(N^c>}nGk!(d7Q#txIb5*@XJ?0|cL`uO*S(p-o z4ppRvqgmh*!2qQ|2w&vlA==hyq(Kx8{BLo|lq$`&*p}sJKmO@5TbM0b ze%a47G*DO~S}?(7y#2s{Lyu<78U=|jkq#nLESZ&67!FQxINPmO!I$lBrMRCM*0>Q4 z3{+AV&L1qG<-mv;Ac2&-MJ3_E^xIRdBZ;rD9m^15*FpT&`8JCAlTkwCU_xcq$z+*eiRiln5_>guId}t5u|v*;RgY2i-V*EIRc}r_(C1 ztoe%BJPxI#U=_w-L$s+i@YtN|+iJ;c>$zNR9k$N{vyVU%{JO5F@yTv}nSK+1m*2@z2M zf_H(0WFk7{75B>&U*zez)5b<8nn}zpu841-DSS+m?orx^P(dmX<)G|B>5=qW?9q~bgi{7);h+3Leo;uo>AZ*eY+6KIK zG97-l!95izcT)xx(KIP_nQq~n=3rWYSn7sHK0n_xd2s9T zd*dcbk?~}^+0I=1FkIV$FL3n{US=f=L!Qb0F-Z9of+9F@nL`|kURDKt7I@1OZIHqm zd0Mjei@QfVFpYLpRnE6ZVG#%TeCL*C|KVB=!lBGi=Z){seJH?~u30t`7Cvcxj}zF(8;X*CY)iN>jVzP1XK9+$h{VZL zA7={B!i9XW7<(3tf*8!qUE`7$P4Pi1%HrK%5)k^?805XvGe_F1EHRN~qzslSgI+92 zZxCyhf~#W~?4?Fy2foqED1zR-llk5ILe!IW{>76ja!sTu-5iz09w0`#X)wPgIGcKL zw<_fjHPDi8eGs*CklhyMmF0pS5x{W7nG2FNwa9r$aED^jMG{x-sw;puLUrrO&(UJf z@@m&BR&_J_M8Z3WmuFZKtfo(e$n)>s3?kx&`WaR^=3+8&&kmh3MzjQBaUkw3ai9p+ zI@2YpAypov2Mr+Y8_O4QTHh1iaW39;HCvb?S`x@{<@jis;|TUdhii&i z8@A=6&K6JYO@gbN0Q8RehZ=2WQf8}+iH_Izi8gfig^Re5)+XKWFw*Dtt>!uy{rFBs ziT?KUU?pA*Q|YdBT_Rr;)XrQYJL$?r%m|soC_Pa7T<#V6K)QDo7Cau%Q-3-#Au3zm z2z^S;!AY@d_R-?HB2|b_Ws{5u40g33g9rws^0@R6%>4sP93}uZJlCt$8og7an=re5R{jyP-Qbh` z;snp=Rd}e%?Cuq7GVdh~?{7vGJm}FdGp1%adi@NgG#~D`A-ipI{-~fNqUD6)4@4c7B$Cbjsm_-~&|qs^lD*Ut*=(~^-zo2)WfnH`(R3Gj&G%kP||5buq%%2GPFN@=|3)m!Pw<43p%ca>7P%J3~YuUfWTR6iLgHWgfy3FENB4yIatRox&hn2MNLDoE2{XR z&aepr{HlO9w%KjPg_DX+1!f-If@WFzXINy+69bh8O$-5K$_v}iHT$mC-PJWLD8~Ot z9QldMp!*R_Y(*6}seE?l{NS_raL+-OTfhV4c04zG({>s@Tz#ghJs*-p01WBZJqkmC z&9w5_!Yhvq^o+UGt39whjCh@e$=6#vtj@A4SjO${xw_trtINNqKkDg6D(i;5xn$I& z99O#EHlU!FoFWF{GekuzN~B0NPnIvC_J*0qs}SIT

l?s7}*4vp!2W|88=L^r| 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

nR1?qM=|aYy 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

F}woT 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"bt0}@AlIHaMn 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 diff --git a/docs/html/_static/css/fonts/lato-bold.woff2 b/docs/html/_static/css/fonts/lato-bold.woff2 deleted file mode 100644 index bb195043cfc07fa52741c6144d7378b5ba8be4c5..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 184912 zcmbrlV{|0Z8U-4g6Wg{k$;7tpOzdRhOl;e>ZQHhO+vu0M_dc!n^L?xObl2*xbJkbu z!`}OJxyXq!0|5g80fEfP10jFEL(^aafy^EQfq*W5pZ$LfC-Tz^cg6%lAE=xZ%GU%s z83P##Ch}7_e3%!Q9fTBg>laFZ4+!iQKM)upcoi0;?}9Cy?@z6Ky%%>tw~NKKJ987+ zBV~BtSYfP`gDMdo{o&nFop4 z$oXL1NPsIf!3NQIe%V|P5t^GcXU(bIn+oI0I-(Pi^QdP;c44Z{(p8IrT9|(o@c+{e zgFiYyCq`u`THS?5MRLK*ACtv@7{O^c1iE!ygQLbBi~POQITE#|&AQRahOEN*6Bviu z#%`Bd5HLp>&z67^M|l0_dyNq$5JR2#J5fad3AW7A!t?I8)8oR9TY~KYyU3s)D_i@a z11yTUQ)MCg5_;oAoKd9dC}wRJky=DZ3=JvjJxLW!MJ5+ov)_-j=o48=R@V7<8*chuFk$gZVlS)hW+XSPcQ*yv+ z=dQ`KU~~{yCXCLFHNap)&|4zIBLxaPG_@r27@b>6$c;ER39AK`c+&{~)fCy+)Ig^PvF=n>)aNXs*}#Ju zC`&4U5IMy(qO#`8Y_#Ys?CTE^s`)AFmSH$sYFB_CNIC+A8b(OuA5gYTnteGD*Dim| zm`< zP-qKPZA-Z>wQx%4dq;`5MrqV1Adlz@(6rq4=p0eJHO(2$x)v2Xv>#SI=tgjq_mNM9 zSeMolu4dJTrum0spvic0|>+0s3Ne%cRrmsLmeIV24Ar2*cj6sSplOh!8 zG?K8l$+r+eJ3e#MsuF?ogYl|3*}@g6HCUr`vfyTs(`T%XWXiE)ciE_NXF^HEffX2? zI$||g1S7@f6e1;ke?#WV+Y?yfl`LJDJ^rTN`JFgSy+`z^1NpRMKtVR^P4P(gusxb< zBNolQ6$;!~r*uw}$^R~|`5ehLYe9|kOv$!e;!ly~cxQk%%-d3`>u)YOc~*SF*S!~6 zW)&%G9L!Y@BK^~0?R1zbEB7)rzc@PjTKxASy0iaM{fLMlNCXk6Do2sS+v>!#gUz|3 zru)rL)JLA&2MA~f9rT#M+j{u8Kk&>TA~~dg1NUKq=e4(HYcC>L>6Ce+_fGzr3!%8` zgw16sXLJy)>yov~W|G(|%lM_$=E6pSw_9#H?uyuLhjRp_`*G5STTn6z_|X$ZAB9uA zD?!>G)@d3rSBLjjf?2zi3M2`V8pT}v3`}~&@zRK+@AlIhWmu0GR0$^)KM{AN)D5p{ z(*(mCsm?v1wWC960!6B;-z5$swmZDRzj_256s6!zjU zKe^e=IL+RdZ9Q*kxKk;H!%=tziX$o0|hyWToE*?^U z#qZ5^`)PPeKeI+GpJpWz{$eb?OjW1cv0bvE0AEaWH)?UQ$in?tCw#irr)k1UPC0CUjx3q$d#}W_Qwj#)I`PN>ta=2vj+$Z7=E@r?z94qmL%Th^&Z}Rrs zEJQ=}m_OoZe>7$ztW)M6q=-5DWNp*UOhoZLngnSoX`K>k~HciGo)FP1fR z@m2nMjWP{ikro4YY_MZd&4={`p+u2}$j(dD$rV?U$avGHlCbAOYKcX(q)PC6 zOGH+&(_`3gxfAb%CsFTnpL44XUlp}PSJije9yXeu!IC$A$2$=JCUHz{=bXC%lC=ev zV=nBxe(@Pxt|Yg-SL+wrLlm|)E#uO@qNxd$%>1WM^;|3%7R6Iv_4IJ?j$Gj zXgOgvNu34|YteFA{4}KcU)EAdQE15(x%&aHOEG8;qijYzBu4O92IC%8WZMrs{aMD# zS!&g;4|EnHixxi|ao8_VolB35+rlsirm=WC1aqbPmKu{4Po})->pS##s;e*PvJw2) zEp!16e1E(nBC~cBG#mSj=b95%y5Qwz_v@m-xBj2nY{dkPZii*OvbGot3Y z6rX9(KwkC+*QwcaIUl*O^v-%J)13B6iV6Nwt4H8h%`!UlCAMXcn$&b9h?oQgReeRD zW*b3f7rJDBsRA_9g%GVPtaD{mZ`~L=2MC79GA6lnT{s>C?AhC5W#Hi69s;5mXmJ0a zbsr|GEjv%QB#Ds7gQ7t)TKcD{0(!3_GyF z%O&UZVGPG5wK?kAAnVvIYZ&1s2MX1bMm#$$@S z!*`2Ezhg#xH!A_eWEKb&bg=a=4Rx9!6D|7av*-4+=aVj!$oC}n7oUjebT2i&Zdn{B zZWT}Bl;4FZM9Jnx0SQ{@$Sv#Itzy%kSRO2l^O?!&wIDyA{-BGuyj+zIaH{V78Uy(j zQ5Ix?8Dua5s>5!{l}UaJs){W}uentCSLl}BQY`EZXvAUQ z6=y$NaKB@`4S3c%c0y_fZ?Fjde%KFv65<|}sYc$OFe@_<{5^kaNiE8iGO+dhGM#%n zollJY*0;_uolCuCz(~jw!6~5jYxt!5fJVV=Gu~k#0PLFNg;ZsirpB`emkXxBvJ>Xz zjvOmt9yQ6rEn`S4r&>V|Jq%rp#yc`%%tCy`sX^uz=d*he!2Q`>4dg{x4#8DX_>up` zcM7Qg0{`S&e1&oR;l%k6AliKbDF4bn1EhapoB`Uuyjibc$<1$2bn|#i0NHQP=YWVW zhI2s37snZ(>FfF2yZmeV6d)bX!a*hN;EMRL98~?Q;Gx2u1pOFc79jqad;$pn3V+Zm z`o1Lngiq@jZDyObXj5UV{ghzVTjUck<4u++v>>P2KEBYs0KoqQ%&v+p&siWWa=*mA zxww0LY!|0gt7-7emwV=ab-n?LodN)I(blMqG!|%oY}A{z#8=ub5NM~W_j)3#YunM(wy476!s+e2E#TWTr9oYk~bot zT~9|Ce-KLWULX$(*HB(CNAxc)TzLa!SNG#M4hYcr=vdBEo8wXoFGRk5zFNcZ-RT}r zE$&!tz>9P(8L|7t*gtpEX^DUV383e(&--e&PvjaztTt5C5y*MwH#*ZxOwg;NKfOv0 z$Ur>b#mMc6G&FzqV{Sebeo+G0`cQTkz9uiKNV%!vm4|RY48MQ{!oa9z4}EIvdQyg- zzWCSAw)ts9=`qE}_{&R#rx+Q9!$J&6MRP4Trm!#$pF~=pf727Y+hs)gzZ3y$9>2OSR|Wp4hF3i! zaZ!OvlmB_cSU4&_EPet^=zlbF*B&~wpDwDsEz=-D$A(DwiTNygcMfwaCI6ct92((D@~+`GwfPTw`fCxYPsQafqzQ%%AH@2@-|Ta z{L!Fh16HU_9kic;^qi5T4r2n3VhOgJB6betC@m~4G&k#|U_=h?lpDxmG9|xm>l{^H zmAhQ!^GNlP3qu=EECXC^?LrwoM#zwZ${CA@V(QCP040kJR^<7x<}&W2biGx~2{AU? z`0I+WVA7!Xh(?K*qM`^xE65`&Fv5bO)PUyedVYHEUwV7e5Lkyf{8*}+iZua+lHmcq zsNH=BeCqZ;T?2I@Wu_u+GNP%gD*~%I_Jr{htxC?T7{I{DN-nQ1D~3Vg?P37g*zMqp zD4>eWv*JB{2vvfwTwiToJXk@g*M~_K{yODM5|*t&zR25^ZHec+1}vL*&P!gB`ePAO zb12&=T)m>{&ymxO_JB0)rx+Vb483oC0?h!yARw*ngOY+7HB!#Ys+Bz*VKRL&_Finx z4SeBCWt3y4-jm$qwm&9z-9-Bl9J>eidFFP@10q(*7XnsEb8ar=quK0O{Mb7q+YwVN zt6Lw~;BRF9+B_+ThU0I6pR+NXz_Zwg#P_L8YADi1qUphN-D|dMb(V_e`%LXS!tnf;I5KgpwtDDa8QK1Yh?&%S-X z%vi(nD8uqjO8D>>ur26O5B8qB$$ok?;LxdScL39i_*UH9@GT$f@T*!j4}((KU1(`& z>?Q|RmC3`!OQ-WOh$F_A{77g0XkOFjTfe8EZ4-_upe9=pkU0T&R^qd^rO~@=_i7w7 z*n!Ew{X>P`=ZkQPvR9GWq7XXd7s$9`*Ao~16#S&VwryD$sLdd}YQ(0C>TBkzC<3iR zegk3u1;%(*v-7Zipb1@x-q@u{@LQj$2Zufa5SZ`my?w8UD)P?-?0?>TdqK(dA7}o3 z3Jdd2i7#9_0ENDLrmrXyMM@B$l(MVbP*}7%lJxX$H07gBzWj8o>e(6E)A zlpQr5h8TUA2k7Z5qeKxEW*8e*R^<>DVKY$ZZJ8cp**7djKEo1tz!AN&QDPsk zgDrv-$J+>c)Z_XZidYf&Yk6B<8#O%@5{oJU(Gg)WZys2?PywasRtyivz^=cB>)vWx zv%Er6VlW6t^RdHN6|7cn5slCUBQ_oX8bxb7k-h9g9SB-set@fZ(IwhAt>aWm^2pj4v zw?N+4U6tUdkmx&gZvfC9+@44#D($xyd}R*cBPA3B)lWX2f5qVY_-|B1iRS1odfA`*v$Se5O1;{)Qp73QF2i zyd3Yod&m&>0lynj$?z2cLsI%w$~V32)44cLU3?gh7ybZ$e&c>tBZwI|H^= z?YWn-hJX$Z+LZ?bzvXFs;*&=A7+@fODXm&1NtN)6kfU&c;U`43==iW3{g#zB80wxT zDI`IyE6;N9T`ljuF=Qo0sDBXh1KIQ}@lX!=C}CO;)9pkLDNt<%s&B(aE;9^31o6Y$ zqL4Jt?a%$qaSb95i+}9nV0(lVPt2;Jx6l3QiRr5Q{G}O5nuR21^DCL@eaQw(%lA`> zXAc=WH(G&`rD%8#9fO!8&%lhn&Rys7)|_Po7+12+TXZp0EaVI#$5%MvMu@l^b~1_r z68lC7v6wO=ld+1Z;4rYgGJkOKRLQ8A6J3|j9Kk3j5&UNhFpg!oWNTL5&r!2_<)YTO z+$Kq$kLXY3Li|Tjq+ndaKfPbT#HZyxW_a}d=T+c@7&0RBF1Vhh{OioXJz%}oWQWNQ z#7%#UWZc*eIGWJVadLUNG53UobuZI2yR0R$9p=Akr0CIlh*b1g#P|9l5FCBwM6}w> zw5um-detMc5CbW?<6eX$0|kB&ym6BT$mcw) ziZ`&-6E(9o8mRY$Qr^KlrT|_Y&jI8m8jHM8b zVaTAuoR3Z)qUydfi<*YW=f__`c}EAw+x^6$_4c+2asw$!K(~Q;%&@OeXS4@J*ZxHG z0UJ|vIz3#6yd}p697+h#ER0*x^R@LeHRSX4gjR2_z~leb_v|raG-q}aDpeH5QCG^P z=n=&P=yoC9$-jFPK=Vqz;=on>x&fIK{cu?}!oYSNh4sxaQM73s#WPb{0BLLjPMmGA$g>T-s*$FMm(F4PS z_XPmBdhs1=dSrWHx{~BDK&n6Gi}noqijlp65%A`_$YBQTE*Otp3H!TOHdW&V=#pkB zOKP537^&5+?8z1SF!t?Q7I3&n8c&h~&{%SyHZb@YJZIPy4cdSbBS ziJwDb$H(RDKx<+bGQ%W_77r6?9`_cr;CtCLa2kI-Bm1jY8b$<>Ug!@Wy4El`M`gZL z5}L8I48O+1)rY9vz!2|wB9rI}2!9-*b@XK!izkr*Oy2stLPM52Q0IjwxRI;%)69!P zExopn5Gz}cYl0Fpf-~@fY9GL*keEHT7st5*{~W!FVjtuMV4K2Uk9Q?w+CoVJZdCmGgT@f15ni zUz0)5q>$(RoFM+lbuD&9`t5UI0AC029KZdWNm2>wh|-x+O1$4(K{&-(?MElT(omZb z_~P5YdaUh|h7JXQeQ|JGM86lGXO)?6YgI%Qo@K>9uybQfeeg-=D@;(7^zBfmI@D@{ zmu2GYfnRYtIe?(>s&jN;mYK)5yD$I#0Tlv=l>Ws931-SD>7Y>^6*H^qOEX5B0R`SE zgotG77F|(y&hb52W*-P9D(uaS9_-c^Og|o??KY^dSx-Op34t}BJ`YUpPapWURWL)6 z>CU#q%z>7I(!#n*{NOn>OsZWDXG^knXM|rIOnD1T#Yk8eQbaEy+<ciatH!D%$#@mh07a$-mRg<)SS0wP z+lX>B2;URdY`n;sP6=2D5{KHBSS19Hc@f1h2>Mjn<2-F1|9NG26Gvt9b>PXV|Mb_c z!|HyG^Tg!8<*{GZpQJsK&kQ_Mv50cSQ_4cfXh4$ES^$F8g zg!lZuO+$t85HK+pNXhjJZuTA7HZy`bPy#eP6a@s8aEu@jaW7w&twzyxjY3M5RY)ZH z{&Z1&CE+=dDP=mf1X?%XOpVQ!uk)(3aN}6)GH1EF)Ovy!4LiRY!q-O6%0YbePb>4* zgqW{-BBk0nl^mr5xp;<*e-W)IyaUymJiRiKaM%F=FlXE@l6T(k3wEyX%2W86`z5cb zbU3NbH(NS3nGYl*8IUm+KQVY~PGB)c#!8s2+`Rxs0 zT)B;di($ww2xP{`Gm?}W=}Tql&~)n0@82$*rydb=YE}7-+%RzLa4>Xekb!mlnq?~W zl2vznNGY-rPSfKNDY4Y!dgh-IQ38BAXGzNQXS1hQ$K)YqA5&P^NNONHJ@KmPd_Y4!Rq?FTPJSnFQiMUW}4g!Gy!Mk zrf1CTFtLS>E|?jB?X~jFQTR)muAQfa6dy(rXX^S_p4Hdt2N#fcm%bHhW$~&ZWivv> zlCh?$A+@wOKxL;Uh=G*8qasQELiW2pvsCWt+!tXfYZ+_(YDRsxcwel7d7~xm&2y1v zA$;7N{E>~*P#R%^TN`2L*zNZF<|M$|n|~7?2~oMQUdMd~?3mUck=uWdh~S_$GaH zhLZAe&1D3uDEzn7ux^e{eRZsb1Y#`(#A7rSVJy%DDhq@Klp|u?26Xj+V-JkSu)^>T zA<>x`A4ZkN%ZRsJD;96m7r7W<*rHw{%2WaB<(}@wYBhTBP6R`u0W>2JKcC;5YO4+s~aF6G2j)ThX(O=f8NEsY9FP&21;aS8#=MR*k7Lw-ZI_CLPpjR z4-gIs2@&oH7ch!ZPr4F1pj^mQdDRLDmyn^%UHbUD8QW8d=YWDpbg;DC@5LR8v`3sF z72Fm0G|lbwMiK1#v5{heW(>B32h)HMW5aoJ$U`i=5PUv$GZ z+Lr@CkA`Bo7EfF8VPtLBdGDW_=(N4{FZ}%HG%|E@Ka<+gvqn$r0Md8Fvj4^=5heZk!jKp3ana@R%@W8BZtNg;pFk&MCPhY_V1Ow zAXUrU7&f(njp6?WgL73)lNUJ*D#P-mEiR$r)+bd#R&gacfuXL$J5{4!i1zX5?7^jk zI&|jYucUNf)XD7!+kkDkPu&aLDB299UNmXa-$}oa|Gd4U3%8n#u8_(RIzrpF!2%4q z+$2wGB7bg}4cJe3Y1QnSA7PxTHD+&bIOho!tHUTj5d{!O>~Th6r4^-WO-T)`g($7i z;ir@l;rq?r^qPJ!r+aoTO~}f2YiEK7auT8rV(!Cth$p!)2k%E?fW#DKFB?35(#8d~ zO(!4zNsvR<9@HEB zg#)4I^t4k=fE9#m?{OEHO}>5Se)ow%&i8I|R~}5-?c(zqA5EtPwy1;U|M&j*W7@}N znWr@@zv6`!hop<8c!`a$|$5N;u_T^H87cwNqg%CGJXo!g9b%1UjePWgQG{SvMA!mZ9O z(`J@9oS{p+_lXP*HZO9WCC7>_p4|NQ7uhcd6WMYPPm4csHN@;80U^?ei}WlC zsp!~v9}`H%C1k0Jb#>?A=N+tY z3j*g_i~qP4yL&UTD(TpUN&x-2U#wJBzotk})k$ngeQG5_7#^)!o`RtR!uLPOB$9|9PmSfSZ|<+u0b=}Lf_}%A^?-eaXIdPkEbjG(jl{QA z&5e5I@EGVlyP`|p@NC z^GEm%1QRGl2|E!wL-KRYce~<^SQfojoyu;S!$Sd`ZJtbTj7Qrk3|e(C>Wl*ydJZOk zGarQnZE|n47eX?$ZpRC&uH~K!!IFqGPI5z1N)c*oR*+zEy{Oe+MRb6krp*MzkLd-3yz`eXA821en>_z z<-VI)2T1xXqWG(#Vxe`BcS;0gt${F!bjIo1CFM^L`qNWm^dU3Vy<_bz5i&v?qndj-}JyxbRAV?nQ74bH;5Y$e|UuyO-d9AJ9AK7(j;+U`CMgzDGN*iCT*b@g}2#=Eq&Hn zT!xhIi#B)TEOnBgL4}M2iC}Up-V#=yc`GB4FNh6Oc z7Fe6|*F6q6gbZ4M@K*8GtLqp)H;|2qD3N1rf<(;`$2bGO6Qc@sq|7L@L%FVugTpPNs&KtAWCGvC{vGXsH1iJ3q+kjP3bhqSujQ!ghE=FpDN8ce%qH) zZPy1yvPy}Em+sJ^-$YASuW9g`BUt@>yV_R{5^2}cm>C2GA|TY~7T{D z&-hd_vQ|xg1CBcTuM%h^DO`W9Ciz(Z;(>-pgw$PmwQckpc<+Vql@e8~V_bC>?9p){ zFV*0npWS*K@_rr=3UY?r^{ccwVY11!iclO0b6YHvk`Z$)U zzzB6VdSebj)3qb%&s;K&>)J!Ec2B^=;#s_LR)zG`C_Nxz-p_0e?NvPvx$&bMjdZt+ zfBIK)K|MnlbERRUPiQxKczP^mc8EJQxK=d=>WnOHpn-1KrNi+Ddj@+NsaWFi!}4ep zc}A5O%s_Y4sB?G}Bq`*TIJF&g@r{z`GR(>kxI%c(um?$dx6?U=>{4&S5Ji!0Pkuqe zl~Nh4#Y*Mq%ZDSZti479UinxZIwX*4yE92OW=}+lMX}2>M;{#L>QmY_O&)fT_mR{> zU`EA-j7FGQHoi{PjrExO7rPwDh^ccH8V1B691f|ZSGCI$-xlI^le)s=8$HO3M%p&y zMcb)u>RkW!f4oN2vRA=(qm_J&Hjk91%wP?-Y4$AgdrpY|tg)_k{49 zK>iu>m4NS4(+e6i*BmjE5auddC|?j!i4t)nb(uR1_7R{U z;nbE&>+pkXwO{L$g*Z>15*5a{C_?FiCop=(-@7<8bXRfY7U_w1Zu!7uDbWU@H=|Qf zj@xcEnj`*dYKebVC3~x-I90e%p;+`>d%plVEwX74L^l78wvT2{*=prw5_;SGp);OB z^QhVBoQkmP^Q5z4SN9fGGq1`;^>M3?SAA0q*5kB#w*rpfw#PKY%B!}F*ph@OzrgkA zRKXLs9~9oL#h&jnTtr55Bf&${(L)OTN$2A;_e0t1@-Yjqvv>XZt29@SG) zEHhf(8Y2U&yJN_01D3ttE3=TeJQ)HDaSK1Gv~(jH#*%=C}OBpGW-<&teshW}a59S|g=bu;7<^Hx_ zo(s(;ip4&l9Gurv?+O|tqf#=P` zxUP~NeWJSpihREflZ@HRt(-L!*gg--Mvg>gVKrBke|ECc+h}!o2z*Sg>!J>B-R^B9 zR&U&QXUEAu0XjL~L&8EyNaeeKo_3_L7hAg)7#m61c{$v{gh`H3GgNcY_0T=7Nv^=! z8)3C7a%_b=APCRhKG$L#|1JGnnB64qBBhOk$KweqMDiO&iDgH3#nymn51;iJgdhV+ zG;fBFY}QsH0xnQ8pCyHsy;$2G-@6(enk9B1uG5`V4W_fhQBq=V;fiM84t8vl=hytz zFf`huhL2pOrral5J1%UexR#JYCYvP14#h_dTRa9cS%kvoBEFVHxj3$O#LBT|}W32_( z08#(o2=7yD1s#&k_s^}&+Wor&gLsdXLO9cU(Vvl2n9m)CqyC0tF64iw(=-Q-+!%VQ zSO^Zbi3Ay#Y!98dXJNFojI}xk@kFW`$W|n?-^37|`AsRTufw9_R%2oVU;HaVE=@Zl z>WMivD=_C1HvOe+e|bE_xW75z#}tchPt=*?L(5`7?lL_f zm!YsCU7OUU+C!tA@~euP=L*N7=T)t&j;$2G2=q96aSzyB1XYvp+V?1nGtovs(xb?a zJ`uFuQrJC1xDZ@$Z2BKN6lXq`IOWn=6;@;0jft$oJjn&?7OmvqnvX$^oo?Z69O$N* zw2QoTJ*PVvv`q+&n}jH`8iR?}&xf#+4`zn_9430~gPmACGs+NDJ^02Z_4jx~Ar$eC z`Z1beq`#20=Zkr!uc$6WOMMTJltUcZx+lV;6wfq@;@7ry@9B0QI zEz@)^j0l(z>Wp@Yx+4|5nyL`5{)kPxj=>2KF9_X+=dGK+eDwQ>&5QM$S;L#N>GolJ z8=9%u6p;#OOy?Fq**@GRaNW79RV*my5#-1s3!TFkY!l4l=rr^hWLh>Ecen$JaH#uC zv6^iz-wKRY4_yyMP+7?3n^K*(nL=bAoe#~y&acb6q$lKFfdyZ)qM=;u1z4*3H4m_)5mrY)j!reNKo8F^36iRWk%b8h95O(mUd+}2pUoYdRahdXH{i@sjp z$3B#jF?_9Izcxg$+8WmxdAO?N<)K%odz4!nRt|QC^?POpHXyPv)>s*FNqydOcZjPl z>p_)WKVN42h(<0mE0m#gbN(i3xaP>d+PtWV0@YevhrA8f7f}L3l~JB?m=FDmg#8%nx-Ee zfxg$1T}0PIR3y!&&kTAON9hVk zc?DIcdBFf^<8SN|dB`S1-qDUn%5|73p^vV?VZ3Q<($drxXe10NAY&l1m=LQ}y&@p4 zHw0_}5o#|K6uDx&ka8>2!Mj^fUZqjjaXvj2k%!gUYi9UUmr<*Nz5REx(pZv8|859V z*e;mFsaese@lRbO_zAxRA1r@#l;#tX4jS`6%uM@Z0|pq}VR?hDgixubPlmq{|E7vL zHSBZ0BR#P88#){=7y9(t8x@^r&P)uDlO-#J-7&vl^WE3}t{?rQM0)zI37D75-Mr-1 z)%Ic`(+#>Vv`?nAP-t?=2rbFBl`yeC!S8q2mW7_`vk24eaM1ONs`KQFWV?;r@7~Q` z!OF7EGE|0bMN{VG)t@v1Nh+{PSRHI`5OD(*b*uiu+`rfQeE2ODo~LZyW@}2NHzZ1H zaGjLIPqm$trC+(@HlN)v9-E%i;W0umqBBm>457&6Q25EnD&fn5!$A1hLP2~#)8zxv zt~8(p2?XQsE^iCeSjiuKs0Mw zdt}P?@^Iu>){76drYwi;l*@=6m5hO{oUU#S2+0rmJ02Zg*v>aS2E2iKirLr9KxY_;L?b`aTI5v(7SX5RuxuS0(yUR95BqDmgdfD%D7 zB~wi82&bo3O2m#t{|`a`hZ*Q|^IUhNZ2swU5<6k*ulC&ar zotBuZPRyZiIljGBx0dIu1-5R}bsC6J1iHww58)SqEz)0u%Mc>f)>k9kO;H=`vdnE% zoZ&Tc8Tn1}r?6jhLDp4Y;!yB5N6moEw0ypHkH5ShX7$`};!A-4BTW1cD-zQ4T;Qbs z(;=?x+Kj%blFRy#;+%BSFOYxrrZ8$R26xcTufUP@cdm=gE53E;3=vsdAhMJ9mR2*% zo4T=vGzZOe<;c~Ck1z1|gEHbf{ScJM1myz`6^XUB2bggz6GT7cT`dF{D}RHeGP9=U zd~YgJ#%j(zVTPbaoJvYvFs&7u8^UJQ!T-b(2aZbYMDff`;K!FsQ~nY_41iL_2y+lm zL2!}W10SW9@{IANwL3#POZ`t7bK)IHkm5OnBbKJz7o@hfva@lH-LK=XXiDGQs#+&R z!2A|n{0dGGFAlWLICg5g#H22)pO;IWEp;p7*xzR3Ua|ke^&%MvrrH=;Xp~oUOY;P1 z1Jfkmu73{xQhVO4iL z#t_woN!E*bR`goy5Xiq*pAmDxbMj$Lmx}(etN82Wcwr;!+}BS!7fpq!{72!KiZWTV zMgO8j$Gfy$TfrGRS~!z`2Itw2TXNMTu(@{gz{A>0s%FPDm0(3={6t~c*G0Y*e ztJxXH4s%Qc+8%owo2yDgs_ctLx}{g9q3fx954|BYwPOx&v1NWmv#a>E0*UQPJX!L@ zNq5SUljTH@*u@hIzeF}wb&Y@4J>>2f+z(@gs|_MZyjMx5$m|d{No9U4b(7%jpe(Ho zLKZqiTZ(k)K4E*RU+wXgI_PC!$;l~2Ni{cxpF>Hn90vnsvuRa z*vWU}FWFGX8cnjT1a7jHBBy-}+lc;JwcexC=y`a|CJyu;##O9@O&fv7* zevJK*cgvOe%P&8#U~1MA3$~tMTE|}o-})&yX*R6G2iZQCZO##{}&gB8U0DZ1JMhP_$n_Md)<6Iq$v=;p#IF7i`m)b83He`LY&f*VrEbla_U%K_Rlr_^HLXfSXxn6QM=8~ zu1@sxyIDD}kqKl)kz81fTUC5EC(|wRp0d)iB5%vU=o_iWF35{>^cWu{6@|&1gNky_U zKFP9!;aQ(>;D4Rwf5PLp>fx*_#_n;VuAM~!C3q~MAA$5EOZx58o{=N3h1YwFN)s^V zOd}Mqw63BvIkcg1WDVUkC@%PqQ(Cy!fz-5 z3d@4FVKeye19>=)npfSdJhGKSD$cco*GHgZ$(bLn)Gxo0Fhj4AJNn10>J zVgDzurpsiqat=;!4=zq_o*yJbEIxl?F(pD6`;W|2gi{3my}4t8gSz`)77ow<4aV9G zG@JI*o&`J)HBvuy5RrMP2EmEwCGXQYmus|(?aI;XZ^mWn#NqkdcN!6)J2Sm5AN4dT9qKD=~_EcnW##PoV2X8l5RLKWQwxK zyKwh@=QghH7b?Pyom6nHO+X|i#h4~ns7x4823`}Fn8%lPhv3wJ8ob4ML|34t{<}YV z9Neonvd5MS2dkE=VyJ!6w&MqD;6X4oG^E-A7W$_2jsWuwlJtRqb^<3s5&i=Je13w0 z0#W_@&)I*5Qna1_;sP&w^@Fa93sFl=Un`=bkmeP~P*eeV6o+KF1v|pY_Rv+9&6hN8eP=DPUTAZ_Y;}^ED%WQ-0KH6`>iWMqw`)#&{GaZ zl{>oy@G!R`VS_V2PMKd}LK%$9$Sf3`Lfl&+T-#_#Ip|GKz$rmS%%)4Z>|h{W4O)t; z^$l3Ed=g*=PBaP}Q*s4>`E+uSgl9!E)WafK6v7I$myej^R@0_^(_<$8((UQ`&><0X zVt|viK|=8RF^t+t#tl$uiEyv)vu37;7Y3QCE3NmteP>R}S=pDD5% z`uK-n2%Ep|p#NX-2mXJ@Uzg7YHvT0gTaRzg=W8w5p(#Q= zM`3K6(X?#fEn|6EYN2JtHC}26uLjd8zXp z|Cd&?bg9QmTQrYparfanm4Rx9x9OA1ofEj;!03^NFSwAYB)>7UmTJfk1f7Q>nVfAA zU!v#xVF4lCXSaQhzm9n7tEbcS7fr*u?-wpTy=@oUX#WzBOv9GZVYL6$!DH;iWPbH{@85$NYS`oRLue=i&6P* zU(U$s>Adc`EgatmuFHo#v4XbnpU@lgU%6nNKZxQM#GNVE^k z58{0UNns$-beINyKxX?;j{YBXeFan;UAAuH?jAI_1}C_?yM^HH?ry=|-AQnFcXtRb z!6kTb$ZO!Axijy+SF6#6Ue#5n&e{93qVo75D>NA*&7)2Zao&ff{$o`A*ExeQ5Mw4G z)Y!(>CQcU*GY(|eJ_9yIOu&w)>+~ISd!IJCGu}_z^k8<`&tp`SLG^$eRcwX+hqS_x z)Z4-CzL0&+`)?L&_2!vd6w*;16n z_4D05+06ad=0;7%FS9Ge6t+Q$BK&sJQ-wUKu%1*F&{aRQ!%K0Kd4d(CixP}PYc3IO zc_~c0JqWlo=>BH>at!-P*6k~7E%8A5C87K~wkFcH8qRJM7k^bJ_fnN|-`c(=(S}^s zQK4Jm&-QisYzDvDmKYHa_7LFQp5zH3_EB6iSNVq-WDMTFi|5@t*y}Lh5R*-QG(pbo zG@Exe%a1P1Ao#C=*kD7v2qcGw!%9G2S&dgPG9-OPW%l<=NpJrFEK{p~cqO57T0xwP zkUSE?j2(t`8o^eHA4fpcCm8Jz>3Vco-+o21bmQ}Y7et}rLdrfmc3F{M5eL-{lc@Nm zo{8q=$ken#0pO-uzM@$o*r__roXDFOiJB{ZU;`K0B)UU9S^A@f^_}NKMb(jE5`_sE zMRUrQTNlu!2*}n8#_3awV-5PMSOW3NZK@KMaVUktyHD`rB5l4Yip3DLP$={vGumBg zUr30kf)opjaQMyNTcEf+oTP0U-Os?Y#`*Qsy}ZfhNM~+l4DcV62JrHmMrUD0S|?1> zbWKVZww7xp8Q@_+ip4B@87qTUaWV3iR2BIwT|~e9d^%hMj__kh?T3QnT2Uj*|?^@ zuY-fpaCpqTBN2UQQa($4E5Xh>-+kTEe0Zymc?}oue$S%<0ARqG8WP}JAM;oM=J!9; z&D%6%vSV)UyIH~*P|`14QKCGKm8iV`lC`NbT}Z7$({c;1H}RGWcF3<3MAwgrgB*!`&lsQoKP4UUv#IXe_Bj-1`D^m*mSB^Y*Q8 z4u!F@L@P*qiTs~7`_C6ik1Pa~SJ)%-Dp{pRugXf4g?-Em%;QfQK5u zP=34qGg;jui9cy58Fd7`G}F#4?M_q}H4${>WK#=`HFvlmmaZ0;*&Msvrv=<(muBVA zuWCL(5#)-+$6_5#{(ImFsl+mb&nW5(s=>o<%Wilwkq{uzRbj_sWlKtVU(da=3bgz>6`)N`BIKiHD{9W+EpT z{O$3%srKNP{Y6SfkZQd;#QG=pKUsbBYX@}fFd$)6@PHh{JNm(FVpmyI%E`-c=YIsL@4Y4IP&>Be$9Trkz=!mRpu%4XAgiHEP(e`TG2|hE z*Cwk36mpt{5ESrE!e2OT2vI-kFAa>hIs!KTqEd7N7$7zQfUbi|j^voi+GvO|Ba49Z z+>)Q^H#Gp_&0yU=W-iw86%UdH5jpyapbA(T4W%hwz?^^SmaqFWyFX(F10pI$R*b+l z653`STOy|<*~konYlK>aIrDODb9`m8 zsOj^h2Xk@OAh%gun}@Mn!4r4RSuCKEFeC&Z54GF?08D|>)sdry*-AB@uul7Y0tccv zAOK%bmS3S83EhI@3tUCbV(I!OC^tvKiGP$>bwiS0EKsz@HeEZk@`cZ}L8bxxs357A z#;SoogEP2gTS~`}vWG49GgCI80<=8BC-)rHcN%tZePN7YY2?(<=L=X2>&{zLdB}tY zU_q_@L+#yrg8epAz_}%8)ISu_T1Rcb8wyLCWeqF%thnC?G8z`IQZGx!1b*jfyAkQ< z{6q$7h|1DmM0&vB7)Is1lF{VKNmnYpp-~3T=HR;fgStTdtD+)@(#QGsLbmE5^J?`4 zRFP$|y`e+S42%`fgfcv+ErMRxHh00*ctdl`786p-6u5&cV;nZ7^dz(3`|FU;8?=_* zI;IoMd;S;}3*ATz-?~xIwTDI_2G}0V&sP$sV{^mI&}(bNlh~~U$^)ueYotPGm#UhA zvJG*vzx3rSr6`}&DUnx%;1aOgJXT%Acda*panM{Ld)>4!V9@Oa)Rb{1K)M3_M$}k1 zq8~>1kG&n$$i$e$D(AU(ak3ghO)PioFfhLy2uShRd2uTdoJWLbIZ1^c3lKc_=eM!u z&!3APS)WDGHr31L^epTZt+jg7{cJd^;vPK>RkHA0m*~nmftIP&EX(RJ^sJ;8OX?Rw z`~?D{JYa?@e9Y3`f*q?TEBuo|aFyJ6H9(?KV~h9G9J7nrhTJOVQGx8YS!>Qwa{KJc z0{vkPRYvMHmQ=EyRZ7#GpJre43HIda8Xk$b-HhM~0sYhaHDwfBabe>3`pP1*VxdAo zd7*)6NOT|YD+57@AV_3>QbNTg6ZB}{N#RcixFW@SrES4{lI!Lnan?_Ao#p(KgB<-; zC;W-CN@D<>uO^ITI7d}5oIknAWtvzNKTci)!;l7O$pWEUDG#M=8OxbZE`;hZK~k@gy6({?ZjjK6^wzbP$fr+ntN-z-1uF6&`8)fK^&FE zSQ;fUnEIQ3GM+MrlHL!VZsO8q)V#vxx)Txm1(9mHE&-Zv0<{Et*Y#=y2JRVIwtex< zCI&?~CIH+J$aWLsh@;6MFFWstLfzSO!Xm zg1ds(+I6$-$>#>}P*xxmvagRhR3l7z@m<(dFn2`Zo9CmOcV~G6nD%HXxk@b}srU{e z-YI0OSp;qvZ8uu{u%RI17#)dYfM2MaB{}-=Hf+FvVS&vv5@P)AARGf~5xfn=eMw)_ zxY6~`oJoe~!<|u4X`0?J4xS9$ahXqW#AdzLxz=2=Q3o;w8H=*E>B#kia~;4VnM=$s zd7^zKFbq#8z1T5}I`X|19;O0MNyI2odAkTwPP(YC;j<)xbt+4{TkP_n)1Oe*NH_OO zE>UYY{??6B*2WKeM~;krd4=O&L&?~a`hH=)NUBOSYsEx$mBrjcGEp*Pv)nWs_Vx8g zq(e=t@QOaAcC9zxYM3jI@5OY*t_TH;vruR33!ACsBQ37(u8r;vK4=*{qu~0MfLxSo9j_4#ZmZ>>7GZik?pQT{$JMjZlupk)6zT6^}f!O#Gm>l3IbRbNg~* zm4H`+trv(QIupyk2Z~E0UJqh31(H@nH0iP7N`_PqI-XaTWBP42cS06gPCU=4#``mV zl(v~H%~z_tRZ{9t)Ud>=T+*N&unI69X}-Ij6+$=%8|^S|auRN$4Q6xUqhpL!17ax* zdOc?BDW)eKzl4V)gxW@pdQ|4&Rm&Hn@`V1#Dw%3XfxYdq3yrd)(5}2u%+J;{w*=Zy zB%@WJB;kdJ#(~H!LmV=_CD}8Kx zSRVB3?<#)j9la>EN2AFO6Mgin&Dh=XtO&~K$U$2`*#2aO=m~H=b8Qb^cb^X5>&HaR z31Y$D>VcPrp3oeoKm-s;)yA0JAPM#Nq#yUh*Lf%nCB>%B-b)V?9QN!aJFj&Bt4ODa^_$r7Acs{#8I`e1yZ)n{E~R1}B>@OGQlwhW z+k$pKN%8C!s+XqY;ev6rS z6&qJTkL})}{>%RQ@>v*WU=1+kg2K0g-(8{;pKfR8N-*)1{1&!ZwYOHYZ+AXETcJF0 zV%!=hHX!zc%ei=%o%fH)7xA$MB+f&|KR8U2YQOewt(ypsAv6iUp4OICDSMHXeprPK zVW{Q*tp9m%U@!AHAOSq~Kqj7h&GWZvf%trb-H$a&w~*ur#qtkjqcy@`U^NVuKc zOAxk~bw8$9K~hK3Eh+q>yw4XIvS$+H-Me;UIe27|;=c#V5{h~Bn0 zt8l=h(k!Z1PcHH*F2ZUGgy#B_`bQ9agyq>2oUu8hg(Br)Fgf^yf+vV&7q4Y-_?P2N zWwLHbrTlV*Z4-U5B#W0?1UnN+%?>){O}CD{{WWd!Zi~moArmijxK5$9Fz4uly}OCi z6VEBEE5T@!duw5TJI{3)f-@pS#wvH4=dJ582;dF?I6klvoTOv>6*zm01Z5G;{qmUX z;sT(gLLX2mJmUpL(o8bHwQm3Tk!I<{=#04S5npxjspDxD?BW+bZ=DayHOfO6Q6te2 zvP0_FnDibYF0Psyu7}5$FCO1=Ku$0KClG+AY`phw8Ia?7D?1N3{lrJW@%Ec0sW?Mp zOx;Ezy`A-TWI^Z)pD-|BKgr|)K!*(yL>XV(xg2_yi{1d2+xia174+w@j7O`g9Le~R zEv5M3u1cjYOkQJ`(($-8oAAuswjFop#qz?%U@VZNFE&g-R9O%+8GUAmC>+lfG*(!3 zNl65uMbu0(oG%Sa&i(jhToYo_?Qp+jaw2<9iFXoTc-z`ScMcKlly|6!;wov9aG2Q4 zePBlxYhsRz@uL!YLbpz`-7zUElKG8v1htnj?B8i_=uQ%7a$eYQ7S!47FV-?&j9g$; zTYk#1IQ4v@U-1lbdvSv1`8D=nIr1zjaHnCiS~VF7~e*> z;R1=Pg{k9d5~%A%;r=Z|JX&EsJ7PKD76c@f{9v6Q`FS`9GFs3jO)pu#c#=**)Ay!w zAQeg8(m(Tl*7a@ez{}#^WYgnD)yr?!zdxr|?U_&Z4rpV+NCnEmiZawZ zbIA+z6vHb#c$s3V{e9DIAq&YFGC~S4sDS;Y2(Z7D4$X*t5n%>I!YKDQr(Gy{@U8LzFnOZ?Ub5aWgweiSmwaN&mGBz@w)MQiq0RQSFd z7It77;Bdev`{DaQ_(#ZL)dOx3fZgoWeVF>mv^JeTel$Xtv{C3&5(B&J-DV~YrWls`}>4i<= ze`!$<+ItPl*n!Mq1k_riPIv|U>zM|_#N<)_X&)70Rf5@AuqG_%^MGF@^m|yRlxGYQ@eX367gP1Gy zq}js+?zJ5(=nrPNtr=VRIBnhrLLDBDN0|v5_428O>DkW=EKF>StYDa=gus8c1)m9T zhJcMUYv5^uNAeRVR{GAu8DM5+WMyDsa<(~Sj@z3nr~ZlC<_VEf5cOk{_-?ugSm6xN z^YLc-D2tZXB=|=I^iOfYl=dH5lE%R=8}KBz>RrK6jh%!j!SB8gOWJj5!^~;(rXo_H z&4Y=L3=>yn!PVHEW%L`$Xc&%7!bY6l7lw=>8tXQV+_bAd1b&T!8L1K}B;>K;0~fgE z6&{6);o<25KfVQ8za^~T*_5-{c189%3^R6 zDxhKTDYlQcF_AJFy%aB)ky0c>lE7)v<4mQEG9;3SD0Cny&=V7qNAS-aW^d1|dH-@f zW|cbpa&xQWt-L;HW^>Q_c?8O&jzIWp%&YOKBb*U!6*Jd8e`&|`2|+Z(dB>BW327W# zk;*MkX^}Q+X++t>nBv;!o4G5&hsv(i7z}+a@!1nDwBK6=(BM_hF56s))04Xw5Q1+* z2m|Pn%Ksnkkmn>8IhyBUj(M{Ee1@j7eD5dCUs;W>g3h(Wza?GaLk^H1{WDO41m_}5 zO>ZKYCJ?N`pyV_^oY#Hi76r%M7TVsv8HNY9A?Wq~rV~?{UTk=bVVz$?!h3pfLTc0s zqk%A5gPf#B|2IOfJi=PlR2Whe*sv$HPQA!WXX86A8(hFQ?-w>LJw>@LMc|Cg@Ny}q z@hSRIfx{tkgNJzLiWekG88XreJ+AR2=X-##%B3DO7Vjj z2E|bLNgOp*5aN}vw>*~_kK43$BNY*PvoJ|x|B$X=P$`-FP@X!mDrjR>RZG!LmOKsy z^kbosV$eNzT-Muo(xAT^O5Pbct0gbKL9jf~((+G#pXlRABVUr{En9uVuN3)^YP^O} zmZ^*WLpel}d03LYYzg3p)|P0Y#O8(gFPGQamLre}JG74e>~mCIShM2|>kC^53wvRN z-pi`_D!a=69B~n$rW$ky`rk|vkTyY0FS!j?CYk^??{>YzcM%kfh(V+ul&B7?*q`FO zTX7q%h|Uz1U@hdXntzG~I0Y$xK3kVURz64X^{E#6E|Wv1Pku$?;5l;hrz4D^Tt%4r z(ME;Ii(JZ7q6u}Qx({3Z8}gI{)(ukvbdEmORdU5!c;D5Xx2o@w0}i=MfXV3 znoQ0##T|&JJbpmm+^v*8XO)!$_Ru>P%18{LZ>|ba9vO{Vk)67|Sw;Wgo7~|e-CU_M zCPTGt1+HI&cWxUTh4e*0(6F5d;|!wl!(dRa7xJ?iQ`s%>aq`^sh}x*I#W2Qy&JDZh zF2#95HIuMIZK8*a5&L@wHukWwpkse15pUAz;(0rE@zJizRdtMWkz-+$JXLmy@8D?I zy@C6$39d(~vA|!Q7kYAc`l*6*4a3`Sm=ryP<)4n_ev7xq2A4jXT^5No8ts;i2knO0 zH+BS$@gy~pMQ02S*_=M*5H;JFs`=`DVXWOjAUG2R;SBGf7n7GP1YdYI~a(rxjRwSJ6zv$yMf_JdqyC|vOmBlEE)9<{*W|LGsx|_B~uzmtZ z3m@<8a69~54IXVp>_^%Z%tf>y!~i*}d3=V(*d&Mt%xtt^`e;>X{UJTexEk?~mG0_8 z0nD9AliPTyM7t2{?wJKm*7NVKQW{zqS8@NxRD$VnhsEB0)KmOi|1NFQx!a9{O2%!* z4H{eK!9at01EG_U)M^p~q`}Y8@q?Lz)7u3X*B6%;zqgAA&!Rii7TLQqx@68N;wUa% zKFh+GC>1q0u<6K8SMGSn5*QdvIuNckgA zPee*=l89DRwns!OWype*##leL5Ha^3_tzUOBWsWNZyxNA$AsKW3|5^`QbHqW8+Cn= zCT*rSo~w-O-bv7U*m#GVx!-racfB7|4{fqVIRT&S@FTyUseik;q3iyirpEe8t?z$$UPLC6Rq2C(m2&s# zh?67JEEAuxIg-2^L)4+xPf;|?^<@i?qDGSb?KQMB{aARJRKByHp-UTieEnAt(JLT( z7S;bzBAO4&}krZl=0w`0F; z)b={<3xC1>;O0_s$W)Z8JkZcjJ*uy$E?qdv>RkU(iIg_>C|Dks4$#PgVFx{+-)F_&Ap6!o(^4n=9b-6Qg#W)qHr)xO z?Cnm@3Ls`ukvh{JHw`Eu^u*cNbEw(Q*I$KwUmJyxV$7P+^k!6*FELbRmHh2}RM$5N zZ69zU^x&=NU-jE8gVMh~rm>2+cED9}9VJjWeh8iVt%kUBlWl~nnX^3o!r^Sa@ASP& z;MHg~eTgJE*!5~Md|wk9w%t!c#Zyk1W5qA)l3j4dQYrw%Cvzs*pJFJbXP*y>$FpM{ z4SfOss#hAR`g;0FfPw(S26d}#?RueAiBCJ9E|lvWR}=NrKyW#El|7-2wym`N4U5DL z7DL5pV@GxX-{n;kP30#FAc45gPt#BZNl}hyw*M>(X_IMa@%5gm#H(Tu>qYgU@u0=O zyYz1M9R+dt2tG3i~moPoLlXmdyFqje?mSZ<>|w zpVKuxUd6FAX5=5@{oWgce|ek#XVufe89RRUW1USXGl`U>jFuXvGI>AWn^39Ou8ka_ z|A8d&*PrI@w~b69qQW0PKrm?QkyyR;*g0uuWdSxH)ysfZuz&C3?j88{yLEG-w{A-7 zzY9|!>Xn`u5$y2Q&62}~d5r4I8OTTPxzVfg`{mj52m_q z7u|x~OFSKlgT(W&p;x>ez1VDp&`sNNjFj2H*>_2XU?lW>@Ra=?n?;FuAawTGzz?6*Bs3a2tZ7-X-&uN; zCunhhdD@n`;<-sI|6wrRl=(L+Z{r5c37PmYbsZ{6kU`wZLB`lnz4yhS)T(!RM}$tR zffMa>!o7&|-i|BnkPhD0oXT)(>(;5APfpplT|&_nOSB4^{hf%9BuklVljz< z@~A;jmhovJM>-#tJCVJl;cGz2n%vjttG<2#aD%{W3uPs25q4*Ay^r6kSR8U(*T@dH z^$p(bu9y}!u+Wemi2s^RftW*hqIlCj`VadNvPSN^p+Vk@ACs5&^`0MfE>$|#FJ&(2 zHtyGJ<3%(-WRAm;`w6^44R77~`Bi4tekyE)2s)WOE7Z{p%MJ9OkMI#b2KzUvR3QGZ z!3}w20SDNx!3_Vx3M#~;+BgU@ulM02Qq3C@3K8F*tA#hFeVg_7-S@=uQi>j@<l0znYo4E$sKR}f#eX>u!qo&Jj^{z6s1!f}%^?#u(ZRHjyVd<3> z(GOK7hvE;aDGf&6pL^Yt$fOjhd&<8ugVDT$Q$Wi+(478eZ%rD-FcwwsghQn*5Gv2Y z_6zV0eCT2)$vcW6=fYesW=l(fz&WgW7_25_diYkPAOm-ZFs(Un#xoer`Bbnx8RQLC zUsk^D@^2$9po++e0US1fBu0CTPTo|y*2$p_mvflc@%2ZvQ&kJKbu&hiY)<<9=NRWYVJjw^06ZQ@k&G&fjLqfapsr&-#P0_>VzQ zHpjN-c4+B5hF4?m;YLG#zhfR{xnTrFXTl=|a*p5+|DzLSgpDVk8YrezOR0P^aY->| z_kauIG*`RuZHTLyJ_^Q*Cm(v#XJc>{B^y69LuhVqe=9ssP`fAc*}P-z%8ze$V6YR! z|J3YZqXT8KnV(#EB4D2({zJC;uDq&tz_BY)Wo|fO|L-M(gZu6If8@1}S1PTH!cDJP z0T?P^Z=RBrq~A?fx8@$ZtDA5MXMwmh1y*&d1nqbb)vL}`gFo#3el_%i?U!?TE?E

%B(P!1;3@XzqXU{_LB)TXZF4iD`l?3CZEtLuvNHIQ2hi|&y5k8&`(n}qnxXZ0S!L03&J1g*ZL~eOVj{& z_o{a=Qng^nx*y{b2)ZC zJ`JL|;3Nhe@P_kl!etFnDkznZ#XHX)3!6;)XHz`z_&r4eR-ItJFA-0?CN-(WLHW6P ztymg4D=5AsNax%DP{|neCjbQajPEQ}o2N1=eRD`uuUPNR<+>2_ZUDCV^!M)X7pFlN zmU{)U#G%rH;FJZ!e+xnd6O4ztQh3Cq%^H4EWk%k#1p64gMynabSVxo)!F*>g?^wmJEyq7WJLe61j9nT{;I^mr2R*c zWO?(fp_d0TRHLjgA_RP!EVQ_dG7DG^M+E#z_^3b8rk$&MF#1h!zA;y$)<}DyMrWNjA5VC!wNZ==VB|S5M@8>>dX~FhdX1bv}y;&C?etHCd z#WS&LVh_@S;!ZcN(oCLtMPyreR-7zS)5rwvs61y76d3?W0PaT;00$oa6&0&e=kpS7 zw!*?l6!{XBRbw^@=izpO>~6a-whJSSihEzi6g{LsLjR+Av*>cl_5Kb5{7?{HuLvAv z+9C8RvQPQIAW5a7oG2sU5{6d(Z#d@%0rl?2R%FH4cEEIEN)8UWKQ?k6B^hXZE+f1B6_H10>=KvR#3{0u+q` zs^DI~dEMsl0d2r91fCUe2|7QWzW)4k@5wuP#r^&WL=FVfSBWLS4fgHN0Xc7D?EO^% z#ycplMg`x0)RM0k5&+IvVPhHds)Mec{jPxAe6)!H#;iLe|0#v`|D zdczT^WgD{5e5VxE*)WfgsPH473!PvZcC|45?^8STZ0h4fyWg5rfe*!WbLRn8j9xCQm_vORFSu+dT4XjRe=! zU9%IDb7x;TZ>`qo+Ls1+?~l~3a%Q3KMsao_Ogv``w5dR7qMjt!9x?^JA1Hjf@zYfv zz9zJ<@^wGbHI1JFkB1FV5$KNv`0h^)$bnS}tH-YOdAT=#+2(a)>|Cf0A-qs4h4n_| z5#_Kz!2X{K9avQV6Up$F3dF@{hzOI?G?UdoLLtGRYIx)Z{`LDmRWT>oL{k*gwo$C7_%Z?oEXztDT2oNWGI zle^*Ps}Up>XA!qfTN{`BZ`vD;B=YRrr$j}FPZ=xT0$@JWcDPhWM;g4AXqA&H(HmJj zM%{HhBYTS{PKzAH8Wdx5R(->v*IdmVCxSh2pM_|y1Vn|2!h_;I;S3W)c}GJU7k%6S zx>Fq^XA&^y`=$07i=G`%d)FJ*yo#NWWG&nWALa*74rXw_GWt(T!%*lmRAC;5TovDy zz_-(6Wm+wCxXe(i;OorgbFnZIuHsrBa(~Za_&c!q5bK8BrVa<1jB?Dc|G{jb?&hQ1 zB91brlCy6f;XsM=r#=%`32{$Uz(eXJg$8qujkOUq)xpW*KAp@#)>cNVM;y> zlKwxlM=JdZU!-srp5ZlL#kH&7^Vw3_fQ|@{=rtaQn^y(9Of;7R31Rc4?v~?$;`z*T zkNKpcNuqm#J^kOnKR0}doR5dm4g~hF-r&pVLa{hsh4GW@jW+jzBWLGBuDLEbH1IX7 z4sn(HBA#?FvZ0#7EO~G!>msAF1k`bips}XOp<@|vjp`T;G9wVFW4_|&Rj0Hf9peo@ zW0iz6>F^zWvRzlOn0h0x;Qxz2@K~S$dA2><{mxgRye$Q_h>T%@IU-ybH4_{Jg6#j+ zir$@8e2bleA59G;>sSze=7>muJ!mjC?n4(77GWscm3dSMh6jHger9j!Bd>ni-a5{& z-ob^LPm=C^SJ?Gy*Hab`mo~X>%-|6)EDk5t0%K@e6k>SnCE8n6^pnr8#5=aQidhSHk$7zqDuAz`8*GJ8lhX{OQ4WCt?;lzKK}XmjBtciCOxC?5 zSqgI5brI|!KZ4s5*5-8rkRH8uN1&brU<>OAH5S_kM_5YLix}ZYevh*vpUd0F=4`nS z1Jk*3YMG!!^ori)bT<8SFF>+zj;LW;K*jQGV{l*K+_81*r8&}-ptIJC)4S_v);MUk zPaCsmB2ps{54NG_#2$o{R!`1j&by|@zfDZ6u&XUwz17aPbhms z202cD76XEBs;9Y9<_RRrN^Nqzb#-^9ud0S-2Ap>9C)D3mG8*HsF!%nu>}>6)wNR4o z;*a0^C_D6O(L*B$A$(DlGtKcn_;OT^GXt7qB*EZp*te!Am;>Ozf^mpo&?Y!sn6N?Q zH3kK6Dh6!xxjEdYb8m0lp7~0b4$J0hiEz{vsU#q|sM1dL zTP*t$;m~wk{&Wzs7)+^whh+u&^noCZX_{%)+<6M2al z4fx}RiW*T^1D-)>z0O+O5DrP}=C#oV_YzmKx8lthgjUXFM8PD}4G~}vh-C8(X;F}V zNv~IBgm{k#DXO0azVK_n+`s*j6dVEn_Kc{xR8w(92iV9@y($UF)c`q)g$o6{Q-`dT zkO2c(b?LQOYe3lIUT&3S2O!!~v8R`tl%$o{efL2VIs*{~C) zn=rt(fTqCd9RLT~Vh!KVKipmD2Ap>yZ0BEbx*Gu0D;0P+{owmgT;8iI6xav6^>Zgc zB+#9p<>zN#Ea2P`R1arFJgl(nOAtz?_^O49sr~SZ+93n!ANPRiK47F>N64gB^%DN4 z=A?U;KqlJcuH;~1s@(*&j~H^mms-@X=W^y(q+DyT@@SK9uv+=&@m4zl0IxspAp&R< z-hK{{2LP~(orkKe6Pa|0LX#UMk%jf&`d7^8bNngdVnT`ImF)g zTsI0Z*!RBdze1fxfxOx6-QN{00swy|CGaKa08=;TO5@TZiJ*1!55_T7oH-rFeCQ3a z??zL=T>}Sg(%a$Md8^{iJ?ly3<4hxzC8+;u&n>kALpwa@nCe_oJtAQ?Fty{fm0$}c zy`qn7f`;{5G8I0Q)9OnDguHz0Fn6 z+)P<{C13&on(lWx%bKN9R;s|#6giIc^?9OynSMxNUJp9}0JK2GkV?3BLtDG-=HX`X z$Fab@{>cnfIc1r%Mg=_hclnZ>Id7P6cU1q3D5cb0SG_Scc7?J%;DFj^N~2+WWVcom z;sf4~>Bqczy=M8e>704*YaQ;p$ME4R08rqa@`+qYy02$uW(Jie7|VB?J!)H?Jjk3G zx>qBC4R!m<_F?-HT8a#B5+ucRW5c4)lvF{7Uc`gLx&!ua%fc`LJ2nHm6b4EzIFUL7 zHd&y}KUc#rbB1bp)ru91uyCDLHm&`s&vX0lZ>4W<4EU*`Tp95Fy{Om41_hiO6S#(0 z`a{3&SY;kko#cBl-}NQ*)%(K#+EKi3Q|mx85^&?De-X}Mzw0qE25yi5*Jy(2u`yB! zQtKx~X)PXVd{i*`o-OeKok6z-UDlK>3L@ zB86r@%s!z@$l~ol$BS)BhN28b&p!a~)?`YeMU;UF9;*nF7QjGV z&W3_wXMf_c*LtJ-HT8&GmMwpyBM2)*9-Cm^3+O(joE81cr$>Dmt9q?O>qT$qYqv7z zQ12*HzMN8j+%(viY9X^>m44`~wy6U-7<47U3}|meGl?VZ?X|Av^5-gdxqkGV?_7Km zFaJhwiB+aMLTlK@FpWR6W^rQw;AHegI=S43MTb3)&g=>A=^BmhLHTEpo{@+0L`Qml zFfRG%;xzp+!EBlz%zGR0UpkXdK>TQ9H^1s7hi=@W?P6gND&+~3k}q5l0{{p@S5f&x zUwk%@`K`GH!uN~>6aLlj#`1pBU&sBwwl26Huf=d1$Cje!mThbx!Z297GInw?{Wee+eBnDNE^Hj zrKjV7Jn@Ykdvb~rX$NDM4V7$oYP$`Gl&%;vojC`2!WwfMWOS#xcb9w>Rvs_j7T@W3 zba$|V%n!5rh=;P+k862J>NYvDzXKB(Yg=&8S?hPL9#Rt~|MXjWtF?S*n<$BNFyC%l zZpvZ%R7$ob7I#e|aUTorP0GO+*G4GO9c`%e5~Nt!-|*zwv(dP1$prCHwsNz9$Y~HeCK}uNL}5j7MtpeDcQd0I+bsrI zVHLrWmmG{zgH4a(N?odseN;M&0t>L&mKB*eytd}Q{#6EN^a~?f1d|m&%N>B7eiz= zVLioMY0_ayTwuf&^ulXS3oyfqnYOX5^bscHUYm&m8s4vG^J7`6IJ$2y8nG->Xr#1W zv;%7M4;F1+ZxDeN2BpA!R?T+C+H##TwtpmF5e=8Y7_VuI#iIy%49GaIF9A&o8`=Hq z92^L6<<1buS26~UNM)pYoX`UyVlE`T?gh)t1C1Z&X7B{3yiio@38So z?mW2C;Wa3dY9wgqH1=WEe?n>by7^l)TH9+rdKDxfIB9F`^8gg$CSQxfb z3?c7J3DGD2k2ZG37UrfHEeut57qU|4;?+YilAa!f?HL# zO=0q4!Rr%$T~rihns5A@VN&4mzlNt;Q4a&}PEXS(syDSMW4a=DZ3@Q-=uF=1>qzf> z7hAF7&c#68K9gC?wX;!g_sG^(h<~;rBeh=JizIPip)+dJu9m7jjRM5w3*n-g5*7^uFgCzt!NB?q2Z_ zKM-d@c&v%uE8ISpnVtOO{t{3^h8{{^y`BifH8klUCv>n7~lR>Nw zjE2)-DjnyI!p*_DLaG`4+qY@MN!rD^AC)N|SYSk>TCOqqaT$@z{v*NyOmU~iS|}sWYgNweh}W*e(FOtc_}9K ztBI%`F@8NaaEqw$9(w3wF=0V4M*8&eE#RMT3l)h5>#?LHnECxE6FipCg(s?8uRsEF zusb{=p+J^KSeE}YQ~TmPu7dLs$p!*=Uyh~A(~hT+H_So$9ADiK9Pg;#Cmu)c%y*<*J=Cziu|km+}+ z3Uqh3!|!!cO09BRws0;;lamGxh7-*wV5>tzbbur{F0JWL)X_j9=q>**@wJHp5+B>w z9ygC#10=LprJ0_j64|x%VKZQaFnSfcQl;Y^czLY#n00qawPU?@?w-5KUq$|sfbMVVH*UgDgkSIJ>VEYnuXi;5eo9!q z&3E&;yFA<48?wJ-GOrw#T$2ZJS9+H#*v~Byk^pI|uI>B;Gk!UJ-s%8J|9fZ=S zAVdh^Cqjk>2lW&0|MYw~G$ILYuhMD%asI*7i0ECm5&xP?4aBtGG#jruxjZWhC#Isn z{9RzO?wjg$aW_HHXjkyf`chAsVU*_$y8c6?JO%Xv@?e-}OrmQ(ZjOa);@)B zeYfS>9FN>k2I`+=s1IXKl5=P)5$RJmdQ8h4QQJ*6ty~p;DZ}o!B_7TjU~=4lP6nhA z{wkjuj(-IO#gN26*AIKm73Tc#AthV|7Oh;J<*5>){4NLz874xgSveu$8iuNaoUkDUsqEBRu4>wKLYLKMN8-$Q1_(x=wVS)1j3H ziCX12fLRd&I5LpDJ~T<;kAxntFi)fhpE(H@yrk43VI_r-g+q@LA*FW6h5Kb}N|Ey{ z4Yiq>6nOyN73V8dW^X8qmFh|xf1m}3lU+k*F%_Kg%ae-c1q+U_js(MOA@7=F2KjvLk>>t!;?(X`#XkxH2};WO`_SdHh*RBaR~WznRNf2}&( zgJ8wg(T^~oKMD&Am-{!QVZAH_b$0uxnYk48uI<{+8L!Qu9I8z*AI46_y0X%JUd()7 zh~9yt9($|bxQuVA@_$K5Z-qeHVLeC*e=|2{PPHUXHIE=Jnkw{fN6q~8`8!SbSY^Hw zVm5GBI{YR5_u|QMKCjm=?v08D&`j+;<$mz(=zUWvu*ijjDFdRDAPDgTYV1$Z4Yz9% z)XbVIgS1G&Mr(!4FjHD~Nq79M=F2tO#uD@t8BQxcGHx8FkJULzadf2BxIhZ0=Ks+3 zj^UYhTh?}L+qPY?ZQHhO+qP|1#kTEKtg2M(q>}HhdiL(_-Cw`!&T-^V{v^4swdR_0 zjB{|A9ibYk3icBfdi1<`$NpXj2m3#IqqhYIC&!&Vb+1tHc{010vvc&kMEiR0&-c0^$5 z7Y4H(zlTTVunsG}>aqKloin zWg`j4sb(V*b!pG~W49f%-tA}lPjFVN1iqS$4-ay zLNkhhV;MVID$=YB941`fn5wn zu(TK#6b7w`llzN#%?!?$8pJtOH(a%(`w!&qI{`vnb6HXpxpBp$DG_2$={czQo7Z@p zhWX8D5?1ku=csTgP21x2_WY3AI(LE2pz<0Wm$i9rE@EVYM2N6xDqST}R1rF-KM@T8 zE>vleg=#qgU5)!!8WtLihqU4kZCY=vP-yjaJ_H5=e=sBzvF zGj#8NI|%-fabzVpAYc41IUGbL&yvGg3-1TWYN$$B4%Rt+y@!AiExXdJ%7C(!MA{1u zm@igB!Xg-sSV}yAkG9F`-NL-Ju>{6uW4FJdxjOtvg)Uly6r-(BAXS`>fg(im`bQT;lZ`>1guI&3>pZTNnyBW z6^M_w$JEX%qsK1(+VZ1jx1Q-?#=S0x$m9E{WePFn*5>(Pe(oc&bSx(rS(KzuDi}_= z^i2v@4O{deR!cC7a7R=0aB}fv6->3bT1{4Fqtc**l@vzuQ?*F69R!s&_MD+FhB!Nc zlkjTFc|Jys)dAdMxK@z=PHnJFkB)&b6j`KHZW5u!+p5jL^DhEs*Y`zNMtNpC|qnBOgJCc z=rQ#6V_-aod+5=*PjoOcgh9MP#DX6E`d_+(SA%&_TD4GlrBKjiESZ{3xUQKUQ#chmRqR7yrWeXh5O$o7f)0;NAE`AmjCEtm zuY`>p&huONV%i8x@|9xgE{Tyzh>@wEXre3)vsE%oHRq!4s-MeUsYTM;M1|8^G)FXH zMrcIDR+6fEzLUh1!%9d+*0yF$XKlOGrx@n|?=MVpT2_rM@i}Owv{NG3WOE)C!?S|m zTkIH@=zrLC{jSgRpHm9hi?H3KpV37Ld+tc9;T#U8#n4p_g&d%{&?C6vL@G`#XG-Ek z(CRM#NZv5Sl#!tsA9nF??aJ2~tdV*3)pDReZSf0cC~J?`#+w#t>e{GcXSf>q_2HR) z-PA2w;Bhd=|7~639>*gw=2TCgwVZA$1S~-}9zqL;PqoUqgqf*!eXx{$1p@I7DgmS0 zGS)F4BQ6LyK1hgCoJn&*4q~q4T%}ZiOKUm^Sh)~ht0*3;0xvqplWSsId2`WygfATM z9KnGki^J(ZgsbSz;K)+MXa(m!&SN=`rCt%z8@f+!v=7%uhD5=nj%3FqjP2ws%gh8= z{miR0WM@;hpmv_&?$h+hVtC1C9NzX39_M-zOu?0$xM!l0YPz6xes5UOI zlB<@Viawh!$IYj3EO@UNap;x^F}(m~gZ(7R4rg-DSa28NBQF0b`ypih!A{P&w=pJDvs7$?!8*~PwQjIl``%dfFyK06ZP9RUc}vbV z=*eJd4_2RVd2FZUKwa090x?i*h+?Rt43zqXmlxOzI;|PGf7o>Y^5Cc8La0e-fKTc; z*=E$zunHMtRaR@xbVf%;ce-zQ@;e>X6jep#@JdGzR9U&w?xkSKSOn#~eqqn?L;Yp> zTnV9t=Wi_@6F!qZ-I~wl@1%?$EeE;#dV9YI5QjrgRbCjGxwRF1g8F)lRajkIF}(*a z;uQxInXhn)*K^AGT`e5-5&9gsf;UPMRj$#|R*(T7^yrl%cD3wI*`;y>l?JPRHtS83 zO$TmMZaFTA4t$gg7?%(|Q@n)ftAtrhj1tVy4za@#ni2XDgA>T-_1I)mX47f3yRk_d z8k?`n-O|Tvy^3#S52sWLm=%{Htrb?ExOjrt+>WhG8igzIWPc!kHp9b~v{07qOU_t~RK$Kz8jBvFAJ-@NV<+ zCUkkkw&U*WUXUV05walXcP3x~f=q8=y*W2{kROz*7>m3%?$B{6^cZgYzJ#opdj=vS zsT!Gmaom)RKn@l;5m`aixgjB0iH2vB)p~S(XQ$MDQYWk)8^#;z{Q_g|Tf9|!OWKx# z58;}y8Dedq3Kx`WIjK$#4PUO(IbxsFqQN_%YGIcscw7jG+AhVBu`^C`8${Vjr(qET zHY+fC(26zho+B$aS%-x(>6tn8*uBpu4(K=aLs^Tx#L(Q0VW?PX(iWP{c5^i9gv9&{ z&?2z5T(+pR-?sYS=Y=A=8jS(m0MO-!nyS1Jr*wZ0YeRf_jHJtN$ioNlxGug$j4 z!C$f$b)NQLC|!0Ran${6o#t?Ytj%esnumDo3keDbFu&Z7$e|JQ^M@Cz2t+uq+M(4E zdn0|(3MkqNR6KCByPfoM9kOq68#Zxp{h8KBDgYw(dQ)yd9l9<%n#N93bZbkKTaVK= z9<4QP4m}vHZUI!ljuQgXjK!GKK?!s5B_p?USP6-mfs~6Qb*Ja=l z5->?M~GI^~W0ArYXk^D~(@pUsh z2ONUSrf*DkKw`5|o)Q(-(5AI&>24q*hJ@-4oJlTYBlfP-0m_XloQ3SSZpfzG6`P1k z+7eC2m75hEUfpMhspd(=QC*Q^6uFb^T&=i!YgDv8?kHGHp0H9$bU8WB@6(p=l-O)+ zY>ca7HD%!&`C#Am+sZq22vC;;SX<0R0-gAcxTYj1^5`yH8&>R{I_2_V?;V5kC#Ieq z85YDar+$gamf&^35?xl!Pii)9DV4v<-d9gHc5eFX`V}Y&5T&zrtMq0Wg=3p%8buO^ zV}XoaANo!v#p{~+s>hcX$LRLFv8vj~wKvn@KC}ntH=_YlQ_E^K5VHZ< zRfQmf#e?CH=d1&wo1&tjaU4E~8P2KM)4(K=wUwt`Ipn|1$bYRU^(!7W#v=xiB#%tZ zlLny=&lHZ?8D%S!9j%3iR<^GtNv*2vWN*u88uzw^-du#ED@g{OwxJGX$sc&B#ai)f zkjhLqQXm@5WP@i*aX@yw68mL!tocS8ft6Bn8n(`zb4f*1LUG^jYpA{ zZbXJ;lDohr!Fp5?(feYKfpfy^qORDostGyEbh`%zjoaMQFB!64^c7}fk;K2M$GX^E zV;6-^1_opHnl=O44GnqP@j{eRLbqpo4|ojMPw@Ty0=T{f1%Y_2!uV{{3wZVM2LZ;V z__#=Pp>4gk$czcj<#IT8bMFcq4lp#T)KkearT(x_AeB_{ffV3(_DUZb>;HAYd;YjR zqz6N5MWe8u`Zf30ox5V}tqw34l2B~|^l14S&8}imrCC!JTgR7|(fug=MgVO4nPYJwTow}A;V8~keCI-bInAEs7rsVWHpEI`vZ=+=GD>P9c?x>g>>?jf*q^Zyd3V0RXghshB=G#%HIUc z*U{wCZsz#ipQ@ZUv8raxFG`{)uo$zflR5PnF`0fJ&KqoOJ8bV{ibEeWk08DTSAV%_ zMwW(9LDahhdvu)ds$SAu@4B%EwUmSGonp*oqMB=zDA63XX`i3UxYnjj`e9Djou`@V zl+I2hROW;Z_byB;bZO1}tRDPo%e0B;ma*H6dvU4naQK^H_KNxiv`o;$4fs_*RKA8w z-Dn$l|8;*Cj!RSUw}3QLnD)<4r$@UA-A0;%AOThE0py2}!iL9;Lk9cOIx(9s+<26w z^LNY#%Ch+$Mbo*AeoCDQK0OMad|yZ%Xg)#K!Y+Ex5>r1^LXQL>assUeib$5Ir95KR zQV&9Ty`Az6qWz@rEs8`{-Iy>xqlC4Q$f;McDT(#7qP57OO}&uO8Px1FW4kHNA6)l- z<_**vpcN=DR0HW_j!=iLaw~|N0aIjA(p&U-iJoKq9!6ps!&11*1dE_RSOg1shkNTl zPL!20kg>{4wq%(KMGpd=$HL69LWGb{Y$V=-H5|OauV6^U{g#t-jlu~&3OZJZ)2K&C z1CqCjik*vPQD7+H5PDiyJcsj|k}?ZX!R-iXvx}{Q3+pHz? zp|d-yw3OyrHEA`GU_jf-Aeu@g-2}gU2=0)bm^sf`GPt-gXyJU2^`;3(D z)HM_fB)Ylt>PnNqjX;4hW_&jXv0M}Z>vLeY3G%q-;YDp0GLlP7b3QTrwC4))+Y`5u>MT@m1myl2VWzS?}9zsBg+q&9cxOE9B`&wf#Vru`x5Pkf4;3>xsX> znT%$kMw1&I^ZVMxH8rP%TLE|90@O0m%BKfgBi*dC?FXhG!Gf-BA1&*VJJFY-8$37MJiD&T0#;I(~Yfl73K_+lJ zXZqmGmRHpmh0kU{Z>F1{SDdHE0q%rG30;8DqgsehCxxZ~^SMAJS06y0b*8hP6a_RNR@y7vKpH zn}eY7-;j*CL_DUXxW7>f@}bY^Mih2vtE^;JX&3%DOE_3jED<+n*Xt|&6J!3UbjC|0&WBo9e^fZ2!^UErEXK#`v9tU=R#XF6FQwjNCoY@~dRDVT@IL&TYs$J~ zjRR|#{nlkJUUZD7@h$-V;4I<0ku{-rOiRw0f%Jyqd-;=q@NOFdfgo80ahCI$PCNp- zf*1B@#dAIeuc7Pt=Hp3(2B*YbPsWSj$HDG9$U$VzBs-!D?dzmVE=UjiX`T)&%_q2i zd3jy0F@=ras?!Sl8tfuLCVFztmW!P+B(qH(R<-q+T0#xy)ee<*I=EB6$#P6F*rbpE z)Cn<{C!b?+43@RX8ZdlW5HQR(pn-}yJi{g3&~3G+w!WvseO>$ zrV-(SxxG;=v5{5+s2HMKWL%Y{M66Zxl)(i02jDFU-yKJPooeH?)(MK&7eDxMj6vYo zy#N_iz(VxSLG>#2*3yi*&hVAYwR0kb+sv{JZCkGhrs;(PC?vi$OSIz0B^^G#no}~B zS`&l#uFZ;)yF(}(0s;cVyS$_UN7Zxk-eOBe1VfoFPDd+tst0jm%l0AfFH7zpbFP6H zQ$`@%w|H))KurvEvNVOtQH;4VyiCG~-73&+&VVIgul@|6uNGa1)J>W=B52K($5)|k zqrgDy8FyQrI5V{uUh_i%m5+4$XnpY%9WdZGZg^#->wS%YHCtCUI;Ao0El!kn&gS>A z<$*s`G+AI?KbQu{e%CDZ>!6MQ2u(pMkO8?wU+*=V;`xvLloqa+g(<;D@d|t*y@GQI z73qmM&bdOeDAyg?1O$*GIZ2w@-WSl;r*2-jIt~!5z4$TXzVP2r5)Hh?UEMK#>HPv5 zU|{C&4t+C0f~TG!N~?^=Lij8I1r1$C&Svf;IU<8S2KyvPy6RBreCY9Siql`eV@mFS zxgys03=3rb2n7NprIzV^*&I@WVS!Yum$O@e^7uhBoFvlw#pLDnukh-K6Znwu{}rSP zC(z}BmqDaL@1T1T;4hXS9|%cYwV@Z&sjg?YVvjEeqVjIjTpRZNWKrJ1px&)-<#>N0 zb^S&$@-DYAlIwDqO2{C3FsMEGEaNbPfq^91)QJ;F9Tb|wLW<=J7MVwGepMvbLo@QDdtPhm9%rlF z{${NSK>q~wWJ8TH42UGgSG7)Y z>2%yW2)f&JTGI#?9=s$@5$roEl`?Yjw8}CKD(ZtIQviqe%m9Il1V6@@wGL z{bowt{yb>B2i`Exe?@-xknib~_Ju;|K!Hubs-#boAc61;e7lGbmpzLANai?!Fj)NH z#Q#ctu+v$g4|vX9U^X~wimUrUIL)=ssKbC^Ark^ao0U5jXH$StVR0cd0uwWH4@zic z&7n@1?l>^jasQ~;Uh{!_ZR#RQN|lfj$NutOzERMx>e*eHixoyVM%gUYxM^ z8?h5${T@XBeq{<8ks&{7+YH9_g7ysXVVaw$ShXAFT&WEDtv3HWa#7edu7eKKtGbg^ zlL?R#HPx>(hDhY0k&O`c^gsR?-5q&-FQ#a!uU*p%7hOx%XIK>yVj*GxFXmAe`07pN zoQw%BNT4s4+VIg-Cxvp{^HAdeva7O)mwAwI!F)1~tu{!h=}@izKo$VJ%lUvA44vO< z?i05i6*Iil^Il}Q<;4F5IU)U|u=VzKV6Lk8N`i`9OAL7u zba<+yTu9pd7s^x+F!)WPsXsA9N4BY|tN?2rAZ&Z){{86NTDSEwn{uLkW7bXqECCuIJr+yJlEhUMlcSzOrH1zX{&-mvPbOu3pOh|Kl~>(FwM zpy45;dK*@sla}+a==vsK5>||OC!sZiMQ*8yNYw1+(fWiwI;MdvZts) zVE#UIe!jFwL$_4oc=R5-Pc8{;{(V6zeItSqfW1x_hvBoqPUgpCojo1cbRH)nS)|nT z^~Vqi5mC(Un`@<|uoO{@pya{DoGStt;h-4_SvMOw=rLC-nAH3h8>}|1DqI6+ViHYa zY=0475Etq($;q zur*C#B(EcfN(XR|pvK)0OCDNRrFk81IzJI2<;%E#cC7y$L8A|d<8tfVCJ?p<{_p+# zd>GaSlAWoJBO+%u_?P?h=(pax9zyr5N~6papYjjKq7BcssS@lV5u)VvakNK0@xK!I zTu#JiXCycE0O1a({{YHbPuUkP(*#2C*cJG-laZxbaj(1vDfs?i#i(J$yCQBdV!W)v@w8+aw2y_h6lAgo42` zz%kQYbhVJ@pjTg}8DQ1qR;V;FV}!+-z+yCMBgK=wz*J6i?O$0{z!j$~?aZbE8XUFm z+8S(breAye@rDVPfz2J2NP+DtykZULT%!rbDEJ)Xb!n_Em(m$;5bvGf_^^?O*i&9( zIvQrA9MCd%Z1zCFRbdV@3D(wD5m|{k1iGnOaL(Jza{a8zLVm?U+5Ss>4g@6I=8y_h zC|U*FX!oiPn7cU+jex4yV?vk|Yk&d#pno)`Kv?GeH%6+!qU%;ax8H@SmhQJ&^H-V| zYc}TY7&B((o-{u9z=;A+Oyq{W2-DOt?TAZI0t4PVf03`s&&$&U+Esq(JLxbG= zI#G3`ySFP%>_ccwJQpwDAVsotNi%0a4$Z2i5CCrWkGlqu?{*zkf$we`ma%70H=qu@ z>_9l|l3UP&aM@{!3ox>FV-*tU{*V$BwPAr-i(x2^$Zyr4s*jQUjoZ}BrO{=Y#*((I zvqDz>@UK{mj5NBw0*gM266FL}*{QO?w5jIKA{YYa<1GO#I2454a1ekz=xQwJbmLmO|FY}{#tI+9}J>DUgLYi8vn}o?4#cECT zT&4poN^7&kz1sWMd62C0JKwp`ZG>uzHZ z5$6)+4u>Y_^=}-)*7CGD9)M{ip0WX`Qu6+WrpvA6PZqB7K!R@;0;Mt(O?gqdDQpGk8;WVIgL{BV@i*xKh9PT)sb@^c4^?-WTtQ z*B^5GKO(0Ibp1A=(!K?K1wIS}g+##PblmIjAdF`izIVhfggulD%?)FfGE8wl;*)np zQ#^r%PBbR)Fe*?y;L0IGvWN|WNY6HlQPA@_VC7pg_27rU92(n*;4+T?iiiWJ>G*Q7 zhqO*zW#pLIb1&V39m>oSWom9@W`fD?@-8=X{u}h<`flpk1=|CDv{lJjtaN4SdZ$tI zf+g%&-U$9rP;;*CcJWB$aS{G(#Kj0loC!RtCCLceJ}JOB!+6p0<55a{PHv;|6aw6B9`k+ zy*t`Ae|%jwndks4^o_hxP2TU>Zl(jfYp|_T*nJli;ckFC$#(xR%Uyuv`w&-xCEgAh z;Jlfd=I7ZRmYF?O_us{6ADCjS+OJc>ibGGeqz0T^AI$6~qhdVVcEDAx69^+uM z7On-fOHk#uRNmthWX^tl@n%XbJ=ebx=8u4`*FB)ZeyYG+2HIxAfl?4c_h}YLI;OEZ z@E!*Sa)whzXpJ)1!UdG5Ktsf*QepK^h+(F<3@EgoCXfGBHp2H(kNop+{!bUR?bt*7 z0HV4hV0*e{uVY98<1$?CA;q0}9#It84`n?Fh%o-g9FPuu73S?ULw}!$z6V*! z#)3W2qFDekt~n5|Gax*GVVg3p)ST~nQp8NIo3BCj#GcNvREH_vjl}- z1J5f#Hw{x+kPoW7h>UEXRoE-qVL*d8aZtuM31rgQq1;e2MG3%pgG_XJvlako5efyq zQJi|-5QQFh0_syjOnYg)C(<>#1Utet=oqIW)K_PJQ+RUSoI*`U)TaQQEOt*|!(UTC zpdYF<$iLNHC_x~?A%8$Hyj3#>w-?PoRnyTr5FE_9P&6-GPX(B1(VSQCU4hZa5IouR{-DCyF3>7Yf(!z7;5ke}Q&sUVM3e>pOh-!AsYXG+1 zHKYfG{IHF4{O}hPB!Z1ebe40TX=%`dYSeP^PUie|@E~27AxROB4Qe5Rr8Y zD@_FILHbB|oeY@86w4Zo>UmL#jhV4d_}Q4&b!-UWZWgX6VJ}Pm)|vsw2#G~4Mf)|3 zF`OMw^yrpm)}%g;`WoyT<&uKeijGtGRJd2rV@ogg&v)3eEDSq{&-=44j2PQ8ha_US zOn4H9_qP9iXmXeSyp+8*Z6UKm5MOw9Sr$a zS@>|Lzh;Gt3@Y6q2wJj+fMA*=p5OdkK=O+?&U(^Beg3je!D8;Ag%h$$HpBp0xotg` zYRX#T{NoSBzLmgHAZS!*>{QNy!?46s&fEn>Q6eC)K^U9FYkt=VkhUhoo77!4=H1Q% z+nA0S1Ty(Xx9T7(+X!VgPz)Y2Ta&q|D3OXY54>^dVwHPDhcMMr&d33Dqgo*%SJ&E` zMl$QLu@SN*mRK;9SebLHhB>yo`%1unk4BnUJ;k4lq8~X0TleqOS5OaB2j4zIxm@4e zs;PC@J?5Dk&3$bKaUl5b^jnkZ1u*@V9$uM(2XwthgrIHRf7D7xj62e*wlX~uJ-6#; zeh0rP5-U;eh{rRgA2p!B+D0K-Xk$;r{}y@EemLe1rE}+Xhs%prwH5=jv{sr^_9lU+g;{AccFtdY`qq%JczUKok?;6~vFOp&59XrQ=r!7v_ob3xqR#5cBw+{mU zr@II^*Tr=_hhY98fpXY+K0_!aS65q$brt;S8~)+w{rgCb{f}$v%?YhO#DDlMHOaO| zFiX8|%H3m^HA$t+v{MESpyZRK6RFGnXS5T?4}tDWfUYZ1KHjIEL zPsu5y$)`+%gUcg8(UoiVA^7tYaHPE|?GT}}i5ZYf1RjLpZ3ifVU6hE5afho>DnxzF zMZJ_oN9NPX;2AUd2Nl`M!_V-n&qfhXDBq!@imt)&KpBEerHsnm@i8DzY(jX!NG6VC z=n#tA$7%k_q22uVB@U27i%Ryd99oAb(p>#WIHy=5(2Z6>qz!?PL?ZRw@(M-o9r?^Z zRr|kI%d5isN!}cgvQ8Y@k!F*Mn2q2JwKdS=QHj}zSm+fWOV9TF96eEN4es~K=am;< z{MP*?`@~`UKJnB_xI`SyGKwdm01C^ZP&O*jB1bV~Ik=|b0l)yE;-V}$JYOlxyYV6) zB}fV)gqgKGoa62~Eyrl5>)ZOaRUshfK`VX_Bc}mPQMs)|I*g*J0-jOS*x$|&<0Yr9 z2^w~d*Xato-Fmx3r@B%^c z?eeWUuq*Bxj0R>WSp2kK$*S@<^E5)+%M=(38a|!lDC-WKgw^VrwWYm%@y{GrHEFkB zE3soOY91dA6Ff654t>|rADaDG_MkSTTV!c75A^XZD`F(cl9>B9RM?_ZKnr<@lnUKh zP=jQfv=gfTI*d)NnnS8AJX2-wP0J=2ma)Eqi)U3>-W4MeQ|R|(XL>$Z8!N|i{>VH$ zUa5(S(rB2=5xmZ~-S9U1$xq6G>At|o4=?6XGkfym3D02BG2 zP5{W5O>5_UC*0qb3h;k0f1u69{u;#nW}0foj>1~@3GQqbeG{2QWy9Zk@SU7T6J$uN zw*F}R0bi2;`cBq~)?g5x028^N6)M^Wk?5&MRLR4AS19{XdX4t1{8?J=#$8KtY?CBv zGI~#yST-wzZ!kS?&vU8l3Eg&>F(UaGp{MV?nKT{+mPh`a3=zhJR!>zNMV!w02e6ge zqq;cHN~409Zqc}0Af{|^e9b!VuZSkj4K}lE0@zrESev#upTQ0|<;ul8z9l6^rKQEk zu}cCQgWQdca*EyE4GXCo1PpLCQM{d6MOEBsg+~KU$nq27=SYSHp4NL^&GGjvaeeuE zPOW#5i9u=H<=nO2+a%q;&2j-H@+$` zEsfOM-U{S!U#((-KP8hxFG{(oDLJJOu$1*l((_@m*HH0mH~(t5UtzLmy$>>U68DuL zx3GY)wCD73>!j;_Qv}ycRdp|BtSQ4IzDc-~I%R6SJLvOQsMMFE?|xwAC)#}_2DgND zs+bK3xIr4YA8d#PLav(+l5VAk{7UUe#o}KB(DTh=o)kamglA<+ZUedt1YHHpF&>fm z@%rFC^BQ0147a3;j&PhQU*OSF-qVE3S+3|_QXv;weV%yA56`3SwO$RV0)(C${S^teuyIn!|YM;D!@wey_ z+!M#V@x&=p6{+J`MpH6bcySR`2M)zGh&#+-{WQw*IT_+>T)y+g<)@0J~@ z#su+#&&&|(f;&-iO6Bw+0YBEGG&=Lma4LDS1)P-DphF`FuOaENG&w!N{?H_2Wl6HM zG&k18v|5~MORvd((7|{5-9hA2zAlKQGJY*rPM7Bpfl7A+4Ia@(%e2YxgYimzXOh`y z4_yaBuemzvD2Yio=KfwS?`yTq$j1q+0RQ}%(udV{($cNkCH;kn=XWa6c%Cx<_}&=8 zVX$YjL@_rfuWw98qo?fa%G1S)ba30P0w_8MEl zGZ)BboH2WjC#kl1knzA&_WIXRNomFy-*|BUOPGZC_T#tNvRGQbj8E|!;mxHGP!Go~ z=fn-|_59&Mb*{g>`tUtM6p=a4n9~X(b#?V+}Hso1ZLt~N1g(Cr^&gqd8UR*F7>am!Ix^>GfrRh(=t?w5u%v4u7wsjxa0e?zgK%Ew&{f z;B&j4&1+@pzyE1-pAJ=Q{jWCnkOy=gcq5=8OV9ncF$?(V4J*6FS+t=SESx)@eTJ7` z^b^ifDWaIc_GL|$9EF(Ti5rc>J+)D;SRu(%anme~Az%yl(2#3o!qoG5tPjl;TgxMs zS(o`FJANr=m*m85j8i*u-0W!Jk5Mq_WmrN{%EvUy&|+=-*6iQUN#^s=ycy`UYpdYn z4~Jn&PbL#Osi#V41wML|Cq`OEPp5G@4JOKFrzg2G(u>)l)Q6z}!_sL`DU?M2tA3s(W^ZN7phrc&HY}7y8 z0qE;ONMH-Ei^)V##pIj*{7#>>C}RDh$yT^Q%aY;5(5yh5uohvMP6%YqOX2J4rNMNL zTBth2v+&@X6mr<6$HZw@-)PI^C%0O;U)a`vZ@N~9fP`f-NnR6!e=H#J*qb;U5(!?T z^!7$WjGkE+&GeCufsV>; zW0@VnYaB)mPzkTe*zHJ`aC~A$L%)kyWg?Wyw%8k^7)Znzs|#F#1F|dvca$l#>J^99 zS_Xp&7LIN<7AH@AEWwLU1FJUTY-9Ug7o-2hfR3zeTi#DfT&Ni>5U~>vWr3oco{|1| zKMTE2($kp_2m~lY1_eL`WRY8%roQ2?$STKXEw>s3wEX+IQzQFC>BfFyWCb-cF)=Th z$<1hxlIca7CORBuSkZ=TPQq=$8$g!e60??S`sGlD*&=q}fvI9W>EUgrmsH-Mg#unt zHQajj!-k*1#XA0Up>UA^{!@Aq7QapMBXdK418G{2c7Eodw-mHG;++7?tU;^YC|rKq zZ-3ZWW}wQG7MHpqBd|a3a3IJ5KukQ7PyV9+CG9F(aHoHbKEE@stOKW7SbHbU21u#c zEuaRnyuBl|Zjv1P$h6%pew>MB){~K8{M|t;3{v^hfe#$SI+z<02a?M02MIWiTIm=OBg=A-GlsiYb;hEW%#gqK;_F1Kk8)sllean$fd4^Q zZ2;*IUolT_wF|7nIzWl_82Kv`=cIro^*H6MrN&Z;UQ0%+M>L=Y+nHcmoeK_@3+F5; z_C6|9GjzIVN}eQ6eP7=$-654jvJxK7dfwNUNvC__a%0EOwpmR};nloiO&A$vh2duf zK_HqYlg*5aT!e<8JQR;KSaebjSz-^LcKZ4;`n(7BS$UBJN2k2)dSCUzGnGR^z`3=O z?N0e`H$*M|ZRM7Hd0hhEmtGTUIn+;o-3;29cS@;{uk)d;!XS0b@N^5n1bb^@Mhc|& zVe_iEgZ*QLSN^*MMT+C?P07@T&U_;VT42r|c3E!OoLuwjm*?mSQY0Vs`t)a6W4V?3 zOsd_+SHwTmrS>qZ-{eYm$y=PxH`ve+qEGNS-10X`+BcF0?M1e-_fmoOk$Qvm-HOwx zl!}Kx(<^17?Zp6h!xb7;8mV)Ol*Q!ZeIG!a@1*6+?I(Xx=5q`N_Ey(x`tS?etw^$` zb56HFklQn=bgCxOt;~T>l+(0yZj_`irPJ*d zcC01=V3HtRw-Eea7)u-)ZDl&0Kl>d=4ih_RPUQ$$N}Dz7i0TptkLHZwve#2qu`BeN zosf6_y7U2+w5dA=vs5y@_II_p6g~C8Le8Jb!r3sasg*S4&bc?h0;D@b5} zo+|N^_mE@h)$hqM;)pB}#IJTwLRlc1R=k*@pR9J4xT}``6F-zRo7q^pt(3qIuS32Y^NAl z!}gr*>jUpa!kgzN(@8EjbKVRM7&5GI1skjrU)muiELKqr{_4SXeagBQaLFPmLE-cT(6ru~$zLsdlmJW--EM0pZW%4Q2`&Iy8HEC;D zRfTxXz=Z%n_{ux&onV{w%FS@NjJ?mEl$w~EYK{A!-A7Q3x`BUl)K-t}AxQ=A5_d&! z$3ADmWr4Mwv&TLi&NlTjLXC_D-)=K24Bm7X3}y#9Ot?r`FbwQ(4bjBVT>i52m?R;! ztLM4gQ2v+LC=3N0#=&-bUn5m;MciEJ9N$<I^=MOjzNu@*khGbrNjTTd^b;@8885dOTvyvf<~ z)Z6zlsVP3P$`?O-F4&N=_N&Cll>e#q?wtR}PA@H{e~$;o&*H#KVZTKIk~DpKH2!B= zTj?m3ugCk}PG*I3?ZCtfy1Onq6VaB19To)2&oN^F)yMrrXbrrOM`lZ(HQl_knZ-qt_)J}xP6el zPTiS+P?pb1W)}Uy7pl0;a#HC}!hE43Q#LeQX?dcR?W?*!6(BJD-2dkdQH3!wm?D&` zm|B~)**|L4Ow({M<)^^Pe2dGm-LFWgF&uRJygtAgb}XVELp>fyxQT_;(~zvo;_|c( zEcCH~Y{A_Y%f_V%HFu_8CkVf;S z;s|1Jj!?QhB+qc{HJ@Xl5v@|n*`HD{E9!~_OJ0>MRj5EF%r9iB0EhIy4Ht+bH?_4I~tRYcZuyB{Nvq8uy3Q6M1` zXBilWi*Trrq*E)SsnWHKAmd6TLQzrxQ?)7_(@nHO69l4foEFGa6FqbF7P3ZZXfjay zHH~pO2HnB_U7)}e^A7jxZwi}^Rx?pmiVm98XmK?{&gI|LM^RsXeW2H2*A6*C&+xRt zSwErG-VZ!u6&n@5Z5;PiSg5dmQzF&;#izH%nr}f1c(MPbi$EOq|K!meiKJ|YpZm$$zp5Ha+ ze%~d)j{kAkFj*V7m^F~7&}UzdOqk`pofN=O5yZz}Fn_t*1~o)#$;?^-99J$k`6iVq?}YrBR`*_o&uw4Bpa(+8Sb>i#s#X!N}{^Hn(*hd{U!BoNVTVJSrB*J z646OYKIu`I19w^M@dG}<8DYTn7Jp*yjDA_#YmI(wY@@ETirBOCK^_zo^>g_(xfY~s z8?^5z_wzDJKetW&lk^k0WiKjCJpcCVV`f3$z4LujsfsT+#VzdXra z+s?eORFuPdU4(VkOh<9wnW_&D1}w1X#JU}8TI^|G4rs2|28A7asC$;HyMEeM7+sNv zp0)yt{99`%W@D(CLsYi40$(*)s2pkCklbpy!IjexiE$LiuSds+glJAI0S=7;456=r za}9cxg-|O%iV;o6pof`%^Bn*AORz1%H{;^M7LVkI z49Rm?pz6;}Z2x7YbQL&Q6}yOHw%xx>cyIpesIAU`zc@)@0mf{C3JZ+XH~ZtkK@Gv? zm5UvmC33HvweHm;_pQ@bdvwlg>?NL1ByczM~@IWg!C;cRrvOl(*BnkF1^(q)nsyA41}dBTT`KiBvQ0u z;UqDx_k99?ja{BA9Pi&mU@yJbeZk->V5ASv@&xj$c$H4a9`nt{1xf=9r<#5JtA!C3-5#1q`Z*G!G1iuWIt3`)n+mhy2f#R-a%b5*M&-ml55DwsRa-sVp6=Xi?Xoh6|dWCKj1}MafBlNEA6?i zEbueqKR*NiCrZsfjijCsikl=kqPTb-toqw`_YdSSJB|Aa{2RKZfkE&wh59_M}5o4SnQ7P&d%a6U^ z9Kqyzgks;bzW@SK9a)EKGV!7W=C{m9Oex`gWPi>~uz@&l-y-uS`5Uk@FsQWCLmREq z&;Ce}GEtxGv0g-`bHfU5B!Jb!>RHbT>~*K#`-^_06M=JLf@Bo5C9pHZ-ELtz!t^PX4eXpGb4864gpVq z2vwW6OwPaaO8-EVzd5VltnzPKHj>6aul#%S+}imP^`%sW`WG_~P=6}AAsZJ;twF|a zLS*mwAXyfDF-46zArix_o3T8b#562k>*g;gDp~DLd2m8YD1g(+y>r63gA1 zxNMYyPL3vVXlPs(whU}b(z?7*9q!?#iv?W-RYd~|p@?2!%fsVfxHhduol=AI{DLE_*PEw_n)jrD>Mqy_FHoP zw-7o_%*hn(_7Es0%-O7APKCL}hZ%g&uvXt+XZ*vk8*y%oB3lGw)P=pn<(nuFHambc z1&ZlPq_eY$;dZ~pOdW3Ll?BGCwHiBquGTj=9R<=Tu}7`$4i@Rs=&Hv*r!P_`vk!yN z3EXlR6>%_!n{g@xx&z-zEu6$c+16vVpO6r!ZIB{0qNd4IYE&n>O+{1ROOMfN=*i>kv?i#Goyg9 z)FUtIL}J>S2jj7R>s9&YBOE>;6_%)R*NBm9V)NB+Tp)nc>UsX=`xT6&sM_B05nM0W z0WSJ`cx(XBEhL@U|IZs5sq^*$!!%)`V17$DNl{c$sto$mO??#~WR1J1B! ze9sp#3hKD1a52fydMq|UCTe#Bi^WZVU)wH5f(D`x zTMY-qDlD>_b5|if*6tFjvi8ZbJ8{44;LbdNv!%~L)pBtAwR;-(^6Pht{}0hG*>sQD zVB}$UM`>8kjER_+TlIu0wYKifMqBFf9oRZPVz!=Cna!7oMjQ4g$Dj0_Q!VBbZp#_A z8~T1~mp~BBs8*2yZi6C}6#?Lu5aryAgKEf#i4X3#%XC6av}}C>Xz#LeXupd|(1()V z1ZclU{-@kh+CgnZ~dLtq(R1 zu>`Vcvd@GAo#QsJj5B`c#M~7qG&FCKw2tgrjoNNXm1>Jc#)fOi44`3V=9ZFTWtps~ zrC5SE#>J?z8(jic>^cc^2RZ@Cp~K^2&^a3TJl?1}R9UB1t&WIpr>`4$J^Bk$a#lf- zG$eA`AmswsJ-o*bZ)3Z7F!WHwMgqgqT!tA1u@GiFA7;Sa{6{)oS^!VF#cyg1s5v4E zDjf6L(3&&EBfI20b-a;MeJM=JLh{UxJ3-pW62J96ex(m@xS~%sGrOV#o3Nu*O8B+} z1QPv-Y$|T5$*t;*WTF_l-+eJO!epwck0`jVg{SAJ(TW3lMerjrjIlP}%pPVnf_iLI z+|&1;FY0-gY|}V*<%dC>&>F4rs8LqVdMTs!kQ1p}F%6Skg)HH23;ibuWLfWpq{^pPhH_FR(SVJoO?bdFMi!P(}X((a-bX91$)32_pR%NdgvJv-WCfS z^IxZx30!D`wT;=qvVspN2$Q4(2vV$LnKm*TzY7~rvZoD)!z7@$ESm4$N}cBoZ>-aM zq&JyjbdfS4G3`SyxyGCN^uO8QP^dmmu3>|I-LWBig#~Hx>F^Qp=Hx(XV$D&K7BE0Sb*>HEpvT^&R(3k5-G2oc4$k{dYjuS|sBNnahpLD}! z7VKvUJ#$i@)&zm9${1}dUrbZp4+KDU=uhCBkcXoM(nSi9$rRjzCKzl&EiJ48R%i|N zV(@aBqQ@(39Zth28)S#RZsJ;Q3uet-)YY?je1$@|J#5#Jm0kPhG1-j1k;UM;m{4EA zJWjHy@}g{46*-~JHhLjE1^HT6Q=nw(HbKpp@t{dzDRw>(LKJaSYm_&N8l>v#Q!3Z( zYtRO*?aznMxB&+olBPa#a(7sD?uWK>`z$3gi(mhnEfIx|`kn8Xf6+fa`s`s(w1bW< zpc6h&5q3gIm7FZu3%%`-hRHCzCEktJnGU*lcSM3_+$xD-p2n(+EyYs*R>H2XU0XBR zM%XJw|JN2nDe{lKU`k&r%+Q@{@-KG=ZhMMXje9Kas4g9q&5$$(ng$ECgTfr^_O6SG z9i+}~TnrqBVVcW2FjC+@O))L|YNsIzJb!B25uh9q;Iqw5Y1tq~a5gHKhZMz^^GOV^ z4WM^*$~&i{20z;6<>>6l7Bh5?cTrIE#p6}Fqp-e3hU^r5zu-9}x9v=H-cX8aBSmA7 zQY}*9+kLe8%%9|9^r%~o2f1Fp=q-tn)?u98vXCj|OQP za<&Im{Sh=0KLon~q8)Isoy3;QZ(lo$=|pI*MAkWXoQZsFI9Z*x{Gq}q5@{$Lb%&-A zCCM0v)uYtXIM&C7$gXOQ#*R}FvsN=To&dZ9qx4p{3kXs$fvR^Kh}77QMxE_&R4rvZ zfD5w>p?1trB*o&G^i>XNI}nZ|oizqNJ+GOjMK=JPi8`dsNU8UMi_iYU%W^uy@)oAO+KvqH-r z{V^0%A*d)gPNeS)0?YtG3a;;XU%)z`#+pDqzaM}ij*#Oxf=nq5;XW2v#RG&0f)HYL zpl%96ih2QYQ9s7u?PoNofWOjpRa}@sAecmE%e@&=74A=ynm|iq66Hr2gG$T8ZC;eV zQPCt4>LpH@@J7N+u}}sz)C}pVVy$>%$7JiDr)VQ8Whfk20MR&9<8(7v&P|m-@ghMw zSfwI~B%F}99^ELNo!LTb&wj(e$rem`rJCR6wEv_Ea2D+jN9>M=VQ^jqV@nabi!#dJ zcZu}0H2>7SSn;UiS_ll8FD%V0tF-jfDX#fC$qYeiU6eJa1bthL~#hfdisXYE|eJzN-3Ju z-&?&N46ParBktkGwO^yQwzgS-f862SJ*%6#F9QWjP9k-+5-1Pp<7qKC4ke=qTh935 z%pbopKJ076J*~TkMB-Nlk*Cm33qB0jGlr#GNgMLp!iqpu1AYR}e8{obu;?Fe^2~3D z?ow&lU$r#r11}-HA(u*r*5T`qEe%x9)1v=gb+4~Mwdtxj_AqV3%!U+-3Hdp^CiqNt zo&fYMtIr)`*pnBk{D|G*p7~K_dwm*oVnc{Q02At(wFsNCXRhWz2c{pDRkUxHD`t=;n?HVa}<{TTmWjB@*t(Z2$ z&;*t7cvzju)|AD?X@ycbDO@8rjObAhevesZ|TyD2$#P5M+jaD;oK!P~ObZ3o8D~u!3%f6xPV+9^171Ct4Zdyu5 z>+)WR_Vp|8%IL;p-sl`@25AXhDOX!nR3>mNu6yA7D@J&Kfm%Nr60z<1%)0Nsv|_HW z5mRf`$r2XpMz5E#f&T&swYN-K-R7oR+PXj+@-pxfL=jAppO72mSprxo4naWJB-{W} z!WK9+0`Ne)5?D_h=QCA zL5TS#!Cm|CS(KB~Lf>M|b*_EUTHD1ye%kwG3;(eC)q>RXc&An|zU_m#y+u@NyjDW1C8iMM< zpprX`0aU;hZv|As2H+Z?)(1Vry2ApR&&i-=X9yf9DA-K}74VY*3l0GtgaCnLjf{@&Uf+tG z$psd;YL_*>!rL9@F_(rogKKjvAPuC~8|5C#q9t3Qio%Ot*NyqgCf!LdI7A#!2?wGC zhiGQ6U5TEKK#?>JbEb|G8j!+iAyabyNG@!fvx18xVUgsl!8MI}{@`!D`~2BmY=kua zq6&o`5*l1*LX^;unvhgX$m4o$;j;)5L!roaCA4FSiER9mb1pF=4We{jC1e4AgnR`z z3XKg#f^~VAN9X}JBCbcNS3a%q%cP&J%F${7L~ks`7yRkovl(t`r+nLV5_=4wtJD>5 zum0BCItCj#k4L6QAs2ME=!P#TZx@J}0+6{W1==0QEl|Jl*pVHpdh=SJyt%=mb*D`9 z7CzC}U2$Bh?Df;T2r*?X9j;1++R$jSKmlqH^2hl}go)bP=BZ;5<8O!=8L@I{)Tg6xb=eSxE2IW6^ahUb z2Z_Bas71)6MC;AM1a4;%)QK>EfgsqT;<$z!Jg3eCk4QW$4fn{zr+E{pb%T+{RH)tIyEyN2}?)=4aa>{lRxZ*P79H8Re>dCcusrx4yBdRf@&BigTNgzK-mp zl;%?So`Ua4vqdguS`&C%PkCQ52Y9Jm>mJ5)%83V~m5Yx!Y}@VZn71H}tx=?RW~yv< zP(e~?1sK{y6Ft6K@r_MBna-ebhIX`u@Zra3;XP$ZYO+o?2F{wZzB51#NTqDDu3Ozf zfes<>lb%%A5lJ!vUOg*;n*m?KJbKy2T6KKn4yK)FeqZ^pr7GfPzspwTf<1+Gx{s@H zGP>)auuEgCl}UBeIIM6y4tvbBAjG=#hGl8P4rfZFdeJ-q5S>f_$t@ed8vHhtIA2-kxQ{iOcuw^V!5qit5`Ea%WvQQ$O+)j9UBkxS@Gaad+zK zML09dR)V!W!d-g%ajpz_#sp`hb(&-lW@{@Arld|)= z7izK2fzIkycsBen)|>5VqJFNg{+X2T=Y15vnL4uciy5?bDEhS|fxXf1E5y?<=e3QN zDPL$+D77;F0fY4~@kdN0q6G*0K0F&Z1vNBdv)4ZJ3NHS@B?|1Pk2R(AsnP34IPe|g1!00ascC}3gawIdQL2s~x{fI-8% z*QG(~s$<;0fer*APEX>PCX+D$LIAJr2E#=>ZU>XBd&v3qdS|_yvYz(w^kceLxoj65 z&eMB(vrT$TkFf$#Vd)zHJ42y+Mk=J7W5H7=!2;LF>Gwx11|qfO?$y^!lBgmCb?m2$pXGsw z*bP3^l#t=>X90rI<`mRS68Tng}<(XYur21K~ID*WZgCKzu`jiql z;>?>PAVm=wDB%R!!jSZf3~``I|1_Wrj0s6HU>hzHZCgo`JrX;qwjG{%|o%L22>#Q1C*FT+c5ss4bYEVJiITc9?f@-1oGc zgzxE%?XC8}4AgPpJqn!Vh|oa$#y^^uYmIw_xvF}40g{*vc+#6LrXJYTpCC?MRwqnY z+4q&uRQWNjzIytSaMKp`H1UPY2Y&=&>-+}|yTr(nq^vT{D994Lk@$Jj1zG_5`fWrDN4?PNvSR_l=_TVp&@-D zJdxb@jHx`Sx+^9nL+4P{<-)4_VRW<1=(E)YL%c(BwTD;eM6rh4P`r}9;bg*GdZ zx5AT&hY4(IXQCuqYuLN@mOMY;FIq0&%BF9qS!j5O$mj?eDLZ7ZX6vuR$Lzn}0-D62 z(N7o`@JZPx;X7-h~$j0Oav$D()?{2kJ+FX&`h*BM$~NYP3)R z%SpnHI&GsUvcx%e(Gu_J*`lPEDUcxCNH7v11IUf=r}PK(UNr(h0@z{nA7AQHzta27 zHK=v83##|2Qx-qHGY|_8BCLS15R7Bjegf=hi4X>MFo3RK^JDSs;Sl6jm@tZwP{GCl zg>g+J6qpB?4*+JuzaFFC1%SHJ+Unl%MWoN@y?4R$RRU;V# zQ?+E}v{@2JK-MH`3xXCUW|}_B$%7Y0zT=i~k-idZc#*!y;3YOOi%B+Uiit3xuu8?I z1T;<>YY7apVE!zf7f|Ql4b=K7rpljinqI~N=jO(hQ`EEIk%|Jx+KNPusR^7L0U!W$ z-KGL6?>-)~edQ-QmzYjtWJGDHohoq|{_(|wpzy3p;}RiUfpW24{OOe_5AB zSQU63&n=MmosBJuh(ZKokK*A+{|+*<=cPY|HQu||`P=MJ;5L>jOAp+d4U`t)Y*M}7 zd{K-wUi0_`*hyE2yckqg4N$9z)+I@GqtiDPogL6o!D-vE_vx=Sd(=i1&hc)HO1>w# z$@=@(BpoaE{%@BazmM8dJ5I98h8Pcrs3%u&0?gx0AT@&u;zc z%s*@g7<8Dd0vRUVN&%*l;)`e;PqjkyTTO%~D?&BX38T?V<@13Mupa}u&G@3;qPTm* zbfl_5C_!#|yx(hdjWMM30I+*`Rd;-NzTU~#Opz{>5<%(cw>(#1_l@RS7B@}Dg9ca` z05!RS1A9Q23sOMN!}D1*WI*)2#4fyqWKY}JP2b)DG;bnNiO(NIt@BT5?j@*o%inR@ zGE-ja{0XdJBx>Ziys{0BpElcojK_&AGu4AAN55Ri{8g7_JRYJNpF@an zzo9I1gt!XsPRer(B2Qny9QD3|z2)y4Fxvv;6M)=d^y`R#+>Mz$QIKb=V)RdV!^|ls z4HTVgWY0pA-T;I?@NJ{v_ulvOs0 zva*^bHdd)3VkkKn4zdV^=RaRG6 zSz23M-zOj=EN@XMtybIFY6dc7Wxr`?4#dw$=KhrU$7 zKW4NW&GcHkl+6UZ_i}tdP?=b;0s=;g&S<U*bg4mb%KYg!Q` zqka0fMKc$EJfnxNFdDjkIt*g`6VJ^!ct~%4rNGM22rycbn!w&WaZ)}t*DN;Xl*{}e zLWE|jpaBFiNz80i|T9PRFZ10rBi!Z!c}|5#zam9GDog>Xh@gW@$; zIomxjz26BizW;9lNJN3Z!6X);2kw6(;f}?1(j<`~LEp*YsX^-h#(DmR&Qyz*PX4tH zrSx7I2m}vef*4U0grVkMg9i{gfM5lYBM2&B-~bvpx&tAGjO-W?g~VncMft0<$TW-~ z{_uvDp)JWxanr(=vomrQpH8vjZp-b?%I0lO>^E^;^>T5FU_Q8Wk$qrIX<1Rd`ng{* z=oB-KkfxrBLrBT|i;0R%__1Rjb1ah@17A{ZLSB05UNOcE#u)F6V}!R?beQx2b&2%> zHb%6>^Z+$vz4JA6r1CVg)5%!c>-UAN1p z+Ipv(D=p^4(13xZsjV?~@IOyUR{i@(vo5~TcuA|?g=H1v^wZVu$-%{+GxP7m$i16y z<=d$EKS@29g+|hJx#nk`fdM;QR&Q)rD>h_)V{F%Qs6+6FJ^ubVnm4lBIFZ z%B6sJWr?k%hp4MX3LdNV)B`|85&4(A}#=) zXsLUyE6t`WXiszTx$q7|4=QK;B8i7(8r$)hn+^7wlO;N$#=tnQ_d8$jG+M>^Ai}&; z3Zui#x;)+7+l=$FX`W9gJJVca8nVrMp0ta)NshA$-(6@veO(tH76yq#Qnn1U03Tiu-5Sdcc%4g z@5ahHgAi8@TQGDXbsW2_KT=3QJSM5F@6A4lH7ja3N0TdTht5({p{8)YFVw*|;K|~Q zr7^S8Y(l-yz@33mUWswXnI?jl&ohZK1om-an=Bz(!bI2CzB(x4G&?4n83WhSmh^is zHW0Ab5S(~Obd&IgtK7k-87x{G5HpBA@7o{`ws^dC_ljBcGDBGB=%}1(2hu4E@%6gj z@4&4jxz?>w^R0GsFFR3tVF(ggPi(-H(JqrIteEf_lvRSD+wJ=4d!s%{7QUf0O$P6V zMeMb+Hd2R!l@L7bMv-)I? zp<;f(&_pCx7rLRmkR}E$0{wWTU;4T*qd_b&pv`?*tw6SK&fd^{a+u9b;Y<9(BY!%w zq++m}euYCOphpZ^2DqeEdPr5YunZ(*iR*(0LKkR=@V8{*@AA#!g+36F6%^ ze0KeW6_1QZmzY5VzGpggQh26RZZo8O6B$r*>q_PRQ(1GfF?E!OF{WK{Cr;I?HyZPy zOR{UJV{ajqgPsEW%5-U&@^P1;rz~4OolaL+I>ymIwJ*kVEp^6ViR#P@>=Vs<&)7-< zn7VEA%Jj;$m2$b(`3AQ==ap}diUz-dJ7jNe+D8pfhu$7!Uc-cqw=G{>!GSj)9h}vY znfONMWq8;?9`Dn_yoj9#HvKD^*fQ?0!)n1`rT>FHEbGjF+Jqxx2_bi`L84KQ>I+*6 z*mjBAczb4>+1FxLyl^fy>ohz~8`b|~;|kcGpm5hzN34GwPT-Y6jN9k2#jyZKt-OG$2R(*n za2)HD`hl{Co__%`<&KG_RyHfQ%HRS}Jah(+3-YAHiN*#nvLH~ZPCuFtj^qTcP7{8` z{u&SF_O)$)lVLO0%_YM;6sPte(Mp?mhx#)Tb@+EdA69Bw*mcpdw332wJQ3kleB%9H zAG!N^FFL;CNj#nRTRZpqRq{Oa{ga=N2jNA0R=?H$+Tkxc0Kl9EiswWSwUqetE}qer z!Axbwat*~LM9*Dpc@tgo?Do*2A;JV>+qf`Eg&3RWHr-WK=q-vrO#v>m09LePKsP~; zBr*9+X0$~6A?pV8;>Al_g)E0s@+>;TP#%C!EV6bZ58@QyaFO*Qz%Rjy>924-`o0yL?fyzX7nAsAvMi_(rB#4m{!Z<4dwjVk&=N-CB$^tw4#C&vvW=~ z%|Q4yBtlgZb5>X^#vU<2XF+4Drfe~=el(Kcpv)_v{ z<+U=S`E^e$fM(8oEC>^|vYxwU@|j}ie0$RSbh5c*9$P>6F=!1g0{7fEZ90wh;2bfc z$=wn0>7~POw8HO3>;l`|vq-Kk-EIK!6A#a-nBOIah2&}7wdx+_-mKc8Sp|VdXLi^d z8LeCFltVwpTJfHc+kRlf{5YI>>e1%TVQnhnMz3_nt9+W!8Qgp?nad*>q2XjSm^bs7 zl+4pNo*MZT&FmpKK>4aDsLYrWQEFwCD6_yqo@cv|;N%8UVV0KU>6@ibm7U9hDtq4rT;F)F_@0CG36Dd$eJ%2KTRM+&OYbp4p4#%Y} zDtA=nw~M7`EZK%>pP2dny5R4VXC=!`8lM&pkI&*=O1Hk-02kEQM#T!`e&<^ z;tS_a>BE#D%RrzrFu%7Pbdcpo2-Lb4N0{}(HosrH-WE`v;+&VoG|lIT%i%SB>m9KC z2@k((*Bc58h1MnFgt|M?k)CbrgMzcoDGdMR+DDc!oFKW4EFVq9yj*Y*l9z{P<`CkG?)r%}T3 zs|D}A(rP!W>=)1Um4T_-Lc%C2?v>0FWzO_Acm&7SS054XyZP0I{uB1XkXQdGnJX{OYm|juJ3r>QFAiK2gJ%Y{8+~;ZFpZd0Dwh;GQb`~ z#>;TYb0|BmPcb}lQ`AJ@h`I4gBEAqsK?xZwU=TxO63c|?+?>}%`Kd16=-tD2dRC@m zad}iHVX5h;7hjXttIunFT;uICW~$~Q=Qppy^!Wp#sgA!ZpNN9okGjnUBfU{?`LP&H zz25f%2NJ9(@<0LjUSs8%ss1}Ku>u-yE=(dQJcqNEtK zu1A5Hbe2w%eU!!K@0Ilbwoxnu4HUN3cmCf^i-!IRKzMMVfTXCbF!X;`ll--J*5knc zO~A{YpHLA-AIJ-^A({bhJ!XjSC)4 z3=12b43$Xz+1ZMc?_ZK$q&CZ1eCmTLaQVQ>)LQ52^!y7)5vx*u_&y6rlQ6#jy)F@f z^xIIbiXffkxcpKNO6AI!eZaSV9vx&O@(+o9Ac3|6BWW zeu|ZSw6}YGfBSd?`mI*QL{|btio!bMA!sP?IR8oq72(K{q$o}F)H;#$L%;wM&u9GZ zc0fY<5dr>ks=gEaaAZoy>68sH-ll(&|9-1&KNpowH7&~?cK6BHe(dX1d=npjb^Tfs zrpElnNS}<$0ue%zrm2~AOt5R{;htq$jXhYMgsZSwW{k5mU(GXHTtMAPb}ZL5O|LXX zj%ZocRq;LWW62*zJ(&4%#FjR_7_DADhW)YXS(_T2@agjrFD(aiYdODPw8FM+`+xKS zuTROV3*s+ZGr;8Vyid#KeQ*EoRzO}@SfX#I+8B+PnVOrNogSiyL}-IQ$c7cs!HclC1Cg&qIjjSai|7Fwi} zv526gGPyiXY>3c-1Phv6iPFHoBQ$C1;NOv|+}lMRJdY~%Jq(skz6UCct@;~5^d8C7 zZDF<0-*M|q{e!|a&i#UM`{n)p?}7Ax9yb>@IZ`CDjg?|CR%xvHjI!UT;|?oE-4d3u zlM>Oea4Fg5Exw*RpOfYc)RJ%bGaw?v0qJkY)ov7ZS}1UKO9(? zSee@xR@c|KIkYr4Rx@yQH*M|hXV&pC^U`y1C#SLwO@BWcXRq)ct{-*gJ-v$babVZ{IZa$(b_Q6J=(n&@1+eEjGB!upEWU1s94as$uvvL&wfjhlssiI0(& zxv!psg^P`kF+C?sUn4s+Hv^l#wt8mcq}`13Y;DSs&N=JI8?XI-yyyp?$L}?-O_z<` z3452jq_VoMi=0c}lSA%lJl%GehY`h%%ctJ==jWHRr@X$fKmWF9M`s*$Zyx;H+h2e0 z`@TNBu%s+~zGA0qFLSqg3#(5{7cN>p=tzFT6*`q@Rk3H*{M~o)+6m6Kstpbo@)Oa5 zMyM#S!q@%(+QR?fQ^)n${CfNHL3=Ul&zx-{$L!L;Js;}cU6Yg6n`_--c#1u4BSxMUeQ52SWwx5q{aiI-jKSmzIy!5Zh4U z7uK?elbXM-sAyH;NImq0*M$G18!ft)k;^4<87%Z>c&xvHaYdb}B53x<+>TnIZYaNa zBGo2xpO-^A*c>E`D*J z*HtTZ6rtc?f2@P8dFvhCPO;W&0((&5$?`k{Tb$jNKYHgqzi!%1KqCO0K<}>J4 zSwO-Dnca(2pDpR+nfNMq5DnJs6KpmiHP!<#&r0@B%yQL@=2@TI_U?I=r!V0d=_X>GX`a$KY zD^PKW_f#w-zQVA2a*G~J?3LQSE8uby>iF1_*hPTD-)tCgiorj)`hfOnE7qh~kLP*z zMDE@tQD`tsUW+Q%Sqp}h;M3zxKDf}En-$!=HY++V`Ap$4_*i=WqOvyGiUpOE$I+FW zSvMc)>wvT3O(1f#&eDXjMSPhANUXBSvn)F(roAh|26!<_?}hF!7i#bB0fCO;6NRUi)o|sk@MA^ z&|TAxjvEKk_zolZDBq$VTnrVjv9+m^0%K@dxSV+`Efu5`!oAc;x;A*+7(#X=d05^} zv_&ay?hjP3HoVw6-(1)4wrym$Fk&4-Z#go#kc4yK;XG*H-dfTA?Qia)4ilL=(`jOn z2-#6Su^FY;$E`GGxyt&umtQhxFueNJ!@P_iA|@y}PdkyrSQ&yW+sAtDjnCxsc&>s% zC7SkFJ>2n0J<1|H<0Ow#R{*DzvO&`Qv)S^8gZ$jj_;k6#;u9^cPdcT_`3D{gD)1jY zDS^yFIZV*Cc2dSmz3{ZGk>wV(TVwL?XBvK}3MK8{>vpG@O{dx}q8!52i3>&-_#bMt z(-O4xi%2}p6v#!r742Wz39aMx)Vjahz2;UMU7qTHEa(6X%?W&6HWNxF3-0f@07*eh)V_RAs zO}vn`EkDcQ{4xn;stWX(%|Dk?!p8Jtc+(_E;hWgaWeFQ(MT-^mZB?Ep2eOoFx1Gt( zf>X^0s*i6=pC5FLg6#~!l=Z)y8zt25AN+J5tB_98qVJVUJjKN#dj}q(%&=+B-Vs-- zMQ)Y&gA!X?i~72Jb>Vo0*C6b=4yrokoRMC$I7tU>%VLi9g#C_w7WxLYq`8@rZaB@7ftP&BQcV$o z)zcE|a@#ixTyZd4+k9B-3f{AbpIcIhWJT{gasbz`5Jg|EK_ph%-S;${V3p5hkbkey zY$uO_AptU}J!XcV`KYLIP*hWLj+P|HY_D0>viOZ4kVcgwPV~#2GMiR+FnQGP8_7!V zkvmOaz#nfjPJS~|rh?LkrZjBWKgLW;WZHRQ-z7ofC%%Be>|(v*!Xi@-&;5$XMlJ#! z5fQONIPjXDv@g0Nyub#_(3FC77t7(%yz?{?+>VKUA$Ym{foTrBCG1(iYt7wMlT}a4dR^=e#Mvb+y44@nFyaBtBsACD%vCLp=jn@h}?IY$WUhV@8bLQ$v z7DG)l7&+cVO^>hyF&MIN+egGgjfL&+=qWbUQo+y!QhNbPTDr{@TWnm|rGR}QWo1Ju z9$T+^=8O(R`zA9tV$JLkw&Z8xhDi1#V=DE;fMgDHyMtxu;qmdri7CN9u`-Nu8xobep7&vNN&Se2)Tw1dbebm)%JHVyG-N^?7zQIDCMX z&|9f25a%QP*yWjTgaq3&Jl1B zZoQheJ0MWFFXk16=7d!jjKeH>d%l(!iVhe8gC7yTRJ!_B+CDruE6KD-e9^E1@;zRt z%4QX2;4?BG2USAsA?i?m5flq$C|I~+k;yzZBZ~k4n?bSg2y6D{>V7=}uT%W&ubE#y z@5lHl{=wCBZ)>8-E%WTK{qkjg+Sr_%v&?F`BA4og$NVXYxq8Cx{EW&eT3a6`Q(^xuKK zDxeaZF9rBiyBIB#&(7azp&6xK^tB`^7!WC~d2QpGD=Ke;v=5(d`b}Y|1*Uaujx4J)XUnRTVxmWLl zzu24%TxRvsp;LO*Vd?Ohyy{1nj`;nfBR~E}=6$KaPkw8E>zw%8n9j+Uy-wBtDC8&N zYXZ?T<6j`axlIS;55NK-4SVUd{7|_o4qy>r1z;Uu3t$&uKj0|f9>7C@Cjid@UICm0yaV_M@CD#Iz%PKm0-OmbKq>&B z@&TyIK-C1QK2VK;YKc^F<<-_)XKQM2R`XiYs@Auq?d|PwCwtde(|zk_YaqF!!XJxr zczgJ-V7plRPLvqzFj)Rr@7!ZmM)CG!KT&}vUO4k-Fz$F1-1G^j^dXk@*os9q5!+Yw zI3!{iS~xn+V(Z1}-*JfDhp>|mR|P_yIVi#N^#UgAfn@v&N*Ig07I&up`FY>LFNx}V z=KGcg1QI`BpuoHyo_*eX_2@!#0Wf^mKDx8c65=+5rGA z%aj1)-G9b*2OW2xM?B>PuQ}~KpZLlTe)CV6fQgEfw?}ViYH91}>X}%!V%3^;8}{rw zaOfOBgb8I_Nae}17q8yD`!M&}f7yZ`zedI;re@|AmR1N8%D4cjw6%?`oxOvjle3Gf zo4bdnm-hnw&pZI|+3<-E-PrEf?5OJ;!M?g&n?}P*!$vt+%>ip}Pd4Dw5!pDLS(3SJ z)_CuV37d5N&$a)*k+eAR{uZ9P5;Hiwqtx!euK#2S**KR}>sFt_ezBW_S1-T9fn z^%lDG>g+$x;(ADpJqNJKL$KkQ&ee544?UY&X%PC|$5RL%qk%KPPx&?~#P@oH+nd&F zjSzGD80N}8S-V_4Ou@P;F3(bi75hvGYu+!&PMg1t7Iv7guQ_!^4!ifU`C;0Qd(G@x z1{u=bO%$`JFm+}PTVQ%oK6M$v(yZ66!n5&TP9W=8`2^8MEt$J2i(JRfq};n>@mT`h zfpde&sia_BYum>8`!xuKl}R~7_lywiG!9CV&OUydk+wzuP57umJa+b!aHH8&(t9+( z`@fX3)@~mAcj4jk^e@JDjOd6a@qA&eZE=XWM&FFLWo{#-ZZbLmlHf1&2H6D|Jk#2w zG~i$7%C-e)a5s731DeElgR?asNwu#R2+YsCHyw~S9rRwClRK5^_e%eXF?&XK$?Q(5 zBky?!6Y*oyr(E6FRJPWvKI0|dWRVljkhOk?JjaTS)kpo!hVq7Afg^oF2D;#!;3;$N z>>-mA$z~rMYRB-~Ogn{G@j1EP?q%cGd=g??*L}rS{M$l2Q}H_2j-fT1ba0P?zG;oJ zfe3j@{uirhlk+5nXMWzepQ-)}Ajfv4tn0+tPXmz`6r0m8xSGiT5QOHs&*vgfgF7~2 zvhCW!E%h>|6oK5J+Nij}Z2}L%Czw!5-0oNpIe#f-&;%p4 zNiDZIzSy{YxK-KA)^?^Q;`nKH;0H12;%1m#{!0@XOsH7Jq6T$C)AZ9Y|;Q>uk~zcCVR z5gIR|cUC$r*<(8_#;&ZO0yVKzSv^M;@`>}Su?PwnjmTOcHNr&+87EciY^aT4At-HUA700cU&k~B{D-J`B>Rn%bVZ znKG0*iN?VcKtI7EvIub)<|Ug`u`}3ih)n4H8sKEGwerbwR+es_7F z(zuLJKegWl0lIssIAK?C5Wi^YK) z(9+Mskzdy8U?CzhDmo@MEMy?^dz^8{8-IccCz^PYmCB@`X2WV1rw2SD0RBEP@9~-_zo?{gf(cf0L5HNnvB({D zB35DPWN#-*=jxO|m+Nu`U8!GEb+v&BbiKiWZZs^=N+a%}n|+c(-Rg_9YJPy!Qc*@n zK>{a99q$?>VEnNfI7W($nVAzian7H3Adx(hnDkfT7@0Q71}VrAtdU)#qh4L_X1FJb znB?1J3K?}D?Co|NF<8oXwzt3qBFK=3d=#Lp09QKOy-!*h)E?0#eI(OqR|bm@>= z95RiejFHA1@Ev{5(q1mej^uHF?MboE0RoVg33tRN-wzR7Uh?wS-~f44P=yEy&1f-W z2O~s;EIIN_v%qm|Py}-2SD1v>BVU5RMnE+UsL|05PLL!i1{h_EB`CJ{7|yq`S{gw= zrGBsDg&9oo)DjCjsk0(Ksk&nK95RpefA)1 z`<(k`SX#v6(;9T5P&%3p$?R1vT*MN z^TwYMtlj3soo@#II5$1X3>PUbF+VOW&fkjYW*vGB7_}$&|L5*pA9A~Y8HuL06O`Rt z{(r8|7pW#!ahAVV-V`;OwCXZobbb1hw<{*iyzf?Rp`71+?{|h#g3w~di7(-OcZ{VZ zd8$Y2gI~{>xWWX>q-ORw0bRi zKZ>7w-@lF$s8HCV&d(AqDJ>HRZ>7wyk{pG~)fj6+wv62Gs|2aC;XGH~YTB$xt1bgZ zecF>>ZZ&VdTeXGaccxz1XY6)BD3$h0NB)eYn@*q=%KwSW!Qcoa3P5A9I6RT`pr_#J zz%P;9TjOYr+#36IysdHeg7abBLa3N@t+BO2f8Tuqch1sEg*98e8L? z_$0Q2K}fuCzj-lTX8*DDLx6D0AMKU)e)XR!5hphI@-yfm21bS z>eN;3>}sR_tGBTx*LA;MvRC(iNiOOEb6@`tvGt&9${RkfgZKU8+a7Xd6+x+}HFejK zHv{$yewM%M*w?I%{jce9m*Ps?fqU>6o|4=<$GZ@MhmHQ(J%;D4e~!9_ij|o7!rtzo z5)eY70%{BmE7fcCTC-L}9lG=w@C@z1Kq~hL2ul%rOR3I5fid1RRE0R&M zOj)w!$dxC*Fxv{(S!P-L|67LQV;}jF?&`TZ4VnHXi6)gLn@o;edGZw~RHRsmQqRPRmmpD65tXdVzyH-8ZX4B?a6dci9AViPw;`_5 zhPphL@5Nwh~~cu4<;r#j;b4m@u@=-6tq$H9+AZ^5$s5xDy&nr{IrjFmgSIN6sRJqcbyXJf@qnk;UTc<~b?jDet9jaqf; zHG17p%)p>TiBU8ii844WEq8zN4=h{Zz+X>|{RjiBA0?Z--obUW=o)E_=dQTM`}kMp zx$5>hXPt1W+7F4+L5Cf+?X^Nhij{corBY?eRdn1*zrFB^2-m7N3@T32N%vI~Dca7z zcNn#)YFGHG1vD~5XXOvjU$g{CwbomI169@@v5vaysk5&7s;Ra*@e(~&&}0oY*3|1b z+R>X@1|%JW#19bHNgk>gu`sCvi7{;qG#0`Qb=<3exEy0Akv8Hq!4r~fX%!<)T`@i0 ztmEDGUi7k89@clrC|_Dx<$`@tna?;Xh(WkO+$3$FE7t0v5$36@UA}(ns~cg5CbzB@ zRm!8emmD`dL5gL_^m_B!5Vh;jsY|yWz54XelvmlsF42>Es)hqH-D0}xp^cTW3)t~# zrbSsyVtV;=jmI9Z9GI%vqH!Zf>Wx*ohlT_cOUB0`;e$CT& z)G}hf{P&XEkF0Xu9vA5Sal=0P~8;p+#Qpyj3^aWV0={X0*c)Mm-q5t0SJ(2GALJ-E!MK6j3o~) zy>CfJm+8uyH*AZBJ$bFJuHlue@v{;X+%nt|=w7f~AYtYTLxj_qh(%x-N{FjpKjzx~ zMOUenNY>R_8cVdB$g=VaiH&X`iP?R%Vp#@^=K=3b<$J-eK+21Km4GwCMnoV!Nm@UR zmCJdAVaP+i6cQmwCM{rsgh^YEo?%)hWzV4W6MFH{^B2= zx=Z_a5Q2dc2$FbySQK-D_HzgjEdMhDpoFTK&14a?FKsMO-F^pFpkn!kL*;_L-@)L9DH@g-*ka-E zz}@c=j5P@NM?_;i;{6H9{(x+(Lq67`n7^UfKQYZKM9!QsJftKKE6*cQVI>3#EuS48Srt3vtJUeUXG?TU_S&iJw-KTI zobn6GFDbWEent5;bX$2&2Hf^-ziq#7JGWii z?k7RzB?$~h0RnJ<2Ld#ygnO`za$TW+6hG@91rx1B2Y>(wKmi7D-~=P$2KY?71_%vf zsTcw|(WMZBZjs&86cV#A%k)b2tsU3S1sMIych&&|M!8ts85OGh0oug%!IYPl(Sw!J z{^zs^NGNC+SU7kDMC3jZauhO&NT6$ujuWLQbS*ZX6v><6SyC#k^fJoq{(GzV@-Rv# z0b6F_BxweLIH>aAxz@b> zn|B$585$+^n%hS)YH9P$*Thttclnf4B%-A(b!kgq#xnQHoBHv7)KB&QdZ~m;SZG9m zz=LSoT?;!GzmTY6r7Bdb)2Ky$gVD=NSGnzV$qxy2ImsO+?`TK<;wFwdcuXUvstljgXzMjaYU20SzezFkP`WhX7MI ztt(;NfsrmIE|-OSv`Wj~>Tq3wKbvZU}|>frDaF z5HUrfPTggp$z{o+Yy}s)_mBb1_-i+9Xv5{mQxf^~P)IS)DdAN*auqRBYc&{2D8+uo8Xtv|j-9PG+g%G4k#0R&N{iFp@6aFOACR zr}t^^TBk>N7bPmp2N!~dvZdT;3}cG)9g$?qoTa^;JL@~96IGV+wNjFuH3V8cVWB<#$g5};0_Sf%S6H55TJWtuf$?3(Vy=W^cbQECP$caO=WatT~2m&KKEW!zY9AveZb%tP}y{967~0T6%$Z~)>c_~!2R z|9qafiY0mXM_A4Oj$LOCuNv!p6W#*(4StbR7tnu^Z<*ZhT#m)6f6POf;RTF8G%x+X z6lIB9-i61MUJu&6KOzwde|Yk3j(^iQ3(tl0&94J6Wp9Bh2VWDw?w|V5k<~c%;6B73 z^1+@@KO7#k%@p?iAAQytS^o1yZB@sIem&n}@`0|Vtmty7n(4|U8t7@k&OCL|tf!G%s_5&LL!{sD6Z5B@ zjolKmE|2vTnO)XT(4Cw}a_YC#YpeI#yiQzO)=6E~ zlY2@}Jv%WjXI|DP_Le@mpE-G)&;zBo(`OV)98&C|(PxlQ{+P&b$z3u&JZ166k_4v# zz9JD|4JcrB0GuXq26JS^UUNZrOy2JDp#}Zd)5oVhV|)gadS;B{edajPXOF=?Yn<#0 zv^z_*Kl$TkUp;R1HRCo`r?YZg>)VG#QeU&^X~z3vr*N2lA)x>82ZII_45*t_voAJZ960kCH3z7< zXLnTi*^0hX(6bFw8!)qxBxWVpL=^j+63awIBGK^v-f+y*9Cwiup5dftlaORW{fE0g z;~s4uk>?4y9%pLPi@DPcYG5;qEw0iPG^qGyHM_wjlvq+_C705iQvZ-mY@WVtEWM1& zY{>KMY3qR&l-a_DHM~Vvw+kCxR!ho$oo+IualLwPN4d~tPZWeXZ{|GE0U zxicUC6MlmA@4rSUQ!L0Hmc5%b7?$OTy~tTFan8$}_X=@dEoLT656#T(bEM9#UX5V# zu`B9F?zH@F#n<#l`eW|;^0>AlA;{Rquo(=V3q5n=FzPlA&-~1oTMpZM#@19W+)YE_ z*nqJUKwFQYb@+OVi{2#Z-7CM$ChxVZEpBb^x32E3-xc;Pk7WX^#Pt1wgjJYZO|`qt zZF(~@u+7cd)unTGZtU9HoG-t*^Q!pjYym5Cy13=tS}!Z>-HtZ2u}ytlLYu$AbGK`2 z+e&Qv9c@iJ{{(ta2INqC+S|VNci``rJ3{MM&=Up9ELc|A<&;}q`4v=nU-olF6<1Pe zWtD%qCsDXV-?PqFQ*CwC*HB}d+wvu!0cxqWw%XhJMW005clrhDZ0D7{(k+J5NK*jF&oH&dfZq=h@5t!almz!FTS}ob;1)5>N8M zyc@6MWS>-$;Y~hiy2E?+fs7do*7NXWaPBTl=E*wQC+EU($9eP?J#cc-Jb5o|x_r9I zZ{x{7*n>L-r|=Y=VsldYeghAlYHFzUK7#?pZ7|^KsHcHOns^Q2vhPr`+IuNVb*!>< z7yfz*S9CTktvjWa*sTu)c2N!r+RbyA5EeELF5be%>O1c~BUp}rkXV`|%MSiu{FdkB3>~Cb)n3Zp~a*mbaaqbn@4bmq)y=oFCTP zGy(U)DCcAtWyW%Pui({o#|4OOhHPtoO-E_-scl@c)U$ytQBKQ2$EB=FR zd*Hr@9w}C;O!<4S*5s&atM`vlNseOOnsV`BPl+e54f<%j^~O^vJZ%x_GNmsvL*~M= zWXyVPy6T?McgZ<$RbBW8b?v%?uEC3N)oiO zw$p_w>^i@#=Nu3>X^zR1zjaP&dww@P+>?14_o#iVb zg@11FLqs~~eUE~M{^m1$o1Qa%f1mpEeIS6~31&&el!%9d^11nFEIxxm-`OwE%YT)q z7%%Z$KK$1qkZoTwRcT*TlmerMjTSC?K{3J?a`euk`9DIF8||8>4Gd+=Vqv-j#fdY>D@ z^+4>8#TC}>;&3CdUGj7vXj|WSH-otCnK0cOJru_hZz92@fLlTB3G8+-F2T8m;I^0C z4ap-E&j4Pbd57T>mTx$I;rU0f=U%|z2}BYZ1{Mw;0TBrq1r-e)0}~4y2Nw_jw|M`Q zkcgOsl#HB$l8Ty!mX4l57^83zOd^?C?(2Spjs1RQR*Mt}TREyKSVP?{G=dSTVw250 zNYxOBf{KQY@f4(%Mq25lrxp4j^z(Ac9y9<9Pfj8W##6XV&+ zV@)~ii@DG%x!R7Oqs8w2#i#!qeBC|V;q~nAPz&Z)fm`tk-u>Qh6Nv5x=E}1m5=%@X zPP_z(k|ax!Dowf!nWVC0lgW`QuP}`Y6e=Oz`XxTPI+k~-8IfKx-Z=9)OrI-<=FPGB zaD2WjESU34;=+=-xD+ncf&ORRyT;|cWOc6~?=@?C!}{K`F)TYH2_=7%Z98P&PB~t# z`0aYdcgr7l+j)B{V(--0do}mJx*Jk&pVi+N4faQq{apf(DntPcK@ki^2@GQk7>y-$j3T=M}peZ(#QBhx)z`Wu|56!=HjEA+nIUxc00 zWbL$AH*MArN$+&nFccf7%ckkEdHQUb0h2Ri&y1K_3g4E)!g5*MLzec4@5|%I9`kcg z_%($=`_msFTY#R0=v#z=#lS5AVJS$k_Ox{yn{)JwVaOTM)A z?!}(()k^mA+Fs6OUG5FP5tn@H9jz?I&Nn|;%7*3G=K{j=s7W}1F2 zGtTT)GtDr|bfws!M1dMPCqIYLsYo~)hC*PDW^h!pW)g6v$U7Z^8V9MU^O0s!&X^vaaANUAuJKpE>8YrCYl;T{?Q4Eo+u- znQU^iWE>U%B;k)g?$~4Q$9z*x=sK}Rq`U9eLP_D)I~1;IBQ|a+OI^~^mcEP)+0bQf z*gCIzHCwRJNb4dF<*aS@euH9RUsqN(QR^lX2W?|2{j2?}+e1dM`-R4SShp2*_l&n6 zq)VTHE=1FT5W#5S*-kgaFJ#s$NmCO8@4W*DNN?$?*Ya4u?if+1oZi^9BQ|{(#dGJ= zj}|>f%viDG#N9K?S+01(Onz4Gl(L;h+qu=Oavug(Q*XOpx z*h6g3u=n7HYdu-;Ka1)xFlm$O+|^=afj`*iK!2OY(sVMOm9?!;4|aWP{K+tJ z*^2n&5KYt^HIl-6>8ZbRpcBxY7Fl}pkJ98Dg2Sgo=K<)koNDY&sMr5diU(sycIdnZ zdI7ij1Oj-80fb1-rvV0aEFO$aK26Qj1YaC2c0MO>-i=w2*h(HxcEU2AZ8>JOz7)Y; zk7>TE-m(bO(u4^MJcuQL+x{wwwyEstB*nU-cS#56FqW(s2ZEdpNTidT1564+1k3BO zU~4PkED~50-901c0E;G*vyPj)Mir_Uqi1*Ad2xgZUz8_};oi88X39rY6538>%hjEn zELT`OyXj2l6jF0-Ex;yR-I;)47QoSR>9`4y$BJH0ksETxMSx2QSgBY?|7>bh#6|Qh zx!hdl`Hk^7ajSqY;%#r}Meu2OeGz~KffZH8deLG`E>57WWP*B2T4*>BP_rtBajSFs z4Joe6(wJZY>eZ@t0R%{yUYhbMOd@$_KHv6%5;jJLps3CRr35)k2=uxx^;TjrQ*H~U zV2Nv>jH28eSlZ(;o;MriRWuHZQi~QS=bOFM?0ufEQu44LfeOCaPH%P(u+E=Lt1?!y zK^eZUtuURDOQZq<)Cu+2@}FQi2huj_VBJd1a1N};(Y1)BCA`(qeCk~lLN}{l;j9H- z$&ObAUfkr1^FlNLHb(@m36b{GnfO2z*IF3FUZR3UEy%M-+F+lf3Uc{fv9*p$0gK~p zt#Tp3>K%6_2ddei>Q11B4SA)u80;w~!eSvRHg(0JzPL0LkH+G^sHq<0BcNIFeQ5c4 zw3us*A)lHgmZYK0kJN!4S&zI&(WC5X?osuiee3RkmN5IH|6Qnf*37=%nJc!XRXNi- z*8bcWh#u%8V5GE?7phhtSQ{3+l7!K0z~q{}q>V8eJ6*F#Z4fBe(P9;!vbk33uB>lB z8`rR8uss6CP?Uk%|5)pvpZC-rwAM7c9WYaaRlP{Kqng` zReMdnRv?e+Gq1)aD@(pAwdo&cMl4QU)41mB?SO?qEi8Y)@;yoE&dJ!;q+x^!S<7to znqa5=tZCS8Nqq9XIXzBN0s2m$i)#I{? zs=7~Jx*t#c=4ukG#FqYJ23}dB{(>Ba7A+0y=<+O;*9vT}kDdqw473q00C_gHIyeWP zY7W@+pOQ1MldQpp2Lbz`3OtL&Q%ismcuF|T1;VS=Y$lz04d&gRcFrY-W^Oa^t&Ud% zFLjb{^r~JV^34RC+*5K3FMYG8dYT)TTr~9-`)JFZq#^gskfwJ6?nB3HMR+j%t8ee^ zuz+F>)?vlS6as}v>XW|+EcF-=z@tmEECkk~X;7aal-8TKuWP)VGKS%QidE!+=+L#8 zgS8({UuS)mj}wN_bRY9)y{%LobafK}qb4y=?S7&O-sMb>IRa$SBG@%Ro|?2ThoO$n z7lbdNc46wZ93{xDeWVM;CKq09M7s$|Gn4{he$4Nc}^oP?I zSe)na=$80{<3>{bWM5xE0N4MgxBM&bUxcE@Um*Pf%4&jq{S5#61T=d;$3 zG_&XE(+aqLB}eTwjnTqlH5)nnU!=@C>QoGy@2Wtl_M3PiSz2d_P$x!w1vJU_OQA)J zUIW>KaIJ|q0hXw(4WViqa-^bfHIyD`xrwO8cLV?+Uux$zYC6cNkqIPN`VA0gI z$VrYf+v|@$_!Mh80^#8pxc`SJ+r(jVC)PVHc;wK79oE9gcpTn`76Vg(lzbHlSq|B; z7oxd%k86tV7N7a{xS-&bfSlAM{1pBoUQAX}#+&d4PzfWT9w%6t^~5;{$qVy zewYHaL0llUHw`aFB}_wA=|G}vh}<2QnTP8b6`G(o1q0<{^ErpgNzy>LH>^Bgx{O2h z3K$bA#Ycqak!uF)Y)ceX6j&f(?KTi+WpW7swYV)1RktPQ-s`PF>!)^n^i{onUv{NB zWg@+KScB-~IrG-D;!%{ts@Pm41DQ_y7eXok<&5GIyR6CmnW(UD!5G($R$MRpJ)J;o zzU%k#6JXfIPFohX$5I|eeN%XJ>JaDQ(i3UIBiPlTS%oyB@oh`dz2P3%RP_1=JsY^` z3>l_j}stx)8?}T79?yZ+m)O zwAZbd|J$Y6zcgwW1i>S(;*)SxP}MJoz0ynMl~dAXlU;PBn^q1cT47-4rJ*=gDIU6~ zsR)`BjPQzrdaa}dx^F^ktJ62SQ)775S{jkWC=ib2a?Qt1!yV&#;P8TsGH#479VxCH zEJ1vY?!pjkdr5v0Any{gM-syTSTrIQ&^RsCyA?pWv=q$1iUNgAb|{?!$Grxk9^gw|oDN=3kErB!oGvv$SBi{Vs%*(ArxdNU}Jy zR2#Mda;PyCu8^4X{eXe-@BLNucuWm z5%c@}a*ufW-D&vt_{ZYz_FE6HVi#ltv13~tcrtI5^azYL@UV;4r;U4Q|FTE_cg~Pi z{SBX*r$6D}UW9{Qo6v&=0(GF3(OibCGT14afrq2GovC`f1n-broH)nW<1B#INa_k&XM1#%{==0YSF%v9L)@R z&Xddb+jxv9g|sM*t`EgD5se732Xs2A>W1qgXd#8W-Qz@l3C~*|8bjFFA@(^cl+q>*J$9BL8sj*hKesGiz3-?DhX?Ps zy-9?d7!kB7G&^U=&Z)n>@%eSUzP43kcL)(6AtywE=nbDndWo6uVWA2{7f}r_Be~LB zZa0_18K!6|;f<+PhcrK%$336q&sGR*A;D{A$F2(wrD1`*xe$Brz zSFQI;-}NMRqUPo?jc=P-I1GDf>ky|J2p8qX{&p3#N@PRyK9IyIeJP9w6S~e{)hd z`xKmP#HYW(Tu$;{>Q``-t?by0HSlu#bDoH&t=BoXV0ICqf9Si%zKcDbXWOo_s=>W|nM6w{!UkM)DG!*bSU7-*F+OvkP-Z znmKQhhs!RZ!&icFst|jG6{Rh(0dGn%mx-MQNmAHLdhQOdJ4@3xVveN+*OG;T0jz-p zsZ|C60$$PYE;Lv`Cu0f^tU6x^c5|hoYGIPXS-^ZNeRe12fAjDj)Q-ha9iL>(HqPQ~ z0t7|Ca8$8%n0B2%8sV5FUz$CeY=eWU=)C0&o2X?G2-KG=OQ{Gg0b-o_+fK49+JqQ7 zv;BFq*;X?>=(K~-S?UpJ|!TaH+m7W;&#|^}5$Z~J8;O)S9AgZAh zuIxV#$JtPQ-IxUroy|+z&Zl+k@Wu64Aa-YGcE2~37rTyf5L(2hhtI>g-!!WoA3uMo zd?6OG78VV7awY6u{CMX$bunlkkIbSKKNFVyf^Y3Rn;H|M^Jrv60U@!z-F{bZzI<%d zW%9H2o?n=$+)a%6dSQwsVkw4y76nFMhv(x?+Cpsq8`+ZYn?_(%cnRBK==%qk81%6C ziXO}zzKw!NScGWxOnD)vN{uZ1K~9XF#{FL1QHtaQgcyTBH~|4ctU^R`fYca4I*^Xp zdAuAdb+IhNirUr$vAhI zWSp3sMSK8eJrfdmNt8@bEei8AGYDt-l7yU)altuez)(+Zxn^bVjU`QQz!=TLVjwTH zxW?U(1Kg)s(ltE>M3Z(avAe?VDtBc>4~Mp`l(C_(iA{hUrdt;y0kk^yjAU?SvJn+q zcP51A5^4dG`!beoZ@yq3X+ufVg&bT3DXg&LL)?QL{_r^y#B74^C7bQnx7~7SYZ(|L z147!&7FjCw1PD>j69TA|p0h_~R!+r>s*)}yk-DUM$d{vz$QO16Nj?SfOs%MzUW!@a zP#{6&)H4Nu)`hmA6n@VuYvTyVF@`y@eYE3I1$ACVvSjcl|88<6?zmiMpqRiunjyA#K9_O>?N3pwi z`?k#pVhm3@bZ}cIz}4%XY!DC#^y8DaTrPDoT|fTew*H8#6@LG&@5~TZ(2gb;y3w3V zGPKbL8MP9ty7pG7q=SAdB%izSW

x{o9f|7gEmo2*wv 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 z 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≶M9Zv|5`G?V+t`dH%WEMXqpk;_3Hk#c)5bow}^>GHdOg=@5pYx=49b13Ly zrJynzDRebu8rnRSaDCBo@|9g53n?-Toj%;)7@=UY|Noy}Ma{<^CTZW`I9PGat{6t2 zaDw4J3oUfqrNwG{*q4kXjQO#)d%E?I`6unq0@g?R`EPa45Y|xpiRX?D^@^QqfPjrp z`1!tA9;wNGs_VH%HtUBo8*1_;v~g)avtfdTTKYQ+w|_T@R1|@!z4MWbhw@XQ#{r8n zFBZwGL~*S&Epds65DN=S9LDmC%OD``N?Ja3mq@-KYHmwkg<5GJXlu`C1U~hF;}GUt zEV_svDDRB0pxY;h0iVB6!+t9MoPjoUN2{tnNvmp71!_;3|F6OefCDX3EgVYSHa&Y~ zU}M_~aPglu-?Am;VW9ar%IVbGkq@`{Tq5wAt!;iU^4x0?c1udN{X&%ux4V&|KJ4W8 z^-G%6%-Mk6r|NGgPt?6Gz6|&!zRxhaV4(F`GZ8rK4j__!PX?Q7^;*CQ1mh5%DvR6C z?e!IxGMT8~xw^^9NiPO6=pQ@SRODn~Fsq8jD|VmScW#=CFmzog>dWa9ISWyD>bX6* zxnZ#2TwN0;af`pj^X|5h-UR+^#wtJ!B@tKiK!pf5VjK5!fZLt zzX!?qwZ#;g@k9fI%Zc#zkaZg@VAO57d!5O3Ue&0UhOx8iALeb!OI zRvYFgz{G^aMMxIXA9Q8%Ks(ns{Ng8LwsDMRXV9_!HbeTZg#-D*^A&&kWc>8s7s|rI z=ynSoO>Z_is~m>%blt}gX#It_>e2=$ntV|mjceXzzfgYM^uWLH4|qn@T1Vx$y+(mB zr_oTl_0pJ8ZR}4L)pN;gX0*r7gHMr7oprWF%6?*dA?da-61JtJNHWwP^#36TIN#Kl zHX65H`VqI9GB?_ee-?H!Yb?FpyYadu!+UaImNKBnpF_sZf6ay)B7}^R1hodXNP?eK z4UhCNG=>^Ra(w)t-DekO(;#W^pCZ0-I00f84I3?O?7O zB%x)J$UIIl{lRxlFHDbkes}4Xh27aeZ@lufb-e26$_f|NxU&YtVUJG#2x>BxrM_VU z1LCx!(BL?8gDF{Vq$J)xNc>yL)$=)7I*g|%)(&0-;j8CsUSvGa_^S6DVMpH zb8v0T>G{!ohHICj*>1fftNM+zZtws0KCZLv(IK>C_QT1EH@fD(8$2iPv~!>Y4cV!P zSZxtr!>L43HPE+4<>ftO;-5eywKK$aj&E__@NZF$Ub2O545&GURXRcHZf+@4Q*sxY zWp376swn?@b?YH5czxG41HZOjt)n5ymnfWVn}~l0v!W9f09Qb$zl@4>j!2BD$PIWy zG%tHq1co&qIS~ddbB3;u@9Dn~xdsYnr5s8^`W*i3m@VDEnOB&F?o#)Rs5v1eUah$w>#9 z(>0sd(bH1S1!0KMO_Fm9-(30B*tAvEi!I8bj@kN6Z10~`=5`eh*Oh@TSgc~GARo=W z<9@k$y19A1xpq3jbDRG4LD38!4XW&4?>FThiiaoIiVSTRo?|YzPPb-muv!>myEIOW zt#-bt4&U((ZdDWewL`sy(~|m2`BN@QF+Q{|G9ZCrd6ta$KC*E*TQ_G)_3NXw*H*CY zbEL^@$wN>XGaLNe4bu&0*GJMUg5zS=CN)LQyqHShcMq=mcw_4h9+%ozHC=V~`$%?N z`DWW#&TppMgR}4%!g!nK9J8-_y1Mk=F&oUrC@E68`W@5@I(HpHbiw(p1ld9~Keub^ z`qq-^lE(GMES@?`16xSt_yAA?b$A0;omip zd;&xiYAZP+=TTDO@|)ZHN*1!_{_wQ@i@zy5-UG{`HCbB7dqN5AgmRL@R~5 z-KAmZe7J3gow^U;9@e_R+QBj&j{H=={FCM3!&hwmwI9#NDh>OjBmRdo%0A!wRKaXY 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 + +
    +

    Registering a signer

    +

    The AccountManager keeps track of which signer is associated with a given sender address. This is used by AlgorandClient to automatically sign transactions by that sender. Any of the methods within AccountManager that return an account will automatically register the signer with the sender.

    +

    There are two methods that can be used for this, set_signer_from_account, which takes any number of account based objects that combine signer and sender (TransactionSignerAccount | SigningAccount | LogicSigAccount | MultisigAccount), or set_signer which takes the sender address and the TransactionSigner:

    +
    algorand.account
    +  .set_signer_from_account(TransactionSignerAccount(your_address, your_signer))
    +  .set_signer_from_account(SigningAccount.new_account())
    +  .set_signer_from_account(
    +    LogicSigAccount(algosdk.transaction.LogicSigAccount(program, args))
    +  )
    +  .set_signer_from_account(
    +    MultisigAccount(
    +      MultisigMetadata(
    +        version = 1,
    +        threshold = 1,
    +        addresses = ["ADDRESS1...", "ADDRESS2..."]
    +      ),
    +      [account1, account2]
    +    )
    +  )
    +  .set_signer("SENDERADDRESS", transaction_signer)
    +
    +
    +
    +
    +

    Default signer

    +

    If you want to have a default signer that is used to sign transactions without a registered signer (rather than throwing an exception) then you can set_default_signer:

    +
    algorand.account.set_default_signer(my_default_signer)
    +
    +
    +
    +
    +

    Get a signer

    +

    AlgorandClient will automatically retrieve a signer when signing a transaction, but if you need to get a TransactionSigner externally to do something more custom then you can get_signer for a given sender address:

    +
    signer = algorand.account.get_signer("SENDER_ADDRESS")
    +
    +
    +

    If there is no signer registered for that sender address it will either return the default signer (if registered) or throw an exception.

    +
    +
    +

    Accounts

    +

    In order to get/register accounts for signing operations you can use the following methods on AccountManager (expressed here as algorand.account to denote the syntax via an AlgorandClient):

      -
    • Using the LocalNet default account (LocalNet only) OR

    • -
    • Loading an account from DISPENSER_MNEMONIC

    • +
    • from_environment - Registers and returns an account with private key loaded by convention based on the given name identifier - either by idempotently creating the account in KMD or from environment variable via process.env['{NAME}_MNEMONIC'] and (optionally) process.env['{NAME}_SENDER'] (if account is rekeyed)

      +
        +
      • This allows you to have powerful code that will automatically create and fund an account by name locally and when deployed against TestNet/MainNet will automatically resolve from environment variables, without having to have different code

      • +
      • Note: fund_with allows you to control how many Algo are seeded into an account created in KMD

    • +
    • from_mnemonic - Registers and returns an account with secret key loaded by taking the mnemonic secret

    • +
    • multisig - Registers and returns a multisig account with one or more signing keys loaded

    • +
    • rekeyed - Registers and returns an account representing the given rekeyed sender/signer combination

    • +
    • random - Returns a new, cryptographically randomly generated account with private key loaded

    • +
    • from_kmd - Returns an account with private key loaded from the given KMD wallet (identified by name)

    • +
    • logicsig - Returns an account that represents a logic signature

    -

    If working with a LocalNet instance, there are some additional functions that rely on a KMD service being exposed:

    +
    +

    Underlying account classes

    +

    While TransactionSignerAccount is the main class used to represent an account that can sign, there are underlying account classes that can underpin the signer within the transaction signer account.

      -
    • create_kmd_wallet_account, get_kmd_wallet_account or get_or_create_kmd_wallet_account: These functions allow retrieving a KMD wallet account by name,

    • -
    • get_localnet_default_account: Gets default localnet account that is funded with algos

    • +
    • TransactionSignerAccount - A default class conforming to TransactionSignerAccountProtocol that holds an address and a signer

    • +
    • SigningAccount - An abstraction around algosdk.Account that supports rekeyed accounts

    • +
    • LogicSigAccount - An abstraction around algosdk.LogicSigAccount and algosdk.LogicSig that supports logic sig signing. Exposes access to the underlying algosdk algosdk.transaction.LogicSigAccount object instance via lsig property.

    • +
    • MultisigAccount - An abstraction around algosdk.MultisigMetadata, algosdk.makeMultiSigAccountTransactionSigner, algosdk.multisigAddress, algosdk.signMultisigTransaction and algosdk.appendSignMultisigTransaction that supports multisig accounts with one or more signers present. Exposes access to the underlying algosdk algosdk.transaction.Multisig object instance via multisig property.

    • +
    +
    +
    +

    Dispenser

    +
      +
    • dispenser_from_environment - Returns an account (with private key loaded) that can act as a dispenser from environment variables, or against default LocalNet if no environment variables present

    • +
    • localnet_dispenser - Returns an account with private key loaded that can act as a dispenser for the default LocalNet dispenser account

    +
    +

    Rekey account

    +

    One of the unique features of Algorand is the ability to change the private key that can authorise transactions for an account. This is called rekeying.

    +
    +

    [!WARNING] +Rekeying should be done with caution as a rekey transaction can result in permanent loss of control of an account.

    +
    +

    You can issue a transaction to rekey an account by using the rekey_account function:

    +
      +
    • account: string | TransactionSignerAccount - The account address or signing account of the account that will be rekeyed

    • +
    • rekeyTo: string | TransactionSignerAccount - The account address or signing account of the account that will be used to authorise transactions for the rekeyed account going forward. If a signing account is provided that will now be tracked as the signer for account in the AccountManager instance.

    • +
    • An options object, which has:

      + +
    • +
    +

    You can also pass in rekeyTo as a common transaction parameter to any transaction.

    +
    +

    Examples

    +
    # Basic example (with string addresses)
     
    +algorand.account.rekey_account({
    +  account: "ACCOUNTADDRESS",
    +  rekey_to: "NEWADDRESS",
    +})
     
    -           
    -
    -
    +# Basic example (with signer accounts) -
    +algorand.account.rekey_account({ + account: account1, + rekey_to: new_signer_account, +}) -
    -

    © Copyright 2023, Algorand Foundation.

    -
    +# Advanced example - Built with Sphinx using a - theme - provided by Read the Docs. - +algorand.account.rekey_account({ + account: "ACCOUNTADDRESS", + rekey_to: "NEWADDRESS", + lease: "lease", + note: "note", + first_valid_round: 1000, + validity_window: 10, + extra_fee: AlgoAmount.from_micro_algos(1000), + static_fee: AlgoAmount.from_micro_algos(1000), + # Max fee doesn't make sense with extra_fee AND static_fee + # already specified, but here for completeness + max_fee: AlgoAmount.from_micro_algos(3000), + max_rounds_to_wait_for_confirmation: 5, + suppress_log: True, +}) -
    + +# Using a rekeyed account + +Note: if a signing account is passed into `algorand.account.rekey_account` then you don't need to call `rekeyed_account` to register the new signer + +rekeyed_account = algorand.account.rekey_account(account, new_account) +# rekeyed_account can be used to sign transactions on behalf of account... + + +
    +
    +
    +

    KMD account management

    +

    When running LocalNet, you have an instance of the Key Management Daemon, which is useful for:

    +
      +
    • Accessing the private key of the default accounts that are pre-seeded with Algo so that other accounts can be funded and it’s possible to use LocalNet

    • +
    • Idempotently creating new accounts against a name that will stay intact while the LocalNet instance is running without you needing to store private keys anywhere (i.e. completely automated)

    • +
    +

    The KMD SDK is fairly low level so to make use of it there is a fair bit of boilerplate code that’s needed. This code has been abstracted away into the KmdAccountManager class.

    +

    To get an instance of the KmdAccountManager class you can access it from AlgorandClient via algorand.account.kmd or instantiate it directly (passing in a ClientManager):

    +
    from algokit_utils import KmdAccountManager
    +
    +kmd_account_manager = KmdAccountManager(client_manager)
    +
    +
    +

    The methods that are available are:

    +
      +
    • get_wallet_account - Returns an Algorand signing account with private key loaded from the given KMD wallet (identified by name).

    • +
    • get_or_create_wallet_account - Gets an account with private key loaded from a KMD wallet of the given name, or alternatively creates one with funds in it via a KMD wallet of the given name.

    • +
    • get_localnet_dispenser_account - Returns an Algorand account with private key loaded for the default LocalNet dispenser account (that can be used to fund other accounts)

    • +
    +
    # Get a wallet account that seeded the LocalNet network
    +default_dispenser_account = kmd_account_manager.get_wallet_account(
    +    "unencrypted-default-wallet",
    +    lambda a: a["status"] != "Offline" and a["amount"] > 1_000_000_000
    +)
    +# Same as above, but dedicated method call for convenience
    +localnet_dispenser_account = kmd_account_manager.get_localnet_dispenser_account()
    +# Idempotently get (if exists) or create (if it doesn't exist yet) an account by name using KMD
    +# if creating it then fund it with 2 ALGO from the default dispenser account
    +new_account = kmd_account_manager.get_or_create_wallet_account(
    +  "account1",
    +  AlgoAmount.from_algos(2)
    +)
    +# This will return the same account as above since the name matches
    +existing_account = kmd_account_manager.get_or_create_wallet_account(
    +  "account1"
    +)
    +
    +
    +

    Some of this functionality is directly exposed from AccountManager, which has the added benefit of registering the account as a signer so they can be automatically used to sign transactions when using via AlgorandClient:

    +
    # Get and register LocalNet dispenser
    +localnet_dispenser = algorand.account.localnet_dispenser()
    +# Get and register a dispenser by environment variable, or if not set then LocalNet dispenser via KMD
    +dispenser = algorand.account.dispenser_from_environment()
    +# Get an account from KMD idempotently by name. In this case we'll get the default dispenser account
    +dispenser_via_kmd = algorand.account.from_kmd('unencrypted-default-wallet', lambda a: a.status != 'Offline' and a.amount > 1_000_000_000)
    +# Get / create and register account from KMD idempotently by name
    +fresh_account_via_kmd = algorand.account.kmd.get_or_create_wallet_account('account1', AlgoAmount.from_algos(2))
    +
    +
    +
    + + + + + + + - - - + + + + + \ No newline at end of file diff --git a/docs/html/capabilities/algorand-client.html b/docs/html/capabilities/algorand-client.html new file mode 100644 index 00000000..5c7680af --- /dev/null +++ b/docs/html/capabilities/algorand-client.html @@ -0,0 +1,598 @@ + + + + + + + + + Algorand client - algokit-utils-py 3.0 documentation + + + + + + + + + + + + + + + + + Contents + + + + + + Menu + + + + + + + + Expand + + + + + + Light mode + + + + + + + + + + + + + + Dark mode + + + + + + + Auto light/dark, in light mode + + + + + + + + + + + + + + + Auto light/dark, in dark mode + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +Skip to content + + + +
    +
    +
    + +
    + +
    +
    + +
    + +
    +
    + +
    +
    +
    + + + + + Back to top + +
    + +
    + +
    + +
    +
    +
    +

    Algorand client

    +

    AlgorandClient is a client class that brokers easy access to Algorand functionality. It’s the default entrypoint into AlgoKit Utils functionality.

    +

    The main entrypoint to the bulk of the functionality in AlgoKit Utils is the AlgorandClient class, most of the time you can get started by typing AlgorandClient. and choosing one of the static initialisation methods to create an algokit_utils.algorand.AlgorandClient, e.g.:

    +
    # Point to the network configured through environment variables or
    +#  if no environment variables it will point to the default LocalNet
    +#  configuration
    +algorand = AlgorandClient.from_environment()
    +# Point to default LocalNet configuration
    +algorand = AlgorandClient.default_localnet()
    +# Point to TestNet using AlgoNode free tier
    +algorand = AlgorandClient.testnet()
    +# Point to MainNet using AlgoNode free tier
    +algorand = AlgorandClient.mainnet()
    +# Point to a pre-created algod client
    +algorand = AlgorandClient.from_clients(algod=algod)
    +# Point to pre-created algod, indexer and kmd clients
    +algorand = AlgorandClient.from_clients(algod=algod, indexer=indexer, kmd=kmd)
    +# Point to custom configuration for algod
    +algorand = AlgorandClient.from_config(algod_config=algod_config)
    +# Point to custom configuration for algod, indexer and kmd
    +algorand = AlgorandClient.from_config(
    +    algod_config=algod_config,
    +    indexer_config=indexer_config,
    +    kmd_config=kmd_config
    +)
    +
    +
    +
    +

    Accessing SDK clients

    +

    Once you have an AlgorandClient instance, you can access the SDK clients for the various Algorand APIs via the algorand.client property.

    +
    algorand = AlgorandClient.default_localnet()
    +
    +algod_client = algorand.client.algod
    +indexer_client = algorand.client.indexer
    +kmd_client = algorand.client.kmd
    +
    +
    +
    +
    +

    Accessing manager class instances

    +

    The AlgorandClient has a number of manager class instances that help you quickly use intellisense to get access to advanced functionality.

    +
      +
    • AccountManager via algorand.account, there are also some chainable convenience methods which wrap specific methods in AccountManager:

      +
        +
      • algorand.setDefaultSigner(signer) -

      • +
      • algorand.setSignerFromAccount(account) -

      • +
      • algorand.setSigner(sender, signer)

      • +
      +
    • +
    • AssetManager via algorand.asset

    • +
    • ClientManager via algorand.client

    • +
    +
    +
    +

    Creating and issuing transactions

    +

    AlgorandClient exposes a series of methods that allow you to create, execute, and compose groups of transactions (all via the TransactionComposer).

    +
    +

    Creating transactions

    +

    You can compose a transaction via algorand.create_transaction., which gives you an instance of the algokit_utils.transactions.AlgorandClientTransactionCreator class. Intellisense will guide you on the different options.

    +

    The signature for the calls to send a single transaction usually look like:

    +
    algorand.create_transaction.{method}(params=TxnParams(...), send_params=SendParams(...)) -> Transaction:
    +
    +
    +
      +
    • TxnParams is a union type that can be any of the Algorand transaction types, exact dataclasses can be imported from algokit_utils and consist of:

      +
        +
      • AppCallParams,

      • +
      • AppCreateParams,

      • +
      • AppDeleteParams,

      • +
      • AppUpdateParams,

      • +
      • AssetConfigParams,

      • +
      • AssetCreateParams,

      • +
      • AssetDestroyParams,

      • +
      • AssetFreezeParams,

      • +
      • AssetOptInParams,

      • +
      • AssetOptOutParams,

      • +
      • AssetTransferParams,

      • +
      • OfflineKeyRegistrationParams,

      • +
      • OnlineKeyRegistrationParams,

      • +
      • PaymentParams,

      • +
      +
    • +
    • SendParams is a typed dictionary exposing setting to apply during send operation:

      +
        +
      • max_rounds_to_wait_for_confirmation: int | None - The number of rounds to wait for confirmation. By default until the latest lastValid has past.

      • +
      • suppress_log: bool | None - Whether to suppress log messages from transaction send, default: do not suppress.

      • +
      • populate_app_call_resources: bool | None - Whether to use simulate to automatically populate app call resources in the txn objects. Defaults to Config.populateAppCallResources.

      • +
      • cover_app_call_inner_transaction_fees: bool | None - Whether to use simulate to automatically calculate required app call inner transaction fees and cover them in the parent app call transaction fee

      • +
      +
    • +
    +

    The return type for the ABI method call methods are slightly different:

    +
    algorand.createTransaction.app{call_type}_method_call(params=MethodCallParams(...), send_params=SendParams(...)) -> BuiltTransactions
    +
    +
    +

    MethodCallParams is a union type that can be any of the Algorand method call types, exact dataclasses can be imported from algokit_utils and consist of:

    +
      +
    • AppCreateMethodCallParams,

    • +
    • AppCallMethodCallParams,

    • +
    • AppDeleteMethodCallParams,

    • +
    • AppUpdateMethodCallParams,

    • +
    +

    Where BuiltTransactions looks like this:

    +
    @dataclass(frozen=True)
    +class BuiltTransactions:
    +    transactions: list[algosdk.transaction.Transaction]
    +    method_calls: dict[int, Method]
    +    signers: dict[int, TransactionSigner]
    +
    +
    +

    This signifies the fact that an ABI method call can actually result in multiple transactions (which in turn may have different signers), that you need ABI metadata to be able to extract the return value from the transaction result.

    +
    +
    +

    Sending a single transaction

    +

    You can compose a single transaction via algorand.send..., which gives you an instance of the algokit_utils.transactions.AlgorandClientTransactionSender class. Intellisense will guide you on the different options.

    +

    Further documentation is present in the related capabilities:

    + +

    The signature for the calls to send a single transaction usually look like:

    +

    algorand.send.{method}(params=TxnParams, send_params=SendParams) -> SingleSendTransactionResult

    +
      +
    • To get intellisense on the params, use your IDE’s intellisense keyboard shortcut (e.g. ctrl+space).

    • +
    • TxnParams is a union type that can be any of the Algorand transaction types, exact dataclasses can be imported from algokit_utils.

    • +
    • algokit_utils.transactions.SendParams a typed dictionary exposing setting to apply during send operation.

    • +
    • algokit_utils.transactions.SendSingleTransactionResult is all of the information that is relevant when sending a single transaction to the network

    • +
    +

    Generally, the functions to immediately send a single transaction will emit log messages before and/or after sending the transaction. You can opt-out of this by sending suppressLog: true.

    +
    +
    +

    Composing a group of transactions

    +

    You can compose a group of transactions for execution by using the new_group() method on AlgorandClient and then use the various .add_{Type}() methods on TransactionComposer to add a series of transactions.

    +
    result = (algorand
    +    .new_group()
    +    .add_payment(
    +        PaymentParams(
    +            sender="SENDERADDRESS",
    +            receiver="RECEIVERADDRESS",
    +            amount=1_000_000 # 1 Algo in microAlgos
    +        )
    +    )
    +    .add_asset_opt_in(
    +        AssetOptInParams(
    +            sender="SENDERADDRESS",
    +            asset_id=12345
    +        )
    +    )
    +    .send())
    +
    +
    +

    new_group() returns a new TransactionComposer instance, which can also return the group of transactions, simulate them and other things.

    +
    +
    +

    Transaction parameters

    +

    To create a transaction you instantiate a relevant Transaction parameters dataclass from algokit_utils.transactions import * or from algokit_utils import PaymentParams, AssetOptInParams, etc.

    +

    All transaction parameters share the following common base parameters:

    +
      +
    • sender: str - The address of the account sending the transaction.

    • +
    • signer: algosdk.TransactionSigner | TransactionSignerAccount | None - The function used to sign transaction(s); if not specified then an attempt will be made to find a registered signer for the given sender or use a default signer (if configured).

    • +
    • rekey_to: string | None - Change the signing key of the sender to the given address. Warning: Please be careful with this parameter and be sure to read the official rekey guidance.

    • +
    • note: bytes | str | None - Note to attach to the transaction. Max of 1000 bytes.

    • +
    • lease: bytes | str | None - Prevent multiple transactions with the same lease being included within the validity window. A lease enforces a mutually exclusive transaction (useful to prevent double-posting and other scenarios).

    • +
    • Fee management

      +
        +
      • static_fee: AlgoAmount | None - The static transaction fee. In most cases you want to use extra_fee unless setting the fee to 0 to be covered by another transaction.

      • +
      • extra_fee: AlgoAmount | None - The fee to pay IN ADDITION to the suggested fee. Useful for covering inner transaction fees.

      • +
      • max_fee: AlgoAmount | None - Throw an error if the fee for the transaction is more than this amount; prevents overspending on fees during high congestion periods.

      • +
      +
    • +
    • Round validity management

      +
        +
      • validity_window: int | None - How many rounds the transaction should be valid for, if not specified then the registered default validity window will be used.

      • +
      • first_valid_round: int | None - Set the first round this transaction is valid. If left undefined, the value from algod will be used. We recommend you only set this when you intentionally want this to be some time in the future.

      • +
      • last_valid_round: int | None - The last round this transaction is valid. It is recommended to use validity_window instead.

      • +
      +
    • +
    +

    Then on top of that the base type gets extended for the specific type of transaction you are issuing. These are all defined as part of TransactionComposer and we recommend reading these docs, especially when leveraging either populate_app_call_resources or cover_app_call_inner_transaction_fees.

    +
    +
    +

    Transaction configuration

    +

    AlgorandClient caches network provided transaction values for you automatically to reduce network traffic. It has a set of default configurations that control this behaviour, but you have the ability to override and change the configuration of this behaviour:

    +
      +
    • algorand.set_default_validity_window(validity_window) - Set the default validity window (number of rounds from the current known round that the transaction will be valid to be accepted for), having a smallish value for this is usually ideal to avoid transactions that are valid for a long future period and may be submitted even after you think it failed to submit if waiting for a particular number of rounds for the transaction to be successfully submitted. The validity window defaults to 10, except localnet environments where it’s set to 1000.

    • +
    • algorand.set_suggested_params(suggested_params, until?) - Set the suggested network parameters to use (optionally until the given time)

    • +
    • algorand.set_suggested_params_timeout(timeout) - Set the timeout that is used to cache the suggested network parameters (by default 3 seconds)

    • +
    • algorand.get_suggested_params() - Get the current suggested network parameters object, either the cached value, or if the cache has expired a fresh value

    • +
    +
    +
    +
    + +
    +
    + +
    + +
    +
    + + + + + \ No newline at end of file diff --git a/docs/html/capabilities/amount.html b/docs/html/capabilities/amount.html new file mode 100644 index 00000000..b4bfb9bc --- /dev/null +++ b/docs/html/capabilities/amount.html @@ -0,0 +1,457 @@ + + + + + + + + + Algo amount handling - algokit-utils-py 3.0 documentation + + + + + + + + + + + + + + + + + Contents + + + + + + Menu + + + + + + + + Expand + + + + + + Light mode + + + + + + + + + + + + + + Dark mode + + + + + + + Auto light/dark, in light mode + + + + + + + + + + + + + + + Auto light/dark, in dark mode + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +Skip to content + + + +
    +
    +
    + +
    + +
    +
    + +
    + +
    +
    + +
    +
    +
    + + + + + Back to top + +
    + +
    + +
    + +
    +
    +
    +

    Algo amount handling

    +

    Algo amount handling is one of the core capabilities provided by AlgoKit Utils. It allows you to reliably and tersely specify amounts of microAlgo and Algo and safely convert between them.

    +

    Any AlgoKit Utils function that needs an Algo amount will take an AlgoAmount object, which ensures that there is never any confusion about what value is being passed around. Whenever an AlgoKit Utils function calls into an underlying algosdk function, or if you need to take an AlgoAmount and pass it into an underlying algosdk function (per the modularity principle) you can safely and explicitly convert to microAlgo or Algo.

    +

    To see some usage examples check out the automated tests. Alternatively, you can see the reference documentation for AlgoAmount.

    +
    +

    AlgoAmount

    +

    The AlgoAmount class provides a safe wrapper around an underlying amount of microAlgo where any value entering or existing the AlgoAmount class must be explicitly stated to be in microAlgo or Algo. This makes it much safer to handle Algo amounts rather than passing them around as raw numbers where it’s easy to make a (potentially costly!) mistake and not perform a conversion when one is needed (or perform one when it shouldn’t be!).

    +

    To import the AlgoAmount class you can access it via:

    +
    from algokit_utils import AlgoAmount
    +
    +
    +
    +

    Creating an AlgoAmount

    +

    There are a few ways to create an AlgoAmount:

    +
      +
    • Algo

      +
        +
      • Constructor: AlgoAmount(algo=10)

      • +
      • Static helper: AlgoAmount.from_algo(10)

      • +
      +
    • +
    • microAlgo

      +
        +
      • Constructor: AlgoAmount(micro_algo=10_000)

      • +
      • Static helper: AlgoAmount.from_micro_algo(10_000)

      • +
      +
    • +
    +
    +
    +

    Extracting a value from AlgoAmount

    +

    The AlgoAmount class has properties to return Algo and microAlgo:

    +
      +
    • amount.algo - Returns the value in Algo as a python Decimal object

    • +
    • amount.micro_algo - Returns the value in microAlgo as an integer

    • +
    +

    AlgoAmount will coerce to an integer automatically (in microAlgo) when using int(amount), which allows you to use AlgoAmount objects in comparison operations such as < and >= etc.

    +

    You can also call str(amount) or use an AlgoAmount directly in string interpolation to convert it to a nice user-facing formatted amount expressed in microAlgo.

    +
    +
    +

    Additional Features

    +

    The AlgoAmount class supports arithmetic operations:

    +
      +
    • Addition: amount1 + amount2

    • +
    • Subtraction: amount1 - amount2

    • +
    • Comparison operations: <, <=, >, >=, ==, !=

    • +
    +

    Example:

    +
    amount1 = AlgoAmount(algo=1)
    +amount2 = AlgoAmount(micro_algo=500_000)
    +total = amount1 + amount2  # Results in 1.5 Algo
    +
    +
    +
    +
    +
    + +
    +
    + +
    + +
    +
    + + + + + \ No newline at end of file diff --git a/docs/html/capabilities/app-client.html b/docs/html/capabilities/app-client.html index 66da78e7..3a8b717e 100644 --- a/docs/html/capabilities/app-client.html +++ b/docs/html/capabilities/app-client.html @@ -1,285 +1,745 @@ - - - - + + + + + + - - App client — algokit-utils 1.0 documentation - - - + + App client and App factory - algokit-utils-py 3.0 documentation + + + + + + + + + + + + + - -
    - + +
    + +
    +
    +
    + + + + + Back to top + +
    + +
    + +
    + +
    +
    +
    +

    App client and App factory

    +
    +

    [!NOTE] +This page covers the untyped app client, but we recommend using typed clients (coming soon), which will give you a better developer experience with strong typing specific to the app itself.

    +
    +

    App client and App factory are higher-order use case capabilities provided by AlgoKit Utils that builds on top of the core capabilities, particularly App deployment and App management. They allow you to access high productivity application clients that work with ARC-56 and ARC-32 application spec defined smart contracts, which you can use to create, update, delete, deploy and call a smart contract and access state data for it.

    +
    +

    [!NOTE] +If you are confused about when to use the factory vs client the mental model is: use the client if you know the app ID, use the factory if you don’t know the app ID (deferred knowledge or the instance doesn’t exist yet on the blockchain) or you have multiple app IDs

    +
    +
    +

    AppFactory

    +

    The AppFactory is a class that, for a given app spec, allows you to create and deploy one or more app instances and to create one or more app clients to interact with those (or other) app instances.

    +

    To get an instance of AppFactory you can use AlgorandClient via algorand.get_app_factory:

    +
    # Minimal example
    +factory = algorand.get_app_factory(
    +    app_spec="{/* ARC-56 or ARC-32 compatible JSON */}",
    +)
    +
    +# Advanced example
    +factory = algorand.get_app_factory(
    +    app_spec=parsed_arc32_or_arc56_app_spec,
    +    default_sender="SENDERADDRESS",
    +    app_name="OverriddenAppName",
    +    version="2.0.0",
    +    compilation_params={
    +        "updatable": True,
    +        "deletable": False,
    +        "deploy_time_params": { "ONE": 1, "TWO": "value" },
    +    }
    +)
    +
    +
    +
    +
    +

    AppClient

    +

    The AppClient is a class that, for a given app spec, allows you to manage calls and state for a specific deployed instance of an app (with a known app ID).

    +

    To get an instance of AppClient you can use either AlgorandClient or instantiate it directly:

    +
    # Minimal examples
    +app_client = AppClient.from_creator_and_name(
    +    app_spec="{/* ARC-56 or ARC-32 compatible JSON */}",
    +    creator_address="CREATORADDRESS",
    +    algorand=algorand,
    +)
     
    -    
    +app_client = AppClient( + AppClientParams( + app_spec="{/* ARC-56 or ARC-32 compatible JSON */}", + app_id=12345, + algorand=algorand, + ) +) -
    -
    -
    - -
    +app_client = AppClient.from_network( + app_spec="{/* ARC-56 or ARC-32 compatible JSON */}", + algorand=algorand, +) + +# Advanced example +app_client = AppClient( + AppClientParams( + app_spec=parsed_app_spec, + app_id=12345, + algorand=algorand, + app_name="OverriddenAppName", + default_sender="SENDERADDRESS", + approval_source_map=approval_teal_source_map, + clear_source_map=clear_teal_source_map, + ) +) +
    -
    -
    - -
    -

    App client

    -

    Application client that works with ARC-0032 application spec defined smart contracts (e.g. via Beaker).

    -

    App client is a high productivity application client that works with ARC-0032 application spec defined smart contracts, which you can use to create, update, delete, deploy and call a smart contract and access state data for it.

    -

    To see some usage examples check out the automated tests.

    -
    -

    Design

    -

    The design for the app client is based on a wrapper for parsing an ARC-0032 application spec and wrapping the App deployment functionality and corresponding design.

    +

    You can access app_id, app_address, app_name and app_spec as properties on the AppClient.

    -
    -

    Creating an application client

    -

    There are two key ways of instantiating an ApplicationClient:

    -
      -
    1. By app ID - When needing to call an existing app by app ID or unconditionally create a new app. -The signature ApplicationClient(algod_client, app_spec, app_id=..., ...) requires:

      +
      +

      Dynamically creating clients for a given app spec

      +

      The AppFactory allows you to conveniently create multiple AppClient instances on-the-fly with information pre-populated.

      +

      This is possible via two methods on the app factory:

        -
      • algod_client: An AlgodClient

      • -
      • app_spec: An ApplicationSpecification

      • -
      • app_id: The app_id of an existing application, or 0 if creating a new app

      • +
      • factory.get_app_client_by_id(app_id, ...) - Returns a new AppClient for an app instance of the given ID. Automatically populates app_name, default_sender and source maps from the factory if not specified.

      • +
      • factory.get_app_client_by_creator_and_name(creator_address, app_name, ...) - Returns a new AppClient, resolving the app by creator address and name using AlgoKit app deployment semantics. Automatically populates app_name, default_sender and source maps from the factory if not specified.

      -
    2. -
    3. By creator and app name - When needing to deploy or find an app associated with a specific creator account and app name. -The signature ApplicationClient(algod_client, app_spec, creator=..., indexer=..., app_lookup) requires:

      +
      app_client1 = factory.get_app_client_by_id(app_id=12345)
      +app_client2 = factory.get_app_client_by_id(app_id=12346)
      +app_client3 = factory.get_app_client_by_id(
      +    app_id=12345,
      +    default_sender="SENDER2ADDRESS"
      +)
      +
      +app_client4 = factory.get_app_client_by_creator_and_name(
      +    creator_address="CREATORADDRESS"
      +)
      +app_client5 = factory.get_app_client_by_creator_and_name(
      +    creator_address="CREATORADDRESS",
      +    app_name="NonDefaultAppName"
      +)
      +app_client6 = factory.get_app_client_by_creator_and_name(
      +    creator_address="CREATORADDRESS",
      +    app_name="NonDefaultAppName",
      +    ignore_cache=True,  # Perform fresh indexer lookups
      +    default_sender="SENDER2ADDRESS"
      +)
      +
      +
      +
    +
    +

    Creating and deploying an app

    +

    Once you have an app factory you can perform the following actions:

      -
    • algod_client: An AlgodClient

    • -
    • app_spec: An ApplicationSpecification

    • -
    • creator: The address or Account of the creator of the app for which to search for the deployed app under

    • -
    • indexer:

    • -
    • app_lookup: Optional if an indexer is provided,

    • -
    • app_name: An overridden name to identify the contract with, otherwise contract.name is used from the app spec

    • +
    • factory.send.bare.create(...) - Signs and sends a transaction to create an app and returns the result of that call and an AppClient instance for the created app

    • +
    • factory.deploy(...) - Uses the creator address and app name pattern to find if the app has already been deployed or not and either creates, updates or replaces that app based on the deployment rules (i.e. it’s an idempotent deployment) and returns the result of the deployment and an AppClient instance for the created/updated/existing app.

    - -
-

Both approaches also allow specifying the following parameters that will be used as defaults for all application calls:

+
+

See API docs for details on parameter signatures.

+
+
+

Create

+

The create method is a wrapper over the app_create (bare calls) and app_create_method_call (ABI method calls) methods, with the following differences:

    -
  • signer: TransactionSigner to sign transactions with.

  • -
  • sender: Address to use for transaction signing, will be derived from the signer if not provided.

  • -
  • suggested_params: Default SuggestedParams to use, will use current network suggested params by default

  • +
  • You don’t need to specify the approval_program, clear_state_program, or schema because these are all specified or calculated from the app spec

  • +
  • sender is optional and if not specified then the default_sender from the AppFactory constructor is used

  • +
  • deploy_time_params, updatable and deletable can be passed in to control deploy-time parameter replacements and deploy-time immutability and permanence control. Note these are consolidated under the compilation_params TypedDict, see API docs for details.

-

Both approaches also allow specifying a mapping of template values via the template_values parameter, this will be used before compiling the application to replace any -TMPL_ variables that may be in the TEAL. The TMPL_UPDATABLE and TMPL_DELETABLE variables used in some AlgoKit templates are handled by the deploy method, but should be included if -using create or update directly.

+
# Use no-argument bare-call
+result, app_client = factory.send.bare.create()
+
+# Specify parameters for bare-call and override other parameters
+result, app_client = factory.send.bare.create(
+    params=AppClientBareCallParams(
+        args=[bytes([1, 2, 3, 4])],
+        static_fee=AlgoAmount.from_microalgos(3000),
+        on_complete=OnComplete.OptIn,
+    ),
+    compilation_params={
+        "deploy_time_params": {
+            "ONE": 1,
+            "TWO": "two",
+        },
+        "updatable": True,
+        "deletable": False,
+    }
+)
+
+# Specify parameters for ABI method call
+result, app_client = factory.send.create(
+    AppClientMethodCallParams(
+        method="create_application",
+        args=[1, "something"]
+    )
+)
+
+
+
-
-

Calling methods on the app

-

There are various methods available on ApplicationClient that can be used to call an app:

+
+

Updating and deleting an app

+

Deploy method aside, the ability to make update and delete calls happens after there is an instance of an app created via AppClient. The semantics of this are no different than other calls, with the caveat that the update call is a bit different since the code will be compiled when constructing the update params and the update calls thus optionally takes compilation parameters (compilation_params) for deploy-time parameter replacements and deploy-time immutability and permanence control.

+
+
+

Calling the app

+

You can construct a params object, transaction(s) and sign and send a transaction to call the app that a given AppClient instance is pointing to.

+

This is done via the following properties:

    -
  • call: Used to call methods with an on complete action of no_op

  • -
  • create: Used to create an instance of the app, by using an app_id of 0, includes the approval and clear programs in the call

  • -
  • update: Used to update an existing app, includes the approval and clear programs in the call, and is called with an on complete action of update_application

  • -
  • delete: Used to remove an existing app, is called with an on complete action of delete_application

  • -
  • opt_in: Used to opt in to an existing app, is called with an on complete action of opt_in

  • -
  • close_out: Used to close out of an existing app, is called with an on complete action of opt_in

  • -
  • clear_state: Used to unconditionally close out from an app, calls the clear program of an app

  • +
  • app_client.params.{method}(params) - Params for an ABI method call

  • +
  • app_client.params.bare.{method}(params) - Params for a bare call

  • +
  • app_client.create_transaction.{method}(params) - Transaction(s) for an ABI method call

  • +
  • app_client.create_transaction.bare.{method}(params) - Transaction for a bare call

  • +
  • app_client.send.{method}(params) - Sign and send an ABI method call

  • +
  • app_client.send.bare.{method}(params) - Sign and send a bare call

-
-

Specifying which method

-

All methods for calling an app that support ABI methods (everything except clear_state) take a parameter call_abi_method which can be used to specify which method to call. -The method selected can be specified explicitly, or allow the client to infer the method where possible, supported values are:

+

Where {method} is one of:

    -
  • None: The default value, when None is passed the client will attempt to find any ABI method or bare method that is compatible with the provided arguments

  • -
  • False: Indicates that an ABI method should not be used, and instead a bare method call is made

  • -
  • True: Indicates that an ABI method should be used, and the client will attempt to find an ABI method that is compatible with the provided arguments

  • -
  • str: If a string is provided, it will be interpreted as either an ABI signature specifying a method, or as an ABI method name

  • -
  • algosdk.abi.Method: The specified ABI method will be called

  • -
  • ABIReturnSubroutine: Any type that has a method_spec function that returns an algosd.abi.Method

  • +
  • update - An update call

  • +
  • opt_in - An opt-in call

  • +
  • delete - A delete application call

  • +
  • clear_state - A clear state call (note: calls the clear program and only applies to bare calls)

  • +
  • close_out - A close-out call

  • +
  • call - A no-op call (or other call if on_complete is specified to anything other than update)

+
call1 = app_client.send.update(
+    AppClientMethodCallParams(
+        method="update_abi",
+        args=["string_io"],
+    ),
+    compilation_params={"deploy_time_params": deploy_time_params}
+)
+
+call2 = app_client.send.delete(
+    AppClientMethodCallParams(
+        method="delete_abi",
+        args=["string_io"]
+    )
+)
+
+call3 = app_client.send.opt_in(
+    AppClientMethodCallParams(method="opt_in")
+)
+
+call4 = app_client.send.bare.clear_state()
+
+transaction = app_client.create_transaction.bare.close_out(
+    AppClientBareCallParams(
+        args=[bytes([1, 2, 3])]
+    )
+)
+
+params = app_client.params.opt_in(
+    AppClientMethodCallParams(method="optin")
+)
+
+
-
-

ABI arguments

-

ABI arguments are passed as python keyword arguments e.g. to pass the ABI parameter name for the ABI method hello the following syntax is used client.call("hello", name="world")

-
-
-

Transaction Parameters

-

All methods for calling an app take an optional transaction_parameters argument, with the following supported parameters:

+
+

Funding the app account

+

Often there is a need to fund an app account to cover minimum balance requirements for boxes and other scenarios. There is an app client method that will do this for you via fund_app_account(params).

+

The input parameters are:

    -
  • signer: The TransactionSigner to use on the call. This overrides any signer specified on the client

  • -
  • sender: The address of the sender to use on the call, must be able to be signed for by the signer. This overrides any sender specified on the client

  • -
  • suggested_params: SuggestedParams to use on the call. This overrides any suggested_params specified on the client

  • -
  • note: Note to include in the transaction

  • -
  • lease: Lease parameter for the transaction

  • -
  • boxes: A sequence of boxes to use in the transaction, this is a list of (app_index, box_name) tuples [(0, "box_name"), (0, ...)]

  • -
  • accounts: Account references to include in the transaction

  • -
  • foreign_apps: Foreign apps to include in the transaction

  • -
  • foreign_assets: Foreign assets to include in the transaction

  • -
  • on_complete: The on complete action to use for the transaction, only available when using call or create

  • -
  • extra_pages: Additional pages to allocate when calling create, by default a sufficient amount will be calculated based on the current approval and clear. This can be overridden, if more is required -for a future update

  • +
  • A FundAppAccountParams object, which has the same properties as a payment transaction except receiver is not required and sender is optional (if not specified then it will be set to the app client’s default sender if configured).

-

Parameters can be passed as one of the dataclasses CommonCallParameters, OnCompleteCallParameters, CreateCallParameters (exact type depends on method used)

-
client.call("hello", transaction_parameters=algokit_utils.OnCompleteCallParameters(signer=...))
+

Note: If you are passing the funding payment in as an ABI argument so it can be validated by the ABI method then you’ll want to get the funding call as a transaction, e.g.:

+
result = app_client.send.call(
+    AppClientMethodCallParams(
+        method="bootstrap",
+        args=[
+            app_client.create_transaction.fund_app_account(
+                FundAppAccountParams(
+                    amount=AlgoAmount.from_microalgos(200_000)
+                )
+            )
+        ],
+        box_references=["Box1"]
+    )
+)
 
-

Alternatively, parameters can be passed as a dictionary e.g.

-
client.call("hello", transaction_parameters={"signer":...})
+

You can also get the funding call as a params object via app_client.params.fund_app_account(params).

+
+
+

Reading state

+

AppClient has a number of mechanisms to read state (global, local and box storage) from the app instance.

+
+

App spec methods

+

The ARC-56 app spec can specify detailed information about the encoding format of state values and as such allows for a more advanced ability to automatically read state values and decode them as their high-level language types rather than the limited int / bytes / str ability that the generic methods give you.

+

You can access this functionality via:

+
    +
  • app_client.state.global_state.{method}() - Global state

  • +
  • app_client.state.local_state(address).{method}() - Local state

  • +
  • app_client.state.box.{method}() - Box storage

  • +
+

Where {method} is one of:

+
    +
  • get_all() - Returns all single-key state values in a dict keyed by the key name and the value a decoded ABI value.

  • +
  • get_value(name) - Returns a single state value for the current app with the value a decoded ABI value.

  • +
  • get_map_value(map_name, key) - Returns a single value from the given map for the current app with the value a decoded ABI value. Key can either be bytes with the binary value of the key value on-chain (without the map prefix) or the high level (decoded) value that will be encoded to bytes for the app spec specified key_type

  • +
  • get_map(map_name) - Returns all map values for the given map in a key=>value dict. It’s recommended that this is only done when you have a unique prefix for the map otherwise there’s a high risk that incorrect values will be included in the map.

  • +
+
values = app_client.state.global_state.get_all()
+value = app_client.state.local_state("ADDRESS").get_value("value1")
+map_value = app_client.state.box.get_map_value("map1", "mapKey")
+map_dict = app_client.state.global_state.get_map("myMap")
 
-
-
-

Composing calls

-

If multiple calls need to be made in a single transaction, the compose_ method variants can be used. All these methods take an AtomicTransactionComposer as their first argument. -Once all the calls have been added to the ATC, it can then be executed. For example:

-
from algokit_utils import ApplicationClient
-from algosdk.atomic_transaction_composer import AtomicTransactionComposer
+
+

Generic methods

+

There are various methods defined that let you read state from the smart contract app:

+
    +
  • get_global_state() - Gets the current global state using algorand.app.get_global_state.

  • +
  • get_local_state(address: str) - Gets the current local state for the given account address using algorand.app.get_local_state.

  • +
  • get_box_names() - Gets the current box names using algorand.app.get_box_names.

  • +
  • get_box_value(name) - Gets the current value of the given box using algorand.app.get_box_value.

  • +
  • get_box_value_from_abi_type(name) - Gets the current value of the given box from an ABI type using algorand.app.get_box_value_from_abi_type.

  • +
  • get_box_values(filter) - Gets the current values of the boxes using algorand.app.get_box_values.

  • +
  • get_box_values_from_abi_type(type, filter) - Gets the current values of the boxes from an ABI type using algorand.app.get_box_values_from_abi_type.

  • +
+
global_state = app_client.get_global_state()
+local_state = app_client.get_local_state("ACCOUNTADDRESS")
 
-client = ApplicationClient(...)
-atc = AtomicTransactionComposer()
-client.compose_call(atc, "hello", name="world")
-... # additional compose calls
+box_name: BoxReference = BoxReference(app_id=app_client.app_id, name="my-box")
+box_name2: BoxReference = BoxReference(app_id=app_client.app_id, name="my-box2")
 
-response = client.execute_atc(atc)
+box_names = app_client.get_box_names()
+box_value = app_client.get_box_value(box_name)
+box_values = app_client.get_box_values([box_name, box_name2])
+box_abi_value = app_client.get_box_value_from_abi_type(
+  box_name,
+  algosdk.ABIStringType
+)
+box_abi_values = app_client.get_box_values_from_abi_type(
+  [box_name, box_name2],
+  algosdk.ABIStringType
+)
 
-
-

Reading state

-

There are various methods defined that let you read state from the smart contract app:

-
    -
  • get_global_state - Gets the current global state of the app

  • -
  • get_local_state - Gets the current local state for the given account address

  • -
-

Handling logic errors and diagnosing errors

-

Often when calling a smart contract during development you will get logic errors that cause an exception to throw. This may be because of a failing assertion, a lack of fees, -exhaustion of opcode budget, or any number of other reasons.

+

Handling logic errors and diagnosing errors

+

Often when calling a smart contract during development you will get logic errors that cause an exception to throw. This may be because of a failing assertion, a lack of fees, exhaustion of opcode budget, or any number of other reasons.

When this occurs, you will generally get an error that looks something like: TransactionPool.Remember: transaction {TRANSACTION_ID}: logic eval error: {ERROR_MESSAGE}. Details: pc={PROGRAM_COUNTER_VALUE}, opcodes={LIST_OF_OP_CODES}.

-

The information in that error message can be parsed and when combined with the source map from compilation you can expose debugging -information that makes it much easier to understand what’s happening.

-

When an error is thrown then the resulting error that is re-thrown will be a LogicError, which has the following fields:

+

The information in that error message can be parsed and when combined with the source map from compilation you can expose debugging information that makes it much easier to understand what’s happening. The ARC-56 app spec, if provided, can also specify human-readable error messages against certain program counter values and further augment the error message.

+

The app client and app factory automatically provide this functionality for all smart contract calls. They also expose a function that can be used for any custom calls you manually construct and need to add into your own try/catch expose_logic_error(e: Error, is_clear: bool = False).

+

When an error is thrown then the resulting error that is re-thrown will be a LogicError, which has the following fields:

    -
  • logic_error: Original exception

  • -
  • program: Program source (if available)

  • -
  • source_map: Source map used (if available)

  • -
  • transaction_id: Transaction ID of failing transaction

  • -
  • message: The error message

  • -
  • line_no: The line number in the TEAL program that

  • -
  • traces: A list of Trace objects providing additional insights on simulation when debug mode is active.

  • +
  • logic_error: Exception - The original logic error exception

  • +
  • logic_error_str: str - The string representation of the logic error

  • +
  • program: str - The TEAL program source code

  • +
  • source_map: AlgoSourceMap | None - The source map if available

  • +
  • transaction_id: str - The transaction ID that triggered the error

  • +
  • message: str - Combined error message with debugging information

  • +
  • pc: int - The program counter value where error occurred

  • +
  • traces: list[SimulationTrace] | None - Simulation traces if debug enabled

  • +
  • line_no: int | None - The line number in the TEAL source code

  • +
  • lines: list[str] - The TEAL program split into individual lines

-

The function trace() will provide a formatted output of the surrounding TEAL where the error occurred.

-
-

Note

-

The extended information will only show if the Application Client has a source map. This will occur if:

-

1.) The ApplicationClient instance has already called, create, updateordeployOR 2.)template_valuesare provided when creating the ApplicationClient, so a SourceMap can be obtained automatically OR 3.)approval_source_maponApplicationClienthas been set from a previously compiled approval program OR 4.) A source map has been exported/imported usingexport_source_map/import_source_map`”””

-
-
-

Debug Mode and traces Field

-

When debug mode is active, the LogicError will contain a field named traces. This field will include raw simulate execution traces, providing a detailed account of the transaction simulation. These traces are crucial for diagnosing complex issues and are automatically included in all application client calls when debug mode is active.

-
-

Note

-

Remember to enable debug mode (config.debug = True) to include raw simulate execution traces in the LogicError.

+

Note: This information will only show if the app client / app factory has a source map. This will occur if:

+
    +
  • You have called create, update or deploy

  • +
  • You have called import_source_maps(source_maps) and provided the source maps (which you can get by calling export_source_maps() after variously calling create, update, or deploy and it returns a serialisable value)

  • +
  • You had source maps present in an app factory and then used it to create an app client (they are automatically passed through)

  • +
+

If you want to go a step further and automatically issue a simulated transaction and get trace information when there is an error when an ABI method is called you can turn on debug mode:

+
config.configure(debug=True)
+
+

If you do that then the exception will have the traces property within the underlying exception will have key information from the simulation within it and this will get populated into the led.traces property of the thrown error.

+

When this debug flag is set, it will also emit debugging symbols to allow break-point debugging of the calls if the project root is also configured.

+
+

Default arguments

+

If an ABI method call specifies default argument values for any of its arguments you can pass in None for the value of that argument for the default value to be automatically populated.

- -
+ +
+ + -
+ + + - - - + + + + + \ No newline at end of file diff --git a/docs/html/capabilities/app-deploy.html b/docs/html/capabilities/app-deploy.html index aa7cb064..41643e84 100644 --- a/docs/html/capabilities/app-deploy.html +++ b/docs/html/capabilities/app-deploy.html @@ -1,105 +1,332 @@ - - - - + + + + + + - - App deployment — algokit-utils 1.0 documentation - - - + + App deployment - algokit-utils-py 3.0 documentation + + + + + + + + + + + + + - -
- - -
+
+ -
-
-
- -
+
+ +
+ +
+
+
+ + + + + Back to top + +
+ -
-
- -
-

App deployment

-

Idempotent (safely retryable) deployment of an app, including deploy-time immutability and permanence control and TEAL template substitution

-

App deployment is a higher-order use case capability provided by AlgoKit Utils that builds on top of the core capabilities, -particularly App management. It allows you to idempotently (with safe retryability) deploy an app, including deploy-time immutability and permanence control and -TEAL template substitution.

+
+ +
+ +
+
+
+

App deployment

+

AlgoKit contains advanced smart contract deployment capabilities that allow you to have idempotent (safely retryable) deployment of a named app, including deploy-time immutability and permanence control and TEAL template substitution. This allows you to control the smart contract development lifecycle of a single-instance app across multiple environments (e.g. LocalNet, TestNet, MainNet).

+

It’s optional to use this functionality, since you can construct your own deployment logic using create / update / delete calls and your own mechanism to maintaining app metadata (like app IDs etc.), but this capability is an opinionated out-of-the-box solution that takes care of the heavy lifting for you.

+

App deployment is a higher-order use case capability provided by AlgoKit Utils that builds on top of the core capabilities, particularly App management.

To see some usage examples check out the automated tests.

-
-

Design

-

The architecture design behind app deployment is articulated in an architecture decision record. -While the implementation will naturally evolve over time and diverge from this record, the principles and design goals behind the design are comprehensively explained.

+
+

Smart contract development lifecycle

+

The design behind the deployment capability is unique. The architecture design behind app deployment is articulated in an architecture decision record. While the implementation will naturally evolve over time and diverge from this record, the principles and design goals behind the design are comprehensively explained.

Namely, it described the concept of a smart contract development lifecycle:

  1. Development

    @@ -128,120 +355,262 @@

    App deployment
  2. Deploy-time parameters can be provided and substituted into a TEAL Template by convention (by replacing TMPL_{KEY})

  3. -
  4. Contracts can be built by any smart contract framework that supports ARC-0032 and -ARC-0004 (Beaker or otherwise), which also means the deployment language can be -different to the development language e.g. you can deploy a Python smart contract with TypeScript for instance

  5. -
  6. There is explicit control of the immutability (updatability / upgradeability) and permanence (deletability) of the smart contract, which can be varied per environment to allow for easier -development and testing in non-MainNet environments (by replacing TMPL_UPDATABLE and TMPL_DELETABLE at deploy-time by convention, if present)

  7. -
  8. Contracts are resolvable by a string “name” for a given creator to allow automated determination of whether that contract had been deployed previously or not, but can also be resolved by ID -instead

  9. +
  10. Contracts can be built by any smart contract framework that supports ARC-56 and ARC-32, which also means the deployment language can be different to the development language e.g. you can deploy a Python smart contract with TypeScript for instance

  11. +
  12. There is explicit control of the immutability (updatability / upgradeability) and permanence (deletability) of the smart contract, which can be varied per environment to allow for easier development and testing in non-MainNet environments (by replacing TMPL_UPDATABLE and TMPL_DELETABLE at deploy-time by convention, if present)

  13. +
  14. Contracts are resolvable by a string “name” for a given creator to allow automated determination of whether that contract had been deployed previously or not, but can also be resolved by ID instead

  15. +

    This design allows you to have the same deployment code across environments without having to specify an ID for each environment. This makes it really easy to apply continuous delivery practices to your smart contract deployment and make the deployment process completely automated.

-
-

Finding apps by creator

-

There is a method algokit.get_creator_apps(creatorAccount, indexer), which performs a series of indexer lookups that return all apps created by the given creator. These are indexed by the name it -was deployed under if the creation transaction contained the following payload in the transaction note field:

-
ALGOKIT_DEPLOYER:j{name:string, version:string, updatable?:boolean, deletable?:boolean}
+
+

AppDeployer

+

The AppDeployer is a class that is used to manage app deployments and deployment metadata.

+

To get an instance of AppDeployer you can use either AlgorandClient via algorand.appDeployer or instantiate it directly (passing in an AppManager, AlgorandClientTransactionSender and optionally an indexer client instance):

+
from algokit_utils.app_deployer import AppDeployer
+
+app_deployer = AppDeployer(app_manager, transaction_sender, indexer)
 
-

Any creation transactions or update transactions are then retrieved and processed in chronological order to result in an AppLookup object

-

Given there are a number of indexer calls to retrieve this data it’s a non-trivial object to create, and it’s recommended that for the duration you are performing a single deployment -you hold a value of it rather than recalculating it. Most AlgoKit Utils functions that need it will also take an optional value of it that will be used in preference to retrieving a -fresh version.

-
-

Deploying an application

-

The method that performs the deployment logic is the instance method ApplicationClient.deploy. It performs an idempotent (safely retryable) deployment. It will detect if the app already -exists and if it doesn’t it will create it. If the app does already exist then it will:

+
+

Deployment metadata

+

When AlgoKit performs a deployment of an app it creates metadata to describe that deployment and includes this metadata in an ARC-2 transaction note on any creation and update transactions.

+

The deployment metadata is defined in AppDeployMetadata, which is an object with:

    -
  • Detect if the app has been updated (i.e. the logic has changed) and either fail or perform either an update or a replacement based on the deployment configuration.

  • -
  • Detect if the app has a breaking schema change (i.e. more global or local storage is needed than was originally requested) and either fail or perform a replacement based on the -deployment configuration.

  • +
  • name: str - The unique name identifier of the app within the creator account

  • +
  • version: str - The version of app that is / will be deployed; can be an arbitrary string, but we recommend using semver

  • +
  • deletable: bool | None - Whether or not the app is deletable (true) / permanent (false) / unspecified (None)

  • +
  • updatable: bool | None - Whether or not the app is updatable (true) / immutable (false) / unspecified (None)

-

It will automatically add metadata to the transaction note of the create or update calls that indicates the name, version, updatability and deletability of the contract. -This metadata works in concert with get_creator_apps to allow the app to be reliably retrieved against that creator in it’s currently deployed state.

-

deploy automatically executes template substitution including deploy-time control of permanence and immutability.

+

An example of the ARC-2 transaction note that is attached as an app creation / update transaction note to specify this metadata is:

+
ALGOKIT_DEPLOYER:j{name:"MyApp",version:"1.0",updatable:true,deletable:false}
+
+
+
+
+

Lookup deployed apps by name

+

In order to resolve what apps have been previously deployed and their metadata, AlgoKit provides a method that does a series of indexer lookups and returns a map of name to app metadata via get_creator_apps_by_name(creator_address).

+
app_lookup = algorand.app_deployer.get_creator_apps_by_name("CREATORADDRESS")
+app1_metadata = app_lookup.apps["app1"]
+
+
+

This method caches the result of the lookup, since it’s a reasonably heavyweight call (N+1 indexer calls for N deployed apps by the creator). If you want to skip the cache to get a fresh version then you can pass in a second parameter ignore_cache=True. This should only be needed if you are performing parallel deployments outside of the current AppDeployer instance, since it will keep its cache updated based on its own deployments.

+

The return type of get_creator_apps_by_name is ApplicationLookup, which is an object with:

+
@dataclasses.dataclass
+class ApplicationLookup:
+    creator: str
+    apps: dict[str, ApplicationMetaData] = dataclasses.field(default_factory=dict)
+
+
+

The apps property contains a lookup by app name that resolves to the current ApplicationMetaData.

+
+

Refer to the ApplicationLookup for latest information on exact types.

+
+
+
+

Performing a deployment

+

In order to perform a deployment, AlgoKit provides the deploy method.

+

For example:

+
deployment_result = algorand.app_deployer.deploy(
+    AppDeployParams(
+        metadata=AppDeploymentMetaData(
+            name="MyApp",
+            version="1.0.0",
+            deletable=False,
+            updatable=False,
+        ),
+        create_params=AppCreateParams(
+            sender="CREATORADDRESS",
+            approval_program=approval_teal_template_or_byte_code,
+            clear_state_program=clear_state_teal_template_or_byte_code,
+            schema=StateSchema(
+                global_ints=1,
+                global_byte_slices=2,
+                local_ints=3,
+                local_byte_slices=4,
+            ),
+            # Other parameters if a create call is made...
+        ),
+        update_params=AppUpdateParams(
+            sender="SENDERADDRESS",
+            # Other parameters if an update call is made...
+        ),
+        delete_params=AppDeleteParams(
+            sender="SENDERADDRESS",
+            # Other parameters if a delete call is made...
+        ),
+        deploy_time_params={
+            "VALUE": 1,  # TEAL template variables to replace
+        },
+        on_schema_break=OnSchemaBreak.Append,
+        on_update=OnUpdate.Update,
+        send_params=SendParams(
+            populate_app_call_resources=True,
+            # Other execution control parameters
+        ),
+    )
+)
+
+
+

This method performs an idempotent (safely retryable) deployment. It will detect if the app already exists and if it doesn’t it will create it. If the app does already exist then it will:

+
    +
  • Detect if the app has been updated (i.e. the program logic has changed) and either fail, perform an update, deploy a new version or perform a replacement (delete old app and create new app) based on the deployment configuration.

  • +
  • Detect if the app has a breaking schema change (i.e. more global or local storage is needed than were originally requested) and either fail, deploy a new version or perform a replacement (delete old app and create new app) based on the deployment configuration.

  • +
+

It will automatically add metadata to the transaction note of the create or update transactions that indicates the name, version, updatability and deletability of the contract. This metadata works in concert with appDeployer.get_creator_apps_by_name to allow the app to be reliably retrieved against that creator in it’s currently deployed state. It will automatically update it’s lookup cache so subsequent calls to get_creator_apps_by_name or deploy will use the latest metadata without needing to call indexer again.

+

deploy also automatically executes template substitution including deploy-time control of permanence and immutability if the requisite template parameters are specified in the provided TEAL template.

-

Input parameters

-

The following inputs are used when deploying an App

+

Input parameters

+

The first parameter deployment is an AppDeployParams, which is an object with:

    -
  • version: The version string for the app defined in app_spec, if not specified the version will automatically increment for existing apps that are updated, and set to 1.0 for new apps

  • -
  • signer, sender: Optional signer and sender for deployment operations, sender must be the same as the creator specified

  • -
  • allow_update, allow_delete: Control the updatability and deletability of the app, used to populate TMPL_UPDATABLE and TMPL_DELETABLE template values

  • -
  • on_update: Determines what should happen if an update to the smart contract is detected (e.g. the TEAL code has changed since last deployment)

  • -
  • on_schema_break: Determines what should happen if a breaking change to the schema is detected (e.g. if you need more global or local state that was previously requested when the contract was originally created)

  • -
  • create_args: Args to use if a create operation is performed

  • -
  • update_args: Args to use if an update operation is performed

  • -
  • delete_args: Args to use if a delete operation is performed

  • -
  • template_values: Values to use for automatic substitution of deploy-time parameter values is mapping of key: value that will result in TMPL_{key} being replaced with value

  • +
  • metadata: AppDeployMetadata - determines the deployment metadata of the deployment

  • +
  • create_params: AppCreateParams | CreateCallABI - the parameters for an app creation call (raw parameters or ABI method call)

  • +
  • update_params: AppUpdateParams | UpdateCallABI - the parameters for an app update call (raw parameters or ABI method call) without the app_id, approval_program, or clear_state_program as these are handled by the deploy logic

  • +
  • delete_params: AppDeleteParams | DeleteCallABI - the parameters for an app delete call (raw parameters or ABI method call) without the app_id parameter

  • +
  • deploy_time_params: TealTemplateParams | None - optional parameters for TEAL template substitution

    +
      +
    • TealTemplateParams is a dict that replaces TMPL_{key} with value (strings/Uint8Arrays are properly encoded)

    • +
    +
  • +
  • on_schema_break: OnSchemaBreak | str | None - determines OnSchemaBreak if schema requirements increase (values: ‘replace’, ‘fail’, ‘append’)

  • +
  • on_update: OnUpdate | str | None - determines OnUpdate if contract logic changes (values: ‘update’, ‘replace’, ‘fail’, ‘append’)

  • +
  • existing_deployments: ApplicationLookup | None - optional pre-fetched app lookup data to skip indexer queries

  • +
  • ignore_cache: bool | None - if True, bypasses cached deployment metadata

  • +
  • Additional fields from SendParams - transaction execution parameters

-

Idempotency

-

deploy is idempotent which means you can safely call it again multiple times, and it will only apply any changes it detects. If you call it again straight after calling it then it will -do nothing. This also means it can be used to find an existing app based on the supplied creator and app_spec or name.

+

Idempotency

+

deploy is idempotent which means you can safely call it again multiple times and it will only apply any changes it detects. If you call it again straight after calling it then it will do nothing.

-

Compilation and template substitution

-

When compiling TEAL template code, the capabilities described in the design above are present, namely the ability to supply deploy-time parameters and the ability to control immutability and permanence of the smart contract at deploy-time.

-

In order for a smart contract to be able to use this functionality, it must have a TEAL Template that contains the following:

+

Compilation and template substitution

+

When compiling TEAL template code, the capabilities described in the above design are present, namely the ability to supply deploy-time parameters and the ability to control immutability and permanence of the smart contract at deploy-time.

+

In order for a smart contract to opt-in to use this functionality, it must have a TEAL Template that contains the following:

    -
  • TMPL_{key} - Which can be replaced with a number or a string / byte array which wil be automatically hexadecimal encoded

  • +
  • TMPL_{key} - Which can be replaced with a number or a string / byte array which will be automatically hexadecimal encoded (for any number of {key} => {value} pairs)

  • TMPL_UPDATABLE - Which will be replaced with a 1 if an app should be updatable and 0 if it shouldn’t (immutable)

  • TMPL_DELETABLE - Which will be replaced with a 1 if an app should be deletable and 0 if it shouldn’t (permanent)

-

If you are building a smart contract using the beaker_production AlgoKit template if provides a reference implementation out of the box for the deploy-time immutability and permanence control.

+

If you are building a smart contract using the production AlgoKit init templates provide a reference implementation out of the box for the deploy-time immutability and permanence control.

+

If you passed in a TEAL template for the approval_program or clear_state_program (i.e. a str rather than a bytes) then deploy will return the CompiledTeal of substituting then compiling the TEAL template(s) in the following properties of the return value:

+
    +
  • compiled_approval: CompiledTeal | None

  • +
  • compiled_clear: CompiledTeal | None

  • +
+

Template substitution is done by executing algorand.app.compile_teal_template(teal_template_code, template_params, deployment_metadata), which in turn calls the following in order and returns the compilation result per above (all of which can also be invoked directly):

+
    +
  • AppManager.strip_teal_comments(teal_code) - Strips out any TEAL comments to reduce the payload that is sent to algod and reduce the likelihood of hitting the max payload limit

  • +
  • AppManager.replace_template_variables(teal_template_code, template_values) - Replaces the template variables by looking for TMPL_{key}

  • +
  • AppManager.replace_teal_template_deploy_time_control_params(teal_template_code, params) - If params is provided, it allows for deploy-time immutability and permanence control by replacing TMPL_UPDATABLE with params.get("updatable") if not None and replacing TMPL_DELETABLE with params.get("deletable") if not None

  • +
  • algorand.app.compile_teal(teal_code) - Sends the final TEAL to algod for compilation and returns the result including the source map and caches the compilation result within the AppManager instance

  • +
-

Return value

-

deploy returns a DeployResponse object, that describes the action taken.

+

Return value

+

When deploy executes it will return a AppDeployResult object that describes exactly what it did and has comprehensive metadata to describe the end result of the deployed app.

+

The deploy call itself may do one of the following (which you can determine by looking at the operation_performed field on the return value from the function):

+
    +
  • OperationPerformed.CREATE - The smart contract app was created

  • +
  • OperationPerformed.UPDATE - The smart contract app was updated

  • +
  • OperationPerformed.REPLACE - The smart contract app was deleted and created again (in an atomic transaction)

  • +
  • OperationPerformed.NOTHING - Nothing was done since it was detected the existing smart contract app deployment was up to date

  • +
+

As well as the operation_performed parameter and the optional compilation result, the return value will have the ApplicationMetaData fields present.

+

Based on the value of operation_performed, there will be other data available in the return value:

    -
  • action_taken: Describes what happened during deployment

    +
  • If CREATE, UPDATE or REPLACE then it will have the relevant SendAppTransactionResult values:

      -
    • Create - The smart contract app is created.

    • -
    • Update - The smart contract app is updated

    • -
    • Replace - The smart contract app was deleted and created again (in an atomic transaction)

    • -
    • Nothing - Nothing was done since an existing up-to-date app was found

    • +
    • create_result for create operations

    • +
    • update_result for update operations

  • -
  • create_response: If action taken was Create or Replace, the result of the create transaction. Can be a TransactionResponse or ABITransactionResponse depending on the method used

  • -
  • update_response: If action taken was Update, the result of the update transaction. Can be a TransactionResponse or ABITransactionResponse depending on the method used

  • -
  • delete_response: If action taken was Replace, the result of the delete transaction. Can be a TransactionResponse or ABITransactionResponse depending on the method used

  • -
  • app: An AppMetaData object, describing the final app state

  • +
  • If REPLACE then it will also have delete_result to capture the result of deleting the existing app

- -
+
+
+ +
-
+ + + - - - + + + + + \ No newline at end of file diff --git a/docs/html/capabilities/app.html b/docs/html/capabilities/app.html new file mode 100644 index 00000000..38a5d4a6 --- /dev/null +++ b/docs/html/capabilities/app.html @@ -0,0 +1,568 @@ + + + + + + + + + App management - algokit-utils-py 3.0 documentation + + + + + + + + + + + + + + + + + Contents + + + + + + Menu + + + + + + + + Expand + + + + + + Light mode + + + + + + + + + + + + + + Dark mode + + + + + + + Auto light/dark, in light mode + + + + + + + + + + + + + + + Auto light/dark, in dark mode + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +Skip to content + + + +
+
+
+ +
+ +
+
+ +
+ +
+
+ +
+
+
+ + + + + Back to top + +
+ +
+ +
+ +
+
+
+

App management

+

App management is a higher-order use case capability provided by AlgoKit Utils that builds on top of the core capabilities. It allows you to create, update, delete, call (ABI and otherwise) smart contract apps and the metadata associated with them (including state and boxes).

+
+

AppManager

+

The AppManager is a class that is used to manage app information. To get an instance of AppManager you can use either AlgorandClient via algorand.app or instantiate it directly (passing in an algod client instance):

+
from algokit_utils import AppManager
+
+app_manager = AppManager(algod_client)
+
+
+
+
+

Calling apps

+
+

App Clients

+

The recommended way of interacting with apps is via App clients and App factory. The methods shown on this page are the underlying mechanisms that app clients use and are for advanced use cases when you want more control.

+
+
+

Compilation

+

The AppManager class allows you to compile TEAL code with caching semantics that allows you to avoid duplicate compilation and keep track of source maps from compiled code.

+
# Basic compilation
+teal_code = "return 1"
+compilation_result = app_manager.compile_teal(teal_code)
+
+# Get cached compilation result
+cached_result = app_manager.get_compilation_result(teal_code)
+
+# Compile with template substitution
+template_code = "int TMPL_VALUE"
+template_params = {"VALUE": 1}
+compilation_result = app_manager.compile_teal_template(
+    template_code,
+    template_params=template_params
+)
+
+# Compile with deployment control (updatable/deletable)
+control_template = f"""#pragma version 8
+int {UPDATABLE_TEMPLATE_NAME}
+int {DELETABLE_TEMPLATE_NAME}"""
+deployment_metadata = {"updatable": True, "deletable": True}
+compilation_result = app_manager.compile_teal_template(
+    control_template,
+    deployment_metadata=deployment_metadata
+)
+
+
+

The compilation result contains:

+
    +
  • teal - Original TEAL code

  • +
  • compiled - Base64 encoded compiled bytecode

  • +
  • compiled_hash - Hash of compiled bytecode

  • +
  • compiled_base64_to_bytes - Raw bytes of compiled bytecode

  • +
  • source_map - Source map for debugging

  • +
+
+
+
+

Accessing state

+
+

Global state

+

To access global state you can use:

+
# Get global state for app
+global_state = app_manager.get_global_state(app_id)
+
+# Parse raw state from algod
+decoded_state = AppManager.decode_app_state(raw_state)
+
+# Access state values
+key_raw = decoded_state["value1"].key_raw  # Raw bytes
+key_base64 = decoded_state["value1"].key_base64  # Base64 encoded
+value = decoded_state["value1"].value  # Parsed value (str or int)
+value_raw = decoded_state["value1"].value_raw  # Raw bytes if bytes value
+value_base64 = decoded_state["value1"].value_base64  # Base64 if bytes value
+
+
+
+
+

Local state

+

To access local state you can use:

+
local_state = app_manager.get_local_state(app_id, "ACCOUNT_ADDRESS")
+
+
+
+
+

Boxes

+

To access box storage:

+
# Get box names
+box_names = app_manager.get_box_names(app_id)
+
+# Get box values
+box_value = app_manager.get_box_value(app_id, box_name)
+box_values = app_manager.get_box_values(app_id, [box_name1, box_name2])
+
+# Get decoded ABI values
+abi_value = app_manager.get_box_value_from_abi_type(
+    app_id, box_name, algosdk.abi.StringType()
+)
+abi_values = app_manager.get_box_values_from_abi_type(
+    app_id, [box_name1, box_name2], algosdk.abi.StringType()
+)
+
+# Get box reference for transaction
+box_ref = AppManager.get_box_reference(box_id)
+
+
+
+
+
+

Getting app information

+

To get app information:

+
# Get app info by ID
+app_info = app_manager.get_by_id(app_id)
+
+# Get ABI return value from transaction
+abi_return = AppManager.get_abi_return(confirmation, abi_method)
+
+
+
+
+

Box references

+

Box references can be specified in several ways:

+
# String name (encoded to bytes)
+box_ref = "my_box"
+
+# Raw bytes
+box_ref = b"my_box"
+
+# Account signer (uses address as name)
+box_ref = account_signer
+
+# Box reference with app ID
+box_ref = BoxReference(app_id=123, name=b"my_box")
+
+
+
+
+

Common app parameters

+

When interacting with apps (creating, updating, deleting, calling), there are common parameters that can be passed:

+
    +
  • app_id - ID of the application

  • +
  • sender - Address of transaction sender

  • +
  • signer - Transaction signer (optional)

  • +
  • args - Arguments to pass to the smart contract

  • +
  • account_references - Account addresses to reference

  • +
  • app_references - App IDs to reference

  • +
  • asset_references - Asset IDs to reference

  • +
  • box_references - Box references to load

  • +
  • on_complete - On complete action

  • +
  • Other common transaction parameters like note, lease, etc.

  • +
+

For ABI method calls, additional parameters:

+
    +
  • method - The ABI method to call

  • +
  • args - ABI typed arguments to pass

  • +
+

See App client for more details on constructing app calls.

+
+
+ +
+
+ +
+ +
+
+ + + + + \ No newline at end of file diff --git a/docs/html/capabilities/asset.html b/docs/html/capabilities/asset.html new file mode 100644 index 00000000..906797eb --- /dev/null +++ b/docs/html/capabilities/asset.html @@ -0,0 +1,541 @@ + + + + + + + + + Assets - algokit-utils-py 3.0 documentation + + + + + + + + + + + + + + + + + Contents + + + + + + Menu + + + + + + + + Expand + + + + + + Light mode + + + + + + + + + + + + + + Dark mode + + + + + + + Auto light/dark, in light mode + + + + + + + + + + + + + + + Auto light/dark, in dark mode + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +Skip to content + + + +
+
+
+ +
+ +
+
+ +
+ +
+
+ +
+
+
+ + + + + Back to top + +
+ +
+ +
+ +
+
+
+

Assets

+

The Algorand Standard Asset (ASA) management functions include creating, opting in and transferring assets, which are fundamental to asset interaction in a blockchain environment.

+
+

AssetManager

+

The AssetManager class provides functionality for managing Algorand Standard Assets (ASAs). It can be accessed through the AlgorandClient via algorand.asset or instantiated directly:

+
from algokit_utils import AssetManager, TransactionComposer
+from algosdk.v2client import algod
+
+asset_manager = AssetManager(
+    algod_client=algod_client,
+    new_group=lambda: TransactionComposer()
+)
+
+
+
+
+

Asset Information

+

The AssetManager provides two key data classes for asset information:

+
+

AssetInformation

+

Contains details about an Algorand Standard Asset (ASA):

+
@dataclass
+class AssetInformation:
+    asset_id: int  # The ID of the asset
+    creator: str   # Address of the creator account
+    total: int     # Total units created
+    decimals: int  # Number of decimal places
+    default_frozen: bool | None = None  # Whether asset is frozen by default
+    manager: str | None = None    # Optional manager address
+    reserve: str | None = None    # Optional reserve address
+    freeze: str | None = None     # Optional freeze address
+    clawback: str | None = None   # Optional clawback address
+    unit_name: str | None = None  # Optional unit name (e.g. ticker)
+    asset_name: str | None = None # Optional asset name
+    url: str | None = None        # Optional URL for more info
+    metadata_hash: bytes | None = None # Optional 32-byte metadata hash
+
+
+
+
+

AccountAssetInformation

+

Contains information about an account’s holding of a particular asset:

+
@dataclass
+class AccountAssetInformation:
+    asset_id: int   # The ID of the asset
+    balance: int    # Amount held by the account
+    frozen: bool    # Whether frozen for this account
+    round: int      # Round this info was retrieved at
+
+
+
+
+
+

Bulk Operations

+

The AssetManager provides methods for bulk opt-in/opt-out operations:

+
+

Bulk Opt-In

+
# Basic example
+result = asset_manager.bulk_opt_in(
+    account="ACCOUNT_ADDRESS",
+    asset_ids=[12345, 67890]
+)
+
+# Advanced example with optional parameters
+result = asset_manager.bulk_opt_in(
+    account="ACCOUNT_ADDRESS",
+    asset_ids=[12345, 67890],
+    signer=transaction_signer,
+    note=b"opt-in note",
+    lease=b"lease",
+    static_fee=AlgoAmount(1000),
+    extra_fee=AlgoAmount(500),
+    max_fee=AlgoAmount(2000),
+    validity_window=10,
+    send_params=SendParams(...)
+)
+
+
+
+
+

Bulk Opt-Out

+
# Basic example
+result = asset_manager.bulk_opt_out(
+    account="ACCOUNT_ADDRESS",
+    asset_ids=[12345, 67890]
+)
+
+# Advanced example with optional parameters
+result = asset_manager.bulk_opt_out(
+    account="ACCOUNT_ADDRESS",
+    asset_ids=[12345, 67890],
+    ensure_zero_balance=True,
+    signer=transaction_signer,
+    note=b"opt-out note",
+    lease=b"lease",
+    static_fee=AlgoAmount(1000),
+    extra_fee=AlgoAmount(500),
+    max_fee=AlgoAmount(2000),
+    validity_window=10,
+    send_params=SendParams(...)
+)
+
+
+

The bulk operations return a list of BulkAssetOptInOutResult objects containing:

+
    +
  • asset_id: The ID of the asset opted into/out of

  • +
  • transaction_id: The transaction ID of the opt-in/out

  • +
+
+
+
+

Get Asset Information

+
+

Getting Asset Parameters

+

You can get the current parameters of an asset from algod using get_by_id():

+
asset_info = asset_manager.get_by_id(12345)
+
+
+
+
+

Getting Account Holdings

+

You can get an account’s current holdings of an asset using get_account_information():

+
address = "XBYLS2E6YI6XXL5BWCAMOA4GTWHXWENZMX5UHXMRNWWUQ7BXCY5WC5TEPA"
+asset_id = 12345
+account_info = asset_manager.get_account_information(address, asset_id)
+
+
+
+
+
+ +
+
+ +
+ +
+
+ + + + + \ No newline at end of file diff --git a/docs/html/capabilities/client.html b/docs/html/capabilities/client.html index 0bfa207c..f0602e3d 100644 --- a/docs/html/capabilities/client.html +++ b/docs/html/capabilities/client.html @@ -1,146 +1,509 @@ - - - - - - - Client management — algokit-utils 1.0 documentation - - - + + + + + + + + + Client management - algokit-utils-py 3.0 documentation + + + + + + + + + + + + + + + + + Contents + + + + + + Menu + + + + + + + + Expand + + + + + + Light mode + + + + + + + + + + + + + + Dark mode + + + + + + + Auto light/dark, in light mode + + + + + + + + + + + + + + + Auto light/dark, in dark mode + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +Skip to content + + + +
+
+
+ +
+ +
+
+ +
+ +
+
+ +
+
+
+ + + + + Back to top + +
+ -
-
- -
-

Client management

-

Client management is one of the core capabilities provided by AlgoKit Utils. -It allows you to create algod, indexer -and kmd clients against various networks resolved from environment or specified configuration.

-

Any AlgoKit Utils function that needs one of these clients will take the underlying algosdk classes (algosdk.v2client.algod.AlgodClient, algosdk.v2client.indexer.IndexerClient, -algosdk.kmd.KMDClient) so inline with the Modularity principle you can use existing logic to get instances of these clients without needing to use the -Client management capability if you prefer.

+
+ +
+ +
+
+
+

Client management

+

Client management is one of the core capabilities provided by AlgoKit Utils. It allows you to create (auto-retry) algod, indexer and kmd clients against various networks resolved from environment or specified configuration.

+

Any AlgoKit Utils function that needs one of these clients will take the underlying algosdk classes (algosdk.v2client.algod.AlgodClient, algosdk.v2client.indexer.IndexerClient, algosdk.kmd.KMDClient) so inline with the Modularity principle you can use existing logic to get instances of these clients without needing to use the Client management capability if you prefer.

To see some usage examples check out the automated tests.

+
+

ClientManager

+

The ClientManager is a class that is used to manage client instances.

+

To get an instance of ClientManager you can instantiate it directly:

+
from algokit_utils import ClientManager, AlgoSdkClients, AlgoClientConfigs
+from algosdk.v2client.algod import AlgodClient
+
+# Using AlgoSdkClients
+algod_client = AlgodClient(...)
+algorand_client = ...  # Get AlgorandClient instance from somewhere
+clients = AlgoSdkClients(algod=algod_client, indexer=indexer_client, kmd=kmd_client)
+client_manager = ClientManager(clients, algorand_client)
+
+# Using AlgoClientConfigs
+algod_config = AlgoClientNetworkConfig(server="https://...", token="")
+configs = AlgoClientConfigs(algod_config=algod_config)
+client_manager = ClientManager(configs, algorand_client)
+
+
+
-

Network configuration

-

The network configuration is specified using the AlgoClientConfig class. This same interface is used to specify the config for algod, indexer and kmd clients.

+

Network configuration

+

The network configuration is specified using the AlgoClientConfig type. This same type is used to specify the config for algod, indexer and kmd SDK clients.

There are a number of ways to produce one of these configuration objects:

-
    -
  • Manually creating the object, e.g. AlgoClientConfig(server="https://myalgodnode.com", token="SECRET_TOKEN")

  • -
  • algokit_utils.get_algonode_config(network, config, token): Loads an Algod or indexer config against Nodely to either MainNet or TestNet

  • -
  • algokit_utils.get_default_localnet_config(configOrPort): Loads an Algod, Indexer or Kmd config against LocalNet using the default configuration

  • +
      +
    • Manually specifying a dataclass, e.g.

      +
      from algokit_utils import AlgoClientNetworkConfig
      +
      +config = AlgoClientNetworkConfig(
      +    server="https://myalgodnode.com",
      +    token="SECRET_TOKEN"  # optional
      +)
      +
      +
      +
    • +
    • ClientManager.get_config_from_environment_or_localnet() - Loads the Algod client config, the Indexer client config and the Kmd config from well-known environment variables or if not found then default LocalNet; this is useful to have code that can work across multiple blockchain environments (including LocalNet), without having to change

    • +
    • ClientManager.get_algod_config_from_environment() - Loads an Algod client config from well-known environment variables

    • +
    • ClientManager.get_indexer_config_from_environment() - Loads an Indexer client config from well-known environment variables; useful to have code that can work across multiple blockchain environments (including LocalNet), without having to change

    • +
    • ClientManager.get_algonode_config(network) - Loads an Algod or indexer config against AlgoNode free tier to either MainNet or TestNet

    • +
    • ClientManager.get_default_localnet_config() - Loads an Algod, Indexer or Kmd config against LocalNet using the default configuration

-

Clients

-

Once you have the configuration for a client, to get the client you can use the following functions:

+

Clients

+
+

Creating an SDK client instance

+

Once you have the configuration for a client, to get a new client you can use the following functions:

    -
  • algokit_utils.get_algod_client(config): Returns an Algod client for the given configuration or if none is provided retrieves a configuration from the environment using ALGOD_SERVER, ALGOD_TOKEN and optionally ALGOD_PORT.

  • -
  • algokit_utils.get_indexer_client(config): Returns an Indexer client for given configuration or if none is provided retrieves a configuration from the environment using INDEXER_SERVER, INDEXER_TOKEN and optionally INDEXER_PORT

  • -
  • algokit_utils.get_kmd_client_from_algod_client(config): - Returns a Kmd client based on the provided algod client configuration, with the assumption the KMD services is running on the same host but a different port (either KMD_PORT environment variable or 4002 by default)

  • +
  • ClientManager.get_algod_client(config) - Returns an Algod client for the given configuration; the client automatically retries on transient HTTP errors

  • +
  • ClientManager.get_indexer_client(config) - Returns an Indexer client for given configuration

  • +
  • ClientManager.get_kmd_client(config) - Returns a Kmd client for the given configuration

+

You can also shortcut needing to write the likes of ClientManager.get_algod_client(ClientManager.get_algod_config_from_environment()) with environment shortcut methods:

+
    +
  • ClientManager.get_algod_client_from_environment() - Returns an Algod client by loading the config from environment variables

  • +
  • ClientManager.get_indexer_client_from_environment() - Returns an indexer client by loading the config from environment variables

  • +
  • ClientManager.get_kmd_client_from_environment() - Returns a kmd client by loading the config from environment variables

  • +
+
+
+

Accessing SDK clients via ClientManager instance

+

Once you have a ClientManager instance, you can access the SDK clients:

+
client_manager = ClientManager(algod=algod_client, indexer=indexer_client, kmd=kmd_client)
+
+algod_client = client_manager.algod
+indexer_client = client_manager.indexer
+kmd_client = client_manager.kmd
+
+
+

If the method to create the ClientManager doesn’t configure indexer or kmd (both of which are optional), then accessing those clients will trigger an error.

+
+

Creating a TestNet dispenser API client instance

+

You can also create a TestNet dispenser API client instance from ClientManager too.

+
+
+

Automatic retry

+

When receiving an Algod or Indexer client from AlgoKit Utils, it will be a special wrapper client that handles retrying transient failures.

+
+
+

Network information

+

You can get information about the current network you are connected to:

+
# Get network information
+network = client_manager.network()
+print(f"Is mainnet: {network.is_mainnet}")
+print(f"Is testnet: {network.is_testnet}")
+print(f"Is localnet: {network.is_localnet}")
+print(f"Genesis ID: {network.genesis_id}")
+print(f"Genesis hash: {network.genesis_hash}")
 
+# Convenience methods
+is_mainnet = client_manager.is_mainnet()
+is_testnet = client_manager.is_testnet()
+is_localnet = client_manager.is_localnet()
+
+
+

The first time network() is called it will make a HTTP call to algod to get the network parameters, but from then on it will be cached within that ClientManager instance for subsequent calls.

+
+
-
+ +
+ +
-
+ + + - - - + + + + + \ No newline at end of file diff --git a/docs/html/capabilities/debugger.html b/docs/html/capabilities/debugger.html deleted file mode 100644 index c64952c8..00000000 --- a/docs/html/capabilities/debugger.html +++ /dev/null @@ -1,163 +0,0 @@ - - - - - - - Debugger — algokit-utils 1.0 documentation - - - - - - - - - - - - - - - - - -
- - -
- -
-
-
- -
-
-
-
- -
-

Debugger

-

The AlgoKit Python Utilities package provides a set of debugging tools that can be used to simulate and trace transactions on the Algorand blockchain. These tools and methods are optimized for developers who are building applications on Algorand and need to test and debug their smart contracts via AlgoKit AVM Debugger extension.

-
-

Configuration

-

The config.py file contains the UpdatableConfig class which manages and updates configuration settings for the AlgoKit project. The class has the following attributes:

-
    -
  • debug: Indicates whether debug mode is enabled.

  • -
  • project_root: The path to the project root directory. Can be ignored if you are using algokit_utils inside an algokit compliant project (containing .algokit.toml file). For non algokit compliant projects, simply provide the path to the folder where you want to store sourcemaps and traces to be used with AlgoKit AVM Debugger. Alternatively you can also set the value via the ALGOKIT_PROJECT_ROOT environment variable.

  • -
  • trace_all: Indicates whether to trace all operations. Defaults to false, this means that when debug mode is enabled, any (or all) application client calls performed via algokit_utils will store responses from simulate endpoint. These files are called traces, and can be used with AlgoKit AVM Debugger to debug TEAL source codes, transactions in the atomic group and etc.

  • -
  • trace_buffer_size_mb: The size of the trace buffer in megabytes. By default uses 256 megabytes. When output folder containing debug trace files exceedes the size, oldest files are removed to optimize for storage consumption.

  • -
  • max_search_depth: The maximum depth to search for a an algokit config file. By default it will traverse at most 10 folders searching for .algokit.toml file which will be used to assume algokit compliant project root path.

  • -
-

The configure method can be used to set these attributes.

-

To enable debug mode in your project you can configure it as follows:

-
from algokit_utils.config import config
-
-config.configure(debug=True)
-
-
-
-
-

Debugging Utilities

-

Debugging utilities can be used to simplify gathering artifacts to be used with AlgoKit AVM Debugger in non algokit compliant projects. The following methods are provided:

-
    -
  • simulate_and_persist_response: This method simulates the atomic transactions using the provided AtomicTransactionComposer object and AlgodClient object, and persists the simulation response to an AVM Debugger compliant JSON file. It takes an AtomicTransactionComposer object representing the atomic transactions to be simulated and persisted, a Path object representing the root directory of the project, an AlgodClient object representing the Algorand client, and a float representing the size of the trace buffer in megabytes.

  • -
-
-

Trace filename format

-

The trace files are named in a specific format to provide useful information about the transactions they contain. The format is as follows:

-
`${timestamp}_lr${last_round}_${transaction_types}.trace.avm.json`;
-
-
-

Where:

-
    -
  • timestamp: The time when the trace file was created, in ISO 8601 format, with colons and periods removed.

  • -
  • last_round: The last round when the simulation was performed.

  • -
  • transaction_types: A string representing the types and counts of transactions in the atomic group. Each transaction type is represented as ${count}${type}, and different transaction types are separated by underscores.

  • -
-

For example, a trace file might be named 20220301T123456Z_lr1000_2pay_1axfer.trace.avm.json, indicating that the trace file was created at 2022-03-01T12:34:56Z, the last round was 1000, and the atomic group contained 2 payment transactions and 1 asset transfer transaction.

-
-
-
- - -
-
- -
-
-
-
- - - - \ No newline at end of file diff --git a/docs/html/capabilities/debugging.html b/docs/html/capabilities/debugging.html new file mode 100644 index 00000000..b915db51 --- /dev/null +++ b/docs/html/capabilities/debugging.html @@ -0,0 +1,498 @@ + + + + + + + + + Debugger - algokit-utils-py 3.0 documentation + + + + + + + + + + + + + + + + + Contents + + + + + + Menu + + + + + + + + Expand + + + + + + Light mode + + + + + + + + + + + + + + Dark mode + + + + + + + Auto light/dark, in light mode + + + + + + + + + + + + + + + Auto light/dark, in dark mode + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +Skip to content + + + +
+
+
+ +
+ +
+
+ +
+ +
+
+ +
+
+
+ + + + + Back to top + +
+ +
+ +
+ +
+
+
+

Debugger

+

The AlgoKit Python Utilities package provides a set of debugging tools that can be used to simulate and trace transactions on the Algorand blockchain. These tools and methods are optimized for developers who are building applications on Algorand and need to test and debug their smart contracts via AlgoKit AVM Debugger extension.

+
+

Configuration

+

The config.py file contains the UpdatableConfig class which manages and updates configuration settings for the AlgoKit project.

+
    +
  • debug: Indicates whether debug mode is enabled.

  • +
  • project_root: The path to the project root directory. Can be ignored if you are using algokit_utils inside an algokit compliant project (containing .algokit.toml file). For non algokit compliant projects, simply provide the path to the folder where you want to store sourcemaps and traces to be used with AlgoKit AVM Debugger. Alternatively you can also set the value via the ALGOKIT_PROJECT_ROOT environment variable.

  • +
  • trace_all: Indicates whether to trace all operations. Defaults to false, this means that when debug mode is enabled, any (or all) application client calls performed via algokit_utils will store responses from simulate endpoint. These files are called traces, and can be used with AlgoKit AVM Debugger to debug TEAL source codes, transactions in the atomic group and etc.

  • +
  • trace_buffer_size_mb: The size of the trace buffer in megabytes. By default uses 256 megabytes. When output folder containing debug trace files exceedes the size, oldest files are removed to optimize for storage consumption.

  • +
  • max_search_depth: The maximum depth to search for a an algokit config file. By default it will traverse at most 10 folders searching for .algokit.toml file which will be used to assume algokit compliant project root path.

  • +
  • populate_app_call_resources: Indicates whether to populate app call resources. Defaults to false, which means that when debug mode is enabled, any (or all) application client calls performed via algokit_utils will not populate app call resources.

  • +
  • logger: A custom logger to use. Defaults to algokit_utils.config.AlgoKitLogger instance.

  • +
+

The configure method can be used to set these attributes.

+

To enable debug mode in your project you can configure it as follows:

+
from algokit_utils.config import config
+
+config.configure(
+    debug=True,
+    project_root=Path("./my-project"),
+    trace_all=True,
+    trace_buffer_size_mb=512,
+    max_search_depth=15,
+    populate_app_call_resources=True,
+)
+
+
+
+
+

AlgoKitLogger

+

The AlgoKitLogger is a custom logger that is used to log messages in the AlgoKit project. +It is a subclass of the logging.Logger class and extends it to provide additional functionality.

+
+

Suppressing log messages per log call

+

To supress log messages for individual log calls you can pass 'suppress_log':True to the log call’s extra argument.

+
+
+

Suppressing log messages globally

+

To supress log messages globally you can configure the config object to use a custom logger that does not log anything.

+
config.configure(logger=AlgoKitLogger.get_null_logger())
+
+
+
+
+
+

Debugging Utilities

+

When debug mode is enabled, AlgoKit Utils will automatically:

+
    +
  • Generate transaction traces compatible with the AVM Debugger

  • +
  • Manage trace file storage with automatic cleanup

  • +
  • Provide source map generation for TEAL contracts

  • +
+

The following methods are provided for manual debugging operations:

+
    +
  • persist_sourcemaps: Persists sourcemaps for given TEAL contracts as AVM Debugger-compliant artifacts. Parameters:

    +
      +
    • sources: List of TEAL sources to generate sourcemaps for

    • +
    • project_root: Project root directory for storage

    • +
    • client: AlgodClient instance

    • +
    • with_sources: Whether to include TEAL source files (default: True)

    • +
    +
  • +
  • simulate_and_persist_response: Simulates transactions and persists debug traces. Parameters:

    +
      +
    • atc: AtomicTransactionComposer containing transactions

    • +
    • project_root: Project root directory for storage

    • +
    • algod_client: AlgodClient instance

    • +
    • buffer_size_mb: Maximum trace storage in MB (default: 256)

    • +
    • allow_empty_signatures: Allow unsigned transactions (default: True)

    • +
    • allow_unnamed_resources: Allow unnamed resources (default: True)

    • +
    • extra_opcode_budget: Additional opcode budget

    • +
    • exec_trace_config: Custom trace configuration

    • +
    • simulation_round: Specific round to simulate

    • +
    +
  • +
+
+

Trace filename format

+

The trace files are named in a specific format to provide useful information about the transactions they contain. The format is as follows:

+
${timestamp}_lr${last_round}_${transaction_types}.trace.avm.json
+
+
+

Where:

+
    +
  • timestamp: The time when the trace file was created, in ISO 8601 format, with colons and periods removed.

  • +
  • last_round: The last round when the simulation was performed.

  • +
  • transaction_types: A string representing the types and counts of transactions in the atomic group. Each transaction type is represented as ${count}${type}, and different transaction types are separated by underscores.

  • +
+

For example, a trace file might be named 20220301T123456Z_lr1000_2pay_1axfer.trace.avm.json, indicating that the trace file was created at 2022-03-01T12:34:56Z, the last round was 1000, and the atomic group contained 2 payment transactions and 1 asset transfer transaction.

+
+
+
+ +
+
+ +
+ +
+
+ + + + + \ No newline at end of file diff --git a/docs/html/capabilities/dispenser-client.html b/docs/html/capabilities/dispenser-client.html index 7ee6e761..18149240 100644 --- a/docs/html/capabilities/dispenser-client.html +++ b/docs/html/capabilities/dispenser-client.html @@ -1,176 +1,484 @@ - - - - - - - TestNet Dispenser Client — algokit-utils 1.0 documentation - - - + + + + + + + + + TestNet Dispenser Client - algokit-utils-py 3.0 documentation + + + + + + + + + + + + + + + + + Contents + + + + + + Menu + + + + + + + + Expand + + + + + + Light mode + + + + + + + + + + + + + + Dark mode + + + + + + + Auto light/dark, in light mode + + + + + + + + + + + + + + + Auto light/dark, in dark mode + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +Skip to content + + + +
+
+
+ +
+ +
+
+ +
+ +
+
+ +
+
+
+ + + + + Back to top + +
+ -
-
- -
-

TestNet Dispenser Client

+
+ +
+ +
+
+
+

TestNet Dispenser Client

The TestNet Dispenser Client is a utility for interacting with the AlgoKit TestNet Dispenser API. It provides methods to fund an account, register a refund for a transaction, and get the current limit for an account.

-

Creating a Dispenser Client

+

Creating a Dispenser Client

To create a Dispenser Client, you need to provide an authorization token. This can be done in two ways:

  1. Pass the token directly to the client constructor as auth_token.

  2. -
  3. Set the token as an environment variable ALGOKIT_DISPENSER_ACCESS_TOKEN (see docs on how to obtain the token).

  4. +
  5. Set the token as an environment variable ALGOKIT_DISPENSER_ACCESS_TOKEN (see docs on how to obtain the token).

If both methods are used, the constructor argument takes precedence.

-
from algokit_utils import TestNetDispenserApiClient
+
import algokit_utils
 
-# Using constructor argument
+# With auth token
+dispenser = algorand.client.get_testnet_dispenser(
+    auth_token="your_auth_token",
+)
+
+# With auth token and timeout
+dispenser = algorand.client.get_testnet_dispenser(
+    auth_token="your_auth_token",
+    request_timeout=2,  # seconds
+)
 
+# From environment variables
+# i.e. os.environ['ALGOKIT_DISPENSER_ACCESS_TOKEN'] = 'your_auth_token'
+dispenser = algorand.client.get_testnet_dispenser_from_environment()
+
+# Alternatively, you can construct it directly
+from algokit_utils import TestNetDispenserApiClient
+
+# Using constructor argument
 client = TestNetDispenserApiClient(auth_token="your_auth_token")
 
 # Using environment variable
-
-import os
-os.environ["ALGOKIT_DISPENSER_ACCESS_TOKEN"] = "your_auth_token"
+import os
+os.environ['ALGOKIT_DISPENSER_ACCESS_TOKEN'] = 'your_auth_token'
 client = TestNetDispenserApiClient()
 
-

Funding an Account

-

To fund an account with Algos from the dispenser API, use the fund method. This method requires the receiver’s address, the amount to be funded, and the asset ID.

-
response = client.fund(address="receiver_address", amount=1000, asset_id=0)
+

Funding an Account

+

To fund an account with Algo from the dispenser API, use the fund method. This method requires the receiver’s address and the amount to be funded.

+
response = dispenser.fund(
+    receiver="RECEIVER_ADDRESS",
+    amount=1000,  # Amount in microAlgos
+)
 
-

The fund method returns a FundResponse object, which contains the transaction ID (tx_id) and the amount funded.

+

The fund method returns a DispenserFundResponse object, which contains the transaction ID (tx_id) and the amount funded.

-

Registering a Refund

+

Registering a Refund

To register a refund for a transaction with the dispenser API, use the refund method. This method requires the transaction ID of the refund transaction.

-
client.refund(refund_txn_id="transaction_id")
+
dispenser.refund("transaction_id")
 
-

Keep in mind, to perform a refund you need to perform a payment transaction yourself first by send funds back to TestNet Dispenser, then you can invoke this refund endpoint and pass the txn_id of your refund txn. You can obtain dispenser address by inspecting the sender field of any issued fund transaction initiated via fund.

+

Keep in mind, to perform a refund you need to perform a payment transaction yourself first by sending funds back to TestNet Dispenser, then you can invoke this refund endpoint and pass the txn_id of your refund txn. You can obtain dispenser address by inspecting the sender field of any issued fund transaction initiated via fund.

-

Getting Current Limit

-

To get the current limit for an account with Algos from the dispenser API, use the get_limit method. This method requires the account address.

-
response = client.get_limit(address="account_address")
+

Getting Current Limit

+

To get the current limit for an account with Algo from the dispenser API, use the get_limit method.

+
response = dispenser.get_limit()
 
-

The get_limit method returns a LimitResponse object, which contains the current limit amount.

+

The get_limit method returns a DispenserLimitResponse object, which contains the current limit amount.

-

Error Handling

+

Error Handling

If an error occurs while making a request to the dispenser API, an exception will be raised with a message indicating the type of error. Refer to Error Handling docs for details on how you can handle each individual error code.

+

Here’s an example of handling errors:

+
try:
+    response = dispenser.fund(
+        receiver="RECEIVER_ADDRESS",
+        amount=1000,
+    )
+except Exception as e:
+    print(f"Error occurred: {str(e)}")
+
+
- -
+ +
+ +
-
+ + + - - - + + + + + \ No newline at end of file diff --git a/docs/html/capabilities/testing.html b/docs/html/capabilities/testing.html new file mode 100644 index 00000000..62e1d8fd --- /dev/null +++ b/docs/html/capabilities/testing.html @@ -0,0 +1,598 @@ + + + + + + + + + Testing - algokit-utils-py 3.0 documentation + + + + + + + + + + + + + + + + + Contents + + + + + + Menu + + + + + + + + Expand + + + + + + Light mode + + + + + + + + + + + + + + Dark mode + + + + + + + Auto light/dark, in light mode + + + + + + + + + + + + + + + Auto light/dark, in dark mode + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +Skip to content + + + +
+
+
+ +
+ +
+
+ +
+ +
+
+ +
+
+
+ + + + + Back to top + +
+ +
+ +
+ +
+
+
+

Testing

+

The following is a collection of useful snippets that can help you get started with testing your Algorand applications using AlgoKit utils. For the sake of simplicity, we’ll use pytest in the examples below.

+
+

Basic Test Setup

+

Here’s a basic test setup using pytest fixtures that provides common testing utilities:

+
import pytest
+from algokit_utils import Account, SigningAccount
+from algokit_utils.algorand import AlgorandClient
+from algokit_utils.models.amount import AlgoAmount
+
+@pytest.fixture
+def algorand() -> AlgorandClient:
+    """Get an AlgorandClient instance configured for LocalNet"""
+    return AlgorandClient.default_localnet()
+
+@pytest.fixture
+def funded_account(algorand: AlgorandClient) -> SigningAccount:
+    """Create and fund a test account with ALGOs"""
+    new_account = algorand.account.random()
+    dispenser = algorand.account.localnet_dispenser()
+    algorand.account.ensure_funded(
+        new_account,
+        dispenser,
+        min_spending_balance=AlgoAmount.from_algos(100),
+        min_funding_increment=AlgoAmount.from_algos(1)
+    )
+    algorand.set_signer(sender=new_account.address, signer=new_account.signer)
+    return new_account
+
+
+

Refer to pytest fixture scopes for more information on how to control lifecycle of fixtures.

+
+
+

Creating Test Assets

+

Here’s a helper function to create test ASAs (Algorand Standard Assets):

+
def generate_test_asset(algorand: AlgorandClient, sender: Account, total: int | None = None) -> int:
+    """Create a test asset and return its ID"""
+    if total is None:
+        total = random.randint(20, 120)
+
+    create_result = algorand.send.asset_create(
+        AssetCreateParams(
+            sender=sender.address,
+            total=total,
+            decimals=0,
+            default_frozen=False,
+            unit_name="TST",
+            asset_name=f"Test Asset {random.randint(1,100)}",
+            url="https://example.com",
+            manager=sender.address,
+            reserve=sender.address,
+            freeze=sender.address,
+            clawback=sender.address,
+        )
+    )
+
+    return int(create_result.confirmation["asset-index"])
+
+
+
+
+

Testing Application Deployments

+

Here’s how one can test smart contract application deployments:

+
def test_app_deployment(algorand: AlgorandClient, funded_account: SigningAccount):
+    """Test deploying a smart contract application"""
+
+    # Load the application spec
+    app_spec = Path("artifacts/application.json").read_text()
+
+    # Create app factory
+    factory = algorand.client.get_app_factory(
+        app_spec=app_spec,
+        default_sender=funded_account.address
+    )
+
+    # Deploy the app
+    app_client, deploy_response = factory.deploy(
+        compilation_params={
+            "deletable": True,
+            "updatable": True,
+            "deploy_time_params": {"VERSION": 1},
+        },
+    )
+
+    # Verify deployment
+    assert deploy_response.app.app_id > 0
+    assert deploy_response.app.app_address
+
+
+
+
+

Testing Asset Transfers

+

Here’s how one can test ASA transfers between accounts:

+
def test_asset_transfer(algorand: AlgorandClient, funded_account: SigningAccount):
+    """Test ASA transfers between accounts"""
+
+    # Create receiver account
+    receiver = algorand.account.random()
+    algorand.account.ensure_funded(
+        account_to_fund=receiver,
+        dispenser_account=funded_account,
+        min_spending_balance=AlgoAmount.from_algos(1)
+    )
+
+    # Create test asset
+    asset_id = generate_test_asset(algorand, funded_account, 100)
+
+    # Opt receiver into asset
+    algorand.send.asset_opt_in(
+        AssetOptInParams(
+            sender=receiver.address,
+            asset_id=asset_id,
+            signer=receiver.signer
+        )
+    )
+
+    # Transfer asset
+    transfer_amount = 5
+    result = algorand.send.asset_transfer(
+        AssetTransferParams(
+            sender=funded_account.address,
+            receiver=receiver.address,
+            asset_id=asset_id,
+            amount=transfer_amount
+        )
+    )
+
+    # Verify transfer
+    receiver_balance = algorand.asset.get_account_information(receiver, asset_id)
+    assert receiver_balance.balance == transfer_amount
+
+
+
+
+

Testing Application Calls

+

Here’s how to test application method calls:

+
def test_app_method_call(algorand: AlgorandClient, funded_account: SigningAccount):
+    """Test calling ABI methods on an application"""
+
+    # Deploy application first
+    app_spec = Path("artifacts/application.json").read_text()
+    factory = algorand.client.get_app_factory(
+        app_spec=app_spec,
+        default_sender=funded_account.address
+    )
+    app_client, _ = factory.deploy()
+
+    # Call application method
+    result = app_client.send.call(
+        AppClientMethodCallParams(
+            method="hello",
+            args=["world"]
+        )
+    )
+
+    # Verify result
+    assert result.abi_return == "Hello, world"
+
+
+
+
+

Testing Box Storage

+

Here’s how to test application box storage:

+
def test_box_storage(algorand: AlgorandClient, funded_account: SigningAccount):
+    """Test application box storage"""
+
+    # Deploy application
+    app_spec = Path("artifacts/application.json").read_text()
+    factory = algorand.client.get_app_factory(
+        app_spec=app_spec,
+        default_sender=funded_account.address
+    )
+    app_client, _ = factory.deploy()
+
+    # Fund app account for box storage MBR
+    app_client.fund_app_account(
+        FundAppAccountParams(amount=AlgoAmount.from_algos(1))
+    )
+
+    # Store value in box
+    box_name = b"test_box"
+    box_value = "test_value"
+    app_client.send.call(
+        AppClientMethodCallParams(
+            method="set_box",
+            args=[box_name, box_value],
+            box_references=[box_name]
+        )
+    )
+
+    # Verify box value
+    stored_value = app_client.get_box_value(box_name)
+    assert stored_value == box_value.encode()
+
+
+
+
+ +
+
+ +
+ +
+
+ + + + + \ No newline at end of file diff --git a/docs/html/capabilities/transaction-composer.html b/docs/html/capabilities/transaction-composer.html new file mode 100644 index 00000000..e0a1cd0c --- /dev/null +++ b/docs/html/capabilities/transaction-composer.html @@ -0,0 +1,726 @@ + + + + + + + + + Transaction composer - algokit-utils-py 3.0 documentation + + + + + + + + + + + + + + + + + Contents + + + + + + Menu + + + + + + + + Expand + + + + + + Light mode + + + + + + + + + + + + + + Dark mode + + + + + + + Auto light/dark, in light mode + + + + + + + + + + + + + + + Auto light/dark, in dark mode + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +Skip to content + + + +
+
+
+ +
+ +
+
+ +
+ +
+
+ +
+
+
+ + + + + Back to top + +
+ +
+ +
+ +
+
+
+

Transaction composer

+

The TransactionComposer class allows you to easily compose one or more compliant Algorand transactions and execute and/or simulate them.

+

It’s the core of how the AlgorandClient class composes and sends transactions.

+
from algokit_utils import TransactionComposer, AppManager
+from algokit_utils.transactions import (
+    PaymentParams,
+    AppCallMethodCallParams,
+    AssetCreateParams,
+    AppCreateParams,
+    # ... other transaction parameter types
+)
+
+
+

To get an instance of TransactionComposer you can either get it from an app client, from an AlgorandClient, or by instantiating via the constructor.

+
# From AlgorandClient
+composer_from_algorand = algorand.new_group()
+
+# From AppClient
+composer_from_app_client = app_client.algorand.new_group()
+
+# From constructor
+composer_from_constructor = TransactionComposer(
+    algod=algod,
+    # Return the TransactionSigner for this address
+    get_signer=lambda address: signer
+)
+
+# From constructor with optional params
+composer_from_constructor = TransactionComposer(
+    algod=algod,
+    # Return the TransactionSigner for this address
+    get_signer=lambda address: signer,
+    # Custom function to get suggested params
+    get_suggested_params=lambda: algod.suggested_params(),
+    # Number of rounds the transaction should be valid for
+    default_validity_window=1000,
+    # Optional AppManager instance for TEAL compilation
+    app_manager=AppManager(algod)
+)
+
+
+
+

Constructing a transaction

+

To construct a transaction you need to add it to the composer, passing in the relevant params object for that transaction. Params are Python dataclasses aavailable for import from algokit_utils.transactions.

+

Parameter types include:

+
    +
  • PaymentParams - For ALGO transfers

  • +
  • AssetCreateParams - For creating ASAs

  • +
  • AssetConfigParams - For reconfiguring ASAs

  • +
  • AssetTransferParams - For ASA transfers

  • +
  • AssetOptInParams - For opting in to ASAs

  • +
  • AssetOptOutParams - For opting out of ASAs

  • +
  • AssetDestroyParams - For destroying ASAs

  • +
  • AssetFreezeParams - For freezing ASA balances

  • +
  • AppCreateParams - For creating applications

  • +
  • AppCreateMethodCallParams - For creating applications with ABI method calls

  • +
  • AppCallParams - For calling applications

  • +
  • AppCallMethodCallParams - For calling ABI methods on applications

  • +
  • AppUpdateParams - For updating applications

  • +
  • AppUpdateMethodCallParams - For updating applications with ABI method calls

  • +
  • AppDeleteParams - For deleting applications

  • +
  • AppDeleteMethodCallParams - For deleting applications with ABI method calls

  • +
  • OnlineKeyRegistrationParams - For online key registration transactions

  • +
  • OfflineKeyRegistrationParams - For offline key registration transactions

  • +
+

The methods to construct a transaction are all named add_{transaction_type} and return an instance of the composer so they can be chained together fluently to construct a transaction group.

+

For example:

+
from algokit_utils import AlgoAmount
+from algokit_utils.transactions import AppCallMethodCallParams, PaymentParams
+
+result = (
+    algorand.new_group()
+    .add_payment(PaymentParams(
+        sender="SENDER",
+        receiver="RECEIVER",
+        amount=AlgoAmount.from_micro_algos(100),
+        note=b"Payment note"
+    ))
+    .add_app_call_method_call(AppCallMethodCallParams(
+        sender="SENDER",
+        app_id=123,
+        method=abi_method,
+        args=[1, 2, 3],
+        boxes=[box_reference]  # Optional box references
+    ))
+)
+
+
+
+
+

Simulating a transaction

+

Transactions can be simulated using the simulate endpoint in algod, which enables evaluating the transaction on the network without it actually being committed to a block. +This is a powerful feature, which has a number of options which are detailed in the simulate API docs.

+

The simulate() method accepts several optional parameters that are passed through to the algod simulate endpoint:

+
    +
  • allow_more_logs: bool | None - Allow more logs than standard

  • +
  • allow_empty_signatures: bool | None - Allow transactions without signatures

  • +
  • allow_unnamed_resources: bool | None - Allow unnamed resources in app calls

  • +
  • extra_opcode_budget: int | None - Additional opcode budget

  • +
  • exec_trace_config: SimulateTraceConfig | None - Execution trace configuration

  • +
  • simulation_round: int | None - Round to simulate at

  • +
  • skip_signatures: int | None - Skip signature verification

  • +
+

For example:

+
result = (
+    algorand.new_group()
+    .add_payment(PaymentParams(
+        sender="SENDER",
+        receiver="RECEIVER",
+        amount=AlgoAmount.from_micro_algos(100)
+    ))
+    .add_app_call_method_call(AppCallMethodCallParams(
+        sender="SENDER",
+        app_id=123,
+        method=abi_method,
+        args=[1, 2, 3]
+    ))
+    .simulate()
+)
+
+# Access simulation results
+simulate_response = result.simulate_response
+confirmations = result.confirmations
+transactions = result.transactions
+returns = result.returns  # ABI returns if any
+
+
+
+

Simulate without signing

+

There are situations where you may not be able to (or want to) sign the transactions when executing simulate. +In these instances you should set skip_signatures=True which automatically builds empty transaction signers and sets both fix-signers and allow-empty-signatures to True when sending the algod API call.

+

For example:

+
result = (
+    algorand.new_group()
+    .add_payment(PaymentParams(
+        sender="SENDER",
+        receiver="RECEIVER",
+        amount=AlgoAmount.from_micro_algos(100)
+    ))
+    .add_app_call_method_call(AppCallMethodCallParams(
+        sender="SENDER",
+        app_id=123,
+        method=abi_method,
+        args=[1, 2, 3]
+    ))
+    .simulate(
+        skip_signatures=True,
+        allow_more_logs=True,  # Optional: allow more logs
+        extra_opcode_budget=700  # Optional: increase opcode budget
+    )
+)
+
+
+
+
+

Resource Population

+

The TransactionComposer includes automatic resource population capabilities for application calls. When sending or simulating transactions, it can automatically detect and populate required references for:

+
    +
  • Account references

  • +
  • Application references

  • +
  • Asset references

  • +
  • Box references

  • +
+

This happens automatically when either:

+
    +
  1. The global algokit_utils.config instance is set to populate_app_call_resources=True (default is False)

  2. +
  3. The populate_app_call_resources parameter is explicitly passed as True when sending transactions

  4. +
+
# Automatic resource population
+result = (
+    algorand.new_group()
+    .add_app_call_method_call(AppCallMethodCallParams(
+        sender="SENDER",
+        app_id=123,
+        method=abi_method,
+        args=[1, 2, 3]
+        # Resources will be automatically populated!
+    ))
+    .send(params=SendParams(populate_app_call_resources=True))
+)
+
+# Or disable automatic population
+result = (
+    algorand.new_group()
+    .add_app_call_method_call(AppCallMethodCallParams(
+        sender="SENDER",
+        app_id=123,
+        method=abi_method,
+        args=[1, 2, 3],
+        # Explicitly specify required resources
+        account_references=["ACCOUNT"],
+        app_references=[456],
+        asset_references=[789],
+        box_references=[box_reference]
+    ))
+    .send(params=SendParams(populate_app_call_resources=False))
+)
+
+
+

The resource population:

+
    +
  • Respects the maximum limits (4 for accounts, 8 for foreign references)

  • +
  • Handles cross-reference resources efficiently (e.g., asset holdings and local state)

  • +
  • Automatically distributes resources across multiple transactions in a group when needed

  • +
  • Raises descriptive errors if resource limits are exceeded

  • +
+

This feature is particularly useful when:

+
    +
  • Working with complex smart contracts that access various resources

  • +
  • Building transaction groups where resources need to be coordinated

  • +
  • Developing applications where resource requirements may change dynamically

  • +
+

Note: Resource population uses simulation under the hood to detect required resources, so it may add a small overhead to transaction preparation time.

+
+
+

Covering App Call Inner Transaction Fees

+

cover_app_call_inner_transaction_fees automatically calculate the required fee for a parent app call transaction that sends inner transactions. It leverages the simulate endpoint to discover the inner transactions sent and calculates a fee delta to resolve the optimal fee. This feature also takes care of accounting for any surplus transaction fee at the various levels, so as to effectively minimise the fees needed to successfully handle complex scenarios. This setting only applies when you have constucted at least one app call transaction.

+

For example:

+
myMethod = algosdk.ABIMethod.fromSignature('my_method()void')
+result = algorand
+  .new_group()
+  .add_app_call_method_call(AppCallMethodCallParams(
+    sender: 'SENDER',
+    app_id=123,
+    method=myMethod,
+    args=[1, 2, 3],
+    max_fee=AlgoAmount.from_micro_algo(5000), # NOTE: a maxFee value is required when enabling coverAppCallInnerTransactionFees
+  ))
+  .send(send_params={"cover_app_call_inner_transaction_fees": True})
+
+
+

Assuming the app account is not covering any of the inner transaction fees, if my_method in the above example sends 2 inner transactions, then the fee calculated for the parent transaction will be 3000 µALGO when the transaction is sent to the network.

+

The above example also has a max_fee of 5000 µALGO specified. An exception will be thrown if the transaction fee execeeds that value, which allows you to set fee limits. The max_fee field is required when enabling cover_app_call_inner_transaction_fees.

+

Because max_fee is required and an algosdk.Transaction does not hold any max fee information, you cannot use the generic add_transaction() method on the composer with cover_app_call_inner_transaction_fees enabled. Instead use the below, which provides a better overall experience:

+
my_method = algosdk.abi.Method.from_signature('my_method()void')
+
+# Does not work
+result = algorand
+  .new_group()
+  .add_transaction(localnet.algorand.create_transaction.app_call_method_call(
+    AppCallMethodCallParams(
+        sender='SENDER',
+        app_id=123,
+        method=my_method,
+        args=[1, 2, 3],
+        max_fee=AlgoAmount.from_micro_algos(5000), # This is only used to create the algosdk.Transaction object and isn't made available to the composer.
+      )
+    ).transactions[0]
+  )
+  .send(send_params={"cover_app_call_inner_transaction_fees": True})
+
+# Works as expected
+result = algorand
+  .new_group()
+  .add_app_call_method_call(AppCallMethodCallParams(
+    sender='SENDER',
+    app_id=123,
+    method=my_method,
+    args=[1, 2, 3],
+    max_fee=AlgoAmount.from_micro_algos(5000),
+  ))
+  .send(send_params={"cover_app_call_inner_transaction_fees": True})
+
+
+

A more complex valid scenario which leverages an app client to send an ABI method call with ABI method call transactions argument is below:

+
app_factory = algorand.client.get_app_factory(
+  app_spec='APP_SPEC',
+  default_sender=sender.addr,
+)
+
+app_client_1, _ = app_factory.send.bare.create()
+app_client_2, _ = app_factory.send.bare.create()
+
+payment_arg = algorand.create_transaction.payment(
+  PaymentParams(
+    sender=sender.addr,
+    receiver=receiver.addr,
+    amount=AlgoAmount.from_micro_algos(1),
+  )
+)
+
+# Note the use of .params. here, this ensure that maxFee is still available to the composer
+app_call_arg = app_client_2.params.call(
+  AppCallMethodCallParams(
+    method='my_other_method',
+    args=[],
+    max_fee=AlgoAmount.from_micro_algos(2000),
+  )
+)
+
+result = app_client_1.algorand
+  .new_group()
+  .add_app_call_method_call(
+    app_client_1.params.call(
+      AppClientMethodCallParams(
+        method='my_method',
+        args=[payment_arg, app_call_arg],
+        max_fee=AlgoAmount.from_micro_algos(5000),
+      )
+    ),
+  )
+  .send({"cover_app_call_inner_transaction_fees": True})
+
+
+

This feature should efficiently calculate the minimum fee needed to execute an app call transaction with inners, however we always recommend testing your specific scenario behaves as expected before releasing.

+
+

Read-only calls

+

When invoking a readonly method, the transaction is simulated rather than being fully processed by the network. This allows users to call these methods without paying a fee.

+

Even though no actual fee is paid, the simulation still evaluates the transaction as if a fee was being paid, therefore op budget and fee coverage checks are still performed.

+

Because no fee is actually paid, calculating the minimum fee required to successfully execute the transaction is not required, and therefore we don’t need to send an additional simulate call to calculate the minimum fee, like we do with a non readonly method call.

+

The behaviour of enabling cover_app_call_inner_transaction_fees for readonly method calls is very similar to non readonly method calls, however is subtly different as we use max_fee as the transaction fee when executing the readonly method call.

+
+
+
+

Covering App Call Op Budget

+

The high level Algorand contract authoring languages all have support for ensuring appropriate app op budget is available via ensure_budget in Algorand Python, ensureBudget in Algorand TypeScript and increaseOpcodeBudget in TEALScript. This is great, as it allows contract authors to ensure appropriate budget is available by automatically sending op-up inner transactions to increase the budget available. These op-up inner transactions require the fees to be covered by an account, which is generally the responsibility of the application consumer.

+

Application consumers may not be immediately aware of the number of op-up inner transactions sent, so it can be difficult for them to determine the exact fees required to successfully execute an application call. Fortunately the cover_app_call_inner_transaction_fees setting above can be leveraged to automatically cover the fees for any op-up inner transaction that an application sends. Additionally if a contract author decides to cover the fee for an op-up inner transaction, then the application consumer will not be charged a fee for that transaction.

+
+
+
+ +
+
+ +
+ +
+
+ + + + + \ No newline at end of file diff --git a/docs/html/capabilities/transaction.html b/docs/html/capabilities/transaction.html new file mode 100644 index 00000000..03ccb768 --- /dev/null +++ b/docs/html/capabilities/transaction.html @@ -0,0 +1,560 @@ + + + + + + + + + Transaction management - algokit-utils-py 3.0 documentation + + + + + + + + + + + + + + + + + Contents + + + + + + Menu + + + + + + + + Expand + + + + + + Light mode + + + + + + + + + + + + + + Dark mode + + + + + + + Auto light/dark, in light mode + + + + + + + + + + + + + + + Auto light/dark, in dark mode + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +Skip to content + + + +
+
+
+ +
+ +
+
+ +
+ +
+
+ +
+
+
+ + + + + Back to top + +
+ +
+ +
+ +
+
+
+

Transaction management

+

Transaction management is one of the core capabilities provided by AlgoKit Utils. It allows you to construct, simulate and send single or grouped transactions with consistent and highly configurable semantics, including configurable control of transaction notes, logging, fees, multiple sender account types, and sending behavior.

+
+

Transaction Results

+

All AlgoKit Utils functions that send transactions return either a SendSingleTransactionResult or SendAtomicTransactionComposerResults, providing consistent mechanisms to interpret transaction outcomes.

+
+

SendSingleTransactionResult

+

The base SendSingleTransactionResult class is used for single transactions:

+
@dataclass(frozen=True, kw_only=True)
+class SendSingleTransactionResult:
+    transaction: TransactionWrapper  # Last transaction
+    confirmation: AlgodResponseType  # Last confirmation
+    group_id: str
+    tx_id: str | None = None  # Transaction ID of the last transaction
+    tx_ids: list[str]  # All transaction IDs in the group
+    transactions: list[TransactionWrapper]
+    confirmations: list[AlgodResponseType]
+    returns: list[ABIReturn] | None = None  # ABI returns if applicable
+
+
+

Common variations include:

+
    +
  • SendSingleAssetCreateTransactionResult - Adds asset_id

  • +
  • SendAppTransactionResult - Adds abi_return

  • +
  • SendAppUpdateTransactionResult - Adds compilation results

  • +
  • SendAppCreateTransactionResult - Adds app_id and app_address

  • +
+
+
+

SendAtomicTransactionComposerResults

+

When using the atomic transaction composer directly via TransactionComposer.send() or TransactionComposer.simulate(), you’ll receive a SendAtomicTransactionComposerResults:

+
@dataclass
+class SendAtomicTransactionComposerResults:
+    group_id: str  # The group ID if this was a transaction group
+    confirmations: list[AlgodResponseType]  # The confirmation info for each transaction
+    tx_ids: list[str]  # The transaction IDs that were sent
+    transactions: list[TransactionWrapper]  # The transactions that were sent
+    returns: list[ABIReturn]  # The ABI return values from any ABI method calls
+    simulate_response: dict[str, Any] | None = None  # Simulation response if simulated
+
+
+
+
+

Application-specific Result Types

+

When working with applications via AppClient or AppFactory, you’ll get enhanced result types that provide direct access to parsed ABI values:

+
    +
  • SendAppFactoryTransactionResult

  • +
  • SendAppUpdateFactoryTransactionResult

  • +
  • SendAppCreateFactoryTransactionResult

  • +
+

These types extend the base transaction results to add an abi_value field that contains the parsed ABI return value according to the ARC-56 specification. The Arc56ReturnValueType can be:

+
    +
  • A primitive ABI value (bool, int, str, bytes)

  • +
  • An ABI struct (as a Python dict)

  • +
  • None (for void returns)

  • +
+
+
+

Where You’ll Encounter Each Result Type

+

Different interfaces return different result types:

+
    +
  1. Direct Transaction Composer

    +
      +
    • TransactionComposer.send()SendAtomicTransactionComposerResults

    • +
    • TransactionComposer.simulate()SendAtomicTransactionComposerResults

    • +
    +
  2. +
  3. AlgorandClient Methods

    +
      +
    • .send.payment()SendSingleTransactionResult

    • +
    • .send.asset_create()SendSingleAssetCreateTransactionResult

    • +
    • .send.app_call()SendAppTransactionResult (contains raw ABI return)

    • +
    • .send.app_create()SendAppCreateTransactionResult (with app ID/address)

    • +
    • .send.app_update()SendAppUpdateTransactionResult (with compilation info)

    • +
    +
  4. +
  5. AppClient Methods

    +
      +
    • .call()SendAppTransactionResult

    • +
    • .create()SendAppCreateTransactionResult

    • +
    • .update()SendAppUpdateTransactionResult

    • +
    +
  6. +
  7. AppFactory Methods

    +
      +
    • .create()SendAppCreateFactoryTransactionResult

    • +
    • .call()SendAppFactoryTransactionResult

    • +
    • .update()SendAppUpdateFactoryTransactionResult

    • +
    +
  8. +
+

Example usage with AppFactory for easy access to ABI returns:

+
# Using AppFactory
+result = app_factory.send.call(AppCallMethodCallParams(
+    method="my_method",
+    args=[1, 2, 3],
+    sender=sender
+))
+# Access the parsed ABI return value directly
+parsed_value = result.abi_value  # Already decoded per ARC-56 spec
+
+# Compared to base AppClient where you need to parse manually
+base_result = app_client.send.call(AppCallMethodCallParams(
+    method="my_method",
+    args=[1, 2, 3],
+    sender=sender
+))
+# Need to manually handle ABI return parsing
+if base_result.abi_return:
+    parsed_value = base_result.abi_return.value
+
+
+

Key differences between result types:

+
    +
  1. Base Transaction Results (SendSingleTransactionResult)

    +
      +
    • Focus on transaction confirmation details

    • +
    • Include group support but optimized for single transactions

    • +
    • No direct ABI value parsing

    • +
    +
  2. +
  3. Atomic Transaction Results (SendAtomicTransactionComposerResults)

    +
      +
    • Built for transaction groups

    • +
    • Include simulation support

    • +
    • Raw ABI returns via .returns

    • +
    • No single transaction convenience fields

    • +
    +
  4. +
  5. Application Results (SendAppTransactionResult family)

    +
      +
    • Add application-specific fields (app_id, compilation results)

    • +
    • Include raw ABI returns via .abi_return

    • +
    • Base application transaction support

    • +
    +
  6. +
  7. Factory Results (SendAppFactoryTransactionResult family)

    +
      +
    • Highest level of abstraction

    • +
    • Direct access to parsed ABI values via .abi_value

    • +
    • Automatic ARC-56 compliant value parsing

    • +
    • Combines app-specific fields with parsed ABI returns

    • +
    +
  8. +
+
+
+
+

Further reading

+

To understand how to create, simulate and send transactions consult:

+ +

The transaction composer documentation covers the details of constructing transactions and transaction groups, while the Algorand client documentation covers the high-level interface for sending transactions.

+
+
+ +
+
+ +
+ +
+
+ + + + + \ No newline at end of file diff --git a/docs/html/capabilities/transfer.html b/docs/html/capabilities/transfer.html index ea1abc7d..6b77cace 100644 --- a/docs/html/capabilities/transfer.html +++ b/docs/html/capabilities/transfer.html @@ -1,175 +1,558 @@ - - - - - - - Algo transfers — algokit-utils 1.0 documentation - - - + + + + + + + + + Algo transfers (payments) - algokit-utils-py 3.0 documentation + + + + + + + + + + + + + + + + + Contents + + + + + + Menu + + + + + + + + Expand + + + + + + Light mode + + + + + + + + + + + + + + Dark mode + + + + + + + Auto light/dark, in light mode + + + + + + + + + + + + + + + Auto light/dark, in dark mode + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +Skip to content + + + +
+
+
+ +
+ +
+
+ +
+ +
+
+ +
+
+
+ + + + + Back to top + +
+ -
-
- -
-

Algo transfers

-

Algo transfers is a higher-order use case capability provided by AlgoKit Utils allows you to easily initiate algo transfers between accounts, including dispenser management and -idempotent account funding.

-

To see some usage examples check out the automated tests.

-
-

Transferring Algos

-

The key function to facilitate Algo transfers is algokit.transfer(algod_client, transfer_parameters), which returns the underlying EnsureFundedResponse and takes a TransferParameters

-

The following fields on TransferParameters are required to transfer ALGOs:

+
+ +
+ +
+
+
+

Algo transfers (payments)

+

Algo transfers, or payments, is a higher-order use case capability provided by AlgoKit Utils that builds on top of the core capabilities, particularly Algo amount handling and Transaction management. It allows you to easily initiate Algo transfers between accounts, including dispenser management and idempotent account funding.

+

To see some usage examples check out the automated tests in the repository.

+
+

payment

+

The key function to facilitate Algo transfers is algorand.send.payment(params) (immediately send a single payment transaction), algorand.create_transaction.payment(params) (construct a payment transaction), or algorand.new_group().add_payment(params) (add payment to a group of transactions) per AlgorandClient transaction semantics.

+

The base type for specifying a payment transaction is PaymentParams, which has the following parameters in addition to the common transaction parameters:

    -
  • from_account: The account or signer that will send the ALGOs

  • -
  • to_address: The address of the account that will receive the ALGOs

  • -
  • micro_algos: The amount of micro ALGOs to send

  • +
  • receiver: str - The address of the account that will receive the Algo

  • +
  • amount: AlgoAmount - The amount of Algo to send

  • +
  • close_remainder_to: Optional[str] - If given, close the sender account and send the remaining balance to this address (warning: use this carefully as it can result in loss of funds if used incorrectly)

+
# Minimal example
+result = algorand_client.send.payment(
+    PaymentParams(
+        sender="SENDERADDRESS",
+        receiver="RECEIVERADDRESS",
+        amount=AlgoAmount(4, "algo")
+    )
+)
+
+# Advanced example
+result2 = algorand_client.send.payment(
+    PaymentParams(
+        sender="SENDERADDRESS",
+        receiver="RECEIVERADDRESS",
+        amount=AlgoAmount(4, "algo"),
+        close_remainder_to="CLOSEREMAINDERTOADDRESS",
+        lease="lease",
+        note=b"note",
+        # Use this with caution, it's generally better to use algorand_client.account.rekey_account
+        rekey_to="REKEYTOADDRESS",
+        # You wouldn't normally set this field
+        first_valid_round=1000,
+        validity_window=10,
+        extra_fee=AlgoAmount(1000, "microalgo"),
+        static_fee=AlgoAmount(1000, "microalgo"),
+        # Max fee doesn't make sense with extra_fee AND static_fee
+        # already specified, but here for completeness
+        max_fee=AlgoAmount(3000, "microalgo"),
+        # Signer only needed if you want to provide one,
+        # generally you'd register it with AlgorandClient
+        # against the sender and not need to pass it in
+        signer=transaction_signer,
+    ),
+    send_params=SendParams(
+        max_rounds_to_wait=5,
+        suppress_log=True,
+    )
+)
+
+
-
-

Ensuring minimum Algos

-

The ability to automatically fund an account to have a minimum amount of disposable ALGOs to spend is incredibly useful for automation and deployment scripts. -The function to facilitate this is ensure_funded(client, parameters), which takes an EnsureBalanceParameters instance and returns the underlying EnsureFundedResponse if a payment was made, a string if the dispenser API was used, or None otherwise.

-

The following fields on EnsureBalanceParameters are required to ensure minimum ALGOs:

+
+

ensure_funded

+

The ensure_funded function automatically funds an account to maintain a minimum amount of disposable Algo. This is particularly useful for automation and deployment scripts that get run multiple times and consume Algo when run.

+

There are 3 variants of this function:

    -
  • account_to_fund: The account address that will receive the ALGOs. This can be an Account instance, an AccountTransactionSigner instance, or a string.

  • -
  • min_spending_balance_micro_algos: The minimum balance of micro ALGOs that the account should have available to spend (i.e. on top of minimum balance requirement).

  • -
  • min_funding_increment_micro_algos: When issuing a funding amount, the minimum amount to transfer (avoids many small transfers if this gets called often on an active account). Default is 0.

  • -
  • funding_source: The account (with private key) or signer that will send the ALGOs. If not set, it will use get_dispenser_account. This can be an Account instance, an AccountTransactionSigner instance, TestNetDispenserApiClient instance, or None.

  • -
  • suggested_params: (optional) Transaction parameters, an instance of SuggestedParams.

  • -
  • note: (optional) The transaction note, default is “Funding account to meet minimum requirement”.

  • -
  • fee_micro_algos: (optional) The flat fee you want to pay, useful for covering extra fees in a transaction group or app call.

  • -
  • max_fee_micro_algos: (optional) The maximum fee that you are happy to pay (default: unbounded). If this is set it’s possible the transaction could get rejected during network congestion.

  • -
-

The function calls Algod to find the current balance and minimum balance requirement, gets the difference between those two numbers and checks to see if it’s more than the min_spending_balance_micro_algos. If so, it will send the difference, or the min_funding_increment_micro_algos if that is specified. If the account is on TestNet and use_dispenser_api is True, the AlgoKit TestNet Dispenser API will be used to fund the account.

-
-

Please note, if you are attempting to fund via Dispenser API, make sure to set ALGOKIT_DISPENSER_ACCESS_TOKEN environment variable prior to invoking ensure_funded. To generate the token refer to AlgoKit CLI documentation

-
-
-
-

Transfering Assets

-

The key function to facilitate asset transfers is transfer_asset(algod_client, transfer_parameters), which returns a AssetTransferTxn and takes a TransferAssetParameters:

-

The following fields on TransferAssetParameters are required to transfer assets:

+
  • algorand_client.account.ensure_funded(account_to_fund, dispenser_account, min_spending_balance, options) - Funds a given account using a dispenser account as a funding source such that the given account has a certain amount of Algo free to spend (accounting for Algo locked in minimum balance requirement).

  • +
  • algorand_client.account.ensure_funded_from_environment(account_to_fund, min_spending_balance, options) - Funds a given account using a dispenser account retrieved from the environment, per the dispenser_from_environment method, as a funding source such that the given account has a certain amount of Algo free to spend (accounting for Algo locked in minimum balance requirement).

    +
      +
    • Note: requires environment variables to be set.

    • +
    • The dispenser account is retrieved from the account mnemonic stored in DISPENSER_MNEMONIC and optionally DISPENSER_SENDER +if it’s a rekeyed account, or against default LocalNet if no environment variables present.

    • +
    +
  • +
  • algorand_client.account.ensure_funded_from_testnet_dispenser_api(account_to_fund, dispenser_client, min_spending_balance, options) - Funds a given account using the TestNet Dispenser API as a funding source such that the account has a certain amount of Algo free to spend (accounting for Algo locked in minimum balance requirement).

  • + +

    The general structure of these calls is similar, they all take:

    +
      +
    • account_to_fund: str | Account - Address or signing account of the account to fund

    • +
    • The source (dispenser):

      +
        +
      • In ensure_funded: dispenser_account: str | Account - the address or signing account of the account to use as a dispenser

      • +
      • In ensure_funded_from_environment: Not specified, loaded automatically from the ephemeral environment

      • +
      • In ensure_funded_from_testnet_dispenser_api: dispenser_client: TestNetDispenserApiClient - a client instance of the TestNet dispenser API

      • +
      +
    • +
    • min_spending_balance: AlgoAmount - The minimum balance of Algo that the account should have available to spend (i.e., on top of the minimum balance requirement)

    • +
    • An options object, which has:

      +
        +
      • Common transaction parameters (not for TestNet Dispenser API)

      • +
      • Execution parameters (not for TestNet Dispenser API)

      • +
      • min_funding_increment: Optional[AlgoAmount] - When issuing a funding amount, the minimum amount to transfer; this avoids many small transfers if this function gets called often on an active account

      • +
      +
    • +
    +
    +

    Examples

    +
    # From account
    +
    +# Basic example
    +algorand_client.account.ensure_funded("ACCOUNTADDRESS", "DISPENSERADDRESS", AlgoAmount(1, "algo"))
    +# With configuration
    +algorand_client.account.ensure_funded(
    +    "ACCOUNTADDRESS",
    +    "DISPENSERADDRESS",
    +    AlgoAmount(1, "algo"),
    +    min_funding_increment=AlgoAmount(2, "algo"),
    +    fee=AlgoAmount(1000, "microalgo"),
    +    send_params=SendParams(
    +        suppress_log=True,
    +    ),
    +)
    +
    +# From environment
    +
    +# Basic example
    +algorand_client.account.ensure_funded_from_environment("ACCOUNTADDRESS", AlgoAmount(1, "algo"))
    +# With configuration
    +algorand_client.account.ensure_funded_from_environment(
    +    "ACCOUNTADDRESS",
    +    AlgoAmount(1, "algo"),
    +    min_funding_increment=AlgoAmount(2, "algo"),
    +    fee=AlgoAmount(1000, "microalgo"),
    +    send_params=SendParams(
    +        suppress_log=True,
    +    ),
    +)
    +
    +# TestNet Dispenser API
    +
    +# Basic example
    +algorand_client.account.ensure_funded_from_testnet_dispenser_api(
    +    "ACCOUNTADDRESS",
    +    algorand_client.client.get_testnet_dispenser_from_environment(),
    +    AlgoAmount(1, "algo")
    +)
    +# With configuration
    +algorand_client.account.ensure_funded_from_testnet_dispenser_api(
    +    "ACCOUNTADDRESS",
    +    algorand_client.client.get_testnet_dispenser_from_environment(),
    +    AlgoAmount(1, "algo"),
    +    min_funding_increment=AlgoAmount(2, "algo"),
    +)
    +
    +
    +

    All 3 variants return an EnsureFundedResponse (and the first two also return a single transaction result) if a funding transaction was needed, or None if no transaction was required:

      -
    • from_account: The account or signer that will send the ALGOs

    • -
    • to_address: The address of the account that will receive the ALGOs

    • -
    • asset_id: The asset id that will be transfered

    • -
    • amount: The amount to send as the smallest divisible unit value

    • +
    • amount_funded: AlgoAmount - The number of Algo that was paid

    • +
    • transaction_id: str - The ID of the transaction that funded the account

    +

    If you are using the TestNet Dispenser API then the transaction_id is useful if you want to use the refund functionality.

    +
    -

    Dispenser

    -

    If you want to programmatically send funds then you will often need a “dispenser” account that has a store of ALGOs that can be sent and a private key available for that dispenser account.

    -

    There is a standard AlgoKit Utils function to get access to a dispenser account: get_dispenser_account. When running against -LocalNet, the dispenser account can be automatically determined using the -Kmd API. When running against other networks like TestNet or MainNet the mnemonic of the dispenser account can be provided via environment -variable DISPENSER_MNEMONIC

    -

    Please note that this does not refer to the AlgoKit TestNet Dispenser API which is a separate abstraction that can be used to fund accounts on TestNet via dedicated API service.

    +

    Dispenser

    +

    If you want to programmatically send funds to an account so it can transact then you will often need a “dispenser” account that has a store of Algo that can be sent and a private key available for that dispenser account.

    +

    There’s a number of ways to get a dispensing account in AlgoKit Utils:

    +
    - -
    + +
    + +
    - + + +
    - - - + + + + + \ No newline at end of file diff --git a/docs/html/capabilities/typed-app-clients.html b/docs/html/capabilities/typed-app-clients.html new file mode 100644 index 00000000..91944a49 --- /dev/null +++ b/docs/html/capabilities/typed-app-clients.html @@ -0,0 +1,585 @@ + + + + + + + + + Typed application clients - algokit-utils-py 3.0 documentation + + + + + + + + + + + + + + + + + Contents + + + + + + Menu + + + + + + + + Expand + + + + + + Light mode + + + + + + + + + + + + + + Dark mode + + + + + + + Auto light/dark, in light mode + + + + + + + + + + + + + + + Auto light/dark, in dark mode + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +Skip to content + + + +
    +
    +
    + +
    + +
    +
    + +
    + +
    +
    + +
    +
    +
    + + + + + Back to top + +
    + +
    + +
    + +
    +
    +
    +

    Typed application clients

    +

    Typed application clients are automatically generated, typed Python deployment and invocation clients for smart contracts that have a defined ARC-56 or ARC-32 application specification so that the development experience is easier with less upskill ramp-up and less deployment errors. These clients give you a type-safe, intellisense-driven experience for invoking the smart contract.

    +

    Typed application clients are the recommended way of interacting with smart contracts. If you don’t have/want a typed client, but have an ARC-56/ARC-32 app spec then you can use the non-typed application clients and if you want to call a smart contract you don’t have an app spec file for you can use the underlying app management and app deployment functionality to manually construct transactions.

    +
    +

    Generating an app spec

    +

    You can generate an app spec file:

    + +
    +
    +

    Generating a typed client

    +

    To generate a typed client from an app spec file you can use AlgoKit CLI:

    +
    > algokit generate client application.json --output /absolute/path/to/client.py
    +
    +
    +

    Note: AlgoKit Utils >= 3.0.0 is compatible with the older 1.x.x generated typed clients, however if you want to utilise the new features or leverage ARC-56 support, you will need to generate using >= 2.x.x. See AlgoKit CLI generator version pinning for more information on how to lock to a specific version.

    +
    +
    +

    Getting a typed client instance

    +

    To get an instance of a typed client you can use an AlgorandClient instance or a typed app Factory instance.

    +

    The approach to obtaining a client instance depends on how many app clients you require for a given app spec and if the app has already been deployed, which is summarised below:

    +
    +

    App is deployed

    + + + + + + + + + + + + + + + + + + + + + +
    Resolve App by IDResolve App by Creator and Name
    Single App Client InstanceMultiple App Client InstancesSingle App Client InstanceMultiple App Client Instances
    +
    app_client = algorand.client.get_typed_app_client_by_id(MyContractClient, {
    +  app_id=1234,
    +  # ...
    +})
    +# or
    +app_client = MyContractClient({
    +  algorand,
    +  app_id=1234,
    +  # ...
    +})
    +
    +
    +
    +
    app_client1 = factory.get_app_client_by_id(
    +  app_id=1234,
    +  # ...
    +)
    +app_client2 = factory.get_app_client_by_id(
    +  app_id=4321,
    +  # ...
    +)
    +
    +
    +
    +
    app_client = algorand.client.get_typed_app_client_by_creator_and_name(
    +  MyContractClient,
    +  creator_address="CREATORADDRESS",
    +  app_name="contract-name",
    +  # ...
    +)
    +# or
    +app_client = MyContractClient.from_creator_and_name(
    +  algorand,
    +  creator_address="CREATORADDRESS",
    +  app_name="contract-name",
    +  # ...
    +)
    +
    +
    +
    +
    app_client1 = factory.get_app_client_by_creator_and_name(
    +  creator_address="CREATORADDRESS",
    +  app_name="contract-name",
    +  # ...
    +)
    +app_client2 = factory.get_app_client_by_creator_and_name(
    +  creator_address="CREATORADDRESS",
    +  app_name="contract-name-2",
    +  # ...
    +)
    +
    +
    +
    +

    To understand the difference between resolving by ID vs by creator and name see the underlying app client documentation.

    +
    +
    +

    App is not deployed

    + + + + + + + + + + + + + +
    Deploy a New AppDeploy or Resolve App Idempotently by Creator and Name
    +
    app_client, response = factory.deploy(
    +  args=[],
    +  # ...
    +)
    +# or
    +app_client, response = factory.send.create.METHODNAME(
    +  args=[],
    +  # ...
    +)
    +
    +
    +
    +
    app_client, response = factory.deploy(
    +  app_name="contract-name",
    +  # ...
    +)
    +
    +
    +
    +
    +
    +

    Creating a typed factory instance

    +

    If your scenario calls for an app factory, you can create one using the below:

    +
    factory = algorand.client.get_typed_app_factory(MyContractFactory)
    +# or
    +factory = MyContractFactory(algorand)
    +
    +
    +
    +
    +
    +

    Client usage

    +

    See the official usage docs for full details.

    +

    For a simple example that deploys a contract and calls a "hello" method, see below:

    +
    # A similar working example can be seen in the AlgoKit init production smart contract templates, when using Python deployment
    +# In this case the generated factory is called `HelloWorldAppFactory` and is in `./artifacts/HelloWorldApp/client.py`
    +from artifacts.hello_world_app.client import HelloWorldAppClient, HelloArgs
    +from algokit_utils import AlgorandClient
    +
    +# These require environment variables to be present, or it will retrieve from default LocalNet
    +algorand = AlgorandClient.from_environment()
    +deployer = algorand.account.from_environment("DEPLOYER", AlgoAmount.from_algo(1))
    +
    +# Create the typed app factory
    +factory = algorand.client.get_typed_app_factory(HelloWorldAppFactory,
    +  creator_address=deployer,
    +  default_sender=deployer,
    +)
    +
    +# Create the app and get a typed app client for the created app (note: this creates a new instance of the app every time,
    +#  you can use .deploy() to deploy idempotently if the app wasn't previously
    +#  deployed or needs to be updated if that's allowed)
    +app_client, response = factory.send.create()
    +
    +# Make a call to an ABI method and print the result
    +response = app_client.send.hello(args=HelloArgs(name="world"))
    +print(response)
    +
    +
    +
    +
    + +
    +
    + +
    + +
    +
    + + + + + \ No newline at end of file diff --git a/docs/html/genindex.html b/docs/html/genindex.html index ecf8a20e..97863f31 100644 --- a/docs/html/genindex.html +++ b/docs/html/genindex.html @@ -1,625 +1,3196 @@ - - - - - - Index — algokit-utils 1.0 documentation - - - + + + + + + + Index - algokit-utils-py 3.0 documentation + + + + + + + + + + + + + - - - - algokit-utils - -
    -
    - - - -
    -
    - + + + + \ No newline at end of file diff --git a/docs/html/index.html b/docs/html/index.html index 36d419d3..0e88f36a 100644 --- a/docs/html/index.html +++ b/docs/html/index.html @@ -1,125 +1,405 @@ - - - - + + + + + + - - AlgoKit Python Utilities — algokit-utils 1.0 documentation - - - + + algokit-utils-py 3.0 documentation + + + + + + + + + + + + + - -
    - - -
    +
    + -
    -
    -
    - -
    +
    + +
    + +
    +
    +
    + + + + + Back to top + +
    + -
    -
    - -
    -

    AlgoKit Python Utilities

    -

    A set of core Algorand utilities written in Python and released via PyPi that make it easier to build solutions on Algorand. -This project is part of AlgoKit.

    -

    The goal of this library is to provide intuitive, productive utility functions that make it easier, quicker and safer to build applications on Algorand. -Largely these functions wrap the underlying Algorand SDK, but provide a higher level interface with sensible defaults and capabilities for common tasks.

    +
    + +
    + +
    +
    +
    +

    AlgoKit Python Utilities

    +

    A set of core Algorand utilities written in Python and released via PyPi that make it easier to build solutions on Algorand. This project is part of AlgoKit.

    +

    The goal of this library is to provide intuitive, productive utility functions that make it easier, quicker and safer to build applications on Algorand. Largely these functions wrap the underlying Algorand SDK, but provide a higher level interface with sensible defaults and capabilities for common tasks.

    Note

    If you prefer TypeScript there’s an equivalent TypeScript utility library.

    -

    Core principles | Installation | Usage | Capabilities | Reference docs

    +

    Core principles | Installation | Usage | Config and logging | Capabilities | Reference docs

    Contents

    -

    Core principles

    -

    This library is designed with the following principles:

    +

    Core principles

    +

    This library follows the Guiding Principles of AlgoKit and is designed with the following principles:

      -
    • Modularity - This library is a thin wrapper of modular building blocks over the Algorand SDK; the primitives from the underlying Algorand SDK are -exposed and used wherever possible so you can opt-in to which parts of this library you want to use without having to use an all or nothing approach.

    • -
    • Type-safety - This library provides strong TypeScript support with effort put into creating types that provide good type safety and intellisense.

    • -
    • Productivity - This library is built to make solution developers highly productive; it has a number of mechanisms to make common code easier and terser to write

    • +
    • Modularity - This library is a thin wrapper of modular building blocks over the Algorand SDK; the primitives from the underlying Algorand SDK are exposed and used wherever possible so you can opt-in to which parts of this library you want to use without having to use an all or nothing approach.

    • +
    • Type-safety - This library provides strong type hints with effort put into creating types that provide good type safety and intellisense when used with tools like MyPy.

    • +
    • Productivity - This library is built to make solution developers highly productive; it has a number of mechanisms to make common code easier and terser to write.

    -

    Installation

    -

    This library can be installed from PyPi using pip or poetry, e.g.:

    -
    pip install algokit-utils
    -poetry add algokit-utils
    +

    Installation

    +

    This library can be installed from PyPi using pip or poetry:

    +
    pip install algokit-utils
    +# or
    +poetry add algokit-utils
     
    -

    Usage

    -

    To use this library simply include the following at the top of your file:

    -
    import algokit_utils
    +

    Usage

    +

    The main entrypoint to the bulk of the functionality in AlgoKit Utils is the AlgorandClient class. You can get started by using one of the static initialization methods to create an Algorand client:

    +
    # Point to the network configured through environment variables or
    +# if no environment variables it will point to the default LocalNet configuration
    +algorand = AlgorandClient.from_environment()
    +# Point to default LocalNet configuration
    +algorand = AlgorandClient.default_localnet()
    +# Point to TestNet using AlgoNode free tier
    +algorand = AlgorandClient.testnet()
    +# Point to MainNet using AlgoNode free tier
    +algorand = AlgorandClient.mainnet()
    +# Point to a pre-created algod client
    +algorand = AlgorandClient.from_clients(algod=...)
    +# Point to a pre-created algod and indexer client
    +algorand = AlgorandClient.from_clients(algod=..., indexer=..., kmd=...)
    +# Point to custom configuration for algod
    +algod_config = AlgoClientNetworkConfig(server=..., token=..., port=...)
    +algorand = AlgorandClient.from_config(algod_config=algod_config)
    +# Point to custom configuration for algod and indexer and kmd
    +algod_config = AlgoClientNetworkConfig(server=..., token=..., port=...)
    +indexer_config = AlgoClientNetworkConfig(server=..., token=..., port=...)
    +kmd_config = AlgoClientNetworkConfig(server=..., token=..., port=...)
    +algorand = AlgorandClient.from_config(algod_config=algod_config, indexer_config=indexer_config, kmd_config=kmd_config)
     
    -

    Then you can use intellisense to auto-complete the various functions and types that are available by typing algokit_utils. in your favourite Integrated Development Environment (IDE), -or you can refer to the reference documentation.

    +
    +
    +

    Testing

    +

    AlgoKit Utils provides a dedicated documentation page on various useful snippets that can be reused for testing with tools like Pytest:

    + +
    -

    Types

    -

    The library contains extensive type hinting combined with a tool like MyPy this can help identify issues where incorrect types have been used, or used incorrectly.

    +

    Types

    +

    The library leverages Python’s native type hints and is fully compatible with MyPy for static type checking.

    +

    All public abstractions and methods are organized in logical modules matching their domain functionality. You can import types either directly from the root module or from their source submodules. Refer to API documentation for more details.

    +
    +
    +

    Config and logging

    +

    To configure the AlgoKit Utils library you can make use of the Config object, which has a configure method that lets you configure some or all of the configuration options.

    +
    +

    Config singleton

    +

    The AlgoKit Utils configuration singleton can be updated using config.configure(). Refer to the Config API documentation for more details.

    +
    +
    +

    Logging

    +

    AlgoKit has an in-built logging abstraction through the algokit_utils.config.AlgoKitLogger class that provides standardized logging capabilities. The logger is accessible through the config.logger property and provides various logging levels.

    +

    Each method supports optional suppression of output using the suppress_log parameter.

    +
    +
    +

    Debug mode

    +

    To turn on debug mode you can use the following:

    +
    from algokit_utils.config import config
    +config.configure(debug=True)
    +
    +
    +

    To retrieve the current debug state you can use debug property.

    +

    This will turn on things like automatic tracing, more verbose logging and advanced debugging. It’s likely this option will result in extra HTTP calls to algod and it’s worth being careful when it’s turned on.

    -

    Capabilities

    -

    The library helps you with the following capabilities:

    +

    Capabilities

    +

    The library helps you interact with and develop against the Algorand blockchain with a series of end-to-end capabilities as described below:

      -
    • Core capabilities

      +
    • AlgorandClient - The key entrypoint to the AlgoKit Utils functionality

    • +
    • Core capabilities

        -
      • Client management - Creation of algod, indexer and kmd clients against various networks resolved from environment or specified configuration

      • -
      • Account management - Creation and use of accounts including mnemonic, multisig, transaction signer, idempotent KMD accounts and environment variable injected

      • +
      • Client management - Creation of (auto-retry) algod, indexer and kmd clients against various networks resolved from environment or specified configuration, and creation of other API clients (e.g. TestNet Dispenser API and app clients)

      • +
      • Account management - Creation, use, and management of accounts including mnemonic, rekeyed, multisig, transaction signer, idempotent KMD accounts and environment variable injected

      • +
      • Algo amount handling - Reliable, explicit, and terse specification of microAlgo and Algo amounts and safe conversion between them

      • +
      • Transaction management - Ability to construct, simulate and send transactions with consistent and highly configurable semantics, including configurable control of transaction notes, logging, fees, validity, signing, and sending behaviour

    • -
    • Higher-order use cases

      +
    • Higher-order use cases

        -
      • ARC-0032 Application Spec client - Builds on top of the App management and App deployment capabilities to provide a high productivity application client that works with ARC-0032 application spec defined smart contracts (e.g. via Beaker)

      • +
      • Asset management - Creation, transfer, destroying, opting in and out and managing Algorand Standard Assets

      • +
      • Typed application clients - Type-safe application clients that are generated from ARC-56 or ARC-32 application spec files and allow you to intuitively and productively interact with a deployed app, which is the recommended way of interacting with apps and builds on top of the following capabilities:

        +
          +
        • ARC-56 / ARC-32 App client and App factory - Builds on top of the App management and App deployment capabilities (below) to provide a high productivity application client that works with ARC-56 and ARC-32 application spec defined smart contracts

        • +
        • App management - Creation, updating, deleting, calling (ABI and otherwise) smart contract apps and the metadata associated with them (including state and boxes)

        • App deployment - Idempotent (safely retryable) deployment of an app, including deploy-time immutability and permanence control and TEAL template substitution

        • -
        • Algo transfers - Ability to easily initiate algo transfers between accounts, including dispenser management and idempotent account funding

        • -
        • Debugger - Provides a set of debugging tools that can be used to simulate and trace transactions on the Algorand blockchain. These tools and methods are optimized for developers who are building applications on Algorand and need to test and debug their smart contracts via AVM Debugger extension.

      • +
      • Algo transfers (payments) - Ability to easily initiate Algo transfers between accounts, including dispenser management and idempotent account funding

      • +
      • Automated testing - Reusable snippets to leverage AlgoKit Utils abstractions in a manner that are useful for when writing tests in tools like Pytest.

      -
    -
    -

    Reference documentation

    -

    We have auto-generated reference documentation for the code.

    -
    -
    -

    Roadmap

    -

    This library will naturally evolve with any logical developer experience improvements needed to facilitate the AlgoKit roadmap as it evolves.

    -

    Likely future capability additions include:

    -
      -
    • Typed application client

    • -
    • Asset management

    • -
    • Expanded indexer API wrapper support

    • +
    -
    -

    Indices and tables

    - +
    +

    Reference documentation

    +

    For detailed API documentation, see the algokit_utils

    - -
    + +
    +
    - + + +
    +
    - - - +
    + + + + \ No newline at end of file diff --git a/docs/html/objects.inv b/docs/html/objects.inv index 86b4938e794c8a5201cc914786f460dbb0d67a69..a76abe586c6a5944e59370568da4f444693992f4 100644 GIT binary patch delta 13807 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 - - - - - Python Module Index — algokit-utils 1.0 documentation - - - - - - - - - - - - - + + + + + + + Python Module Index - algokit-utils-py 3.0 documentation + + + + + + + + + + + + + + Contents + + + + + + Menu + + + + + + + + Expand + + + + + + Light mode + + + + + + + + + + + + + + Dark mode + + + + + + + Auto light/dark, in light mode + + + + + + + + + + + + + + + Auto light/dark, in dark mode + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + - + + + + - -
    - - -
    - -
    -
    -
    -
      -
    • - -
    • -
    • -
    -
    -
    -
    - - -

    Python Module Index

    - -
    - a -
    - - - - - - - -
     
    - a
    - algokit_utils -
    - +
    -
    +
    + +
    + +
    +
    +
    + + + + + Back to top + +
    +
    +
    -
    - -
    - -
    -

    © Copyright 2023, Algorand Foundation.

    -
    - - Built with Sphinx using a - theme - provided by Read the Docs. - - -
    +
    +
    + +
    +

    Python Module Index

    + +
    + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
     
    a
    + algokit_utils +
        + algokit_utils.accounts +
        + algokit_utils.accounts.account_manager +
        + algokit_utils.accounts.kmd_account_manager +
        + algokit_utils.algorand +
        + algokit_utils.applications +
        + algokit_utils.applications.abi +
        + algokit_utils.applications.app_client +
        + algokit_utils.applications.app_deployer +
        + algokit_utils.applications.app_factory +
        + algokit_utils.applications.app_manager +
        + algokit_utils.applications.app_spec +
        + algokit_utils.applications.app_spec.arc32 +
        + algokit_utils.applications.app_spec.arc56 +
        + algokit_utils.applications.enums +
        + algokit_utils.assets +
        + algokit_utils.assets.asset_manager +
        + algokit_utils.clients +
        + algokit_utils.clients.client_manager +
        + algokit_utils.clients.dispenser_api_client +
        + algokit_utils.config +
        + algokit_utils.errors +
        + algokit_utils.errors.logic_error +
        + algokit_utils.models +
        + algokit_utils.models.account +
        + algokit_utils.models.amount +
        + algokit_utils.models.application +
        + algokit_utils.models.network +
        + algokit_utils.models.simulate +
        + algokit_utils.models.state +
        + algokit_utils.models.transaction +
        + algokit_utils.protocols +
        + algokit_utils.protocols.account +
        + algokit_utils.protocols.typed_clients +
        + algokit_utils.transactions +
        + algokit_utils.transactions.transaction_composer +
        + algokit_utils.transactions.transaction_creator +
        + algokit_utils.transactions.transaction_sender +
    + +
    -
    +
    + + +
    +
    + + Made with Sphinx and @pradyunsg's + + Furo + +
    +
    + +
    +
    + +
    +
    + - - - + + + + + \ No newline at end of file diff --git a/docs/html/search.html b/docs/html/search.html index 471f9b3b..26fcd48b 100644 --- a/docs/html/search.html +++ b/docs/html/search.html @@ -1,127 +1,366 @@ - - - - - - Search — algokit-utils 1.0 documentation - - + + + + + + + + + +Search - algokit-utils-py 3.0 documentation + + + + - + + + + + + + - -
    - - -
    - -
    -
    -
    -
      -
    • - -
    • -
    • -
    -
    -
    -
    - - - - -
    - -
    +
    -
    +
    + +
    + +
    +
    +
    + + + + + Back to top + +
    +
    +
    -
    - -
    - -
    -

    © Copyright 2023, Algorand Foundation.

    -
    + +
    +
    + + - Built with Sphinx using a - theme - provided by Read the Docs. - +
    - -
    +
    -
    +
    + + +
    +
    + + Made with Sphinx and @pradyunsg's + + Furo + +
    +
    + +
    +
    + +
    +
    + - - - - - - - - + + + + + + + + \ No newline at end of file diff --git a/docs/html/searchindex.js b/docs/html/searchindex.js index f6f87f52..8657d5d6 100644 --- a/docs/html/searchindex.js +++ b/docs/html/searchindex.js @@ -1 +1 @@ -Search.setIndex({"docnames": ["apidocs/algokit_utils/algokit_utils", "capabilities/account", "capabilities/app-client", "capabilities/app-deploy", "capabilities/client", "capabilities/debugger", "capabilities/dispenser-client", "capabilities/transfer", "index"], "filenames": ["apidocs/algokit_utils/algokit_utils.md", "capabilities/account.md", "capabilities/app-client.md", "capabilities/app-deploy.md", "capabilities/client.md", "capabilities/debugger.md", "capabilities/dispenser-client.md", "capabilities/transfer.md", "index.md"], "titles": ["algokit_utils", "Account management", "App client", "App deployment", "Client management", "Debugger", "TestNet Dispenser Client", "Algo transfers", "AlgoKit Python Utilities"], "terms": {"appspecstatedict": 0, "typealia": 0, "none": [0, 2, 4, 7], "type": [0, 2, 5, 6], "defin": [0, 2, 3, 8], "applic": [0, 5, 8], "specif": [0, 2, 5], "state": [0, 3, 8], "entri": 0, "deletable_template_nam": 0, "templat": [0, 2, 8], "variabl": [0, 1, 2, 4, 5, 6, 7, 8], "name": [0, 1, 2, 3, 5], "us": [0, 1, 2, 3, 4, 5, 6, 7, 8], "control": [0, 3, 8], "smart": [0, 2, 3, 5, 8], "contract": [0, 2, 3, 5, 8], "i": [0, 1, 2, 3, 4, 5, 6, 7, 8], "delet": [0, 2, 3], "deploy": [0, 2, 7, 8], "defaultargumenttyp": 0, "liter": 0, "valu": [0, 2, 5, 7], "describ": [0, 3], "default": [0, 1, 2, 4, 5, 7, 8], "argument": [0, 6], "sourc": [0, 2, 5], "methodconfigdict": 0, "dictionari": [0, 2], "dict": 0, "oncompletionactionnam": 0, "callconfig": 0, "repres": [0, 1, 5], "allow": [0, 1, 2, 3, 4, 7], "action": [0, 2, 3], "each": [0, 5, 6], "complet": [0, 2, 8], "note_prefix": 0, "algokit_deploy": [0, 3], "j": [0, 3], "arc": [0, 2, 3, 8], "0002": 0, "compliant": [0, 5], "note": [0, 2, 3, 7], "prefix": 0, "deploi": [0, 1, 2, 8], "oncompleteactionnam": 0, "string": [0, 2, 3, 5, 7], "transact": [0, 1, 3, 5, 6, 7, 8], "templatevaluedict": 0, "str": [0, 2], "int": 0, "byte": [0, 3], "templatevaluemap": 0, "map": [0, 2, 3], "updatable_template_nam": 0, "updat": [0, 2, 3, 5], "abicallarg": 0, "base": [0, 1, 2, 3, 4], "deploycallarg": 0, "abical": 0, "abi": 0, "paramet": [0, 7], "an": [0, 1, 4, 5, 7, 8], "when": [0, 1, 2, 3, 5, 7], "call": [0, 3, 5, 7, 8], "abicallargsdict": 0, "deploycallargsdict": 0, "typeddict": 0, "initi": [0, 6, 7, 8], "self": 0, "see": [0, 2, 3, 4, 6, 7], "help": [0, 3, 8], "accur": 0, "signatur": [0, 2], "abicreatecallarg": 0, "deploycreatecallarg": 0, "creat": [0, 1, 3, 4, 5, 8], "abicreatecallargsdict": 0, "deploycreatecallargsdict": 0, "abitransactionrespons": [0, 3], "model": 0, "transactionrespons": [0, 3], "gener": [0, 2, 7, 8], "returntyp": 0, "respons": [0, 2, 5, 6], "decode_error": 0, "except": [0, 2, 6], "detail": [0, 2, 6], "error": [0, 8], "occur": [0, 2, 6], "attempt": [0, 2, 7], "decod": 0, "raw_valu": 0, "method": [0, 1, 3, 5, 6, 8], "algosdk": [0, 1, 2, 4], "make": [0, 2, 6, 7, 8], "The": [0, 2, 3, 4, 5, 6, 7, 8], "raw": [0, 2], "befor": [0, 2], "return_valu": 0, "result": [0, 2, 3], "tx_info": 0, "account": [0, 2, 7, 8], "hold": [0, 3], "private_kei": [0, 1], "address": [0, 1, 2, 6, 7], "field": [0, 3, 6, 7], "thi": [0, 1, 2, 3, 4, 5, 6, 7, 8], "base64": 0, "encod": [0, 3], "privat": [0, 1, 7], "kei": [0, 1, 2, 3, 7], "properti": [0, 1], "public_kei": [0, 1], "public": 0, "signer": [0, 1, 2, 3, 7, 8], "atomic_transaction_compos": [0, 2], "accounttransactionsign": [0, 7], "algoclientconfig": [0, 4], "connect": 0, "v2client": [0, 4], "algod": [0, 3, 4, 7, 8], "algodcli": [0, 2, 4, 5], "index": [0, 2, 3, 4, 8], "indexercli": [0, 4], "server": [0, 4], "url": 0, "servic": [0, 1, 4, 7], "e": [0, 2, 3, 4, 7, 8], "g": [0, 2, 3, 4, 8], "http": [0, 4], "localhost": 0, "4001": 0, "testnet": [0, 1, 3, 4, 7, 8], "api": [0, 6, 7, 8], "algonod": 0, "cloud": 0, "token": [0, 4, 6, 7], "authent": 0, "appdeploymetadata": 0, "metadata": [0, 3], "about": [0, 5], "store": [0, 5, 7], "dure": [0, 2, 3, 7], "creation": [0, 3, 8], "serial": 0, "json": [0, 5], "part": [0, 8], "applicationcli": [0, 2, 3], "applookup": [0, 3], "cach": 0, "appmetadata": [0, 3], "creator": [0, 2, 8], "can": [0, 1, 2, 3, 4, 5, 6, 7, 8], "reduc": 0, "number": [0, 2, 3, 4, 7, 8], "multipl": [0, 2, 3], "app": [0, 7, 8], "discov": 0, "app_id": [0, 2], "apprefer": 0, "inform": [0, 2, 5], "algorand": [0, 3, 5, 8], "algod_cli": [0, 2, 7], "app_spec": [0, 2, 3], "application_specif": 0, "applicationspecif": [0, 2], "pathlib": 0, "path": [0, 5], "0": [0, 2, 3, 6, 7], "indexer_cli": 0, "existing_deploy": 0, "transactionsign": [0, 2], "sender": [0, 1, 2, 3, 6], "suggested_param": [0, 2, 7], "suggestedparam": [0, 2, 7], "template_valu": [0, 2, 3], "app_nam": [0, 2], "A": [0, 2, 5, 8], "wrap": [0, 2, 8], "0032": [0, 2, 3, 8], "spec": [0, 2, 8], "provid": [0, 1, 2, 3, 4, 5, 6, 7, 8], "high": [0, 2, 8], "product": [0, 2, 8], "interact": [0, 6], "exist": [0, 1, 2, 3, 4], "altern": [0, 2, 5], "specifi": [0, 3, 4, 7, 8], "find": [0, 2, 7, 8], "client": [0, 5, 7, 8], "one": [0, 1, 2, 3, 4], "instead": [0, 2, 3], "resolv": [0, 1, 3, 4, 8], "onli": [0, 1, 2, 3], "requir": [0, 2, 6, 7], "sign": [0, 1, 2], "wa": [0, 3, 5, 7], "pass": [0, 2, 6], "all": [0, 2, 3, 5, 8], "associ": [0, 1, 2], "tmpl_": [0, 2, 3], "should": [0, 2, 3, 7], "NOT": 0, "includ": [0, 2, 3, 7, 8], "add_method_cal": 0, "atc": [0, 2], "atomictransactioncompos": [0, 2, 5], "abi_method": 0, "abimethod": 0, "bool": 0, "abi_arg": 0, "abiargsdict": 0, "transactionparamet": 0, "transactionparametersdict": 0, "on_complet": [0, 2], "oncomplet": 0, "noopoc": 0, "local_schema": 0, "stateschema": 0, "global_schema": 0, "approval_program": 0, "clear_program": 0, "extra_pag": [0, 2], "app_arg": 0, "list": [0, 2], "call_config": 0, "au_spec": 0, "add": [0, 3, 8], "call_abi_method": [0, 2], "transaction_paramet": [0, 2], "oncompletecallparamet": [0, 2], "oncompletecallparametersdict": 0, "abi_kwarg": 0, "abiargtyp": 0, "submit": 0, "clear_stat": [0, 2], "clearstat": 0, "close_out": [0, 2], "closeout": 0, "compose_cal": [0, 2], "compose_clear_st": 0, "compose_close_out": 0, "ac": 0, "compose_cr": 0, "createcallparamet": [0, 2], "createcallparametersdict": 0, "id": [0, 2, 3, 6, 7, 8], "schema": [0, 3], "": [0, 2, 3, 6, 7, 8], "compose_delet": 0, "deleteappl": 0, "compose_opt_in": 0, "optin": 0, "compose_upd": 0, "updateappl": 0, "version": [0, 3], "allow_upd": [0, 3], "allow_delet": [0, 3], "on_upd": [0, 3], "onupd": 0, "au_deploi": 0, "fail": [0, 2, 3], "on_schema_break": [0, 3], "onschemabreak": 0, "create_arg": [0, 3], "update_arg": [0, 3], "delete_arg": [0, 3], "deployrespons": [0, 3], "refer": [0, 2, 3, 6, 7], "idempot": [0, 1, 7, 8], "chang": [0, 3], "against": [0, 1, 3, 4, 7, 8], "given": [0, 1, 2, 3, 4], "via": [0, 2, 3, 5, 6, 7, 8], "time": [0, 1, 3, 5, 8], "placehold": 0, "substitut": [0, 8], "To": [0, 2, 3, 4, 5, 6, 7, 8], "understand": [0, 2], "architectur": [0, 3], "decis": [0, 3], "behind": [0, 3], "pleas": [0, 7], "github": 0, "com": [0, 4], "algorandfound": 0, "algokit": [0, 1, 2, 3, 4, 5, 6, 7], "cli": [0, 7], "blob": 0, "main": 0, "doc": [0, 6, 8], "2023": 0, "01": 0, "12_smart": 0, "md": 0, "If": [0, 1, 2, 3, 6, 7, 8], "break": [0, 3], "set": [0, 2, 3, 5, 6, 7, 8], "replaceapp": 0, "re": [0, 1, 2], "differ": [0, 3, 4, 5, 7], "teal": [0, 2, 3, 5, 8], "code": [0, 1, 3, 5, 6, 8], "auto": [0, 8], "increment": [0, 3], "tmpl_delet": [0, 2, 3], "condition": 0, "tmpl_updat": [0, 2, 3], "determin": [0, 3, 7], "what": [0, 2, 3], "take": [0, 2, 3, 4, 5, 6, 7], "ha": [0, 2, 3, 5, 7, 8], "increas": 0, "beyond": 0, "current": [0, 2, 3, 7, 8], "alloc": [0, 2], "return": [0, 1, 2, 4, 6, 7], "taken": [0, 3], "relev": 0, "rais": [0, 6], "deploymenterror": 0, "export_source_map": [0, 2], "export": [0, 2], "approv": [0, 2], "later": 0, "import": [0, 2, 5, 6, 8], "import_source_map": [0, 2], "get_global_st": [0, 2], "fals": [0, 2, 5], "get": [0, 1, 2, 4, 7, 8], "global": [0, 2, 3], "info": 0, "get_local_st": [0, 2], "local": [0, 1, 2, 3], "get_signer_send": 0, "tupl": [0, 2], "Will": 0, "otherwis": [0, 2, 3, 7], "fall": 0, "back": [0, 6], "obtain": [0, 1, 2, 6], "from": [0, 1, 2, 3, 4, 5, 6, 8], "source_map_json": 0, "opt_in": [0, 2], "prepar": 0, "application_cli": 0, "copi": 0, "new": [0, 1, 2, 3], "also": [0, 2, 3, 5], "to_resolv": 0, "defaultargumentdict": 0, "resolve_signer_send": 0, "valueerror": 0, "variant": [0, 2], "pull": 0, "150": 0, "directori": [0, 5], "write": [0, 3, 8], "out": [0, 2, 3, 4, 7], "artifact": [0, 5], "disk": 0, "arg": [0, 3], "option": [0, 2, 3, 4, 7], "where": [0, 2, 5, 8], "written": [0, 8], "enum": 0, "intflag": 0, "3": [0, 2], "handl": [0, 8], "both": [0, 2, 6], "normal": 0, "1": [0, 2, 3, 5], "2": [0, 2, 3, 5], "never": 0, "addit": [0, 1, 2, 8], "createtransactionparamet": 0, "defaultargu": 0, "contain": [0, 1, 2, 3, 5, 6, 8], "ani": [0, 2, 3, 4, 5, 6, 8], "mai": [0, 2], "prior": [0, 7], "some": [0, 1, 2, 3, 4, 7], "target": 0, "relat": 0, "ensurebalanceparamet": [0, 7], "ensur": [0, 8], "minimum": [0, 8], "\u00b5algo": 0, "account_to_fund": [0, 7], "receiv": [0, 6, 7], "fee_micro_algo": [0, 7], "flat": [0, 7], "fee": [0, 2, 7], "you": [0, 1, 2, 3, 4, 5, 6, 7, 8], "want": [0, 5, 7, 8], "pai": [0, 7], "cover": [0, 7], "extra": [0, 7], "group": [0, 5, 7], "funding_sourc": [0, 7], "dispenser_api": 0, "testnetdispenserapicli": [0, 6, 7], "send": [0, 6, 7], "get_dispenser_account": [0, 1, 7], "instanc": [0, 1, 2, 3, 4, 7], "which": [0, 3, 5, 6, 7, 8], "dispens": [0, 1, 8], "max_fee_micro_algo": [0, 7], "maximum": [0, 5, 7], "ar": [0, 1, 2, 3, 4, 5, 6, 7, 8], "happi": [0, 7], "unbound": [0, 7], "possibl": [0, 2, 7, 8], "could": [0, 7], "reject": [0, 7], "network": [0, 2, 3, 7, 8], "congest": [0, 7], "min_funding_increment_micro_algo": [0, 7], "issu": [0, 2, 6, 7, 8], "fund": [0, 1, 7, 8], "amount": [0, 2, 6, 7], "transfer": [0, 5, 8], "avoid": [0, 7], "mani": [0, 7], "small": [0, 7], "often": [0, 2, 7], "activ": [0, 2, 7], "min_spending_balance_micro_algo": [0, 7], "balanc": [0, 7], "algo": [0, 1, 6, 8], "have": [0, 1, 2, 3, 4, 7, 8], "avail": [0, 2, 7, 8], "spend": [0, 7], "top": [0, 3, 7, 8], "meet": [0, 7], "ensurefundedrespons": [0, 7], "transaction_id": [0, 2, 6], "were": 0, "methodhint": 0, "hint": [0, 8], "caller": 0, "how": [0, 6], "kwd": 0, "appendapp": 0, "old": 0, "singl": [0, 2, 3], "been": [0, 2, 3, 8], "updateapp": 0, "clear": [0, 2], "program": [0, 2], "operationperform": 0, "No": 0, "found": [0, 3], "noth": [0, 3, 8], "replac": [0, 2, 3], "date": [0, 3], "origin": [0, 2, 3], "latest": 0, "compil": [0, 2], "fulli": 0, "binari": 0, "match": 0, "pc": [0, 2], "line": [0, 2], "auth_token": [0, 6], "request_timeout": 0, "dispenser_request_timeout": 0, "start": 0, "access": [0, 2, 7], "login": 0, "ci": 0, "constructor": [0, 6], "environ": [0, 1, 3, 4, 5, 6, 7, 8], "algokit_dispenser_access_token": [0, 6, 7], "load": [0, 1, 4], "preced": [0, 6], "request": [0, 3, 6], "timeout": 0, "15": 0, "second": 0, "modifi": 0, "asset_id": [0, 6, 7], "dispenserfundrespons": 0, "get_limit": [0, 6], "dispenserlimitrespons": 0, "limit": [0, 8], "refund": [0, 8], "refund_txn_id": [0, 6], "regist": [0, 8], "box": [0, 2, 3], "collect": 0, "abc": 0, "sequenc": [0, 2], "bytearrai": 0, "foreign_app": [0, 2], "foreign": [0, 2], "foreign_asset": [0, 2], "asset": [0, 2, 5, 6, 8], "leas": [0, 2], "rekey_to": 0, "rekei": 0, "non": [0, 3, 5], "confirmed_round": 0, "round": [0, 5], "confirm": 0, "dry": 0, "run": [0, 4, 7], "static": [0, 3], "from_atr": 0, "atomictransactionrespons": 0, "simulateatomictransactionrespons": 0, "transaction_index": 0, "either": [0, 1, 2, 3, 4], "more": [0, 2, 3, 7], "last": [0, 3, 5], "tx_id": [0, 6], "transferassetparamet": [0, 7], "_transfer": 0, "transferparametersbas": 0, "between": [0, 7, 8], "clawback_from": 0, "perform": [0, 3, 5, 6], "clawback": 0, "oper": [0, 3, 5], "case": [0, 3, 7, 8], "senderaccount": 0, "must": [0, 2, 3], "equal": 0, "asa": 0, "transferparamet": [0, 7], "create_kmd_wallet_account": [0, 1], "kmd_client": 0, "kmd": [0, 1, 4, 7, 8], "kmdclient": [0, 4], "wallet": [0, 1], "ensure_fund": [0, 7], "_ensure_fund": 0, "certain": 0, "free": 0, "lock": 0, "develop": [0, 2, 3, 5, 8], "org": 0, "librari": [0, 8], "paymenttxn": 0, "need": [0, 2, 3, 4, 5, 6, 7, 8], "payment": [0, 5, 6, 7], "indic": [0, 2, 3, 5, 6], "execute_atc_with_logic_error": 0, "wait_round": 0, "4": [0, 2], "approval_source_map": [0, 2], "source_map": [0, 2], "sourcemap": [0, 2, 5], "callabl": 0, "execut": [0, 2, 3], "pars": [0, 2], "logicerror": [0, 2], "abl": [0, 2, 3], "get_account": [0, 1], "fund_with_algo": 0, "float": [0, 5], "1000": [0, 5, 6], "identifi": [0, 1, 2, 8], "localnet": [0, 1, 3, 4, 7], "o": [0, 6], "f": 0, "_mnemon": [0, 1], "mnemon": [0, 1, 7, 8], "secret": 0, "Be": 0, "care": 0, "commit": 0, "ideal": 0, "storag": [0, 3, 5], "rather": [0, 3], "than": [0, 3, 7], "file": [0, 5, 8], "system": 0, "doesn": [0, 3], "t": [0, 3], "work": [0, 1, 2, 3, 8], "seamlessli": 0, "without": [0, 4, 8], "manual": [0, 4], "config": [0, 2, 4, 5], "reset": 0, "account_mnemon": 0, "follow": [0, 2, 3, 4, 5, 7, 8], "object": [0, 2, 3, 4, 5, 6], "automat": [0, 1, 2, 3, 7], "get_account_from_mnemon": [0, 1], "convert": 0, "25": 0, "word": 0, "passphras": 0, "get_algod_cli": [0, 4], "network_cli": 0, "configur": [0, 3, 8], "algod_serv": [0, 4], "algod_port": [0, 4], "algod_token": [0, 4], "get_app_id_from_tx_id": 0, "get_creator_app": [0, 3], "creator_account": 0, "get_default_localnet_config": [0, 4], "point": 0, "dispenser_mnenom": 0, "get_indexer_cli": [0, 4], "indexer_serv": [0, 4], "indexer_port": [0, 4], "indexer_token": [0, 4], "get_kmd_client_from_algod_cli": [0, 4], "suppli": [0, 3], "same": [0, 1, 3, 4], "port": [0, 4], "kmd_port": [0, 4], "4002": [0, 4], "get_kmd_wallet_account": [0, 1], "predic": 0, "get_localnet_default_account": [0, 1], "get_next_vers": 0, "current_vers": 0, "calcul": [0, 2], "next": 0, "semver": 0, "like": [0, 2, 7, 8], "lower": 0, "intend": 0, "mostli": 0, "conveni": [0, 1], "param": [0, 2], "within": 0, "valid": [0, 3], "input": 0, "output": [0, 2, 3, 5], "v1": 0, "beta1": 0, "4567": 0, "4568": 0, "alpha": 0, "deploymentfailederror": 0, "cannot": 0, "get_or_create_kmd_wallet_account": [0, 1], "get_sender_from_sign": 0, "is_localnet": 0, "true": [0, 2, 5, 7], "genesi": 0, "devnet": 0, "sandnet": 0, "is_mainnet": 0, "mainnet": [0, 1, 3, 4, 7], "is_testnet": 0, "num_extra_program_pag": 0, "opt": [0, 2, 8], "blockchain": [0, 5, 8], "place": 0, "its": 0, "100": 0, "000": 0, "microalgo": 0, "integ": 0, "opt_out": 0, "standard": [0, 7], "them": 0, "recov": 0, "optout": 0, "manag": [0, 3, 5, 7, 8], "process": [0, 3], "permit": 0, "discontinu": 0, "It": [0, 1, 3, 4, 5, 6], "essenti": 0, "zero": 0, "persist_sourcemap": 0, "_debug": 0, "persistsourcemapinput": 0, "project_root": [0, 5], "with_sourc": 0, "persist": [0, 5], "avm": [0, 5, 8], "debugg": [0, 8], "root": [0, 5], "project": [0, 5, 8], "dump": 0, "along": 0, "replace_template_vari": 0, "simulate_and_persist_respons": [0, 5], "buffer_size_mb": 0, "256": [0, 5], "simul": [0, 2, 5, 8], "atom": [0, 3, 5], "size": [0, 5], "trace": [0, 8], "buffer": [0, 5], "megabyt": [0, 5], "256mb": 0, "after": [0, 3], "consumpt": [0, 5], "transfer_asset": [0, 7], "assettransfertxn": [0, 7], "core": [1, 3, 4], "capabl": [1, 3, 4, 7], "util": [1, 3, 4, 6, 7], "inject": [1, 8], "well": 1, "encapsul": 1, "There": [1, 2, 3, 4, 7], "variou": [1, 2, 4, 8], "convent": [1, 3], "OR": [1, 2], "ny": 1, "power": 1, "new_account": 1, "generate_account": 1, "dispenser_mnemon": [1, 7], "function": [1, 2, 3, 4, 7, 8], "reli": 1, "being": [1, 3], "expos": [1, 2, 8], "These": [1, 2, 3, 5, 8], "retriev": [1, 3, 4], "beaker": [2, 3, 8], "data": [2, 3, 8], "usag": [2, 3, 4, 7], "exampl": [2, 3, 4, 5, 7], "check": [2, 3, 4, 7], "autom": [2, 3, 4, 7], "test": [2, 3, 4, 5, 7, 8], "wrapper": [2, 8], "correspond": 2, "two": [2, 6, 7], "wai": [2, 4, 6], "instanti": 2, "By": [2, 5], "uncondition": 2, "app_lookup": 2, "search": [2, 5], "under": [2, 3], "overridden": 2, "approach": [2, 8], "deriv": 2, "suggest": 2, "directli": [2, 6], "no_op": 2, "update_appl": 2, "remov": [2, 5], "delete_appl": 2, "close": 2, "support": [2, 3, 8], "everyth": 2, "select": 2, "explicitli": 2, "infer": 2, "bare": 2, "compat": 2, "made": [2, 7], "interpret": 2, "abireturnsubroutin": 2, "method_spec": 2, "algosd": 2, "python": [2, 3, 5], "keyword": 2, "hello": 2, "syntax": 2, "world": 2, "overrid": 2, "app_index": 2, "box_nam": 2, "page": 2, "suffici": 2, "futur": [2, 8], "dataclass": 2, "commoncallparamet": 2, "exact": 2, "depend": [2, 3], "algokit_util": [2, 4, 5, 6, 8], "compose_": 2, "first": [2, 6], "onc": [2, 4], "ad": 2, "For": [2, 5], "execute_atc": 2, "let": 2, "caus": 2, "throw": 2, "becaus": 2, "assert": 2, "lack": 2, "exhaust": 2, "opcod": 2, "budget": 2, "other": [2, 3, 7], "reason": 2, "look": 2, "someth": 2, "transactionpool": 2, "rememb": 2, "eval": 2, "error_messag": 2, "program_counter_valu": 2, "list_of_op_cod": 2, "messag": [2, 6], "combin": [2, 8], "much": 2, "easier": [2, 3, 8], "happen": [2, 3], "thrown": 2, "logic_error": 2, "line_no": 2, "insight": 2, "format": 2, "surround": 2, "extend": 2, "show": 2, "alreadi": [2, 3], "so": [2, 4, 7, 8], "previous": [2, 3], "crucial": 2, "complex": 2, "enabl": [0, 2, 5], "safe": [3, 8], "retryabl": [3, 8], "immut": [3, 8], "perman": [3, 8], "higher": [3, 7, 8], "order": [3, 7, 8], "build": [3, 5, 8], "particularli": 3, "articul": 3, "record": 3, "while": [3, 6], "implement": 3, "natur": [3, 8], "evolv": [3, 8], "over": [3, 8], "diverg": 3, "principl": [3, 4], "goal": [3, 8], "comprehens": 3, "explain": 3, "concept": 3, "lifecycl": 3, "transpil": 3, "verifi": 3, "maintain": 3, "stabil": 3, "qualiti": 3, "final": 3, "runtim": 3, "confid": 3, "correct": 3, "utilis": 3, "furthermor": 3, "characterist": 3, "per": 3, "built": [3, 8], "framework": 3, "0004": 3, "mean": [3, 5], "languag": 3, "typescript": [3, 8], "explicit": 3, "upgrad": 3, "vari": 3, "present": 3, "whether": [3, 5], "had": 3, "creatoraccount": 3, "seri": 3, "lookup": 3, "payload": 3, "boolean": 3, "chronolog": 3, "trivial": 3, "recommend": 3, "durat": 3, "recalcul": 3, "most": [3, 5], "prefer": [3, 4, 8], "fresh": 3, "logic": [3, 4, 8], "detect": 3, "doe": [3, 7], "concert": 3, "reliabl": 3, "popul": 3, "sinc": 3, "again": 3, "appli": 3, "straight": 3, "do": 3, "abov": 3, "abil": [3, 7, 8], "In": 3, "arrai": 3, "wil": 3, "hexadecim": 3, "shouldn": 3, "beaker_product": 3, "action_taken": 3, "done": [3, 6], "up": 3, "create_respons": 3, "update_respons": 3, "delete_respons": 3, "underli": [4, 7, 8], "class": [4, 5, 8], "inlin": 4, "modular": [4, 8], "interfac": [4, 8], "produc": 4, "myalgodnod": 4, "secret_token": 4, "get_algonode_config": 4, "node": 4, "configorport": 4, "assumpt": 4, "host": 4, "packag": 5, "tool": [5, 8], "optim": [5, 8], "who": [5, 8], "extens": [0, 5, 8], "py": 5, "updatableconfig": 5, "attribut": 5, "mode": 5, "ignor": 5, "insid": 5, "toml": 5, "simpli": [5, 8], "folder": 5, "algokit_project_root": 5, "trace_al": 5, "endpoint": [5, 6], "etc": 5, "trace_buffer_size_mb": 5, "exceed": 5, "oldest": 5, "max_search_depth": 5, "depth": 5, "travers": 5, "10": 5, "assum": 5, "your": [5, 6, 8], "simplifi": 5, "gather": 5, "thei": 5, "timestamp": 5, "_lr": 5, "last_round": 5, "_": 5, "transaction_typ": 5, "iso": 5, "8601": 5, "colon": 5, "period": 5, "count": 5, "separ": [5, 7], "underscor": 5, "might": 5, "20220301t123456z_lr1000_2": [], "pay_1": [], "axfer": [], "2022": 5, "03": 5, "01t12": 5, "34": 5, "56z": 5, "author": 6, "your_auth_token": 6, "receiver_address": 6, "fundrespons": 6, "keep": 6, "mind": 6, "yourself": 6, "invok": [6, 7], "txn_id": 6, "txn": 6, "inspect": 6, "account_address": 6, "limitrespons": 6, "individu": 6, "easili": [7, 8], "facilit": [7, 8], "transfer_paramet": 7, "from_account": 7, "to_address": 7, "micro_algo": 7, "micro": 7, "dispos": 7, "incredibli": 7, "script": 7, "those": 7, "use_dispenser_api": 7, "sure": 7, "document": 7, "smallest": 7, "divis": 7, "unit": 7, "programmat": 7, "sent": 7, "abstract": 7, "dedic": 7, "releas": 8, "pypi": 8, "solut": 8, "intuit": 8, "quicker": 8, "safer": 8, "larg": 8, "sdk": 8, "level": 8, "sensibl": 8, "common": 8, "task": 8, "equival": 8, "design": 8, "compos": 8, "read": 8, "diagnos": 8, "debug": 8, "thin": 8, "block": 8, "primit": 8, "wherev": 8, "safeti": 8, "strong": 8, "effort": 8, "put": 8, "good": 8, "intellisens": 8, "highli": 8, "mechan": 8, "terser": 8, "pip": 8, "poetri": 8, "Then": 8, "favourit": 8, "integr": 8, "mypi": 8, "incorrect": 8, "incorrectli": 8, "multisig": 8, "we": 8, "experi": 8, "improv": 8, "expand": 8, "persist_map": 0, "legaci": 0, "behavior": 0, "vscode": 0, "20220301t123456z_lr1000_2pay_1axf": 5}, "objects": {"": [[0, 0, 0, "-", "algokit_utils"]], "algokit_utils": [[0, 1, 1, "", "ABICallArgs"], [0, 1, 1, "", "ABICallArgsDict"], [0, 1, 1, "", "ABICreateCallArgs"], [0, 1, 1, "", "ABICreateCallArgsDict"], [0, 1, 1, "", "ABITransactionResponse"], [0, 1, 1, "", "Account"], [0, 1, 1, "", "AlgoClientConfig"], [0, 1, 1, "", "AppDeployMetaData"], [0, 1, 1, "", "AppLookup"], [0, 1, 1, "", "AppMetaData"], [0, 1, 1, "", "AppReference"], [0, 4, 1, "", "AppSpecStateDict"], [0, 1, 1, "", "ApplicationClient"], [0, 1, 1, "", "ApplicationSpecification"], [0, 1, 1, "", "CallConfig"], [0, 1, 1, "", "CreateCallParameters"], [0, 1, 1, "", "CreateCallParametersDict"], [0, 1, 1, "", "CreateTransactionParameters"], [0, 4, 1, "", "DELETABLE_TEMPLATE_NAME"], [0, 1, 1, "", "DefaultArgumentDict"], [0, 4, 1, "", "DefaultArgumentType"], [0, 1, 1, "", "DeployCallArgs"], [0, 1, 1, "", "DeployCallArgsDict"], [0, 1, 1, "", "DeployCreateCallArgs"], [0, 1, 1, "", "DeployCreateCallArgsDict"], [0, 1, 1, "", "DeployResponse"], [0, 1, 1, "", "EnsureBalanceParameters"], [0, 1, 1, "", "EnsureFundedResponse"], [0, 4, 1, "", "MethodConfigDict"], [0, 1, 1, "", "MethodHints"], [0, 4, 1, "", "NOTE_PREFIX"], [0, 4, 1, "", "OnCompleteActionName"], [0, 1, 1, "", "OnCompleteCallParameters"], [0, 1, 1, "", "OnCompleteCallParametersDict"], [0, 1, 1, "", "OnSchemaBreak"], [0, 1, 1, "", "OnUpdate"], [0, 1, 1, "", "OperationPerformed"], [0, 1, 1, "", "Program"], [0, 4, 1, "", "TemplateValueDict"], [0, 4, 1, "", "TemplateValueMapping"], [0, 1, 1, "", "TestNetDispenserApiClient"], [0, 1, 1, "", "TransactionParameters"], [0, 1, 1, "", "TransactionParametersDict"], [0, 1, 1, "", "TransactionResponse"], [0, 1, 1, "", "TransferAssetParameters"], [0, 1, 1, "", "TransferParameters"], [0, 4, 1, "", "UPDATABLE_TEMPLATE_NAME"], [0, 6, 1, "", "create_kmd_wallet_account"], [0, 6, 1, "", "ensure_funded"], [0, 6, 1, "", "execute_atc_with_logic_error"], [0, 6, 1, "", "get_account"], [0, 6, 1, "", "get_account_from_mnemonic"], [0, 6, 1, "", "get_algod_client"], [0, 6, 1, "", "get_app_id_from_tx_id"], [0, 6, 1, "", "get_creator_apps"], [0, 6, 1, "", "get_default_localnet_config"], [0, 6, 1, "", "get_dispenser_account"], [0, 6, 1, "", "get_indexer_client"], [0, 6, 1, "", "get_kmd_client_from_algod_client"], [0, 6, 1, "", "get_kmd_wallet_account"], [0, 6, 1, "", "get_localnet_default_account"], [0, 6, 1, "", "get_next_version"], [0, 6, 1, "", "get_or_create_kmd_wallet_account"], [0, 6, 1, "", "get_sender_from_signer"], [0, 6, 1, "", "is_localnet"], [0, 6, 1, "", "is_mainnet"], [0, 6, 1, "", "is_testnet"], [0, 6, 1, "", "num_extra_program_pages"], [0, 6, 1, "", "opt_in"], [0, 6, 1, "", "opt_out"], [0, 6, 1, "", "persist_sourcemaps"], [0, 6, 1, "", "replace_template_variables"], [0, 6, 1, "", "simulate_and_persist_response"], [0, 6, 1, "", "transfer"], [0, 6, 1, "", "transfer_asset"]], "algokit_utils.ABITransactionResponse": [[0, 2, 1, "", "decode_error"], [0, 2, 1, "", "method"], [0, 2, 1, "", "raw_value"], [0, 2, 1, "", "return_value"], [0, 2, 1, "", "tx_info"]], "algokit_utils.Account": [[0, 2, 1, "", "address"], [0, 2, 1, "", "private_key"], [0, 3, 1, "", "public_key"], [0, 3, 1, "", "signer"]], "algokit_utils.AlgoClientConfig": [[0, 2, 1, "", "server"], [0, 2, 1, "", "token"]], "algokit_utils.ApplicationClient": [[0, 5, 1, "", "add_method_call"], [0, 5, 1, "", "call"], [0, 5, 1, "", "clear_state"], [0, 5, 1, "", "close_out"], [0, 5, 1, "", "compose_call"], [0, 5, 1, "", "compose_clear_state"], [0, 5, 1, "", "compose_close_out"], [0, 5, 1, "", "compose_create"], [0, 5, 1, "", "compose_delete"], [0, 5, 1, "", "compose_opt_in"], [0, 5, 1, "", "compose_update"], [0, 5, 1, "", "create"], [0, 5, 1, "", "delete"], [0, 5, 1, "", "deploy"], [0, 5, 1, "", "export_source_map"], [0, 5, 1, "", "get_global_state"], [0, 5, 1, "", "get_local_state"], [0, 5, 1, "", "get_signer_sender"], [0, 5, 1, "", "import_source_map"], [0, 5, 1, "", "opt_in"], [0, 5, 1, "", "prepare"], [0, 5, 1, "", "resolve"], [0, 5, 1, "", "resolve_signer_sender"], [0, 5, 1, "", "update"]], "algokit_utils.ApplicationSpecification": [[0, 5, 1, "", "export"]], "algokit_utils.CallConfig": [[0, 2, 1, "", "ALL"], [0, 2, 1, "", "CALL"], [0, 2, 1, "", "CREATE"], [0, 2, 1, "", "NEVER"]], "algokit_utils.EnsureBalanceParameters": [[0, 2, 1, "", "account_to_fund"], [0, 2, 1, "", "fee_micro_algos"], [0, 2, 1, "", "funding_source"], [0, 2, 1, "", "max_fee_micro_algos"], [0, 2, 1, "", "min_funding_increment_micro_algos"], [0, 2, 1, "", "min_spending_balance_micro_algos"], [0, 2, 1, "", "note"], [0, 2, 1, "", "suggested_params"]], "algokit_utils.EnsureFundedResponse": [[0, 2, 1, "", "transaction_id"]], "algokit_utils.OnSchemaBreak": [[0, 2, 1, "", "AppendApp"], [0, 2, 1, "", "Fail"], [0, 2, 1, "", "ReplaceApp"]], "algokit_utils.OnUpdate": [[0, 2, 1, "", "AppendApp"], [0, 2, 1, "", "Fail"], [0, 2, 1, "", "ReplaceApp"], [0, 2, 1, "", "UpdateApp"]], "algokit_utils.OperationPerformed": [[0, 2, 1, "", "Create"], [0, 2, 1, "", "Nothing"], [0, 2, 1, "", "Replace"], [0, 2, 1, "", "Update"]], "algokit_utils.TestNetDispenserApiClient": [[0, 5, 1, "", "fund"], [0, 5, 1, "", "get_limit"], [0, 5, 1, "", "refund"]], "algokit_utils.TransactionParameters": [[0, 2, 1, "", "accounts"], [0, 2, 1, "", "boxes"], [0, 2, 1, "", "foreign_apps"], [0, 2, 1, "", "foreign_assets"], [0, 2, 1, "", "lease"], [0, 2, 1, "", "note"], [0, 2, 1, "", "rekey_to"], [0, 2, 1, "", "sender"], [0, 2, 1, "", "signer"], [0, 2, 1, "", "suggested_params"]], "algokit_utils.TransactionParametersDict": [[0, 2, 1, "", "accounts"], [0, 2, 1, "", "boxes"], [0, 2, 1, "", "foreign_apps"], [0, 2, 1, "", "foreign_assets"], [0, 2, 1, "", "lease"], [0, 2, 1, "", "note"], [0, 2, 1, "", "rekey_to"], [0, 2, 1, "", "sender"], [0, 2, 1, "", "signer"], [0, 2, 1, "", "suggested_params"]], "algokit_utils.TransactionResponse": [[0, 2, 1, "", "confirmed_round"], [0, 5, 1, "", "from_atr"], [0, 2, 1, "", "tx_id"]]}, "objtypes": {"0": "py:module", "1": "py:class", "2": "py:attribute", "3": "py:property", "4": "py:data", "5": "py:method", "6": "py:function"}, "objnames": {"0": ["py", "module", "Python module"], "1": ["py", "class", "Python class"], "2": ["py", "attribute", "Python attribute"], "3": ["py", "property", "Python property"], "4": ["py", "data", "Python data"], "5": ["py", "method", "Python method"], "6": ["py", "function", "Python function"]}, "titleterms": {"algokit_util": 0, "data": 0, "class": 0, "function": 0, "convent": 0, "exampl": 0, "account": [1, 6], "manag": [1, 4], "app": [2, 3], "client": [2, 4, 6], "design": [2, 3], "creat": [2, 6], "an": [2, 3, 6], "applic": [2, 3], "call": 2, "method": 2, "specifi": 2, "which": 2, "abi": 2, "argument": 2, "transact": 2, "paramet": [2, 3], "compos": 2, "read": 2, "state": 2, "handl": [2, 6], "logic": 2, "error": [2, 6], "diagnos": 2, "debug": [2, 5], "mode": 2, "trace": [2, 5], "field": 2, "deploy": 3, "find": 3, "creator": 3, "deploi": 3, "input": 3, "idempot": 3, "compil": 3, "templat": 3, "substitut": 3, "return": 3, "valu": 3, "network": 4, "configur": [4, 5], "debugg": 5, "util": [5, 8], "filenam": 5, "format": 5, "testnet": 6, "dispens": [6, 7], "fund": 6, "regist": 6, "refund": 6, "get": 6, "current": 6, "limit": 6, "algo": 7, "transfer": 7, "ensur": 7, "minimum": 7, "asset": 7, "algokit": 8, "python": 8, "content": 8, "core": 8, "principl": 8, "instal": 8, "usag": 8, "type": 8, "capabl": 8, "refer": 8, "document": 8, "roadmap": 8, "indic": 8, "tabl": 8}, "envversion": {"sphinx.domains.c": 2, "sphinx.domains.changeset": 1, "sphinx.domains.citation": 1, "sphinx.domains.cpp": 8, "sphinx.domains.index": 1, "sphinx.domains.javascript": 2, "sphinx.domains.math": 2, "sphinx.domains.python": 3, "sphinx.domains.rst": 2, "sphinx.domains.std": 2, "sphinx.ext.intersphinx": 1, "sphinx": 57}, "alltitles": {"algokit_utils": [[0, "module-algokit_utils"]], "Data": [[0, "data"]], "Classes": [[0, "classes"]], "Functions": [[0, "functions"]], "Convention": [[0, "convention"]], "Example": [[0, "example"]], "Account management": [[1, "account-management"]], "Account": [[1, "account"]], "App client": [[2, "app-client"]], "Design": [[2, "design"], [3, "design"]], "Creating an application client": [[2, "creating-an-application-client"]], "Calling methods on the app": [[2, "calling-methods-on-the-app"]], "Specifying which method": [[2, "specifying-which-method"]], "ABI arguments": [[2, "abi-arguments"]], "Transaction Parameters": [[2, "transaction-parameters"]], "Composing calls": [[2, "composing-calls"]], "Reading state": [[2, "reading-state"]], "Handling logic errors and diagnosing errors": [[2, "handling-logic-errors-and-diagnosing-errors"]], "Debug Mode and traces Field": [[2, "debug-mode-and-traces-field"]], "App deployment": [[3, "app-deployment"]], "Finding apps by creator": [[3, "finding-apps-by-creator"]], "Deploying an application": [[3, "deploying-an-application"]], "Input parameters": [[3, "input-parameters"]], "Idempotency": [[3, "idempotency"]], "Compilation and template substitution": [[3, "compilation-and-template-substitution"]], "Return value": [[3, "return-value"]], "Client management": [[4, "client-management"]], "Network configuration": [[4, "network-configuration"]], "Clients": [[4, "clients"]], "Debugger": [[5, "debugger"]], "Configuration": [[5, "configuration"]], "Debugging Utilities": [[5, "debugging-utilities"]], "Trace filename format": [[5, "trace-filename-format"]], "TestNet Dispenser Client": [[6, "testnet-dispenser-client"]], "Creating a Dispenser Client": [[6, "creating-a-dispenser-client"]], "Funding an Account": [[6, "funding-an-account"]], "Registering a Refund": [[6, "registering-a-refund"]], "Getting Current Limit": [[6, "getting-current-limit"]], "Error Handling": [[6, "error-handling"]], "Algo transfers": [[7, "algo-transfers"]], "Transferring Algos": [[7, "transferring-algos"]], "Ensuring minimum Algos": [[7, "ensuring-minimum-algos"]], "Transfering Assets": [[7, "transfering-assets"]], "Dispenser": [[7, "dispenser"]], "AlgoKit Python Utilities": [[8, "algokit-python-utilities"]], "Contents": [[8, null]], "Core principles": [[8, "core-principles"]], "Installation": [[8, "installation"]], "Usage": [[8, "usage"]], "Types": [[8, "types"]], "Capabilities": [[8, "capabilities"]], "Reference documentation": [[8, "reference-documentation"]], "Roadmap": [[8, "roadmap"]], "Indices and tables": [[8, "indices-and-tables"]]}, "indexentries": {"abicallargs (class in algokit_utils)": [[0, "algokit_utils.ABICallArgs"]], "abicallargsdict (class in algokit_utils)": [[0, "algokit_utils.ABICallArgsDict"]], "abicreatecallargs (class in algokit_utils)": [[0, "algokit_utils.ABICreateCallArgs"]], "abicreatecallargsdict (class in algokit_utils)": [[0, "algokit_utils.ABICreateCallArgsDict"]], "abitransactionresponse (class in algokit_utils)": [[0, "algokit_utils.ABITransactionResponse"]], "all (algokit_utils.callconfig attribute)": [[0, "algokit_utils.CallConfig.ALL"]], "account (class in algokit_utils)": [[0, "algokit_utils.Account"]], "algoclientconfig (class in algokit_utils)": [[0, "algokit_utils.AlgoClientConfig"]], "appdeploymetadata (class in algokit_utils)": [[0, "algokit_utils.AppDeployMetaData"]], "applookup (class in algokit_utils)": [[0, "algokit_utils.AppLookup"]], "appmetadata (class in algokit_utils)": [[0, "algokit_utils.AppMetaData"]], "appreference (class in algokit_utils)": [[0, "algokit_utils.AppReference"]], "appspecstatedict (in module algokit_utils)": [[0, "algokit_utils.AppSpecStateDict"]], "appendapp (algokit_utils.onschemabreak attribute)": [[0, "algokit_utils.OnSchemaBreak.AppendApp"]], "appendapp (algokit_utils.onupdate attribute)": [[0, "algokit_utils.OnUpdate.AppendApp"]], "applicationclient (class in algokit_utils)": [[0, "algokit_utils.ApplicationClient"]], "applicationspecification (class in algokit_utils)": [[0, "algokit_utils.ApplicationSpecification"]], "call (algokit_utils.callconfig attribute)": [[0, "algokit_utils.CallConfig.CALL"]], "create (algokit_utils.callconfig attribute)": [[0, "algokit_utils.CallConfig.CREATE"]], "callconfig (class in algokit_utils)": [[0, "algokit_utils.CallConfig"]], "create (algokit_utils.operationperformed attribute)": [[0, "algokit_utils.OperationPerformed.Create"]], "createcallparameters (class in algokit_utils)": [[0, "algokit_utils.CreateCallParameters"]], "createcallparametersdict (class in algokit_utils)": [[0, "algokit_utils.CreateCallParametersDict"]], "createtransactionparameters (class in algokit_utils)": [[0, "algokit_utils.CreateTransactionParameters"]], "deletable_template_name (in module algokit_utils)": [[0, "algokit_utils.DELETABLE_TEMPLATE_NAME"]], "defaultargumentdict (class in algokit_utils)": [[0, "algokit_utils.DefaultArgumentDict"]], "defaultargumenttype (in module algokit_utils)": [[0, "algokit_utils.DefaultArgumentType"]], "deploycallargs (class in algokit_utils)": [[0, "algokit_utils.DeployCallArgs"]], "deploycallargsdict (class in algokit_utils)": [[0, "algokit_utils.DeployCallArgsDict"]], "deploycreatecallargs (class in algokit_utils)": [[0, "algokit_utils.DeployCreateCallArgs"]], "deploycreatecallargsdict (class in algokit_utils)": [[0, "algokit_utils.DeployCreateCallArgsDict"]], "deployresponse (class in algokit_utils)": [[0, "algokit_utils.DeployResponse"]], "ensurebalanceparameters (class in algokit_utils)": [[0, "algokit_utils.EnsureBalanceParameters"]], "ensurefundedresponse (class in algokit_utils)": [[0, "algokit_utils.EnsureFundedResponse"]], "fail (algokit_utils.onschemabreak attribute)": [[0, "algokit_utils.OnSchemaBreak.Fail"]], "fail (algokit_utils.onupdate attribute)": [[0, "algokit_utils.OnUpdate.Fail"]], "methodconfigdict (in module algokit_utils)": [[0, "algokit_utils.MethodConfigDict"]], "methodhints (class in algokit_utils)": [[0, "algokit_utils.MethodHints"]], "never (algokit_utils.callconfig attribute)": [[0, "algokit_utils.CallConfig.NEVER"]], "note_prefix (in module algokit_utils)": [[0, "algokit_utils.NOTE_PREFIX"]], "nothing (algokit_utils.operationperformed attribute)": [[0, "algokit_utils.OperationPerformed.Nothing"]], "oncompleteactionname (in module algokit_utils)": [[0, "algokit_utils.OnCompleteActionName"]], "oncompletecallparameters (class in algokit_utils)": [[0, "algokit_utils.OnCompleteCallParameters"]], "oncompletecallparametersdict (class in algokit_utils)": [[0, "algokit_utils.OnCompleteCallParametersDict"]], "onschemabreak (class in algokit_utils)": [[0, "algokit_utils.OnSchemaBreak"]], "onupdate (class in algokit_utils)": [[0, "algokit_utils.OnUpdate"]], "operationperformed (class in algokit_utils)": [[0, "algokit_utils.OperationPerformed"]], "program (class in algokit_utils)": [[0, "algokit_utils.Program"]], "replace (algokit_utils.operationperformed attribute)": [[0, "algokit_utils.OperationPerformed.Replace"]], "replaceapp (algokit_utils.onschemabreak attribute)": [[0, "algokit_utils.OnSchemaBreak.ReplaceApp"]], "replaceapp (algokit_utils.onupdate attribute)": [[0, "algokit_utils.OnUpdate.ReplaceApp"]], "templatevaluedict (in module algokit_utils)": [[0, "algokit_utils.TemplateValueDict"]], "templatevaluemapping (in module algokit_utils)": [[0, "algokit_utils.TemplateValueMapping"]], "testnetdispenserapiclient (class in algokit_utils)": [[0, "algokit_utils.TestNetDispenserApiClient"]], "transactionparameters (class in algokit_utils)": [[0, "algokit_utils.TransactionParameters"]], "transactionparametersdict (class in algokit_utils)": [[0, "algokit_utils.TransactionParametersDict"]], "transactionresponse (class in algokit_utils)": [[0, "algokit_utils.TransactionResponse"]], "transferassetparameters (class in algokit_utils)": [[0, "algokit_utils.TransferAssetParameters"]], "transferparameters (class in algokit_utils)": [[0, "algokit_utils.TransferParameters"]], "updatable_template_name (in module algokit_utils)": [[0, "algokit_utils.UPDATABLE_TEMPLATE_NAME"]], "update (algokit_utils.operationperformed attribute)": [[0, "algokit_utils.OperationPerformed.Update"]], "updateapp (algokit_utils.onupdate attribute)": [[0, "algokit_utils.OnUpdate.UpdateApp"]], "account_to_fund (algokit_utils.ensurebalanceparameters attribute)": [[0, "algokit_utils.EnsureBalanceParameters.account_to_fund"]], "accounts (algokit_utils.transactionparameters attribute)": [[0, "algokit_utils.TransactionParameters.accounts"]], "accounts (algokit_utils.transactionparametersdict attribute)": [[0, "algokit_utils.TransactionParametersDict.accounts"]], "add_method_call() (algokit_utils.applicationclient method)": [[0, "algokit_utils.ApplicationClient.add_method_call"]], "address (algokit_utils.account attribute)": [[0, "algokit_utils.Account.address"]], "algokit_utils": [[0, "module-algokit_utils"]], "boxes (algokit_utils.transactionparameters attribute)": [[0, "algokit_utils.TransactionParameters.boxes"]], "boxes (algokit_utils.transactionparametersdict attribute)": [[0, "algokit_utils.TransactionParametersDict.boxes"]], "call() (algokit_utils.applicationclient method)": [[0, "algokit_utils.ApplicationClient.call"]], "clear_state() (algokit_utils.applicationclient method)": [[0, "algokit_utils.ApplicationClient.clear_state"]], "close_out() (algokit_utils.applicationclient method)": [[0, "algokit_utils.ApplicationClient.close_out"]], "compose_call() (algokit_utils.applicationclient method)": [[0, "algokit_utils.ApplicationClient.compose_call"]], "compose_clear_state() (algokit_utils.applicationclient method)": [[0, "algokit_utils.ApplicationClient.compose_clear_state"]], "compose_close_out() (algokit_utils.applicationclient method)": [[0, "algokit_utils.ApplicationClient.compose_close_out"]], "compose_create() (algokit_utils.applicationclient method)": [[0, "algokit_utils.ApplicationClient.compose_create"]], "compose_delete() (algokit_utils.applicationclient method)": [[0, "algokit_utils.ApplicationClient.compose_delete"]], "compose_opt_in() (algokit_utils.applicationclient method)": [[0, "algokit_utils.ApplicationClient.compose_opt_in"]], "compose_update() (algokit_utils.applicationclient method)": [[0, "algokit_utils.ApplicationClient.compose_update"]], "confirmed_round (algokit_utils.transactionresponse attribute)": [[0, "algokit_utils.TransactionResponse.confirmed_round"]], "create() (algokit_utils.applicationclient method)": [[0, "algokit_utils.ApplicationClient.create"]], "create_kmd_wallet_account() (in module algokit_utils)": [[0, "algokit_utils.create_kmd_wallet_account"]], "decode_error (algokit_utils.abitransactionresponse attribute)": [[0, "algokit_utils.ABITransactionResponse.decode_error"]], "delete() (algokit_utils.applicationclient method)": [[0, "algokit_utils.ApplicationClient.delete"]], "deploy() (algokit_utils.applicationclient method)": [[0, "algokit_utils.ApplicationClient.deploy"]], "ensure_funded() (in module algokit_utils)": [[0, "algokit_utils.ensure_funded"]], "execute_atc_with_logic_error() (in module algokit_utils)": [[0, "algokit_utils.execute_atc_with_logic_error"]], "export() (algokit_utils.applicationspecification method)": [[0, "algokit_utils.ApplicationSpecification.export"]], "export_source_map() (algokit_utils.applicationclient method)": [[0, "algokit_utils.ApplicationClient.export_source_map"]], "fee_micro_algos (algokit_utils.ensurebalanceparameters attribute)": [[0, "algokit_utils.EnsureBalanceParameters.fee_micro_algos"]], "foreign_apps (algokit_utils.transactionparameters attribute)": [[0, "algokit_utils.TransactionParameters.foreign_apps"]], "foreign_apps (algokit_utils.transactionparametersdict attribute)": [[0, "algokit_utils.TransactionParametersDict.foreign_apps"]], "foreign_assets (algokit_utils.transactionparameters attribute)": [[0, "algokit_utils.TransactionParameters.foreign_assets"]], "foreign_assets (algokit_utils.transactionparametersdict attribute)": [[0, "algokit_utils.TransactionParametersDict.foreign_assets"]], "from_atr() (algokit_utils.transactionresponse static method)": [[0, "algokit_utils.TransactionResponse.from_atr"]], "fund() (algokit_utils.testnetdispenserapiclient method)": [[0, "algokit_utils.TestNetDispenserApiClient.fund"]], "funding_source (algokit_utils.ensurebalanceparameters attribute)": [[0, "algokit_utils.EnsureBalanceParameters.funding_source"]], "get_account() (in module algokit_utils)": [[0, "algokit_utils.get_account"]], "get_account_from_mnemonic() (in module algokit_utils)": [[0, "algokit_utils.get_account_from_mnemonic"]], "get_algod_client() (in module algokit_utils)": [[0, "algokit_utils.get_algod_client"]], "get_app_id_from_tx_id() (in module algokit_utils)": [[0, "algokit_utils.get_app_id_from_tx_id"]], "get_creator_apps() (in module algokit_utils)": [[0, "algokit_utils.get_creator_apps"]], "get_default_localnet_config() (in module algokit_utils)": [[0, "algokit_utils.get_default_localnet_config"]], "get_dispenser_account() (in module algokit_utils)": [[0, "algokit_utils.get_dispenser_account"]], "get_global_state() (algokit_utils.applicationclient method)": [[0, "algokit_utils.ApplicationClient.get_global_state"]], "get_indexer_client() (in module algokit_utils)": [[0, "algokit_utils.get_indexer_client"]], "get_kmd_client_from_algod_client() (in module algokit_utils)": [[0, "algokit_utils.get_kmd_client_from_algod_client"]], "get_kmd_wallet_account() (in module algokit_utils)": [[0, "algokit_utils.get_kmd_wallet_account"]], "get_limit() (algokit_utils.testnetdispenserapiclient method)": [[0, "algokit_utils.TestNetDispenserApiClient.get_limit"]], "get_local_state() (algokit_utils.applicationclient method)": [[0, "algokit_utils.ApplicationClient.get_local_state"]], "get_localnet_default_account() (in module algokit_utils)": [[0, "algokit_utils.get_localnet_default_account"]], "get_next_version() (in module algokit_utils)": [[0, "algokit_utils.get_next_version"]], "get_or_create_kmd_wallet_account() (in module algokit_utils)": [[0, "algokit_utils.get_or_create_kmd_wallet_account"]], "get_sender_from_signer() (in module algokit_utils)": [[0, "algokit_utils.get_sender_from_signer"]], "get_signer_sender() (algokit_utils.applicationclient method)": [[0, "algokit_utils.ApplicationClient.get_signer_sender"]], "import_source_map() (algokit_utils.applicationclient method)": [[0, "algokit_utils.ApplicationClient.import_source_map"]], "is_localnet() (in module algokit_utils)": [[0, "algokit_utils.is_localnet"]], "is_mainnet() (in module algokit_utils)": [[0, "algokit_utils.is_mainnet"]], "is_testnet() (in module algokit_utils)": [[0, "algokit_utils.is_testnet"]], "lease (algokit_utils.transactionparameters attribute)": [[0, "algokit_utils.TransactionParameters.lease"]], "lease (algokit_utils.transactionparametersdict attribute)": [[0, "algokit_utils.TransactionParametersDict.lease"]], "max_fee_micro_algos (algokit_utils.ensurebalanceparameters attribute)": [[0, "algokit_utils.EnsureBalanceParameters.max_fee_micro_algos"]], "method (algokit_utils.abitransactionresponse attribute)": [[0, "algokit_utils.ABITransactionResponse.method"]], "min_funding_increment_micro_algos (algokit_utils.ensurebalanceparameters attribute)": [[0, "algokit_utils.EnsureBalanceParameters.min_funding_increment_micro_algos"]], "min_spending_balance_micro_algos (algokit_utils.ensurebalanceparameters attribute)": [[0, "algokit_utils.EnsureBalanceParameters.min_spending_balance_micro_algos"]], "module": [[0, "module-algokit_utils"]], "note (algokit_utils.ensurebalanceparameters attribute)": [[0, "algokit_utils.EnsureBalanceParameters.note"]], "note (algokit_utils.transactionparameters attribute)": [[0, "algokit_utils.TransactionParameters.note"]], "note (algokit_utils.transactionparametersdict attribute)": [[0, "algokit_utils.TransactionParametersDict.note"]], "num_extra_program_pages() (in module algokit_utils)": [[0, "algokit_utils.num_extra_program_pages"]], "opt_in() (algokit_utils.applicationclient method)": [[0, "algokit_utils.ApplicationClient.opt_in"]], "opt_in() (in module algokit_utils)": [[0, "algokit_utils.opt_in"]], "opt_out() (in module algokit_utils)": [[0, "algokit_utils.opt_out"]], "persist_sourcemaps() (in module algokit_utils)": [[0, "algokit_utils.persist_sourcemaps"]], "prepare() (algokit_utils.applicationclient method)": [[0, "algokit_utils.ApplicationClient.prepare"]], "private_key (algokit_utils.account attribute)": [[0, "algokit_utils.Account.private_key"]], "public_key (algokit_utils.account property)": [[0, "algokit_utils.Account.public_key"]], "raw_value (algokit_utils.abitransactionresponse attribute)": [[0, "algokit_utils.ABITransactionResponse.raw_value"]], "refund() (algokit_utils.testnetdispenserapiclient method)": [[0, "algokit_utils.TestNetDispenserApiClient.refund"]], "rekey_to (algokit_utils.transactionparameters attribute)": [[0, "algokit_utils.TransactionParameters.rekey_to"]], "rekey_to (algokit_utils.transactionparametersdict attribute)": [[0, "algokit_utils.TransactionParametersDict.rekey_to"]], "replace_template_variables() (in module algokit_utils)": [[0, "algokit_utils.replace_template_variables"]], "resolve() (algokit_utils.applicationclient method)": [[0, "algokit_utils.ApplicationClient.resolve"]], "resolve_signer_sender() (algokit_utils.applicationclient method)": [[0, "algokit_utils.ApplicationClient.resolve_signer_sender"]], "return_value (algokit_utils.abitransactionresponse attribute)": [[0, "algokit_utils.ABITransactionResponse.return_value"]], "sender (algokit_utils.transactionparameters attribute)": [[0, "algokit_utils.TransactionParameters.sender"]], "sender (algokit_utils.transactionparametersdict attribute)": [[0, "algokit_utils.TransactionParametersDict.sender"]], "server (algokit_utils.algoclientconfig attribute)": [[0, "algokit_utils.AlgoClientConfig.server"]], "signer (algokit_utils.account property)": [[0, "algokit_utils.Account.signer"]], "signer (algokit_utils.transactionparameters attribute)": [[0, "algokit_utils.TransactionParameters.signer"]], "signer (algokit_utils.transactionparametersdict attribute)": [[0, "algokit_utils.TransactionParametersDict.signer"]], "simulate_and_persist_response() (in module algokit_utils)": [[0, "algokit_utils.simulate_and_persist_response"]], "suggested_params (algokit_utils.ensurebalanceparameters attribute)": [[0, "algokit_utils.EnsureBalanceParameters.suggested_params"]], "suggested_params (algokit_utils.transactionparameters attribute)": [[0, "algokit_utils.TransactionParameters.suggested_params"]], "suggested_params (algokit_utils.transactionparametersdict attribute)": [[0, "algokit_utils.TransactionParametersDict.suggested_params"]], "token (algokit_utils.algoclientconfig attribute)": [[0, "algokit_utils.AlgoClientConfig.token"]], "transaction_id (algokit_utils.ensurefundedresponse attribute)": [[0, "algokit_utils.EnsureFundedResponse.transaction_id"]], "transfer() (in module algokit_utils)": [[0, "algokit_utils.transfer"]], "transfer_asset() (in module algokit_utils)": [[0, "algokit_utils.transfer_asset"]], "tx_id (algokit_utils.transactionresponse attribute)": [[0, "algokit_utils.TransactionResponse.tx_id"]], "tx_info (algokit_utils.abitransactionresponse attribute)": [[0, "algokit_utils.ABITransactionResponse.tx_info"]], "update() (algokit_utils.applicationclient method)": [[0, "algokit_utils.ApplicationClient.update"]]}}) \ No newline at end of file +Search.setIndex({"alltitles": {"A v2 interface/method/class does not display a deprecation warning correctly or at all": [[55, "a-v2-interface-method-class-does-not-display-a-deprecation-warning-correctly-or-at-all"]], "API Reference": [[38, null]], "Accessing SDK clients": [[40, "accessing-sdk-clients"]], "Accessing SDK clients via ClientManager instance": [[46, "accessing-sdk-clients-via-clientmanager-instance"]], "Accessing manager class instances": [[40, "accessing-manager-class-instances"]], "Accessing state": [[42, "accessing-state"]], "Account management": [[39, null]], "AccountAssetInformation": [[45, "accountassetinformation"]], "AccountManager": [[39, "accountmanager"]], "Accounts": [[39, "accounts"]], "Additional Features": [[41, "additional-features"]], "After:": [[55, "after"], [55, "id2"]], "Algo amount handling": [[41, null]], "Algo transfers (payments)": [[52, null]], "AlgoAmount": [[41, "algoamount"]], "AlgoKit Python Utilities": [[54, null]], "AlgoKitLogger": [[47, "algokitlogger"]], "Algorand client": [[40, null]], "App Clients": [[42, "app-clients"]], "App client and App factory": [[43, null]], "App deployment": [[44, null]], "App is deployed": [[53, "app-is-deployed"]], "App is not deployed": [[53, "app-is-not-deployed"]], "App management": [[42, null]], "App spec methods": [[43, "app-spec-methods"]], "AppClient": [[43, "appclient"]], "AppDeployer": [[44, "appdeployer"]], "AppFactory": [[43, "appfactory"]], "AppManager": [[42, "appmanager"]], "Application-specific Result Types": [[50, "application-specific-result-types"]], "Asset Information": [[45, "asset-information"]], "AssetInformation": [[45, "assetinformation"]], "AssetManager": [[45, "assetmanager"]], "Assets": [[45, null]], "Attributes": [[4, "attributes"], [5, "attributes"], [6, "attributes"], [8, "attributes"], [9, "attributes"], [17, "attributes"], [19, "attributes"], [23, "attributes"], [24, "attributes"], [29, "attributes"], [30, "attributes"], [35, "attributes"]], "Automatic retry": [[46, "automatic-retry"]], "Basic Test Setup": [[49, "basic-test-setup"]], "Before:": [[55, "before"], [55, "id1"]], "Best Practices": [[55, "best-practices"]], "Box references": [[42, "box-references"]], "Boxes": [[42, "boxes"]], "Breaking Changes": [[55, "breaking-changes"]], "Bulk Operations": [[45, "bulk-operations"]], "Bulk Opt-In": [[45, "bulk-opt-in"]], "Bulk Opt-Out": [[45, "bulk-opt-out"]], "Calling apps": [[42, "calling-apps"]], "Calling the app": [[43, "calling-the-app"]], "Capabilities": [[54, "capabilities"]], "Classes": [[0, "classes"], [2, "classes"], [3, "classes"], [4, "classes"], [5, "classes"], [6, "classes"], [7, "classes"], [8, "classes"], [9, "classes"], [10, "classes"], [12, "classes"], [14, "classes"], [16, "classes"], [17, "classes"], [19, "classes"], [21, "classes"], [23, "classes"], [24, "classes"], [25, "classes"], [27, "classes"], [28, "classes"], [29, "classes"], [30, "classes"], [31, "classes"], [33, "classes"], [35, "classes"], [36, "classes"], [37, "classes"]], "Client management": [[46, null]], "Client usage": [[53, "client-usage"]], "ClientManager": [[46, "clientmanager"]], "Clients": [[46, "clients"]], "Common app parameters": [[42, "common-app-parameters"]], "Compilation": [[42, "compilation"]], "Compilation and template substitution": [[44, "compilation-and-template-substitution"]], "Composing a group of transactions": [[40, "composing-a-group-of-transactions"]], "Config and logging": [[54, "config-and-logging"]], "Config singleton": [[54, "config-singleton"]], "Configuration": [[47, "configuration"]], "Constructing a transaction": [[51, "constructing-a-transaction"]], "Contents": [[54, null]], "Core principles": [[54, "core-principles"]], "Covering App Call Inner Transaction Fees": [[51, "covering-app-call-inner-transaction-fees"]], "Covering App Call Op Budget": [[51, "covering-app-call-op-budget"]], "Create": [[43, "create"]], "Creating Test Assets": [[49, "creating-test-assets"]], "Creating a Dispenser Client": [[48, "creating-a-dispenser-client"]], "Creating a TestNet dispenser API client instance": [[46, "creating-a-testnet-dispenser-api-client-instance"]], "Creating a typed factory instance": [[53, "creating-a-typed-factory-instance"]], "Creating an AlgoAmount": [[41, "creating-an-algoamount"]], "Creating an SDK client instance": [[46, "creating-an-sdk-client-instance"]], "Creating and deploying an app": [[43, "creating-and-deploying-an-app"]], "Creating and issuing transactions": [[40, "creating-and-issuing-transactions"]], "Creating transactions": [[40, "creating-transactions"]], "Debug mode": [[54, "debug-mode"]], "Debugger": [[47, null]], "Debugging Utilities": [[47, "debugging-utilities"]], "Default arguments": [[43, "default-arguments"]], "Default signer": [[39, "default-signer"]], "Deployment metadata": [[44, "deployment-metadata"]], "Dispenser": [[39, "dispenser"], [52, "dispenser"]], "Dynamically creating clients for a given app spec": [[43, "dynamically-creating-clients-for-a-given-app-spec"]], "Error Handling": [[48, "error-handling"]], "Examples": [[39, "examples"], [52, "examples"]], "Exceptions": [[21, "exceptions"]], "Extracting a value from AlgoAmount": [[41, "extracting-a-value-from-algoamount"]], "Functions": [[4, "functions"], [5, "functions"], [21, "functions"], [24, "functions"], [35, "functions"]], "Funding an Account": [[48, "funding-an-account"]], "Funding the app account": [[43, "funding-the-app-account"]], "Further reading": [[50, "further-reading"]], "Generating a typed client": [[53, "generating-a-typed-client"]], "Generating an app spec": [[53, "generating-an-app-spec"]], "Generic methods": [[43, "generic-methods"]], "Get Asset Information": [[45, "get-asset-information"]], "Get a signer": [[39, "get-a-signer"]], "Getting Account Holdings": [[45, "getting-account-holdings"]], "Getting Asset Parameters": [[45, "getting-asset-parameters"]], "Getting Current Limit": [[48, "getting-current-limit"]], "Getting a typed client instance": [[53, "getting-a-typed-client-instance"]], "Getting app information": [[42, "getting-app-information"]], "Global state": [[42, "global-state"]], "Handling logic errors and diagnosing errors": [[43, "handling-logic-errors-and-diagnosing-errors"]], "Idempotency": [[44, "idempotency"]], "Input parameters": [[44, "input-parameters"]], "Installation": [[54, "installation"]], "KMD account management": [[39, "kmd-account-management"]], "Local state": [[42, "local-state"]], "Logging": [[54, "logging"]], "Lookup deployed apps by name": [[44, "lookup-deployed-apps-by-name"]], "Migration Guide - v3": [[55, null]], "Migration Steps": [[55, "migration-steps"]], "Module Contents": [[0, "module-contents"], [2, "module-contents"], [3, "module-contents"], [4, "module-contents"], [5, "module-contents"], [6, "module-contents"], [7, "module-contents"], [8, "module-contents"], [9, "module-contents"], [10, "module-contents"], [12, "module-contents"], [14, "module-contents"], [16, "module-contents"], [17, "module-contents"], [19, "module-contents"], [21, "module-contents"], [23, "module-contents"], [24, "module-contents"], [25, "module-contents"], [27, "module-contents"], [28, "module-contents"], [29, "module-contents"], [30, "module-contents"], [31, "module-contents"], [33, "module-contents"], [35, "module-contents"], [36, "module-contents"], [37, "module-contents"]], "Network configuration": [[46, "network-configuration"]], "Network information": [[46, "network-information"]], "Performing a deployment": [[44, "performing-a-deployment"]], "Prerequisites": [[55, "prerequisites"]], "Read-only calls": [[51, "read-only-calls"]], "Reading state": [[43, "reading-state"]], "Reference documentation": [[54, "reference-documentation"]], "Registering a Refund": [[48, "registering-a-refund"]], "Registering a signer": [[39, "registering-a-signer"]], "Rekey account": [[39, "rekey-account"]], "Resource Population": [[51, "resource-population"]], "Return value": [[44, "return-value"]], "SendAtomicTransactionComposerResults": [[50, "sendatomictransactioncomposerresults"]], "SendSingleTransactionResult": [[50, "sendsingletransactionresult"]], "Sending a single transaction": [[40, "sending-a-single-transaction"]], "Simulate without signing": [[51, "simulate-without-signing"]], "Simulating a transaction": [[51, "simulating-a-transaction"]], "Smart contract development lifecycle": [[44, "smart-contract-development-lifecycle"]], "Step 1 - Replace SDK Clients with AlgorandClient": [[55, "step-1-replace-sdk-clients-with-algorandclient"]], "Step 2 - Update Account Management": [[55, "step-2-update-account-management"]], "Step 3 - Update Transaction Management": [[55, "step-3-update-transaction-management"]], "Step 4 - Update ApplicationSpecification usage": [[55, "step-4-update-applicationspecification-usage"]], "Step 5 - Replace ApplicationClient usage": [[55, "step-5-replace-applicationclient-usage"]], "Step 6 - Replace typed app client usage": [[55, "step-6-replace-typed-app-client-usage"]], "Step 7 - Update AppClient State Management": [[55, "step-7-update-appclient-state-management"]], "Step 8 - Update Asset Management": [[55, "step-8-update-asset-management"]], "Submodules": [[1, "submodules"], [11, "submodules"], [13, "submodules"], [15, "submodules"], [18, "submodules"], [20, "submodules"], [22, "submodules"], [26, "submodules"], [32, "submodules"], [34, "submodules"]], "Suppressing log messages globally": [[47, "suppressing-log-messages-globally"]], "Suppressing log messages per log call": [[47, "suppressing-log-messages-per-log-call"]], "TestNet Dispenser Client": [[48, null]], "Testing": [[49, null], [54, "testing"]], "Testing Application Calls": [[49, "testing-application-calls"]], "Testing Application Deployments": [[49, "testing-application-deployments"]], "Testing Asset Transfers": [[49, "testing-asset-transfers"]], "Testing Box Storage": [[49, "testing-box-storage"]], "Trace filename format": [[47, "trace-filename-format"]], "Transaction Results": [[50, "transaction-results"]], "Transaction composer": [[51, null]], "Transaction configuration": [[40, "transaction-configuration"]], "Transaction management": [[50, null]], "Transaction parameters": [[40, "transaction-parameters"]], "TransactionSignerAccountProtocol": [[39, "transactionsigneraccountprotocol"]], "Troubleshooting": [[55, "troubleshooting"]], "Typed application clients": [[53, null]], "Types": [[54, "types"]], "Underlying account classes": [[39, "underlying-account-classes"]], "Updating and deleting an app": [[43, "updating-and-deleting-an-app"]], "Usage": [[54, "usage"]], "Useful scenario of converting v2 to v3 not covered in generic migration guide": [[55, "useful-scenario-of-converting-v2-to-v3-not-covered-in-generic-migration-guide"]], "Where You\u2019ll Encounter Each Result Type": [[50, "where-you-ll-encounter-each-result-type"]], "algokit_utils": [[22, null]], "algokit_utils.accounts": [[1, null]], "algokit_utils.accounts.account_manager": [[0, null]], "algokit_utils.accounts.kmd_account_manager": [[2, null]], "algokit_utils.algorand": [[3, null]], "algokit_utils.applications": [[13, null]], "algokit_utils.applications.abi": [[4, null]], "algokit_utils.applications.app_client": [[5, null]], "algokit_utils.applications.app_deployer": [[6, null]], "algokit_utils.applications.app_factory": [[7, null]], "algokit_utils.applications.app_manager": [[8, null]], "algokit_utils.applications.app_spec": [[11, null]], "algokit_utils.applications.app_spec.arc32": [[9, null]], "algokit_utils.applications.app_spec.arc56": [[10, null]], "algokit_utils.applications.enums": [[12, null]], "algokit_utils.assets": [[15, null]], "algokit_utils.assets.asset_manager": [[14, null]], "algokit_utils.clients": [[18, null]], "algokit_utils.clients.client_manager": [[16, null]], "algokit_utils.clients.dispenser_api_client": [[17, null]], "algokit_utils.config": [[19, null]], "algokit_utils.errors": [[20, null]], "algokit_utils.errors.logic_error": [[21, null]], "algokit_utils.models": [[26, null]], "algokit_utils.models.account": [[23, null]], "algokit_utils.models.amount": [[24, null]], "algokit_utils.models.application": [[25, null]], "algokit_utils.models.network": [[27, null]], "algokit_utils.models.simulate": [[28, null]], "algokit_utils.models.state": [[29, null]], "algokit_utils.models.transaction": [[30, null]], "algokit_utils.protocols": [[32, null]], "algokit_utils.protocols.account": [[31, null]], "algokit_utils.protocols.typed_clients": [[33, null]], "algokit_utils.transactions": [[34, null]], "algokit_utils.transactions.transaction_composer": [[35, null]], "algokit_utils.transactions.transaction_creator": [[36, null]], "algokit_utils.transactions.transaction_sender": [[37, null]], "ensure_funded": [[52, "ensure-funded"]], "payment": [[52, "payment"]]}, "docnames": ["autoapi/algokit_utils/accounts/account_manager/index", "autoapi/algokit_utils/accounts/index", "autoapi/algokit_utils/accounts/kmd_account_manager/index", "autoapi/algokit_utils/algorand/index", "autoapi/algokit_utils/applications/abi/index", "autoapi/algokit_utils/applications/app_client/index", "autoapi/algokit_utils/applications/app_deployer/index", "autoapi/algokit_utils/applications/app_factory/index", "autoapi/algokit_utils/applications/app_manager/index", "autoapi/algokit_utils/applications/app_spec/arc32/index", "autoapi/algokit_utils/applications/app_spec/arc56/index", "autoapi/algokit_utils/applications/app_spec/index", "autoapi/algokit_utils/applications/enums/index", "autoapi/algokit_utils/applications/index", "autoapi/algokit_utils/assets/asset_manager/index", "autoapi/algokit_utils/assets/index", "autoapi/algokit_utils/clients/client_manager/index", "autoapi/algokit_utils/clients/dispenser_api_client/index", "autoapi/algokit_utils/clients/index", "autoapi/algokit_utils/config/index", "autoapi/algokit_utils/errors/index", "autoapi/algokit_utils/errors/logic_error/index", "autoapi/algokit_utils/index", "autoapi/algokit_utils/models/account/index", "autoapi/algokit_utils/models/amount/index", "autoapi/algokit_utils/models/application/index", "autoapi/algokit_utils/models/index", "autoapi/algokit_utils/models/network/index", "autoapi/algokit_utils/models/simulate/index", "autoapi/algokit_utils/models/state/index", "autoapi/algokit_utils/models/transaction/index", "autoapi/algokit_utils/protocols/account/index", "autoapi/algokit_utils/protocols/index", "autoapi/algokit_utils/protocols/typed_clients/index", "autoapi/algokit_utils/transactions/index", "autoapi/algokit_utils/transactions/transaction_composer/index", "autoapi/algokit_utils/transactions/transaction_creator/index", "autoapi/algokit_utils/transactions/transaction_sender/index", "autoapi/index", "capabilities/account", "capabilities/algorand-client", "capabilities/amount", "capabilities/app", "capabilities/app-client", "capabilities/app-deploy", "capabilities/asset", "capabilities/client", "capabilities/debugging", "capabilities/dispenser-client", "capabilities/testing", "capabilities/transaction", "capabilities/transaction-composer", "capabilities/transfer", "capabilities/typed-app-clients", "index", "v3-migration-guide"], "envversion": {"sphinx": 64, "sphinx.domains.c": 3, "sphinx.domains.changeset": 1, "sphinx.domains.citation": 1, "sphinx.domains.cpp": 9, "sphinx.domains.index": 1, "sphinx.domains.javascript": 3, "sphinx.domains.math": 2, "sphinx.domains.python": 4, "sphinx.domains.rst": 2, "sphinx.domains.std": 2}, "filenames": ["autoapi/algokit_utils/accounts/account_manager/index.rst", "autoapi/algokit_utils/accounts/index.rst", "autoapi/algokit_utils/accounts/kmd_account_manager/index.rst", "autoapi/algokit_utils/algorand/index.rst", "autoapi/algokit_utils/applications/abi/index.rst", "autoapi/algokit_utils/applications/app_client/index.rst", "autoapi/algokit_utils/applications/app_deployer/index.rst", "autoapi/algokit_utils/applications/app_factory/index.rst", "autoapi/algokit_utils/applications/app_manager/index.rst", "autoapi/algokit_utils/applications/app_spec/arc32/index.rst", "autoapi/algokit_utils/applications/app_spec/arc56/index.rst", "autoapi/algokit_utils/applications/app_spec/index.rst", "autoapi/algokit_utils/applications/enums/index.rst", "autoapi/algokit_utils/applications/index.rst", "autoapi/algokit_utils/assets/asset_manager/index.rst", "autoapi/algokit_utils/assets/index.rst", "autoapi/algokit_utils/clients/client_manager/index.rst", "autoapi/algokit_utils/clients/dispenser_api_client/index.rst", "autoapi/algokit_utils/clients/index.rst", "autoapi/algokit_utils/config/index.rst", "autoapi/algokit_utils/errors/index.rst", "autoapi/algokit_utils/errors/logic_error/index.rst", "autoapi/algokit_utils/index.rst", "autoapi/algokit_utils/models/account/index.rst", "autoapi/algokit_utils/models/amount/index.rst", "autoapi/algokit_utils/models/application/index.rst", "autoapi/algokit_utils/models/index.rst", "autoapi/algokit_utils/models/network/index.rst", "autoapi/algokit_utils/models/simulate/index.rst", "autoapi/algokit_utils/models/state/index.rst", "autoapi/algokit_utils/models/transaction/index.rst", "autoapi/algokit_utils/protocols/account/index.rst", "autoapi/algokit_utils/protocols/index.rst", "autoapi/algokit_utils/protocols/typed_clients/index.rst", "autoapi/algokit_utils/transactions/index.rst", "autoapi/algokit_utils/transactions/transaction_composer/index.rst", "autoapi/algokit_utils/transactions/transaction_creator/index.rst", "autoapi/algokit_utils/transactions/transaction_sender/index.rst", "autoapi/index.rst", "capabilities/account.md", "capabilities/algorand-client.md", "capabilities/amount.md", "capabilities/app.md", "capabilities/app-client.md", "capabilities/app-deploy.md", "capabilities/asset.md", "capabilities/client.md", "capabilities/debugging.md", "capabilities/dispenser-client.md", "capabilities/testing.md", "capabilities/transaction.md", "capabilities/transaction-composer.md", "capabilities/transfer.md", "capabilities/typed-app-clients.md", "index.md", "v3-migration-guide.md"], "indexentries": {"abi_return (algokit_utils.applications.app_factory.appfactorycreatemethodcallresult attribute)": [[7, "algokit_utils.applications.app_factory.AppFactoryCreateMethodCallResult.abi_return", false]], "abi_return (algokit_utils.transactions.transaction_sender.sendapptransactionresult attribute)": [[37, "algokit_utils.transactions.transaction_sender.SendAppTransactionResult.abi_return", false]], "abiargumenttype (in module algokit_utils.applications.abi)": [[4, "algokit_utils.applications.abi.ABIArgumentType", false]], "abireturn (class in algokit_utils.applications.abi)": [[4, "algokit_utils.applications.abi.ABIReturn", false]], "abistruct (in module algokit_utils.applications.abi)": [[4, "algokit_utils.applications.abi.ABIStruct", false]], "abitype (in module algokit_utils.applications.abi)": [[4, "algokit_utils.applications.abi.ABIType", false]], "abivalue (in module algokit_utils.applications.abi)": [[4, "algokit_utils.applications.abi.ABIValue", false]], "account (algokit_utils.algorand.algorandclient property)": [[3, "algokit_utils.algorand.AlgorandClient.account", false]], "account (algokit_utils.transactions.transaction_composer.assetfreezeparams attribute)": [[35, "algokit_utils.transactions.transaction_composer.AssetFreezeParams.account", false]], "account_references (algokit_utils.applications.app_client.commonappcallparams attribute)": [[5, "algokit_utils.applications.app_client.CommonAppCallParams.account_references", false]], "account_references (algokit_utils.transactions.transaction_composer.appcallparams attribute)": [[35, "algokit_utils.transactions.transaction_composer.AppCallParams.account_references", false]], "account_references (algokit_utils.transactions.transaction_composer.appcreateparams attribute)": [[35, "algokit_utils.transactions.transaction_composer.AppCreateParams.account_references", false]], "account_references (algokit_utils.transactions.transaction_composer.appdeleteparams attribute)": [[35, "algokit_utils.transactions.transaction_composer.AppDeleteParams.account_references", false]], "account_references (algokit_utils.transactions.transaction_composer.appupdateparams attribute)": [[35, "algokit_utils.transactions.transaction_composer.AppUpdateParams.account_references", false]], "accountassetinformation (class in algokit_utils.assets.asset_manager)": [[14, "algokit_utils.assets.asset_manager.AccountAssetInformation", false]], "accountinformation (class in algokit_utils.accounts.account_manager)": [[0, "algokit_utils.accounts.account_manager.AccountInformation", false]], "accountmanager (class in algokit_utils.accounts.account_manager)": [[0, "algokit_utils.accounts.account_manager.AccountManager", false]], "accounts (algokit_utils.applications.app_spec.arc56.recommendations attribute)": [[10, "algokit_utils.applications.app_spec.arc56.Recommendations.accounts", false]], "actions (algokit_utils.applications.app_spec.arc56.method attribute)": [[10, "algokit_utils.applications.app_spec.arc56.Method.actions", false]], "actions (class in algokit_utils.applications.app_spec.arc56)": [[10, "algokit_utils.applications.app_spec.arc56.Actions", false]], "add_app_call() (algokit_utils.transactions.transaction_composer.transactioncomposer method)": [[35, "algokit_utils.transactions.transaction_composer.TransactionComposer.add_app_call", false]], "add_app_call_method_call() (algokit_utils.transactions.transaction_composer.transactioncomposer method)": [[35, "algokit_utils.transactions.transaction_composer.TransactionComposer.add_app_call_method_call", false]], "add_app_create() (algokit_utils.transactions.transaction_composer.transactioncomposer method)": [[35, "algokit_utils.transactions.transaction_composer.TransactionComposer.add_app_create", false]], "add_app_create_method_call() (algokit_utils.transactions.transaction_composer.transactioncomposer method)": [[35, "algokit_utils.transactions.transaction_composer.TransactionComposer.add_app_create_method_call", false]], "add_app_delete() (algokit_utils.transactions.transaction_composer.transactioncomposer method)": [[35, "algokit_utils.transactions.transaction_composer.TransactionComposer.add_app_delete", false]], "add_app_delete_method_call() (algokit_utils.transactions.transaction_composer.transactioncomposer method)": [[35, "algokit_utils.transactions.transaction_composer.TransactionComposer.add_app_delete_method_call", false]], "add_app_update() (algokit_utils.transactions.transaction_composer.transactioncomposer method)": [[35, "algokit_utils.transactions.transaction_composer.TransactionComposer.add_app_update", false]], "add_app_update_method_call() (algokit_utils.transactions.transaction_composer.transactioncomposer method)": [[35, "algokit_utils.transactions.transaction_composer.TransactionComposer.add_app_update_method_call", false]], "add_asset_config() (algokit_utils.transactions.transaction_composer.transactioncomposer method)": [[35, "algokit_utils.transactions.transaction_composer.TransactionComposer.add_asset_config", false]], "add_asset_create() (algokit_utils.transactions.transaction_composer.transactioncomposer method)": [[35, "algokit_utils.transactions.transaction_composer.TransactionComposer.add_asset_create", false]], "add_asset_destroy() (algokit_utils.transactions.transaction_composer.transactioncomposer method)": [[35, "algokit_utils.transactions.transaction_composer.TransactionComposer.add_asset_destroy", false]], "add_asset_freeze() (algokit_utils.transactions.transaction_composer.transactioncomposer method)": [[35, "algokit_utils.transactions.transaction_composer.TransactionComposer.add_asset_freeze", false]], "add_asset_opt_in() (algokit_utils.transactions.transaction_composer.transactioncomposer method)": [[35, "algokit_utils.transactions.transaction_composer.TransactionComposer.add_asset_opt_in", false]], "add_asset_opt_out() (algokit_utils.transactions.transaction_composer.transactioncomposer method)": [[35, "algokit_utils.transactions.transaction_composer.TransactionComposer.add_asset_opt_out", false]], "add_asset_transfer() (algokit_utils.transactions.transaction_composer.transactioncomposer method)": [[35, "algokit_utils.transactions.transaction_composer.TransactionComposer.add_asset_transfer", false]], "add_atc() (algokit_utils.transactions.transaction_composer.transactioncomposer method)": [[35, "algokit_utils.transactions.transaction_composer.TransactionComposer.add_atc", false]], "add_offline_key_registration() (algokit_utils.transactions.transaction_composer.transactioncomposer method)": [[35, "algokit_utils.transactions.transaction_composer.TransactionComposer.add_offline_key_registration", false]], "add_online_key_registration() (algokit_utils.transactions.transaction_composer.transactioncomposer method)": [[35, "algokit_utils.transactions.transaction_composer.TransactionComposer.add_online_key_registration", false]], "add_payment() (algokit_utils.transactions.transaction_composer.transactioncomposer method)": [[35, "algokit_utils.transactions.transaction_composer.TransactionComposer.add_payment", false]], "add_transaction() (algokit_utils.transactions.transaction_composer.transactioncomposer method)": [[35, "algokit_utils.transactions.transaction_composer.TransactionComposer.add_transaction", false]], "address (algokit_utils.accounts.account_manager.accountinformation attribute)": [[0, "algokit_utils.accounts.account_manager.AccountInformation.address", false]], "address (algokit_utils.models.account.logicsigaccount property)": [[23, "algokit_utils.models.account.LogicSigAccount.address", false]], "address (algokit_utils.models.account.multisigaccount property)": [[23, "algokit_utils.models.account.MultiSigAccount.address", false]], "address (algokit_utils.models.account.signingaccount attribute)": [[23, "algokit_utils.models.account.SigningAccount.address", false]], "address (algokit_utils.models.account.transactionsigneraccount attribute)": [[23, "algokit_utils.models.account.TransactionSignerAccount.address", false]], "address (algokit_utils.protocols.account.transactionsigneraccountprotocol property)": [[31, "algokit_utils.protocols.account.TransactionSignerAccountProtocol.address", false]], "addresses (algokit_utils.models.account.multisigmetadata attribute)": [[23, "algokit_utils.models.account.MultisigMetadata.addresses", false]], "algo (algokit_utils.clients.dispenser_api_client.dispenserassetname attribute)": [[17, "algokit_utils.clients.dispenser_api_client.DispenserAssetName.ALGO", false]], "algo (algokit_utils.models.amount.algoamount property)": [[24, "algokit_utils.models.amount.AlgoAmount.algo", false]], "algo() (in module algokit_utils.models.amount)": [[24, "algokit_utils.models.amount.algo", false]], "algoamount (class in algokit_utils.models.amount)": [[24, "algokit_utils.models.amount.AlgoAmount", false]], "algoclientconfigs (class in algokit_utils.models.network)": [[27, "algokit_utils.models.network.AlgoClientConfigs", false]], "algoclientnetworkconfig (class in algokit_utils.models.network)": [[27, "algokit_utils.models.network.AlgoClientNetworkConfig", false]], "algod (algokit_utils.applications.app_spec.arc56.compiler attribute)": [[10, "algokit_utils.applications.app_spec.arc56.Compiler.ALGOD", false]], "algod (algokit_utils.clients.client_manager.algosdkclients attribute)": [[16, "algokit_utils.clients.client_manager.AlgoSdkClients.algod", false]], "algod (algokit_utils.clients.client_manager.clientmanager property)": [[16, "algokit_utils.clients.client_manager.ClientManager.algod", false]], "algod_config (algokit_utils.models.network.algoclientconfigs attribute)": [[27, "algokit_utils.models.network.AlgoClientConfigs.algod_config", false]], "algokit_config_filename (in module algokit_utils.config)": [[19, "algokit_utils.config.ALGOKIT_CONFIG_FILENAME", false]], "algokit_project_root (in module algokit_utils.config)": [[19, "algokit_utils.config.ALGOKIT_PROJECT_ROOT", false]], "algokit_utils": [[22, "module-algokit_utils", false]], "algokit_utils.accounts": [[1, "module-algokit_utils.accounts", false]], "algokit_utils.accounts.account_manager": [[0, "module-algokit_utils.accounts.account_manager", false]], "algokit_utils.accounts.kmd_account_manager": [[2, "module-algokit_utils.accounts.kmd_account_manager", false]], "algokit_utils.algorand": [[3, "module-algokit_utils.algorand", false]], "algokit_utils.applications": [[13, "module-algokit_utils.applications", false]], "algokit_utils.applications.abi": [[4, "module-algokit_utils.applications.abi", false]], "algokit_utils.applications.app_client": [[5, "module-algokit_utils.applications.app_client", false]], "algokit_utils.applications.app_deployer": [[6, "module-algokit_utils.applications.app_deployer", false]], "algokit_utils.applications.app_factory": [[7, "module-algokit_utils.applications.app_factory", false]], "algokit_utils.applications.app_manager": [[8, "module-algokit_utils.applications.app_manager", false]], "algokit_utils.applications.app_spec": [[11, "module-algokit_utils.applications.app_spec", false]], "algokit_utils.applications.app_spec.arc32": [[9, "module-algokit_utils.applications.app_spec.arc32", false]], "algokit_utils.applications.app_spec.arc56": [[10, "module-algokit_utils.applications.app_spec.arc56", false]], "algokit_utils.applications.enums": [[12, "module-algokit_utils.applications.enums", false]], "algokit_utils.assets": [[15, "module-algokit_utils.assets", false]], "algokit_utils.assets.asset_manager": [[14, "module-algokit_utils.assets.asset_manager", false]], "algokit_utils.clients": [[18, "module-algokit_utils.clients", false]], "algokit_utils.clients.client_manager": [[16, "module-algokit_utils.clients.client_manager", false]], "algokit_utils.clients.dispenser_api_client": [[17, "module-algokit_utils.clients.dispenser_api_client", false]], "algokit_utils.config": [[19, "module-algokit_utils.config", false]], "algokit_utils.errors": [[20, "module-algokit_utils.errors", false]], "algokit_utils.errors.logic_error": [[21, "module-algokit_utils.errors.logic_error", false]], "algokit_utils.models": [[26, "module-algokit_utils.models", false]], "algokit_utils.models.account": [[23, "module-algokit_utils.models.account", false]], "algokit_utils.models.amount": [[24, "module-algokit_utils.models.amount", false]], "algokit_utils.models.application": [[25, "module-algokit_utils.models.application", false]], "algokit_utils.models.network": [[27, "module-algokit_utils.models.network", false]], "algokit_utils.models.simulate": [[28, "module-algokit_utils.models.simulate", false]], "algokit_utils.models.state": [[29, "module-algokit_utils.models.state", false]], "algokit_utils.models.transaction": [[30, "module-algokit_utils.models.transaction", false]], "algokit_utils.protocols": [[32, "module-algokit_utils.protocols", false]], "algokit_utils.protocols.account": [[31, "module-algokit_utils.protocols.account", false]], "algokit_utils.protocols.typed_clients": [[33, "module-algokit_utils.protocols.typed_clients", false]], "algokit_utils.transactions": [[34, "module-algokit_utils.transactions", false]], "algokit_utils.transactions.transaction_composer": [[35, "module-algokit_utils.transactions.transaction_composer", false]], "algokit_utils.transactions.transaction_creator": [[36, "module-algokit_utils.transactions.transaction_creator", false]], "algokit_utils.transactions.transaction_sender": [[37, "module-algokit_utils.transactions.transaction_sender", false]], "algokitlogger (class in algokit_utils.config)": [[19, "algokit_utils.config.AlgoKitLogger", false]], "algorand (algokit_utils.applications.app_client.appclient property)": [[5, "algokit_utils.applications.app_client.AppClient.algorand", false]], "algorand (algokit_utils.applications.app_client.appclientparams attribute)": [[5, "algokit_utils.applications.app_client.AppClientParams.algorand", false]], "algorand (algokit_utils.applications.app_factory.appfactory property)": [[7, "algokit_utils.applications.app_factory.AppFactory.algorand", false]], "algorand (algokit_utils.applications.app_factory.appfactoryparams attribute)": [[7, "algokit_utils.applications.app_factory.AppFactoryParams.algorand", false]], "algorand_min_tx_fee (in module algokit_utils.models.amount)": [[24, "algokit_utils.models.amount.ALGORAND_MIN_TX_FEE", false]], "algorandclient (class in algokit_utils.algorand)": [[3, "algokit_utils.algorand.AlgorandClient", false]], "algorandclienttransactioncreator (class in algokit_utils.transactions.transaction_creator)": [[36, "algokit_utils.transactions.transaction_creator.AlgorandClientTransactionCreator", false]], "algorandclienttransactionsender (class in algokit_utils.transactions.transaction_sender)": [[37, "algokit_utils.transactions.transaction_sender.AlgorandClientTransactionSender", false]], "algosdkclients (class in algokit_utils.clients.client_manager)": [[16, "algokit_utils.clients.client_manager.AlgoSdkClients", false]], "all (algokit_utils.applications.app_spec.arc32.callconfig attribute)": [[9, "algokit_utils.applications.app_spec.arc32.CallConfig.ALL", false]], "amount (algokit_utils.accounts.account_manager.accountinformation attribute)": [[0, "algokit_utils.accounts.account_manager.AccountInformation.amount", false]], "amount (algokit_utils.applications.app_client.fundappaccountparams attribute)": [[5, "algokit_utils.applications.app_client.FundAppAccountParams.amount", false]], "amount (algokit_utils.clients.dispenser_api_client.dispenserfundresponse attribute)": [[17, "algokit_utils.clients.dispenser_api_client.DispenserFundResponse.amount", false]], "amount (algokit_utils.clients.dispenser_api_client.dispenserlimitresponse attribute)": [[17, "algokit_utils.clients.dispenser_api_client.DispenserLimitResponse.amount", false]], "amount (algokit_utils.transactions.transaction_composer.assettransferparams attribute)": [[35, "algokit_utils.transactions.transaction_composer.AssetTransferParams.amount", false]], "amount (algokit_utils.transactions.transaction_composer.paymentparams attribute)": [[35, "algokit_utils.transactions.transaction_composer.PaymentParams.amount", false]], "amount_without_pending_rewards (algokit_utils.accounts.account_manager.accountinformation attribute)": [[0, "algokit_utils.accounts.account_manager.AccountInformation.amount_without_pending_rewards", false]], "app (algokit_utils.algorand.algorandclient property)": [[3, "algokit_utils.algorand.AlgorandClient.app", false]], "app (algokit_utils.applications.app_deployer.appdeployresult attribute)": [[6, "algokit_utils.applications.app_deployer.AppDeployResult.app", false]], "app (algokit_utils.applications.app_factory.appfactorydeployresult attribute)": [[7, "algokit_utils.applications.app_factory.AppFactoryDeployResult.app", false]], "app (algokit_utils.applications.app_spec.arc56.boxes attribute)": [[10, "algokit_utils.applications.app_spec.arc56.Boxes.app", false]], "app_address (algokit_utils.applications.app_client.appclient property)": [[5, "algokit_utils.applications.app_client.AppClient.app_address", false]], "app_address (algokit_utils.applications.app_deployer.applicationmetadata property)": [[6, "algokit_utils.applications.app_deployer.ApplicationMetaData.app_address", false]], "app_address (algokit_utils.applications.app_deployer.applicationreference attribute)": [[6, "algokit_utils.applications.app_deployer.ApplicationReference.app_address", false]], "app_address (algokit_utils.applications.app_factory.appfactorycreatemethodcallresult attribute)": [[7, "algokit_utils.applications.app_factory.AppFactoryCreateMethodCallResult.app_address", false]], "app_address (algokit_utils.models.application.appinformation attribute)": [[25, "algokit_utils.models.application.AppInformation.app_address", false]], "app_address (algokit_utils.transactions.transaction_sender.sendappcreatetransactionresult attribute)": [[37, "algokit_utils.transactions.transaction_sender.SendAppCreateTransactionResult.app_address", false]], "app_budget_added (algokit_utils.models.simulate.simulationtrace attribute)": [[28, "algokit_utils.models.simulate.SimulationTrace.app_budget_added", false]], "app_budget_consumed (algokit_utils.models.simulate.simulationtrace attribute)": [[28, "algokit_utils.models.simulate.SimulationTrace.app_budget_consumed", false]], "app_call (algokit_utils.transactions.transaction_creator.algorandclienttransactioncreator property)": [[36, "algokit_utils.transactions.transaction_creator.AlgorandClientTransactionCreator.app_call", false]], "app_call() (algokit_utils.transactions.transaction_sender.algorandclienttransactionsender method)": [[37, "algokit_utils.transactions.transaction_sender.AlgorandClientTransactionSender.app_call", false]], "app_call_method_call (algokit_utils.transactions.transaction_creator.algorandclienttransactioncreator property)": [[36, "algokit_utils.transactions.transaction_creator.AlgorandClientTransactionCreator.app_call_method_call", false]], "app_call_method_call() (algokit_utils.transactions.transaction_sender.algorandclienttransactionsender method)": [[37, "algokit_utils.transactions.transaction_sender.AlgorandClientTransactionSender.app_call_method_call", false]], "app_create (algokit_utils.transactions.transaction_creator.algorandclienttransactioncreator property)": [[36, "algokit_utils.transactions.transaction_creator.AlgorandClientTransactionCreator.app_create", false]], "app_create() (algokit_utils.transactions.transaction_sender.algorandclienttransactionsender method)": [[37, "algokit_utils.transactions.transaction_sender.AlgorandClientTransactionSender.app_create", false]], "app_create_method_call (algokit_utils.transactions.transaction_creator.algorandclienttransactioncreator property)": [[36, "algokit_utils.transactions.transaction_creator.AlgorandClientTransactionCreator.app_create_method_call", false]], "app_create_method_call() (algokit_utils.transactions.transaction_sender.algorandclienttransactionsender method)": [[37, "algokit_utils.transactions.transaction_sender.AlgorandClientTransactionSender.app_create_method_call", false]], "app_delete (algokit_utils.transactions.transaction_creator.algorandclienttransactioncreator property)": [[36, "algokit_utils.transactions.transaction_creator.AlgorandClientTransactionCreator.app_delete", false]], "app_delete() (algokit_utils.transactions.transaction_sender.algorandclienttransactionsender method)": [[37, "algokit_utils.transactions.transaction_sender.AlgorandClientTransactionSender.app_delete", false]], "app_delete_method_call (algokit_utils.transactions.transaction_creator.algorandclienttransactioncreator property)": [[36, "algokit_utils.transactions.transaction_creator.AlgorandClientTransactionCreator.app_delete_method_call", false]], "app_delete_method_call() (algokit_utils.transactions.transaction_sender.algorandclienttransactionsender method)": [[37, "algokit_utils.transactions.transaction_sender.AlgorandClientTransactionSender.app_delete_method_call", false]], "app_deploy_note_dapp (in module algokit_utils.applications.app_deployer)": [[6, "algokit_utils.applications.app_deployer.APP_DEPLOY_NOTE_DAPP", false]], "app_deployer (algokit_utils.algorand.algorandclient property)": [[3, "algokit_utils.algorand.AlgorandClient.app_deployer", false]], "app_id (algokit_utils.applications.app_client.appclient property)": [[5, "algokit_utils.applications.app_client.AppClient.app_id", false]], "app_id (algokit_utils.applications.app_client.appclientparams attribute)": [[5, "algokit_utils.applications.app_client.AppClientParams.app_id", false]], "app_id (algokit_utils.applications.app_deployer.applicationmetadata property)": [[6, "algokit_utils.applications.app_deployer.ApplicationMetaData.app_id", false]], "app_id (algokit_utils.applications.app_deployer.applicationreference attribute)": [[6, "algokit_utils.applications.app_deployer.ApplicationReference.app_id", false]], "app_id (algokit_utils.applications.app_factory.appfactorycreatemethodcallresult attribute)": [[7, "algokit_utils.applications.app_factory.AppFactoryCreateMethodCallResult.app_id", false]], "app_id (algokit_utils.applications.app_spec.arc56.network attribute)": [[10, "algokit_utils.applications.app_spec.arc56.Network.app_id", false]], "app_id (algokit_utils.models.application.appinformation attribute)": [[25, "algokit_utils.models.application.AppInformation.app_id", false]], "app_id (algokit_utils.transactions.transaction_composer.appcallmethodcallparams attribute)": [[35, "algokit_utils.transactions.transaction_composer.AppCallMethodCallParams.app_id", false]], "app_id (algokit_utils.transactions.transaction_composer.appcallparams attribute)": [[35, "algokit_utils.transactions.transaction_composer.AppCallParams.app_id", false]], "app_id (algokit_utils.transactions.transaction_composer.appdeletemethodcallparams attribute)": [[35, "algokit_utils.transactions.transaction_composer.AppDeleteMethodCallParams.app_id", false]], "app_id (algokit_utils.transactions.transaction_composer.appdeleteparams attribute)": [[35, "algokit_utils.transactions.transaction_composer.AppDeleteParams.app_id", false]], "app_id (algokit_utils.transactions.transaction_composer.appupdatemethodcallparams attribute)": [[35, "algokit_utils.transactions.transaction_composer.AppUpdateMethodCallParams.app_id", false]], "app_id (algokit_utils.transactions.transaction_composer.appupdateparams attribute)": [[35, "algokit_utils.transactions.transaction_composer.AppUpdateParams.app_id", false]], "app_id (algokit_utils.transactions.transaction_sender.sendappcreatetransactionresult attribute)": [[37, "algokit_utils.transactions.transaction_sender.SendAppCreateTransactionResult.app_id", false]], "app_name (algokit_utils.applications.app_client.appclient property)": [[5, "algokit_utils.applications.app_client.AppClient.app_name", false]], "app_name (algokit_utils.applications.app_client.appclientparams attribute)": [[5, "algokit_utils.applications.app_client.AppClientParams.app_name", false]], "app_name (algokit_utils.applications.app_factory.appfactory property)": [[7, "algokit_utils.applications.app_factory.AppFactory.app_name", false]], "app_name (algokit_utils.applications.app_factory.appfactoryparams attribute)": [[7, "algokit_utils.applications.app_factory.AppFactoryParams.app_name", false]], "app_references (algokit_utils.applications.app_client.commonappcallparams attribute)": [[5, "algokit_utils.applications.app_client.CommonAppCallParams.app_references", false]], "app_references (algokit_utils.transactions.transaction_composer.appcallparams attribute)": [[35, "algokit_utils.transactions.transaction_composer.AppCallParams.app_references", false]], "app_references (algokit_utils.transactions.transaction_composer.appcreateparams attribute)": [[35, "algokit_utils.transactions.transaction_composer.AppCreateParams.app_references", false]], "app_references (algokit_utils.transactions.transaction_composer.appdeleteparams attribute)": [[35, "algokit_utils.transactions.transaction_composer.AppDeleteParams.app_references", false]], "app_references (algokit_utils.transactions.transaction_composer.appupdateparams attribute)": [[35, "algokit_utils.transactions.transaction_composer.AppUpdateParams.app_references", false]], "app_spec (algokit_utils.applications.app_client.appclient property)": [[5, "algokit_utils.applications.app_client.AppClient.app_spec", false]], "app_spec (algokit_utils.applications.app_client.appclientparams attribute)": [[5, "algokit_utils.applications.app_client.AppClientParams.app_spec", false]], "app_spec (algokit_utils.applications.app_factory.appfactory property)": [[7, "algokit_utils.applications.app_factory.AppFactory.app_spec", false]], "app_spec (algokit_utils.applications.app_factory.appfactoryparams attribute)": [[7, "algokit_utils.applications.app_factory.AppFactoryParams.app_spec", false]], "app_update (algokit_utils.transactions.transaction_creator.algorandclienttransactioncreator property)": [[36, "algokit_utils.transactions.transaction_creator.AlgorandClientTransactionCreator.app_update", false]], "app_update() (algokit_utils.transactions.transaction_sender.algorandclienttransactionsender method)": [[37, "algokit_utils.transactions.transaction_sender.AlgorandClientTransactionSender.app_update", false]], "app_update_method_call (algokit_utils.transactions.transaction_creator.algorandclienttransactioncreator property)": [[36, "algokit_utils.transactions.transaction_creator.AlgorandClientTransactionCreator.app_update_method_call", false]], "app_update_method_call() (algokit_utils.transactions.transaction_sender.algorandclienttransactionsender method)": [[37, "algokit_utils.transactions.transaction_sender.AlgorandClientTransactionSender.app_update_method_call", false]], "appcallmethodcallparams (class in algokit_utils.transactions.transaction_composer)": [[35, "algokit_utils.transactions.transaction_composer.AppCallMethodCallParams", false]], "appcallparams (class in algokit_utils.transactions.transaction_composer)": [[35, "algokit_utils.transactions.transaction_composer.AppCallParams", false]], "appclient (class in algokit_utils.applications.app_client)": [[5, "algokit_utils.applications.app_client.AppClient", false]], "appclientbarecallcreateparams (class in algokit_utils.applications.app_client)": [[5, "algokit_utils.applications.app_client.AppClientBareCallCreateParams", false]], "appclientbarecallparams (class in algokit_utils.applications.app_client)": [[5, "algokit_utils.applications.app_client.AppClientBareCallParams", false]], "appclientcompilationparams (class in algokit_utils.applications.app_client)": [[5, "algokit_utils.applications.app_client.AppClientCompilationParams", false]], "appclientcompilationresult (class in algokit_utils.applications.app_client)": [[5, "algokit_utils.applications.app_client.AppClientCompilationResult", false]], "appclientcreateschema (class in algokit_utils.applications.app_client)": [[5, "algokit_utils.applications.app_client.AppClientCreateSchema", false]], "appclientmethodcallcreateparams (class in algokit_utils.applications.app_client)": [[5, "algokit_utils.applications.app_client.AppClientMethodCallCreateParams", false]], "appclientmethodcallparams (class in algokit_utils.applications.app_client)": [[5, "algokit_utils.applications.app_client.AppClientMethodCallParams", false]], "appclientparams (class in algokit_utils.applications.app_client)": [[5, "algokit_utils.applications.app_client.AppClientParams", false]], "appcompilationresult (class in algokit_utils.models.application)": [[25, "algokit_utils.models.application.AppCompilationResult", false]], "appcreatemethodcallparams (class in algokit_utils.transactions.transaction_composer)": [[35, "algokit_utils.transactions.transaction_composer.AppCreateMethodCallParams", false]], "appcreateparams (class in algokit_utils.transactions.transaction_composer)": [[35, "algokit_utils.transactions.transaction_composer.AppCreateParams", false]], "appcreateschema (class in algokit_utils.transactions.transaction_composer)": [[35, "algokit_utils.transactions.transaction_composer.AppCreateSchema", false]], "appdeletemethodcallparams (class in algokit_utils.transactions.transaction_composer)": [[35, "algokit_utils.transactions.transaction_composer.AppDeleteMethodCallParams", false]], "appdeleteparams (class in algokit_utils.transactions.transaction_composer)": [[35, "algokit_utils.transactions.transaction_composer.AppDeleteParams", false]], "appdeployer (class in algokit_utils.applications.app_deployer)": [[6, "algokit_utils.applications.app_deployer.AppDeployer", false]], "appdeploymentmetadata (class in algokit_utils.applications.app_deployer)": [[6, "algokit_utils.applications.app_deployer.AppDeploymentMetaData", false]], "appdeployparams (class in algokit_utils.applications.app_deployer)": [[6, "algokit_utils.applications.app_deployer.AppDeployParams", false]], "appdeployresult (class in algokit_utils.applications.app_deployer)": [[6, "algokit_utils.applications.app_deployer.AppDeployResult", false]], "appendapp (algokit_utils.applications.enums.onschemabreak attribute)": [[12, "algokit_utils.applications.enums.OnSchemaBreak.AppendApp", false]], "appendapp (algokit_utils.applications.enums.onupdate attribute)": [[12, "algokit_utils.applications.enums.OnUpdate.AppendApp", false]], "appfactory (class in algokit_utils.applications.app_factory)": [[7, "algokit_utils.applications.app_factory.AppFactory", false]], "appfactorycreatemethodcallparams (class in algokit_utils.applications.app_factory)": [[7, "algokit_utils.applications.app_factory.AppFactoryCreateMethodCallParams", false]], "appfactorycreatemethodcallresult (class in algokit_utils.applications.app_factory)": [[7, "algokit_utils.applications.app_factory.AppFactoryCreateMethodCallResult", false]], "appfactorycreateparams (class in algokit_utils.applications.app_factory)": [[7, "algokit_utils.applications.app_factory.AppFactoryCreateParams", false]], "appfactorydeployresult (class in algokit_utils.applications.app_factory)": [[7, "algokit_utils.applications.app_factory.AppFactoryDeployResult", false]], "appfactoryparams (class in algokit_utils.applications.app_factory)": [[7, "algokit_utils.applications.app_factory.AppFactoryParams", false]], "appinformation (class in algokit_utils.models.application)": [[25, "algokit_utils.models.application.AppInformation", false]], "application_call (algokit_utils.models.transaction.transactionwrapper property)": [[30, "algokit_utils.models.transaction.TransactionWrapper.application_call", false]], "applicationlookup (class in algokit_utils.applications.app_deployer)": [[6, "algokit_utils.applications.app_deployer.ApplicationLookup", false]], "applicationmetadata (class in algokit_utils.applications.app_deployer)": [[6, "algokit_utils.applications.app_deployer.ApplicationMetaData", false]], "applicationreference (class in algokit_utils.applications.app_deployer)": [[6, "algokit_utils.applications.app_deployer.ApplicationReference", false]], "appmanager (class in algokit_utils.applications.app_manager)": [[8, "algokit_utils.applications.app_manager.AppManager", false]], "appmethodcalltransactionargument (in module algokit_utils.transactions.transaction_composer)": [[35, "algokit_utils.transactions.transaction_composer.AppMethodCallTransactionArgument", false]], "approval (algokit_utils.applications.app_spec.arc56.bytecode attribute)": [[10, "algokit_utils.applications.app_spec.arc56.ByteCode.approval", false]], "approval (algokit_utils.applications.app_spec.arc56.source attribute)": [[10, "algokit_utils.applications.app_spec.arc56.Source.approval", false]], "approval (algokit_utils.applications.app_spec.arc56.sourceinfomodel attribute)": [[10, "algokit_utils.applications.app_spec.arc56.SourceInfoModel.approval", false]], "approval_program (algokit_utils.applications.app_client.appclientcompilationresult attribute)": [[5, "algokit_utils.applications.app_client.AppClientCompilationResult.approval_program", false]], "approval_program (algokit_utils.applications.app_spec.arc32.arc32contract attribute)": [[9, "algokit_utils.applications.app_spec.arc32.Arc32Contract.approval_program", false]], "approval_program (algokit_utils.models.application.appinformation attribute)": [[25, "algokit_utils.models.application.AppInformation.approval_program", false]], "approval_program (algokit_utils.transactions.transaction_composer.appcallparams attribute)": [[35, "algokit_utils.transactions.transaction_composer.AppCallParams.approval_program", false]], "approval_program (algokit_utils.transactions.transaction_composer.appcreatemethodcallparams attribute)": [[35, "algokit_utils.transactions.transaction_composer.AppCreateMethodCallParams.approval_program", false]], "approval_program (algokit_utils.transactions.transaction_composer.appcreateparams attribute)": [[35, "algokit_utils.transactions.transaction_composer.AppCreateParams.approval_program", false]], "approval_program (algokit_utils.transactions.transaction_composer.appupdatemethodcallparams attribute)": [[35, "algokit_utils.transactions.transaction_composer.AppUpdateMethodCallParams.approval_program", false]], "approval_program (algokit_utils.transactions.transaction_composer.appupdateparams attribute)": [[35, "algokit_utils.transactions.transaction_composer.AppUpdateParams.approval_program", false]], "approval_source_map (algokit_utils.applications.app_client.appclientparams attribute)": [[5, "algokit_utils.applications.app_client.AppClientParams.approval_source_map", false]], "approval_source_map (algokit_utils.models.application.appsourcemaps attribute)": [[25, "algokit_utils.models.application.AppSourceMaps.approval_source_map", false]], "apps (algokit_utils.applications.app_deployer.applicationlookup attribute)": [[6, "algokit_utils.applications.app_deployer.ApplicationLookup.apps", false]], "apps (algokit_utils.applications.app_spec.arc56.recommendations attribute)": [[10, "algokit_utils.applications.app_spec.arc56.Recommendations.apps", false]], "apps_local_state (algokit_utils.accounts.account_manager.accountinformation attribute)": [[0, "algokit_utils.accounts.account_manager.AccountInformation.apps_local_state", false]], "apps_total_extra_pages (algokit_utils.accounts.account_manager.accountinformation attribute)": [[0, "algokit_utils.accounts.account_manager.AccountInformation.apps_total_extra_pages", false]], "apps_total_schema (algokit_utils.accounts.account_manager.accountinformation attribute)": [[0, "algokit_utils.accounts.account_manager.AccountInformation.apps_total_schema", false]], "appsourcemaps (class in algokit_utils.models.application)": [[25, "algokit_utils.models.application.AppSourceMaps", false]], "appspecstatedict (in module algokit_utils.applications.app_spec.arc32)": [[9, "algokit_utils.applications.app_spec.arc32.AppSpecStateDict", false]], "appstate (class in algokit_utils.models.application)": [[25, "algokit_utils.models.application.AppState", false]], "appupdatemethodcallparams (class in algokit_utils.transactions.transaction_composer)": [[35, "algokit_utils.transactions.transaction_composer.AppUpdateMethodCallParams", false]], "appupdateparams (class in algokit_utils.transactions.transaction_composer)": [[35, "algokit_utils.transactions.transaction_composer.AppUpdateParams", false]], "arc2_note() (algokit_utils.transactions.transaction_composer.transactioncomposer static method)": [[35, "algokit_utils.transactions.transaction_composer.TransactionComposer.arc2_note", false]], "arc2transactionnote (in module algokit_utils.models.transaction)": [[30, "algokit_utils.models.transaction.Arc2TransactionNote", false]], "arc32contract (class in algokit_utils.applications.app_spec.arc32)": [[9, "algokit_utils.applications.app_spec.arc32.Arc32Contract", false]], "arc56contract (class in algokit_utils.applications.app_spec.arc56)": [[10, "algokit_utils.applications.app_spec.arc56.Arc56Contract", false]], "arc56returnvaluetype (in module algokit_utils.applications.abi)": [[4, "algokit_utils.applications.abi.Arc56ReturnValueType", false]], "arcs (algokit_utils.applications.app_spec.arc56.arc56contract attribute)": [[10, "algokit_utils.applications.app_spec.arc56.Arc56Contract.arcs", false]], "args (algokit_utils.applications.app_client.appclientbarecallparams attribute)": [[5, "algokit_utils.applications.app_client.AppClientBareCallParams.args", false]], "args (algokit_utils.applications.app_client.baseappclientmethodcallparams attribute)": [[5, "algokit_utils.applications.app_client.BaseAppClientMethodCallParams.args", false]], "args (algokit_utils.applications.app_spec.arc56.event attribute)": [[10, "algokit_utils.applications.app_spec.arc56.Event.args", false]], "args (algokit_utils.applications.app_spec.arc56.method attribute)": [[10, "algokit_utils.applications.app_spec.arc56.Method.args", false]], "args (algokit_utils.transactions.transaction_composer.appcallparams attribute)": [[35, "algokit_utils.transactions.transaction_composer.AppCallParams.args", false]], "args (algokit_utils.transactions.transaction_composer.appcreateparams attribute)": [[35, "algokit_utils.transactions.transaction_composer.AppCreateParams.args", false]], "args (algokit_utils.transactions.transaction_composer.appdeleteparams attribute)": [[35, "algokit_utils.transactions.transaction_composer.AppDeleteParams.args", false]], "args (algokit_utils.transactions.transaction_composer.appupdateparams attribute)": [[35, "algokit_utils.transactions.transaction_composer.AppUpdateParams.args", false]], "asset (algokit_utils.algorand.algorandclient property)": [[3, "algokit_utils.algorand.AlgorandClient.asset", false]], "asset_config (algokit_utils.models.transaction.transactionwrapper property)": [[30, "algokit_utils.models.transaction.TransactionWrapper.asset_config", false]], "asset_config (algokit_utils.transactions.transaction_creator.algorandclienttransactioncreator property)": [[36, "algokit_utils.transactions.transaction_creator.AlgorandClientTransactionCreator.asset_config", false]], "asset_config() (algokit_utils.transactions.transaction_sender.algorandclienttransactionsender method)": [[37, "algokit_utils.transactions.transaction_sender.AlgorandClientTransactionSender.asset_config", false]], "asset_create (algokit_utils.transactions.transaction_creator.algorandclienttransactioncreator property)": [[36, "algokit_utils.transactions.transaction_creator.AlgorandClientTransactionCreator.asset_create", false]], "asset_create() (algokit_utils.transactions.transaction_sender.algorandclienttransactionsender method)": [[37, "algokit_utils.transactions.transaction_sender.AlgorandClientTransactionSender.asset_create", false]], "asset_destroy (algokit_utils.transactions.transaction_creator.algorandclienttransactioncreator property)": [[36, "algokit_utils.transactions.transaction_creator.AlgorandClientTransactionCreator.asset_destroy", false]], "asset_destroy() (algokit_utils.transactions.transaction_sender.algorandclienttransactionsender method)": [[37, "algokit_utils.transactions.transaction_sender.AlgorandClientTransactionSender.asset_destroy", false]], "asset_freeze (algokit_utils.models.transaction.transactionwrapper property)": [[30, "algokit_utils.models.transaction.TransactionWrapper.asset_freeze", false]], "asset_freeze (algokit_utils.transactions.transaction_creator.algorandclienttransactioncreator property)": [[36, "algokit_utils.transactions.transaction_creator.AlgorandClientTransactionCreator.asset_freeze", false]], "asset_freeze() (algokit_utils.transactions.transaction_sender.algorandclienttransactionsender method)": [[37, "algokit_utils.transactions.transaction_sender.AlgorandClientTransactionSender.asset_freeze", false]], "asset_id (algokit_utils.assets.asset_manager.accountassetinformation attribute)": [[14, "algokit_utils.assets.asset_manager.AccountAssetInformation.asset_id", false]], "asset_id (algokit_utils.assets.asset_manager.assetinformation attribute)": [[14, "algokit_utils.assets.asset_manager.AssetInformation.asset_id", false]], "asset_id (algokit_utils.assets.asset_manager.bulkassetoptinoutresult attribute)": [[14, "algokit_utils.assets.asset_manager.BulkAssetOptInOutResult.asset_id", false]], "asset_id (algokit_utils.clients.dispenser_api_client.dispenserasset attribute)": [[17, "algokit_utils.clients.dispenser_api_client.DispenserAsset.asset_id", false]], "asset_id (algokit_utils.transactions.transaction_composer.assetconfigparams attribute)": [[35, "algokit_utils.transactions.transaction_composer.AssetConfigParams.asset_id", false]], "asset_id (algokit_utils.transactions.transaction_composer.assetdestroyparams attribute)": [[35, "algokit_utils.transactions.transaction_composer.AssetDestroyParams.asset_id", false]], "asset_id (algokit_utils.transactions.transaction_composer.assetfreezeparams attribute)": [[35, "algokit_utils.transactions.transaction_composer.AssetFreezeParams.asset_id", false]], "asset_id (algokit_utils.transactions.transaction_composer.assetoptinparams attribute)": [[35, "algokit_utils.transactions.transaction_composer.AssetOptInParams.asset_id", false]], "asset_id (algokit_utils.transactions.transaction_composer.assetoptoutparams attribute)": [[35, "algokit_utils.transactions.transaction_composer.AssetOptOutParams.asset_id", false]], "asset_id (algokit_utils.transactions.transaction_composer.assettransferparams attribute)": [[35, "algokit_utils.transactions.transaction_composer.AssetTransferParams.asset_id", false]], "asset_id (algokit_utils.transactions.transaction_sender.sendsingleassetcreatetransactionresult attribute)": [[37, "algokit_utils.transactions.transaction_sender.SendSingleAssetCreateTransactionResult.asset_id", false]], "asset_name (algokit_utils.assets.asset_manager.assetinformation attribute)": [[14, "algokit_utils.assets.asset_manager.AssetInformation.asset_name", false]], "asset_name (algokit_utils.transactions.transaction_composer.assetcreateparams attribute)": [[35, "algokit_utils.transactions.transaction_composer.AssetCreateParams.asset_name", false]], "asset_name_b64 (algokit_utils.assets.asset_manager.assetinformation attribute)": [[14, "algokit_utils.assets.asset_manager.AssetInformation.asset_name_b64", false]], "asset_opt_in (algokit_utils.transactions.transaction_creator.algorandclienttransactioncreator property)": [[36, "algokit_utils.transactions.transaction_creator.AlgorandClientTransactionCreator.asset_opt_in", false]], "asset_opt_in() (algokit_utils.transactions.transaction_sender.algorandclienttransactionsender method)": [[37, "algokit_utils.transactions.transaction_sender.AlgorandClientTransactionSender.asset_opt_in", false]], "asset_opt_out (algokit_utils.transactions.transaction_creator.algorandclienttransactioncreator property)": [[36, "algokit_utils.transactions.transaction_creator.AlgorandClientTransactionCreator.asset_opt_out", false]], "asset_opt_out() (algokit_utils.transactions.transaction_sender.algorandclienttransactionsender method)": [[37, "algokit_utils.transactions.transaction_sender.AlgorandClientTransactionSender.asset_opt_out", false]], "asset_references (algokit_utils.applications.app_client.commonappcallparams attribute)": [[5, "algokit_utils.applications.app_client.CommonAppCallParams.asset_references", false]], "asset_references (algokit_utils.transactions.transaction_composer.appcallparams attribute)": [[35, "algokit_utils.transactions.transaction_composer.AppCallParams.asset_references", false]], "asset_references (algokit_utils.transactions.transaction_composer.appcreateparams attribute)": [[35, "algokit_utils.transactions.transaction_composer.AppCreateParams.asset_references", false]], "asset_references (algokit_utils.transactions.transaction_composer.appdeleteparams attribute)": [[35, "algokit_utils.transactions.transaction_composer.AppDeleteParams.asset_references", false]], "asset_references (algokit_utils.transactions.transaction_composer.appupdateparams attribute)": [[35, "algokit_utils.transactions.transaction_composer.AppUpdateParams.asset_references", false]], "asset_transfer (algokit_utils.models.transaction.transactionwrapper property)": [[30, "algokit_utils.models.transaction.TransactionWrapper.asset_transfer", false]], "asset_transfer (algokit_utils.transactions.transaction_creator.algorandclienttransactioncreator property)": [[36, "algokit_utils.transactions.transaction_creator.AlgorandClientTransactionCreator.asset_transfer", false]], "asset_transfer() (algokit_utils.transactions.transaction_sender.algorandclienttransactionsender method)": [[37, "algokit_utils.transactions.transaction_sender.AlgorandClientTransactionSender.asset_transfer", false]], "assetconfigparams (class in algokit_utils.transactions.transaction_composer)": [[35, "algokit_utils.transactions.transaction_composer.AssetConfigParams", false]], "assetcreateparams (class in algokit_utils.transactions.transaction_composer)": [[35, "algokit_utils.transactions.transaction_composer.AssetCreateParams", false]], "assetdestroyparams (class in algokit_utils.transactions.transaction_composer)": [[35, "algokit_utils.transactions.transaction_composer.AssetDestroyParams", false]], "assetfreezeparams (class in algokit_utils.transactions.transaction_composer)": [[35, "algokit_utils.transactions.transaction_composer.AssetFreezeParams", false]], "assetinformation (class in algokit_utils.assets.asset_manager)": [[14, "algokit_utils.assets.asset_manager.AssetInformation", false]], "assetmanager (class in algokit_utils.assets.asset_manager)": [[14, "algokit_utils.assets.asset_manager.AssetManager", false]], "assetoptinparams (class in algokit_utils.transactions.transaction_composer)": [[35, "algokit_utils.transactions.transaction_composer.AssetOptInParams", false]], "assetoptoutparams (class in algokit_utils.transactions.transaction_composer)": [[35, "algokit_utils.transactions.transaction_composer.AssetOptOutParams", false]], "assets (algokit_utils.accounts.account_manager.accountinformation attribute)": [[0, "algokit_utils.accounts.account_manager.AccountInformation.assets", false]], "assets (algokit_utils.applications.app_spec.arc56.recommendations attribute)": [[10, "algokit_utils.applications.app_spec.arc56.Recommendations.assets", false]], "assettransferparams (class in algokit_utils.transactions.transaction_composer)": [[35, "algokit_utils.transactions.transaction_composer.AssetTransferParams", false]], "atc (algokit_utils.transactions.transaction_composer.transactioncomposerbuildresult attribute)": [[35, "algokit_utils.transactions.transaction_composer.TransactionComposerBuildResult.atc", false]], "auth_addr (algokit_utils.accounts.account_manager.accountinformation attribute)": [[0, "algokit_utils.accounts.account_manager.AccountInformation.auth_addr", false]], "auth_token (algokit_utils.clients.dispenser_api_client.testnetdispenserapiclient attribute)": [[17, "algokit_utils.clients.dispenser_api_client.TestNetDispenserApiClient.auth_token", false]], "balance (algokit_utils.assets.asset_manager.accountassetinformation attribute)": [[14, "algokit_utils.assets.asset_manager.AccountAssetInformation.balance", false]], "bare_actions (algokit_utils.applications.app_spec.arc56.arc56contract attribute)": [[10, "algokit_utils.applications.app_spec.arc56.Arc56Contract.bare_actions", false]], "bare_call_config (algokit_utils.applications.app_spec.arc32.arc32contract attribute)": [[9, "algokit_utils.applications.app_spec.arc32.Arc32Contract.bare_call_config", false]], "bareactions (class in algokit_utils.applications.app_spec.arc56)": [[10, "algokit_utils.applications.app_spec.arc56.BareActions", false]], "base_url (algokit_utils.clients.dispenser_api_client.dispenserapiconfig attribute)": [[17, "algokit_utils.clients.dispenser_api_client.DispenserApiConfig.BASE_URL", false]], "baseappclientmethodcallparams (class in algokit_utils.applications.app_client)": [[5, "algokit_utils.applications.app_client.BaseAppClientMethodCallParams", false]], "basearc2note (class in algokit_utils.models.transaction)": [[30, "algokit_utils.models.transaction.BaseArc2Note", false]], "box (algokit_utils.applications.app_spec.arc56.keys attribute)": [[10, "algokit_utils.applications.app_spec.arc56.Keys.box", false]], "box (algokit_utils.applications.app_spec.arc56.maps attribute)": [[10, "algokit_utils.applications.app_spec.arc56.Maps.box", false]], "box_references (algokit_utils.applications.app_client.commonappcallparams attribute)": [[5, "algokit_utils.applications.app_client.CommonAppCallParams.box_references", false]], "box_references (algokit_utils.transactions.transaction_composer.appcallparams attribute)": [[35, "algokit_utils.transactions.transaction_composer.AppCallParams.box_references", false]], "box_references (algokit_utils.transactions.transaction_composer.appcreateparams attribute)": [[35, "algokit_utils.transactions.transaction_composer.AppCreateParams.box_references", false]], "box_references (algokit_utils.transactions.transaction_composer.appdeleteparams attribute)": [[35, "algokit_utils.transactions.transaction_composer.AppDeleteParams.box_references", false]], "box_references (algokit_utils.transactions.transaction_composer.appupdateparams attribute)": [[35, "algokit_utils.transactions.transaction_composer.AppUpdateParams.box_references", false]], "boxabivalue (class in algokit_utils.applications.abi)": [[4, "algokit_utils.applications.abi.BoxABIValue", false]], "boxes (algokit_utils.applications.app_spec.arc56.recommendations attribute)": [[10, "algokit_utils.applications.app_spec.arc56.Recommendations.boxes", false]], "boxes (class in algokit_utils.applications.app_spec.arc56)": [[10, "algokit_utils.applications.app_spec.arc56.Boxes", false]], "boxidentifier (in module algokit_utils.models.state)": [[29, "algokit_utils.models.state.BoxIdentifier", false]], "boxname (class in algokit_utils.models.state)": [[29, "algokit_utils.models.state.BoxName", false]], "boxreference (class in algokit_utils.models.state)": [[29, "algokit_utils.models.state.BoxReference", false]], "boxvalue (class in algokit_utils.models.state)": [[29, "algokit_utils.models.state.BoxValue", false]], "build() (algokit_utils.transactions.transaction_composer.transactioncomposer method)": [[35, "algokit_utils.transactions.transaction_composer.TransactionComposer.build", false]], "build_transactions() (algokit_utils.transactions.transaction_composer.transactioncomposer method)": [[35, "algokit_utils.transactions.transaction_composer.TransactionComposer.build_transactions", false]], "builttransactions (class in algokit_utils.transactions.transaction_composer)": [[35, "algokit_utils.transactions.transaction_composer.BuiltTransactions", false]], "bulk_opt_in() (algokit_utils.assets.asset_manager.assetmanager method)": [[14, "algokit_utils.assets.asset_manager.AssetManager.bulk_opt_in", false]], "bulk_opt_out() (algokit_utils.assets.asset_manager.assetmanager method)": [[14, "algokit_utils.assets.asset_manager.AssetManager.bulk_opt_out", false]], "bulkassetoptinoutresult (class in algokit_utils.assets.asset_manager)": [[14, "algokit_utils.assets.asset_manager.BulkAssetOptInOutResult", false]], "byte_code (algokit_utils.applications.app_spec.arc56.arc56contract attribute)": [[10, "algokit_utils.applications.app_spec.arc56.Arc56Contract.byte_code", false]], "bytecode (class in algokit_utils.applications.app_spec.arc56)": [[10, "algokit_utils.applications.app_spec.arc56.ByteCode", false]], "bytes (algokit_utils.applications.app_spec.arc56.global attribute)": [[10, "algokit_utils.applications.app_spec.arc56.Global.bytes", false]], "bytes (algokit_utils.applications.app_spec.arc56.local attribute)": [[10, "algokit_utils.applications.app_spec.arc56.Local.bytes", false]], "bytes (algokit_utils.models.state.datatypeflag attribute)": [[29, "algokit_utils.models.state.DataTypeFlag.BYTES", false]], "calculate_extra_program_pages() (in module algokit_utils.transactions.transaction_composer)": [[35, "algokit_utils.transactions.transaction_composer.calculate_extra_program_pages", false]], "call (algokit_utils.applications.app_spec.arc32.callconfig attribute)": [[9, "algokit_utils.applications.app_spec.arc32.CallConfig.CALL", false]], "call (algokit_utils.applications.app_spec.arc56.actions attribute)": [[10, "algokit_utils.applications.app_spec.arc56.Actions.call", false]], "call (algokit_utils.applications.app_spec.arc56.bareactions attribute)": [[10, "algokit_utils.applications.app_spec.arc56.BareActions.call", false]], "call_config (algokit_utils.applications.app_spec.arc32.methodhints attribute)": [[9, "algokit_utils.applications.app_spec.arc32.MethodHints.call_config", false]], "callconfig (class in algokit_utils.applications.app_spec.arc32)": [[9, "algokit_utils.applications.app_spec.arc32.CallConfig", false]], "callenum (class in algokit_utils.applications.app_spec.arc56)": [[10, "algokit_utils.applications.app_spec.arc56.CallEnum", false]], "cblocks (algokit_utils.applications.app_spec.arc56.pcoffsetmethod attribute)": [[10, "algokit_utils.applications.app_spec.arc56.PcOffsetMethod.CBLOCKS", false]], "clawback (algokit_utils.assets.asset_manager.assetinformation attribute)": [[14, "algokit_utils.assets.asset_manager.AssetInformation.clawback", false]], "clawback (algokit_utils.transactions.transaction_composer.assetconfigparams attribute)": [[35, "algokit_utils.transactions.transaction_composer.AssetConfigParams.clawback", false]], "clawback (algokit_utils.transactions.transaction_composer.assetcreateparams attribute)": [[35, "algokit_utils.transactions.transaction_composer.AssetCreateParams.clawback", false]], "clawback_target (algokit_utils.transactions.transaction_composer.assettransferparams attribute)": [[35, "algokit_utils.transactions.transaction_composer.AssetTransferParams.clawback_target", false]], "clear (algokit_utils.applications.app_spec.arc56.bytecode attribute)": [[10, "algokit_utils.applications.app_spec.arc56.ByteCode.clear", false]], "clear (algokit_utils.applications.app_spec.arc56.source attribute)": [[10, "algokit_utils.applications.app_spec.arc56.Source.clear", false]], "clear (algokit_utils.applications.app_spec.arc56.sourceinfomodel attribute)": [[10, "algokit_utils.applications.app_spec.arc56.SourceInfoModel.clear", false]], "clear_program (algokit_utils.applications.app_spec.arc32.arc32contract attribute)": [[9, "algokit_utils.applications.app_spec.arc32.Arc32Contract.clear_program", false]], "clear_source_map (algokit_utils.applications.app_client.appclientparams attribute)": [[5, "algokit_utils.applications.app_client.AppClientParams.clear_source_map", false]], "clear_source_map (algokit_utils.models.application.appsourcemaps attribute)": [[25, "algokit_utils.models.application.AppSourceMaps.clear_source_map", false]], "clear_state (algokit_utils.applications.app_spec.arc56.callenum attribute)": [[10, "algokit_utils.applications.app_spec.arc56.CallEnum.CLEAR_STATE", false]], "clear_state_program (algokit_utils.applications.app_client.appclientcompilationresult attribute)": [[5, "algokit_utils.applications.app_client.AppClientCompilationResult.clear_state_program", false]], "clear_state_program (algokit_utils.models.application.appinformation attribute)": [[25, "algokit_utils.models.application.AppInformation.clear_state_program", false]], "clear_state_program (algokit_utils.transactions.transaction_composer.appcallparams attribute)": [[35, "algokit_utils.transactions.transaction_composer.AppCallParams.clear_state_program", false]], "clear_state_program (algokit_utils.transactions.transaction_composer.appcreatemethodcallparams attribute)": [[35, "algokit_utils.transactions.transaction_composer.AppCreateMethodCallParams.clear_state_program", false]], "clear_state_program (algokit_utils.transactions.transaction_composer.appcreateparams attribute)": [[35, "algokit_utils.transactions.transaction_composer.AppCreateParams.clear_state_program", false]], "clear_state_program (algokit_utils.transactions.transaction_composer.appupdatemethodcallparams attribute)": [[35, "algokit_utils.transactions.transaction_composer.AppUpdateMethodCallParams.clear_state_program", false]], "clear_state_program (algokit_utils.transactions.transaction_composer.appupdateparams attribute)": [[35, "algokit_utils.transactions.transaction_composer.AppUpdateParams.clear_state_program", false]], "client (algokit_utils.algorand.algorandclient property)": [[3, "algokit_utils.algorand.AlgorandClient.client", false]], "clientmanager (class in algokit_utils.clients.client_manager)": [[16, "algokit_utils.clients.client_manager.ClientManager", false]], "clone() (algokit_utils.applications.app_client.appclient method)": [[5, "algokit_utils.applications.app_client.AppClient.clone", false]], "close_asset_to (algokit_utils.transactions.transaction_composer.assettransferparams attribute)": [[35, "algokit_utils.transactions.transaction_composer.AssetTransferParams.close_asset_to", false]], "close_out (algokit_utils.applications.app_spec.arc56.callenum attribute)": [[10, "algokit_utils.applications.app_spec.arc56.CallEnum.CLOSE_OUT", false]], "close_remainder_to (algokit_utils.applications.app_client.fundappaccountparams attribute)": [[5, "algokit_utils.applications.app_client.FundAppAccountParams.close_remainder_to", false]], "close_remainder_to (algokit_utils.transactions.transaction_composer.paymentparams attribute)": [[35, "algokit_utils.transactions.transaction_composer.PaymentParams.close_remainder_to", false]], "closed_at_round (algokit_utils.accounts.account_manager.accountinformation attribute)": [[0, "algokit_utils.accounts.account_manager.AccountInformation.closed_at_round", false]], "commit_hash (algokit_utils.applications.app_spec.arc56.compilerversion attribute)": [[10, "algokit_utils.applications.app_spec.arc56.CompilerVersion.commit_hash", false]], "commonappcallcreateparams (class in algokit_utils.applications.app_client)": [[5, "algokit_utils.applications.app_client.CommonAppCallCreateParams", false]], "commonappcallparams (class in algokit_utils.applications.app_client)": [[5, "algokit_utils.applications.app_client.CommonAppCallParams", false]], "compilation_params (algokit_utils.applications.app_factory.appfactoryparams attribute)": [[7, "algokit_utils.applications.app_factory.AppFactoryParams.compilation_params", false]], "compile() (algokit_utils.applications.app_client.appclient static method)": [[5, "algokit_utils.applications.app_client.AppClient.compile", false]], "compile() (algokit_utils.applications.app_factory.appfactory method)": [[7, "algokit_utils.applications.app_factory.AppFactory.compile", false]], "compile_app() (algokit_utils.applications.app_client.appclient method)": [[5, "algokit_utils.applications.app_client.AppClient.compile_app", false]], "compile_teal() (algokit_utils.applications.app_manager.appmanager method)": [[8, "algokit_utils.applications.app_manager.AppManager.compile_teal", false]], "compile_teal_template() (algokit_utils.applications.app_manager.appmanager method)": [[8, "algokit_utils.applications.app_manager.AppManager.compile_teal_template", false]], "compiled (algokit_utils.models.application.compiledteal attribute)": [[25, "algokit_utils.models.application.CompiledTeal.compiled", false]], "compiled_approval (algokit_utils.applications.app_client.appclientcompilationresult attribute)": [[5, "algokit_utils.applications.app_client.AppClientCompilationResult.compiled_approval", false]], "compiled_approval (algokit_utils.applications.app_factory.appfactorycreatemethodcallresult attribute)": [[7, "algokit_utils.applications.app_factory.AppFactoryCreateMethodCallResult.compiled_approval", false]], "compiled_approval (algokit_utils.models.application.appcompilationresult attribute)": [[25, "algokit_utils.models.application.AppCompilationResult.compiled_approval", false]], "compiled_approval (algokit_utils.transactions.transaction_sender.sendappupdatetransactionresult attribute)": [[37, "algokit_utils.transactions.transaction_sender.SendAppUpdateTransactionResult.compiled_approval", false]], "compiled_base64_to_bytes (algokit_utils.models.application.compiledteal attribute)": [[25, "algokit_utils.models.application.CompiledTeal.compiled_base64_to_bytes", false]], "compiled_clear (algokit_utils.applications.app_client.appclientcompilationresult attribute)": [[5, "algokit_utils.applications.app_client.AppClientCompilationResult.compiled_clear", false]], "compiled_clear (algokit_utils.applications.app_factory.appfactorycreatemethodcallresult attribute)": [[7, "algokit_utils.applications.app_factory.AppFactoryCreateMethodCallResult.compiled_clear", false]], "compiled_clear (algokit_utils.models.application.appcompilationresult attribute)": [[25, "algokit_utils.models.application.AppCompilationResult.compiled_clear", false]], "compiled_clear (algokit_utils.transactions.transaction_sender.sendappupdatetransactionresult attribute)": [[37, "algokit_utils.transactions.transaction_sender.SendAppUpdateTransactionResult.compiled_clear", false]], "compiled_hash (algokit_utils.models.application.compiledteal attribute)": [[25, "algokit_utils.models.application.CompiledTeal.compiled_hash", false]], "compiledteal (class in algokit_utils.models.application)": [[25, "algokit_utils.models.application.CompiledTeal", false]], "compiler (algokit_utils.applications.app_spec.arc56.compilerinfo attribute)": [[10, "algokit_utils.applications.app_spec.arc56.CompilerInfo.compiler", false]], "compiler (class in algokit_utils.applications.app_spec.arc56)": [[10, "algokit_utils.applications.app_spec.arc56.Compiler", false]], "compiler_info (algokit_utils.applications.app_spec.arc56.arc56contract attribute)": [[10, "algokit_utils.applications.app_spec.arc56.Arc56Contract.compiler_info", false]], "compiler_version (algokit_utils.applications.app_spec.arc56.compilerinfo attribute)": [[10, "algokit_utils.applications.app_spec.arc56.CompilerInfo.compiler_version", false]], "compilerinfo (class in algokit_utils.applications.app_spec.arc56)": [[10, "algokit_utils.applications.app_spec.arc56.CompilerInfo", false]], "compilerversion (class in algokit_utils.applications.app_spec.arc56)": [[10, "algokit_utils.applications.app_spec.arc56.CompilerVersion", false]], "config (in module algokit_utils.config)": [[19, "algokit_utils.config.config", false]], "configure() (algokit_utils.config.updatableconfig method)": [[19, "algokit_utils.config.UpdatableConfig.configure", false]], "confirmation (algokit_utils.transactions.transaction_sender.sendsingletransactionresult attribute)": [[37, "algokit_utils.transactions.transaction_sender.SendSingleTransactionResult.confirmation", false]], "confirmations (algokit_utils.transactions.transaction_composer.sendatomictransactioncomposerresults attribute)": [[35, "algokit_utils.transactions.transaction_composer.SendAtomicTransactionComposerResults.confirmations", false]], "confirmations (algokit_utils.transactions.transaction_sender.sendsingletransactionresult attribute)": [[37, "algokit_utils.transactions.transaction_sender.SendSingleTransactionResult.confirmations", false]], "contract (algokit_utils.applications.app_spec.arc32.arc32contract attribute)": [[9, "algokit_utils.applications.app_spec.arc32.Arc32Contract.contract", false]], "count() (algokit_utils.transactions.transaction_composer.transactioncomposer method)": [[35, "algokit_utils.transactions.transaction_composer.TransactionComposer.count", false]], "cover_app_call_inner_transaction_fees (algokit_utils.models.transaction.sendparams attribute)": [[30, "algokit_utils.models.transaction.SendParams.cover_app_call_inner_transaction_fees", false]], "create (algokit_utils.applications.app_spec.arc32.callconfig attribute)": [[9, "algokit_utils.applications.app_spec.arc32.CallConfig.CREATE", false]], "create (algokit_utils.applications.app_spec.arc56.actions attribute)": [[10, "algokit_utils.applications.app_spec.arc56.Actions.create", false]], "create (algokit_utils.applications.app_spec.arc56.bareactions attribute)": [[10, "algokit_utils.applications.app_spec.arc56.BareActions.create", false]], "create (algokit_utils.applications.enums.operationperformed attribute)": [[12, "algokit_utils.applications.enums.OperationPerformed.Create", false]], "create_params (algokit_utils.applications.app_deployer.appdeployparams attribute)": [[6, "algokit_utils.applications.app_deployer.AppDeployParams.create_params", false]], "create_result (algokit_utils.applications.app_deployer.appdeployresult attribute)": [[6, "algokit_utils.applications.app_deployer.AppDeployResult.create_result", false]], "create_result (algokit_utils.applications.app_factory.appfactorydeployresult attribute)": [[7, "algokit_utils.applications.app_factory.AppFactoryDeployResult.create_result", false]], "create_transaction (algokit_utils.algorand.algorandclient property)": [[3, "algokit_utils.algorand.AlgorandClient.create_transaction", false]], "create_transaction (algokit_utils.applications.app_client.appclient property)": [[5, "algokit_utils.applications.app_client.AppClient.create_transaction", false]], "create_transaction (algokit_utils.applications.app_factory.appfactory property)": [[7, "algokit_utils.applications.app_factory.AppFactory.create_transaction", false]], "created_apps (algokit_utils.accounts.account_manager.accountinformation attribute)": [[0, "algokit_utils.accounts.account_manager.AccountInformation.created_apps", false]], "created_assets (algokit_utils.accounts.account_manager.accountinformation attribute)": [[0, "algokit_utils.accounts.account_manager.AccountInformation.created_assets", false]], "created_at_round (algokit_utils.accounts.account_manager.accountinformation attribute)": [[0, "algokit_utils.accounts.account_manager.AccountInformation.created_at_round", false]], "created_round (algokit_utils.applications.app_deployer.applicationmetadata attribute)": [[6, "algokit_utils.applications.app_deployer.ApplicationMetaData.created_round", false]], "createenum (class in algokit_utils.applications.app_spec.arc56)": [[10, "algokit_utils.applications.app_spec.arc56.CreateEnum", false]], "createoncomplete (in module algokit_utils.applications.app_client)": [[5, "algokit_utils.applications.app_client.CreateOnComplete", false]], "creator (algokit_utils.applications.app_deployer.applicationlookup attribute)": [[6, "algokit_utils.applications.app_deployer.ApplicationLookup.creator", false]], "creator (algokit_utils.assets.asset_manager.assetinformation attribute)": [[14, "algokit_utils.assets.asset_manager.AssetInformation.creator", false]], "creator (algokit_utils.models.application.appinformation attribute)": [[25, "algokit_utils.models.application.AppInformation.creator", false]], "creator (algokit_utils.transactions.transaction_composer.assetoptoutparams attribute)": [[35, "algokit_utils.transactions.transaction_composer.AssetOptOutParams.creator", false]], "dapp_name (algokit_utils.models.transaction.basearc2note attribute)": [[30, "algokit_utils.models.transaction.BaseArc2Note.dapp_name", false]], "data (algokit_utils.applications.app_spec.arc32.defaultargumentdict attribute)": [[9, "algokit_utils.applications.app_spec.arc32.DefaultArgumentDict.data", false]], "data (algokit_utils.applications.app_spec.arc56.defaultvalue attribute)": [[10, "algokit_utils.applications.app_spec.arc56.DefaultValue.data", false]], "data (algokit_utils.models.transaction.jsonformatarc2note attribute)": [[30, "algokit_utils.models.transaction.JsonFormatArc2Note.data", false]], "data (algokit_utils.models.transaction.stringformatarc2note attribute)": [[30, "algokit_utils.models.transaction.StringFormatArc2Note.data", false]], "datatypeflag (class in algokit_utils.models.state)": [[29, "algokit_utils.models.state.DataTypeFlag", false]], "debug (algokit_utils.config.updatableconfig property)": [[19, "algokit_utils.config.UpdatableConfig.debug", false]], "decimals (algokit_utils.assets.asset_manager.assetinformation attribute)": [[14, "algokit_utils.assets.asset_manager.AssetInformation.decimals", false]], "decimals (algokit_utils.clients.dispenser_api_client.dispenserasset attribute)": [[17, "algokit_utils.clients.dispenser_api_client.DispenserAsset.decimals", false]], "decimals (algokit_utils.transactions.transaction_composer.assetcreateparams attribute)": [[35, "algokit_utils.transactions.transaction_composer.AssetCreateParams.decimals", false]], "decode_app_state() (algokit_utils.applications.app_manager.appmanager static method)": [[8, "algokit_utils.applications.app_manager.AppManager.decode_app_state", false]], "decode_error (algokit_utils.applications.abi.abireturn attribute)": [[4, "algokit_utils.applications.abi.ABIReturn.decode_error", false]], "default_arguments (algokit_utils.applications.app_spec.arc32.methodhints attribute)": [[9, "algokit_utils.applications.app_spec.arc32.MethodHints.default_arguments", false]], "default_frozen (algokit_utils.assets.asset_manager.assetinformation attribute)": [[14, "algokit_utils.assets.asset_manager.AssetInformation.default_frozen", false]], "default_frozen (algokit_utils.transactions.transaction_composer.assetcreateparams attribute)": [[35, "algokit_utils.transactions.transaction_composer.AssetCreateParams.default_frozen", false]], "default_localnet() (algokit_utils.algorand.algorandclient static method)": [[3, "algokit_utils.algorand.AlgorandClient.default_localnet", false]], "default_sender (algokit_utils.applications.app_client.appclientparams attribute)": [[5, "algokit_utils.applications.app_client.AppClientParams.default_sender", false]], "default_sender (algokit_utils.applications.app_factory.appfactoryparams attribute)": [[7, "algokit_utils.applications.app_factory.AppFactoryParams.default_sender", false]], "default_signer (algokit_utils.applications.app_client.appclientparams attribute)": [[5, "algokit_utils.applications.app_client.AppClientParams.default_signer", false]], "default_signer (algokit_utils.applications.app_factory.appfactoryparams attribute)": [[7, "algokit_utils.applications.app_factory.AppFactoryParams.default_signer", false]], "default_value (algokit_utils.applications.app_spec.arc56.methodarg attribute)": [[10, "algokit_utils.applications.app_spec.arc56.MethodArg.default_value", false]], "defaultargumentdict (class in algokit_utils.applications.app_spec.arc32)": [[9, "algokit_utils.applications.app_spec.arc32.DefaultArgumentDict", false]], "defaultargumenttype (in module algokit_utils.applications.app_spec.arc32)": [[9, "algokit_utils.applications.app_spec.arc32.DefaultArgumentType", false]], "defaultvalue (class in algokit_utils.applications.app_spec.arc56)": [[10, "algokit_utils.applications.app_spec.arc56.DefaultValue", false]], "deletable (algokit_utils.applications.app_client.appclientcompilationparams attribute)": [[5, "algokit_utils.applications.app_client.AppClientCompilationParams.deletable", false]], "deletable (algokit_utils.applications.app_deployer.appdeploymentmetadata attribute)": [[6, "algokit_utils.applications.app_deployer.AppDeploymentMetaData.deletable", false]], "deletable (algokit_utils.applications.app_deployer.applicationmetadata property)": [[6, "algokit_utils.applications.app_deployer.ApplicationMetaData.deletable", false]], "deletable_template_name (in module algokit_utils.applications.app_manager)": [[8, "algokit_utils.applications.app_manager.DELETABLE_TEMPLATE_NAME", false]], "delete_application (algokit_utils.applications.app_spec.arc56.callenum attribute)": [[10, "algokit_utils.applications.app_spec.arc56.CallEnum.DELETE_APPLICATION", false]], "delete_application (algokit_utils.applications.app_spec.arc56.createenum attribute)": [[10, "algokit_utils.applications.app_spec.arc56.CreateEnum.DELETE_APPLICATION", false]], "delete_params (algokit_utils.applications.app_deployer.appdeployparams attribute)": [[6, "algokit_utils.applications.app_deployer.AppDeployParams.delete_params", false]], "delete_result (algokit_utils.applications.app_deployer.appdeployresult attribute)": [[6, "algokit_utils.applications.app_deployer.AppDeployResult.delete_result", false]], "delete_result (algokit_utils.applications.app_factory.appfactorydeployresult attribute)": [[7, "algokit_utils.applications.app_factory.AppFactoryDeployResult.delete_result", false]], "deleted (algokit_utils.accounts.account_manager.accountinformation attribute)": [[0, "algokit_utils.accounts.account_manager.AccountInformation.deleted", false]], "deleted (algokit_utils.applications.app_deployer.applicationmetadata attribute)": [[6, "algokit_utils.applications.app_deployer.ApplicationMetaData.deleted", false]], "deploy() (algokit_utils.applications.app_deployer.appdeployer method)": [[6, "algokit_utils.applications.app_deployer.AppDeployer.deploy", false]], "deploy() (algokit_utils.applications.app_factory.appfactory method)": [[7, "algokit_utils.applications.app_factory.AppFactory.deploy", false]], "deploy() (algokit_utils.protocols.typed_clients.typedappfactoryprotocol method)": [[33, "algokit_utils.protocols.typed_clients.TypedAppFactoryProtocol.deploy", false]], "deploy_metadata (algokit_utils.applications.app_deployer.applicationmetadata attribute)": [[6, "algokit_utils.applications.app_deployer.ApplicationMetaData.deploy_metadata", false]], "deploy_time_params (algokit_utils.applications.app_client.appclientcompilationparams attribute)": [[5, "algokit_utils.applications.app_client.AppClientCompilationParams.deploy_time_params", false]], "deploy_time_params (algokit_utils.applications.app_deployer.appdeployparams attribute)": [[6, "algokit_utils.applications.app_deployer.AppDeployParams.deploy_time_params", false]], "desc (algokit_utils.applications.app_spec.arc56.arc56contract attribute)": [[10, "algokit_utils.applications.app_spec.arc56.Arc56Contract.desc", false]], "desc (algokit_utils.applications.app_spec.arc56.event attribute)": [[10, "algokit_utils.applications.app_spec.arc56.Event.desc", false]], "desc (algokit_utils.applications.app_spec.arc56.eventarg attribute)": [[10, "algokit_utils.applications.app_spec.arc56.EventArg.desc", false]], "desc (algokit_utils.applications.app_spec.arc56.method attribute)": [[10, "algokit_utils.applications.app_spec.arc56.Method.desc", false]], "desc (algokit_utils.applications.app_spec.arc56.methodarg attribute)": [[10, "algokit_utils.applications.app_spec.arc56.MethodArg.desc", false]], "desc (algokit_utils.applications.app_spec.arc56.returns attribute)": [[10, "algokit_utils.applications.app_spec.arc56.Returns.desc", false]], "desc (algokit_utils.applications.app_spec.arc56.storagekey attribute)": [[10, "algokit_utils.applications.app_spec.arc56.StorageKey.desc", false]], "desc (algokit_utils.applications.app_spec.arc56.storagemap attribute)": [[10, "algokit_utils.applications.app_spec.arc56.StorageMap.desc", false]], "description (algokit_utils.clients.dispenser_api_client.dispenserasset attribute)": [[17, "algokit_utils.clients.dispenser_api_client.DispenserAsset.description", false]], "dictify() (algokit_utils.applications.app_deployer.appdeploymentmetadata method)": [[6, "algokit_utils.applications.app_deployer.AppDeploymentMetaData.dictify", false]], "dictify() (algokit_utils.applications.app_spec.arc32.arc32contract method)": [[9, "algokit_utils.applications.app_spec.arc32.Arc32Contract.dictify", false]], "dictify() (algokit_utils.applications.app_spec.arc32.methodhints method)": [[9, "algokit_utils.applications.app_spec.arc32.MethodHints.dictify", false]], "dictify() (algokit_utils.applications.app_spec.arc56.arc56contract method)": [[10, "algokit_utils.applications.app_spec.arc56.Arc56Contract.dictify", false]], "dispenser_access_token_key (in module algokit_utils.clients.dispenser_api_client)": [[17, "algokit_utils.clients.dispenser_api_client.DISPENSER_ACCESS_TOKEN_KEY", false]], "dispenser_account_name (in module algokit_utils.models.account)": [[23, "algokit_utils.models.account.DISPENSER_ACCOUNT_NAME", false]], "dispenser_assets (in module algokit_utils.clients.dispenser_api_client)": [[17, "algokit_utils.clients.dispenser_api_client.DISPENSER_ASSETS", false]], "dispenser_from_environment() (algokit_utils.accounts.account_manager.accountmanager method)": [[0, "algokit_utils.accounts.account_manager.AccountManager.dispenser_from_environment", false]], "dispenser_request_timeout (in module algokit_utils.clients.dispenser_api_client)": [[17, "algokit_utils.clients.dispenser_api_client.DISPENSER_REQUEST_TIMEOUT", false]], "dispenserapiconfig (class in algokit_utils.clients.dispenser_api_client)": [[17, "algokit_utils.clients.dispenser_api_client.DispenserApiConfig", false]], "dispenserasset (class in algokit_utils.clients.dispenser_api_client)": [[17, "algokit_utils.clients.dispenser_api_client.DispenserAsset", false]], "dispenserassetname (class in algokit_utils.clients.dispenser_api_client)": [[17, "algokit_utils.clients.dispenser_api_client.DispenserAssetName", false]], "dispenserfundresponse (class in algokit_utils.clients.dispenser_api_client)": [[17, "algokit_utils.clients.dispenser_api_client.DispenserFundResponse", false]], "dispenserlimitresponse (class in algokit_utils.clients.dispenser_api_client)": [[17, "algokit_utils.clients.dispenser_api_client.DispenserLimitResponse", false]], "elements (algokit_utils.applications.app_spec.arc32.structargdict attribute)": [[9, "algokit_utils.applications.app_spec.arc32.StructArgDict.elements", false]], "empty() (algokit_utils.applications.app_spec.arc32.methodhints method)": [[9, "algokit_utils.applications.app_spec.arc32.MethodHints.empty", false]], "ensure_funded() (algokit_utils.accounts.account_manager.accountmanager method)": [[0, "algokit_utils.accounts.account_manager.AccountManager.ensure_funded", false]], "ensure_funded_from_environment() (algokit_utils.accounts.account_manager.accountmanager method)": [[0, "algokit_utils.accounts.account_manager.AccountManager.ensure_funded_from_environment", false]], "ensure_funded_from_testnet_dispenser_api() (algokit_utils.accounts.account_manager.accountmanager method)": [[0, "algokit_utils.accounts.account_manager.AccountManager.ensure_funded_from_testnet_dispenser_api", false]], "ensurefundedfromtestnetdispenserapiresult (class in algokit_utils.accounts.account_manager)": [[0, "algokit_utils.accounts.account_manager.EnsureFundedFromTestnetDispenserApiResult", false]], "ensurefundedresult (class in algokit_utils.accounts.account_manager)": [[0, "algokit_utils.accounts.account_manager.EnsureFundedResult", false]], "error_message (algokit_utils.applications.app_spec.arc56.sourceinfo attribute)": [[10, "algokit_utils.applications.app_spec.arc56.SourceInfo.error_message", false]], "event (class in algokit_utils.applications.app_spec.arc56)": [[10, "algokit_utils.applications.app_spec.arc56.Event", false]], "eventarg (class in algokit_utils.applications.app_spec.arc56)": [[10, "algokit_utils.applications.app_spec.arc56.EventArg", false]], "events (algokit_utils.applications.app_spec.arc56.arc56contract attribute)": [[10, "algokit_utils.applications.app_spec.arc56.Arc56Contract.events", false]], "events (algokit_utils.applications.app_spec.arc56.method attribute)": [[10, "algokit_utils.applications.app_spec.arc56.Method.events", false]], "exec_trace (algokit_utils.models.simulate.simulationtrace attribute)": [[28, "algokit_utils.models.simulate.SimulationTrace.exec_trace", false]], "execute() (algokit_utils.transactions.transaction_composer.transactioncomposer method)": [[35, "algokit_utils.transactions.transaction_composer.TransactionComposer.execute", false]], "existing_deployments (algokit_utils.applications.app_deployer.appdeployparams attribute)": [[6, "algokit_utils.applications.app_deployer.AppDeployParams.existing_deployments", false]], "export() (algokit_utils.applications.app_spec.arc32.arc32contract method)": [[9, "algokit_utils.applications.app_spec.arc32.Arc32Contract.export", false]], "export_source_maps() (algokit_utils.applications.app_client.appclient method)": [[5, "algokit_utils.applications.app_client.AppClient.export_source_maps", false]], "export_source_maps() (algokit_utils.applications.app_factory.appfactory method)": [[7, "algokit_utils.applications.app_factory.AppFactory.export_source_maps", false]], "extra_fee (algokit_utils.applications.app_client.commonappcallparams attribute)": [[5, "algokit_utils.applications.app_client.CommonAppCallParams.extra_fee", false]], "extra_pages (algokit_utils.transactions.transaction_composer.appcallparams attribute)": [[35, "algokit_utils.transactions.transaction_composer.AppCallParams.extra_pages", false]], "extra_program_pages (algokit_utils.applications.app_client.appclientcreateschema attribute)": [[5, "algokit_utils.applications.app_client.AppClientCreateSchema.extra_program_pages", false]], "extra_program_pages (algokit_utils.models.application.appinformation attribute)": [[25, "algokit_utils.models.application.AppInformation.extra_program_pages", false]], "extra_program_pages (algokit_utils.transactions.transaction_composer.appcreatemethodcallparams attribute)": [[35, "algokit_utils.transactions.transaction_composer.AppCreateMethodCallParams.extra_program_pages", false]], "extra_program_pages (algokit_utils.transactions.transaction_composer.appcreateparams attribute)": [[35, "algokit_utils.transactions.transaction_composer.AppCreateParams.extra_program_pages", false]], "fail (algokit_utils.applications.enums.onschemabreak attribute)": [[12, "algokit_utils.applications.enums.OnSchemaBreak.Fail", false]], "fail (algokit_utils.applications.enums.onupdate attribute)": [[12, "algokit_utils.applications.enums.OnUpdate.Fail", false]], "failure_message (algokit_utils.models.simulate.simulationtrace attribute)": [[28, "algokit_utils.models.simulate.SimulationTrace.failure_message", false]], "first_valid_round (algokit_utils.applications.app_client.commonappcallparams attribute)": [[5, "algokit_utils.applications.app_client.CommonAppCallParams.first_valid_round", false]], "format (algokit_utils.models.transaction.jsonformatarc2note attribute)": [[30, "algokit_utils.models.transaction.JsonFormatArc2Note.format", false]], "format (algokit_utils.models.transaction.stringformatarc2note attribute)": [[30, "algokit_utils.models.transaction.StringFormatArc2Note.format", false]], "freeze (algokit_utils.assets.asset_manager.assetinformation attribute)": [[14, "algokit_utils.assets.asset_manager.AssetInformation.freeze", false]], "freeze (algokit_utils.transactions.transaction_composer.assetconfigparams attribute)": [[35, "algokit_utils.transactions.transaction_composer.AssetConfigParams.freeze", false]], "freeze (algokit_utils.transactions.transaction_composer.assetcreateparams attribute)": [[35, "algokit_utils.transactions.transaction_composer.AssetCreateParams.freeze", false]], "from_algo() (algokit_utils.models.amount.algoamount static method)": [[24, "algokit_utils.models.amount.AlgoAmount.from_algo", false]], "from_arc32() (algokit_utils.applications.app_spec.arc56.arc56contract static method)": [[10, "algokit_utils.applications.app_spec.arc56.Arc56Contract.from_arc32", false]], "from_clients() (algokit_utils.algorand.algorandclient static method)": [[3, "algokit_utils.algorand.AlgorandClient.from_clients", false]], "from_composer_result() (algokit_utils.transactions.transaction_sender.sendsingletransactionresult class method)": [[37, "algokit_utils.transactions.transaction_sender.SendSingleTransactionResult.from_composer_result", false]], "from_config() (algokit_utils.algorand.algorandclient static method)": [[3, "algokit_utils.algorand.AlgorandClient.from_config", false]], "from_creator_and_name() (algokit_utils.applications.app_client.appclient static method)": [[5, "algokit_utils.applications.app_client.AppClient.from_creator_and_name", false]], "from_creator_and_name() (algokit_utils.protocols.typed_clients.typedappclientprotocol class method)": [[33, "algokit_utils.protocols.typed_clients.TypedAppClientProtocol.from_creator_and_name", false]], "from_deploy_result() (algokit_utils.applications.app_factory.appfactorydeployresult class method)": [[7, "algokit_utils.applications.app_factory.AppFactoryDeployResult.from_deploy_result", false]], "from_dict() (algokit_utils.applications.app_spec.arc56.actions static method)": [[10, "algokit_utils.applications.app_spec.arc56.Actions.from_dict", false]], "from_dict() (algokit_utils.applications.app_spec.arc56.arc56contract static method)": [[10, "algokit_utils.applications.app_spec.arc56.Arc56Contract.from_dict", false]], "from_dict() (algokit_utils.applications.app_spec.arc56.bareactions static method)": [[10, "algokit_utils.applications.app_spec.arc56.BareActions.from_dict", false]], "from_dict() (algokit_utils.applications.app_spec.arc56.boxes static method)": [[10, "algokit_utils.applications.app_spec.arc56.Boxes.from_dict", false]], "from_dict() (algokit_utils.applications.app_spec.arc56.bytecode static method)": [[10, "algokit_utils.applications.app_spec.arc56.ByteCode.from_dict", false]], "from_dict() (algokit_utils.applications.app_spec.arc56.compilerinfo static method)": [[10, "algokit_utils.applications.app_spec.arc56.CompilerInfo.from_dict", false]], "from_dict() (algokit_utils.applications.app_spec.arc56.compilerversion static method)": [[10, "algokit_utils.applications.app_spec.arc56.CompilerVersion.from_dict", false]], "from_dict() (algokit_utils.applications.app_spec.arc56.defaultvalue static method)": [[10, "algokit_utils.applications.app_spec.arc56.DefaultValue.from_dict", false]], "from_dict() (algokit_utils.applications.app_spec.arc56.event static method)": [[10, "algokit_utils.applications.app_spec.arc56.Event.from_dict", false]], "from_dict() (algokit_utils.applications.app_spec.arc56.eventarg static method)": [[10, "algokit_utils.applications.app_spec.arc56.EventArg.from_dict", false]], "from_dict() (algokit_utils.applications.app_spec.arc56.global static method)": [[10, "algokit_utils.applications.app_spec.arc56.Global.from_dict", false]], "from_dict() (algokit_utils.applications.app_spec.arc56.keys static method)": [[10, "algokit_utils.applications.app_spec.arc56.Keys.from_dict", false]], "from_dict() (algokit_utils.applications.app_spec.arc56.local static method)": [[10, "algokit_utils.applications.app_spec.arc56.Local.from_dict", false]], "from_dict() (algokit_utils.applications.app_spec.arc56.maps static method)": [[10, "algokit_utils.applications.app_spec.arc56.Maps.from_dict", false]], "from_dict() (algokit_utils.applications.app_spec.arc56.method static method)": [[10, "algokit_utils.applications.app_spec.arc56.Method.from_dict", false]], "from_dict() (algokit_utils.applications.app_spec.arc56.methodarg static method)": [[10, "algokit_utils.applications.app_spec.arc56.MethodArg.from_dict", false]], "from_dict() (algokit_utils.applications.app_spec.arc56.network static method)": [[10, "algokit_utils.applications.app_spec.arc56.Network.from_dict", false]], "from_dict() (algokit_utils.applications.app_spec.arc56.programsourceinfo static method)": [[10, "algokit_utils.applications.app_spec.arc56.ProgramSourceInfo.from_dict", false]], "from_dict() (algokit_utils.applications.app_spec.arc56.recommendations static method)": [[10, "algokit_utils.applications.app_spec.arc56.Recommendations.from_dict", false]], "from_dict() (algokit_utils.applications.app_spec.arc56.returns static method)": [[10, "algokit_utils.applications.app_spec.arc56.Returns.from_dict", false]], "from_dict() (algokit_utils.applications.app_spec.arc56.schema static method)": [[10, "algokit_utils.applications.app_spec.arc56.Schema.from_dict", false]], "from_dict() (algokit_utils.applications.app_spec.arc56.scratchvariables static method)": [[10, "algokit_utils.applications.app_spec.arc56.ScratchVariables.from_dict", false]], "from_dict() (algokit_utils.applications.app_spec.arc56.source static method)": [[10, "algokit_utils.applications.app_spec.arc56.Source.from_dict", false]], "from_dict() (algokit_utils.applications.app_spec.arc56.sourceinfo static method)": [[10, "algokit_utils.applications.app_spec.arc56.SourceInfo.from_dict", false]], "from_dict() (algokit_utils.applications.app_spec.arc56.sourceinfomodel static method)": [[10, "algokit_utils.applications.app_spec.arc56.SourceInfoModel.from_dict", false]], "from_dict() (algokit_utils.applications.app_spec.arc56.state static method)": [[10, "algokit_utils.applications.app_spec.arc56.State.from_dict", false]], "from_dict() (algokit_utils.applications.app_spec.arc56.storagekey static method)": [[10, "algokit_utils.applications.app_spec.arc56.StorageKey.from_dict", false]], "from_dict() (algokit_utils.applications.app_spec.arc56.storagemap static method)": [[10, "algokit_utils.applications.app_spec.arc56.StorageMap.from_dict", false]], "from_dict() (algokit_utils.applications.app_spec.arc56.structfield static method)": [[10, "algokit_utils.applications.app_spec.arc56.StructField.from_dict", false]], "from_dict() (algokit_utils.applications.app_spec.arc56.templatevariables static method)": [[10, "algokit_utils.applications.app_spec.arc56.TemplateVariables.from_dict", false]], "from_environment() (algokit_utils.accounts.account_manager.accountmanager method)": [[0, "algokit_utils.accounts.account_manager.AccountManager.from_environment", false]], "from_environment() (algokit_utils.algorand.algorandclient static method)": [[3, "algokit_utils.algorand.AlgorandClient.from_environment", false]], "from_json() (algokit_utils.applications.app_spec.arc32.arc32contract static method)": [[9, "algokit_utils.applications.app_spec.arc32.Arc32Contract.from_json", false]], "from_json() (algokit_utils.applications.app_spec.arc56.arc56contract static method)": [[10, "algokit_utils.applications.app_spec.arc56.Arc56Contract.from_json", false]], "from_kmd() (algokit_utils.accounts.account_manager.accountmanager method)": [[0, "algokit_utils.accounts.account_manager.AccountManager.from_kmd", false]], "from_micro_algo() (algokit_utils.models.amount.algoamount static method)": [[24, "algokit_utils.models.amount.AlgoAmount.from_micro_algo", false]], "from_mnemonic() (algokit_utils.accounts.account_manager.accountmanager method)": [[0, "algokit_utils.accounts.account_manager.AccountManager.from_mnemonic", false]], "from_network() (algokit_utils.applications.app_client.appclient static method)": [[5, "algokit_utils.applications.app_client.AppClient.from_network", false]], "from_network() (algokit_utils.protocols.typed_clients.typedappclientprotocol class method)": [[33, "algokit_utils.protocols.typed_clients.TypedAppClientProtocol.from_network", false]], "frozen (algokit_utils.assets.asset_manager.accountassetinformation attribute)": [[14, "algokit_utils.assets.asset_manager.AccountAssetInformation.frozen", false]], "frozen (algokit_utils.transactions.transaction_composer.assetfreezeparams attribute)": [[35, "algokit_utils.transactions.transaction_composer.AssetFreezeParams.frozen", false]], "full_url() (algokit_utils.models.network.algoclientnetworkconfig method)": [[27, "algokit_utils.models.network.AlgoClientNetworkConfig.full_url", false]], "fund() (algokit_utils.clients.dispenser_api_client.testnetdispenserapiclient method)": [[17, "algokit_utils.clients.dispenser_api_client.TestNetDispenserApiClient.fund", false]], "fund_app_account() (algokit_utils.applications.app_client.appclient method)": [[5, "algokit_utils.applications.app_client.AppClient.fund_app_account", false]], "fundappaccountparams (class in algokit_utils.applications.app_client)": [[5, "algokit_utils.applications.app_client.FundAppAccountParams", false]], "genesis_hash (algokit_utils.clients.client_manager.networkdetail attribute)": [[16, "algokit_utils.clients.client_manager.NetworkDetail.genesis_hash", false]], "genesis_id (algokit_utils.clients.client_manager.networkdetail attribute)": [[16, "algokit_utils.clients.client_manager.NetworkDetail.genesis_id", false]], "genesis_id_is_localnet() (algokit_utils.clients.client_manager.clientmanager static method)": [[16, "algokit_utils.clients.client_manager.ClientManager.genesis_id_is_localnet", false]], "get_abi_decoded_value() (in module algokit_utils.applications.abi)": [[4, "algokit_utils.applications.abi.get_abi_decoded_value", false]], "get_abi_encoded_value() (in module algokit_utils.applications.abi)": [[4, "algokit_utils.applications.abi.get_abi_encoded_value", false]], "get_abi_return() (algokit_utils.applications.app_manager.appmanager static method)": [[8, "algokit_utils.applications.app_manager.AppManager.get_abi_return", false]], "get_abi_struct_from_abi_tuple() (algokit_utils.applications.app_spec.arc56.arc56contract static method)": [[10, "algokit_utils.applications.app_spec.arc56.Arc56Contract.get_abi_struct_from_abi_tuple", false]], "get_abi_struct_from_abi_tuple() (in module algokit_utils.applications.abi)": [[4, "algokit_utils.applications.abi.get_abi_struct_from_abi_tuple", false]], "get_abi_tuple_from_abi_struct() (in module algokit_utils.applications.abi)": [[4, "algokit_utils.applications.abi.get_abi_tuple_from_abi_struct", false]], "get_abi_tuple_type_from_abi_struct_definition() (in module algokit_utils.applications.abi)": [[4, "algokit_utils.applications.abi.get_abi_tuple_type_from_abi_struct_definition", false]], "get_account() (algokit_utils.accounts.account_manager.accountmanager method)": [[0, "algokit_utils.accounts.account_manager.AccountManager.get_account", false]], "get_account_information() (algokit_utils.assets.asset_manager.assetmanager method)": [[14, "algokit_utils.assets.asset_manager.AssetManager.get_account_information", false]], "get_algod_client() (algokit_utils.clients.client_manager.clientmanager static method)": [[16, "algokit_utils.clients.client_manager.ClientManager.get_algod_client", false]], "get_algod_client_from_environment() (algokit_utils.clients.client_manager.clientmanager static method)": [[16, "algokit_utils.clients.client_manager.ClientManager.get_algod_client_from_environment", false]], "get_algod_config_from_environment() (algokit_utils.clients.client_manager.clientmanager static method)": [[16, "algokit_utils.clients.client_manager.ClientManager.get_algod_config_from_environment", false]], "get_algonode_config() (algokit_utils.clients.client_manager.clientmanager static method)": [[16, "algokit_utils.clients.client_manager.ClientManager.get_algonode_config", false]], "get_app_client_by_creator_and_name() (algokit_utils.applications.app_factory.appfactory method)": [[7, "algokit_utils.applications.app_factory.AppFactory.get_app_client_by_creator_and_name", false]], "get_app_client_by_creator_and_name() (algokit_utils.clients.client_manager.clientmanager method)": [[16, "algokit_utils.clients.client_manager.ClientManager.get_app_client_by_creator_and_name", false]], "get_app_client_by_id() (algokit_utils.applications.app_factory.appfactory method)": [[7, "algokit_utils.applications.app_factory.AppFactory.get_app_client_by_id", false]], "get_app_client_by_id() (algokit_utils.clients.client_manager.clientmanager method)": [[16, "algokit_utils.clients.client_manager.ClientManager.get_app_client_by_id", false]], "get_app_client_by_network() (algokit_utils.clients.client_manager.clientmanager method)": [[16, "algokit_utils.clients.client_manager.ClientManager.get_app_client_by_network", false]], "get_app_factory() (algokit_utils.clients.client_manager.clientmanager method)": [[16, "algokit_utils.clients.client_manager.ClientManager.get_app_factory", false]], "get_arc56_method() (algokit_utils.applications.app_spec.arc56.arc56contract method)": [[10, "algokit_utils.applications.app_spec.arc56.Arc56Contract.get_arc56_method", false]], "get_arc56_value() (algokit_utils.applications.abi.abireturn method)": [[4, "algokit_utils.applications.abi.ABIReturn.get_arc56_value", false]], "get_arc56_value() (in module algokit_utils.applications.abi)": [[4, "algokit_utils.applications.abi.get_arc56_value", false]], "get_box_names() (algokit_utils.applications.app_client.appclient method)": [[5, "algokit_utils.applications.app_client.AppClient.get_box_names", false]], "get_box_names() (algokit_utils.applications.app_manager.appmanager method)": [[8, "algokit_utils.applications.app_manager.AppManager.get_box_names", false]], "get_box_reference() (algokit_utils.applications.app_manager.appmanager static method)": [[8, "algokit_utils.applications.app_manager.AppManager.get_box_reference", false]], "get_box_value() (algokit_utils.applications.app_client.appclient method)": [[5, "algokit_utils.applications.app_client.AppClient.get_box_value", false]], "get_box_value() (algokit_utils.applications.app_manager.appmanager method)": [[8, "algokit_utils.applications.app_manager.AppManager.get_box_value", false]], "get_box_value_from_abi_type() (algokit_utils.applications.app_client.appclient method)": [[5, "algokit_utils.applications.app_client.AppClient.get_box_value_from_abi_type", false]], "get_box_value_from_abi_type() (algokit_utils.applications.app_manager.appmanager method)": [[8, "algokit_utils.applications.app_manager.AppManager.get_box_value_from_abi_type", false]], "get_box_values() (algokit_utils.applications.app_client.appclient method)": [[5, "algokit_utils.applications.app_client.AppClient.get_box_values", false]], "get_box_values() (algokit_utils.applications.app_manager.appmanager method)": [[8, "algokit_utils.applications.app_manager.AppManager.get_box_values", false]], "get_box_values_from_abi_type() (algokit_utils.applications.app_client.appclient method)": [[5, "algokit_utils.applications.app_client.AppClient.get_box_values_from_abi_type", false]], "get_box_values_from_abi_type() (algokit_utils.applications.app_manager.appmanager method)": [[8, "algokit_utils.applications.app_manager.AppManager.get_box_values_from_abi_type", false]], "get_by_id() (algokit_utils.applications.app_manager.appmanager method)": [[8, "algokit_utils.applications.app_manager.AppManager.get_by_id", false]], "get_by_id() (algokit_utils.assets.asset_manager.assetmanager method)": [[14, "algokit_utils.assets.asset_manager.AssetManager.get_by_id", false]], "get_compilation_result() (algokit_utils.applications.app_manager.appmanager method)": [[8, "algokit_utils.applications.app_manager.AppManager.get_compilation_result", false]], "get_config_from_environment_or_localnet() (algokit_utils.clients.client_manager.clientmanager static method)": [[16, "algokit_utils.clients.client_manager.ClientManager.get_config_from_environment_or_localnet", false]], "get_constant_block_offset() (in module algokit_utils.applications.app_client)": [[5, "algokit_utils.applications.app_client.get_constant_block_offset", false]], "get_creator_apps_by_name() (algokit_utils.applications.app_deployer.appdeployer method)": [[6, "algokit_utils.applications.app_deployer.AppDeployer.get_creator_apps_by_name", false]], "get_decoded_approval() (algokit_utils.applications.app_spec.arc56.source method)": [[10, "algokit_utils.applications.app_spec.arc56.Source.get_decoded_approval", false]], "get_decoded_clear() (algokit_utils.applications.app_spec.arc56.source method)": [[10, "algokit_utils.applications.app_spec.arc56.Source.get_decoded_clear", false]], "get_default_localnet_config() (algokit_utils.clients.client_manager.clientmanager static method)": [[16, "algokit_utils.clients.client_manager.ClientManager.get_default_localnet_config", false]], "get_global_state() (algokit_utils.applications.app_client.appclient method)": [[5, "algokit_utils.applications.app_client.AppClient.get_global_state", false]], "get_global_state() (algokit_utils.applications.app_manager.appmanager method)": [[8, "algokit_utils.applications.app_manager.AppManager.get_global_state", false]], "get_indexer_client() (algokit_utils.clients.client_manager.clientmanager static method)": [[16, "algokit_utils.clients.client_manager.ClientManager.get_indexer_client", false]], "get_indexer_client_from_environment() (algokit_utils.clients.client_manager.clientmanager static method)": [[16, "algokit_utils.clients.client_manager.ClientManager.get_indexer_client_from_environment", false]], "get_indexer_config_from_environment() (algokit_utils.clients.client_manager.clientmanager static method)": [[16, "algokit_utils.clients.client_manager.ClientManager.get_indexer_config_from_environment", false]], "get_information() (algokit_utils.accounts.account_manager.accountmanager method)": [[0, "algokit_utils.accounts.account_manager.AccountManager.get_information", false]], "get_kmd_client() (algokit_utils.clients.client_manager.clientmanager static method)": [[16, "algokit_utils.clients.client_manager.ClientManager.get_kmd_client", false]], "get_kmd_client_from_environment() (algokit_utils.clients.client_manager.clientmanager static method)": [[16, "algokit_utils.clients.client_manager.ClientManager.get_kmd_client_from_environment", false]], "get_kmd_config_from_environment() (algokit_utils.clients.client_manager.clientmanager static method)": [[16, "algokit_utils.clients.client_manager.ClientManager.get_kmd_config_from_environment", false]], "get_limit() (algokit_utils.clients.dispenser_api_client.testnetdispenserapiclient method)": [[17, "algokit_utils.clients.dispenser_api_client.TestNetDispenserApiClient.get_limit", false]], "get_local_state() (algokit_utils.applications.app_client.appclient method)": [[5, "algokit_utils.applications.app_client.AppClient.get_local_state", false]], "get_local_state() (algokit_utils.applications.app_manager.appmanager method)": [[8, "algokit_utils.applications.app_manager.AppManager.get_local_state", false]], "get_localnet_dispenser_account() (algokit_utils.accounts.kmd_account_manager.kmdaccountmanager method)": [[2, "algokit_utils.accounts.kmd_account_manager.KmdAccountManager.get_localnet_dispenser_account", false]], "get_null_logger() (algokit_utils.config.algokitlogger class method)": [[19, "algokit_utils.config.AlgoKitLogger.get_null_logger", false]], "get_or_create_wallet_account() (algokit_utils.accounts.kmd_account_manager.kmdaccountmanager method)": [[2, "algokit_utils.accounts.kmd_account_manager.KmdAccountManager.get_or_create_wallet_account", false]], "get_signer() (algokit_utils.accounts.account_manager.accountmanager method)": [[0, "algokit_utils.accounts.account_manager.AccountManager.get_signer", false]], "get_suggested_params() (algokit_utils.algorand.algorandclient method)": [[3, "algokit_utils.algorand.AlgorandClient.get_suggested_params", false]], "get_testnet_dispenser() (algokit_utils.clients.client_manager.clientmanager method)": [[16, "algokit_utils.clients.client_manager.ClientManager.get_testnet_dispenser", false]], "get_typed_app_client_by_creator_and_name() (algokit_utils.clients.client_manager.clientmanager method)": [[16, "algokit_utils.clients.client_manager.ClientManager.get_typed_app_client_by_creator_and_name", false]], "get_typed_app_client_by_id() (algokit_utils.clients.client_manager.clientmanager method)": [[16, "algokit_utils.clients.client_manager.ClientManager.get_typed_app_client_by_id", false]], "get_typed_app_client_by_network() (algokit_utils.clients.client_manager.clientmanager method)": [[16, "algokit_utils.clients.client_manager.ClientManager.get_typed_app_client_by_network", false]], "get_typed_app_factory() (algokit_utils.clients.client_manager.clientmanager method)": [[16, "algokit_utils.clients.client_manager.ClientManager.get_typed_app_factory", false]], "get_wallet_account() (algokit_utils.accounts.kmd_account_manager.kmdaccountmanager method)": [[2, "algokit_utils.accounts.kmd_account_manager.KmdAccountManager.get_wallet_account", false]], "global (class in algokit_utils.applications.app_spec.arc56)": [[10, "algokit_utils.applications.app_spec.arc56.Global", false]], "global_byte_slices (algokit_utils.models.application.appinformation attribute)": [[25, "algokit_utils.models.application.AppInformation.global_byte_slices", false]], "global_byte_slices (algokit_utils.transactions.transaction_composer.appcreateschema attribute)": [[35, "algokit_utils.transactions.transaction_composer.AppCreateSchema.global_byte_slices", false]], "global_ints (algokit_utils.models.application.appinformation attribute)": [[25, "algokit_utils.models.application.AppInformation.global_ints", false]], "global_ints (algokit_utils.transactions.transaction_composer.appcreateschema attribute)": [[35, "algokit_utils.transactions.transaction_composer.AppCreateSchema.global_ints", false]], "global_state (algokit_utils.applications.app_spec.arc56.keys attribute)": [[10, "algokit_utils.applications.app_spec.arc56.Keys.global_state", false]], "global_state (algokit_utils.applications.app_spec.arc56.maps attribute)": [[10, "algokit_utils.applications.app_spec.arc56.Maps.global_state", false]], "global_state (algokit_utils.applications.app_spec.arc56.schema attribute)": [[10, "algokit_utils.applications.app_spec.arc56.Schema.global_state", false]], "global_state (algokit_utils.models.application.appinformation attribute)": [[25, "algokit_utils.models.application.AppInformation.global_state", false]], "global_state_schema (algokit_utils.applications.app_spec.arc32.arc32contract attribute)": [[9, "algokit_utils.applications.app_spec.arc32.Arc32Contract.global_state_schema", false]], "group_id (algokit_utils.transactions.transaction_composer.sendatomictransactioncomposerresults attribute)": [[35, "algokit_utils.transactions.transaction_composer.SendAtomicTransactionComposerResults.group_id", false]], "group_id (algokit_utils.transactions.transaction_sender.sendsingletransactionresult attribute)": [[37, "algokit_utils.transactions.transaction_sender.SendSingleTransactionResult.group_id", false]], "hints (algokit_utils.applications.app_spec.arc32.arc32contract attribute)": [[9, "algokit_utils.applications.app_spec.arc32.Arc32Contract.hints", false]], "ignore_cache (algokit_utils.applications.app_deployer.appdeployparams attribute)": [[6, "algokit_utils.applications.app_deployer.AppDeployParams.ignore_cache", false]], "import_source_maps() (algokit_utils.applications.app_client.appclient method)": [[5, "algokit_utils.applications.app_client.AppClient.import_source_maps", false]], "import_source_maps() (algokit_utils.applications.app_factory.appfactory method)": [[7, "algokit_utils.applications.app_factory.AppFactory.import_source_maps", false]], "incentive_eligible (algokit_utils.accounts.account_manager.accountinformation attribute)": [[0, "algokit_utils.accounts.account_manager.AccountInformation.incentive_eligible", false]], "indexer (algokit_utils.clients.client_manager.algosdkclients attribute)": [[16, "algokit_utils.clients.client_manager.AlgoSdkClients.indexer", false]], "indexer (algokit_utils.clients.client_manager.clientmanager property)": [[16, "algokit_utils.clients.client_manager.ClientManager.indexer", false]], "indexer_config (algokit_utils.models.network.algoclientconfigs attribute)": [[27, "algokit_utils.models.network.AlgoClientConfigs.indexer_config", false]], "indexer_if_present (algokit_utils.clients.client_manager.clientmanager property)": [[16, "algokit_utils.clients.client_manager.ClientManager.indexer_if_present", false]], "inner_transaction_count (algokit_utils.applications.app_spec.arc56.recommendations attribute)": [[10, "algokit_utils.applications.app_spec.arc56.Recommendations.inner_transaction_count", false]], "ints (algokit_utils.applications.app_spec.arc56.global attribute)": [[10, "algokit_utils.applications.app_spec.arc56.Global.ints", false]], "ints (algokit_utils.applications.app_spec.arc56.local attribute)": [[10, "algokit_utils.applications.app_spec.arc56.Local.ints", false]], "is_localnet (algokit_utils.clients.client_manager.networkdetail attribute)": [[16, "algokit_utils.clients.client_manager.NetworkDetail.is_localnet", false]], "is_localnet() (algokit_utils.clients.client_manager.clientmanager method)": [[16, "algokit_utils.clients.client_manager.ClientManager.is_localnet", false]], "is_mainnet (algokit_utils.clients.client_manager.networkdetail attribute)": [[16, "algokit_utils.clients.client_manager.NetworkDetail.is_mainnet", false]], "is_mainnet() (algokit_utils.clients.client_manager.clientmanager method)": [[16, "algokit_utils.clients.client_manager.ClientManager.is_mainnet", false]], "is_success (algokit_utils.applications.abi.abireturn property)": [[4, "algokit_utils.applications.abi.ABIReturn.is_success", false]], "is_testnet (algokit_utils.clients.client_manager.networkdetail attribute)": [[16, "algokit_utils.clients.client_manager.NetworkDetail.is_testnet", false]], "is_testnet() (algokit_utils.clients.client_manager.clientmanager method)": [[16, "algokit_utils.clients.client_manager.ClientManager.is_testnet", false]], "jsonformatarc2note (class in algokit_utils.models.transaction)": [[30, "algokit_utils.models.transaction.JsonFormatArc2Note", false]], "key (algokit_utils.applications.app_spec.arc56.boxes attribute)": [[10, "algokit_utils.applications.app_spec.arc56.Boxes.key", false]], "key (algokit_utils.applications.app_spec.arc56.storagekey attribute)": [[10, "algokit_utils.applications.app_spec.arc56.StorageKey.key", false]], "key_base64 (algokit_utils.models.application.appstate attribute)": [[25, "algokit_utils.models.application.AppState.key_base64", false]], "key_raw (algokit_utils.models.application.appstate attribute)": [[25, "algokit_utils.models.application.AppState.key_raw", false]], "key_type (algokit_utils.applications.app_spec.arc56.storagekey attribute)": [[10, "algokit_utils.applications.app_spec.arc56.StorageKey.key_type", false]], "key_type (algokit_utils.applications.app_spec.arc56.storagemap attribute)": [[10, "algokit_utils.applications.app_spec.arc56.StorageMap.key_type", false]], "keyreg (algokit_utils.models.transaction.transactionwrapper property)": [[30, "algokit_utils.models.transaction.TransactionWrapper.keyreg", false]], "keys (algokit_utils.applications.app_spec.arc56.state attribute)": [[10, "algokit_utils.applications.app_spec.arc56.State.keys", false]], "keys (class in algokit_utils.applications.app_spec.arc56)": [[10, "algokit_utils.applications.app_spec.arc56.Keys", false]], "kmd (algokit_utils.accounts.account_manager.accountmanager property)": [[0, "algokit_utils.accounts.account_manager.AccountManager.kmd", false]], "kmd (algokit_utils.clients.client_manager.algosdkclients attribute)": [[16, "algokit_utils.clients.client_manager.AlgoSdkClients.kmd", false]], "kmd (algokit_utils.clients.client_manager.clientmanager property)": [[16, "algokit_utils.clients.client_manager.ClientManager.kmd", false]], "kmd() (algokit_utils.accounts.kmd_account_manager.kmdaccountmanager method)": [[2, "algokit_utils.accounts.kmd_account_manager.KmdAccountManager.kmd", false]], "kmd_config (algokit_utils.models.network.algoclientconfigs attribute)": [[27, "algokit_utils.models.network.AlgoClientConfigs.kmd_config", false]], "kmdaccount (class in algokit_utils.accounts.kmd_account_manager)": [[2, "algokit_utils.accounts.kmd_account_manager.KmdAccount", false]], "kmdaccountmanager (class in algokit_utils.accounts.kmd_account_manager)": [[2, "algokit_utils.accounts.kmd_account_manager.KmdAccountManager", false]], "last_heartbeat (algokit_utils.accounts.account_manager.accountinformation attribute)": [[0, "algokit_utils.accounts.account_manager.AccountInformation.last_heartbeat", false]], "last_proposed (algokit_utils.accounts.account_manager.accountinformation attribute)": [[0, "algokit_utils.accounts.account_manager.AccountInformation.last_proposed", false]], "last_valid_round (algokit_utils.applications.app_client.commonappcallparams attribute)": [[5, "algokit_utils.applications.app_client.CommonAppCallParams.last_valid_round", false]], "lease (algokit_utils.applications.app_client.commonappcallparams attribute)": [[5, "algokit_utils.applications.app_client.CommonAppCallParams.lease", false]], "line_no (algokit_utils.errors.logic_error.logicerror attribute)": [[21, "algokit_utils.errors.logic_error.LogicError.line_no", false]], "lines (algokit_utils.errors.logic_error.logicerror attribute)": [[21, "algokit_utils.errors.logic_error.LogicError.lines", false]], "local (class in algokit_utils.applications.app_spec.arc56)": [[10, "algokit_utils.applications.app_spec.arc56.Local", false]], "local_byte_slices (algokit_utils.models.application.appinformation attribute)": [[25, "algokit_utils.models.application.AppInformation.local_byte_slices", false]], "local_byte_slices (algokit_utils.transactions.transaction_composer.appcreateschema attribute)": [[35, "algokit_utils.transactions.transaction_composer.AppCreateSchema.local_byte_slices", false]], "local_ints (algokit_utils.models.application.appinformation attribute)": [[25, "algokit_utils.models.application.AppInformation.local_ints", false]], "local_ints (algokit_utils.transactions.transaction_composer.appcreateschema attribute)": [[35, "algokit_utils.transactions.transaction_composer.AppCreateSchema.local_ints", false]], "local_state (algokit_utils.applications.app_spec.arc56.keys attribute)": [[10, "algokit_utils.applications.app_spec.arc56.Keys.local_state", false]], "local_state (algokit_utils.applications.app_spec.arc56.maps attribute)": [[10, "algokit_utils.applications.app_spec.arc56.Maps.local_state", false]], "local_state (algokit_utils.applications.app_spec.arc56.schema attribute)": [[10, "algokit_utils.applications.app_spec.arc56.Schema.local_state", false]], "local_state_schema (algokit_utils.applications.app_spec.arc32.arc32contract attribute)": [[9, "algokit_utils.applications.app_spec.arc32.Arc32Contract.local_state_schema", false]], "localnet_dispenser() (algokit_utils.accounts.account_manager.accountmanager method)": [[0, "algokit_utils.accounts.account_manager.AccountManager.localnet_dispenser", false]], "logger (algokit_utils.config.updatableconfig property)": [[19, "algokit_utils.config.UpdatableConfig.logger", false]], "logic_error (algokit_utils.errors.logic_error.logicerror attribute)": [[21, "algokit_utils.errors.logic_error.LogicError.logic_error", false]], "logic_error_str (algokit_utils.errors.logic_error.logicerror attribute)": [[21, "algokit_utils.errors.logic_error.LogicError.logic_error_str", false]], "logicerror": [[21, "algokit_utils.errors.logic_error.LogicError", false]], "logicerrordata (class in algokit_utils.errors.logic_error)": [[21, "algokit_utils.errors.logic_error.LogicErrorData", false]], "logicsig() (algokit_utils.accounts.account_manager.accountmanager method)": [[0, "algokit_utils.accounts.account_manager.AccountManager.logicsig", false]], "logicsigaccount (class in algokit_utils.models.account)": [[23, "algokit_utils.models.account.LogicSigAccount", false]], "lsig (algokit_utils.models.account.logicsigaccount property)": [[23, "algokit_utils.models.account.LogicSigAccount.lsig", false]], "mainnet() (algokit_utils.algorand.algorandclient static method)": [[3, "algokit_utils.algorand.AlgorandClient.mainnet", false]], "major (algokit_utils.applications.app_spec.arc56.compilerversion attribute)": [[10, "algokit_utils.applications.app_spec.arc56.CompilerVersion.major", false]], "manager (algokit_utils.assets.asset_manager.assetinformation attribute)": [[14, "algokit_utils.assets.asset_manager.AssetInformation.manager", false]], "manager (algokit_utils.transactions.transaction_composer.assetconfigparams attribute)": [[35, "algokit_utils.transactions.transaction_composer.AssetConfigParams.manager", false]], "manager (algokit_utils.transactions.transaction_composer.assetcreateparams attribute)": [[35, "algokit_utils.transactions.transaction_composer.AssetCreateParams.manager", false]], "maps (algokit_utils.applications.app_spec.arc56.state attribute)": [[10, "algokit_utils.applications.app_spec.arc56.State.maps", false]], "maps (class in algokit_utils.applications.app_spec.arc56)": [[10, "algokit_utils.applications.app_spec.arc56.Maps", false]], "max_fee (algokit_utils.applications.app_client.commonappcallparams attribute)": [[5, "algokit_utils.applications.app_client.CommonAppCallParams.max_fee", false]], "max_fee (algokit_utils.applications.app_deployer.appdeployparams attribute)": [[6, "algokit_utils.applications.app_deployer.AppDeployParams.max_fee", false]], "max_rounds_to_wait (algokit_utils.models.transaction.sendparams attribute)": [[30, "algokit_utils.models.transaction.SendParams.max_rounds_to_wait", false]], "message (algokit_utils.errors.logic_error.logicerror attribute)": [[21, "algokit_utils.errors.logic_error.LogicError.message", false]], "message (algokit_utils.errors.logic_error.logicerrordata attribute)": [[21, "algokit_utils.errors.logic_error.LogicErrorData.message", false]], "metadata (algokit_utils.applications.app_deployer.appdeployparams attribute)": [[6, "algokit_utils.applications.app_deployer.AppDeployParams.metadata", false]], "metadata_hash (algokit_utils.assets.asset_manager.assetinformation attribute)": [[14, "algokit_utils.assets.asset_manager.AssetInformation.metadata_hash", false]], "metadata_hash (algokit_utils.transactions.transaction_composer.assetcreateparams attribute)": [[35, "algokit_utils.transactions.transaction_composer.AssetCreateParams.metadata_hash", false]], "method (algokit_utils.applications.abi.abireturn attribute)": [[4, "algokit_utils.applications.abi.ABIReturn.method", false]], "method (algokit_utils.applications.app_client.baseappclientmethodcallparams attribute)": [[5, "algokit_utils.applications.app_client.BaseAppClientMethodCallParams.method", false]], "method (class in algokit_utils.applications.app_spec.arc56)": [[10, "algokit_utils.applications.app_spec.arc56.Method", false]], "method_calls (algokit_utils.transactions.transaction_composer.builttransactions attribute)": [[35, "algokit_utils.transactions.transaction_composer.BuiltTransactions.method_calls", false]], "method_calls (algokit_utils.transactions.transaction_composer.transactioncomposerbuildresult attribute)": [[35, "algokit_utils.transactions.transaction_composer.TransactionComposerBuildResult.method_calls", false]], "methodarg (class in algokit_utils.applications.app_spec.arc56)": [[10, "algokit_utils.applications.app_spec.arc56.MethodArg", false]], "methodcallparams (in module algokit_utils.transactions.transaction_composer)": [[35, "algokit_utils.transactions.transaction_composer.MethodCallParams", false]], "methodconfigdict (in module algokit_utils.applications.app_spec.arc32)": [[9, "algokit_utils.applications.app_spec.arc32.MethodConfigDict", false]], "methodhints (class in algokit_utils.applications.app_spec.arc32)": [[9, "algokit_utils.applications.app_spec.arc32.MethodHints", false]], "methods (algokit_utils.applications.app_spec.arc56.arc56contract attribute)": [[10, "algokit_utils.applications.app_spec.arc56.Arc56Contract.methods", false]], "micro_algo (algokit_utils.models.amount.algoamount property)": [[24, "algokit_utils.models.amount.AlgoAmount.micro_algo", false]], "micro_algo() (in module algokit_utils.models.amount)": [[24, "algokit_utils.models.amount.micro_algo", false]], "min_balance (algokit_utils.accounts.account_manager.accountinformation attribute)": [[0, "algokit_utils.accounts.account_manager.AccountInformation.min_balance", false]], "minor (algokit_utils.applications.app_spec.arc56.compilerversion attribute)": [[10, "algokit_utils.applications.app_spec.arc56.CompilerVersion.minor", false]], "module": [[0, "module-algokit_utils.accounts.account_manager", false], [1, "module-algokit_utils.accounts", false], [2, "module-algokit_utils.accounts.kmd_account_manager", false], [3, "module-algokit_utils.algorand", false], [4, "module-algokit_utils.applications.abi", false], [5, "module-algokit_utils.applications.app_client", false], [6, "module-algokit_utils.applications.app_deployer", false], [7, "module-algokit_utils.applications.app_factory", false], [8, "module-algokit_utils.applications.app_manager", false], [9, "module-algokit_utils.applications.app_spec.arc32", false], [10, "module-algokit_utils.applications.app_spec.arc56", false], [11, "module-algokit_utils.applications.app_spec", false], [12, "module-algokit_utils.applications.enums", false], [13, "module-algokit_utils.applications", false], [14, "module-algokit_utils.assets.asset_manager", false], [15, "module-algokit_utils.assets", false], [16, "module-algokit_utils.clients.client_manager", false], [17, "module-algokit_utils.clients.dispenser_api_client", false], [18, "module-algokit_utils.clients", false], [19, "module-algokit_utils.config", false], [20, "module-algokit_utils.errors", false], [21, "module-algokit_utils.errors.logic_error", false], [22, "module-algokit_utils", false], [23, "module-algokit_utils.models.account", false], [24, "module-algokit_utils.models.amount", false], [25, "module-algokit_utils.models.application", false], [26, "module-algokit_utils.models", false], [27, "module-algokit_utils.models.network", false], [28, "module-algokit_utils.models.simulate", false], [29, "module-algokit_utils.models.state", false], [30, "module-algokit_utils.models.transaction", false], [31, "module-algokit_utils.protocols.account", false], [32, "module-algokit_utils.protocols", false], [33, "module-algokit_utils.protocols.typed_clients", false], [34, "module-algokit_utils.transactions", false], [35, "module-algokit_utils.transactions.transaction_composer", false], [36, "module-algokit_utils.transactions.transaction_creator", false], [37, "module-algokit_utils.transactions.transaction_sender", false]], "multisig (algokit_utils.models.account.multisigaccount property)": [[23, "algokit_utils.models.account.MultiSigAccount.multisig", false]], "multisig() (algokit_utils.accounts.account_manager.accountmanager method)": [[0, "algokit_utils.accounts.account_manager.AccountManager.multisig", false]], "multisigaccount (class in algokit_utils.models.account)": [[23, "algokit_utils.models.account.MultiSigAccount", false]], "multisigmetadata (class in algokit_utils.models.account)": [[23, "algokit_utils.models.account.MultisigMetadata", false]], "name (algokit_utils.applications.abi.boxabivalue attribute)": [[4, "algokit_utils.applications.abi.BoxABIValue.name", false]], "name (algokit_utils.applications.app_deployer.appdeploymentmetadata attribute)": [[6, "algokit_utils.applications.app_deployer.AppDeploymentMetaData.name", false]], "name (algokit_utils.applications.app_deployer.applicationmetadata property)": [[6, "algokit_utils.applications.app_deployer.ApplicationMetaData.name", false]], "name (algokit_utils.applications.app_spec.arc32.structargdict attribute)": [[9, "algokit_utils.applications.app_spec.arc32.StructArgDict.name", false]], "name (algokit_utils.applications.app_spec.arc56.arc56contract attribute)": [[10, "algokit_utils.applications.app_spec.arc56.Arc56Contract.name", false]], "name (algokit_utils.applications.app_spec.arc56.event attribute)": [[10, "algokit_utils.applications.app_spec.arc56.Event.name", false]], "name (algokit_utils.applications.app_spec.arc56.eventarg attribute)": [[10, "algokit_utils.applications.app_spec.arc56.EventArg.name", false]], "name (algokit_utils.applications.app_spec.arc56.method attribute)": [[10, "algokit_utils.applications.app_spec.arc56.Method.name", false]], "name (algokit_utils.applications.app_spec.arc56.methodarg attribute)": [[10, "algokit_utils.applications.app_spec.arc56.MethodArg.name", false]], "name (algokit_utils.applications.app_spec.arc56.structfield attribute)": [[10, "algokit_utils.applications.app_spec.arc56.StructField.name", false]], "name (algokit_utils.models.state.boxname attribute)": [[29, "algokit_utils.models.state.BoxName.name", false]], "name (algokit_utils.models.state.boxvalue attribute)": [[29, "algokit_utils.models.state.BoxValue.name", false]], "name_base64 (algokit_utils.models.state.boxname attribute)": [[29, "algokit_utils.models.state.BoxName.name_base64", false]], "name_raw (algokit_utils.models.state.boxname attribute)": [[29, "algokit_utils.models.state.BoxName.name_raw", false]], "network (class in algokit_utils.applications.app_spec.arc56)": [[10, "algokit_utils.applications.app_spec.arc56.Network", false]], "network() (algokit_utils.clients.client_manager.clientmanager method)": [[16, "algokit_utils.clients.client_manager.ClientManager.network", false]], "networkdetail (class in algokit_utils.clients.client_manager)": [[16, "algokit_utils.clients.client_manager.NetworkDetail", false]], "networks (algokit_utils.applications.app_spec.arc56.arc56contract attribute)": [[10, "algokit_utils.applications.app_spec.arc56.Arc56Contract.networks", false]], "never (algokit_utils.applications.app_spec.arc32.callconfig attribute)": [[9, "algokit_utils.applications.app_spec.arc32.CallConfig.NEVER", false]], "new_account() (algokit_utils.models.account.signingaccount static method)": [[23, "algokit_utils.models.account.SigningAccount.new_account", false]], "new_group() (algokit_utils.algorand.algorandclient method)": [[3, "algokit_utils.algorand.AlgorandClient.new_group", false]], "new_group() (algokit_utils.transactions.transaction_sender.algorandclienttransactionsender method)": [[37, "algokit_utils.transactions.transaction_sender.AlgorandClientTransactionSender.new_group", false]], "no_op (algokit_utils.applications.app_spec.arc56.callenum attribute)": [[10, "algokit_utils.applications.app_spec.arc56.CallEnum.NO_OP", false]], "no_op (algokit_utils.applications.app_spec.arc56.createenum attribute)": [[10, "algokit_utils.applications.app_spec.arc56.CreateEnum.NO_OP", false]], "none (algokit_utils.applications.app_spec.arc56.pcoffsetmethod attribute)": [[10, "algokit_utils.applications.app_spec.arc56.PcOffsetMethod.NONE", false]], "normalise_app_spec() (algokit_utils.applications.app_client.appclient static method)": [[5, "algokit_utils.applications.app_client.AppClient.normalise_app_spec", false]], "note (algokit_utils.applications.app_client.commonappcallparams attribute)": [[5, "algokit_utils.applications.app_client.CommonAppCallParams.note", false]], "nothing (algokit_utils.applications.enums.operationperformed attribute)": [[12, "algokit_utils.applications.enums.OperationPerformed.Nothing", false]], "offline_key_registration (algokit_utils.transactions.transaction_creator.algorandclienttransactioncreator property)": [[36, "algokit_utils.transactions.transaction_creator.AlgorandClientTransactionCreator.offline_key_registration", false]], "offline_key_registration() (algokit_utils.transactions.transaction_sender.algorandclienttransactionsender method)": [[37, "algokit_utils.transactions.transaction_sender.AlgorandClientTransactionSender.offline_key_registration", false]], "offlinekeyregistrationparams (class in algokit_utils.transactions.transaction_composer)": [[35, "algokit_utils.transactions.transaction_composer.OfflineKeyRegistrationParams", false]], "on_complete (algokit_utils.applications.app_client.appclientbarecallcreateparams attribute)": [[5, "algokit_utils.applications.app_client.AppClientBareCallCreateParams.on_complete", false]], "on_complete (algokit_utils.applications.app_client.appclientmethodcallcreateparams attribute)": [[5, "algokit_utils.applications.app_client.AppClientMethodCallCreateParams.on_complete", false]], "on_complete (algokit_utils.applications.app_client.commonappcallcreateparams attribute)": [[5, "algokit_utils.applications.app_client.CommonAppCallCreateParams.on_complete", false]], "on_complete (algokit_utils.applications.app_client.commonappcallparams attribute)": [[5, "algokit_utils.applications.app_client.CommonAppCallParams.on_complete", false]], "on_complete (algokit_utils.applications.app_factory.appfactorycreateparams attribute)": [[7, "algokit_utils.applications.app_factory.AppFactoryCreateParams.on_complete", false]], "on_complete (algokit_utils.transactions.transaction_composer.appcallmethodcallparams attribute)": [[35, "algokit_utils.transactions.transaction_composer.AppCallMethodCallParams.on_complete", false]], "on_complete (algokit_utils.transactions.transaction_composer.appcallparams attribute)": [[35, "algokit_utils.transactions.transaction_composer.AppCallParams.on_complete", false]], "on_complete (algokit_utils.transactions.transaction_composer.appcreatemethodcallparams attribute)": [[35, "algokit_utils.transactions.transaction_composer.AppCreateMethodCallParams.on_complete", false]], "on_complete (algokit_utils.transactions.transaction_composer.appcreateparams attribute)": [[35, "algokit_utils.transactions.transaction_composer.AppCreateParams.on_complete", false]], "on_complete (algokit_utils.transactions.transaction_composer.appdeletemethodcallparams attribute)": [[35, "algokit_utils.transactions.transaction_composer.AppDeleteMethodCallParams.on_complete", false]], "on_complete (algokit_utils.transactions.transaction_composer.appdeleteparams attribute)": [[35, "algokit_utils.transactions.transaction_composer.AppDeleteParams.on_complete", false]], "on_complete (algokit_utils.transactions.transaction_composer.appupdatemethodcallparams attribute)": [[35, "algokit_utils.transactions.transaction_composer.AppUpdateMethodCallParams.on_complete", false]], "on_complete (algokit_utils.transactions.transaction_composer.appupdateparams attribute)": [[35, "algokit_utils.transactions.transaction_composer.AppUpdateParams.on_complete", false]], "on_schema_break (algokit_utils.applications.app_deployer.appdeployparams attribute)": [[6, "algokit_utils.applications.app_deployer.AppDeployParams.on_schema_break", false]], "on_update (algokit_utils.applications.app_deployer.appdeployparams attribute)": [[6, "algokit_utils.applications.app_deployer.AppDeployParams.on_update", false]], "oncompleteactionname (in module algokit_utils.applications.app_spec.arc32)": [[9, "algokit_utils.applications.app_spec.arc32.OnCompleteActionName", false]], "online_key_registration (algokit_utils.transactions.transaction_creator.algorandclienttransactioncreator property)": [[36, "algokit_utils.transactions.transaction_creator.AlgorandClientTransactionCreator.online_key_registration", false]], "online_key_registration() (algokit_utils.transactions.transaction_sender.algorandclienttransactionsender method)": [[37, "algokit_utils.transactions.transaction_sender.AlgorandClientTransactionSender.online_key_registration", false]], "onlinekeyregistrationparams (class in algokit_utils.transactions.transaction_composer)": [[35, "algokit_utils.transactions.transaction_composer.OnlineKeyRegistrationParams", false]], "onschemabreak (class in algokit_utils.applications.enums)": [[12, "algokit_utils.applications.enums.OnSchemaBreak", false]], "onupdate (class in algokit_utils.applications.enums)": [[12, "algokit_utils.applications.enums.OnUpdate", false]], "operation_performed (algokit_utils.applications.app_deployer.appdeployresult attribute)": [[6, "algokit_utils.applications.app_deployer.AppDeployResult.operation_performed", false]], "operation_performed (algokit_utils.applications.app_factory.appfactorydeployresult attribute)": [[7, "algokit_utils.applications.app_factory.AppFactoryDeployResult.operation_performed", false]], "operationperformed (class in algokit_utils.applications.enums)": [[12, "algokit_utils.applications.enums.OperationPerformed", false]], "opt_in (algokit_utils.applications.app_spec.arc56.callenum attribute)": [[10, "algokit_utils.applications.app_spec.arc56.CallEnum.OPT_IN", false]], "opt_in (algokit_utils.applications.app_spec.arc56.createenum attribute)": [[10, "algokit_utils.applications.app_spec.arc56.CreateEnum.OPT_IN", false]], "params (algokit_utils.applications.app_client.appclient property)": [[5, "algokit_utils.applications.app_client.AppClient.params", false]], "params (algokit_utils.applications.app_factory.appfactory property)": [[7, "algokit_utils.applications.app_factory.AppFactory.params", false]], "params (algokit_utils.models.account.multisigaccount property)": [[23, "algokit_utils.models.account.MultiSigAccount.params", false]], "parse_logic_error() (in module algokit_utils.errors.logic_error)": [[21, "algokit_utils.errors.logic_error.parse_logic_error", false]], "participation (algokit_utils.accounts.account_manager.accountinformation attribute)": [[0, "algokit_utils.accounts.account_manager.AccountInformation.participation", false]], "patch (algokit_utils.applications.app_spec.arc56.compilerversion attribute)": [[10, "algokit_utils.applications.app_spec.arc56.CompilerVersion.patch", false]], "payment (algokit_utils.models.transaction.transactionwrapper property)": [[30, "algokit_utils.models.transaction.TransactionWrapper.payment", false]], "payment (algokit_utils.transactions.transaction_creator.algorandclienttransactioncreator property)": [[36, "algokit_utils.transactions.transaction_creator.AlgorandClientTransactionCreator.payment", false]], "payment() (algokit_utils.transactions.transaction_sender.algorandclienttransactionsender method)": [[37, "algokit_utils.transactions.transaction_sender.AlgorandClientTransactionSender.payment", false]], "paymentparams (class in algokit_utils.transactions.transaction_composer)": [[35, "algokit_utils.transactions.transaction_composer.PaymentParams", false]], "pc (algokit_utils.applications.app_spec.arc56.sourceinfo attribute)": [[10, "algokit_utils.applications.app_spec.arc56.SourceInfo.pc", false]], "pc (algokit_utils.errors.logic_error.logicerror attribute)": [[21, "algokit_utils.errors.logic_error.LogicError.pc", false]], "pc (algokit_utils.errors.logic_error.logicerrordata attribute)": [[21, "algokit_utils.errors.logic_error.LogicErrorData.pc", false]], "pc_offset_method (algokit_utils.applications.app_spec.arc56.programsourceinfo attribute)": [[10, "algokit_utils.applications.app_spec.arc56.ProgramSourceInfo.pc_offset_method", false]], "pcoffsetmethod (class in algokit_utils.applications.app_spec.arc56)": [[10, "algokit_utils.applications.app_spec.arc56.PcOffsetMethod", false]], "pending_rewards (algokit_utils.accounts.account_manager.accountinformation attribute)": [[0, "algokit_utils.accounts.account_manager.AccountInformation.pending_rewards", false]], "populate_app_call_resource (algokit_utils.config.updatableconfig property)": [[19, "algokit_utils.config.UpdatableConfig.populate_app_call_resource", false]], "populate_app_call_resources (algokit_utils.models.transaction.sendparams attribute)": [[30, "algokit_utils.models.transaction.SendParams.populate_app_call_resources", false]], "populate_app_call_resources() (in module algokit_utils.transactions.transaction_composer)": [[35, "algokit_utils.transactions.transaction_composer.populate_app_call_resources", false]], "port (algokit_utils.models.network.algoclientnetworkconfig attribute)": [[27, "algokit_utils.models.network.AlgoClientNetworkConfig.port", false]], "prefix (algokit_utils.applications.app_spec.arc56.storagemap attribute)": [[10, "algokit_utils.applications.app_spec.arc56.StorageMap.prefix", false]], "prepare_group_for_sending() (in module algokit_utils.transactions.transaction_composer)": [[35, "algokit_utils.transactions.transaction_composer.prepare_group_for_sending", false]], "prevent_account_from_ever_participating_again (algokit_utils.transactions.transaction_composer.offlinekeyregistrationparams attribute)": [[35, "algokit_utils.transactions.transaction_composer.OfflineKeyRegistrationParams.prevent_account_from_ever_participating_again", false]], "private_key (algokit_utils.models.account.signingaccount attribute)": [[23, "algokit_utils.models.account.SigningAccount.private_key", false]], "programsourceinfo (class in algokit_utils.applications.app_spec.arc56)": [[10, "algokit_utils.applications.app_spec.arc56.ProgramSourceInfo", false]], "project_root (algokit_utils.config.updatableconfig property)": [[19, "algokit_utils.config.UpdatableConfig.project_root", false]], "public_key (algokit_utils.models.account.signingaccount property)": [[23, "algokit_utils.models.account.SigningAccount.public_key", false]], "puya (algokit_utils.applications.app_spec.arc56.compiler attribute)": [[10, "algokit_utils.applications.app_spec.arc56.Compiler.PUYA", false]], "random() (algokit_utils.accounts.account_manager.accountmanager method)": [[0, "algokit_utils.accounts.account_manager.AccountManager.random", false]], "raw (algokit_utils.models.transaction.transactionwrapper property)": [[30, "algokit_utils.models.transaction.TransactionWrapper.raw", false]], "raw_value (algokit_utils.applications.abi.abireturn attribute)": [[4, "algokit_utils.applications.abi.ABIReturn.raw_value", false]], "read_bytes (algokit_utils.applications.app_spec.arc56.boxes attribute)": [[10, "algokit_utils.applications.app_spec.arc56.Boxes.read_bytes", false]], "read_only (algokit_utils.applications.app_spec.arc32.methodhints attribute)": [[9, "algokit_utils.applications.app_spec.arc32.MethodHints.read_only", false]], "readonly (algokit_utils.applications.app_spec.arc56.method attribute)": [[10, "algokit_utils.applications.app_spec.arc56.Method.readonly", false]], "rebuild() (algokit_utils.transactions.transaction_composer.transactioncomposer method)": [[35, "algokit_utils.transactions.transaction_composer.TransactionComposer.rebuild", false]], "receiver (algokit_utils.transactions.transaction_composer.assettransferparams attribute)": [[35, "algokit_utils.transactions.transaction_composer.AssetTransferParams.receiver", false]], "receiver (algokit_utils.transactions.transaction_composer.paymentparams attribute)": [[35, "algokit_utils.transactions.transaction_composer.PaymentParams.receiver", false]], "recommendations (algokit_utils.applications.app_spec.arc56.method attribute)": [[10, "algokit_utils.applications.app_spec.arc56.Method.recommendations", false]], "recommendations (class in algokit_utils.applications.app_spec.arc56)": [[10, "algokit_utils.applications.app_spec.arc56.Recommendations", false]], "reference (algokit_utils.applications.app_deployer.applicationmetadata attribute)": [[6, "algokit_utils.applications.app_deployer.ApplicationMetaData.reference", false]], "refund() (algokit_utils.clients.dispenser_api_client.testnetdispenserapiclient method)": [[17, "algokit_utils.clients.dispenser_api_client.TestNetDispenserApiClient.refund", false]], "rekey_account() (algokit_utils.accounts.account_manager.accountmanager method)": [[0, "algokit_utils.accounts.account_manager.AccountManager.rekey_account", false]], "rekey_to (algokit_utils.applications.app_client.commonappcallparams attribute)": [[5, "algokit_utils.applications.app_client.CommonAppCallParams.rekey_to", false]], "rekeyed() (algokit_utils.accounts.account_manager.accountmanager method)": [[0, "algokit_utils.accounts.account_manager.AccountManager.rekeyed", false]], "replace (algokit_utils.applications.enums.operationperformed attribute)": [[12, "algokit_utils.applications.enums.OperationPerformed.Replace", false]], "replace_teal_template_deploy_time_control_params() (algokit_utils.applications.app_manager.appmanager static method)": [[8, "algokit_utils.applications.app_manager.AppManager.replace_teal_template_deploy_time_control_params", false]], "replace_template_variables() (algokit_utils.applications.app_manager.appmanager static method)": [[8, "algokit_utils.applications.app_manager.AppManager.replace_template_variables", false]], "replaceapp (algokit_utils.applications.enums.onschemabreak attribute)": [[12, "algokit_utils.applications.enums.OnSchemaBreak.ReplaceApp", false]], "replaceapp (algokit_utils.applications.enums.onupdate attribute)": [[12, "algokit_utils.applications.enums.OnUpdate.ReplaceApp", false]], "request_timeout (algokit_utils.clients.dispenser_api_client.testnetdispenserapiclient attribute)": [[17, "algokit_utils.clients.dispenser_api_client.TestNetDispenserApiClient.request_timeout", false]], "reserve (algokit_utils.assets.asset_manager.assetinformation attribute)": [[14, "algokit_utils.assets.asset_manager.AssetInformation.reserve", false]], "reserve (algokit_utils.transactions.transaction_composer.assetconfigparams attribute)": [[35, "algokit_utils.transactions.transaction_composer.AssetConfigParams.reserve", false]], "reserve (algokit_utils.transactions.transaction_composer.assetcreateparams attribute)": [[35, "algokit_utils.transactions.transaction_composer.AssetCreateParams.reserve", false]], "returns (algokit_utils.applications.app_spec.arc56.method attribute)": [[10, "algokit_utils.applications.app_spec.arc56.Method.returns", false]], "returns (algokit_utils.transactions.transaction_composer.sendatomictransactioncomposerresults attribute)": [[35, "algokit_utils.transactions.transaction_composer.SendAtomicTransactionComposerResults.returns", false]], "returns (algokit_utils.transactions.transaction_sender.sendsingletransactionresult attribute)": [[37, "algokit_utils.transactions.transaction_sender.SendSingleTransactionResult.returns", false]], "returns (class in algokit_utils.applications.app_spec.arc56)": [[10, "algokit_utils.applications.app_spec.arc56.Returns", false]], "reward_base (algokit_utils.accounts.account_manager.accountinformation attribute)": [[0, "algokit_utils.accounts.account_manager.AccountInformation.reward_base", false]], "rewards (algokit_utils.accounts.account_manager.accountinformation attribute)": [[0, "algokit_utils.accounts.account_manager.AccountInformation.rewards", false]], "round (algokit_utils.accounts.account_manager.accountinformation attribute)": [[0, "algokit_utils.accounts.account_manager.AccountInformation.round", false]], "round (algokit_utils.assets.asset_manager.accountassetinformation attribute)": [[14, "algokit_utils.assets.asset_manager.AccountAssetInformation.round", false]], "schema (algokit_utils.applications.app_client.appclientcreateschema attribute)": [[5, "algokit_utils.applications.app_client.AppClientCreateSchema.schema", false]], "schema (algokit_utils.applications.app_spec.arc32.arc32contract attribute)": [[9, "algokit_utils.applications.app_spec.arc32.Arc32Contract.schema", false]], "schema (algokit_utils.applications.app_spec.arc56.state attribute)": [[10, "algokit_utils.applications.app_spec.arc56.State.schema", false]], "schema (algokit_utils.transactions.transaction_composer.appcallparams attribute)": [[35, "algokit_utils.transactions.transaction_composer.AppCallParams.schema", false]], "schema (algokit_utils.transactions.transaction_composer.appcreatemethodcallparams attribute)": [[35, "algokit_utils.transactions.transaction_composer.AppCreateMethodCallParams.schema", false]], "schema (algokit_utils.transactions.transaction_composer.appcreateparams attribute)": [[35, "algokit_utils.transactions.transaction_composer.AppCreateParams.schema", false]], "schema (class in algokit_utils.applications.app_spec.arc56)": [[10, "algokit_utils.applications.app_spec.arc56.Schema", false]], "scratch_variables (algokit_utils.applications.app_spec.arc56.arc56contract attribute)": [[10, "algokit_utils.applications.app_spec.arc56.Arc56Contract.scratch_variables", false]], "scratchvariables (class in algokit_utils.applications.app_spec.arc56)": [[10, "algokit_utils.applications.app_spec.arc56.ScratchVariables", false]], "selection_key (algokit_utils.transactions.transaction_composer.onlinekeyregistrationparams attribute)": [[35, "algokit_utils.transactions.transaction_composer.OnlineKeyRegistrationParams.selection_key", false]], "send (algokit_utils.algorand.algorandclient property)": [[3, "algokit_utils.algorand.AlgorandClient.send", false]], "send (algokit_utils.applications.app_client.appclient property)": [[5, "algokit_utils.applications.app_client.AppClient.send", false]], "send (algokit_utils.applications.app_factory.appfactory property)": [[7, "algokit_utils.applications.app_factory.AppFactory.send", false]], "send() (algokit_utils.transactions.transaction_composer.transactioncomposer method)": [[35, "algokit_utils.transactions.transaction_composer.TransactionComposer.send", false]], "send_atomic_transaction_composer() (in module algokit_utils.transactions.transaction_composer)": [[35, "algokit_utils.transactions.transaction_composer.send_atomic_transaction_composer", false]], "send_params (algokit_utils.applications.app_deployer.appdeployparams attribute)": [[6, "algokit_utils.applications.app_deployer.AppDeployParams.send_params", false]], "sendappcreatefactorytransactionresult (class in algokit_utils.applications.app_factory)": [[7, "algokit_utils.applications.app_factory.SendAppCreateFactoryTransactionResult", false]], "sendappcreatetransactionresult (class in algokit_utils.transactions.transaction_sender)": [[37, "algokit_utils.transactions.transaction_sender.SendAppCreateTransactionResult", false]], "sendappfactorytransactionresult (class in algokit_utils.applications.app_factory)": [[7, "algokit_utils.applications.app_factory.SendAppFactoryTransactionResult", false]], "sendapptransactionresult (class in algokit_utils.transactions.transaction_sender)": [[37, "algokit_utils.transactions.transaction_sender.SendAppTransactionResult", false]], "sendappupdatefactorytransactionresult (class in algokit_utils.applications.app_factory)": [[7, "algokit_utils.applications.app_factory.SendAppUpdateFactoryTransactionResult", false]], "sendappupdatetransactionresult (class in algokit_utils.transactions.transaction_sender)": [[37, "algokit_utils.transactions.transaction_sender.SendAppUpdateTransactionResult", false]], "sendatomictransactioncomposerresults (class in algokit_utils.transactions.transaction_composer)": [[35, "algokit_utils.transactions.transaction_composer.SendAtomicTransactionComposerResults", false]], "sender (algokit_utils.applications.app_client.commonappcallparams attribute)": [[5, "algokit_utils.applications.app_client.CommonAppCallParams.sender", false]], "sendparams (class in algokit_utils.models.transaction)": [[30, "algokit_utils.models.transaction.SendParams", false]], "sendsingleassetcreatetransactionresult (class in algokit_utils.transactions.transaction_sender)": [[37, "algokit_utils.transactions.transaction_sender.SendSingleAssetCreateTransactionResult", false]], "sendsingletransactionresult (class in algokit_utils.transactions.transaction_sender)": [[37, "algokit_utils.transactions.transaction_sender.SendSingleTransactionResult", false]], "server (algokit_utils.models.network.algoclientnetworkconfig attribute)": [[27, "algokit_utils.models.network.AlgoClientNetworkConfig.server", false]], "set_default_signer() (algokit_utils.accounts.account_manager.accountmanager method)": [[0, "algokit_utils.accounts.account_manager.AccountManager.set_default_signer", false]], "set_default_signer() (algokit_utils.algorand.algorandclient method)": [[3, "algokit_utils.algorand.AlgorandClient.set_default_signer", false]], "set_default_validity_window() (algokit_utils.algorand.algorandclient method)": [[3, "algokit_utils.algorand.AlgorandClient.set_default_validity_window", false]], "set_signer() (algokit_utils.accounts.account_manager.accountmanager method)": [[0, "algokit_utils.accounts.account_manager.AccountManager.set_signer", false]], "set_signer() (algokit_utils.algorand.algorandclient method)": [[3, "algokit_utils.algorand.AlgorandClient.set_signer", false]], "set_signer_from_account() (algokit_utils.accounts.account_manager.accountmanager method)": [[0, "algokit_utils.accounts.account_manager.AccountManager.set_signer_from_account", false]], "set_signer_from_account() (algokit_utils.algorand.algorandclient method)": [[3, "algokit_utils.algorand.AlgorandClient.set_signer_from_account", false]], "set_signers() (algokit_utils.accounts.account_manager.accountmanager method)": [[0, "algokit_utils.accounts.account_manager.AccountManager.set_signers", false]], "set_suggested_params_cache() (algokit_utils.algorand.algorandclient method)": [[3, "algokit_utils.algorand.AlgorandClient.set_suggested_params_cache", false]], "set_suggested_params_cache_timeout() (algokit_utils.algorand.algorandclient method)": [[3, "algokit_utils.algorand.AlgorandClient.set_suggested_params_cache_timeout", false]], "sig_type (algokit_utils.accounts.account_manager.accountinformation attribute)": [[0, "algokit_utils.accounts.account_manager.AccountInformation.sig_type", false]], "sign() (algokit_utils.models.account.multisigaccount method)": [[23, "algokit_utils.models.account.MultiSigAccount.sign", false]], "signer (algokit_utils.applications.app_client.commonappcallparams attribute)": [[5, "algokit_utils.applications.app_client.CommonAppCallParams.signer", false]], "signer (algokit_utils.models.account.logicsigaccount property)": [[23, "algokit_utils.models.account.LogicSigAccount.signer", false]], "signer (algokit_utils.models.account.multisigaccount property)": [[23, "algokit_utils.models.account.MultiSigAccount.signer", false]], "signer (algokit_utils.models.account.signingaccount property)": [[23, "algokit_utils.models.account.SigningAccount.signer", false]], "signer (algokit_utils.models.account.transactionsigneraccount attribute)": [[23, "algokit_utils.models.account.TransactionSignerAccount.signer", false]], "signer (algokit_utils.protocols.account.transactionsigneraccountprotocol property)": [[31, "algokit_utils.protocols.account.TransactionSignerAccountProtocol.signer", false]], "signers (algokit_utils.transactions.transaction_composer.builttransactions attribute)": [[35, "algokit_utils.transactions.transaction_composer.BuiltTransactions.signers", false]], "signing_accounts (algokit_utils.models.account.multisigaccount property)": [[23, "algokit_utils.models.account.MultiSigAccount.signing_accounts", false]], "signingaccount (class in algokit_utils.models.account)": [[23, "algokit_utils.models.account.SigningAccount", false]], "simulate() (algokit_utils.transactions.transaction_composer.transactioncomposer method)": [[35, "algokit_utils.transactions.transaction_composer.TransactionComposer.simulate", false]], "simulate_response (algokit_utils.transactions.transaction_composer.sendatomictransactioncomposerresults attribute)": [[35, "algokit_utils.transactions.transaction_composer.SendAtomicTransactionComposerResults.simulate_response", false]], "simulationtrace (class in algokit_utils.models.simulate)": [[28, "algokit_utils.models.simulate.SimulationTrace", false]], "slot (algokit_utils.applications.app_spec.arc56.scratchvariables attribute)": [[10, "algokit_utils.applications.app_spec.arc56.ScratchVariables.slot", false]], "source (algokit_utils.applications.app_spec.arc32.defaultargumentdict attribute)": [[9, "algokit_utils.applications.app_spec.arc32.DefaultArgumentDict.source", false]], "source (algokit_utils.applications.app_spec.arc56.arc56contract attribute)": [[10, "algokit_utils.applications.app_spec.arc56.Arc56Contract.source", false]], "source (algokit_utils.applications.app_spec.arc56.defaultvalue attribute)": [[10, "algokit_utils.applications.app_spec.arc56.DefaultValue.source", false]], "source (algokit_utils.applications.app_spec.arc56.sourceinfo attribute)": [[10, "algokit_utils.applications.app_spec.arc56.SourceInfo.source", false]], "source (class in algokit_utils.applications.app_spec.arc56)": [[10, "algokit_utils.applications.app_spec.arc56.Source", false]], "source_info (algokit_utils.applications.app_spec.arc56.arc56contract attribute)": [[10, "algokit_utils.applications.app_spec.arc56.Arc56Contract.source_info", false]], "source_info (algokit_utils.applications.app_spec.arc56.programsourceinfo attribute)": [[10, "algokit_utils.applications.app_spec.arc56.ProgramSourceInfo.source_info", false]], "source_map (algokit_utils.errors.logic_error.logicerror attribute)": [[21, "algokit_utils.errors.logic_error.LogicError.source_map", false]], "source_map (algokit_utils.models.application.compiledteal attribute)": [[25, "algokit_utils.models.application.CompiledTeal.source_map", false]], "sourceinfo (class in algokit_utils.applications.app_spec.arc56)": [[10, "algokit_utils.applications.app_spec.arc56.SourceInfo", false]], "sourceinfomodel (class in algokit_utils.applications.app_spec.arc56)": [[10, "algokit_utils.applications.app_spec.arc56.SourceInfoModel", false]], "state (algokit_utils.applications.app_client.appclient property)": [[5, "algokit_utils.applications.app_client.AppClient.state", false]], "state (algokit_utils.applications.app_spec.arc56.arc56contract attribute)": [[10, "algokit_utils.applications.app_spec.arc56.Arc56Contract.state", false]], "state (class in algokit_utils.applications.app_spec.arc56)": [[10, "algokit_utils.applications.app_spec.arc56.State", false]], "state_proof (algokit_utils.models.transaction.transactionwrapper property)": [[30, "algokit_utils.models.transaction.TransactionWrapper.state_proof", false]], "state_proof_key (algokit_utils.transactions.transaction_composer.onlinekeyregistrationparams attribute)": [[35, "algokit_utils.transactions.transaction_composer.OnlineKeyRegistrationParams.state_proof_key", false]], "statedict (in module algokit_utils.applications.app_spec.arc32)": [[9, "algokit_utils.applications.app_spec.arc32.StateDict", false]], "static_fee (algokit_utils.applications.app_client.commonappcallparams attribute)": [[5, "algokit_utils.applications.app_client.CommonAppCallParams.static_fee", false]], "status (algokit_utils.accounts.account_manager.accountinformation attribute)": [[0, "algokit_utils.accounts.account_manager.AccountInformation.status", false]], "storagekey (class in algokit_utils.applications.app_spec.arc56)": [[10, "algokit_utils.applications.app_spec.arc56.StorageKey", false]], "storagemap (class in algokit_utils.applications.app_spec.arc56)": [[10, "algokit_utils.applications.app_spec.arc56.StorageMap", false]], "stringformatarc2note (class in algokit_utils.models.transaction)": [[30, "algokit_utils.models.transaction.StringFormatArc2Note", false]], "strip_teal_comments() (algokit_utils.applications.app_manager.appmanager static method)": [[8, "algokit_utils.applications.app_manager.AppManager.strip_teal_comments", false]], "struct (algokit_utils.applications.app_spec.arc56.eventarg attribute)": [[10, "algokit_utils.applications.app_spec.arc56.EventArg.struct", false]], "struct (algokit_utils.applications.app_spec.arc56.methodarg attribute)": [[10, "algokit_utils.applications.app_spec.arc56.MethodArg.struct", false]], "struct (algokit_utils.applications.app_spec.arc56.returns attribute)": [[10, "algokit_utils.applications.app_spec.arc56.Returns.struct", false]], "structargdict (class in algokit_utils.applications.app_spec.arc32)": [[9, "algokit_utils.applications.app_spec.arc32.StructArgDict", false]], "structfield (class in algokit_utils.applications.app_spec.arc56)": [[10, "algokit_utils.applications.app_spec.arc56.StructField", false]], "structs (algokit_utils.applications.app_spec.arc32.methodhints attribute)": [[9, "algokit_utils.applications.app_spec.arc32.MethodHints.structs", false]], "structs (algokit_utils.applications.app_spec.arc56.arc56contract attribute)": [[10, "algokit_utils.applications.app_spec.arc56.Arc56Contract.structs", false]], "suppress_log (algokit_utils.models.transaction.sendparams attribute)": [[30, "algokit_utils.models.transaction.SendParams.suppress_log", false]], "teal (algokit_utils.applications.app_spec.arc56.sourceinfo attribute)": [[10, "algokit_utils.applications.app_spec.arc56.SourceInfo.teal", false]], "teal (algokit_utils.models.application.compiledteal attribute)": [[25, "algokit_utils.models.application.CompiledTeal.teal", false]], "tealtemplateparams (in module algokit_utils.models.state)": [[29, "algokit_utils.models.state.TealTemplateParams", false]], "template_variables (algokit_utils.applications.app_spec.arc56.arc56contract attribute)": [[10, "algokit_utils.applications.app_spec.arc56.Arc56Contract.template_variables", false]], "templatevariables (class in algokit_utils.applications.app_spec.arc56)": [[10, "algokit_utils.applications.app_spec.arc56.TemplateVariables", false]], "testnet() (algokit_utils.algorand.algorandclient static method)": [[3, "algokit_utils.algorand.AlgorandClient.testnet", false]], "testnetdispenserapiclient (class in algokit_utils.clients.dispenser_api_client)": [[17, "algokit_utils.clients.dispenser_api_client.TestNetDispenserApiClient", false]], "threshold (algokit_utils.models.account.multisigmetadata attribute)": [[23, "algokit_utils.models.account.MultisigMetadata.threshold", false]], "to_abi_method() (algokit_utils.applications.app_spec.arc56.method method)": [[10, "algokit_utils.applications.app_spec.arc56.Method.to_abi_method", false]], "to_json() (algokit_utils.applications.app_spec.arc32.arc32contract method)": [[9, "algokit_utils.applications.app_spec.arc32.Arc32Contract.to_json", false]], "to_json() (algokit_utils.applications.app_spec.arc56.arc56contract method)": [[10, "algokit_utils.applications.app_spec.arc56.Arc56Contract.to_json", false]], "token (algokit_utils.models.network.algoclientnetworkconfig attribute)": [[27, "algokit_utils.models.network.AlgoClientNetworkConfig.token", false]], "total (algokit_utils.assets.asset_manager.assetinformation attribute)": [[14, "algokit_utils.assets.asset_manager.AssetInformation.total", false]], "total (algokit_utils.transactions.transaction_composer.assetcreateparams attribute)": [[35, "algokit_utils.transactions.transaction_composer.AssetCreateParams.total", false]], "total_apps_opted_in (algokit_utils.accounts.account_manager.accountinformation attribute)": [[0, "algokit_utils.accounts.account_manager.AccountInformation.total_apps_opted_in", false]], "total_assets_opted_in (algokit_utils.accounts.account_manager.accountinformation attribute)": [[0, "algokit_utils.accounts.account_manager.AccountInformation.total_assets_opted_in", false]], "total_box_bytes (algokit_utils.accounts.account_manager.accountinformation attribute)": [[0, "algokit_utils.accounts.account_manager.AccountInformation.total_box_bytes", false]], "total_boxes (algokit_utils.accounts.account_manager.accountinformation attribute)": [[0, "algokit_utils.accounts.account_manager.AccountInformation.total_boxes", false]], "total_created_apps (algokit_utils.accounts.account_manager.accountinformation attribute)": [[0, "algokit_utils.accounts.account_manager.AccountInformation.total_created_apps", false]], "total_created_assets (algokit_utils.accounts.account_manager.accountinformation attribute)": [[0, "algokit_utils.accounts.account_manager.AccountInformation.total_created_assets", false]], "trace() (algokit_utils.errors.logic_error.logicerror method)": [[21, "algokit_utils.errors.logic_error.LogicError.trace", false]], "trace_all (algokit_utils.config.updatableconfig property)": [[19, "algokit_utils.config.UpdatableConfig.trace_all", false]], "trace_buffer_size_mb (algokit_utils.config.updatableconfig property)": [[19, "algokit_utils.config.UpdatableConfig.trace_buffer_size_mb", false]], "traces (algokit_utils.errors.logic_error.logicerror attribute)": [[21, "algokit_utils.errors.logic_error.LogicError.traces", false]], "transaction (algokit_utils.transactions.transaction_sender.sendsingletransactionresult attribute)": [[37, "algokit_utils.transactions.transaction_sender.SendSingleTransactionResult.transaction", false]], "transaction_fees() (in module algokit_utils.models.amount)": [[24, "algokit_utils.models.amount.transaction_fees", false]], "transaction_id (algokit_utils.assets.asset_manager.bulkassetoptinoutresult attribute)": [[14, "algokit_utils.assets.asset_manager.BulkAssetOptInOutResult.transaction_id", false]], "transaction_id (algokit_utils.errors.logic_error.logicerror attribute)": [[21, "algokit_utils.errors.logic_error.LogicError.transaction_id", false]], "transaction_id (algokit_utils.errors.logic_error.logicerrordata attribute)": [[21, "algokit_utils.errors.logic_error.LogicErrorData.transaction_id", false]], "transactioncomposer (class in algokit_utils.transactions.transaction_composer)": [[35, "algokit_utils.transactions.transaction_composer.TransactionComposer", false]], "transactioncomposerbuildresult (class in algokit_utils.transactions.transaction_composer)": [[35, "algokit_utils.transactions.transaction_composer.TransactionComposerBuildResult", false]], "transactionnote (in module algokit_utils.models.transaction)": [[30, "algokit_utils.models.transaction.TransactionNote", false]], "transactionnotedata (in module algokit_utils.models.transaction)": [[30, "algokit_utils.models.transaction.TransactionNoteData", false]], "transactions (algokit_utils.transactions.transaction_composer.builttransactions attribute)": [[35, "algokit_utils.transactions.transaction_composer.BuiltTransactions.transactions", false]], "transactions (algokit_utils.transactions.transaction_composer.sendatomictransactioncomposerresults attribute)": [[35, "algokit_utils.transactions.transaction_composer.SendAtomicTransactionComposerResults.transactions", false]], "transactions (algokit_utils.transactions.transaction_composer.transactioncomposerbuildresult attribute)": [[35, "algokit_utils.transactions.transaction_composer.TransactionComposerBuildResult.transactions", false]], "transactions (algokit_utils.transactions.transaction_sender.sendsingletransactionresult attribute)": [[37, "algokit_utils.transactions.transaction_sender.SendSingleTransactionResult.transactions", false]], "transactionsigneraccount (class in algokit_utils.models.account)": [[23, "algokit_utils.models.account.TransactionSignerAccount", false]], "transactionsigneraccountprotocol (class in algokit_utils.protocols.account)": [[31, "algokit_utils.protocols.account.TransactionSignerAccountProtocol", false]], "transactionwrapper (class in algokit_utils.models.transaction)": [[30, "algokit_utils.models.transaction.TransactionWrapper", false]], "tx_id (algokit_utils.clients.dispenser_api_client.dispenserfundresponse attribute)": [[17, "algokit_utils.clients.dispenser_api_client.DispenserFundResponse.tx_id", false]], "tx_id (algokit_utils.transactions.transaction_sender.sendsingletransactionresult attribute)": [[37, "algokit_utils.transactions.transaction_sender.SendSingleTransactionResult.tx_id", false]], "tx_ids (algokit_utils.transactions.transaction_composer.sendatomictransactioncomposerresults attribute)": [[35, "algokit_utils.transactions.transaction_composer.SendAtomicTransactionComposerResults.tx_ids", false]], "tx_ids (algokit_utils.transactions.transaction_sender.sendsingletransactionresult attribute)": [[37, "algokit_utils.transactions.transaction_sender.SendSingleTransactionResult.tx_ids", false]], "tx_info (algokit_utils.applications.abi.abireturn attribute)": [[4, "algokit_utils.applications.abi.ABIReturn.tx_info", false]], "txnparams (in module algokit_utils.transactions.transaction_composer)": [[35, "algokit_utils.transactions.transaction_composer.TxnParams", false]], "type (algokit_utils.applications.app_spec.arc56.defaultvalue attribute)": [[10, "algokit_utils.applications.app_spec.arc56.DefaultValue.type", false]], "type (algokit_utils.applications.app_spec.arc56.eventarg attribute)": [[10, "algokit_utils.applications.app_spec.arc56.EventArg.type", false]], "type (algokit_utils.applications.app_spec.arc56.methodarg attribute)": [[10, "algokit_utils.applications.app_spec.arc56.MethodArg.type", false]], "type (algokit_utils.applications.app_spec.arc56.returns attribute)": [[10, "algokit_utils.applications.app_spec.arc56.Returns.type", false]], "type (algokit_utils.applications.app_spec.arc56.scratchvariables attribute)": [[10, "algokit_utils.applications.app_spec.arc56.ScratchVariables.type", false]], "type (algokit_utils.applications.app_spec.arc56.structfield attribute)": [[10, "algokit_utils.applications.app_spec.arc56.StructField.type", false]], "type (algokit_utils.applications.app_spec.arc56.templatevariables attribute)": [[10, "algokit_utils.applications.app_spec.arc56.TemplateVariables.type", false]], "typedappclientprotocol (class in algokit_utils.protocols.typed_clients)": [[33, "algokit_utils.protocols.typed_clients.TypedAppClientProtocol", false]], "typedappfactoryprotocol (class in algokit_utils.protocols.typed_clients)": [[33, "algokit_utils.protocols.typed_clients.TypedAppFactoryProtocol", false]], "uint (algokit_utils.models.state.datatypeflag attribute)": [[29, "algokit_utils.models.state.DataTypeFlag.UINT", false]], "undictify() (algokit_utils.applications.app_spec.arc32.methodhints static method)": [[9, "algokit_utils.applications.app_spec.arc32.MethodHints.undictify", false]], "unit_name (algokit_utils.assets.asset_manager.assetinformation attribute)": [[14, "algokit_utils.assets.asset_manager.AssetInformation.unit_name", false]], "unit_name (algokit_utils.transactions.transaction_composer.assetcreateparams attribute)": [[35, "algokit_utils.transactions.transaction_composer.AssetCreateParams.unit_name", false]], "unit_name_b64 (algokit_utils.assets.asset_manager.assetinformation attribute)": [[14, "algokit_utils.assets.asset_manager.AssetInformation.unit_name_b64", false]], "updatable (algokit_utils.applications.app_client.appclientcompilationparams attribute)": [[5, "algokit_utils.applications.app_client.AppClientCompilationParams.updatable", false]], "updatable (algokit_utils.applications.app_deployer.appdeploymentmetadata attribute)": [[6, "algokit_utils.applications.app_deployer.AppDeploymentMetaData.updatable", false]], "updatable (algokit_utils.applications.app_deployer.applicationmetadata property)": [[6, "algokit_utils.applications.app_deployer.ApplicationMetaData.updatable", false]], "updatable_template_name (in module algokit_utils.applications.app_manager)": [[8, "algokit_utils.applications.app_manager.UPDATABLE_TEMPLATE_NAME", false]], "updatableconfig (class in algokit_utils.config)": [[19, "algokit_utils.config.UpdatableConfig", false]], "update (algokit_utils.applications.enums.operationperformed attribute)": [[12, "algokit_utils.applications.enums.OperationPerformed.Update", false]], "update_application (algokit_utils.applications.app_spec.arc56.callenum attribute)": [[10, "algokit_utils.applications.app_spec.arc56.CallEnum.UPDATE_APPLICATION", false]], "update_params (algokit_utils.applications.app_deployer.appdeployparams attribute)": [[6, "algokit_utils.applications.app_deployer.AppDeployParams.update_params", false]], "update_result (algokit_utils.applications.app_deployer.appdeployresult attribute)": [[6, "algokit_utils.applications.app_deployer.AppDeployResult.update_result", false]], "update_result (algokit_utils.applications.app_factory.appfactorydeployresult attribute)": [[7, "algokit_utils.applications.app_factory.AppFactoryDeployResult.update_result", false]], "updateapp (algokit_utils.applications.enums.onupdate attribute)": [[12, "algokit_utils.applications.enums.OnUpdate.UpdateApp", false]], "updated_round (algokit_utils.applications.app_deployer.applicationmetadata attribute)": [[6, "algokit_utils.applications.app_deployer.ApplicationMetaData.updated_round", false]], "url (algokit_utils.assets.asset_manager.assetinformation attribute)": [[14, "algokit_utils.assets.asset_manager.AssetInformation.url", false]], "url (algokit_utils.transactions.transaction_composer.assetcreateparams attribute)": [[35, "algokit_utils.transactions.transaction_composer.AssetCreateParams.url", false]], "url_b64 (algokit_utils.assets.asset_manager.assetinformation attribute)": [[14, "algokit_utils.assets.asset_manager.AssetInformation.url_b64", false]], "validity_window (algokit_utils.applications.app_client.commonappcallparams attribute)": [[5, "algokit_utils.applications.app_client.CommonAppCallParams.validity_window", false]], "value (algokit_utils.applications.abi.abireturn attribute)": [[4, "algokit_utils.applications.abi.ABIReturn.value", false]], "value (algokit_utils.applications.abi.boxabivalue attribute)": [[4, "algokit_utils.applications.abi.BoxABIValue.value", false]], "value (algokit_utils.applications.app_spec.arc56.templatevariables attribute)": [[10, "algokit_utils.applications.app_spec.arc56.TemplateVariables.value", false]], "value (algokit_utils.models.application.appstate attribute)": [[25, "algokit_utils.models.application.AppState.value", false]], "value (algokit_utils.models.state.boxvalue attribute)": [[29, "algokit_utils.models.state.BoxValue.value", false]], "value_base64 (algokit_utils.models.application.appstate attribute)": [[25, "algokit_utils.models.application.AppState.value_base64", false]], "value_raw (algokit_utils.models.application.appstate attribute)": [[25, "algokit_utils.models.application.AppState.value_raw", false]], "value_type (algokit_utils.applications.app_spec.arc56.storagekey attribute)": [[10, "algokit_utils.applications.app_spec.arc56.StorageKey.value_type", false]], "value_type (algokit_utils.applications.app_spec.arc56.storagemap attribute)": [[10, "algokit_utils.applications.app_spec.arc56.StorageMap.value_type", false]], "version (algokit_utils.applications.app_deployer.appdeploymentmetadata attribute)": [[6, "algokit_utils.applications.app_deployer.AppDeploymentMetaData.version", false]], "version (algokit_utils.applications.app_deployer.applicationmetadata property)": [[6, "algokit_utils.applications.app_deployer.ApplicationMetaData.version", false]], "version (algokit_utils.applications.app_factory.appfactoryparams attribute)": [[7, "algokit_utils.applications.app_factory.AppFactoryParams.version", false]], "version (algokit_utils.models.account.multisigmetadata attribute)": [[23, "algokit_utils.models.account.MultisigMetadata.version", false]], "vote_first (algokit_utils.transactions.transaction_composer.onlinekeyregistrationparams attribute)": [[35, "algokit_utils.transactions.transaction_composer.OnlineKeyRegistrationParams.vote_first", false]], "vote_key (algokit_utils.transactions.transaction_composer.onlinekeyregistrationparams attribute)": [[35, "algokit_utils.transactions.transaction_composer.OnlineKeyRegistrationParams.vote_key", false]], "vote_key_dilution (algokit_utils.transactions.transaction_composer.onlinekeyregistrationparams attribute)": [[35, "algokit_utils.transactions.transaction_composer.OnlineKeyRegistrationParams.vote_key_dilution", false]], "vote_last (algokit_utils.transactions.transaction_composer.onlinekeyregistrationparams attribute)": [[35, "algokit_utils.transactions.transaction_composer.OnlineKeyRegistrationParams.vote_last", false]], "with_debug() (algokit_utils.config.updatableconfig method)": [[19, "algokit_utils.config.UpdatableConfig.with_debug", false]], "write_bytes (algokit_utils.applications.app_spec.arc56.boxes attribute)": [[10, "algokit_utils.applications.app_spec.arc56.Boxes.write_bytes", false]]}, "objects": {"": [[22, 0, 0, "-", "algokit_utils"]], "algokit_utils": [[1, 0, 0, "-", "accounts"], [3, 0, 0, "-", "algorand"], [13, 0, 0, "-", "applications"], [15, 0, 0, "-", "assets"], [18, 0, 0, "-", "clients"], [19, 0, 0, "-", "config"], [20, 0, 0, "-", "errors"], [26, 0, 0, "-", "models"], [32, 0, 0, "-", "protocols"], [34, 0, 0, "-", "transactions"]], "algokit_utils.accounts": [[0, 0, 0, "-", "account_manager"], [2, 0, 0, "-", "kmd_account_manager"]], "algokit_utils.accounts.account_manager": [[0, 1, 1, "", "AccountInformation"], [0, 1, 1, "", "AccountManager"], [0, 1, 1, "", "EnsureFundedFromTestnetDispenserApiResult"], [0, 1, 1, "", "EnsureFundedResult"]], "algokit_utils.accounts.account_manager.AccountInformation": [[0, 2, 1, "", "address"], [0, 2, 1, "", "amount"], [0, 2, 1, "", "amount_without_pending_rewards"], [0, 2, 1, "", "apps_local_state"], [0, 2, 1, "", "apps_total_extra_pages"], [0, 2, 1, "", "apps_total_schema"], [0, 2, 1, "", "assets"], [0, 2, 1, "", "auth_addr"], [0, 2, 1, "", "closed_at_round"], [0, 2, 1, "", "created_apps"], [0, 2, 1, "", "created_assets"], [0, 2, 1, "", "created_at_round"], [0, 2, 1, "", "deleted"], [0, 2, 1, "", "incentive_eligible"], [0, 2, 1, "", "last_heartbeat"], [0, 2, 1, "", "last_proposed"], [0, 2, 1, "", "min_balance"], [0, 2, 1, "", "participation"], [0, 2, 1, "", "pending_rewards"], [0, 2, 1, "", "reward_base"], [0, 2, 1, "", "rewards"], [0, 2, 1, "", "round"], [0, 2, 1, "", "sig_type"], [0, 2, 1, "", "status"], [0, 2, 1, "", "total_apps_opted_in"], [0, 2, 1, "", "total_assets_opted_in"], [0, 2, 1, "", "total_box_bytes"], [0, 2, 1, "", "total_boxes"], [0, 2, 1, "", "total_created_apps"], [0, 2, 1, "", "total_created_assets"]], "algokit_utils.accounts.account_manager.AccountManager": [[0, 3, 1, "", "dispenser_from_environment"], [0, 3, 1, "", "ensure_funded"], [0, 3, 1, "", "ensure_funded_from_environment"], [0, 3, 1, "", "ensure_funded_from_testnet_dispenser_api"], [0, 3, 1, "", "from_environment"], [0, 3, 1, "", "from_kmd"], [0, 3, 1, "", "from_mnemonic"], [0, 3, 1, "", "get_account"], [0, 3, 1, "", "get_information"], [0, 3, 1, "", "get_signer"], [0, 4, 1, "", "kmd"], [0, 3, 1, "", "localnet_dispenser"], [0, 3, 1, "", "logicsig"], [0, 3, 1, "", "multisig"], [0, 3, 1, "", "random"], [0, 3, 1, "", "rekey_account"], [0, 3, 1, "", "rekeyed"], [0, 3, 1, "", "set_default_signer"], [0, 3, 1, "", "set_signer"], [0, 3, 1, "", "set_signer_from_account"], [0, 3, 1, "", "set_signers"]], "algokit_utils.accounts.kmd_account_manager": [[2, 1, 1, "", "KmdAccount"], [2, 1, 1, "", "KmdAccountManager"]], "algokit_utils.accounts.kmd_account_manager.KmdAccountManager": [[2, 3, 1, "", "get_localnet_dispenser_account"], [2, 3, 1, "", "get_or_create_wallet_account"], [2, 3, 1, "", "get_wallet_account"], [2, 3, 1, "", "kmd"]], "algokit_utils.algorand": [[3, 1, 1, "", "AlgorandClient"]], "algokit_utils.algorand.AlgorandClient": [[3, 4, 1, "", "account"], [3, 4, 1, "", "app"], [3, 4, 1, "", "app_deployer"], [3, 4, 1, "", "asset"], [3, 4, 1, "", "client"], [3, 4, 1, "", "create_transaction"], [3, 3, 1, "", "default_localnet"], [3, 3, 1, "", "from_clients"], [3, 3, 1, "", "from_config"], [3, 3, 1, "", "from_environment"], [3, 3, 1, "", "get_suggested_params"], [3, 3, 1, "", "mainnet"], [3, 3, 1, "", "new_group"], [3, 4, 1, "", "send"], [3, 3, 1, "", "set_default_signer"], [3, 3, 1, "", "set_default_validity_window"], [3, 3, 1, "", "set_signer"], [3, 3, 1, "", "set_signer_from_account"], [3, 3, 1, "", "set_suggested_params_cache"], [3, 3, 1, "", "set_suggested_params_cache_timeout"], [3, 3, 1, "", "testnet"]], "algokit_utils.applications": [[4, 0, 0, "-", "abi"], [5, 0, 0, "-", "app_client"], [6, 0, 0, "-", "app_deployer"], [7, 0, 0, "-", "app_factory"], [8, 0, 0, "-", "app_manager"], [11, 0, 0, "-", "app_spec"], [12, 0, 0, "-", "enums"]], "algokit_utils.applications.abi": [[4, 5, 1, "", "ABIArgumentType"], [4, 1, 1, "", "ABIReturn"], [4, 5, 1, "", "ABIStruct"], [4, 5, 1, "", "ABIType"], [4, 5, 1, "", "ABIValue"], [4, 5, 1, "", "Arc56ReturnValueType"], [4, 1, 1, "", "BoxABIValue"], [4, 6, 1, "", "get_abi_decoded_value"], [4, 6, 1, "", "get_abi_encoded_value"], [4, 6, 1, "", "get_abi_struct_from_abi_tuple"], [4, 6, 1, "", "get_abi_tuple_from_abi_struct"], [4, 6, 1, "", "get_abi_tuple_type_from_abi_struct_definition"], [4, 6, 1, "", "get_arc56_value"]], "algokit_utils.applications.abi.ABIReturn": [[4, 2, 1, "", "decode_error"], [4, 3, 1, "", "get_arc56_value"], [4, 4, 1, "", "is_success"], [4, 2, 1, "", "method"], [4, 2, 1, "", "raw_value"], [4, 2, 1, "", "tx_info"], [4, 2, 1, "", "value"]], "algokit_utils.applications.abi.BoxABIValue": [[4, 2, 1, "", "name"], [4, 2, 1, "", "value"]], "algokit_utils.applications.app_client": [[5, 1, 1, "", "AppClient"], [5, 1, 1, "", "AppClientBareCallCreateParams"], [5, 1, 1, "", "AppClientBareCallParams"], [5, 1, 1, "", "AppClientCompilationParams"], [5, 1, 1, "", "AppClientCompilationResult"], [5, 1, 1, "", "AppClientCreateSchema"], [5, 1, 1, "", "AppClientMethodCallCreateParams"], [5, 1, 1, "", "AppClientMethodCallParams"], [5, 1, 1, "", "AppClientParams"], [5, 1, 1, "", "BaseAppClientMethodCallParams"], [5, 1, 1, "", "CommonAppCallCreateParams"], [5, 1, 1, "", "CommonAppCallParams"], [5, 5, 1, "", "CreateOnComplete"], [5, 1, 1, "", "FundAppAccountParams"], [5, 6, 1, "", "get_constant_block_offset"]], "algokit_utils.applications.app_client.AppClient": [[5, 4, 1, "", "algorand"], [5, 4, 1, "", "app_address"], [5, 4, 1, "", "app_id"], [5, 4, 1, "", "app_name"], [5, 4, 1, "", "app_spec"], [5, 3, 1, "", "clone"], [5, 3, 1, "", "compile"], [5, 3, 1, "", "compile_app"], [5, 4, 1, "", "create_transaction"], [5, 3, 1, "", "export_source_maps"], [5, 3, 1, "", "from_creator_and_name"], [5, 3, 1, "", "from_network"], [5, 3, 1, "", "fund_app_account"], [5, 3, 1, "", "get_box_names"], [5, 3, 1, "", "get_box_value"], [5, 3, 1, "", "get_box_value_from_abi_type"], [5, 3, 1, "", "get_box_values"], [5, 3, 1, "", "get_box_values_from_abi_type"], [5, 3, 1, "", "get_global_state"], [5, 3, 1, "", "get_local_state"], [5, 3, 1, "", "import_source_maps"], [5, 3, 1, "", "normalise_app_spec"], [5, 4, 1, "", "params"], [5, 4, 1, "", "send"], [5, 4, 1, "", "state"]], "algokit_utils.applications.app_client.AppClientBareCallCreateParams": [[5, 2, 1, "", "on_complete"]], "algokit_utils.applications.app_client.AppClientBareCallParams": [[5, 2, 1, "", "args"]], "algokit_utils.applications.app_client.AppClientCompilationParams": [[5, 2, 1, "", "deletable"], [5, 2, 1, "", "deploy_time_params"], [5, 2, 1, "", "updatable"]], "algokit_utils.applications.app_client.AppClientCompilationResult": [[5, 2, 1, "", "approval_program"], [5, 2, 1, "", "clear_state_program"], [5, 2, 1, "", "compiled_approval"], [5, 2, 1, "", "compiled_clear"]], "algokit_utils.applications.app_client.AppClientCreateSchema": [[5, 2, 1, "", "extra_program_pages"], [5, 2, 1, "", "schema"]], "algokit_utils.applications.app_client.AppClientMethodCallCreateParams": [[5, 2, 1, "", "on_complete"]], "algokit_utils.applications.app_client.AppClientParams": [[5, 2, 1, "", "algorand"], [5, 2, 1, "", "app_id"], [5, 2, 1, "", "app_name"], [5, 2, 1, "", "app_spec"], [5, 2, 1, "", "approval_source_map"], [5, 2, 1, "", "clear_source_map"], [5, 2, 1, "", "default_sender"], [5, 2, 1, "", "default_signer"]], "algokit_utils.applications.app_client.BaseAppClientMethodCallParams": [[5, 2, 1, "", "args"], [5, 2, 1, "", "method"]], "algokit_utils.applications.app_client.CommonAppCallCreateParams": [[5, 2, 1, "", "on_complete"]], "algokit_utils.applications.app_client.CommonAppCallParams": [[5, 2, 1, "", "account_references"], [5, 2, 1, "", "app_references"], [5, 2, 1, "", "asset_references"], [5, 2, 1, "", "box_references"], [5, 2, 1, "", "extra_fee"], [5, 2, 1, "", "first_valid_round"], [5, 2, 1, "", "last_valid_round"], [5, 2, 1, "", "lease"], [5, 2, 1, "", "max_fee"], [5, 2, 1, "", "note"], [5, 2, 1, "", "on_complete"], [5, 2, 1, "", "rekey_to"], [5, 2, 1, "", "sender"], [5, 2, 1, "", "signer"], [5, 2, 1, "", "static_fee"], [5, 2, 1, "", "validity_window"]], "algokit_utils.applications.app_client.FundAppAccountParams": [[5, 2, 1, "", "amount"], [5, 2, 1, "", "close_remainder_to"]], "algokit_utils.applications.app_deployer": [[6, 5, 1, "", "APP_DEPLOY_NOTE_DAPP"], [6, 1, 1, "", "AppDeployParams"], [6, 1, 1, "", "AppDeployResult"], [6, 1, 1, "", "AppDeployer"], [6, 1, 1, "", "AppDeploymentMetaData"], [6, 1, 1, "", "ApplicationLookup"], [6, 1, 1, "", "ApplicationMetaData"], [6, 1, 1, "", "ApplicationReference"]], "algokit_utils.applications.app_deployer.AppDeployParams": [[6, 2, 1, "", "create_params"], [6, 2, 1, "", "delete_params"], [6, 2, 1, "", "deploy_time_params"], [6, 2, 1, "", "existing_deployments"], [6, 2, 1, "", "ignore_cache"], [6, 2, 1, "", "max_fee"], [6, 2, 1, "", "metadata"], [6, 2, 1, "", "on_schema_break"], [6, 2, 1, "", "on_update"], [6, 2, 1, "", "send_params"], [6, 2, 1, "", "update_params"]], "algokit_utils.applications.app_deployer.AppDeployResult": [[6, 2, 1, "", "app"], [6, 2, 1, "", "create_result"], [6, 2, 1, "", "delete_result"], [6, 2, 1, "", "operation_performed"], [6, 2, 1, "", "update_result"]], "algokit_utils.applications.app_deployer.AppDeployer": [[6, 3, 1, "", "deploy"], [6, 3, 1, "", "get_creator_apps_by_name"]], "algokit_utils.applications.app_deployer.AppDeploymentMetaData": [[6, 2, 1, "", "deletable"], [6, 3, 1, "", "dictify"], [6, 2, 1, "", "name"], [6, 2, 1, "", "updatable"], [6, 2, 1, "", "version"]], "algokit_utils.applications.app_deployer.ApplicationLookup": [[6, 2, 1, "", "apps"], [6, 2, 1, "", "creator"]], "algokit_utils.applications.app_deployer.ApplicationMetaData": [[6, 4, 1, "", "app_address"], [6, 4, 1, "", "app_id"], [6, 2, 1, "", "created_round"], [6, 4, 1, "", "deletable"], [6, 2, 1, "", "deleted"], [6, 2, 1, "", "deploy_metadata"], [6, 4, 1, "", "name"], [6, 2, 1, "", "reference"], [6, 4, 1, "", "updatable"], [6, 2, 1, "", "updated_round"], [6, 4, 1, "", "version"]], "algokit_utils.applications.app_deployer.ApplicationReference": [[6, 2, 1, "", "app_address"], [6, 2, 1, "", "app_id"]], "algokit_utils.applications.app_factory": [[7, 1, 1, "", "AppFactory"], [7, 1, 1, "", "AppFactoryCreateMethodCallParams"], [7, 1, 1, "", "AppFactoryCreateMethodCallResult"], [7, 1, 1, "", "AppFactoryCreateParams"], [7, 1, 1, "", "AppFactoryDeployResult"], [7, 1, 1, "", "AppFactoryParams"], [7, 1, 1, "", "SendAppCreateFactoryTransactionResult"], [7, 1, 1, "", "SendAppFactoryTransactionResult"], [7, 1, 1, "", "SendAppUpdateFactoryTransactionResult"]], "algokit_utils.applications.app_factory.AppFactory": [[7, 4, 1, "", "algorand"], [7, 4, 1, "", "app_name"], [7, 4, 1, "", "app_spec"], [7, 3, 1, "", "compile"], [7, 4, 1, "", "create_transaction"], [7, 3, 1, "", "deploy"], [7, 3, 1, "", "export_source_maps"], [7, 3, 1, "", "get_app_client_by_creator_and_name"], [7, 3, 1, "", "get_app_client_by_id"], [7, 3, 1, "", "import_source_maps"], [7, 4, 1, "", "params"], [7, 4, 1, "", "send"]], "algokit_utils.applications.app_factory.AppFactoryCreateMethodCallResult": [[7, 2, 1, "", "abi_return"], [7, 2, 1, "", "app_address"], [7, 2, 1, "", "app_id"], [7, 2, 1, "", "compiled_approval"], [7, 2, 1, "", "compiled_clear"]], "algokit_utils.applications.app_factory.AppFactoryCreateParams": [[7, 2, 1, "", "on_complete"]], "algokit_utils.applications.app_factory.AppFactoryDeployResult": [[7, 2, 1, "", "app"], [7, 2, 1, "", "create_result"], [7, 2, 1, "", "delete_result"], [7, 3, 1, "", "from_deploy_result"], [7, 2, 1, "", "operation_performed"], [7, 2, 1, "", "update_result"]], "algokit_utils.applications.app_factory.AppFactoryParams": [[7, 2, 1, "", "algorand"], [7, 2, 1, "", "app_name"], [7, 2, 1, "", "app_spec"], [7, 2, 1, "", "compilation_params"], [7, 2, 1, "", "default_sender"], [7, 2, 1, "", "default_signer"], [7, 2, 1, "", "version"]], "algokit_utils.applications.app_manager": [[8, 1, 1, "", "AppManager"], [8, 5, 1, "", "DELETABLE_TEMPLATE_NAME"], [8, 5, 1, "", "UPDATABLE_TEMPLATE_NAME"]], "algokit_utils.applications.app_manager.AppManager": [[8, 3, 1, "", "compile_teal"], [8, 3, 1, "", "compile_teal_template"], [8, 3, 1, "", "decode_app_state"], [8, 3, 1, "", "get_abi_return"], [8, 3, 1, "", "get_box_names"], [8, 3, 1, "", "get_box_reference"], [8, 3, 1, "", "get_box_value"], [8, 3, 1, "", "get_box_value_from_abi_type"], [8, 3, 1, "", "get_box_values"], [8, 3, 1, "", "get_box_values_from_abi_type"], [8, 3, 1, "", "get_by_id"], [8, 3, 1, "", "get_compilation_result"], [8, 3, 1, "", "get_global_state"], [8, 3, 1, "", "get_local_state"], [8, 3, 1, "", "replace_teal_template_deploy_time_control_params"], [8, 3, 1, "", "replace_template_variables"], [8, 3, 1, "", "strip_teal_comments"]], "algokit_utils.applications.app_spec": [[9, 0, 0, "-", "arc32"], [10, 0, 0, "-", "arc56"]], "algokit_utils.applications.app_spec.arc32": [[9, 5, 1, "", "AppSpecStateDict"], [9, 1, 1, "", "Arc32Contract"], [9, 1, 1, "", "CallConfig"], [9, 1, 1, "", "DefaultArgumentDict"], [9, 5, 1, "", "DefaultArgumentType"], [9, 5, 1, "", "MethodConfigDict"], [9, 1, 1, "", "MethodHints"], [9, 5, 1, "", "OnCompleteActionName"], [9, 5, 1, "", "StateDict"], [9, 1, 1, "", "StructArgDict"]], "algokit_utils.applications.app_spec.arc32.Arc32Contract": [[9, 2, 1, "", "approval_program"], [9, 2, 1, "", "bare_call_config"], [9, 2, 1, "", "clear_program"], [9, 2, 1, "", "contract"], [9, 3, 1, "", "dictify"], [9, 3, 1, "", "export"], [9, 3, 1, "", "from_json"], [9, 2, 1, "", "global_state_schema"], [9, 2, 1, "", "hints"], [9, 2, 1, "", "local_state_schema"], [9, 2, 1, "", "schema"], [9, 3, 1, "", "to_json"]], "algokit_utils.applications.app_spec.arc32.CallConfig": [[9, 2, 1, "", "ALL"], [9, 2, 1, "", "CALL"], [9, 2, 1, "", "CREATE"], [9, 2, 1, "", "NEVER"]], "algokit_utils.applications.app_spec.arc32.DefaultArgumentDict": [[9, 2, 1, "", "data"], [9, 2, 1, "", "source"]], "algokit_utils.applications.app_spec.arc32.MethodHints": [[9, 2, 1, "", "call_config"], [9, 2, 1, "", "default_arguments"], [9, 3, 1, "", "dictify"], [9, 3, 1, "", "empty"], [9, 2, 1, "", "read_only"], [9, 2, 1, "", "structs"], [9, 3, 1, "", "undictify"]], "algokit_utils.applications.app_spec.arc32.StructArgDict": [[9, 2, 1, "", "elements"], [9, 2, 1, "", "name"]], "algokit_utils.applications.app_spec.arc56": [[10, 1, 1, "", "Actions"], [10, 1, 1, "", "Arc56Contract"], [10, 1, 1, "", "BareActions"], [10, 1, 1, "", "Boxes"], [10, 1, 1, "", "ByteCode"], [10, 1, 1, "", "CallEnum"], [10, 1, 1, "", "Compiler"], [10, 1, 1, "", "CompilerInfo"], [10, 1, 1, "", "CompilerVersion"], [10, 1, 1, "", "CreateEnum"], [10, 1, 1, "", "DefaultValue"], [10, 1, 1, "", "Event"], [10, 1, 1, "", "EventArg"], [10, 1, 1, "", "Global"], [10, 1, 1, "", "Keys"], [10, 1, 1, "", "Local"], [10, 1, 1, "", "Maps"], [10, 1, 1, "", "Method"], [10, 1, 1, "", "MethodArg"], [10, 1, 1, "", "Network"], [10, 1, 1, "", "PcOffsetMethod"], [10, 1, 1, "", "ProgramSourceInfo"], [10, 1, 1, "", "Recommendations"], [10, 1, 1, "", "Returns"], [10, 1, 1, "", "Schema"], [10, 1, 1, "", "ScratchVariables"], [10, 1, 1, "", "Source"], [10, 1, 1, "", "SourceInfo"], [10, 1, 1, "", "SourceInfoModel"], [10, 1, 1, "", "State"], [10, 1, 1, "", "StorageKey"], [10, 1, 1, "", "StorageMap"], [10, 1, 1, "", "StructField"], [10, 1, 1, "", "TemplateVariables"]], "algokit_utils.applications.app_spec.arc56.Actions": [[10, 2, 1, "", "call"], [10, 2, 1, "", "create"], [10, 3, 1, "", "from_dict"]], "algokit_utils.applications.app_spec.arc56.Arc56Contract": [[10, 2, 1, "", "arcs"], [10, 2, 1, "", "bare_actions"], [10, 2, 1, "", "byte_code"], [10, 2, 1, "", "compiler_info"], [10, 2, 1, "", "desc"], [10, 3, 1, "", "dictify"], [10, 2, 1, "", "events"], [10, 3, 1, "", "from_arc32"], [10, 3, 1, "", "from_dict"], [10, 3, 1, "", "from_json"], [10, 3, 1, "", "get_abi_struct_from_abi_tuple"], [10, 3, 1, "", "get_arc56_method"], [10, 2, 1, "", "methods"], [10, 2, 1, "", "name"], [10, 2, 1, "", "networks"], [10, 2, 1, "", "scratch_variables"], [10, 2, 1, "", "source"], [10, 2, 1, "", "source_info"], [10, 2, 1, "", "state"], [10, 2, 1, "", "structs"], [10, 2, 1, "", "template_variables"], [10, 3, 1, "", "to_json"]], "algokit_utils.applications.app_spec.arc56.BareActions": [[10, 2, 1, "", "call"], [10, 2, 1, "", "create"], [10, 3, 1, "", "from_dict"]], "algokit_utils.applications.app_spec.arc56.Boxes": [[10, 2, 1, "", "app"], [10, 3, 1, "", "from_dict"], [10, 2, 1, "", "key"], [10, 2, 1, "", "read_bytes"], [10, 2, 1, "", "write_bytes"]], "algokit_utils.applications.app_spec.arc56.ByteCode": [[10, 2, 1, "", "approval"], [10, 2, 1, "", "clear"], [10, 3, 1, "", "from_dict"]], "algokit_utils.applications.app_spec.arc56.CallEnum": [[10, 2, 1, "", "CLEAR_STATE"], [10, 2, 1, "", "CLOSE_OUT"], [10, 2, 1, "", "DELETE_APPLICATION"], [10, 2, 1, "", "NO_OP"], [10, 2, 1, "", "OPT_IN"], [10, 2, 1, "", "UPDATE_APPLICATION"]], "algokit_utils.applications.app_spec.arc56.Compiler": [[10, 2, 1, "", "ALGOD"], [10, 2, 1, "", "PUYA"]], "algokit_utils.applications.app_spec.arc56.CompilerInfo": [[10, 2, 1, "", "compiler"], [10, 2, 1, "", "compiler_version"], [10, 3, 1, "", "from_dict"]], "algokit_utils.applications.app_spec.arc56.CompilerVersion": [[10, 2, 1, "", "commit_hash"], [10, 3, 1, "", "from_dict"], [10, 2, 1, "", "major"], [10, 2, 1, "", "minor"], [10, 2, 1, "", "patch"]], "algokit_utils.applications.app_spec.arc56.CreateEnum": [[10, 2, 1, "", "DELETE_APPLICATION"], [10, 2, 1, "", "NO_OP"], [10, 2, 1, "", "OPT_IN"]], "algokit_utils.applications.app_spec.arc56.DefaultValue": [[10, 2, 1, "", "data"], [10, 3, 1, "", "from_dict"], [10, 2, 1, "", "source"], [10, 2, 1, "", "type"]], "algokit_utils.applications.app_spec.arc56.Event": [[10, 2, 1, "", "args"], [10, 2, 1, "", "desc"], [10, 3, 1, "", "from_dict"], [10, 2, 1, "", "name"]], "algokit_utils.applications.app_spec.arc56.EventArg": [[10, 2, 1, "", "desc"], [10, 3, 1, "", "from_dict"], [10, 2, 1, "", "name"], [10, 2, 1, "", "struct"], [10, 2, 1, "", "type"]], "algokit_utils.applications.app_spec.arc56.Global": [[10, 2, 1, "", "bytes"], [10, 3, 1, "", "from_dict"], [10, 2, 1, "", "ints"]], "algokit_utils.applications.app_spec.arc56.Keys": [[10, 2, 1, "", "box"], [10, 3, 1, "", "from_dict"], [10, 2, 1, "", "global_state"], [10, 2, 1, "", "local_state"]], "algokit_utils.applications.app_spec.arc56.Local": [[10, 2, 1, "", "bytes"], [10, 3, 1, "", "from_dict"], [10, 2, 1, "", "ints"]], "algokit_utils.applications.app_spec.arc56.Maps": [[10, 2, 1, "", "box"], [10, 3, 1, "", "from_dict"], [10, 2, 1, "", "global_state"], [10, 2, 1, "", "local_state"]], "algokit_utils.applications.app_spec.arc56.Method": [[10, 2, 1, "", "actions"], [10, 2, 1, "", "args"], [10, 2, 1, "", "desc"], [10, 2, 1, "", "events"], [10, 3, 1, "", "from_dict"], [10, 2, 1, "", "name"], [10, 2, 1, "", "readonly"], [10, 2, 1, "", "recommendations"], [10, 2, 1, "", "returns"], [10, 3, 1, "", "to_abi_method"]], "algokit_utils.applications.app_spec.arc56.MethodArg": [[10, 2, 1, "", "default_value"], [10, 2, 1, "", "desc"], [10, 3, 1, "", "from_dict"], [10, 2, 1, "", "name"], [10, 2, 1, "", "struct"], [10, 2, 1, "", "type"]], "algokit_utils.applications.app_spec.arc56.Network": [[10, 2, 1, "", "app_id"], [10, 3, 1, "", "from_dict"]], "algokit_utils.applications.app_spec.arc56.PcOffsetMethod": [[10, 2, 1, "", "CBLOCKS"], [10, 2, 1, "", "NONE"]], "algokit_utils.applications.app_spec.arc56.ProgramSourceInfo": [[10, 3, 1, "", "from_dict"], [10, 2, 1, "", "pc_offset_method"], [10, 2, 1, "", "source_info"]], "algokit_utils.applications.app_spec.arc56.Recommendations": [[10, 2, 1, "", "accounts"], [10, 2, 1, "", "apps"], [10, 2, 1, "", "assets"], [10, 2, 1, "", "boxes"], [10, 3, 1, "", "from_dict"], [10, 2, 1, "", "inner_transaction_count"]], "algokit_utils.applications.app_spec.arc56.Returns": [[10, 2, 1, "", "desc"], [10, 3, 1, "", "from_dict"], [10, 2, 1, "", "struct"], [10, 2, 1, "", "type"]], "algokit_utils.applications.app_spec.arc56.Schema": [[10, 3, 1, "", "from_dict"], [10, 2, 1, "", "global_state"], [10, 2, 1, "", "local_state"]], "algokit_utils.applications.app_spec.arc56.ScratchVariables": [[10, 3, 1, "", "from_dict"], [10, 2, 1, "", "slot"], [10, 2, 1, "", "type"]], "algokit_utils.applications.app_spec.arc56.Source": [[10, 2, 1, "", "approval"], [10, 2, 1, "", "clear"], [10, 3, 1, "", "from_dict"], [10, 3, 1, "", "get_decoded_approval"], [10, 3, 1, "", "get_decoded_clear"]], "algokit_utils.applications.app_spec.arc56.SourceInfo": [[10, 2, 1, "", "error_message"], [10, 3, 1, "", "from_dict"], [10, 2, 1, "", "pc"], [10, 2, 1, "", "source"], [10, 2, 1, "", "teal"]], "algokit_utils.applications.app_spec.arc56.SourceInfoModel": [[10, 2, 1, "", "approval"], [10, 2, 1, "", "clear"], [10, 3, 1, "", "from_dict"]], "algokit_utils.applications.app_spec.arc56.State": [[10, 3, 1, "", "from_dict"], [10, 2, 1, "", "keys"], [10, 2, 1, "", "maps"], [10, 2, 1, "", "schema"]], "algokit_utils.applications.app_spec.arc56.StorageKey": [[10, 2, 1, "", "desc"], [10, 3, 1, "", "from_dict"], [10, 2, 1, "", "key"], [10, 2, 1, "", "key_type"], [10, 2, 1, "", "value_type"]], "algokit_utils.applications.app_spec.arc56.StorageMap": [[10, 2, 1, "", "desc"], [10, 3, 1, "", "from_dict"], [10, 2, 1, "", "key_type"], [10, 2, 1, "", "prefix"], [10, 2, 1, "", "value_type"]], "algokit_utils.applications.app_spec.arc56.StructField": [[10, 3, 1, "", "from_dict"], [10, 2, 1, "", "name"], [10, 2, 1, "", "type"]], "algokit_utils.applications.app_spec.arc56.TemplateVariables": [[10, 3, 1, "", "from_dict"], [10, 2, 1, "", "type"], [10, 2, 1, "", "value"]], "algokit_utils.applications.enums": [[12, 1, 1, "", "OnSchemaBreak"], [12, 1, 1, "", "OnUpdate"], [12, 1, 1, "", "OperationPerformed"]], "algokit_utils.applications.enums.OnSchemaBreak": [[12, 2, 1, "", "AppendApp"], [12, 2, 1, "", "Fail"], [12, 2, 1, "", "ReplaceApp"]], "algokit_utils.applications.enums.OnUpdate": [[12, 2, 1, "", "AppendApp"], [12, 2, 1, "", "Fail"], [12, 2, 1, "", "ReplaceApp"], [12, 2, 1, "", "UpdateApp"]], "algokit_utils.applications.enums.OperationPerformed": [[12, 2, 1, "", "Create"], [12, 2, 1, "", "Nothing"], [12, 2, 1, "", "Replace"], [12, 2, 1, "", "Update"]], "algokit_utils.assets": [[14, 0, 0, "-", "asset_manager"]], "algokit_utils.assets.asset_manager": [[14, 1, 1, "", "AccountAssetInformation"], [14, 1, 1, "", "AssetInformation"], [14, 1, 1, "", "AssetManager"], [14, 1, 1, "", "BulkAssetOptInOutResult"]], "algokit_utils.assets.asset_manager.AccountAssetInformation": [[14, 2, 1, "", "asset_id"], [14, 2, 1, "", "balance"], [14, 2, 1, "", "frozen"], [14, 2, 1, "", "round"]], "algokit_utils.assets.asset_manager.AssetInformation": [[14, 2, 1, "", "asset_id"], [14, 2, 1, "", "asset_name"], [14, 2, 1, "", "asset_name_b64"], [14, 2, 1, "", "clawback"], [14, 2, 1, "", "creator"], [14, 2, 1, "", "decimals"], [14, 2, 1, "", "default_frozen"], [14, 2, 1, "", "freeze"], [14, 2, 1, "", "manager"], [14, 2, 1, "", "metadata_hash"], [14, 2, 1, "", "reserve"], [14, 2, 1, "", "total"], [14, 2, 1, "", "unit_name"], [14, 2, 1, "", "unit_name_b64"], [14, 2, 1, "", "url"], [14, 2, 1, "", "url_b64"]], "algokit_utils.assets.asset_manager.AssetManager": [[14, 3, 1, "", "bulk_opt_in"], [14, 3, 1, "", "bulk_opt_out"], [14, 3, 1, "", "get_account_information"], [14, 3, 1, "", "get_by_id"]], "algokit_utils.assets.asset_manager.BulkAssetOptInOutResult": [[14, 2, 1, "", "asset_id"], [14, 2, 1, "", "transaction_id"]], "algokit_utils.clients": [[16, 0, 0, "-", "client_manager"], [17, 0, 0, "-", "dispenser_api_client"]], "algokit_utils.clients.client_manager": [[16, 1, 1, "", "AlgoSdkClients"], [16, 1, 1, "", "ClientManager"], [16, 1, 1, "", "NetworkDetail"]], "algokit_utils.clients.client_manager.AlgoSdkClients": [[16, 2, 1, "", "algod"], [16, 2, 1, "", "indexer"], [16, 2, 1, "", "kmd"]], "algokit_utils.clients.client_manager.ClientManager": [[16, 4, 1, "", "algod"], [16, 3, 1, "", "genesis_id_is_localnet"], [16, 3, 1, "", "get_algod_client"], [16, 3, 1, "", "get_algod_client_from_environment"], [16, 3, 1, "", "get_algod_config_from_environment"], [16, 3, 1, "", "get_algonode_config"], [16, 3, 1, "", "get_app_client_by_creator_and_name"], [16, 3, 1, "", "get_app_client_by_id"], [16, 3, 1, "", "get_app_client_by_network"], [16, 3, 1, "", "get_app_factory"], [16, 3, 1, "", "get_config_from_environment_or_localnet"], [16, 3, 1, "", "get_default_localnet_config"], [16, 3, 1, "", "get_indexer_client"], [16, 3, 1, "", "get_indexer_client_from_environment"], [16, 3, 1, "", "get_indexer_config_from_environment"], [16, 3, 1, "", "get_kmd_client"], [16, 3, 1, "", "get_kmd_client_from_environment"], [16, 3, 1, "", "get_kmd_config_from_environment"], [16, 3, 1, "", "get_testnet_dispenser"], [16, 3, 1, "", "get_typed_app_client_by_creator_and_name"], [16, 3, 1, "", "get_typed_app_client_by_id"], [16, 3, 1, "", "get_typed_app_client_by_network"], [16, 3, 1, "", "get_typed_app_factory"], [16, 4, 1, "", "indexer"], [16, 4, 1, "", "indexer_if_present"], [16, 3, 1, "", "is_localnet"], [16, 3, 1, "", "is_mainnet"], [16, 3, 1, "", "is_testnet"], [16, 4, 1, "", "kmd"], [16, 3, 1, "", "network"]], "algokit_utils.clients.client_manager.NetworkDetail": [[16, 2, 1, "", "genesis_hash"], [16, 2, 1, "", "genesis_id"], [16, 2, 1, "", "is_localnet"], [16, 2, 1, "", "is_mainnet"], [16, 2, 1, "", "is_testnet"]], "algokit_utils.clients.dispenser_api_client": [[17, 5, 1, "", "DISPENSER_ACCESS_TOKEN_KEY"], [17, 5, 1, "", "DISPENSER_ASSETS"], [17, 5, 1, "", "DISPENSER_REQUEST_TIMEOUT"], [17, 1, 1, "", "DispenserApiConfig"], [17, 1, 1, "", "DispenserAsset"], [17, 1, 1, "", "DispenserAssetName"], [17, 1, 1, "", "DispenserFundResponse"], [17, 1, 1, "", "DispenserLimitResponse"], [17, 1, 1, "", "TestNetDispenserApiClient"]], "algokit_utils.clients.dispenser_api_client.DispenserApiConfig": [[17, 2, 1, "", "BASE_URL"]], "algokit_utils.clients.dispenser_api_client.DispenserAsset": [[17, 2, 1, "", "asset_id"], [17, 2, 1, "", "decimals"], [17, 2, 1, "", "description"]], "algokit_utils.clients.dispenser_api_client.DispenserAssetName": [[17, 2, 1, "", "ALGO"]], "algokit_utils.clients.dispenser_api_client.DispenserFundResponse": [[17, 2, 1, "", "amount"], [17, 2, 1, "", "tx_id"]], "algokit_utils.clients.dispenser_api_client.DispenserLimitResponse": [[17, 2, 1, "", "amount"]], "algokit_utils.clients.dispenser_api_client.TestNetDispenserApiClient": [[17, 2, 1, "", "auth_token"], [17, 3, 1, "", "fund"], [17, 3, 1, "", "get_limit"], [17, 3, 1, "", "refund"], [17, 2, 1, "", "request_timeout"]], "algokit_utils.config": [[19, 5, 1, "", "ALGOKIT_CONFIG_FILENAME"], [19, 5, 1, "", "ALGOKIT_PROJECT_ROOT"], [19, 1, 1, "", "AlgoKitLogger"], [19, 1, 1, "", "UpdatableConfig"], [19, 5, 1, "", "config"]], "algokit_utils.config.AlgoKitLogger": [[19, 3, 1, "", "get_null_logger"]], "algokit_utils.config.UpdatableConfig": [[19, 3, 1, "", "configure"], [19, 4, 1, "", "debug"], [19, 4, 1, "", "logger"], [19, 4, 1, "", "populate_app_call_resource"], [19, 4, 1, "", "project_root"], [19, 4, 1, "", "trace_all"], [19, 4, 1, "", "trace_buffer_size_mb"], [19, 3, 1, "", "with_debug"]], "algokit_utils.errors": [[21, 0, 0, "-", "logic_error"]], "algokit_utils.errors.logic_error": [[21, 7, 1, "", "LogicError"], [21, 1, 1, "", "LogicErrorData"], [21, 6, 1, "", "parse_logic_error"]], "algokit_utils.errors.logic_error.LogicError": [[21, 2, 1, "", "line_no"], [21, 2, 1, "", "lines"], [21, 2, 1, "", "logic_error"], [21, 2, 1, "", "logic_error_str"], [21, 2, 1, "", "message"], [21, 2, 1, "", "pc"], [21, 2, 1, "", "source_map"], [21, 3, 1, "", "trace"], [21, 2, 1, "", "traces"], [21, 2, 1, "", "transaction_id"]], "algokit_utils.errors.logic_error.LogicErrorData": [[21, 2, 1, "", "message"], [21, 2, 1, "", "pc"], [21, 2, 1, "", "transaction_id"]], "algokit_utils.models": [[23, 0, 0, "-", "account"], [24, 0, 0, "-", "amount"], [25, 0, 0, "-", "application"], [27, 0, 0, "-", "network"], [28, 0, 0, "-", "simulate"], [29, 0, 0, "-", "state"], [30, 0, 0, "-", "transaction"]], "algokit_utils.models.account": [[23, 5, 1, "", "DISPENSER_ACCOUNT_NAME"], [23, 1, 1, "", "LogicSigAccount"], [23, 1, 1, "", "MultiSigAccount"], [23, 1, 1, "", "MultisigMetadata"], [23, 1, 1, "", "SigningAccount"], [23, 1, 1, "", "TransactionSignerAccount"]], "algokit_utils.models.account.LogicSigAccount": [[23, 4, 1, "", "address"], [23, 4, 1, "", "lsig"], [23, 4, 1, "", "signer"]], "algokit_utils.models.account.MultiSigAccount": [[23, 4, 1, "", "address"], [23, 4, 1, "", "multisig"], [23, 4, 1, "", "params"], [23, 3, 1, "", "sign"], [23, 4, 1, "", "signer"], [23, 4, 1, "", "signing_accounts"]], "algokit_utils.models.account.MultisigMetadata": [[23, 2, 1, "", "addresses"], [23, 2, 1, "", "threshold"], [23, 2, 1, "", "version"]], "algokit_utils.models.account.SigningAccount": [[23, 2, 1, "", "address"], [23, 3, 1, "", "new_account"], [23, 2, 1, "", "private_key"], [23, 4, 1, "", "public_key"], [23, 4, 1, "", "signer"]], "algokit_utils.models.account.TransactionSignerAccount": [[23, 2, 1, "", "address"], [23, 2, 1, "", "signer"]], "algokit_utils.models.amount": [[24, 5, 1, "", "ALGORAND_MIN_TX_FEE"], [24, 1, 1, "", "AlgoAmount"], [24, 6, 1, "", "algo"], [24, 6, 1, "", "micro_algo"], [24, 6, 1, "", "transaction_fees"]], "algokit_utils.models.amount.AlgoAmount": [[24, 4, 1, "", "algo"], [24, 3, 1, "", "from_algo"], [24, 3, 1, "", "from_micro_algo"], [24, 4, 1, "", "micro_algo"]], "algokit_utils.models.application": [[25, 1, 1, "", "AppCompilationResult"], [25, 1, 1, "", "AppInformation"], [25, 1, 1, "", "AppSourceMaps"], [25, 1, 1, "", "AppState"], [25, 1, 1, "", "CompiledTeal"]], "algokit_utils.models.application.AppCompilationResult": [[25, 2, 1, "", "compiled_approval"], [25, 2, 1, "", "compiled_clear"]], "algokit_utils.models.application.AppInformation": [[25, 2, 1, "", "app_address"], [25, 2, 1, "", "app_id"], [25, 2, 1, "", "approval_program"], [25, 2, 1, "", "clear_state_program"], [25, 2, 1, "", "creator"], [25, 2, 1, "", "extra_program_pages"], [25, 2, 1, "", "global_byte_slices"], [25, 2, 1, "", "global_ints"], [25, 2, 1, "", "global_state"], [25, 2, 1, "", "local_byte_slices"], [25, 2, 1, "", "local_ints"]], "algokit_utils.models.application.AppSourceMaps": [[25, 2, 1, "", "approval_source_map"], [25, 2, 1, "", "clear_source_map"]], "algokit_utils.models.application.AppState": [[25, 2, 1, "", "key_base64"], [25, 2, 1, "", "key_raw"], [25, 2, 1, "", "value"], [25, 2, 1, "", "value_base64"], [25, 2, 1, "", "value_raw"]], "algokit_utils.models.application.CompiledTeal": [[25, 2, 1, "", "compiled"], [25, 2, 1, "", "compiled_base64_to_bytes"], [25, 2, 1, "", "compiled_hash"], [25, 2, 1, "", "source_map"], [25, 2, 1, "", "teal"]], "algokit_utils.models.network": [[27, 1, 1, "", "AlgoClientConfigs"], [27, 1, 1, "", "AlgoClientNetworkConfig"]], "algokit_utils.models.network.AlgoClientConfigs": [[27, 2, 1, "", "algod_config"], [27, 2, 1, "", "indexer_config"], [27, 2, 1, "", "kmd_config"]], "algokit_utils.models.network.AlgoClientNetworkConfig": [[27, 3, 1, "", "full_url"], [27, 2, 1, "", "port"], [27, 2, 1, "", "server"], [27, 2, 1, "", "token"]], "algokit_utils.models.simulate": [[28, 1, 1, "", "SimulationTrace"]], "algokit_utils.models.simulate.SimulationTrace": [[28, 2, 1, "", "app_budget_added"], [28, 2, 1, "", "app_budget_consumed"], [28, 2, 1, "", "exec_trace"], [28, 2, 1, "", "failure_message"]], "algokit_utils.models.state": [[29, 5, 1, "", "BoxIdentifier"], [29, 1, 1, "", "BoxName"], [29, 1, 1, "", "BoxReference"], [29, 1, 1, "", "BoxValue"], [29, 1, 1, "", "DataTypeFlag"], [29, 5, 1, "", "TealTemplateParams"]], "algokit_utils.models.state.BoxName": [[29, 2, 1, "", "name"], [29, 2, 1, "", "name_base64"], [29, 2, 1, "", "name_raw"]], "algokit_utils.models.state.BoxValue": [[29, 2, 1, "", "name"], [29, 2, 1, "", "value"]], "algokit_utils.models.state.DataTypeFlag": [[29, 2, 1, "", "BYTES"], [29, 2, 1, "", "UINT"]], "algokit_utils.models.transaction": [[30, 5, 1, "", "Arc2TransactionNote"], [30, 1, 1, "", "BaseArc2Note"], [30, 1, 1, "", "JsonFormatArc2Note"], [30, 1, 1, "", "SendParams"], [30, 1, 1, "", "StringFormatArc2Note"], [30, 5, 1, "", "TransactionNote"], [30, 5, 1, "", "TransactionNoteData"], [30, 1, 1, "", "TransactionWrapper"]], "algokit_utils.models.transaction.BaseArc2Note": [[30, 2, 1, "", "dapp_name"]], "algokit_utils.models.transaction.JsonFormatArc2Note": [[30, 2, 1, "", "data"], [30, 2, 1, "", "format"]], "algokit_utils.models.transaction.SendParams": [[30, 2, 1, "", "cover_app_call_inner_transaction_fees"], [30, 2, 1, "", "max_rounds_to_wait"], [30, 2, 1, "", "populate_app_call_resources"], [30, 2, 1, "", "suppress_log"]], "algokit_utils.models.transaction.StringFormatArc2Note": [[30, 2, 1, "", "data"], [30, 2, 1, "", "format"]], "algokit_utils.models.transaction.TransactionWrapper": [[30, 4, 1, "", "application_call"], [30, 4, 1, "", "asset_config"], [30, 4, 1, "", "asset_freeze"], [30, 4, 1, "", "asset_transfer"], [30, 4, 1, "", "keyreg"], [30, 4, 1, "", "payment"], [30, 4, 1, "", "raw"], [30, 4, 1, "", "state_proof"]], "algokit_utils.protocols": [[31, 0, 0, "-", "account"], [33, 0, 0, "-", "typed_clients"]], "algokit_utils.protocols.account": [[31, 1, 1, "", "TransactionSignerAccountProtocol"]], "algokit_utils.protocols.account.TransactionSignerAccountProtocol": [[31, 4, 1, "", "address"], [31, 4, 1, "", "signer"]], "algokit_utils.protocols.typed_clients": [[33, 1, 1, "", "TypedAppClientProtocol"], [33, 1, 1, "", "TypedAppFactoryProtocol"]], "algokit_utils.protocols.typed_clients.TypedAppClientProtocol": [[33, 3, 1, "", "from_creator_and_name"], [33, 3, 1, "", "from_network"]], "algokit_utils.protocols.typed_clients.TypedAppFactoryProtocol": [[33, 3, 1, "", "deploy"]], "algokit_utils.transactions": [[35, 0, 0, "-", "transaction_composer"], [36, 0, 0, "-", "transaction_creator"], [37, 0, 0, "-", "transaction_sender"]], "algokit_utils.transactions.transaction_composer": [[35, 1, 1, "", "AppCallMethodCallParams"], [35, 1, 1, "", "AppCallParams"], [35, 1, 1, "", "AppCreateMethodCallParams"], [35, 1, 1, "", "AppCreateParams"], [35, 1, 1, "", "AppCreateSchema"], [35, 1, 1, "", "AppDeleteMethodCallParams"], [35, 1, 1, "", "AppDeleteParams"], [35, 5, 1, "", "AppMethodCallTransactionArgument"], [35, 1, 1, "", "AppUpdateMethodCallParams"], [35, 1, 1, "", "AppUpdateParams"], [35, 1, 1, "", "AssetConfigParams"], [35, 1, 1, "", "AssetCreateParams"], [35, 1, 1, "", "AssetDestroyParams"], [35, 1, 1, "", "AssetFreezeParams"], [35, 1, 1, "", "AssetOptInParams"], [35, 1, 1, "", "AssetOptOutParams"], [35, 1, 1, "", "AssetTransferParams"], [35, 1, 1, "", "BuiltTransactions"], [35, 5, 1, "", "MethodCallParams"], [35, 1, 1, "", "OfflineKeyRegistrationParams"], [35, 1, 1, "", "OnlineKeyRegistrationParams"], [35, 1, 1, "", "PaymentParams"], [35, 1, 1, "", "SendAtomicTransactionComposerResults"], [35, 1, 1, "", "TransactionComposer"], [35, 1, 1, "", "TransactionComposerBuildResult"], [35, 5, 1, "", "TxnParams"], [35, 6, 1, "", "calculate_extra_program_pages"], [35, 6, 1, "", "populate_app_call_resources"], [35, 6, 1, "", "prepare_group_for_sending"], [35, 6, 1, "", "send_atomic_transaction_composer"]], "algokit_utils.transactions.transaction_composer.AppCallMethodCallParams": [[35, 2, 1, "", "app_id"], [35, 2, 1, "", "on_complete"]], "algokit_utils.transactions.transaction_composer.AppCallParams": [[35, 2, 1, "", "account_references"], [35, 2, 1, "", "app_id"], [35, 2, 1, "", "app_references"], [35, 2, 1, "", "approval_program"], [35, 2, 1, "", "args"], [35, 2, 1, "", "asset_references"], [35, 2, 1, "", "box_references"], [35, 2, 1, "", "clear_state_program"], [35, 2, 1, "", "extra_pages"], [35, 2, 1, "", "on_complete"], [35, 2, 1, "", "schema"]], "algokit_utils.transactions.transaction_composer.AppCreateMethodCallParams": [[35, 2, 1, "", "approval_program"], [35, 2, 1, "", "clear_state_program"], [35, 2, 1, "", "extra_program_pages"], [35, 2, 1, "", "on_complete"], [35, 2, 1, "", "schema"]], "algokit_utils.transactions.transaction_composer.AppCreateParams": [[35, 2, 1, "", "account_references"], [35, 2, 1, "", "app_references"], [35, 2, 1, "", "approval_program"], [35, 2, 1, "", "args"], [35, 2, 1, "", "asset_references"], [35, 2, 1, "", "box_references"], [35, 2, 1, "", "clear_state_program"], [35, 2, 1, "", "extra_program_pages"], [35, 2, 1, "", "on_complete"], [35, 2, 1, "", "schema"]], "algokit_utils.transactions.transaction_composer.AppCreateSchema": [[35, 2, 1, "", "global_byte_slices"], [35, 2, 1, "", "global_ints"], [35, 2, 1, "", "local_byte_slices"], [35, 2, 1, "", "local_ints"]], "algokit_utils.transactions.transaction_composer.AppDeleteMethodCallParams": [[35, 2, 1, "", "app_id"], [35, 2, 1, "", "on_complete"]], "algokit_utils.transactions.transaction_composer.AppDeleteParams": [[35, 2, 1, "", "account_references"], [35, 2, 1, "", "app_id"], [35, 2, 1, "", "app_references"], [35, 2, 1, "", "args"], [35, 2, 1, "", "asset_references"], [35, 2, 1, "", "box_references"], [35, 2, 1, "", "on_complete"]], "algokit_utils.transactions.transaction_composer.AppUpdateMethodCallParams": [[35, 2, 1, "", "app_id"], [35, 2, 1, "", "approval_program"], [35, 2, 1, "", "clear_state_program"], [35, 2, 1, "", "on_complete"]], "algokit_utils.transactions.transaction_composer.AppUpdateParams": [[35, 2, 1, "", "account_references"], [35, 2, 1, "", "app_id"], [35, 2, 1, "", "app_references"], [35, 2, 1, "", "approval_program"], [35, 2, 1, "", "args"], [35, 2, 1, "", "asset_references"], [35, 2, 1, "", "box_references"], [35, 2, 1, "", "clear_state_program"], [35, 2, 1, "", "on_complete"]], "algokit_utils.transactions.transaction_composer.AssetConfigParams": [[35, 2, 1, "", "asset_id"], [35, 2, 1, "", "clawback"], [35, 2, 1, "", "freeze"], [35, 2, 1, "", "manager"], [35, 2, 1, "", "reserve"]], "algokit_utils.transactions.transaction_composer.AssetCreateParams": [[35, 2, 1, "", "asset_name"], [35, 2, 1, "", "clawback"], [35, 2, 1, "", "decimals"], [35, 2, 1, "", "default_frozen"], [35, 2, 1, "", "freeze"], [35, 2, 1, "", "manager"], [35, 2, 1, "", "metadata_hash"], [35, 2, 1, "", "reserve"], [35, 2, 1, "", "total"], [35, 2, 1, "", "unit_name"], [35, 2, 1, "", "url"]], "algokit_utils.transactions.transaction_composer.AssetDestroyParams": [[35, 2, 1, "", "asset_id"]], "algokit_utils.transactions.transaction_composer.AssetFreezeParams": [[35, 2, 1, "", "account"], [35, 2, 1, "", "asset_id"], [35, 2, 1, "", "frozen"]], "algokit_utils.transactions.transaction_composer.AssetOptInParams": [[35, 2, 1, "", "asset_id"]], "algokit_utils.transactions.transaction_composer.AssetOptOutParams": [[35, 2, 1, "", "asset_id"], [35, 2, 1, "", "creator"]], "algokit_utils.transactions.transaction_composer.AssetTransferParams": [[35, 2, 1, "", "amount"], [35, 2, 1, "", "asset_id"], [35, 2, 1, "", "clawback_target"], [35, 2, 1, "", "close_asset_to"], [35, 2, 1, "", "receiver"]], "algokit_utils.transactions.transaction_composer.BuiltTransactions": [[35, 2, 1, "", "method_calls"], [35, 2, 1, "", "signers"], [35, 2, 1, "", "transactions"]], "algokit_utils.transactions.transaction_composer.OfflineKeyRegistrationParams": [[35, 2, 1, "", "prevent_account_from_ever_participating_again"]], "algokit_utils.transactions.transaction_composer.OnlineKeyRegistrationParams": [[35, 2, 1, "", "selection_key"], [35, 2, 1, "", "state_proof_key"], [35, 2, 1, "", "vote_first"], [35, 2, 1, "", "vote_key"], [35, 2, 1, "", "vote_key_dilution"], [35, 2, 1, "", "vote_last"]], "algokit_utils.transactions.transaction_composer.PaymentParams": [[35, 2, 1, "", "amount"], [35, 2, 1, "", "close_remainder_to"], [35, 2, 1, "", "receiver"]], "algokit_utils.transactions.transaction_composer.SendAtomicTransactionComposerResults": [[35, 2, 1, "", "confirmations"], [35, 2, 1, "", "group_id"], [35, 2, 1, "", "returns"], [35, 2, 1, "", "simulate_response"], [35, 2, 1, "", "transactions"], [35, 2, 1, "", "tx_ids"]], "algokit_utils.transactions.transaction_composer.TransactionComposer": [[35, 3, 1, "", "add_app_call"], [35, 3, 1, "", "add_app_call_method_call"], [35, 3, 1, "", "add_app_create"], [35, 3, 1, "", "add_app_create_method_call"], [35, 3, 1, "", "add_app_delete"], [35, 3, 1, "", "add_app_delete_method_call"], [35, 3, 1, "", "add_app_update"], [35, 3, 1, "", "add_app_update_method_call"], [35, 3, 1, "", "add_asset_config"], [35, 3, 1, "", "add_asset_create"], [35, 3, 1, "", "add_asset_destroy"], [35, 3, 1, "", "add_asset_freeze"], [35, 3, 1, "", "add_asset_opt_in"], [35, 3, 1, "", "add_asset_opt_out"], [35, 3, 1, "", "add_asset_transfer"], [35, 3, 1, "", "add_atc"], [35, 3, 1, "", "add_offline_key_registration"], [35, 3, 1, "", "add_online_key_registration"], [35, 3, 1, "", "add_payment"], [35, 3, 1, "", "add_transaction"], [35, 3, 1, "", "arc2_note"], [35, 3, 1, "", "build"], [35, 3, 1, "", "build_transactions"], [35, 3, 1, "", "count"], [35, 3, 1, "", "execute"], [35, 3, 1, "", "rebuild"], [35, 3, 1, "", "send"], [35, 3, 1, "", "simulate"]], "algokit_utils.transactions.transaction_composer.TransactionComposerBuildResult": [[35, 2, 1, "", "atc"], [35, 2, 1, "", "method_calls"], [35, 2, 1, "", "transactions"]], "algokit_utils.transactions.transaction_creator": [[36, 1, 1, "", "AlgorandClientTransactionCreator"]], "algokit_utils.transactions.transaction_creator.AlgorandClientTransactionCreator": [[36, 4, 1, "", "app_call"], [36, 4, 1, "", "app_call_method_call"], [36, 4, 1, "", "app_create"], [36, 4, 1, "", "app_create_method_call"], [36, 4, 1, "", "app_delete"], [36, 4, 1, "", "app_delete_method_call"], [36, 4, 1, "", "app_update"], [36, 4, 1, "", "app_update_method_call"], [36, 4, 1, "", "asset_config"], [36, 4, 1, "", "asset_create"], [36, 4, 1, "", "asset_destroy"], [36, 4, 1, "", "asset_freeze"], [36, 4, 1, "", "asset_opt_in"], [36, 4, 1, "", "asset_opt_out"], [36, 4, 1, "", "asset_transfer"], [36, 4, 1, "", "offline_key_registration"], [36, 4, 1, "", "online_key_registration"], [36, 4, 1, "", "payment"]], "algokit_utils.transactions.transaction_sender": [[37, 1, 1, "", "AlgorandClientTransactionSender"], [37, 1, 1, "", "SendAppCreateTransactionResult"], [37, 1, 1, "", "SendAppTransactionResult"], [37, 1, 1, "", "SendAppUpdateTransactionResult"], [37, 1, 1, "", "SendSingleAssetCreateTransactionResult"], [37, 1, 1, "", "SendSingleTransactionResult"]], "algokit_utils.transactions.transaction_sender.AlgorandClientTransactionSender": [[37, 3, 1, "", "app_call"], [37, 3, 1, "", "app_call_method_call"], [37, 3, 1, "", "app_create"], [37, 3, 1, "", "app_create_method_call"], [37, 3, 1, "", "app_delete"], [37, 3, 1, "", "app_delete_method_call"], [37, 3, 1, "", "app_update"], [37, 3, 1, "", "app_update_method_call"], [37, 3, 1, "", "asset_config"], [37, 3, 1, "", "asset_create"], [37, 3, 1, "", "asset_destroy"], [37, 3, 1, "", "asset_freeze"], [37, 3, 1, "", "asset_opt_in"], [37, 3, 1, "", "asset_opt_out"], [37, 3, 1, "", "asset_transfer"], [37, 3, 1, "", "new_group"], [37, 3, 1, "", "offline_key_registration"], [37, 3, 1, "", "online_key_registration"], [37, 3, 1, "", "payment"]], "algokit_utils.transactions.transaction_sender.SendAppCreateTransactionResult": [[37, 2, 1, "", "app_address"], [37, 2, 1, "", "app_id"]], "algokit_utils.transactions.transaction_sender.SendAppTransactionResult": [[37, 2, 1, "", "abi_return"]], "algokit_utils.transactions.transaction_sender.SendAppUpdateTransactionResult": [[37, 2, 1, "", "compiled_approval"], [37, 2, 1, "", "compiled_clear"]], "algokit_utils.transactions.transaction_sender.SendSingleAssetCreateTransactionResult": [[37, 2, 1, "", "asset_id"]], "algokit_utils.transactions.transaction_sender.SendSingleTransactionResult": [[37, 2, 1, "", "confirmation"], [37, 2, 1, "", "confirmations"], [37, 3, 1, "", "from_composer_result"], [37, 2, 1, "", "group_id"], [37, 2, 1, "", "returns"], [37, 2, 1, "", "transaction"], [37, 2, 1, "", "transactions"], [37, 2, 1, "", "tx_id"], [37, 2, 1, "", "tx_ids"]]}, "objnames": {"0": ["py", "module", "Python module"], "1": ["py", "class", "Python class"], "2": ["py", "attribute", "Python attribute"], "3": ["py", "method", "Python method"], "4": ["py", "property", "Python property"], "5": ["py", "data", "Python data"], "6": ["py", "function", "Python function"], "7": ["py", "exception", "Python exception"]}, "objtypes": {"0": "py:module", "1": "py:class", "2": "py:attribute", "3": "py:method", "4": "py:property", "5": "py:data", "6": "py:function", "7": "py:exception"}, "terms": {"": [0, 3, 5, 7, 8, 9, 12, 14, 21, 23, 35, 37, 39, 40, 41, 43, 44, 45, 47, 48, 49, 51, 52, 53, 54, 55], "0": [0, 6, 7, 9, 12, 17, 33, 35, 36, 40, 43, 44, 49, 51, 53], "0002": [6, 30, 35], "0032": 9, "0056": 10, "01": 6, "01t12": 47, "03": 47, "1": [0, 3, 8, 9, 12, 21, 24, 29, 35, 36, 37, 38, 39, 40, 41, 42, 43, 44, 47, 49, 50, 51, 52, 53], "10": [0, 19, 35, 36, 37, 39, 40, 41, 45, 47, 52], "100": [37, 49, 51], "1000": [0, 3, 35, 36, 37, 39, 40, 45, 47, 48, 51, 52], "1000000": 17, "101112": 37, "10_000": [3, 41], "120": 49, "123": [5, 7, 8, 35, 36, 37, 42, 51], "1234": [35, 37, 53], "12345": [35, 37, 40, 43, 45], "123456": [35, 36, 37], "1234567890": [5, 8, 14, 16], "12346": 43, "12_smart": 6, "15": [17, 47], "150": 9, "1_000_000": [24, 40], "1_000_000_000": [0, 39], "2": [0, 6, 9, 12, 21, 29, 35, 37, 39, 43, 44, 47, 48, 50, 51, 52, 53], "20": 49, "2000": [36, 37, 45, 51], "200_000": 43, "2022": 47, "20220301t123456z_lr1000_2pay_1axf": 47, "2023": 6, "2100": 37, "256": [19, 47], "3": [0, 3, 9, 12, 35, 37, 40, 43, 44, 50, 51, 52, 53], "3000": [0, 35, 36, 37, 39, 43, 51, 52], "32": [7, 14, 43, 44, 45, 53, 54, 55], "34": 47, "4": [35, 36, 37, 43, 44, 51, 52], "4001": 27, "42": 37, "4321": 53, "456": [37, 51], "5": [21, 35, 37, 39, 41, 49, 52], "500": 45, "5000": 51, "500_000": 41, "512": 47, "544": 33, "56": [4, 5, 7, 16, 43, 44, 50, 53, 54, 55], "56z": 47, "64": [35, 37], "67890": 45, "6e6": 3, "700": 51, "789": [35, 36, 37, 51], "8": [42, 51], "8601": 47, "8980": 27, "A": [0, 3, 5, 6, 7, 8, 14, 19, 23, 35, 36, 37, 39, 40, 43, 47, 50, 51, 53, 54], "AND": [37, 39, 52], "As": [44, 55], "Be": 0, "By": [40, 47, 52, 53], "For": [9, 21, 22, 33, 35, 42, 44, 47, 49, 51, 53, 54, 55], "IN": 40, "If": [0, 2, 4, 5, 6, 8, 9, 10, 14, 16, 17, 23, 35, 37, 39, 40, 43, 44, 46, 48, 52, 53, 54, 55], "In": [39, 40, 44, 51, 52, 53, 55], "It": [8, 39, 40, 41, 42, 43, 44, 45, 46, 47, 48, 50, 51, 52, 54, 55], "No": [12, 50], "Not": 52, "ONE": 43, "On": 42, "One": 39, "Or": 51, "Such": 33, "The": [0, 2, 3, 4, 5, 6, 7, 8, 10, 14, 16, 17, 19, 23, 24, 25, 29, 31, 35, 37, 39, 40, 41, 42, 43, 44, 45, 46, 47, 48, 49, 50, 51, 52, 53, 54, 55], "Then": 40, "There": [19, 39, 41, 43, 44, 46, 51, 52], "These": [40, 47, 50, 51, 53, 55], "To": [6, 17, 19, 39, 40, 41, 42, 43, 44, 46, 47, 48, 50, 51, 52, 53, 54], "Will": 16, "With": [0, 48, 52], "_": [47, 49, 51], "_baseappmethodcal": 35, "_commonensurefundedparam": 0, "_commontxnparam": 35, "_legacy_v2": [7, 16], "_lr": 47, "_method_cal": 40, "_methodparamsbuild": [5, 7], "_miss": 5, "_mnemon": [0, 39], "_sender": [0, 39], "_stateaccessor": 5, "_transactioncr": [5, 7], "_transactionsend": [5, 7], "aavail": 51, "abc": [0, 2, 5, 8, 14, 19, 21, 35, 36, 37], "abi": [5, 6, 7, 8, 9, 10, 13, 35, 36, 37, 38, 40, 42, 43, 44, 49, 50, 51, 53, 54, 55], "abi_method": [42, 51], "abi_return": [4, 7, 8, 37, 42, 49, 50, 55], "abi_typ": [5, 8], "abi_valu": [42, 50], "abiargumenttyp": 4, "abil": [39, 40, 43, 44, 54], "abimethod": [35, 51], "abireferencetyp": 4, "abiresult": [4, 55], "abireturn": [4, 6, 8, 35, 37, 50], "abireturnt": [7, 37], "abistringtyp": 43, "abistruct": [4, 5], "abitransactiontyp": 4, "abityp": [4, 5, 8], "abivalu": [4, 5, 8], "abl": [40, 51], "about": [0, 6, 8, 9, 10, 14, 16, 39, 41, 43, 45, 46, 47], "abov": [19, 39, 44, 51], "absolut": 53, "abstract": [2, 31, 39, 50, 54, 55], "accept": [40, 51], "access": [2, 3, 6, 7, 16, 17, 23, 39, 41, 43, 45, 50, 51, 54, 55], "accessor": [5, 55], "accord": [4, 5, 50], "account": [3, 5, 6, 7, 8, 10, 14, 17, 22, 26, 32, 35, 36, 37, 38, 40, 42, 44, 49, 50, 51, 52, 53, 54], "account1": [0, 35, 36, 37, 39], "account2": [0, 37, 39], "account_1": [35, 37], "account_address": [42, 45, 55], "account_asset_info": 14, "account_info": [0, 45], "account_manag": [1, 3, 38, 39], "account_refer": [5, 35, 36, 37, 42, 51, 55], "account_sign": 42, "account_to_freez": [35, 36], "account_to_fund": [0, 49, 52], "accountaddress": [0, 37, 39, 43, 52], "accountassetinform": 14, "accountinform": 0, "accountmanag": [0, 3, 40, 54, 55], "accountmanager1": 0, "accountmanager2": 0, "accounttransactionsign": [23, 29], "across": [44, 46, 51], "act": [0, 33, 39], "action": [5, 6, 7, 9, 10, 12, 35, 39, 42, 43, 55], "activ": 52, "actual": [40, 51], "ad": [39, 55], "add": [5, 35, 40, 43, 44, 50, 51, 52, 54, 55], "add_": [40, 51], "add_app_cal": 35, "add_app_call_method_cal": [35, 51], "add_app_cr": 35, "add_app_create_method_cal": 35, "add_app_delet": 35, "add_app_delete_method_cal": 35, "add_app_upd": 35, "add_app_update_method_cal": 35, "add_asset_config": 35, "add_asset_cr": 35, "add_asset_destroi": 35, "add_asset_freez": 35, "add_asset_opt_in": [35, 40], "add_asset_opt_out": 35, "add_asset_transf": 35, "add_atc": 35, "add_offline_key_registr": 35, "add_online_key_registr": 35, "add_pay": [35, 40, 51, 52], "add_transact": [3, 35, 51], "addit": [5, 35, 40, 42, 44, 47, 51, 52, 55], "addition": 51, "additional_atc_context": 35, "additionalatccontext": 35, "addr": [0, 3, 51], "address": [0, 2, 3, 5, 6, 7, 8, 14, 16, 17, 23, 25, 31, 35, 37, 39, 40, 42, 43, 45, 48, 49, 50, 51, 52, 55], "address1": [0, 39], "address2": [0, 39], "addresstocloseto": 37, "advanc": [0, 35, 36, 37, 39, 40, 42, 43, 44, 45, 52, 54], "after": [5, 40, 43, 44], "again": [35, 44], "against": [0, 2, 6, 7, 14, 37, 39, 43, 44, 46, 52, 54, 55], "aka": [0, 2], "algo": [0, 2, 3, 17, 24, 35, 36, 37, 39, 40, 48, 49, 51, 54, 55], "algoamount": [0, 2, 3, 5, 14, 24, 35, 36, 37, 39, 40, 43, 45, 49, 51, 52, 53, 54, 55], "algoclientconfig": [3, 16, 27, 46], "algoclientnetworkconfig": [3, 16, 27, 46, 54], "algod": [0, 3, 8, 10, 14, 16, 27, 35, 37, 40, 42, 44, 45, 46, 51, 54, 55], "algod_cli": [8, 14, 16, 37, 40, 42, 45, 46, 47, 55], "algod_config": [3, 27, 40, 46, 54], "algod_serv": 16, "algodcli": [3, 8, 14, 16, 27, 35, 37, 46, 47], "algodresponsetyp": [8, 35, 37, 50], "algokit": [6, 7, 17, 19, 22, 39, 40, 41, 42, 43, 44, 46, 47, 48, 49, 50, 52, 53, 55], "algokit_config_filenam": 19, "algokit_deploy": [6, 44], "algokit_dispenser_access_token": [17, 48], "algokit_project_root": [19, 47], "algokit_util": [38, 39, 40, 41, 42, 44, 45, 46, 47, 48, 49, 51, 53, 54, 55], "algokitlogg": [19, 54], "algonod": [3, 16, 27, 40, 46, 54], "algorand": [0, 2, 5, 6, 7, 8, 14, 16, 22, 33, 35, 36, 37, 38, 39, 42, 43, 44, 45, 47, 48, 49, 50, 51, 52, 53, 54, 55], "algorand_cli": [16, 46, 52], "algorand_min_tx_fe": 24, "algorandcli": [3, 5, 7, 16, 33, 37, 39, 40, 42, 43, 44, 45, 46, 49, 50, 51, 52, 53, 54], "algorandclienttransactioncr": [3, 36, 40], "algorandclienttransactionsend": [3, 6, 37, 40, 44], "algorandfound": [6, 9, 10, 17, 35], "algosdk": [0, 2, 3, 4, 5, 6, 7, 8, 9, 10, 14, 16, 23, 25, 27, 29, 30, 31, 33, 35, 36, 37, 39, 40, 41, 42, 43, 45, 46, 51, 55], "algosdkcli": [3, 16, 46], "algosdklogicsigaccount": 0, "algosourcemap": [21, 43], "align": 55, "all": [0, 5, 6, 8, 9, 14, 19, 21, 23, 35, 40, 43, 44, 47, 50, 51, 52, 54], "alloc": [0, 35], "allow": [0, 5, 7, 9, 10, 35, 39, 40, 41, 42, 43, 44, 46, 47, 50, 51, 52, 53, 54, 55], "allow_empty_signatur": [35, 47, 51], "allow_more_log": [35, 51], "allow_unnamed_resourc": [35, 47, 51], "along": [4, 5, 39, 55], "alreadi": [37, 39, 43, 44, 50, 52, 53], "also": [17, 29, 39, 40, 41, 43, 44, 46, 47, 51, 52, 55], "altern": [17, 39, 41, 47, 48], "alwai": [51, 55], "amount": [0, 2, 3, 5, 14, 17, 26, 35, 36, 37, 38, 39, 40, 43, 45, 48, 49, 51, 52, 54, 55], "amount1": 41, "amount2": 41, "amount_fund": 52, "amount_without_pending_reward": 0, "amountfund": 0, "an": [0, 2, 3, 4, 5, 6, 7, 8, 10, 12, 14, 16, 17, 19, 23, 24, 27, 31, 35, 36, 37, 39, 40, 42, 44, 45, 47, 49, 50, 51, 52, 54, 55], "analyz": 5, "ani": [0, 2, 4, 5, 7, 8, 9, 10, 14, 19, 30, 33, 35, 37, 39, 40, 41, 43, 44, 46, 47, 48, 50, 51, 55], "anoth": [23, 40], "another_account_manag": 0, "anyth": [43, 47], "anywher": 39, "api": [0, 3, 16, 17, 27, 40, 43, 48, 51, 52, 54, 55], "app": [3, 5, 6, 7, 10, 16, 19, 29, 35, 37, 40, 47, 49, 50, 54], "app1": 44, "app1_metadata": 44, "app_address": [5, 6, 7, 25, 37, 43, 49, 50, 55], "app_budget_ad": 28, "app_budget_consum": 28, "app_cal": [36, 37, 50], "app_call_arg": 51, "app_call_method_cal": [36, 37, 51], "app_client": [7, 13, 16, 33, 38, 43, 49, 50, 51, 53, 55], "app_client1": [43, 53], "app_client2": [43, 53], "app_client3": 43, "app_client4": 43, "app_client5": 43, "app_client6": 43, "app_client_1": 51, "app_client_2": 51, "app_compilation_data": 7, "app_creat": [36, 37, 43, 50], "app_create_method_cal": [7, 36, 37, 43], "app_delet": [36, 37], "app_delete_method_cal": [36, 37], "app_deploy": [3, 5, 7, 13, 16, 33, 38, 44], "app_deploy_note_dapp": 6, "app_factori": [13, 16, 33, 38, 50, 51], "app_id": [5, 6, 7, 8, 10, 16, 25, 29, 33, 35, 36, 37, 42, 43, 44, 49, 50, 51, 53, 55], "app_index": 29, "app_info": [8, 42], "app_lookup": 44, "app_lookup_cach": [5, 7, 16, 33], "app_manag": [3, 5, 6, 13, 35, 37, 38, 42, 44, 51], "app_nam": [5, 7, 16, 33, 43, 53], "app_refer": [5, 35, 36, 37, 42, 51, 55], "app_spec": [4, 5, 7, 13, 16, 22, 38, 43, 49, 51], "app_spec_json": [5, 55], "app_upd": [36, 37, 50], "app_update_method_cal": [36, 37], "appcal": 55, "appcallmethodcallparam": [35, 36, 37, 40, 50, 51], "appcallparam": [35, 36, 37, 40, 51], "appclient": [5, 7, 16, 22, 50, 51, 54], "appclientbarecallcreateparam": [5, 7], "appclientbarecallparam": [5, 7, 43], "appclientcompilationparam": [5, 7, 16, 33], "appclientcompilationresult": [5, 7], "appclientcreateschema": 5, "appclientmethodcallcreateparam": [5, 7], "appclientmethodcallparam": [5, 7, 43, 49, 51], "appclientparam": [5, 43], "appcompilationresult": 25, "appcreat": 37, "appcreatemethodcallparam": [6, 35, 36, 37, 40, 51], "appcreateparam": [6, 35, 36, 37, 40, 44, 51], "appcreateschema": [5, 35], "appdeletemethodcallparam": [6, 35, 36, 37, 40, 51], "appdeleteparam": [6, 35, 36, 37, 40, 44, 51], "appdeploy": [3, 6, 54, 55], "appdeploymentmetadata": [6, 44], "appdeploymetadata": 44, "appdeploynot": 6, "appdeployparam": [6, 7, 44], "appdeployresult": [6, 7, 44], "append": [6, 44], "appendapp": [6, 7, 12], "appendsignmultisigtransact": 39, "appfactori": [7, 16, 50, 54, 55], "appfactorycreatemethodcallparam": 7, "appfactorycreatemethodcallresult": 7, "appfactorycreateparam": 7, "appfactorydeployresult": [7, 33], "appfactoryparam": 7, "appinform": [8, 25], "appli": [40, 43, 44, 51], "applic": [0, 3, 16, 19, 22, 26, 29, 33, 35, 36, 37, 38, 42, 43, 44, 47, 51, 54, 55], "application_cal": 30, "application_spec": [9, 10], "application_specif": [7, 16], "applicationcalltxn": 30, "applicationcli": 6, "applicationlookup": [5, 6, 7, 16, 33, 44], "applicationmetadata": [6, 7, 44], "applicationrefer": 6, "applicationspecif": [7, 16], "appmanag": [3, 5, 6, 8, 35, 37, 44, 51, 54], "appmethodcal": [5, 55], "appmethodcalltransactionargu": [5, 35], "appnam": 5, "approach": [53, 54], "appropri": [51, 55], "approv": [5, 6, 7, 9, 10, 12, 16, 25, 35, 37], "approval_program": [5, 6, 7, 9, 25, 35, 36, 37, 43, 44], "approval_source_map": [5, 7, 16, 25, 33, 43], "approval_teal_source_map": 43, "approval_teal_template_or_byte_cod": 44, "approvalsourc": 5, "apps_local_st": 0, "apps_total_extra_pag": 0, "apps_total_schema": 0, "appsourcemap": [5, 7, 25], "appspecstatedict": 9, "appstat": [5, 8, 25], "appupdatemethodcallparam": [6, 35, 36, 37, 40, 51], "appupdateparam": [6, 35, 36, 37, 40, 44, 51], "ar": [0, 5, 16, 17, 19, 23, 29, 33, 39, 40, 41, 42, 43, 44, 45, 46, 47, 48, 51, 52, 53, 54, 55], "arbitrari": [19, 44], "arc": [4, 5, 6, 7, 9, 10, 16, 30, 35, 43, 44, 50, 53, 54, 55], "arc2_not": 35, "arc2transactionnot": [30, 35], "arc32": [5, 10, 11, 38], "arc32_application_spec": 10, "arc32contract": [5, 9, 10, 55], "arc52contract": 22, "arc56": [4, 5, 7, 11, 16, 38, 55], "arc56_app_spec": 55, "arc56contract": [5, 7, 10, 16, 55], "arc56returnvaluetyp": [4, 7, 50], "architectur": [6, 44], "area": 19, "arg": [0, 3, 5, 7, 10, 12, 23, 29, 35, 36, 37, 39, 42, 43, 49, 50, 51, 53, 55], "arg1": [35, 36, 37], "arg1_valu": [35, 37], "arg2": [36, 37], "argst": 5, "argument": [0, 5, 6, 7, 9, 10, 17, 21, 35, 42, 47, 48, 51, 54, 55], "arithmet": 41, "around": [30, 39, 41, 55], "arrai": [14, 29, 37, 44, 55], "articul": 44, "artifact": [5, 9, 47, 49, 53], "asa": [14, 37, 45, 49, 51], "asid": 43, "assembl": 55, "assert": [43, 49], "asset": [0, 3, 5, 10, 17, 22, 35, 36, 37, 38, 40, 42, 47, 51, 54], "asset_config": [30, 36, 37], "asset_cr": [36, 37, 49, 50], "asset_destroi": [36, 37], "asset_freez": [30, 36, 37], "asset_id": [14, 17, 35, 36, 37, 40, 45, 49, 50, 55], "asset_info": [14, 45], "asset_manag": [3, 15, 37, 38, 45], "asset_nam": [14, 35, 36, 37, 45, 49], "asset_name_b64": 14, "asset_opt_in": [36, 37, 49, 55], "asset_opt_out": [36, 37], "asset_refer": [5, 35, 36, 37, 42, 51, 55], "asset_transf": [30, 36, 37, 49, 55], "assetconfigparam": [35, 36, 37, 40, 51], "assetconfigtxn": 30, "assetcreateparam": [35, 36, 37, 40, 49, 51], "assetdestroyparam": [35, 36, 37, 40, 51], "assetfreezeparam": [35, 36, 37, 40, 51], "assetfreezetxn": 30, "assetinform": 14, "assetmanag": [3, 14, 37, 40, 54, 55], "assetnam": 37, "assetoptinparam": [35, 36, 37, 40, 49, 51, 55], "assetoptoutparam": [35, 36, 37, 40, 51], "assettransferparam": [35, 36, 37, 40, 49, 51], "assettransfertxn": 30, "associ": [5, 8, 39, 42, 54, 55], "assum": [47, 51], "atc": [35, 47, 55], "atom": [35, 44, 47, 50], "atomic_transaction_compos": [0, 3, 4, 5, 7, 14, 16, 23, 31, 33, 35], "atomictransactioncompos": [35, 47, 55], "attach": [40, 44], "attempt": [0, 5, 40], "attribut": [33, 47], "augment": 43, "auth": 48, "auth_addr": 0, "auth_token": [16, 17, 48], "authent": [16, 27], "author": [0, 48, 51], "authoris": 39, "auto": [17, 38, 46, 54, 55], "autoapi": 38, "autocomplet": 55, "autom": [39, 41, 44, 46, 52, 54], "automat": [0, 39, 40, 41, 43, 44, 47, 50, 51, 52, 53, 54, 55], "avail": [0, 8, 39, 43, 44, 51, 52, 55], "avm": [47, 55], "avoid": [40, 42, 52], "awai": 39, "await": [3, 5, 6], "awar": 51, "b": [30, 35, 36, 37, 42, 45, 49, 51, 52], "back": 48, "backward": 55, "balanc": [0, 14, 35, 37, 43, 45, 49, 51, 52, 55], "bare": [5, 7, 10, 43, 51, 55], "bare_act": 10, "bare_call_config": 9, "bareact": 10, "base": [0, 2, 5, 6, 7, 9, 10, 12, 17, 19, 21, 29, 30, 31, 33, 35, 37, 39, 40, 43, 44, 50, 52, 55], "base64": [2, 10, 23, 25, 29, 42], "base_result": 50, "base_url": 17, "baseappclientmethodcallparam": 5, "basearc2not": 30, "basic": [0, 23, 35, 36, 37, 39, 42, 45, 52, 54], "beaker": 53, "becaus": [43, 51, 55], "been": [0, 5, 12, 39, 43, 44, 53, 55], "befor": [37, 40, 51], "behalf": 39, "behav": 51, "behavior": 50, "behaviour": [40, 51, 54], "behind": [6, 44], "being": [40, 41, 51, 54], "below": [49, 51, 53, 54], "benefit": 39, "best": 54, "beta": 55, "better": [43, 51, 52, 55], "between": [3, 24, 36, 37, 41, 49, 50, 52, 53, 54], "binari": [0, 43], "bit": [39, 43], "blob": [6, 10, 17, 35], "block": [0, 5, 51, 54], "blockchain": [43, 45, 46, 47, 54], "boilerpl": 39, "bool": [0, 2, 4, 5, 6, 7, 8, 9, 10, 14, 16, 19, 30, 33, 35, 37, 40, 43, 44, 45, 50, 51], "bootstrap": 43, "both": [9, 17, 46, 48, 51], "box": [0, 4, 5, 8, 10, 29, 35, 43, 44, 51, 54, 55], "box1": [35, 37, 43], "box2": [35, 37, 43], "box_abi_valu": 43, "box_id": [8, 42], "box_nam": [5, 8, 42, 43, 49, 55], "box_name1": 42, "box_name2": [42, 43], "box_name_1": 8, "box_name_2": 8, "box_name_byt": 8, "box_ref": 42, "box_refer": [5, 8, 29, 35, 36, 37, 42, 43, 49, 51, 55], "box_valu": [5, 8, 42, 43, 49, 55], "boxabivalu": [4, 5], "boxidentifi": [5, 8, 29, 35], "boxnam": [4, 5, 8, 29], "boxrefer": [5, 8, 29, 35, 42, 43], "boxvalu": [5, 29], "break": [6, 7, 12, 43, 44, 54], "broadli": 55, "broker": [3, 40], "budget": [35, 43, 47], "buffer": [19, 47], "buffer_size_mb": 47, "build": [3, 22, 35, 42, 43, 44, 47, 51, 52, 54], "build_transact": 35, "builder": [5, 55], "built": [35, 44, 50, 54], "built_txn": 36, "builttransact": [35, 36, 40], "bulk": [14, 40, 54], "bulk_opt_in": [14, 45], "bulk_opt_out": [14, 45], "bulkassetoptinoutresult": [14, 45], "bump": 55, "bypass": 44, "byte": [0, 4, 5, 8, 9, 10, 14, 23, 25, 29, 35, 40, 42, 43, 44, 45, 50], "byte_cod": 10, "bytearrai": 4, "bytecblock": 5, "bytecod": [10, 42], "c": 33, "cach": [3, 5, 6, 7, 8, 16, 40, 42, 44, 46, 55], "cached_result": 42, "calcul": [5, 24, 35, 40, 43, 51], "calculate_extra_program_pag": 35, "call": [0, 3, 4, 5, 6, 7, 9, 10, 19, 35, 36, 37, 39, 40, 41, 44, 46, 50, 52, 53, 54, 55], "call1": 43, "call2": 43, "call3": 43, "call4": 43, "call_config": 9, "call_typ": [40, 55], "callabl": [0, 2, 5, 14, 19, 21, 35, 36, 37], "callconfig": 9, "callenum": 10, "caller": 9, "calleraddress": 37, "callmethod": 37, "calltyp": 55, "can": [0, 2, 3, 5, 6, 8, 9, 14, 17, 19, 23, 33, 35, 39, 40, 41, 42, 43, 44, 45, 46, 47, 48, 49, 50, 51, 52, 53, 54, 55], "cannot": [4, 35, 51], "capabl": [2, 39, 40, 41, 42, 43, 44, 46, 50, 51, 52, 55], "captur": 44, "care": [0, 40, 44, 51, 54], "carefulli": 52, "case": [39, 40, 42, 43, 44, 52, 53, 54, 55], "catch": 43, "cater": 19, "caus": [43, 55], "caution": [37, 39, 52], "caveat": 43, "cblock": 10, "certain": [0, 43, 52, 55], "chain": [0, 3, 35, 43, 51, 55], "chainabl": 40, "chang": [6, 7, 12, 35, 39, 40, 44, 46, 51, 54], "channel": 19, "characterist": 44, "charg": 51, "check": [6, 7, 14, 16, 33, 37, 41, 44, 46, 51, 52, 54], "checker": 33, "choos": 40, "ci": 17, "class": [41, 42, 43, 44, 45, 46, 47, 50, 51, 54], "classmethod": [7, 19, 33, 37], "clawback": [14, 35, 36, 37, 45, 49], "clawback_address": [35, 36], "clawback_target": [35, 36, 37], "clawback_target_address": [35, 36], "clawbackaddress": 37, "cleaner": 55, "cleanup": 47, "clear": [5, 6, 7, 9, 10, 12, 16, 25, 35, 37, 43, 55], "clear_program": 9, "clear_source_map": [5, 7, 16, 25, 33, 43], "clear_stat": [9, 10, 43, 55], "clear_state_program": [5, 6, 7, 25, 35, 36, 37, 43, 44], "clear_state_teal_template_or_byte_cod": 44, "clear_teal_source_map": 43, "clearsourc": 5, "clearstat": [10, 35], "cli": [6, 53], "client": [0, 2, 3, 5, 6, 7, 8, 14, 22, 35, 37, 38, 44, 47, 49, 50, 51, 52, 54], "client_manag": [0, 2, 3, 18, 38, 39, 46], "clientmanag": [0, 2, 3, 16, 39, 40, 54], "clients_or_config": 16, "clone": 5, "cloned_cli": 5, "close": [0, 5, 35, 43, 52], "close_address": 35, "close_asset_to": [35, 36, 37], "close_asset_to_address": 36, "close_out": [9, 10, 43, 55], "close_remainder_to": [5, 35, 36, 37, 52], "closed_at_round": 0, "closeout": 10, "closeremaindertoaddress": [36, 37, 52], "cloud": 27, "code": [0, 5, 6, 7, 8, 10, 23, 25, 39, 42, 43, 44, 46, 47, 48, 54, 55], "codebas": 55, "coerc": 41, "collect": [0, 2, 5, 8, 14, 19, 21, 35, 36, 37, 49], "colon": 47, "com": [6, 9, 10, 17, 35, 36, 46, 49], "combin": [39, 43, 50], "come": 43, "commensur": 55, "comment": [8, 44], "commit": [0, 10, 35, 51], "commit_hash": 10, "common": [5, 21, 39, 40, 49, 50, 52, 54, 55], "commonappcallcreateparam": 5, "commonappcallparam": 5, "commonli": [22, 55], "commun": 55, "compar": 50, "comparison": 41, "compat": [43, 47, 53, 54, 55], "compil": [0, 5, 6, 7, 8, 10, 16, 25, 35, 37, 43, 50, 51], "compilation_param": [5, 7, 16, 33, 43, 49], "compilation_result": [7, 8, 42], "compile_app": 5, "compile_t": [8, 42, 44], "compile_teal_templ": [8, 42, 44], "compiled_approv": [5, 7, 25, 37, 44], "compiled_base64_to_byt": [25, 42], "compiled_clear": [5, 7, 25, 37, 44], "compiled_hash": [25, 42], "compiled_t": 8, "compiledt": [5, 8, 25, 44], "compiler_info": 10, "compiler_vers": 10, "compilerinfo": 10, "compilervers": 10, "complet": [5, 6, 7, 9, 37, 39, 42, 44, 52], "complex": 51, "compliant": [0, 47, 50, 51, 55], "compos": [3, 35, 37, 50, 54, 55], "composer_from_algorand": 51, "composer_from_app_cli": 51, "composer_from_constructor": 51, "composit": 55, "comprehens": 44, "concept": 44, "concert": 44, "confid": 44, "config": [0, 3, 16, 22, 36, 38, 40, 43, 46, 47, 51], "config_or_port": 16, "configur": [0, 2, 3, 5, 7, 14, 16, 19, 35, 37, 43, 44, 49, 50, 51, 52, 54], "confirm": [3, 6, 7, 8, 35, 37, 40, 42, 49, 50, 51], "conform": 39, "confus": [41, 43], "congest": 40, "connect": [16, 27, 46, 55], "consist": [39, 40, 50, 54, 55], "consolid": 43, "constant": [5, 9], "construct": [7, 42, 43, 44, 48, 50, 52, 53, 54, 55], "constructor": [17, 41, 43, 48, 51, 55], "constuct": 51, "consult": [50, 55], "consum": [51, 52], "consumpt": [47, 55], "contain": [5, 7, 8, 9, 10, 16, 23, 35, 37, 38, 42, 44, 45, 47, 48, 50], "context": 35, "continu": [44, 55], "contract": [5, 6, 9, 10, 16, 42, 43, 47, 49, 51, 53, 54, 55], "control": [0, 6, 8, 39, 40, 42, 43, 44, 49, 50, 54], "control_templ": 42, "conveni": [22, 39, 40, 43, 46, 50, 55], "convent": [0, 39, 44, 55], "convers": [24, 41, 54, 55], "convert": [4, 10, 41], "coordin": 51, "core": [39, 41, 42, 43, 44, 46, 50, 51, 52, 55], "correct": 44, "costli": 41, "count": [10, 35, 47], "counter": [10, 43], "cover": [35, 40, 43, 50], "cover_app_call_inner_transaction_fe": [30, 35, 40, 51], "coverag": 51, "coverappcallinnertransactionfe": 51, "creat": [0, 2, 3, 4, 5, 6, 7, 9, 10, 12, 14, 17, 23, 24, 35, 36, 37, 38, 39, 42, 44, 45, 47, 50, 51, 52, 54, 55], "create_app_param": 7, "create_appl": 43, "create_method": 7, "create_param": [6, 7, 33, 44], "create_result": [6, 7, 44, 49], "create_transact": [3, 5, 7, 40, 43, 51, 52, 55], "createcallabi": 44, "created_app": 0, "created_app_id": 37, "created_asset": 0, "created_at_round": 0, "created_round": 6, "createenum": 10, "createoncomplet": [5, 7], "createparamst": 33, "createtransact": 40, "creation": [5, 6, 7, 35, 37, 44, 54, 55], "creator": [5, 6, 7, 14, 16, 25, 35, 36, 37, 43, 44, 45, 53], "creator_address": [5, 6, 7, 16, 33, 35, 36, 43, 44, 53], "creatoraddress": [5, 35, 37, 43, 44, 53], "cross": 51, "cryptograph": 39, "csv": 19, "ctrl": 40, "current": [0, 7, 9, 14, 16, 17, 40, 43, 44, 45, 46, 54], "custom": [5, 19, 39, 40, 43, 47, 51, 54], "d": [9, 21, 35, 37, 52], "daemon": 39, "dapp_nam": [30, 35], "data": [0, 7, 8, 9, 10, 30, 43, 44, 45], "dataclass": [40, 44, 45, 46, 50, 51, 55], "datatypeflag": 29, "date": [12, 44], "debug": [19, 42, 43, 55], "debugg": 54, "decid": 51, "decim": [14, 17, 24, 35, 36, 37, 41, 45, 49], "decis": [6, 44], "decod": [4, 5, 8, 10, 42, 43, 50, 55], "decode_app_st": [8, 42], "decode_error": 4, "decoded_st": [8, 42], "decoded_tupl": [4, 10], "decor": 33, "dedic": [39, 52, 54, 55], "deem": 55, "def": [33, 49], "default": [0, 2, 3, 5, 6, 7, 9, 10, 14, 16, 17, 19, 35, 37, 40, 45, 46, 47, 51, 52, 53, 54], "default_argu": 9, "default_dispenser_account": 39, "default_factori": 44, "default_frozen": [14, 35, 36, 37, 45, 49], "default_localnet": [3, 40, 49, 54], "default_send": [5, 7, 16, 33, 43, 49, 51, 53], "default_sign": [5, 7, 16, 33], "default_validity_window": [35, 51], "default_valu": 10, "defaultargu": 9, "defaultargumentdict": 9, "defaultargumenttyp": 9, "defaultdispenseraccount": 0, "defaultvalu": 10, "defer": [7, 43], "defin": [0, 3, 5, 7, 9, 19, 33, 40, 43, 44, 53, 54], "definit": [4, 10], "deleg": 23, "delet": [0, 5, 6, 7, 12, 35, 36, 37, 42, 44, 49, 51, 54, 55], "deletable_template_nam": [8, 42], "delete_abi": 43, "delete_appl": [9, 10], "delete_arg": [35, 36], "delete_param": [6, 7, 33, 44], "delete_result": [6, 7, 44], "deleteappl": 10, "deleteapplicationoc": [35, 36, 37], "deletecallabi": 44, "deletemethod": 37, "deleteparamst": 33, "deleteresult": 7, "deliveri": 44, "delta": 51, "denot": 39, "depend": [53, 55], "deploi": [6, 7, 8, 16, 33, 39, 49, 54, 55], "deploy": [6, 7, 8, 10, 12, 42, 43, 52, 53, 54, 55], "deploy_metadata": 6, "deploy_param": 7, "deploy_respons": 49, "deploy_time_param": [5, 6, 43, 44, 49], "deployment_metadata": [8, 42, 44], "deployment_result": 44, "deprec": [17, 53], "depth": [19, 47], "desc": 10, "describ": [9, 12, 44, 54], "descript": [0, 10, 17, 51, 55], "design": [44, 54, 55], "despit": 55, "destroi": [14, 35, 36, 37, 51, 54], "destruct": [35, 37], "detail": [0, 16, 27, 33, 42, 43, 45, 48, 50, 51, 53, 54, 55], "detect": [44, 51], "determin": [16, 44, 51, 55], "develop": [0, 19, 43, 47, 51, 53, 54], "devnet": 16, "diagnos": 54, "dict": [0, 2, 4, 5, 6, 8, 9, 10, 21, 25, 28, 29, 30, 35, 40, 43, 44, 50], "dictifi": [6, 9, 10], "dictionari": [4, 9, 10, 21, 35, 40], "did": 44, "differ": [6, 7, 10, 39, 40, 43, 44, 47, 50, 51, 53, 55], "difficult": 51, "dilut": 35, "direct": [50, 55], "directli": [22, 39, 41, 42, 43, 44, 45, 46, 48, 50, 54, 55], "directori": [9, 19, 47], "disabl": 51, "discov": [6, 51, 55], "disk": 9, "dispens": [0, 2, 16, 17, 23, 49, 54, 55], "dispenser_access_token_kei": 17, "dispenser_account": [0, 49, 52], "dispenser_account_nam": 23, "dispenser_api_cli": [0, 16, 18, 38], "dispenser_asset": 17, "dispenser_cli": [0, 17, 52], "dispenser_from_environ": [0, 39, 52, 55], "dispenser_mnemon": [0, 52], "dispenser_request_timeout": 17, "dispenser_send": [0, 52], "dispenser_via_kmd": 39, "dispenseraddress": [0, 52], "dispenserapiconfig": 17, "dispenserasset": 17, "dispenserassetnam": 17, "dispenserfundrespons": [17, 48], "dispenserlimitrespons": [17, 48], "dispos": 52, "distribut": 51, "diverg": 44, "divis": [14, 35], "do": [39, 40, 43, 44, 51, 55], "doc": [0, 6, 17, 40, 43, 48, 51, 53, 54], "document": [38, 40, 41, 50, 53], "doe": [19, 39, 44, 47, 51], "doesn": [0, 37, 39, 43, 44, 46, 52], "domain": [54, 55], "don": [35, 39, 43, 51, 53, 55], "done": [39, 43, 44, 48], "doubl": 40, "driven": 53, "duck": 33, "due": 55, "duplic": 42, "dure": [4, 5, 6, 12, 40, 43, 55], "dynam": [51, 54], "e": [0, 7, 14, 19, 27, 39, 40, 43, 44, 45, 46, 48, 51, 52, 54, 55], "each": [9, 35, 39, 44, 47, 48, 54], "earn": 0, "easi": [3, 40, 41, 44, 50], "easier": [2, 43, 44, 53, 54, 55], "easili": [0, 51, 52, 54], "effect": 51, "effici": 51, "effort": 54, "either": [3, 10, 16, 23, 39, 40, 42, 43, 44, 46, 50, 51, 52, 54], "element": 9, "elig": 0, "emit": [40, 43], "empti": [3, 9, 21, 35, 51], "enabl": [19, 43, 47, 51], "encapsul": 55, "encod": [2, 4, 10, 23, 25, 29, 35, 39, 42, 43, 44, 49], "encount": 8, "end": [5, 44, 54], "endpoint": [47, 48, 51], "enforc": 40, "enhanc": 50, "ensur": [0, 24, 41, 51, 55], "ensure_budget": 51, "ensure_fund": [0, 49, 54], "ensure_funded_from_environ": [0, 52], "ensure_funded_from_testnet_dispenser_api": [0, 52], "ensure_zero_bal": [14, 37, 45], "ensurebudget": 51, "ensurefundedfromtestnetdispenserapiresult": 0, "ensurefundedrespons": 52, "ensurefundedresult": 0, "enter": 41, "entri": [9, 10, 55], "entrypoint": [40, 54, 55], "enum": [6, 9, 10, 13, 17, 29, 38], "env": [0, 39], "environ": [0, 3, 16, 17, 39, 40, 44, 45, 46, 47, 48, 52, 53, 54], "ephemer": 52, "equival": [39, 54, 55], "error": [0, 4, 6, 10, 16, 22, 35, 38, 40, 46, 51, 53, 54, 55], "error_messag": [10, 43], "error_str": 21, "escrow": 23, "especi": 40, "etc": [0, 22, 40, 41, 42, 44, 47, 55], "eval": 43, "evalu": 51, "even": [40, 51], "event": 10, "eventarg": 10, "ever": 35, "everi": 53, "evolv": 44, "exact": [40, 44, 51], "exactli": [19, 44], "exampl": [0, 3, 5, 6, 7, 8, 9, 14, 16, 17, 21, 24, 33, 35, 36, 37, 41, 43, 44, 45, 46, 47, 48, 49, 50, 51, 53], "exceed": [47, 51], "except": [2, 4, 5, 17, 35, 39, 40, 43, 48, 51], "exclus": 40, "exec_trac": 28, "exec_trace_config": [35, 47, 51], "exece": 51, "execut": [0, 10, 19, 35, 39, 40, 44, 51, 52, 55], "execute_atc_with_logic_error": 55, "exhaust": 43, "exist": [0, 6, 7, 12, 16, 35, 36, 37, 39, 41, 43, 44, 46, 55], "existing_account": 39, "existing_deploy": [6, 7, 33, 44], "exit": 21, "expect": [3, 51, 55], "experi": [43, 51, 53, 55], "expir": 40, "explain": 44, "explicit": [24, 44, 54, 55], "explicitli": [41, 51], "export": [5, 9], "export_source_map": [5, 7, 43], "expos": [39, 40, 43, 54, 55], "expose_logic_error": 43, "express": [39, 41], "extend": [2, 40, 47, 50], "extens": 47, "extern": 39, "extra": [0, 5, 14, 25, 35, 37, 47, 54, 55], "extra_fe": [0, 5, 14, 35, 36, 37, 39, 40, 45, 52], "extra_opcode_budget": [35, 47, 51], "extra_pag": [35, 36], "extra_program_pag": [5, 25, 35, 36, 37], "extract": 40, "extrafe": 37, "f": [42, 46, 48, 49], "face": 41, "facilit": 52, "fact": [40, 55], "factori": [7, 16, 42, 49, 50, 54, 55], "fail": [6, 8, 12, 17, 35, 40, 43, 44], "failur": 46, "failure_messag": 28, "fair": 39, "fairli": 39, "fall": 55, "fallback": 16, "fals": [4, 6, 7, 9, 19, 33, 35, 36, 37, 43, 44, 47, 49, 51], "famili": 50, "featur": [39, 51, 53, 55], "fee": [0, 5, 6, 14, 24, 35, 37, 39, 40, 43, 50, 52, 54], "fetch": 44, "few": 41, "field": [0, 4, 10, 37, 43, 44, 48, 50, 51, 52, 55], "file": [0, 9, 19, 47, 53, 54], "filter": [0, 2, 5, 43], "filter_func": 5, "final": 44, "find": [0, 2, 5, 40, 43], "first": [0, 3, 5, 14, 35, 40, 44, 46, 48, 49, 52, 55], "first_valid_round": [0, 5, 14, 35, 36, 37, 39, 40, 52], "fix": [5, 51], "fixtur": 49, "flag": [0, 5, 10, 16, 43], "float": [3, 19], "fluentli": 51, "fly": 43, "focu": 50, "folder": 47, "follow": [35, 39, 40, 43, 44, 46, 47, 49, 52, 53, 54, 55], "forc": [6, 7], "foreign": [29, 51, 55], "format": [4, 5, 6, 8, 30, 41, 43], "fortun": 51, "forward": [39, 55], "found": [0, 2, 5, 8, 12, 46], "framework": 44, "free": [0, 16, 40, 46, 52, 54], "freez": [14, 35, 36, 37, 45, 49, 51, 55], "freeze_address": [35, 36], "freezeaddress": 37, "fresh": [40, 43, 44], "fresh_account_via_kmd": 39, "from": [0, 2, 3, 4, 5, 6, 7, 8, 9, 10, 14, 16, 17, 21, 22, 35, 39, 40, 42, 43, 44, 45, 46, 47, 48, 49, 50, 51, 52, 53, 54, 55], "from_account": 55, "from_algo": [0, 24, 35, 36, 39, 41, 49, 53, 55], "from_arc32": [10, 55], "from_client": [3, 40, 54], "from_composer_result": 37, "from_config": [3, 40, 54], "from_creator_and_nam": [5, 33, 43, 53], "from_deploy_result": 7, "from_dict": 10, "from_environ": [0, 3, 39, 40, 53, 54, 55], "from_json": [5, 9, 10, 55], "from_kmd": [0, 39], "from_micro_algo": [0, 24, 35, 36, 39, 41, 51], "from_microalgo": 43, "from_mnemon": [0, 39, 55], "from_network": [5, 33, 43], "from_signatur": 51, "fromsignatur": 51, "frozen": [14, 35, 36, 37, 40, 45, 50], "full": [0, 5, 23, 27, 35, 37, 53], "full_url": 27, "fulli": [51, 54, 55], "func": [19, 33], "function": [0, 3, 6, 7, 8, 14, 19, 22, 23, 37, 39, 40, 41, 43, 44, 45, 46, 47, 49, 50, 51, 52, 53, 54, 55], "fund": [0, 2, 5, 17, 39, 49, 52, 54], "fund_app_account": [5, 43, 49, 55], "fund_with": [0, 2, 39], "fundament": 45, "fundappaccountparam": [5, 43, 49], "funded_account": 49, "further": [40, 43, 54], "furthermor": 44, "futur": [5, 7, 40, 55], "g": [0, 14, 19, 27, 40, 43, 44, 45, 46, 51, 54, 55], "gener": [0, 5, 7, 9, 33, 37, 38, 39, 40, 47, 51, 52, 54], "generate_account": 0, "generate_test_asset": 49, "genesi": [16, 46], "genesis_hash": [16, 46], "genesis_id": [16, 46], "genesis_id_is_localnet": 16, "genproto": 33, "get": [0, 2, 3, 4, 5, 6, 7, 8, 10, 16, 17, 23, 35, 37, 40, 43, 44, 46, 49, 50, 51, 52, 54, 55], "get_abi_decoded_valu": 4, "get_abi_encoded_valu": 4, "get_abi_return": [8, 42], "get_abi_struct_from_abi_tupl": [4, 10], "get_abi_tuple_from_abi_struct": 4, "get_abi_tuple_type_from_abi_struct_definit": 4, "get_account": [0, 55], "get_account_from_mnemon": 55, "get_account_inform": [14, 45, 49], "get_al": [43, 55], "get_algod_cli": [16, 46, 55], "get_algod_client_from_environ": [16, 46], "get_algod_config_from_environ": [16, 46], "get_algonode_config": [16, 46], "get_app_client_by_creator_and_nam": [7, 16, 43, 53], "get_app_client_by_id": [7, 16, 43, 53], "get_app_client_by_network": 16, "get_app_factori": [16, 43, 49, 51], "get_arc56_method": 10, "get_arc56_valu": 4, "get_box_nam": [5, 8, 42, 43], "get_box_refer": [8, 42], "get_box_valu": [5, 8, 42, 43, 49, 55], "get_box_value_from_abi_typ": [5, 8, 42, 43], "get_box_values_from_abi_typ": [5, 8, 42, 43], "get_by_id": [8, 14, 42, 45], "get_compilation_result": [8, 42], "get_config_from_environment_or_localnet": [16, 46], "get_constant_block_offset": 5, "get_creator_apps_by_nam": [6, 44], "get_decoded_approv": 10, "get_decoded_clear": 10, "get_default_localnet_config": [16, 46], "get_dispenser_account": 55, "get_global_st": [5, 8, 42, 43, 55], "get_indexer_cli": [16, 46, 55], "get_indexer_client_from_environ": [16, 46], "get_indexer_config_from_environ": [16, 46], "get_inform": 0, "get_kmd_client": [16, 46], "get_kmd_client_from_environ": [16, 46], "get_kmd_config_from_environ": 16, "get_limit": [17, 48], "get_line_for_pc": 21, "get_local_st": [5, 8, 42, 43, 55], "get_localnet_default_account": 55, "get_localnet_dispenser_account": [2, 39], "get_map": 43, "get_map_valu": [43, 55], "get_null_logg": [19, 47], "get_or_create_wallet_account": [2, 39], "get_sign": [0, 35, 39, 51], "get_suggested_param": [3, 35, 40, 51], "get_testnet_dispens": [16, 48], "get_testnet_dispenser_from_environ": [0, 48, 52], "get_typed_app_client_by_creator_and_nam": [16, 53], "get_typed_app_client_by_id": [16, 53], "get_typed_app_client_by_network": 16, "get_typed_app_factori": [16, 53], "get_valu": [43, 55], "get_wallet_account": [2, 39], "getenv": 55, "git": 10, "github": [6, 9, 10, 17, 35], "give": [40, 43, 53, 55], "given": [0, 2, 3, 4, 6, 7, 14, 19, 23, 24, 33, 35, 39, 40, 44, 46, 47, 52, 53, 54, 55], "global": [5, 8, 9, 10, 25, 35, 43, 44, 51, 55], "global_byte_slic": [6, 7, 25, 35, 36, 37, 44], "global_int": [6, 7, 25, 35, 36, 37, 44], "global_st": [5, 8, 10, 25, 42, 43, 55], "global_state_schema": 9, "gnu": 19, "gnumer": 19, "go": [39, 43], "goal": [44, 54], "good": [7, 54], "gradual": 55, "great": 51, "group": [3, 14, 35, 36, 37, 47, 50, 51, 52, 55], "group_id": [35, 37, 50], "guid": [40, 54], "guidanc": [0, 40], "guidelin": 55, "ha": [0, 12, 14, 31, 37, 39, 40, 41, 43, 44, 51, 52, 53, 54, 55], "had": [43, 44, 55], "hand": 53, "handl": [0, 5, 9, 35, 44, 46, 50, 51, 52, 54, 55], "happen": [43, 51], "hash": [10, 14, 16, 23, 25, 35, 42, 45, 46], "have": [0, 6, 19, 35, 39, 40, 43, 44, 46, 51, 52, 53, 54, 55], "haven": 5, "heartbeat": 0, "heavi": 44, "heavyweight": 44, "held": [0, 14, 45], "hello": [5, 7, 49, 53], "hello_world_app": 53, "helloarg": 53, "helloworldapp": 53, "helloworldappcli": 53, "helloworldappfactori": 53, "help": [40, 44, 49, 54, 55], "helper": [16, 41, 49], "henc": 55, "here": [37, 39, 48, 49, 51, 52], "hexadecim": 44, "hierarch": 55, "hierarchi": 19, "high": [5, 35, 40, 43, 50, 51, 54, 55], "higher": [42, 43, 44, 52, 54], "highest": 50, "highli": [50, 54], "hint": [9, 54, 55], "hit": 44, "hold": [14, 16, 23, 35, 39, 51], "holder": 14, "holderaddress": 37, "hood": 51, "how": [0, 9, 19, 39, 40, 48, 49, 50, 51, 53], "howev": [51, 53, 55], "http": [0, 6, 9, 10, 17, 27, 35, 36, 46, 49, 54], "human": 43, "i": [0, 2, 3, 4, 5, 6, 7, 8, 9, 10, 14, 16, 17, 19, 23, 35, 37, 39, 40, 41, 42, 43, 44, 45, 46, 47, 48, 49, 50, 51, 52, 54, 55], "id": [5, 6, 7, 8, 10, 14, 16, 17, 25, 35, 37, 40, 42, 43, 44, 45, 46, 48, 49, 50, 52, 53, 55], "ideal": [0, 40], "idempot": [2, 6, 7, 39, 43, 52, 53, 54, 55], "ident": 55, "identifi": [0, 5, 8, 19, 39, 44], "ignor": [5, 6, 7, 16, 33, 47], "ignore_cach": [5, 6, 7, 16, 33, 43, 44], "immedi": [40, 51, 52], "immut": [8, 43, 44, 54], "implement": [2, 31, 44], "impli": 55, "implicit": 55, "import": [5, 7, 22, 39, 40, 41, 42, 44, 45, 46, 47, 48, 49, 51, 53, 54, 55], "import_source_map": [5, 7, 43], "improv": 55, "incent": 0, "incentive_elig": 0, "includ": [0, 3, 5, 6, 7, 14, 16, 19, 35, 36, 37, 40, 42, 43, 44, 45, 46, 47, 50, 51, 52, 54], "incorrect": 43, "incorrectli": 52, "increas": [44, 51], "increaseopcodebudget": 51, "increment": 0, "indefinit": 55, "indent": [9, 10], "index": [3, 6, 7, 16, 27, 29, 35, 37, 40, 43, 44, 46, 49, 54, 55], "indexer_cli": [16, 40, 46], "indexer_config": [3, 27, 40, 54], "indexer_if_pres": 16, "indexer_serv": 16, "indexercli": [3, 6, 16, 27, 46], "indic": [5, 16, 19, 44, 47, 48], "individu": [43, 47, 48], "infer": 39, "info": [4, 10, 35, 42, 45, 50], "inform": [0, 5, 6, 8, 10, 14, 16, 39, 40, 43, 44, 47, 49, 51, 53, 54, 55], "init": [44, 53], "initi": [2, 9, 10, 21, 35, 48, 52, 54, 55], "initialis": 40, "inject": [39, 54], "inlin": 46, "inner": [10, 35, 40], "inner_transaction_count": 10, "input": [19, 43], "insid": 47, "inspect": 48, "instanc": [0, 5, 6, 7, 8, 10, 16, 19, 23, 24, 35, 37, 39, 42, 43, 44, 47, 49, 51, 52, 54, 55], "instanti": [16, 39, 40, 42, 43, 44, 45, 46, 51, 55], "instead": [7, 39, 40, 44, 51, 55], "int": [0, 3, 4, 5, 6, 7, 8, 9, 10, 14, 16, 17, 19, 21, 23, 24, 25, 27, 28, 29, 30, 33, 35, 37, 40, 41, 42, 43, 45, 49, 50, 51], "intact": 39, "intcblock": 5, "integ": [10, 25, 41], "intellisens": [40, 53, 54], "intention": 40, "intenum": [17, 29], "interact": [5, 7, 8, 17, 42, 43, 45, 48, 52, 53, 54, 55], "interfac": [5, 35, 50, 54], "intern": 39, "interpol": 41, "interpret": 50, "intflag": 9, "introduc": 55, "intuit": [54, 55], "invalid": [4, 5, 6, 8, 35], "invoc": 53, "invok": [44, 48, 51, 53], "is_clear": 43, "is_localnet": [16, 46], "is_mainnet": [16, 46], "is_success": 4, "is_testnet": [16, 46], "isn": [0, 16, 51], "iso": 47, "issu": [39, 43, 48, 52, 54, 55], "iter": [9, 21, 35], "its": [4, 43, 44, 49], "itself": [43, 44, 55], "j": [30, 44], "java": 19, "json": [5, 30, 43, 47, 49, 53], "jsonformatarc2not": 30, "just": 55, "k": [9, 21, 35], "keep": [0, 39, 42, 44, 48], "kei": [0, 2, 9, 10, 21, 23, 25, 29, 35, 36, 37, 39, 40, 43, 44, 45, 50, 51, 52, 54, 55], "key_base64": [25, 42], "key_nam": 55, "key_raw": [25, 42], "key_typ": [10, 43], "keyboard": 40, "keyreg": 30, "keyregtxn": 30, "keyword": [9, 21, 35], "kmd": [0, 2, 3, 16, 40, 46, 52, 54, 55], "kmd_account_manag": [0, 1, 38, 39], "kmd_client": [40, 46], "kmd_config": [3, 27, 40, 54], "kmd_manag": 0, "kmdaccount": 2, "kmdaccountmanag": [0, 2, 22, 39], "kmdclient": [2, 3, 16, 46], "know": 43, "knowledg": 43, "known": [40, 43, 46, 55], "kw_onli": 50, "kwarg": [9, 21, 33, 35], "kwd": 12, "lack": 43, "lambda": [0, 36, 39, 45, 51], "languag": [43, 44, 51], "larg": [54, 55], "last": [0, 3, 5, 14, 35, 37, 40, 47, 50], "last_heartbeat": 0, "last_propos": 0, "last_round": 47, "last_valid_round": [0, 5, 14, 40], "lastvalid": 40, "later": [0, 3], "latest": [12, 40, 44, 55], "leas": [0, 5, 14, 35, 36, 37, 39, 40, 42, 45, 52], "least": [51, 55], "led": 43, "left": 40, "less": [53, 55], "let": [43, 54], "level": [5, 19, 22, 35, 39, 43, 50, 51, 54, 55], "leverag": [40, 51, 53, 54, 55], "librari": [35, 54], "lifecycl": [49, 54], "lift": 44, "like": [0, 6, 7, 8, 19, 40, 42, 43, 44, 46, 51, 54, 55], "likelihood": 44, "limit": [17, 19, 35, 43, 44, 51, 54], "line": [21, 43], "line_no": [21, 43], "link": 55, "list": [0, 4, 5, 8, 9, 10, 14, 21, 23, 30, 35, 37, 40, 43, 45, 47, 50], "list_of_op_cod": 43, "liter": [6, 9, 10, 16, 30], "ll": [39, 43, 49], "load": [0, 2, 3, 5, 17, 39, 42, 46, 49, 52], "local": [0, 5, 8, 9, 10, 16, 25, 35, 39, 43, 44, 51, 55], "local_byte_slic": [6, 7, 25, 35, 36, 37, 44], "local_int": [6, 7, 25, 35, 36, 37, 44], "local_st": [8, 10, 42, 43, 55], "local_state_schema": 9, "localhost": 27, "localnet": [0, 2, 3, 16, 39, 40, 44, 46, 49, 51, 52, 53, 54], "localnet_dispens": [0, 39, 49, 55], "localnet_dispenser_account": 39, "locat": 10, "lock": [0, 52, 53], "log": [0, 19, 35, 40, 50, 51], "logger": [19, 47, 54], "logic": [0, 23, 39, 44, 46, 54], "logic_error": [20, 38, 43], "logic_error_str": [21, 43], "logic_sig": 0, "logicerror": [21, 43], "logicerrordata": 21, "logicsig": [0, 23, 39], "logicsigaccount": [0, 3, 23, 31, 39, 55], "logicsigtransactionsign": 23, "login": 17, "long": 40, "look": [0, 7, 14, 40, 43, 44, 55], "lookup": [5, 6, 7, 16, 43, 54], "loos": 55, "loss": [39, 52], "low": [39, 55], "lsig": [23, 39], "m": 30, "ma": [35, 36], "made": [40, 44, 51], "mai": [9, 37, 40, 43, 44, 51, 55], "main": [6, 10, 17, 35, 39, 40, 54, 55], "mainnet": [3, 7, 16, 39, 40, 44, 46, 54, 55], "maintain": [44, 52, 55], "major": [10, 55], "make": [0, 2, 37, 39, 41, 43, 44, 46, 48, 52, 53, 54, 55], "makemultisigaccounttransactionsign": 39, "manag": [0, 2, 5, 6, 8, 14, 16, 19, 23, 35, 36, 37, 43, 44, 45, 47, 49, 52, 53, 54], "manager_address": [35, 36], "manageraddress": 37, "mani": [39, 40, 52, 53], "manner": 54, "manual": [0, 39, 43, 46, 47, 50, 53], "map": [5, 7, 8, 9, 10, 16, 21, 25, 29, 35, 42, 43, 44, 47, 55], "map1": 43, "map_dict": 43, "map_nam": [43, 55], "map_valu": [43, 55], "mapkei": 43, "match": [2, 14, 39, 54], "max": [0, 37, 39, 40, 44, 51, 52], "max_fe": [0, 5, 6, 14, 35, 36, 37, 39, 40, 45, 51, 52], "max_rounds_to_wait": [30, 35, 52], "max_rounds_to_wait_for_confirm": [37, 39, 40], "max_search_depth": [19, 47], "maxfe": 51, "maximum": [0, 5, 6, 14, 19, 35, 47, 51], "mb": 47, "mbr": 49, "md": [6, 10, 17, 35], "mean": [44, 47, 55], "mechan": [42, 43, 44, 50, 54], "megabyt": [19, 47], "member": [17, 29], "mental": [7, 43], "merg": 0, "messag": [10, 21, 40, 43, 48, 55], "metadata": [0, 3, 6, 7, 8, 14, 23, 35, 40, 42, 45, 54], "metadata_hash": [14, 35, 37, 45], "metadatahash": 37, "meth": 33, "method": [0, 3, 4, 5, 7, 8, 9, 10, 16, 35, 36, 37, 39, 40, 42, 44, 45, 46, 47, 48, 49, 50, 51, 52, 53, 54], "method_arg": 36, "method_cal": [35, 40], "method_nam": 8, "method_name_or_signatur": 10, "methodarg": 10, "methodcallparam": [35, 40], "methodconfigdict": 9, "methoddict": 9, "methodhint": 9, "methodnam": 53, "methodt": 5, "micro_algo": [24, 37, 41], "microalgo": [40, 41, 48, 52, 54], "might": [19, 47, 55], "migrat": 54, "millisecond": 3, "min_bal": 0, "min_funding_incr": [0, 49, 52], "min_spending_bal": [0, 49, 52], "mind": [33, 48], "minim": [43, 52], "minimis": 51, "minimum": [0, 35, 43, 51, 52], "minor": 10, "miss": [0, 4, 5], "mistak": 41, "mnemon": [0, 39, 52, 54, 55], "mode": [19, 43, 47, 55], "model": [0, 2, 3, 4, 5, 6, 7, 8, 14, 16, 21, 22, 33, 35, 37, 38, 43, 49], "modifi": [17, 35], "modul": [22, 54, 55], "modular": [41, 46, 54], "more": [7, 14, 22, 35, 37, 39, 40, 42, 43, 44, 45, 49, 51, 53, 54, 55], "most": [40, 47, 55], "move": 55, "much": [19, 41, 43], "multi_sig": 0, "multipl": [5, 6, 8, 40, 43, 44, 46, 50, 51, 52, 53], "multisig": [0, 23, 39, 54], "multisig_param": [0, 23], "multisigaccount": [0, 3, 23, 31, 39, 55], "multisigaddress": 39, "multisigmetadata": [0, 23, 39], "multisigtransact": 23, "must": [17, 29, 41, 44], "mutual": 40, "my": [5, 43, 47], "my_account": 0, "my_account_mnemon": [0, 55], "my_app": [6, 7], "my_box": 42, "my_default_sign": 39, "my_method": [5, 7, 50, 51], "my_method2": 5, "my_method_cal": 5, "my_other_method": 51, "myalgodnod": 46, "myapp": 44, "myappclient": 16, "myappfactori": 16, "myasset": [35, 36], "mycontractcli": 53, "mycontractfactori": 53, "mymap": 43, "mymethod": 51, "mypi": 54, "n": 44, "name": [0, 2, 4, 5, 6, 7, 8, 9, 10, 14, 16, 19, 21, 29, 35, 37, 39, 42, 43, 45, 47, 51, 53, 54, 55], "name_base64": 29, "name_raw": 29, "namespac": 19, "nativ": 54, "natur": [19, 44], "necess": 55, "need": [0, 2, 37, 39, 40, 41, 43, 44, 46, 47, 48, 50, 51, 52, 53, 55], "nest": [5, 7, 19], "network": [0, 3, 5, 8, 10, 16, 26, 35, 38, 39, 40, 44, 51, 54], "network_detail": 16, "networkdetail": 16, "never": [0, 9, 41], "new": [0, 3, 5, 7, 9, 12, 14, 16, 17, 21, 23, 35, 36, 37, 39, 40, 43, 44, 46, 53, 55], "new_account": [23, 39, 49], "new_arg1": [35, 36], "new_arg2": 36, "new_clawback_address": [35, 36], "new_freeze_address": [35, 36], "new_group": [3, 14, 36, 37, 40, 45, 51, 52, 55], "new_manager_address": [35, 36], "new_reserve_address": [35, 36], "new_send": 5, "new_signer_account": 39, "new_valu": 37, "newaddress": [0, 39], "newli": [7, 37], "newsigneraccount": 0, "nice": 41, "no_op": [9, 10], "node": 35, "non": [0, 14, 21, 37, 44, 47, 51, 53], "nondefaultappnam": 43, "none": [0, 2, 3, 4, 5, 6, 7, 8, 9, 10, 14, 16, 17, 19, 21, 23, 25, 27, 28, 30, 33, 35, 37, 40, 43, 44, 45, 49, 50, 51, 52], "noop": 10, "noopoc": [35, 36], "normal": [5, 9, 37, 52], "normalise_app_spec": 5, "note": [0, 5, 6, 7, 14, 30, 35, 36, 37, 39, 40, 42, 43, 44, 45, 50, 51, 52, 53, 54, 55], "noth": [12, 19, 44, 54], "notic": 55, "notset": 19, "now": [39, 55], "null": 19, "number": [0, 2, 3, 5, 6, 10, 16, 19, 24, 25, 35, 39, 40, 41, 43, 44, 45, 46, 51, 52, 54], "number_of_transact": 24, "o": [48, 55], "object": [4, 9, 21, 23, 24, 28, 35, 39, 40, 41, 43, 44, 45, 46, 47, 48, 51, 52, 54, 55], "obtain": [48, 53, 55], "occur": [4, 43, 48], "offici": [0, 40, 53], "offlin": [0, 35, 36, 37, 39, 51], "offline_key_registr": [36, 37], "offlinekeyregistrationparam": [35, 36, 37, 40, 51], "offset": [5, 10], "often": [43, 52], "old": [12, 44], "older": [53, 55], "oldest": 47, "on_complet": [5, 7, 35, 36, 37, 42, 43], "on_schema_break": [6, 7, 33, 44], "on_upd": [6, 7, 33, 44], "onc": [40, 43, 46], "oncomplet": [5, 9, 35, 36, 37, 43], "oncompleteactionnam": 9, "oncompletionactionnam": 9, "one": [0, 7, 9, 21, 35, 37, 39, 40, 41, 43, 44, 46, 49, 50, 51, 52, 53, 54, 55], "onli": [9, 16, 33, 37, 40, 43, 44, 52, 55], "onlin": [0, 35, 36, 37, 51], "online_key_registr": [36, 37], "onlinekeyregistrationparam": [35, 36, 37, 40, 51], "onschemabreak": [6, 7, 12, 33, 44], "onupd": [6, 7, 12, 33, 44], "op": 43, "opcod": [35, 43, 47, 51], "oper": [0, 5, 6, 7, 19, 35, 36, 37, 39, 40, 41, 44, 47, 54, 55], "operation_perform": [6, 7, 44], "operationperform": [6, 7, 12, 44], "opinion": 44, "opt": [0, 14, 35, 36, 37, 40, 43, 44, 49, 51, 54, 55], "opt_in": [9, 10, 43, 55], "optim": [47, 50, 51], "optin": [10, 43], "optinoc": [35, 37], "option": [0, 2, 5, 6, 7, 10, 14, 16, 30, 35, 39, 40, 42, 43, 44, 45, 46, 51, 52, 54], "orchestr": 37, "order": [39, 42, 43, 44, 52, 54, 55], "org": 0, "organ": [19, 54], "origin": [12, 42, 43, 44], "other": [0, 2, 3, 7, 35, 39, 40, 42, 43, 44, 51, 54], "otherwis": [2, 4, 8, 16, 42, 43, 54], "out": [9, 12, 14, 35, 36, 37, 40, 41, 43, 44, 46, 51, 52, 54], "outcom": 50, "outlin": 55, "output": [44, 47, 53, 54], "outsid": 44, "over": [2, 43, 44, 54, 55], "overal": 51, "overhead": 51, "overrid": [2, 5, 40, 43], "overridden": 5, "overriddenappnam": 43, "overspend": 40, "overview": 55, "overwrit": 0, "overwrite_exist": 0, "own": [43, 44], "packag": [19, 47], "page": [0, 5, 25, 35, 38, 42, 43, 54], "pai": [40, 51], "paid": [51, 52], "pair": [9, 21, 35, 39, 44], "parallel": 44, "param": [3, 5, 7, 8, 23, 35, 36, 37, 40, 43, 44, 51, 52, 55], "paramet": [0, 2, 3, 4, 5, 6, 7, 8, 9, 10, 14, 16, 17, 19, 23, 24, 30, 35, 36, 37, 39, 43, 46, 47, 51, 52, 54, 55], "parent": [40, 51], "pariti": 55, "pars": [8, 42, 43, 50, 55], "parse_logic_error": 21, "parsed_app_spec": 43, "parsed_arc32_or_arc56_app_spec": 43, "parsed_valu": 50, "part": [40, 54], "partial": [0, 23], "particip": [0, 35], "particular": [14, 40, 45], "particularli": [43, 44, 51, 52], "pass": [0, 5, 17, 33, 37, 39, 41, 42, 43, 44, 47, 48, 51, 52, 55], "past": 40, "patch": 10, "path": [9, 19, 47, 49, 53, 55], "pathlib": [9, 19], "pattern": [43, 55], "payload": 44, "payment": [3, 30, 35, 36, 37, 43, 47, 48, 50, 51, 54, 55], "payment_arg": 51, "paymentparam": [3, 35, 36, 37, 40, 51, 52], "paymenttxn": 30, "pc": [10, 21, 43], "pc_offset_method": 10, "pcoffsetmethod": 10, "pend": 0, "pending_reward": 0, "pending_transaction_info": 8, "pep": 33, "per": [0, 41, 44, 50, 52], "perform": [0, 6, 7, 14, 35, 39, 41, 43, 47, 48, 51, 54, 55], "period": [19, 40, 47], "perman": [8, 39, 43, 44, 54], "persist": 47, "persist_sourcemap": 47, "pin": 53, "pip": 54, "place": [14, 17, 35, 45], "placehold": [6, 7], "pleas": [0, 6, 40, 55], "poetri": 54, "point": [3, 16, 40, 43, 54, 55], "popul": [19, 35, 40, 43, 47, 55], "populate_app_call_resourc": [19, 30, 35, 40, 44, 47, 51], "populateappcallresourc": 40, "port": [3, 16, 27, 54], "posit": 5, "possibl": [39, 43, 54, 55], "post": 40, "potenti": [41, 55], "power": [39, 51, 55], "practic": [44, 54], "pragma": 42, "pre": [16, 39, 40, 43, 44, 54, 55], "preced": [17, 48], "predic": [0, 2], "prefer": [37, 46, 54], "prefix": [10, 43], "prepar": [35, 51], "prepare_group_for_send": 35, "presenc": 33, "present": [0, 23, 39, 40, 43, 44, 52, 53, 55], "prevent": [35, 40], "prevent_account_from_ever_participating_again": [35, 36, 37], "previou": 39, "previous": [0, 44, 53, 55], "primarili": 33, "primit": [50, 54], "principl": [41, 44, 46], "print": [37, 46, 48, 53], "prior": 9, "privat": [0, 2, 23, 39, 52], "private_kei": [0, 2, 3, 5, 23], "problem": 55, "process": [0, 19, 39, 44, 51], "produc": 46, "product": [0, 43, 44, 53, 54], "program": [0, 3, 5, 6, 7, 8, 9, 10, 12, 16, 21, 23, 25, 35, 37, 39, 43, 44], "program_counter_valu": 43, "programmat": 52, "programsourceinfo": 10, "project": [19, 43, 47, 54], "project_root": [19, 47], "proof": 35, "properli": 44, "properti": [0, 3, 4, 5, 6, 7, 16, 19, 23, 24, 30, 31, 36, 39, 40, 41, 43, 44, 54, 55], "propos": 0, "proto": 33, "protocol": [0, 3, 22, 38], "provid": [0, 2, 5, 7, 8, 9, 16, 22, 23, 35, 36, 37, 39, 40, 41, 42, 43, 44, 45, 46, 47, 48, 49, 50, 51, 52, 54, 55], "public": [23, 35, 54, 55], "public_kei": 23, "pull": 9, "purpos": 55, "put": 54, "puya": 10, "py": [6, 9, 19, 27, 47, 53, 55], "pypi": 54, "pyteal": 53, "pytest": [49, 54], "python": [3, 19, 22, 41, 44, 47, 50, 51, 53, 55], "qualiti": 44, "queri": [7, 44], "quicker": 54, "quickli": [40, 55], "rais": [0, 2, 4, 5, 6, 8, 10, 14, 16, 17, 35, 37, 48, 51, 55], "ramp": 53, "randint": 49, "random": [0, 2, 23, 39, 49], "randomli": 39, "rather": [0, 39, 41, 43, 44, 51, 55], "raw": [4, 5, 8, 23, 25, 29, 30, 35, 41, 42, 44, 50, 55], "raw_stat": 42, "raw_valu": 4, "re": [6, 7, 43], "read": [0, 10, 19, 40, 54], "read_byt": 10, "read_onli": 9, "read_text": 49, "readabl": 43, "readi": 35, "readonli": [10, 51], "realli": 44, "reason": [43, 44], "rebuild": 35, "rebuilt": 35, "receiv": [3, 35, 36, 37, 40, 43, 46, 48, 49, 50, 51, 52, 55], "receiver_address": [35, 36, 48], "receiver_bal": 49, "receiveraddress": [3, 36, 37, 40, 52], "recogn": 33, "recognis": 16, "recommend": [10, 40, 42, 43, 44, 51, 53, 54, 55], "recompil": 55, "reconfigur": [36, 51], "record": [14, 44], "reduc": [6, 40, 44], "redund": 55, "refer": [5, 6, 8, 16, 29, 35, 41, 44, 48, 49, 51, 55], "refin": 55, "reflect": 55, "refund": [17, 52, 54], "refund_txn_id": 17, "regener": 55, "regist": [0, 17, 37, 40, 52, 54], "registr": [35, 36, 37, 51], "regular": [0, 35], "reiter": 55, "rekei": [0, 2, 5, 14, 40, 52, 54], "rekey_account": [0, 39, 52], "rekey_to": [0, 5, 14, 36, 37, 39, 40, 52], "rekeyed_account": [0, 39], "rekeyto": 39, "rekeytoaddress": [36, 37, 52], "relat": [7, 39, 40, 55], "releas": [51, 54], "relev": [0, 14, 22, 40, 44, 51], "reli": 55, "reliabl": [41, 44, 54], "remain": [35, 52, 55], "remaind": 5, "rememb": 43, "remov": [47, 55], "renam": [39, 55], "replac": [6, 7, 8, 12, 43, 44], "replace_teal_template_deploy_time_control_param": [8, 44], "replace_template_vari": [8, 44], "replaceapp": 12, "repositori": 52, "repres": [0, 4, 7, 9, 10, 19, 24, 29, 37, 39, 47], "represent": [4, 43], "request": [16, 17, 44, 48], "request_timeout": [16, 17, 48], "requir": [0, 4, 6, 10, 35, 40, 43, 44, 48, 51, 52, 53, 55], "requisit": 44, "reserv": [14, 35, 36, 37, 45, 49], "reserve_address": [35, 36], "reserveaddress": 37, "reset": 0, "resolut": 55, "resolv": [7, 9, 16, 39, 43, 44, 46, 51, 53, 54, 55], "resourc": [19, 35, 40, 47], "respect": [51, 55], "respons": [0, 7, 35, 47, 48, 50, 51, 53], "rest": 0, "result": [0, 3, 4, 5, 6, 7, 8, 14, 35, 37, 39, 40, 41, 42, 43, 44, 45, 49, 51, 52, 53, 54, 55], "result2": 52, "retri": 54, "retriev": [0, 2, 3, 14, 16, 39, 44, 45, 52, 53, 54, 55], "retryabl": [44, 54], "return": [0, 2, 3, 4, 5, 6, 7, 8, 10, 14, 16, 17, 19, 23, 24, 27, 33, 35, 37, 39, 40, 41, 42, 43, 45, 46, 48, 49, 50, 51, 52, 55], "reus": 54, "reusabl": 54, "reward": 0, "reward_bas": 0, "risk": 43, "root": [19, 22, 35, 43, 47, 54], "round": [0, 3, 5, 14, 35, 40, 45, 47, 51], "rule": [35, 43], "run": [0, 2, 39, 52], "runtim": [33, 44], "runtime_check": 33, "safe": [24, 41, 44, 53, 54, 55], "safer": [41, 54], "safeti": [54, 55], "sake": 49, "same": [39, 40, 43, 44, 46], "scenario": [40, 43, 51, 53], "schema": [0, 5, 6, 7, 9, 10, 12, 35, 36, 37, 43, 44, 55], "scope": 49, "scratch": [10, 35], "scratch_vari": 10, "scratchvari": 10, "script": 52, "sdk": [16, 39, 54], "seamlessli": 0, "search": [6, 19, 47], "second": [16, 17, 40, 44, 48], "secret": [0, 39], "secret_token": 46, "see": [0, 6, 9, 10, 33, 35, 41, 42, 43, 44, 46, 48, 52, 53, 54, 55], "seed": 39, "seen": 53, "selection_kei": [35, 36, 37], "selectionkei": 37, "self": [0, 3, 7, 33, 37], "semant": [7, 42, 43, 50, 52, 54, 55], "semver": 44, "send": [0, 3, 5, 6, 7, 14, 30, 35, 37, 39, 43, 44, 48, 49, 50, 51, 52, 53, 54, 55], "send_atomic_transaction_compos": 35, "send_param": [0, 5, 6, 7, 14, 33, 37, 40, 44, 45, 51, 52], "sendappcreatefactorytransactionresult": [7, 50], "sendappcreatetransactionresult": [6, 7, 37, 50], "sendappfactorytransactionresult": [7, 50], "sendapptransactionresult": [6, 7, 37, 44, 50], "sendappupdatefactorytransactionresult": [7, 50], "sendappupdatetransactionresult": [6, 7, 37, 50], "sendatomictransactioncomposerresult": [0, 35, 37], "sender": [0, 2, 3, 5, 6, 7, 14, 16, 35, 36, 37, 39, 40, 42, 43, 44, 48, 49, 50, 51, 52, 55], "sender2address": 43, "sender_address": [6, 7, 8, 17, 35, 36, 39], "senderaddress": [0, 3, 5, 36, 37, 39, 40, 43, 44, 52], "sendparam": [0, 5, 6, 7, 14, 30, 33, 35, 37, 40, 44, 45, 51, 52], "sendsingleassetcreatetransactionresult": [37, 50], "sendsingletransactionresult": [0, 5, 7, 37, 40], "sens": [37, 39, 52], "sensibl": 54, "sent": [0, 35, 44, 50, 51, 52], "separ": [19, 47], "sequenc": 5, "seri": [14, 40, 44, 54], "serialis": 43, "serv": 55, "server": [27, 46, 54], "servic": [0, 16, 27, 52], "set": [0, 3, 6, 7, 16, 17, 19, 22, 35, 37, 39, 40, 43, 47, 48, 51, 52, 54, 55], "set_box": 49, "set_default_sign": [0, 3, 39], "set_default_validity_window": [3, 40], "set_sign": [0, 3, 39, 49], "set_signer_from_account": [0, 3, 39], "set_suggested_param": 40, "set_suggested_params_cach": 3, "set_suggested_params_cache_timeout": 3, "set_suggested_params_timeout": 40, "setdefaultsign": 40, "setsign": 40, "setsignerfromaccount": 40, "setup": 54, "sever": [42, 51], "share": 40, "short": 35, "shortcut": [40, 46], "should": [0, 5, 9, 19, 35, 39, 40, 44, 51, 52], "shouldn": [41, 44], "show": 43, "shown": 42, "sig": [23, 39], "sig_typ": 0, "sign": [0, 2, 3, 23, 39, 40, 43, 52, 54, 55], "signatur": [0, 33, 35, 39, 40, 43, 51], "signer": [0, 2, 3, 5, 7, 14, 16, 23, 31, 35, 37, 40, 42, 45, 49, 51, 52, 54], "signer_account": 0, "signeraccount": 5, "signerprivatekei": 5, "signifi": 40, "significantli": [39, 55], "signing_account": [0, 3, 23], "signingaccount": [0, 2, 3, 14, 23, 31, 39, 49, 55], "signmultisigtransact": 39, "similar": [51, 52, 53, 55], "simpl": [33, 53, 55], "simpler": 55, "simpli": [47, 55], "simplic": 49, "simplifi": [39, 55], "simul": [19, 21, 26, 35, 38, 40, 43, 47, 50, 54], "simulate_and_persist_respons": 47, "simulate_respons": [35, 50, 51], "simulatetraceconfig": [35, 51], "simulation_round": [35, 47, 51], "simulationtrac": [21, 28, 43], "sinc": [19, 39, 43, 44, 55], "singl": [7, 12, 19, 37, 43, 44, 50, 52, 53, 55], "singlesendtransactionresult": 40, "situat": 51, "size": [19, 47], "skip": [35, 44, 51, 55], "skip_signatur": [35, 51], "skip_wait": 35, "slice": [10, 25, 35], "slightli": [40, 55], "slot": 10, "small": [51, 52], "smallest": [14, 35], "smallish": 40, "smart": [5, 16, 42, 43, 47, 49, 51, 53, 54], "snippet": [49, 54], "so": [0, 3, 6, 19, 39, 43, 44, 46, 51, 52, 53, 54], "solut": [22, 44, 54], "some": [9, 14, 39, 40, 41, 44, 46, 52, 54], "some_abi_method_object": 36, "some_byt": 37, "someth": [39, 43], "somewher": 46, "soon": 43, "sourc": [0, 5, 7, 8, 9, 10, 16, 25, 42, 43, 44, 47, 52, 54, 55], "source_info": 10, "source_map": [5, 7, 16, 21, 25, 33, 42, 43], "sourceinfo": 10, "sourceinfomodel": 10, "sourcemap": [5, 7, 16, 25, 33, 47], "space": [10, 40], "spec": [5, 6, 7, 16, 35, 49, 50, 54, 55], "special": 46, "specif": [5, 6, 7, 9, 10, 16, 19, 22, 40, 43, 47, 51, 53, 54, 55], "specifi": [0, 2, 3, 6, 7, 9, 16, 37, 39, 40, 41, 42, 43, 44, 46, 51, 52, 54], "spend": [0, 52], "spendabl": 0, "sphinx": 38, "split": [43, 55], "stabil": 44, "stai": 39, "stale": 3, "standalon": 55, "standard": [8, 14, 35, 36, 37, 45, 49, 51, 54], "start": [3, 17, 36, 40, 49, 54], "state": [0, 4, 5, 6, 7, 8, 9, 10, 25, 26, 35, 37, 38, 41, 44, 51, 54], "state_proof": 30, "state_proof_kei": [35, 36, 37], "state_proof_key_byt": 36, "statedict": 9, "stateless": 55, "stateprooftxn": 30, "stateschema": [9, 44], "static": [0, 3, 5, 8, 9, 10, 14, 16, 23, 24, 33, 35, 40, 41, 44, 54, 55], "static_fe": [0, 5, 14, 35, 36, 37, 39, 40, 43, 45, 52], "staticfe": 37, "statu": [0, 19, 39], "step": [43, 54], "still": [51, 55], "storag": [0, 10, 42, 43, 44, 47, 54, 55], "storagekei": 10, "storagemap": 10, "store": [0, 2, 4, 6, 8, 19, 39, 47, 49, 52], "stored_valu": 49, "str": [0, 2, 3, 4, 5, 6, 7, 8, 9, 10, 14, 16, 17, 19, 21, 23, 25, 27, 28, 29, 30, 31, 33, 35, 37, 40, 41, 42, 43, 44, 45, 48, 50, 52], "straight": [44, 55], "string": [0, 4, 9, 10, 16, 19, 25, 29, 30, 35, 37, 39, 40, 41, 42, 43, 44, 47], "string_io": 43, "stringformatarc2not": 30, "stringtyp": 42, "strip": [8, 44], "strip_teal_com": [8, 44], "stripped_teal_cod": 8, "strong": [43, 54], "stronger": 55, "struct": [4, 9, 10, 50], "struct_def": 4, "struct_field": [4, 10], "struct_valu": 4, "structargdict": 9, "structfield": [4, 10], "structur": [30, 33, 52, 55], "sub": 19, "subclass": 47, "submit": [40, 55], "submodul": 54, "subsequ": [6, 44, 46], "substitut": [6, 7, 8, 42, 54], "subtli": 51, "subtract": 41, "subtyp": 33, "success": 4, "successfulli": [40, 51], "suggest": [3, 35, 40, 51], "suggested_param": [3, 35, 40, 51], "suggestedparam": [3, 35], "summaris": 53, "suppli": [14, 35, 44], "support": [0, 10, 23, 35, 39, 41, 44, 50, 51, 53, 54, 55], "suppress": [0, 35, 40, 54], "suppress_log": [0, 30, 35, 37, 39, 40, 47, 52, 54], "suppresslog": 40, "supress": 47, "sure": [0, 6, 7, 40], "surplu": 51, "symbol": 43, "syntax": 39, "system": 0, "t": [0, 5, 6, 16, 33, 35, 37, 39, 41, 43, 44, 46, 51, 52, 53, 55], "take": [0, 7, 12, 17, 35, 39, 41, 43, 44, 46, 48, 51, 52], "taken": 12, "target": [0, 9], "task": 54, "teal": [5, 6, 7, 8, 10, 25, 35, 42, 43, 44, 47, 51, 54], "teal_approval_cod": [35, 36], "teal_clear_cod": [35, 36], "teal_cod": [8, 42, 44], "teal_new_approval_cod": [35, 36], "teal_new_clear_cod": [35, 36], "teal_template_cod": [8, 44], "tealclear_advanc": 37, "tealcod": [35, 37], "tealcode_advanc": 37, "tealscript": [51, 53], "tealtemplateparam": [5, 6, 8, 29, 44], "templat": [5, 6, 7, 8, 10, 42, 53, 54], "template_cod": 42, "template_param": [8, 42, 44], "template_valu": [8, 44], "template_vari": 10, "templatevari": 10, "temporarili": 19, "ters": [41, 54], "terser": 54, "test": [41, 44, 46, 47, 51, 52], "test_app_deploy": 49, "test_app_method_cal": 49, "test_asset_transf": 49, "test_box": 49, "test_box_storag": 49, "test_valu": 49, "testing_app_arc32_app_spec": 55, "testnet": [0, 3, 16, 17, 27, 39, 40, 44, 52, 54, 55], "testnet_api": 17, "testnetdispenserapicli": [0, 16, 17, 48, 52], "than": [0, 35, 39, 40, 41, 43, 44, 51, 55], "thei": [0, 33, 39, 43, 47, 51, 52, 55], "them": [16, 35, 40, 41, 42, 43, 51, 54], "therefor": 51, "thi": [0, 2, 3, 5, 6, 7, 8, 14, 19, 22, 23, 35, 37, 38, 39, 40, 41, 42, 43, 44, 45, 46, 47, 48, 50, 51, 52, 53, 54, 55], "thin": 54, "thing": [40, 54, 55], "think": [40, 55], "those": [7, 43, 46], "though": 51, "threshold": [0, 23, 39], "through": [40, 43, 45, 51, 54, 55], "throw": [6, 39, 40, 43], "thrown": [0, 16, 43, 51, 55], "thu": 43, "ticker": [14, 35, 45], "tier": [16, 40, 46, 54], "time": [3, 6, 7, 8, 39, 40, 43, 44, 46, 47, 51, 52, 53, 54, 55], "timeout": [3, 16, 17, 40, 48], "timestamp": [3, 47], "tmpl_": 44, "tmpl_delet": [8, 44], "tmpl_updat": [8, 44], "tmpl_valu": 42, "to_abi_method": 10, "to_addr": 55, "to_json": [9, 10], "togeth": 51, "token": [3, 16, 17, 27, 46, 48, 54], "toml": [19, 47], "too": 46, "tool": [17, 47, 54], "top": [40, 42, 43, 44, 52, 54, 55], "total": [0, 14, 24, 35, 36, 37, 41, 45, 49], "total_apps_opted_in": 0, "total_assets_opted_in": 0, "total_box": 0, "total_box_byt": 0, "total_created_app": 0, "total_created_asset": 0, "trace": [19, 21, 35, 43, 51, 54], "trace_al": [19, 47], "trace_buffer_size_mb": [19, 47], "track": [0, 3, 39, 42], "traffic": 40, "transact": [0, 2, 3, 4, 5, 6, 7, 8, 9, 10, 12, 14, 16, 17, 22, 23, 24, 26, 31, 38, 39, 42, 43, 44, 45, 47, 48, 52, 53, 54], "transaction_compos": [0, 3, 5, 6, 14, 34, 36, 37, 38], "transaction_cr": [3, 34, 38], "transaction_fe": 24, "transaction_id": [14, 21, 43, 45, 48, 52], "transaction_send": [0, 3, 5, 6, 7, 34, 38, 44], "transaction_sign": [0, 39, 45, 52], "transaction_typ": [47, 51], "transactioncompos": [3, 14, 35, 36, 37, 39, 40, 45, 50, 51, 55], "transactioncomposerbuildresult": 35, "transactionnot": 30, "transactionnotedata": 30, "transactionpool": 43, "transactionsign": [0, 3, 5, 7, 14, 16, 23, 31, 33, 35, 37, 39, 40, 51], "transactionsigneraccount": [0, 3, 23, 31, 39, 40, 55], "transactionsigneraccountprotocol": [0, 3, 31, 54, 55], "transactionwithsign": 35, "transactionwrapp": [30, 35, 37, 50], "transfer": [35, 36, 37, 40, 45, 47, 51, 54, 55], "transfer_algo": 55, "transfer_amount": 49, "transfer_asset": 55, "transient": 46, "transpil": 44, "travers": 47, "trigger": [43, 46], "troubleshoot": 54, "true": [0, 4, 8, 14, 16, 35, 36, 37, 39, 40, 42, 43, 44, 45, 47, 49, 50, 51, 52, 54], "try": [43, 48], "tst": 49, "tupl": [4, 7, 8, 33], "tupletyp": 4, "turn": [40, 43, 44, 54, 55], "two": [9, 21, 35, 39, 43, 45, 48, 52], "tx_id": [8, 17, 35, 37, 48, 50], "tx_info": 4, "txn": [35, 36, 40, 48], "txn_id": 48, "txnparam": [35, 40], "type": [0, 4, 5, 8, 9, 10, 16, 22, 33, 35, 36, 37, 39, 40, 42, 43, 44, 46, 47, 48, 51, 52], "type_str": 4, "typealia": [4, 9, 29], "typed_app_cli": 16, "typed_app_factori": 16, "typed_cli": [16, 32, 38], "typed_factori": 16, "typedappclientprotocol": 33, "typedappclientt": 16, "typedappfactoryprotocol": 33, "typeddict": [5, 9, 21, 30, 35, 43], "typedfactoryt": 16, "typescript": [44, 51, 54], "typing_extens": [0, 3, 7, 33, 37], "u": 30, "uint": [8, 29], "uint64": 37, "uint8arrai": [0, 37, 44], "unabl": 0, "uncircul": [14, 35], "undefin": 40, "under": [39, 43, 51], "underli": [10, 23, 41, 42, 43, 46, 53, 54, 55], "underpin": 39, "underscor": 47, "understand": [6, 43, 50, 53], "undictifi": 9, "unencrypt": [0, 39], "unexpect": 8, "unfreez": [14, 35, 37], "unifi": 55, "union": 40, "uniqu": [19, 39, 43, 44], "unit": [14, 35, 37, 45], "unit_nam": [14, 35, 36, 37, 45, 49], "unit_name_b64": 14, "unitnam": 37, "unknown": 8, "unless": 40, "unnam": [35, 47, 51], "unsign": 47, "unspecifi": 44, "unsur": 55, "until": [3, 40, 55], "untyp": [43, 55], "up": [0, 14, 19, 44, 51, 53, 55], "updat": [5, 6, 7, 12, 19, 35, 36, 37, 42, 44, 47, 49, 50, 51, 53, 54], "updatable_template_nam": [8, 42], "updatableconfig": [19, 47], "update_abi": 43, "update_appl": [9, 10], "update_param": [6, 7, 33, 44], "update_result": [6, 7, 44], "updateapp": 12, "updateappl": 10, "updateapplicationoc": [35, 36, 37], "updatecallabi": 44, "updated_program": 8, "updated_round": 6, "updated_teal_cod": 8, "updatemethod": 37, "updateparamst": 33, "upgrad": [44, 55], "upper": 19, "upskil": 53, "url": [14, 27, 35, 36, 37, 45, 49], "url_b64": 14, "us": [0, 2, 3, 5, 6, 7, 8, 9, 10, 14, 16, 19, 22, 33, 35, 37, 39, 40, 41, 42, 43, 44, 45, 46, 47, 48, 49, 50, 51, 52, 53, 54], "usag": [41, 44, 46, 50, 52], "user": [41, 51], "usual": 40, "util": [19, 22, 39, 40, 41, 42, 43, 44, 46, 48, 49, 50, 52, 53, 55], "utilis": [44, 53], "v": [9, 21, 35, 43, 53], "v1": [16, 55], "v2accountsaddress": 0, "v2client": [3, 6, 8, 14, 16, 27, 35, 37, 45, 46], "v3": 54, "v4": 55, "v7": 55, "valid": [0, 3, 5, 14, 30, 35, 40, 43, 44, 51, 54], "validity_window": [0, 3, 5, 14, 35, 36, 37, 39, 40, 45, 52], "valu": [3, 4, 5, 7, 8, 9, 10, 21, 25, 29, 35, 37, 40, 42, 43, 47, 49, 50, 51, 55], "value1": [42, 43], "value_base64": [25, 42], "value_raw": [25, 42], "value_typ": 10, "valueerror": [0, 4, 5, 6, 8, 10, 14, 16, 35, 37], "vari": 44, "variabl": [0, 3, 5, 8, 10, 14, 16, 17, 39, 40, 44, 46, 47, 48, 52, 53, 54], "variant": 52, "variat": 50, "variou": [0, 7, 8, 19, 35, 36, 37, 40, 43, 46, 51, 54], "various": 43, "verbos": 54, "veri": [51, 55], "verif": 51, "verifi": [44, 49], "version": [0, 6, 7, 10, 12, 16, 23, 39, 42, 43, 44, 49, 53, 55], "via": [0, 7, 9, 17, 21, 35, 39, 40, 41, 42, 43, 44, 45, 47, 48, 50, 51, 52, 54, 55], "void": [37, 50, 51], "vote_first": [35, 36, 37], "vote_kei": [35, 36, 37], "vote_key_dilut": [35, 36, 37], "vote_last": [35, 36, 37], "votekei": 37, "vrf": 35, "wa": [0, 2, 4, 12, 14, 17, 35, 44, 45, 47, 50, 51, 52], "wai": [41, 42, 46, 48, 52, 53, 54, 55], "wait": [3, 35, 40], "wallet": [0, 2, 39], "wallet_nam": 2, "want": [6, 37, 39, 40, 42, 43, 44, 47, 51, 52, 53, 54, 55], "warn": [39, 40, 52], "wasn": [6, 53], "we": [39, 40, 43, 44, 49, 51, 55], "well": [39, 44, 46], "were": [0, 14, 35, 44, 50], "weren": 55, "what": [41, 43, 44], "when": [0, 2, 3, 6, 7, 39, 40, 41, 42, 43, 44, 46, 47, 50, 51, 52, 53, 54, 55], "whenev": 41, "where": [9, 14, 17, 19, 29, 40, 41, 43, 47, 51, 55], "wherea": 55, "wherev": 54, "whether": [0, 6, 7, 14, 16, 19, 35, 40, 44, 45, 47], "which": [0, 3, 16, 39, 40, 41, 43, 44, 45, 46, 47, 48, 51, 52, 53, 54, 55], "while": [39, 44, 48, 50, 55], "who": 47, "window": [0, 3, 14, 35, 40], "with_debug": 19, "with_sourc": 47, "within": [39, 40, 43, 44, 46, 55], "without": [0, 2, 5, 35, 39, 43, 44, 46, 54, 55], "won": [6, 55], "work": [0, 9, 16, 43, 44, 46, 50, 51, 53, 54, 55], "world": [49, 53], "worth": [54, 55], "worthwhil": 55, "would": 55, "wouldn": [37, 52], "wrap": [4, 40, 54], "wrapper": [0, 23, 24, 30, 39, 41, 43, 46, 54], "write": [0, 9, 10, 44, 46, 54], "write_byt": 10, "written": [9, 54], "x": [33, 53, 55], "xbyls2e6yi6xxl5bwcamoa4gtwhxwenzmx5uhxmrnwwuq7bxcy5wc5tepa": [0, 45], "xl": 19, "yet": [39, 43, 55], "you": [0, 6, 7, 37, 39, 40, 41, 42, 43, 44, 45, 46, 47, 48, 49, 51, 52, 53, 54, 55], "your": [40, 43, 44, 47, 48, 49, 51, 53, 55], "your_address": 39, "your_auth_token": 48, "your_sign": 39, "yourself": 48, "zero": [14, 37], "\u00b5algo": [24, 51]}, "titles": ["algokit_utils.accounts.account_manager", "algokit_utils.accounts", "algokit_utils.accounts.kmd_account_manager", "algokit_utils.algorand", "algokit_utils.applications.abi", "algokit_utils.applications.app_client", "algokit_utils.applications.app_deployer", "algokit_utils.applications.app_factory", "algokit_utils.applications.app_manager", "algokit_utils.applications.app_spec.arc32", "algokit_utils.applications.app_spec.arc56", "algokit_utils.applications.app_spec", "algokit_utils.applications.enums", "algokit_utils.applications", "algokit_utils.assets.asset_manager", "algokit_utils.assets", "algokit_utils.clients.client_manager", "algokit_utils.clients.dispenser_api_client", "algokit_utils.clients", "algokit_utils.config", "algokit_utils.errors", "algokit_utils.errors.logic_error", "algokit_utils", "algokit_utils.models.account", "algokit_utils.models.amount", "algokit_utils.models.application", "algokit_utils.models", "algokit_utils.models.network", "algokit_utils.models.simulate", "algokit_utils.models.state", "algokit_utils.models.transaction", "algokit_utils.protocols.account", "algokit_utils.protocols", "algokit_utils.protocols.typed_clients", "algokit_utils.transactions", "algokit_utils.transactions.transaction_composer", "algokit_utils.transactions.transaction_creator", "algokit_utils.transactions.transaction_sender", "API Reference", "Account management", "Algorand client", "Algo amount handling", "App management", "App client and App factory", "App deployment", "Assets", "Client management", "Debugger", "TestNet Dispenser Client", "Testing", "Transaction management", "Transaction composer", "Algo transfers (payments)", "Typed application clients", "AlgoKit Python Utilities", "Migration Guide - v3"], "titleterms": {"1": 55, "2": 55, "3": 55, "4": 55, "5": 55, "6": 55, "7": 55, "8": 55, "A": 55, "In": 45, "abi": 4, "access": [40, 42, 46], "account": [0, 1, 2, 23, 31, 39, 43, 45, 48, 55], "account_manag": 0, "accountassetinform": 45, "accountmanag": 39, "addit": 41, "after": 55, "algo": [41, 52], "algoamount": 41, "algokit": 54, "algokit_util": [0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 20, 21, 22, 23, 24, 25, 26, 27, 28, 29, 30, 31, 32, 33, 34, 35, 36, 37], "algokitlogg": 47, "algorand": [3, 40], "algorandcli": 55, "all": 55, "amount": [24, 41], "an": [41, 43, 46, 48, 53], "api": [38, 46], "app": [42, 43, 44, 51, 53, 55], "app_client": 5, "app_deploy": 6, "app_factori": 7, "app_manag": 8, "app_spec": [9, 10, 11], "appclient": [43, 55], "appdeploy": 44, "appfactori": 43, "applic": [4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 25, 49, 50, 53], "applicationcli": 55, "applicationspecif": 55, "appmanag": 42, "arc32": 9, "arc56": 10, "argument": 43, "asset": [14, 15, 45, 49, 55], "asset_manag": 14, "assetinform": 45, "assetmanag": 45, "attribut": [4, 5, 6, 8, 9, 17, 19, 23, 24, 29, 30, 35], "automat": 46, "basic": 49, "befor": 55, "best": 55, "box": [42, 49], "break": 55, "budget": 51, "bulk": 45, "call": [42, 43, 47, 49, 51], "capabl": 54, "chang": 55, "class": [0, 2, 3, 4, 5, 6, 7, 8, 9, 10, 12, 14, 16, 17, 19, 21, 23, 24, 25, 27, 28, 29, 30, 31, 33, 35, 36, 37, 39, 40, 55], "client": [16, 17, 18, 40, 42, 43, 46, 48, 53, 55], "client_manag": 16, "clientmanag": 46, "common": 42, "compil": [42, 44], "compos": [40, 51], "config": [19, 54], "configur": [40, 46, 47], "construct": 51, "content": [0, 2, 3, 4, 5, 6, 7, 8, 9, 10, 12, 14, 16, 17, 19, 21, 23, 24, 25, 27, 28, 29, 30, 31, 33, 35, 36, 37, 54], "contract": 44, "convert": 55, "core": 54, "correctli": 55, "cover": [51, 55], "creat": [40, 41, 43, 46, 48, 49, 53], "current": 48, "debug": [47, 54], "debugg": 47, "default": [39, 43], "delet": 43, "deploi": [43, 44, 53], "deploy": [44, 49], "deprec": 55, "develop": 44, "diagnos": 43, "dispens": [39, 46, 48, 52], "dispenser_api_cli": 17, "displai": 55, "document": 54, "doe": 55, "dynam": 43, "each": 50, "encount": 50, "ensure_fund": 52, "enum": 12, "error": [20, 21, 43, 48], "exampl": [39, 52], "except": 21, "extract": 41, "factori": [43, 53], "featur": 41, "fee": 51, "filenam": 47, "format": 47, "from": 41, "function": [4, 5, 21, 24, 35], "fund": [43, 48], "further": 50, "gener": [43, 53, 55], "get": [39, 42, 45, 48, 53], "given": 43, "global": [42, 47], "group": 40, "guid": 55, "handl": [41, 43, 48], "hold": 45, "i": 53, "idempot": 44, "inform": [42, 45, 46], "inner": 51, "input": 44, "instal": 54, "instanc": [40, 46, 53], "interfac": 55, "issu": 40, "kmd": 39, "kmd_account_manag": 2, "lifecycl": 44, "limit": 48, "ll": 50, "local": 42, "log": [47, 54], "logic": 43, "logic_error": 21, "lookup": 44, "manag": [39, 40, 42, 46, 50, 55], "messag": 47, "metadata": 44, "method": [43, 55], "migrat": 55, "mode": 54, "model": [23, 24, 25, 26, 27, 28, 29, 30], "modul": [0, 2, 3, 4, 5, 6, 7, 8, 9, 10, 12, 14, 16, 17, 19, 21, 23, 24, 25, 27, 28, 29, 30, 31, 33, 35, 36, 37], "name": 44, "network": [27, 46], "onli": 51, "op": 51, "oper": 45, "opt": 45, "out": 45, "paramet": [40, 42, 44, 45], "payment": 52, "per": 47, "perform": 44, "popul": 51, "practic": 55, "prerequisit": 55, "principl": 54, "protocol": [31, 32, 33], "python": 54, "read": [43, 50, 51], "refer": [38, 42, 54], "refund": 48, "regist": [39, 48], "rekei": 39, "replac": 55, "resourc": 51, "result": 50, "retri": 46, "return": 44, "scenario": 55, "sdk": [40, 46, 55], "send": 40, "sendatomictransactioncomposerresult": 50, "sendsingletransactionresult": 50, "setup": 49, "sign": 51, "signer": 39, "simul": [28, 51], "singl": 40, "singleton": 54, "smart": 44, "spec": [43, 53], "specif": 50, "state": [29, 42, 43, 55], "step": 55, "storag": 49, "submodul": [1, 11, 13, 15, 18, 20, 22, 26, 32, 34], "substitut": 44, "suppress": 47, "templat": 44, "test": [49, 54], "testnet": [46, 48], "trace": 47, "transact": [30, 34, 35, 36, 37, 40, 50, 51, 55], "transaction_compos": 35, "transaction_cr": 36, "transaction_send": 37, "transactionsigneraccountprotocol": 39, "transfer": [49, 52], "troubleshoot": 55, "type": [50, 53, 54, 55], "typed_cli": 33, "underli": 39, "updat": [43, 55], "us": 55, "usag": [53, 54, 55], "util": [47, 54], "v2": 55, "v3": 55, "valu": [41, 44], "via": 46, "warn": 55, "where": 50, "without": 51, "you": 50}}) \ No newline at end of file diff --git a/docs/html/v3-migration-guide.html b/docs/html/v3-migration-guide.html new file mode 100644 index 00000000..be21dd9f --- /dev/null +++ b/docs/html/v3-migration-guide.html @@ -0,0 +1,724 @@ + + + + + + + + + Migration Guide - v3 - algokit-utils-py 3.0 documentation + + + + + + + + + + + + + + + + + Contents + + + + + + Menu + + + + + + + + Expand + + + + + + Light mode + + + + + + + + + + + + + + Dark mode + + + + + + + Auto light/dark, in light mode + + + + + + + + + + + + + + + Auto light/dark, in dark mode + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +Skip to content + + + +
    +
    +
    + +
    + +
    +
    + +
    + +
    +
    + +
    +
    +
    + + + + + Back to top + +
    + +
    + +
    + +
    +
    +
    +

    Migration Guide - v3

    +

    Version 3 of algokit-utils-ts moved from a stateless function-based interface to a stateful class-based interfaces. This change allows for:

    +
      +
    • Easier and simpler consumption experience guided by IDE autocompletion

    • +
    • Less redundant parameter passing (e.g., algod client)

    • +
    • Better performance through caching of commonly retrieved values like transaction parameters

    • +
    • More consistent and intuitive API design

    • +
    • Stronger type safety and better error messages

    • +
    • Improved ARC-56 compatibility

    • +
    • Feature parity with algokit-utils-ts >= v7 interfaces

    • +
    +

    The entry point to most functionality in AlgoKit Utils is now available via a single entry-point, the AlgorandClient class.

    +

    The v2 interfaces and abstractions will be removed in future major version bumps, however in order to ensure gradual migration, all v2 abstractions are available with respective deprecation warnings. The new way to use AlgoKit Utils is via the AlgorandClient class, which is easier, simpler, and more convenient to use and has powerful new features.

    +
    +

    BREAKING CHANGE: the beta module is now removed, any imports from algokit_utils.beta will now raise an error with a link to a new expected import path. This is due to the fact that the interfaces introduced in beta are now refined and available in the main module.

    +
    +
    +

    Migration Steps

    +

    In general, your codebase might fall into one of the following migration scenarios:

    +
      +
    • Using algokit-utils-py v2.x only without use of abstractions from beta module

    • +
    • Using algokit-utils-py v2.x only and with use of abstractions from beta module

    • +
    • Using algokit-utils-py v2.x with algokit-client-generator-py v1.x

    • +
    • Using algokit-client-generator-py v1.x only (implies implicit dependency on algokit-utils-py v2.x)

    • +
    +

    Given that algokit-utils-py v3.x is backwards compatible with algokit-client-generator-py v1.x, the following general guidelines are applicable to all scenarios (note that the order of operations is important to ensure straight-forward migration):

    +
      +
    1. Upgrade to algokit-utils-py v3.x

      +
        +
      • 1.1 (If used) Update imports from algokit_utils.beta to algokit_utils

      • +
      • 1.2 Follow hints in deprecation warnings to update your codebase to rely on latest v3 interfaces

      • +
      +
    2. +
    3. Upgrade to algokit-client-generator-py v2.x and regenerate typed clients

      + +
    4. +
    +

    The remaining set of guidelines are outlining migrations for specific abstractions that had direct equivalents in algokit-utils-py v2.x.

    +
    +

    Prerequisites

    +

    It is important to reiterate that if you have previously relied on beta versions of algokit-utils-py v2.x, you will need to update your imports to rely on the new interfaces. Errors thrown during import from beta will provide a description of the new expected import path.

    +
    +

    As with v2.x all public abstractions in algokit_utils are available for direct imports from algokit_utils import ..., however underlying modules have been refined to be structured loosely around common AVM domains such as applications, transactions, accounts, assets, etc. See API reference for latest and detailed overview.

    +
    +
    +
    +

    Step 1 - Replace SDK Clients with AlgorandClient

    +

    First, replace your SDK client initialization with AlgorandClient. Look for get_algod_client calls and replace with an appropriate AlgorandClient initialization:

    +
    """Before"""
    +import algokit_utils
    +algod = algokit_utils.get_algod_client()
    +indexer = algokit_utils.get_indexer_client()
    +
    +"""After"""
    +from algokit_utils import AlgorandClient
    +algorand = AlgorandClient.from_environment()  # or .testnet(), .mainnet(), etc.
    +
    +
    +

    During migration, you can still access SDK clients if needed:

    +
    algod = algorand.client.algod
    +indexer = algorand.client.indexer
    +kmd = algorand.client.kmd
    +
    +
    +
    +
    +

    Step 2 - Update Account Management

    +

    Account management has moved to algorand.account:

    +
    +

    Before:

    +
    account = algokit_utils.get_account_from_mnemonic(
    +    mnemonic=os.getenv("MY_ACCOUNT_MNEMONIC"),
    +)
    +dispenser = algokit_utils.get_dispenser_account(algod)
    +
    +
    +
    +
    +

    After:

    +
    account = algorand.account.from_mnemonic(os.getenv("MY_ACCOUNT_MNEMONIC"))
    +dispenser = algorand.account.dispenser_from_environment()
    +
    +
    +

    Key changes:

    +
      +
    • get_accountaccount.from_environment

    • +
    • get_account_from_mnemonicaccount.from_mnemonic

    • +
    • get_dispenser_accountaccount.dispenser_from_environment

    • +
    • get_localnet_default_accountaccount.localnet_dispenser

    • +
    +
    +
    +
    +

    Step 3 - Update Transaction Management

    +

    Transaction creation and sending is now more structured:

    +
    +

    Before:

    +
    # Single transaction
    +result = algokit_utils.transfer_algos(
    +    from_account=account,
    +    to_addr="RECEIVER",
    +    amount=algokit_utils.algos(1),
    +    algod_client=algod,
    +)
    +
    +# Transaction groups
    +atc = AtomicTransactionComposer()
    +# ... add transactions ...
    +result = algokit_utils.execute_atc_with_logic_error(atc, algod)
    +
    +
    +
    +
    +

    After:

    +
    # Single transaction
    +result = algorand.send.payment(
    +    sender=account.address,
    +    receiver="RECEIVER",
    +    amount=AlgoAmount.from_algo(1),
    +)
    +
    +# Transaction groups
    +composer = algorand.new_group()
    +# ... add transactions ...
    +result = composer.send()
    +
    +
    +

    Key changes:

    +
      +
    • transfer_algosalgorand.send.payment

    • +
    • transfer_assetalgorand.send.asset_transfer

    • +
    • execute_atc_with_logic_errorcomposer.send()

    • +
    • Transaction parameters are now more consistently named (e.g., sender instead of from_account)

    • +
    • Improved amount handling with dedicated AlgoAmount class (e.g., AlgoAmount.from_algo(1))

    • +
    +
    +
    +
    +

    Step 4 - Update ApplicationSpecification usage

    +

    ApplicationSpecification abstraction is largely identical to v2, however it’s been renamed to Arc32Contract to better reflect the fact that it’s a contract specification for a specific ARC and addition of Arc56Contract supporting the latest recommended conventions. Hence the main actionable change is to update your import to from algokit_utils import Arc32Contract and rename ApplicationSpecification to Arc32Contract.

    +

    You can instantiate an Arc56Contract instance from an Arc32Contract instance using the Arc56Contract.from_arc32 method. For instance:

    +
    testing_app_arc32_app_spec = Arc32Contract.from_json(app_spec_json)
    +arc56_app_spec = Arc56Contract.from_arc32(testing_app_arc32_app_spec)
    +
    +
    +
    +

    Despite auto conversion of ARC-32 to ARC-56, we recommend recompiling your contract to a fully compliant ARC-56 specification given that auto conversion would skip populating information that can’t be parsed from raw ARC-32.

    +
    +
    +
    +

    Step 5 - Replace ApplicationClient usage

    +

    The existing ApplicationClient (untyped app client) class is still present until at least v4, but it’s worthwhile migrating to the new AppClient and AppFactory classes. These new clients are ARC-56 compatible, but also support ARC-32 app specs and will continue to support this indefinitely until such time the community deems they are deprecated.

    +

    All of the functionality in ApplicationClient is available within the new classes, but their interface is slightly different to make it easier to use and more consistent with the new AlgorandClient functionality. The key existing methods that have changed all have @deprecation notices to help guide you on this, but broadly the changes are:

    +
      +
    • The app resolution semantics, now have static methods that determine different ways of constructing a client and the constructor itself is very simple (requiring app_id)

    • +
    • If you want to call create or deploy then you need an AppFactory to do that, and then it will in turn give you an AppClient instance that is connected to the app you just created / deployed. This significantly simplifies the app client because now the app client has a clear operating purpose: allow for calls and state management for an instance of an app, whereas the app factory handles all of the calls when you don’t have an instance yet (or may or may not have an instance in the case of deploy).

    • +
    • This means that you can simply access client.app_id and client.app_address on AppClient since these values are known statically and won’t change (previously associated calls to app_address, app_id properties potentially required extra API calls as the values weren’t always available).

    • +
    • Adding fund_app_account which serves as a convenience method to top up the balance of address associated with application.

    • +
    • All of the methods that return or execute a transaction (update, call, opt_in, etc.) are now exposed in an interface similar to the one in AlgorandClient, namely (where {call_type} is one of: update / delete / opt_in / close_out / clear_state / call):

      +
        +
      • appClient.create_transaction.{callType} to get a transaction for an ABI method call

      • +
      • appClient.send.{call_type} to sign and send a transaction for an ABI method call

      • +
      • appClient.params.{call_type} to get a params object for an ABI method call

      • +
      • appClient.create_transaction.bare.{call_type} to get a transaction for a bare app call

      • +
      • appClient.send.bare.{call_type} to sign and send a transaction for a bare app call

      • +
      • appClient.params.bare.{call_type} to get a params object for a bare app call

      • +
      +
    • +
    • The semantics to resolve the application is now available via simpler entrypoints within algorand.client

    • +
    • When making an ABI method call, the method arguments property is are now passed via explicit args field in a parameters dataclass applicable to the method call.

    • +
    • The foreign reference arrays have been renamed to align with typed parameters on ts and related core algosdk:

      +
        +
      • boxes -> box_references

      • +
      • apps -> app_references

      • +
      • assets -> asset_references

      • +
      • accounts -> account_references

      • +
      +
    • +
    • The return value for methods that send a transaction will have any ABI return value directly in the abi_return property rather than the low level algosdk ABIResult type while also automatically decoding values based on provided ARC56 spec.

    • +
    +
    +
    +

    Step 6 - Replace typed app client usage

    +

    Version 2 of the Python typed app client generator introduces breaking changes to the generated client that support the new AppFactory and AppClient functionality along with adding ARC-56 support. The generated client has better typing support for things like state commensurate with the new capabilities within ARC-56.

    +

    It’s worth noting that because we have maintained backwards compatibility with the pre v2 algokit-utils-py stateless functions, older typed clients generated using version 1 of the Python typed client generator will work against v3 of utils, however you won’t have access to the new features or ARC-56 support.

    +

    If you want to convert from an older typed client to a new one you will need to make certain changes. Refer to client generator v2 migration guide.

    +
    +
    +

    Step 7 - Update AppClient State Management

    +

    State management is now more structured and type-safe:

    +
    """Before"""
    +global_state = app_client.get_global_state()
    +local_state = app_client.get_local_state(account_address)
    +box_value = app_client.get_box_value("box_name")
    +
    +"""After"""
    +# Global state
    +global_state = app_client.state.global_state.get_all()
    +value = app_client.state.global_state.get_value("key_name")
    +map_value = app_client.state.global_state.get_map_value("map_name", "key")
    +
    +# Local state
    +local_state = app_client.state.local_state(account_address).get_all()
    +value = app_client.state.local_state(account_address).get_value("key_name")
    +map_value = app_client.state.local_state(account_address).get_map_value("map_name", "key")
    +
    +# Box storage
    +box_value = app_client.state.box.get_value("box_name")
    +boxes = app_client.state.box.get_all()
    +map_value = app_client.state.box.get_map_value("map_name", "key")
    +
    +
    +
    +
    +

    Step 8 - Update Asset Management

    +

    Asset management is now more consistent:

    +
    """Before"""
    +result = algokit_utils.opt_in(algod, account, [asset_id])
    +
    +"""After"""
    +result = algorand.send.asset_opt_in(
    +    params=AssetOptInParams(
    +        sender=account.address,
    +        asset_id=asset_id,
    +    )
    +)
    +
    +
    +
    +
    +
    +

    Breaking Changes

    +
      +
    1. Client Management

      +
        +
      • Removal of standalone client creation functions

      • +
      • All clients now accessed through AlgorandClient

      • +
      +
    2. +
    3. Account Management

      +
        +
      • Account creation functions moved to AccountManager accessible via algorand.account property

      • +
      • Unified TransactionSignerAccountProtocol with compliant and typed SigningAccount, TransactionSignerAccount, LogicSigAccount, MultiSigAccount classes encapsulating low level algosdk abstractions.

      • +
      • Improved typing for account operations, such as obtaining account information from algod, returning a typed information object.

      • +
      +
    4. +
    5. Transaction Management

      +
        +
      • Consistent and intuitive transaction creation and sending interface accessible via algorand.{send|params|create_transaction} properties

      • +
      • New transaction composition interface accessible via algorand.new_group

      • +
      • Removing necessity to interact with low level and untyped algosdk abstractions for assembling, signing and sending transaction(s).

      • +
      +
    6. +
    7. Application Client

      +
        +
      • Split into AppClient, AppDeployer and AppFactory

      • +
      • New intuitive structured interface for creating or sending AppCall|AppMethodCall transactions

      • +
      • ARC-56 support along with automatic conversion of specs from ARC-32 to ARC-56

      • +
      +
    8. +
    9. State Management

      +
        +
      • New hierarchical state access available via app_client.state.{global_state|local_state|box} properties

      • +
      • Improved typing for state values

      • +
      • Support for ARC-56 state schemas

      • +
      +
    10. +
    11. Asset Management

      +
        +
      • Dedicated AssetManager class for asset management accessible via algorand.asset property

      • +
      • Improved typing for asset operations, such as obtaining asset information from algod, returning a typed information object.

      • +
      • Consistent interface for asset opt-in, transfer, freeze, etc.

      • +
      +
    12. +
    +
    +
    +

    Best Practices

    +
      +
    1. Use the new AlgorandClient as the main entry point

    2. +
    3. Leverage IDE autocompletion to discover available functionality, consult with API reference when unsure

    4. +
    5. Use the transaction parameter builders for type-safe transaction creation (algorand.params.{})

    6. +
    7. Use the state accessor patterns for cleaner state management {algorand.state.{}}

    8. +
    9. Use high level TransactionComposer interface over low level algosdk abstractions (where possible)

    10. +
    11. Use source maps and debug mode to quickly troubleshoot on-chain errors

    12. +
    13. Use idempotent deployment patterns with versioning

    14. +
    +
    +
    +

    Troubleshooting

    +
    +

    A v2 interface/method/class does not display a deprecation warning correctly or at all

    +

    Submit an issue to algokit-utils-py with a description of the problem and the code that is causing it.

    +
    +
    +

    Useful scenario of converting v2 to v3 not covered in generic migration guide

    +

    If you have a scenario that you think is useful and not covered in the generic migration guide, please submit an issue to algokit-utils-py with a scenario.

    +
    +
    +
    + +
    +
    + +
    + +
    +
    + + + + + \ No newline at end of file diff --git a/docs/markdown/autoapi/algokit_utils/clients/dispenser_api_client/index.md b/docs/markdown/autoapi/algokit_utils/clients/dispenser_api_client/index.md index 053b81d3..a9705d87 100644 --- a/docs/markdown/autoapi/algokit_utils/clients/dispenser_api_client/index.md +++ b/docs/markdown/autoapi/algokit_utils/clients/dispenser_api_client/index.md @@ -83,11 +83,14 @@ Default request timeout is 15 seconds. Modify by passing request_timeout to the #### fund(address: str, amount: int) → [DispenserFundResponse](#algokit_utils.clients.dispenser_api_client.DispenserFundResponse) +#### fund(address: str, amount: int, asset_id: int | None = None) → [DispenserFundResponse](#algokit_utils.clients.dispenser_api_client.DispenserFundResponse) + Fund an account with Algos from the dispenser API * **Parameters:** * **address** – The address to fund * **amount** – The amount of Algos to fund + * **asset_id** – The asset ID to fund (deprecated) * **Returns:** The transaction ID of the funded transaction * **Raises:** diff --git a/docs/markdown/capabilities/algorand-client.md b/docs/markdown/capabilities/algorand-client.md index 0ac2a42c..0ced807e 100644 --- a/docs/markdown/capabilities/algorand-client.md +++ b/docs/markdown/capabilities/algorand-client.md @@ -29,14 +29,6 @@ algorand = AlgorandClient.from_config( ) ``` -> NOTE: AlgorandClient introducted in v3.0.0 implements a new functionality that caches suggested parameters for you automatically. This is to reduce the number of requests made to the network for suggested parameters, to control this behaviour you can use the following methods: -> -> - `algorand.set_suggested_params_cache_timeout(timeout)` - Set the timeout that is used to cache the suggested network parameters (by default 3 seconds) -> - `algorand.set_suggested_params_cache(suggested_params, until)` - Set the suggested network parameters to use (optionally until the given time) -> - `algorand.get_suggested_params()` - Get the current suggested network parameters object, either the cached value, or if the cache has expired a fresh value -> -> See [Transaction configuration](transaction.md#transaction-configuration) for more information. - ## Accessing SDK clients Once you have an `AlgorandClient` instance, you can access the SDK clients for the various Algorand APIs via the `algorand.client` property. @@ -193,6 +185,6 @@ Then on top of that the base type gets extended for the specific type of transac AlgorandClient caches network provided transaction values for you automatically to reduce network traffic. It has a set of default configurations that control this behaviour, but you have the ability to override and change the configuration of this behaviour: - `algorand.set_default_validity_window(validity_window)` - Set the default validity window (number of rounds from the current known round that the transaction will be valid to be accepted for), having a smallish value for this is usually ideal to avoid transactions that are valid for a long future period and may be submitted even after you think it failed to submit if waiting for a particular number of rounds for the transaction to be successfully submitted. The validity window defaults to `10`, except localnet environments where it’s set to `1000`. -- `algorand.set_suggested_params(suggested_params, until)` - Set the suggested network parameters to use (optionally until the given time) +- `algorand.set_suggested_params(suggested_params, until?)` - Set the suggested network parameters to use (optionally until the given time) - `algorand.set_suggested_params_timeout(timeout)` - Set the timeout that is used to cache the suggested network parameters (by default 3 seconds) - `algorand.get_suggested_params()` - Get the current suggested network parameters object, either the cached value, or if the cache has expired a fresh value From f6f7217884dd08e425466983cf00de953cd22561 Mon Sep 17 00:00:00 2001 From: Altynbek Orumbayev Date: Tue, 18 Feb 2025 15:08:34 +0100 Subject: [PATCH 2/2] chore: tweak cd to ignore release triggers on changes only within .github or docs folders --- .github/workflows/cd.yaml | 3 +++ .github/workflows/check-python.yaml | 1 - .../algokit_utils/applications/enums/index.md | 6 +++--- .../algokit_utils/protocols/typed_clients/index.md | 12 ++++-------- 4 files changed, 10 insertions(+), 12 deletions(-) diff --git a/.github/workflows/cd.yaml b/.github/workflows/cd.yaml index cd0a8697..3530431b 100644 --- a/.github/workflows/cd.yaml +++ b/.github/workflows/cd.yaml @@ -4,6 +4,9 @@ on: push: branches: - main + paths-ignore: + - "docs/**" + - ".github/**" workflow_dispatch: inputs: production_release: diff --git a/.github/workflows/check-python.yaml b/.github/workflows/check-python.yaml index 25d6f083..ab38fe66 100644 --- a/.github/workflows/check-python.yaml +++ b/.github/workflows/check-python.yaml @@ -48,7 +48,6 @@ jobs: - name: Check docstrings are up to date run: poetry run poe docstrings-check - TODO: Restore before prod release of v3 - name: Check docs are up to date run: | poetry run poe docs-md-only diff --git a/docs/markdown/autoapi/algokit_utils/applications/enums/index.md b/docs/markdown/autoapi/algokit_utils/applications/enums/index.md index ac63173b..c3672fc0 100644 --- a/docs/markdown/autoapi/algokit_utils/applications/enums/index.md +++ b/docs/markdown/autoapi/algokit_utils/applications/enums/index.md @@ -9,7 +9,7 @@ ## Module Contents -### *class* algokit_utils.applications.enums.OnSchemaBreak(\*args, \*\*kwds) +### *class* algokit_utils.applications.enums.OnSchemaBreak Bases: `enum.Enum` @@ -27,7 +27,7 @@ Create a new Application and delete the old Application in a single transaction Create a new Application -### *class* algokit_utils.applications.enums.OnUpdate(\*args, \*\*kwds) +### *class* algokit_utils.applications.enums.OnUpdate Bases: `enum.Enum` @@ -49,7 +49,7 @@ Create a new Application and delete the old Application in a single transaction Create a new application -### *class* algokit_utils.applications.enums.OperationPerformed(\*args, \*\*kwds) +### *class* algokit_utils.applications.enums.OperationPerformed Bases: `enum.Enum` diff --git a/docs/markdown/autoapi/algokit_utils/protocols/typed_clients/index.md b/docs/markdown/autoapi/algokit_utils/protocols/typed_clients/index.md index 751ea934..8cca87b9 100644 --- a/docs/markdown/autoapi/algokit_utils/protocols/typed_clients/index.md +++ b/docs/markdown/autoapi/algokit_utils/protocols/typed_clients/index.md @@ -23,9 +23,7 @@ class Proto(Protocol): ``` Such classes are primarily used with static type checkers that recognize -structural subtyping (static duck-typing). - -For example: +structural subtyping (static duck-typing), for example: ```default class C: @@ -44,7 +42,7 @@ only the presence of given attributes, ignoring their type signatures. Protocol classes can be generic, they are defined as: ```default -class GenProto[T](Protocol): +class GenProto(Protocol[T]): def meth(self) -> T: ... ``` @@ -68,9 +66,7 @@ class Proto(Protocol): ``` Such classes are primarily used with static type checkers that recognize -structural subtyping (static duck-typing). - -For example: +structural subtyping (static duck-typing), for example: ```default class C: @@ -89,7 +85,7 @@ only the presence of given attributes, ignoring their type signatures. Protocol classes can be generic, they are defined as: ```default -class GenProto[T](Protocol): +class GenProto(Protocol[T]): def meth(self) -> T: ... ```