From 9be41d793216daf06cddade47100164b8b5fc417 Mon Sep 17 00:00:00 2001 From: nullun Date: Mon, 18 Mar 2024 15:43:07 +0000 Subject: [PATCH] Update algokit docs --- .../2023-07-19_advanced_generate_command.md | 2 +- .../2024-01-13_native_binaries.md | 163 ++++++ .../2024-01-23_init-wizard-v2.md | 211 ++++++++ .../2024-01-31_binary_distribution.md | 255 +++++++++ .../2024-01-13_native_binaries/image_1.png | Bin 0 -> 210770 bytes .../2024-01-13_native_binaries/image_2.png | Bin 0 -> 202300 bytes docs/get-details/algokit/cli-reference.md | 506 +++++++++++++++++- docs/get-details/algokit/features/deploy.md | 2 + .../get-details/algokit/features/dispenser.md | 2 +- docs/get-details/algokit/features/generate.md | 29 +- docs/get-details/algokit/features/init.md | 96 +++- docs/get-details/algokit/features/localnet.md | 41 +- docs/get-details/algokit/features/tasks.md | 16 + .../algokit/features/tasks/analyze.md | 33 ++ .../algokit/features/tasks/ipfs.md | 66 +++ .../algokit/features/tasks/mint.md | 70 +++ .../get-details/algokit/features/tasks/nfd.md | 45 ++ .../get-details/algokit/features/tasks/opt.md | 71 +++ .../algokit/features/tasks/send.md | 60 +++ .../algokit/features/tasks/sign.md | 94 ++++ .../algokit/features/tasks/transfer.md | 54 ++ .../algokit/features/tasks/vanity_address.md | 56 ++ .../algokit/features/tasks/wallet.md | 93 ++++ docs/get-details/algokit/index.md | 53 +- .../algokit/tutorials/algokit-template.md | 29 + docs/get-details/algokit/tutorials/intro.md | 124 ++--- .../algokit/utils/ts/client_generator.md | 26 + .../classes/types_account.MultisigAccount.md | 2 +- .../classes/types_config.UpdatableConfig.md | 48 +- .../types_debugging.AVMDebuggerSourceMap.md | 24 +- ...pes_debugging.AVMDebuggerSourceMapEntry.md | 26 +- .../types_debugging.PersistSourceMapInput.md | 52 +- .../classes/types_logic_error.LogicError.md | 16 +- .../code/enums/types_indexer.AccountStatus.md | 6 +- .../types_indexer.ApplicationOnComplete.md | 12 +- .../code/enums/types_indexer.SignatureType.md | 6 +- .../interfaces/types_app.AppCallParams.md | 17 + .../types_app.AppCallTransactionResult.md | 8 +- ...ypes_app.AppCallTransactionResultOfType.md | 8 +- .../types_app.AppDeploymentParams.md | 17 + .../interfaces/types_app.CreateAppParams.md | 17 + .../interfaces/types_app.UpdateAppParams.md | 17 + .../types_asset.AssetOptInParams.md | 17 + .../types_asset.AssetOptOutParams.md | 17 + .../ts/code/interfaces/types_config.Config.md | 30 +- ...ypes_debugging.AVMDebuggerSourceMapDict.md | 4 +- ...types_debugging.PersistSourceMapsParams.md | 18 +- ...ugging.SimulateAndPersistResponseParams.md | 18 +- .../types_indexer.AccountParticipation.md | 12 +- .../interfaces/types_indexer.AccountResult.md | 52 +- .../interfaces/types_indexer.AppLocalState.md | 12 +- .../types_indexer.ApplicationParams.md | 14 +- .../types_indexer.ApplicationResult.md | 10 +- ...es_indexer.ApplicationTransactionResult.md | 22 +- ...es_indexer.AssetConfigTransactionResult.md | 6 +- ...es_indexer.AssetFreezeTransactionResult.md | 6 +- .../interfaces/types_indexer.AssetHolding.md | 12 +- .../interfaces/types_indexer.AssetParams.md | 30 +- .../interfaces/types_indexer.AssetResult.md | 10 +- ..._indexer.AssetTransferTransactionResult.md | 12 +- .../interfaces/types_indexer.EvalDelta.md | 6 +- ...ndexer.KeyRegistrationTransactionResult.md | 14 +- ...types_indexer.LogicTransactionSignature.md | 8 +- .../types_indexer.MerkleArrayProof.md | 94 ++++ ...es_indexer.MultisigTransactionSignature.md | 8 +- ...indexer.MultisigTransactionSubSignature.md | 6 +- .../types_indexer.PaymentTransactionResult.md | 8 +- ...pes_indexer.StateProofTransactionResult.md | 88 +++ .../interfaces/types_indexer.StateSchema.md | 4 +- .../types_indexer.TransactionResult.md | 87 +-- .../types_indexer.TransactionSignature.md | 12 +- .../types_testing.AlgoKitLogCaptureFixture.md | 4 + .../types_testing.AlgorandFixture.md | 2 + ...s_testing.AlgorandTestAutomationContext.md | 6 + ...saction.AtomicTransactionComposerToSend.md | 4 +- ..._transaction.ConfirmedTransactionResult.md | 4 +- ...transaction.ConfirmedTransactionResults.md | 8 +- ...on.SendAtomicTransactionComposerResults.md | 10 +- ...types_transaction.SendTransactionParams.md | 13 + ...types_transaction.SendTransactionResult.md | 4 +- ...ypes_transaction.SendTransactionResults.md | 4 +- ...ypes_transaction.TransactionGroupToSend.md | 6 +- .../types_transaction.TransactionToSign.md | 4 +- .../types_transfer.AlgoRekeyParams.md | 17 + .../types_transfer.AlgoTransferParams.md | 17 + .../types_transfer.EnsureFundedParams.md | 17 + .../types_transfer.TransferAssetParams.md | 17 + .../algokit/utils/ts/code/modules/index.md | 208 +++++-- .../algokit/utils/ts/code/modules/testing.md | 6 +- .../utils/ts/code/modules/types_indexer.md | 2 + .../ts/code/modules/types_transaction.md | 2 +- docs/get-details/crust.md | 4 +- docs/get-started/algokit.md | 2 +- scripts/algokit-docs.sh | 0 scripts/algokit-utils.py | 0 95 files changed, 2969 insertions(+), 502 deletions(-) create mode 100644 docs/get-details/algokit/architecture-decisions/2024-01-13_native_binaries.md create mode 100644 docs/get-details/algokit/architecture-decisions/2024-01-23_init-wizard-v2.md create mode 100644 docs/get-details/algokit/architecture-decisions/2024-01-31_binary_distribution.md create mode 100644 docs/get-details/algokit/architecture-decisions/assets/2024-01-13_native_binaries/image_1.png create mode 100644 docs/get-details/algokit/architecture-decisions/assets/2024-01-13_native_binaries/image_2.png create mode 100644 docs/get-details/algokit/features/tasks.md create mode 100644 docs/get-details/algokit/features/tasks/analyze.md create mode 100644 docs/get-details/algokit/features/tasks/ipfs.md create mode 100644 docs/get-details/algokit/features/tasks/mint.md create mode 100644 docs/get-details/algokit/features/tasks/nfd.md create mode 100644 docs/get-details/algokit/features/tasks/opt.md create mode 100644 docs/get-details/algokit/features/tasks/send.md create mode 100644 docs/get-details/algokit/features/tasks/sign.md create mode 100644 docs/get-details/algokit/features/tasks/transfer.md create mode 100644 docs/get-details/algokit/features/tasks/vanity_address.md create mode 100644 docs/get-details/algokit/features/tasks/wallet.md create mode 100644 docs/get-details/algokit/utils/ts/code/interfaces/types_indexer.MerkleArrayProof.md create mode 100644 docs/get-details/algokit/utils/ts/code/interfaces/types_indexer.StateProofTransactionResult.md mode change 100644 => 100755 scripts/algokit-docs.sh mode change 100644 => 100755 scripts/algokit-utils.py diff --git a/docs/get-details/algokit/architecture-decisions/2023-07-19_advanced_generate_command.md b/docs/get-details/algokit/architecture-decisions/2023-07-19_advanced_generate_command.md index c8d192a4..4073494f 100644 --- a/docs/get-details/algokit/architecture-decisions/2023-07-19_advanced_generate_command.md +++ b/docs/get-details/algokit/architecture-decisions/2023-07-19_advanced_generate_command.md @@ -2,7 +2,7 @@ title: algokit generate command - **Status**: Approved - **Owner:** Altynbek Orumbayev, Inaie Ignacio -- **Deciders**: Rob Moore, Daniel McGregor, Alessandro Ferrari +- **Deciders**: Rob Moore, Daniel McGregor, Alessandro Cappellato - **Date created**: 2023-07-19 - **Date decided:** 2023-07-24 - **Date updated**: 2023-07-24 diff --git a/docs/get-details/algokit/architecture-decisions/2024-01-13_native_binaries.md b/docs/get-details/algokit/architecture-decisions/2024-01-13_native_binaries.md new file mode 100644 index 00000000..7d331646 --- /dev/null +++ b/docs/get-details/algokit/architecture-decisions/2024-01-13_native_binaries.md @@ -0,0 +1,163 @@ +# AlgoKit CLI native binaries + +- **Status**: Approved +- **Owner:** Altynbek Orumbayev (MakerX), Negar Abbasi (MakerX) +- **Deciders**: Alessandro (Algorand Foundation), MakerX +- **Date created**: 2024-01-13 +- **Date decided:** 2024-01-25 +- **Date updated**: 2024-01-16 + +## Context + +The primary motivation for this decision is to streamline the installation process of AlgoKit CLI and reduce the friction associated with installing it on various operating systems. Currently, users often encounter minor environment-specific bugs during installation, which can be a significant deterrent. By providing native binaries, we aim to speed up the installation time and eliminate these bugs by **removing requirements to install python by the user**, thereby improving the overall user experience. + +The north star for this decision is to provide a distribution model that can be described as: + +```mermaid +graph TD + A[GitHub Runners] -->|Windows| B[Packaging tool] + A -->|Mac| C[Packaging tool] + A -->|Linux| D[Packaging tool] + B --> E[Windows Binary] + C --> F[Mac Binary] + D --> G[Linux Binary] + E -->|Winget| H[Windows Users] + F -->|Brew| I[Mac Users] + G -->|Snap| J[Linux Users] + A -->|Wheel Build| K[Poetry] + K --> L[PyPi] + L -->|pipx| M[Python Users] +``` + +> ⚠️⚠️⚠️ Please note diagram above is a draft and is to be separately discussed in a follow up ADR that will focus on distribution of the binaries. + +The scope of this ADR only concerns the packaging for the CLI. The distribution via `snap`, `winget` and etc will be handled separately/in-parallel after decision and implementation of this ADR is in place. + +## Requirements + +- The native binaries should be easy to maintain and understand from a CI/CD deployment perspective. +- The solution should support a wide variety of Linux distributions, macOS (both Apple Silicon and Intel architectures), and Windows. +- The solution should integrate seamlessly with existing installation options, including Homebrew, or provide an easier alternative. +- The solution should be designed with future scalability in mind, allowing for the addition of support for other variations of architectures or else as needed. +- The solution should not significantly increase the complexity of the build process. +- The solution should provide clear error messages and debugging information to assist in troubleshooting any issues that may arise. +- You don't need to install Python on your system to use AlgoKit if you aren't creating a Python project. + +## Options + +### Option 1 - PyInstaller + +**Pros** + +- Easy to use and configure +- Supports multiple platforms and architectures +- Can handle complex packages and dependencies +- Generates a single file executable +- Active development and community support +- Fairly fast build time via ci - ~3-4 minutes +- Fairly small executable size (see benchmarking results below) +- Marginally equal executable load time in `onedir` mode compared to `onefile` mode + +**Cons** + +- Occasionally requires manual configuration for more complex packages +- Requires complex build packaging matrix to support multiple platforms and architectures +- Requires minor tweaks in algokit cli to account for the fact that features relying on `sys.executable` will point to algokit cli executable instead of python interpreter. This is a minor change and can be done in a backwards compatible way however still a con to consider. +- Requires minor tweaks in algokit cli to introduce `multiprocessing.freeze_support()` to avoid issues with `vanity-address` task when executing via binary. + +#### PoC + +The PoC is available [here](https://github.com/algorandfoundation/algokit-cli/pull/382). It outlines a simple github action with extra setup that compiles algokit cli as a single file executable on latest versions of Windows, Mac and Linux github runners. + +### Option 2 - Nuitka + +**Pros** + +- Nuitka translates Python code into C and then compiles it, which can result in performance improvements. +- Cross-Platform: Supports multiple platforms including Windows, macOS, and Linux. +- More cross compilations options than PyInstaller +- Official github action simplifies the process of building executables for different platforms. + +**Cons** + +- Compilation Time: The process of converting Python to C and then compiling can be time-consuming. Up to ~30 minutes on github with 3 parallel jobs. +- Size of Executable: The resulting executables can be larger due to the inclusion of the Python interpreter and the compiled C code (see benchmarking results below). +- Does not support Python 3.12. +- Requires minor tweaks in algokit cli to account for the fact that features relying on `sys.executable` will point to algokit cli executable instead of python interpreter. This is a minor change and can be done in a backwards compatible way however still a con to consider. +- Requires minor tweaks in algokit cli to introduce `multiprocessing.freeze_support()` to avoid issues with `vanity-address` task when executing via binary. + +#### PoC + +The PoC is available [here](https://github.com/algorandfoundation/algokit-cli/pull/393). It outlines a simple github action with extra setup that compiles algokit cli as a single file executable on latest versions of Windows, Mac and Linux github runners. + +### Benchmarking `pyinstaller` vs `nuitka` vs pipx installed `algokit` + +#### Methodology + +`hyperfine` was used to benchmark 5 different executables: + +- Nuitka Onefile - Nuitka compiled executable with `--onefile` flag, which produces a single file executable. +- Nuitka Onedir - Nuitka compiled executable with `--onedir` flag, which produces a directory with the executable and other dependencies unzipped. +- PyInstaller Onedir - PyInstaller compiled executable with `--standalone` flag, which produces a directory with the executable and other dependencies unzipped. +- PyInstaller Onefile - PyInstaller compiled executable with `--onefile` flag, which produces a single file executable. +- AlgoKit from `pipx` - AlgoKit CLI installed via `pipx` with all dependencies frozen (current latest stable release). + +The benchmarking was performed on a MacBook M2 running macOS 14.2.1 and an ARM based Ubuntu 20.04.3 LTS running on a Parallels Desktop on the same machine. + +#### Results + +| Method | macOS M2 | Ubuntu 20 ARM Linux VM | Windows 11 ARM | +| ------------------- | -------- | ---------------------- | -------------- | +| nuitka_onefile | 3.634 | 1.465 | 3.874 | +| nuitka_onedir | 0.2515 | 0.6200 | 0.5136 | +| pyinstaller_onedir | 0.3228 | 0.7927 | 0.6668 | +| pyinstaller_onefile | 3.031 | 1.466 | 1.875 | +| algokit | 0.3126 | 0.6111 | 0.7579 | + +![Benchmarking Results](./assets/2024-01-13_native_binaries/image_1.png) +_Figure: Benchmarking results comparing the performance of Nuitka (onefile, onedir modes), PyInstaller (onefile, onedir modes), and pipx installed Algokit CLI on macOS M2, Windows 11 ARM VM, Ubuntu 20 ARM VM._ + +| Method | Windows (MB) | Ubuntu (MB) | macOS (MB) | +| ------------------- | ------------ | ----------- | ---------- | +| nuitka_onedir | 92.10 | 106 | 166 | +| nuitka_onefile | 22.48 | 23 | 41 | +| pyinstaller_onedir | 46.07 | 52 | 113 | +| pyinstaller_onefile | 26.47 | 25 | 45 | + +![Bundle sizes](./assets/2024-01-13_native_binaries/image_2.png) +_Figure: Bundle sizes of folders with executables build with Nuitka (onefile, onedir modes), PyInstaller (onefile, onedir modes)._ + +#### Preliminary Observations + +- Nuitka's warmed up execution time is **fast** +- Nuitka produces largest executables in `onedir` mode +- Nuitka is the slowest to build (no charts for build benchmarks, this is observations based on CI build time from PoC, see links above) +- PyInstaller produces smallest executables in `onedir` mode +- PyInstaller is the fastest to build (no charts for build benchmarks, this is observations based on CI build time from PoC, see links above) + +### Honorable Mentions + +#### cx_Freeze + +cx_Freeze is a set of scripts and modules for freezing Python scripts into executables. It is similar to PyInstaller in many ways, but PyInstaller is preferred due to its more mature and comprehensive documentation. + +#### PyOxidizer + +PyOxidizer is a utility for producing binaries that embed Python. However, it is no longer actively maintained, which makes it a less desirable option for our needs. + +## Preferred option + +Based on observations so far we are leaning towards an Option 1. Where we would use PyInstaller to build native binaries for Windows, Mac and Linux. + +While `nuitka` in `onedir` mode is even faster than pip installed algokit, it generates larger executables, and is the slowest option in terms of build time. Pyinstaller is only marginally slower than `nuitka` or pip installed algokit in terms of execution time, has mature documentation, and is the fastest option to build (in `onedir` mode) and produces smaller executables than `nuitka`. Given that and the fact that `nuitka` does not support Python 3.12 yet and has a lot of `magical` optimizations hidden under the hood, we are leaning towards PyInstaller as the preferred option for building native binaries given its maturity and straightforwardness despite marginally slower execution time (which is not a big deal given that we are talking of deviations of 5-10 milliseconds). + +## Selected option + +The team has formally pre-discussed this ADR and has agreed to proceed with Option 1 - PyInstaller. + +## Next Steps + +- [ ] Finalize the decision on the preferred option. +- [ ] Expand PoC and polish the github action to build native binaries for Windows, Mac and Linux for x86, x86-64 and ARM architectures. +- [ ] Implement portability snapshot tests, expanding existing algokit cli snapshot tests by running against real executable covering main functionality to test and ensure that the native binaries are portable and behave the same way as pip installed algokit cli. +- [ ] Submit follow up ADR to discuss strategies on how to distribute the binaries in most accessible, user friendly and secure way. diff --git a/docs/get-details/algokit/architecture-decisions/2024-01-23_init-wizard-v2.md b/docs/get-details/algokit/architecture-decisions/2024-01-23_init-wizard-v2.md new file mode 100644 index 00000000..82d88bf0 --- /dev/null +++ b/docs/get-details/algokit/architecture-decisions/2024-01-23_init-wizard-v2.md @@ -0,0 +1,211 @@ +# AlgoKit Init Wizard Version 2 and Template Enhancements + +- **Status:** Proposed (Revision 2) +- **Owner:** Altynbek Orumbayev +- **Deciders:** Alessandro (Algorand Foundation), Rob Moore (MakerX), MakerX team +- **Creation Date:** 2024-01-23 +- **Decision Date:** 2024-02-13 +- **Update Date:** 2024-02-12 + +## Revisions + +- **Revision 1:** Initial discussions with Alessandro, Michael, Joe, Georgio, and Chris identified key issues with the existing wizards and explored ways to improve templating capabilities. These discussions led to the consideration of a unified 'monorepo' structure to consolidate template repositories into more focused, smaller generators under a single repository. The revision also sought to refine the wizard and enhance command orchestration capabilities, incorporating tools like `npm workspaces`. +- **Revision 2:** Engaged in multiple brainstorming sessions with Algorand Foundation/DevRel members and MakerX engineers to develop a pragmatic, time-bound, and prerequisite-neutral strategy. This approach resulted in splitting the ADR into two segments: one focusing on the `init` wizard enhancements and the other on template improvements and command orchestration upgrades in algokit-cli. + +## Background + +This ADR emerges from various discussions aimed at enhancing the `init` wizard version 2 user experience and aligning it with emerging smart contract languages/frameworks to make it more user-friendly and accessible to beginners. It builds upon prior decisions from the [Advanced algokit generate command](./2023-07-19_advanced_generate_command.md) and [Frontend Templates](./2023-06-06_frontend-templates.md) ADRs, integrating feedback from the Algorand Foundation and DevRel team. + +### Main Areas for Improvement + +1. **Enhancements to the `Init` Wizard:** + + - Improve user experience by making the wizard more intuitive and less reliant on Algorand-specific jargon. + - Streamline the `presets` concept to minimize user inputs and simplify the process. + +2. **Template Refinements:** + + - Address potential complexities in maintaining the `fullstack` template with new `smart-contract` template combinations, including future `.NET` integration alongside `puya` compiler-compatible stacks. + - Implement `codespaces` configurations for simplified project setup in GitHub Codespaces. + - Consider unifying `add smart contract` generators in the `puya` and `beaker` templates into a single, generic generator managed by the CLI itself (suggestion added as part of revision 2 based on DevRel feedback). This helps solving the problem of simplifying template building experience (removing duplication of generators that are essentially generic) while still giving an option for template builders to have custom generators within templates. + +3. **CLI Enhancements:** + + - Enhance user experience by standardizing the use of `bootstrap`, `algokit.toml`, `.algokit` folder, and `.env` conventions, presenting a unified and intuitive CLI interface. + +## Detailed Proposals + +### 1. Improved `Init` Wizard Flow + +Shift from a detailed, template-specific question format to a more streamlined, interactive process that focuses on the user's intent rather than specific technologies within the Algorand ecosystem. + +**Current Init Wizard V1:** + +```mermaid +graph TD + A[Start] --> Z[Pick an official template Puya, TealScript, React, Beaker] + Z --> B[Name for this project.] + B --> C[Package author name] + C --> D[Package author email] + D --> E[Do you want to add VSCode configuration?] + E -->|yes| F[Do you want to use ESLint and Prettier for code linting and formatting?] + E -->|no| G[Do you want to add JetBrains configuration - primarily optimized for WebStorm?] + F --> H[Do you want to use Tailwind CSS? A utility-first CSS framework for rapidly building custom designs.] + G --> H + H -->|yes| I[Do you want to use a daisyUI? Framework agnostic CSS component library for building modern websites and web applications fast.] + H -->|no| J[Do you want to include unit tests via Jest?] + I --> J + J --> K[Do you want to include end to end tests via Playwright?] + K --> L[Do you want to include Github Actions workflows for build validation?] + L -->|yes| M[Pick your website hosting provider for continuous delivery] + L -->|no| N[End] + M --> N +``` + +**Proposed Init Wizard V2:** + +```mermaid +graph TB + A[Would you like to build a smart contract or a dapp frontend?] + B[If smart contract, which language would you like to use?] + C[If frontend, which framework would you like to use?] + D[Python, implies puya] + E[Typescript, implies TealScript] + F[React] + G[`production`/`starter`/`custom`] + I[`production`/`starter`/`custom`] + J[Would you like to include a frontend component?] + A --> B + A --> C + B --> D + D --> J + E --> J + J --> G + J --> F + B --> E + C --> F + F --> I +``` + +The proposal aims to simplify the question process and reduce the overall number of questions, focusing on identifying **what** the user intends to build without the additional complexity of selecting specific Algorand ecosystem tools or languages. + +As illustrated in the proposed flow diagram, the initiative seeks to: + +- Simplify the init wizard's questions, avoiding technical jargon and aligning with popular programming languages and frameworks, leveraging direct mappings like `python`, `typescript`, and `.net`. +- Introduce clear preset options: `starter` for a comprehensive preselection based on the Algorand Foundation's recommendations, `production` for setups aligned with production standards, and `custom` for developers seeking detailed customization through template questions. + +This proposal presents no significant drawbacks, as it refines the question flow of the algokit init process without altering the command's fundamental behavior, thereby not impacting current users and enhancing the overall `init wizard` experience. + +### 2. Fullstack Template and CLI Command Orchestration Enhancements + +This dual-step approach suggests offloading business logic related to linking smart contracts and frontends within fullstack to a self-contained generator within the `react` template. It also introduces the concept of command orchestration in algokit-cli to manage project lifecycles more effectively. + +#### 2.1 Autonomy of Frontend Template + +**Fullstack Template Structure**: + +| Before | After | +| ---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | ----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | +| The current fullstack is tightly coupled with the frontend template, handling the connection between frontend and backend. This coupling necessitates additional safety checks whenever there are changes in the expected structure of the React template. | The frontend now invokes the `import-contract` generator within the React template, which autonomously manages the linkage with a smart contract project. This adjustment makes the fullstack less reliant on template-specific changes that it should not be concerned with. | + +The proposal includes changes to the fullstack template's structure, enabling the frontend to autonomously manage its linkage with smart contract projects, thereby simplifying integration and enhancing maintainability. + +**Benefits:** + +- Simplifies integration of templates by allowing the frontend template to manage smart contract linkages independently. +- Generalizes the fullstack template, offering flexibility in choosing backend components. + +**Suggested Enhancements:** + +- Further generalize the `AppCalls.tsx` component, removing assumptions on default `hello world` contracts and using `resolveBy: 'id'` by default. +- Incorporate suggestions from discussions during revision 2, including the potential bundling of `add smart contract` generators directly into `algokit-cli` for reduced redundancy and enhanced template support. + +#### 2.2 CLI Command Orchestration + +Aims to utilize `algokit.toml` for organizing project-specific commands, enhancing project management and command execution through a more structured approach. + +Example workspace root `.algokit.toml`: + +```toml +[algokit] +min_version = "v1.8.0" + +[project] +type = 'workspace' # informs algokit-cli that this is a workspace root that hosts multiple projects +name = 'myworkspace' # included for reference but unique identifier for the workspace can be actually be excluded as it is not required for orchestration to work +projects = ['src'] # a list of relative/absolute paths directly to folders with independent components of the project that are part of the workspace or roots of folders hosting multiple independent components +``` + +Example workspace of a smart contract project `.algokit.toml`: + +```toml +[algokit] +min_version = "v1.8.0" + +[generate.smart_contract] +description = "Adds new smart contract to existing project" +path = ".algokit/generators/create_contract" + +[project] +type = 'backend' +name = '{ component_name }' + +# The `deploy` command is categorized separately due to its static nature. Category names align with their root command group, hence `generate` is under [generate], while `deploy` is categorized under [project]. +[project.deploy] +command = "poetry run python -m smart_contracts deploy" +environment_secrets = [ + "DEPLOYER_MNEMONIC", +] + +[project.deploy.localnet] +environment_secrets = [] + +# New category for project specific commands that can be defined arbitrarily by the user +[project.commands] +test = { command = "poetry run pytest", description = "Run unit tests for the smart contracts" } +build = { command = "poetry run python -m smart_contracts build", description = "Transpile puya smart contracts into TEAL and ABI specs" } +# Description is used as `help` text as content gets presented to user via `algokit cli` interface. +``` + +**Enhancements to `.algokit.toml` enable the cli to:** + +- Navigate and interpret any project structure compliant with `.algokit.toml`. +- Simplify interactions with project-specific commands. +- Dynamically orchestrate command execution based on `.algokit.toml` configurations. + - For `algokit project {command_name}` executed at the workspace root, it aggregates and executes `{command_name}` from all child components either `sequentially` or `concurrently`, allowing users to choose the execution order per matching command identifier. + - When executed at a component's root, it runs the component-specific command from its `.algokit.toml`, also integrating it into the `algokit project` command group for visibility. + +**Suggested Improvements:** + +- Consider introducing command dependencies to ensure execution order for any command (in addition to current proposal to allow handling execution order for commands with matching 'names/identifiers'), enhancing the orchestration capabilities of the CLI. + +## Reference: Alternatives Considered + +### Consolidating AlgoKit Templates into a Monorepo + +**Overview:** Explores the possibility of merging AlgoKit templates into a single repository, focusing on streamlined project management and orchestration within js-centric environments. + +**Pros:** + +- Simplifies monorepo project management and orchestration in npm-based projects. + +**Cons:** + +- Increases complexity and potential conflicts with existing CLI capabilities and Copier's recommendations, suggesting that a better alternative might be to consider a shift to where we have a more CLI-centric approach that handles orchestration without introducing extra dependant pre-requisites. + +## Decision + +A phased implementation of both proposals, starting with user-facing enhancements to the `init` wizard followed by template and CLI command orchestration improvements. This strategy allows for immediate impact and addresses urgent needs first, with potential for further simplification through subsequent enhancements. + +## Next Steps + +1. Break down the selected options into detailed work items. +2. Implement the proposed changes in the AlgoKit CLI and templates. +3. Update documentation and onboarding materials to reflect the new changes. +4. Announce the updates to the community and DevRel, soliciting feedback for future enhancements. +5. Tackle minor improvements that become feasible following the main proposal implementations. + +### Open Questions + +1. Should we implement a bidirectional query mechanism where selecting a smart contract prompts the option to add a frontend, and similarly, choosing a frontend first triggers a query about integrating a smart contract? This approach necessitates a minor modification in the wording of the initial query. In the current workflow, we don't prompt adding smart contracts part since this question is prominently positioned as the initial query in the wizard's sequence. +2. Alternative suggestions for 'type' categorization for `.algokit.toml` files? Or we are clear to proceed with `workspace` to highlight roots of full-stack/monorepo projects, `backend` to represent anything non webapp related and `frontend` to represent anything related? diff --git a/docs/get-details/algokit/architecture-decisions/2024-01-31_binary_distribution.md b/docs/get-details/algokit/architecture-decisions/2024-01-31_binary_distribution.md new file mode 100644 index 00000000..9547128e --- /dev/null +++ b/docs/get-details/algokit/architecture-decisions/2024-01-31_binary_distribution.md @@ -0,0 +1,255 @@ +# AlgoKit CLI binary distribution + +- **Status**: Approved +- **Owner:** Altynbek Orumbayev (MakerX) +- **Deciders**: Alessandro (Algorand Foundation), Rob Moore (MakerX), MakerX team +- **Date created**: 2024-01-31 +- **Date decided:** 2024-02-01 +- **Date updated**: 2024-02-05 + +## Context + +The following ADR is a continuation of [native binaries](./2024-01-13_native_binaries.md) ADR. With initial workflows implemented, the goal is to determine the best way to distribute the native binaries to the end users. + +## Requirements + +- The solution should support a wide variety of Linux distributions, macOS (both Apple Silicon and Intel architectures), and Windows. +- The solution should allow distribution of native binaries via os specific package managers `brew`, `snap`, `winget`. + +## Technical Constraints + +- ~~Pyinstaller binaries are dependend on the architecture and the OS. Github Actions mainly support `x86-64` architectures. This means that we need a self hosted runner to build binaries for `arm64` architectures OR use an alternative CI provider which has access to `arm64` and other architectures inside runners.~~ Based on recent announcement made at the date of submission of initial draft of this ADR, GitHub now supports mac os ARM runners on all OSS plans. This means we can target arm64 macos binaries using the default macos runners and potentially reuse them to build arm64 linux binaries using QEMU and/or buildx from Docker. Hence this is no longer a constraint - see [post](https://github.blog/changelog/2024-01-30-github-actions-introducing-the-new-m1-macos-runner-available-to-open-source/). +- Codesigning is a recommended practice for secure distribution and would need to be implemented on top of the initial workflows introduced as part of the implementation of the [native binaries](./2024-01-13_native_binaries.md) ADR. + +## Options + +### Option 1 - Binaries are only available via dedicated package managers using OSS solutions for multi architecture support + +This approach assumes that native binaries are never available for direct consumption but instead extra tailored per each selected package manager. Additionally this approach assumes using OSS solutions for multi architecture support. ~~Primarily using a QEMU/buildx based actions to build the binaries for different linux architectures, using paid m1 github runner for arm macos binaries, using default macos runner for x86 macos binaries and using default windows runner for x86-64 windows binaries~~. Based on recent announcement from [GitHub](https://github.blog/changelog/2024-01-30-github-actions-introducing-the-new-m1-macos-runner-available-to-open-source/) - ARM runners on mac are now available on all OSS plans, given that we agreed that we arent support ARM linux, mac on ARM can be compiled on ARM mac runners and windows can be compiled and targeting x86-64 using default runners. **Hence removing all major constrains and difficulties of this approach**. + +Diagram: + +```mermaid +flowchart + n1["Release pipeline flow"] + n1 --- n2["Python wheel build & test validation, runs on [3.10, 3.11, 3.12 on windows, mac, ubuntu]"] + n2 --- n3["Build binaries"] + n3 --- n4["Linux"] + n3 --- n5["Mac"] + n3 --- n6["Windows"] + n4 --- n7["ubuntu-latest x86-64"] + n7 --- n9["Upload artifacts"] + n5 --- n10["macos-latest x86-64"] + n5 --- n11["macos-large-latest ARM"] + n6 --- n12["windows-latest (x86-64)"] + n10 --- n9 + n11 --- n9 + n12 --- n9 + n9 --- n13["Distribution"] + n13 --- n14["pypi pure python wheel"] + n13 --- n15["snap"] + n13 --- n16["brew"] + n13 --- n17["winget"] + n17 --- n18["refresh manifest"] + n18 --- n19["submit release PR to winget community repo"] + n16 --- n20["refresh cask definition"] + n20 --- n21["submit pr to algorandfoundation/tap"] + n15 --- n22["x86-64"] + n22 --- n23["build and submit x86-64 snap on ubuntu-latest runner"] + n23 --- n24["publish snap"] +``` + +#### General pros and cons + +**Pros** + +- Ability to rely on package manager to handle installation, updates and removal of the binaries +- OSS solutions for multi architecture support are available and can be used to build the binaries for different architectures on Linux using QEMU + +**Cons** + +- Assuming we are targeting x86-64/ARM64 on mac, x86-64 on Windows and x86-64 on Linux, no major cons are identified with this approach other than certain non deteministic factos around initial setup of Apple dev account, approval of PR on winget repo and setup of the Snapstore profile. + +#### Snap + +**Pros** + +- Snap is available on all major Linux distributions +- Ubuntu provides a Launchpad platform that simplifies compiling snaps on different architectures remotely +- Snap supports distribution of pyinstaller binaries (verified in a PoC on a fork of algokit-cli) +- Has flexible configuration options over release channels (edge, beta, release candidate, production/stable). + +**Cons** + +- ~~Snap provides a native support for pyhon applications which may be simpler to use than pyinstaller rather than distributing the binaries as it allows us to rely directly on remote Launchpad builds instead of pre-building the binaries per each architecture.~~ **No longer an issue given latest decision not to support ARM64 linux given that pipx is still gonna be a first class citizen alternative.** +- ~~If we are to distribute pyinstaller binaries, the binaries itself need to be cross compiled on target architectures. Currently we get `x86-64` binaries with `ubuntu` runners, however we would need to introduce extra self hosted runners to get `arm64` binaries. In this case we would need to run building of binaries AND building of snaps in build matrices consiting of default `ubuntu` runners and self hosted `arm64` runners. This will increase the build time and complexity of the build process.~~ **No longer an issue given latest decision not to support ARM64 linux given that pipx is still gonna be a first class citizen alternative.** + +#### Brew + +**Pros** + +- A flow for distributing algokit wheel via `brew` is already established +- Brew supports distribution of pyinstaller binaries (verified in a PoC on a fork of algokit-cli) +- Will require minor changes in the existing brew workflow to operate with binary artifacts instead of wheel artifacts + +**Cons** + +- ~~Algokit cli relies on dependencies that are not [`fat` binaries](https://en.wikipedia.org/wiki/Fat_binary). This means we can't use pyinstaller to target `universal2` architecture and instead need to build the binaries for each architecture separately. Hence using a paid ARM macos runner is a simple solution to get binaries for Apple Silicon.~~ **No longer an issue given announcement from Github that ARM runners are now available on all OSS plans.** +- Codesigning is required for distribution of binaries via `brew`. This means that we need to have a valid Apple Developer account and a valid certificate to sign the binaries. While this is a good practice regardless, listing this as a con given non deterministic nature of obtaining a valid certificate from Apple. +- ~~Separate ARM worker for apple silicon binaries is required. Github provides beta version of such runners for with paid billing plans.~~ **No longer paid given recent announcement from Github.** + +#### Winget + +**Pros** + +- Winget is available on all major Windows distributions +- Winget supports distribution of pyinstaller binaries and in fact it does not support distribution of python wheels, making binaries a good candidate for winget. +- Will require minor changes in the existing brew workflow to convert pyinstaller .exe binaries to winget .msi binaries + +**Cons** + +- Winget requires contributing the manifest file to an open source repository which may cause potential delays in the distribution of the binaries as each PR needs to be reviewed and approved by the maintainers of the repository. + +#### Conclusion + +All of the above package managers are viable and can be used to distribute the pyinstaller build binaries. ~~Requirement on supporting additional architectures like `arm64` introduce unique challenges that ideally should be addressed by introducing custom self hosted runners to the build matrix. This will increase the complexity of the build process and will require additional maintenance of the runners.~~ **Given recent decisions around ARM linux support, we can safely assume that this is the most balanced approach that will allow us to distribute the binaries for all supported architectures without introducing additional complexity of maintaining self hosted runners or implementing an in-house self-update mechanism for binaries.** + +### Option 2 - Binaries are only available via dedicated package managers using self hosted runners for multi architecture support + +This is identical to the option 1 with the exception that we are using self hosted runners to build the binaries for different architectures. + +Diagram: + +```mermaid +flowchart + n1["Release pipeline flow"] + n1 --- n2["Python wheel build & test validation (runs on [3.10, 3.11, 3.12 on windows, mac, ubuntu]"] + n2 --- n3["Build binaries"] + n3 --- n4["Linux"] + n3 --- n5["Mac"] + n3 --- n6["Windows"] + n4 --- n7["self-hosted aarch64-ubuntu22.04"] + n4 --- n8["self-hosted armv7-ubuntu22.04"] + n7 --- n9["Upload artifacts"] + n5 --- n10["macos-latest x86-64"] + n5 --- n11["macos-large-latest ARM (paid worker)"] + n6 --- n12["windows-latest (x86-64)"] + n8 --- n9 + n10 --- n9 + n11 --- n9 + n12 --- n9 + n9 --- n13["Distribution"] + n13 --- n14["pypi pure python wheel"] + n13 --- n15["snap"] + n13 --- n16["brew"] + n13 --- n17["winget"] + n17 --- n18["refresh manifest"] + n18 --- n19["submit release PR to winget community repo "] + n16 --- n20["refresh cask definition (can use conditional that auto picks either ARM or Intel based artifacts)"] + n20 --- n21["submit pr to algorandfoundation/tap"] + n15 --- n22["aarch64"] + n15 --- n23["armv7"] + n22 --- n24["build snap on self hosted runner for aarch64 architecture"] + n23 --- n25["build snap on self hosted runner for armv7 architecture"] + n24 --- n26["publish snap"] + n25 --- n26 +``` + +#### General pros and cons + +**Pros** + +- Simplified build matrix as we can simply define additional `runs-on` for each architecture we want to support to target our custom self hosted runners +- Same pros as option 1 + +**Cons** + +- The main drawback for self hosted runners is requirements on additional maintenance, very careful configuration and security considerations. This is a non trivial task and will require additional resources to maintain implement. Github itself generally does not recommend using them for public repositories as forked repositories can potentially gain access to the self hosted runners. There is a lot of workarounds to this issue, but it is still a non trivial task to implement and maintain. + +### Option 3 - Binaries are available for direct consumption as self contained executables + +This approach assumes that native binaries are available for direct consumption as self contained executables. This means that the binaries are not distributed via package managers but instead are available for direct download from the Algorand Foundation website/dedicated installer script that needs to be introduce. The script can figure out the operating system, architecture and pull the correct binary from public github releases page. + +Diagram: + +```mermaid +flowchart + n1["Release pipeline flow"] + n1 --- n2["Python wheel build & test validation (runs on [3.10, 3.11, 3.12 on windows, mac, ubuntu]"] + n2 --- n3["Build binaries"] + n3 --- n4["Linux"] + n3 --- n5["Mac"] + n3 --- n6["Windows"] + n4 --- n7["ubuntu-latest"] + n7 --- n9["Upload artifacts"] + n5 --- n10["macos-latest x86-64"] + n5 --- n11["macos-large-latest ARM"] + n6 --- n12["windows-latest (x86-64)"] + n10 --- n9 + n11 --- n9 + n12 --- n9 + n9 --- n13["Distribution"] + n13 --- n14["pypi pure python wheel"] + n13 --- n15["binaries"] + n15 --- n16["Windows"] + n15 --- n17["Linux"] + n15 --- n18["Mac"] + n16 --- n19["Transform to msi installer"] + n17 --- n20["codesign"] + n19 --- n20 + n18 --- n21["transform to .pkg installer"] + n21 --- n20 + n20 --- n22["append to github release"] +``` + +#### General pros and cons + +**Pros** + +- Ability to distribute binaries for all supported architectures without extra complexity of maintaining distributions via package managers `brew`, `snap`, `winget` +- Self update mechanism can be implemented within the algokit cli to check for updates and pull newer versions of the binaries. This will allow users to always have the latest version of the binaries without the need to wait for the package manager to update the binaries. + +**Cons** + +- Users who prefer to use package managers will need to manually install the binaries and keep track of the updates +- Self update mechanism will require additional maintenance and testing to ensure correct handling of the updates + +### Option 4 - Binaries are available for direct consumption as self contained executables, dedicated package managers distribute the wheels + +This is potentially the most complex approach and it combines option 1 and option 3. This means that we are distributing the binaries for direct consumption as self contained executables and additionally we are distributing the wheels via package managers. + +**Pros** + +- Ability to distribute binaries for all supported architectures without extra complexity of maintaining distributions via package managers `brew`, `snap`, `winget` +- Ability to rely on python optimizations in dedicated package managers like `snap` and `brew` to distribute the wheel artifacts + +**Cons** + +- **The major drawback with the approach** is that it does not eliminate dependency on python to run the algokit cli when using package managers which goes against initial goals of this outcome (removing requirement on having python installed on user's machine) +- Self update mechanism will require additional maintenance and testing to ensure correct handling of the updates and is at risk of not being used that often if users will still primarily rely on package managers or `pipx` to install the algokit cli +- Deminishes the value of having self contained binaries as users will still need to have python installed on their machines to run the algokit cli if they prefer to use package managers + +## Preferred option + +### Notes from discussion on 2024-02-01 + +- We are not supporting Windows ARM and Ubuntu ARM +- We are not using self-hosted runners approach +- Pending on key decision from Algorand Foundation on whether we want to have brew, snap, winget distribution vs self contained binary executables. + +Based on the above, the most balanced option in terms of user experience and maintenance complexity is **Option 1**. This option allows us to distribute the binaries for all supported architectures without introducing additional complexity of maintaining self hosted runners or implementing an in-house self-update mechanism for binaries. Additionally each individual package manager has unique capabilities simplifying aggregation of metrics and controlling the release process. + +## Selected option + +Option 1 + +## Next Steps + +1. Splitting ADR into self contained work items to parallelize the implementation of the selected option +2. Productizing PoCs implemented as part of this ADR to finalize integrations with `winget`, `snap` and `brew` +3. Aggregating requirements for obtaining accesses to the package managers and developer certificates for codesigning +4. Implementing codesigning mechanisms and finalizing implementation with detailed documentation of new installation options for users + +## Open questions + +~~Do we want to build the binaries for ARM based windows machines? If so, this implies that we need to introduce self hosted runners for windows as well given that there seems to be no OSS options to build the binaries for ARM based windows machines in Github Actions.~~ Clarified by decision to not support ARM versions of linux and windows given alternative options like pipx still being available as a first class citizen. diff --git a/docs/get-details/algokit/architecture-decisions/assets/2024-01-13_native_binaries/image_1.png b/docs/get-details/algokit/architecture-decisions/assets/2024-01-13_native_binaries/image_1.png new file mode 100644 index 0000000000000000000000000000000000000000..c47ccbe357df54bd1cfcbc5e08229010fc93321d GIT binary patch literal 210770 zcmbSzby!tf_cb8hUDDmHbhpwa-Klgp0s@Eb?(XjHZUjLmAJT) zthhLtlB1oum9-fJ1YN94O!s>+BkW+(@i;LyioBd&@-(?En%y!~Os*7at(EJKgtyy{ zZ}KX0U2~I~YJ!84lC%l$&=3Q1KqZxejwL&;RT>{>{i83>9H;I(i4N?`+Ois7wR(?& zf&))(=jv9@BO-l0?b!=IN(!QfPK?2?cXpO>b1=II+Ildr4Yh@IhUl-X)Ouq2wcYWr zYjlpPDaSvNE6zISLpLF8j(Ey8yQ{kQ#3=Q(;}*a6Hg(AB-M>x^vXoi6t5zH@k=>Lw zQp}T7Y_?}1SY4d}dub?`~r@_|rG)5ev`2bAmm zx~8(u7LHP`C4w(ia9_O%UJawpj}?LS*(aC%Z`b=JpRihwOtFWO_kw}-<}uThHJ6u% zU;wV+As|DnAfSOONZ>^XydWT;a-jZt2jwB>)nC`p883hMp~npa0zw2rRzg(G9r8F6 zp~Y0)r6h>VSjk$XMif@Eh8&c#h)H0EuB6oKuO&)(i9W9pkp~ZgjS*EdH&uxhjoGBm zDUpCB2pGu0u!PMuJ2F?u$|;HV?d~+taGm0HDYHdsR#As zb|0Q8PCVg1-t?ajNa)iB_n)5iuXX8xN1r)xg2o*sfA>GE7#U=w(2rODd7)oE+z=Yx z@`@KKda6rDM<#a{o@79m7H0NW&O7)zA*_r3g=qcL;vRq$Wy_a82$K7W?VrmT@cRsNq& zl;zbS$$z=gfBr6|h)Di4h9*@A-TxFLz%fSqUypIk2z9w<7lFWw$)GsK{!jBO+|poAM55{D!I|RpVht<##q&M#K6R1;Jz7jv14!%m)rrKwDVnTUu*nsp8hy! z@F3YL;xo0{>crZ9T<7;N>_;_Qwqx+LYhbM1_IvqLb@Q6%L-zGNYZn()J! znA-nV z=ha-ys_*@;V#REItsc35&W!&M<_IZ=M+yINO+O*O8k`1APj3?(iTlQ4_tP7=hAf}o zTBx}WT%UFmKkQk43paS!as(snk{v(XcR%w#Q(}|-u&??RY3EHDazHZ=3L5_0Gwu7k z9w;NU@;iQy)z2<>hsDvo1sMVVJ}nFg$Bm2n&v(_&X|@X`3JgCL%!?Ec<7HR6{z$uq zW0(gEeI{c8PFsIw6@M0Z!!3{VLA-3&Wvl0N(r0DWNAQ03^I-s*zOe9hsbXdON!y#C zOP%MN=co0{DgNl+R^-#H#q0u);DBk~{fx^fw~lS#=8aqBPI;fN6rZ`s^A*S3)((?_ zxFCJlfRiieLX1+F7Q9(SVremae!N-t*w4h%w#>b|SWEmTLmkBQP(};XO}<@`*bHUJ zsM*-bP${b_)i5Lqgtl0zYCqwdGBZj57Yjd@3Q+bDl5HP1d{ywfpPqo`$JHc-bo8x#6JFBVNJ{X&N;GNg7IBT~z`PcV2vhVnkm)bXlIcZ%xU-f?UMC zX9+bv^?SY-zD%7SFe`^epCMxJk0ofJWrYxA{r zM2lrYR?YNRGO&*26?KSPzh7c~`D1xvc;gs7ca(Er#Md%!Uebl3g zj|b8#Z4W!lJ-u+G58I^AEvrJ>>T9A8CvM&Siwa=d4k5brBX&3xx_aM1M*Ue?e%Y+! z0#k-Siq^R;tm;CETG|n>6G1V&*O9x_R0sY>{;d2U3^SJrBSdAHk8(b zQ;|X*pG0dCnryWHDV@k55#Oo^+V~Z_?oO-^#G7%Pk%+8BnaHPj-M5leb(^LNw2e%h zIPmsYv8syr5djd8go8RdLf5W00kPCWD$LYj)B517G;cHQDsd{nGfpAdUgh z&KV=sqNYhCmll=2soHYK!^OBs+6R3PY9Ys`lhdavr62zs9H5wR#Xy9GxXTQs>s>|) zVQ?`p3-P)JJtLzUpO5ky_&r_&S?niw*LkFZ_x0xZmwJ1cPI_h&xX@CwH747q+02K2 z;fH>aXfJYI?0M@5^uYO>j(tI};a&O=1U75&(s-8hoa{JDyER@U+LfU`-gfPnJ%V-T z^*5jhI`XlF#Uh9+)e}Wts9<-8Z~I zK#%{GSnW-{-=(rBLv0f&q>S*x@A(m|q>L8Zx)b+)FLl?M!z|u4d!hv7t zg@fE{*^UaQI}?7`L`&8*4ozDkm7%=#33b4V*hn#nqHjOw$v)6V65{C=l?{Rmx+9NH@zQ*;o zXXp6ztzrfZ0}Zt?iS->~OUJ)yg@_*lnWsHVxcg7P$3?$K09`PEf9&v*21=^E!&tnp z9VS@;7HyjURA6io?X$RT>)oZiohMf8s#S*lK8VD!n~h}mi_S-A$gmmffs`t{`sDUR zLc)&dE8{Ehp`u?K8&yG52&wPwHyyjlN-Jd&r?_9o_0zUUl{19N@vdyutBt%URG$ye zbk;7C&a}qEK`aqM2U#e}EDv?|C0M6FCIop88og;tZ1)>m8XJwgj4l zNkk0-noRvBPw=+A1ZyuxyLfI98!T!Qd6}DI%`f5SOW{=W+_vPG>fHu#F$=tz3W`6$ zV+uax1UEtpx=T&l0PFisU(|jHF$DA`)(RZf)*Vc)v{UzC{=7^9f9@H0l<8PiZx=(V zG(5Uu1peDDm~5q%q;couzX9*Yo9`S&L3=j2@i@p0X|h@WdlmiwrXqOI?zih^$$BxmV-#q^ z{jN(!a3r_F&){hTuV0O&=WwLnXBG8ReVJ171|S^SE*UeW9(xdr8a>bbs&P28(x&%C zd^S~&7egQl9kG#}_E+o0W_(4Wqy9x1#{`*A10JS)nJv5($7wUa62T*$5-vO!Bb4IT zK^}}rbzUc}7G_|_y#nG1MmNC&A_a)2V+-Ne&a5V@LKtFw2k|4pU$B^o6m9r#Rv`!} zk0-g;JBko#4Lu}dx;RoCak;7!ad=e;5tSoaPXWXUl>NV{r@ueu2ykd`HV$72%E(7! zOk^5+*PQ3ErCv*AbEW@`8>{`HDExSprqKDu1)l8aX~EA&fp<5-@A<~>)aL~HfGmZC z?+u}p#m$dX-{zaQ?Uv-xzoOV=(veJ|08@3F719JDBlib#7sjyc1YQ1|AS*FQo3vfU}@kW5Hu zygTRt2=*-%Qaim;Sof0iGP698-$Nrwl6RqtmnpD<#w>*Izt`MGJiH)8uJ)_B_r*k9 zbW1)%Kb~mBd~>x>I~=N5m#1;mV!xX}(IbfS4Tv`k&SFbtZ$?vb=unq{^sL*`QTG}d z2*5#s9^3S zu~@DY!Tha2^hhA={7xPrd;yL>b>KrXOK898d;L=5;m}zabY_+7r3);yDv#S!6ovXy zL%9YMCMNJM&y8|*ef{azx-neqL0-74yvcHd6+gg;Fr2&)G~F7wLdtg1+YOk8{w3hWuT602Z^t6a5E;|>y0 zik}^s+#}u5&=pOnAN&vwEn%`~z z>Qv4z9`N2&IyYK=hOAt5)UEsW!GAJz4OG=ev(&5f$q5S9X?n|t0g9t)S9wDwyKIbK`z;8 zZvvs*;TxCmik8;eAAIf&pu|-8Z!`ZCx2)76rORXtKCp4B96@mFf3 zwrG`eIghS8$OP*Cnxqyss{fxxBti?#Q~o>bLkGpXHJ_Uwu`E(IjcamY3KQdsNdNxq z!IaQsQvWZG$Le46qu{&lsp?74t=%TPiT~vOGxr@;eV4IsGTf~_spd%^5kdsDzpjYL z=t!yxvWiJjAbdqE;c&whK!i=4xyZHBwH?s0^=JvFEsHr~r`Z(-)RVYWfovzD0~OxD zZ1jIR3h)y~MtIz42im<1GI#e)=c(ZRalMC&K%L<&NHO_AjtYh?Q{Z}DHI!JX#*&JL ztat1M=`;%-eVO*lDzNJ~ml`+(9@5RDn0}JrjX*wnF+`9q<1pK<_Ku;XCwMn`n+g_= z)1i-vHPqMySi|AM$=7RV!2;RNPsdZ#S$2pp%laH@9jzJeTcM>?W0GnS8INO(xKZnZ zzn4r(#4e%4Whr+u9EJ!+$LWcl_UxXD7T5wXAqkMQCp6S)(hNXenq+ThzcI1?BMh-Q zL*3dAV;;;(lS&4Nv}pQ*cV`QOHh;{7;Jp$F0N@(`2~egivOHkBG2XMZQq4Y|eZYVz zvW9xxEeD8UO;!bOa$>&hxK&UZE9SEII7;qI@FU3_@ea&4*xxYM@c{5YT_Bz0$BI$t6p&x8KULI9ou(xNq1tM&Wa>UQPdmAI2Yntd+sI(u1td5BCLo_!hmZUTmDr4+K&GVkOT#nWNuMa5 z&c{fGX`uzt=) zpF_Dig+SH+H86$*r zDnFFB*Hf4EAda}pqpbXg+^mX(A!+AXUrY*9%JyMc z0HOv6G#tBUE<7hK+uB;MBr0F9+J2^+e%nCY=g(9b&XMg{@6O(1TF85#1Yo$*s&KNB zf@<-JcS*!4>p6NgA`D(T=hX%T^}z(u+2Mbz=tpwt{D%Pf(8lN(8Dj+d zEKPwhy!i$2ZB0!nr0dWZMb0AI$914Ox(^_<$G}$|u*&iyKi`!_%~C1f1EOl#JF``W z@`?aE?2NL8Iz`F5HRrGL@mkDiLm=}?fq{HE2_FKJy)zQD1qUse93qM9WDYc;TSE~X zMEg-*@d965ZZ-EHj*grSUR*cY4#F0hq){HC;)`y!-L@ zYv`o97QOsL7Ua*T7>FQlOAO_sgY-&UBI~*PyXUykzq!Tl^dHx@GGcyP@L5A!vGnQP%9|5w5m zg9a1_JHv61SmD|6B=!uZ&rSQfBpO%C#&Tw$7}K)LqMjl^3+e`GBOd@(EDC?Oh1ab~ zAe(ckFV#kcsmsFBSjW~6V0wJvmv4&F0q0==ze>%-F9zSaqikP z&{MPBzeliMWFQr7O)vN55eq(@P%9jM_Gse=YNAIMvyS&1N89Tx2DcTP=78;pF@;!X z_hX3^;C+=Wd}rDWdnhP=+8c)Q<}nG+z9KB~xjGIO_1^pK^I_8IS5D2T+OuFdJZO24kj1)dmxN5<=uCQ|=NS zrz+6fr{{CM07*U{zOz#%J`h5|SnDWp0$X8T~KWuuAg zr>kNIpD`Y%bzWt|IZSt|$jb!s(Vfox`~q*78wA4G6D7jg=IuDM3}Nf*t=wGpF)sY_i~~gmts@|n@aqytAsj?bQmLg$ zB3w)1%35OaDt!bF8HZhJ7(ny$D!ij&b0zrwxKxl@f{ z{BsXR?){&P2gn_xR6U$>OSW@%q#UDLK>nyx#W=)v*AcU$VdN{ zp)5o#B3k3M27wK0K(}X>3L&J55uhS;s^}QRA*#0pB24Oi<+&LjzTz!C!;=iB75{a# z_wDc3!>p>5-oxYRWko)Ju>KM%AVt1o`ctY9xq(KH;ZbuNz>wZi+yQalX7Jn{9C zL$gxSP?pgU33xyLG?>oR%45?3G*XY9A12X)CqS*>B3%95fLI;eNw&Y^ell$~p7ILy zL(T0@AQ$M3DW)#QFMGn-v9Xwt`}`uamz8-cQx{Qbk z8_oP6RIKvKChY`?(Z~{6p1=|E^IS9^co%qS8A>cpX`zuMfH2ck**<;jwTKhco#Ric z81?MqYhr^L;lhty_rjOf3$fv{~Zus1iTMO4NsE0escqei`UK z$}U%;Ek2+-;(%RRnF_RZ;o&Q2!p$xtfxHaJ_&DEpkbJ}Tz2X7@!bp|T3d+W%nfU@-`4 zL^O=WQr@6@pKCnaRL!+STD~a+Mo&2s!4q-RRv7t^fCDS`K>+H0Xqs&gg|l2^kV zQBnpXqL&b z9!nLWT689q+po{`(gev75mC&BA=Cdu{u3dE-!S25zMat7Av4T~+BzUnVaLrI2}>+{ zhfM-44LZ6#jws$7kwZw}8u3rW&GwMh704qDC9062)RW2Zz8KBjGr}*S7*pK$z~LgY zbV}C#SSnCYHfY3~ww|ffri7bQUw}F7;(10^4 zR^Mq5yc)2o?}{6@pRf?wd82^T5rANkr<(`rduU{3UIG23pkT)Im|~KNkZ5CNfqB`2 zg$1JC78V!-1SDwJ1!dI2u|n> zGD3(lgdn$<0Xh26x_JXj=$Q^Z^-$wseN3Zn#{4S_h6+y}ZoU|<2wTLsK&+QH!lRac z4oBw7eXxzL*(icpo=(^Wd@c+lS4Lu0-57&1*#|920KK4U>H~~#w(pa{{W6P0x-%Q= zn>f@x$-r1%1h`AYOoct_sn5z?d7@MzJF(Ivp>=F)R5{Nt9j;NdQ9^${JX%_#44_|i zR4jB|dT{V?IgRG@dxVNc_F#`dpdOT+K=)PBI9~p3=;9l-X*VykPpv%BD!6u~iG$i^ z#?4$x0J$~vZ-sVjH~r)>l(!4<^!&L@w>5%7oiy`up5s|41XSY}I%IS{%E?@mN3^(O73JHX`Jro*@X?ZaEN(}5}`%6o2_Tvt(2jS>j309I8r_(!+ z+NrNZ4T!BsI3LU;qwWSn*%7^g9&UAmY-L5d#U2G87)#xMM;_-Wc#o1bFnF&ZUZLz} z7krQ(O<_f5is=#aDxnqXja^x^)fc0J$9Y515hGknhdE|lf?bARz934@K8fD;k7kKa z<`=5CpCraX4e(8~Fx~ig`tC-$jve*ruvE74T>e{r02YnVCc>R;%!%9Mc;?}z=MEy++6UM_&*x!qiH0`kgn0iHW+X{)O5z;B$$OqcE&FJd6YgC@$uuv8 zO)3i_Lh2+6-qRgy2Rz9L7T+!IY&#XH<<-|ccm=X zzlN>4txK{Q;oydw%9DeFmm5)Y_GaIi`b79E_RRiXHx;}5A0bEc4sZ>GV%B&3k*ylY zKl|o&N%RuP%4k%6++?A)ed&nCp0N0D3}1SdjVlXNoFuMnZVC;2K*l|f(qj24i^{%u zVeG*cAkZD}oXc`FG^PzNmN6)>@%a^c7z2_74Id7wG1N2Q^og7hrGkhGnVsi27o`xO z=A|pAAn~E|y5oV3y4!Sqd-F4}@zcpgakS6(gnwmDDs&Nx;JV_X{1?%Bv-OLy2gG@r zwomt9YOS8zkH(_!Hcj7Y9um-DSU)%~%o9fIfVAD65Denv5Vr@@im!AZamPlQ=wOYm zLJzR}V19kj&UF|;N1#KoJ6UZ_3>!-8tv5l+cADaaOJ>7I$Ev3gt`89((|8;H=2x*! zzhKIut9!f>ME|)bF^Pq$3BEhRQS!NM!}qtM6JuwD;fCX8o(M`j-$qW2Y_pe}zBj>K zG?SJ*Tz*arYBP$J6*?sy(>@aekG=1bI9H#njHI7XlvonXSyw05Mwt2Aq(qYqp?Gi9 zE_-@DfJxcgZ&qRlkBSba+KS76<3V<)MpMz-GVq%ndZ;7lWDdV!K}Myd=j;_B^NWKg zHVRrX*N8=yChN@>JDcJ_HfE7}tpKUR`DO^|P)>aDMtw2>SOgb zuH4%d>-zs+EpUVeszS&e`z3Ug$Lfn+Bn(4@NVWBjA+RN!K%+Alf)}*3x(T}Sha&;m zLkHq3<}be}*q4D8DNehvuDiKg^t2pEm>N6DSgivI%}OlaJrt_cKbi$eZNSWjaIbqi zeZ)PdRSV5@cAi(3Ze$+PAjg;Nyms=TJT%mgo1N?Jh?#};VXO8vjCXCO;gKcm|EYh& zhuz#Ew}EMtaRUovvDE^U=%|>V%3LP^U^`TYARK#9yejw+@3|Pp&>6Qk0?|%ROW=EZ z6;(5uB+aWEn1@UzUyjcKVUXDppR_qG!dlFk`aAjD&%;nc(O8&>voqUndG9?V9Jnm=S!-8woumhr^m)6^or%J*ZczO(rm^!LNeTX$*|CYT?b` zv`}cpzl^ltU z_GJ3IIJL!3_Iic%R4{M21fq&WRowegxFh1IE|j)C>Xr9)S^Ydz-Z*N6h3mVVtE@e%O zOfhI@iknU?FT*o)COiNr(l4Qj2z_;>1+i85N5Z*!ms80?<)$4f4)V02%OA~G_+m0L zrfj?{1Hpk!UV<`n?I?!ihd+QK;gsa(Xc3>NQGk)`ufIIjpGYa23LY6P#dG+yOuslu zprP@FA>c+D@GsfmnDw&MNj)@rdyUdY{FA}s2 zZL5@4g=!oK+Zhimpmk}@o&&t(68Fc5@i7V8E-g@@l9rHJuoE%MCGN+v`E^ggIqKAC zz{rdpxznta`I`bZDMVsB*}&K1AaV?b58zM-j>(a^L4*Un9jL=^5e6OiSC? zrhujyo-cK42CtL3er>X|(6Yuaw)qxy`V8ZEJeap@?%OiW@6Kx4fc{uxTlxk2ayS$n zBBh9dX%betZJX5r)+{XMPNxzqR*#a>79K2Ip@%=)t3r%p9*=(XZ{-e*WBa^`zdhIu zvrO2r3ffCP8RtP?yh@_O@=#X#4t1oxRXkkTp<(Kp*<$OWCPhLo7OH)5PKiBm)QV{{omH~F-Z;}a&fw>A=lQ7dIK1UL`CVv` zHaN$vP&7wVO^(XD6XQ-ildNwo@pl}_7{(!Nd_z5Tv*DM7iy@6=u-sVIIDPNGn{3c! z!{6Gdp~YaOXWpBTE@Zm}k2wyD4oYam8Ah*&8V z6iUO9cTb-BbRaE!RPcy8&W4=V={A+CULWtrR=prYBb>b;`eUtW-FpT3=j(Tx{V%RA z_IUx=gBRYQ{z31J?KQijzm9 zr1AcB7?6`8M2EKhvtxIv1ZP8Gr<@A#-q9W{;BG|N0gHf{O<*Cq2@+Y{%4eq0sy1a5%y^lDjTN@lcl zY{_%~xEi61-r;?e?*`h*(Ml1cCenA=`aEx&pYDF%)V2e*Od;XTW&lGHdF;gIHXfNs zzoq_zWBsv|Y^l(E${Oq>QxUuV3!c0l3)jbd7!((9^Fj;^Z6udDj1+YaVyxz2cqph@ zyNnATAzBga_KWWw^QSw4G&&n5(ZE4*Jj)Zw)k=6@O~v{o%~{eV%*&w(iyp)w+Fp9| zWU#Fs>%b;UDrm*oESQ%+%oM)35j0Hj-}%xSD8hc*Jp3xExS11(s%_J_fY_NsxeAzi zky0Pqn7$BBxcMGI8N6v-T+v_ko+C3TR9d}wN89>o3@5Kv`TmXQO6=clZ9&Wp$Y3Yd zSsB}_(SErRCZlx%YFP;yC?wZx2S&RuLwH)Iu`LTGdGW>TP0?Mg-zvm=JATQIbWAn{ zy%MV;EWeT^bo2We)gi*r;omn>A)+(r9x-Dv$ zfc*qBJoV4rdIyb;s!SS;JT#+f>Xfy}+Igh{9Sq3S?0#w4T$#Nu{^pErfaj(fD9~jt zN>=zoctigq=c&k8VWd9+Y*cVGMv3=x8sqy|RlewzS+k2b1k z{H6^sTOtc~%Hh8~AVA1=!|$Y#FCz97R%d zzu+s~Q!X;;tJLU)ZyYmG3km52Su;+sxWT0H8_;7j>h4ir;vx?6bqqL+0~U1Bpp~}W z5lMx;CjhcY{Xn2rVi7}7-vV%LGJhO-MK91u=g%z~3!=R=)Nj2Z-;4OR7(bHIe%j>~ z^=XtkSt2N7|4J}(#UbzF1$(T)bbZ`f%wlc>@1^g%wae@q&^hPPNz8T^xt>uLiZvh= zX#5o}hBMF?DTh3V5m;KSzs&V%hT`udCMY|aEAg4-xMq`!*L5pSl-Q;VFUHv2W@&!y zbncty&%(H7u$#>XI2@yUt*$@)ZZ6gQ@=1D`0zz_ZB2wtm89!JGFLr}%ZCLo}{6cPj zGF`eS1kf1GLtwH2%RSi#11T4*P!ZoPr0h3D=#}JwlMYXlV?V#mGpuhBV+Y`rnVOc@ zPYdyjwNXZ(tK~X=N_=gVD84~ne#|a z`oCV~RWgK>?`C(1NjOMFpmfpseAQ`sVU-!$bDVlQO*^rfCkr$H`kZ{S2XtM)8mWLk z*}cj*qCcl{%q^uGXhItL5d=|sYVTZe`%}e>RppaX%y@HUF}hRKw+}P}x#h)1e`M@@ z516)@(d03k{|!y96v#d_&n%z%-n1h$5>$7Ts%yl{mCz$`r}h9G<2(stEy}`j(t&99S3EcMl2k71JJj;Dl;`ISTYhNJhmeM9k8RiHH6*9-zm@J9tyb>Vr_6 z3ugX`E^<%szMpz1_WI}t6xWWHwTBlrkVcdkPl5T7L+jV#eTm2lI!He92biL;K4xVB z5Z5nG4lWXV5D`ai5fjr(BxHTg68Z@S?5r<2Lh5r5V6Df>&v^4mLnoGuNg`h(Ya^8( z&3(2}HEG_wrFkcA`0iv2D#tkV64cPI)$HA)SNwcb{lrkM6HU$fT`$du(yqA8L4n1} zt?g5d5>j;)T{NW=Fdj4HrPP(+F#hkPU;uw+Ea>)|z?PHGT42JHZhe&huEX004=m&9 zM>at^`1784ustw~SZoFojtE`)P^l(YK6Qq@X|*ag5k)yK_&3nHk6WMA8M)+_%WrPK zJ1XaA($zwq26Z|O>7hWfY^4XRs9`H7{&2}6z;y}aPgw*T7Kx3rH1z_MQGaRrGv7-m z#VOZETDl@apoHQzPsRs~FH~qM1Ue=OJP$+u%4y5h9^zi9rr zmq)!=dF(^=zXA1ECPdU|$pMr21lUb0Z20PIqT2UK9;0epIEFDWg4${k&}Q}r9)Qel z@_FQY2LNW1$-H0;s8YZu-Oo>&Ia176p%BZ{@RTz!@dDPKcnkSsFCxjKtu6(mOYuY` zu96RCBbgq@@RILwr00jC*#Lx>fF*vZ2jWV&@qcvRgE2)IP;KCTr?r~rIS!1V*-)1| zU$Ck_53>3ye^&@eh2c)Z({ol1!O6$RdNJ>BWBR>*G3#vCB}+VM1h^t5cQ)v1B`=VF zHr&)GaYY1Ubv``Zbo&8%uM{)tcov|PW5kmG3$#NbT*X3YShgk=qC>UVNPB>Jh}BdX zJ;Y1tV{CJ+kPPm364s0NgUd24@%jvFZ5HL}KBuZ7=VKw&H{#lk|ulRyMCKH|00M=!3^T z_}=!DMj3Pea8@P3;JDydM7}fB-=`!PjKg}YVjm9m{c(ok^s8}^hUdW^<2_a3dHVeg zVE3itfg5JVTln51F(l`+Ybyjc-$lIEhwX2NTEj2E?W=hmWJ&8s=y|x<_7}XA$>E0* zXxq_${ndnbjk=$T{f1iWfFeT3qhwnG#jSsr)+%kcKsR@6hSjOJ8$c4?j-_njFIXb~ zq#sR~$ST1sb_%Q2ZpzepINk|96s-5rfnak()yT9Nz0iR@zFTC(i@x|}T5bYhH#a}r zhSi0;z};P=tQo{P6?fPl&J#efA1Nh*s%*_&%?sYanXWU3zn9R z0LxYbUw)-PV$XwI@;AANg1ZT-p7X~;WdBe)NQ8OxjTUVGTvdO7)fE?+ZsG=i_JC+_ zn&K>pilr+{Ym!a`2=V$(ZfEGR#sQyOD+c>8lG(*Ls*AQqB6*QhHZ^aEhB)EsF(@=R zIv$-*sessVggo7*Nvk}zVN80gUv{YTW-T3YgP(RWL;V}#GvBJ@dpy35mw0hvn*k=~6;#1|O{ZjqLU zHtUi*dY6RcAGmyXC`o&N?E=Qqq^`x5m4S8I0DJwy=tJ&~O_U{_5LHFz+9fwfs>HLO zvw%l%N_|7QoWtJ}2W$FgRXa=fPmKwyl%)TIq&Zg5j?5~K3#r*7h~rZiHJ3VSqJG#a zuYx{RNRG?PYoi*w2oP+knF0PNyOnD|%TzajrDsK?+Foq2PTWAox$s?OM!G-5MP|>S zehZZh*yL?L+qY2_lO=EReTgk-CMbb92a1*`A|8{3>V4+JG(?OJ*c({f0az||BR2Sr z7N*03pi-q^%FNBLAz^C=DO`Z8=% zg%!a$O8@#p0ekQiFps4ykMl=A`yc=q&D9gB5BozW;Q~gYjxbOVll-o=;jHOaqDW$K zcD3rLC1poNYXP5Ar_HBE29f#Tmm$d?h4S7j87|+nJPyJ%a7LvYJ%Apc6r@A|n(tYl z!*`RdyPwt5Iv~wg9_D^ufpM(*}jwT^w7#5c@e?%UL0B|pe-I)_Vly|!)1t@K3b zj+mVXrrvafkP?K$+_sdc7JDSecL$o0K_vfb|`*l^>BaxGGY}?Q15+!qZ?=d@Oda5h>pXI@s2RRSnzi8)29toBz)Jg z=)yq#SwcogD=w@=&|eT7y*?TN6S>1U?%m~Z`ING zXYB!z5DwL`%9?II^h4krm?+`yW-2~ki*43Dl<+TpECDsg-HrS}zMgx}8hH_)F~V%g zkBpo-9aX$*A7a4kXd1~_-BEX;!J3MkXo;|i5L|@HvjL&t=kj9@0I`HFv2jP@h4~T4 zeqs2d>L>n|l{Qd9z34FHS=!4Qp-^=0ePdYjDdj_z`j~)iOOM3m`+V(882J*)e$BcyVPf;DOp7j)?%_JNKTJ4$eY49)V}g z_=2*O=YB$OTLQ^P_GQY>$ZhI1GKJb+EuQk+&51lMDXqc6%PeoV>lQ9BMwE;=n-Tpt zrcRSGoP4u5VN#cyikPpMm2i}gBEiISjNx<`49i|^y(~w77X6W(61vm#4biR#rxL5B zDs1;fD|kByPhV5mfh3N#?I4dXkn}FYZ>Lzowjvb6V#y(|GF*DK1hY$+fHNeM1Smt! z;fvTjz+~Ww7D`glXiA1+*ujqZV0{iIK9!9P4?BGsr_v%`PQ8sZ`Bw6FeBcq%-} zds7As*^t6Rh78;TuFR9=+N2k)ju2?Qe(O1ZxdvoB2uO*dhvRMbVIuLFhA{^$rBl+U zO;QHCM9x}iO4*WOMO)Kj@m}-TN0}-rTh$|nGpQaqJR>4>gkw=uVg5#O zlYu8M3B~QpgB>y6MHLfaKAGkM(0_?fBX2;$4&NmMY?2s%0iO1jv(K8AD9ps^Y#h8k zA#RZ^#}u)4Xx56fra{495=m(W?q%>^(R~m-6LrA`(}gPI44dJFK9NlPG=`wmhOu!t z38&-cW}Su)A5}ojDGD2)Met*j;NaZ?Q98a~RrI}xKlg;pWFH?+u39xY<#lcY{Jv8B zB}?axM9JXUZzIRly~*LJPm36{ly1vb#roRyRex;MiD45lHu0F2>q=D- zN#XnCd5uL9Th*j~Bor$*G9_>lMUkGk0-DcfDA`D6LG2EsfwsOJ=%eLpNeRQVx)TzG zIP!^Dtq&uI?K>m!#vZ=&#+_m_`~bqC=&rMGThV~SizI8q^cG-oA`s>%Hizo2Y&EmD z9r%tA(;=|G>$rWWP}a=QpOx{}MtgPeyG22}jG-wJ6l&;#hE8R;)E~ov08f+3zV_|_ z+}yxzQ;I+&-?P6{AjpFd&%_lSK9lh;!dm2L856RG-(GPs4>O92p?HKQKVN8YPaz<8v>HNxYz?&H>>wiOaQf;#GfyhRF$ z9;>Guj#I4_yL^j?7^^V~W40LT-!@KpbgxvvbUGTqvi6eL7Cr3C2^=~TKwKsp5J zF6okz77(OUy1Toi1f*L^x8y(0GX3xA>mG&EkCG@3f5G7M-)FK8OB`7itO!ZdAlaF=c(XV;WAy)r&V8q`_e&JrhG5Bo2s-xvJa;s^9c zIQd%whfhho+?_X|OLjcGP^vsPW>xt)p{_yU)2C#DZqb`bx;jP`ax=@QqKnTtz0xC@ zUJEt&LhmRyoh#Mga)Q)1YpMARnUISc8vLDh7#2nzkn)k&x~d$o2s_14<#Cr4V+?S|P_)$D<+9$fp#D_V=b3 zD`M^576^6KYmX366)=wlTe+{Pp2@+}BiWF=^4AyEn|qqnDc%`tm=tR&VEk*H52gfEdf5(?@!<2L#EQ5GF4TuHK0c!zERErquIKs3=9er1{qjfU$ zyTf-E08;}{=KSP}&O1>|s*Ju0A#qyOzHkq&IT4_~Ie45nl!v*$A*}b-G5V4~~LXAlV{3li^ir(^Y>ec(UMS&7hK%k}T5`p!ow$Te4 z2J2gGLJ=oOFEN&(c|_5hdGB6)qL?E;*p~|~GofAu@Tjvvf4*`+|3LP52s5_adk*?; zX7{9thhf(fj;(23CPzhmN5Y=Kgg98}do79TSOSUOp4guriR%b-x2DQUx1w5Lmbmo^ znx#iQxaE)s&)priLnS42JX0n8aFn{O3Wl9DbveCd#<`+Rq^D!zR=blxsALtBcPAg~ z(Yuv{{(&0Mg2FxX(3k;$Vy^-A(c80mVF1KFA?z@ZKiwUIl&ck{9U3+@jh7a#-Xv4H zAH7lgXi4Hve`cOD?op-q*J5}7 zP}lwOo$bBD>(ciP`ES>MshUD$D8>ZV5uP@=X;GDzzh1c;wrl$hKinu5g>iAIE5@U6 zuJ9J8YH9D5282rMj~YD83?=R8FKtBbg%i@_GALFH@#NfnC5k7c=vuLdnRuj2N}IuaJ^|CuWB%U6>g*)+T zAcdZ74N!oXK2`M+q*pC>-K`**HB*C@EYvsyKHpXiGT&$x^4qMWS?6;1mlPht`q|-R z$dEo2dHH&LPAxAWHdigqcgpR}d;QMEyx< z$fVo^LsICScxrOn2Sih0z7;*aY+s{0%I5`f_(ptdZ}iYA-QFNOve1LtlUvIg#waFC z=e`FGr{x@vo&1Mz{I}dz{&@7ah=*1BZj)zq!OGk|#9qUH@8cvR?Od}GoyUCsf$TG( zg>q{@{8(G{+b7vCMk7Ww=QtQ}RTp^-(~KYRnH{HL&%NO0_rs~ke%iqi<^W#P4#*|dZ$bNZ>)jNye-(~Q%Ue_&(a-PD%@jh4mw%l1I8@LtaBJc%X^9(a z>OFMSJ9A`?CShAXSoM!kxq>G7g934VE9Z8`mwB_VUq`YNtQ$rjP{mv0`^42`UNKlK zFuV^PRKnRnZEY?e^!?uG{~aBXat6y0+o_=4G7jGvijaHkopr0j0+4mo)>a6UiRd>iH(GJzXGzDwpfR3bora`ChPkHugM zOjJAtzGWxysEIF9lb!_KCk5MhT-|(oLl?dxM z9mkGHFutLJw@ql(d9JRV5m~oos1;#V%ZT;WCD7P-N2xqggbqT8r}G(MWHM7~ieyXd z7kfWQ4wcjz;OS@e=2_(o=4Y|Ut zatS?z6oMRsXQnrp$Y45c5lNBc7s@M6Um_=bczOQj@kG{Q1%h?CQZKVkJu?(+R0MW% zLG-BWZw@bs7b>F8q+hB3umn#uPHxKS6JE5?%|!;;al=G=Y&#BF;9zc^8z>xESCMNlVW4gJj>3N>!9b_vVd%*pJ4ijKUO5 z%cs_`r7hxc*qKqcY^cbzTCHMQ=-6TDSz3GSnjn-JAWqU;@(kGti73_jf$;NfMx}9?C1u}{UY8YiyqHe!c4z` zfO6Z_HJZ5B>A0m1j!i1{@?Arpxzt(D2oO*z>p}LL`zzsGYD()&$-J@LD7;rk!`%5s z--Gi=S%Aro9GJNesZ<7&dc6+nKgV12H+Z^oqP3S}8Cf@>U~_(_>q1DW8YIZx=5tW_ zC3ME}`}FY`LEkavGbad!7MnU9Ul4o)yV#16@Vc`m$Q{#G_Hhe_J@e~w&-I7I8pli{ zfE^?TcJ;|Rf@KOaZof3nB5!}1oD`Sv2Z>Lr2QSLs%!qvqj&3H4$yoekh~}3BtGHxWMU`(#S6x*a5m8yQ}5Fi{XHJzpgGO#~yW&?h?R6rWffS8SvaB zqTZFW0kpGW9HL6go*BPgU4Rt7RD53@R0m08?T5=Rr#MsJek8cy^Rfi^At;)(Z5$;l zi!aAdnr__k&#m%bhmgx&L^;CXv~^;UeUcjheVA5+xDF+gi^#Znp2)&6l^-qLp#$I@ z0$?q;R}*Z}`tQIPh`tDlekHc>9Or!v_8t9a{2CRCv(&Jx^z2DG1;IN|FweVLx9)z^|P z8ns_s;QXmq>Y_M#+P}V5iNL0nj0i9aUPKpXxidoGmZslE#Fr!#ARn4=|Ea2?EMn5c z{>JMy&3U!du?g+PH;+9KBkkg5`{QaCoTIZzKvN^h0!E!FO_A?uCqXJ;v}4gvD-s%O z3zOCAgis=R`Jt&~UlUmiimWsJwrhUF1$?iG`QFOFGLh?OJHBvTVxgTx)Mt0MWYo|>Q)i>7{;g9e21#E|kg?^|3rLYrsE(G<@ z0Bz6i#InE&O@D|FbwcZgcSwTYa)G>~4DuhO?NIsr*1NBb>Bzg}qEcK1`9-ffDBz!YSHDh-x?z`OsFVE$Jxa1a;#n$3Wk@Q3b? zpJef$@5x9Sps~ly>i;)RT6{t9>rOgfnE&7$ehs0(g8Z9jFF-Upnv4r^_~%>vo7W(q z2N+r>V=}BreygGVH&;(#1;9D=vi;EC(mH>0oxgmUM#$jT1Z9}0KcL+Hi>sGY0*~F4 zZSH@2Z6OeUUoX1V>)*WNKfN5UF<5M4w_a{`9hH%pIVvC&qLerYs;`8bX7@JnVK2a9Pr>6c8%u|gEMo|W=ka^}JTaqrx$qFznD zVDh^QlQl^ucNi;$koh=NHxY~6R7NitBT6WW#)ZNle(AOq{^*9foK726e?IDy(ZTmR zm+)UQ@tatQ&Vy$Z1+`ym!50r+o*la6Sk4wAf)Xf3`oQ{d);s`yX|n4I|KZutjYzQ96JEjDac`|?-sYAO43&-GSaL6;8sAS4Rm<{cH~FK z)5_imUksv#z8F_L(X*iTEV$cL{4X7G+ zs^;AxCF8UwY2}BcWb@Qn2{r)R+q7+N8Kh1bC)J#sNm=yiO=!O~YZ}t{-V1Q`MuBt= z9&q(SwYILUOp{aS(Yuxl=hJgh&DH2JRbN;N%WSm-!P4X3`Bt(!;>P+-lIIM=PC=UQ zuw-{g8XRuHQZNO=UK-2 z@y%(MH!9Z}Na?Tj+T926Ln4P6W>r^)^1-K@psFv!ynQ$*mByg7`Yir%7GTR1T|i@)3*g$2slL9+w*p=G5BNpe-|%ndmyK!I_S@a$WF<|3 zR4VgHd#4?E&yD+?1OaE){CUnl;3gp|HN_etY1I_g0zV1h&qDgE?u{vhMd-K&*r|~9 zrd_w)X`}QI=jA;BTRH_Iml`gNqj{8I`w1~f)+QRXB7#8I1q8g5SAgmb(yhq*P5*nH z|A*^DLil*aJ8-^oy*5AhvFT-$EvS)~MMhjTz;B)u0l* zfOr$L=u%D$YXw$A`dZw8@3r$D4m1^~m8h;4_@7e6!PTYJLiX{3E=*jb$1H;- zi`<-=9q*)y3zI>gES(FBTv-2cn3ht zSI^bWE52cIQCS1#>5ONz`NdDA_kk+qn;l&%^NXnZ$-My1yOC2$0qK%0E;=rn7pLvl z!BUY;m{xAqczXruetY7h{8?phN*=gr2L4PPJ;DpJ#k7d}viI`IpR%(D;g4atOZ-1V%EVsUM{T!NBa`Q;$RXpB277 z>ZMa?B;bUQic0VUV#RRPWYCR=1JPAIk6t`ga~kivk9ayfLN1W^9$cnJs&75f^CH*5 zuTl=kAkD4)QU@SVb9ksFa3OsD2=j&h;v|UM_-?4SD4m6t?4uL(#^jXCjVA4ng2zc_ z6n|gBFC-vvxe*6C`lh=rj}OgC;TS4S`W-@bk%U;^S`>H$<=113_pB76-o`KsK>LGU z)ks-B@!O(A_9K#72NCYaM}Q?WGZP!+b>i5TEZ!ASCs;td2cX4d^h-c7`O$ZB$C_oN zsF4lpAQ@osTULM*0D!4DXAd#~1FW5jqWFA!^#x$`G&w(7*8s(f3rG;V9GP+lOB_O` z?ZjuymB!tpkY{DO?Dzf~qHVaAT938b%;WU#8xx-Wc8u>-)u)9aGs=1@N1aRl`e;X| zCC-z*TG8%(T^EK{*CTngLOaa)dn=|lbC9N{lWpbV{91@-3fM6b3TLK1uX>#!>ptO zpe%l_(5LN-)XxIkP)Sl z`P`5VSKj$a0FP1eQg6EE!o=+TD@P1l1(dL>iEmq(_|qBoy6Cw2z%*kHBWvdHyg z=zDXw*A3!fwlCD>#8uOf^HH*ozG3|G2Ia;JE;;VW4HzPDdIlKv?(m!~N3v2JszbOy zYU_dgf$}mxeW_T51*U&`PK-!0XM;f|5a+M8!AIFMisTKhAw=~Txh0Y;wJ^2{Av;s7 zua+%xI~k-O!m!l40HOXjacVHG7w9wSXLRb8#61EzP=|}{D&^2?2){j~Qfg-kHgGnb z-Y;2;-(o1QuV~qP{bLFHoal(iZy+#oV<#~E0LEnAAd3X7Fs8wXtc=v#UlcYqNl@;<#nSi!CH=Dhr`v9d};jARv-bb&5)w1p9cF%V=pJi9_ai} zajZemz*x0{2Fqs(r3Yh+L5!h9s{jVvHVc`#04U~Hbd@#jM?uX;{Q$^gCBP^|BgG6; zfyH1o;q2670@holE3?1VZL}N<&wIZ*r&H%%JR2Ol((v<_PnU*_}3)T8e&2 z2fy5iAEa+K_FzV_UoETzHzeMKE_z73eoc`0TrO=7f;ytEw54jgnB5HpGZWq&f&x>q z(&b5g;Q9i@>Q`TOl{$dk!LT{_aHSFd96fmc7O+ZHnS#mT@gSxf?7j8)e9Je<{@?7} z)O(IVk!fFP6VJSk?kWLY7frx}B28x6!S$T8?jn-^3LNS4kAR6EK-S-S#}7dG_$^}p z;3*EOK>ImZZhhup`oCRDu@q%!NHkVAcU|2pW<~cz=_$e+U``$%+AJS{ty~K=^U429o)202+(y z=JK$p@qFXuehr|_O$LZY2zC8i5yPrKs3%Ghpq?<6^nXJ|{e?CA&+E`BN5}`HZ#So5 zH;!PY1CaM*z_>yYt)iO|^?V9YfP#qvT^S%aD9>Cn`e}K*a-={gkW+uI;JgFu{=vJX zrbyyjV2j*JnOY8-QMP#92rSt#Q4UIN&I}m8BLD;OXqtubj!A(fbAyZLbU#sI8Q1?H zx{`^%zGC|I%dBF*#`_#LFxKO2q|dnnOW73wBuwwL7l1Iu?gB3PBQx{A3j!aTfl)Hf zXN0aNu)yOObJI7KNC^bKO<@V7n(A2rV?16A5jSRbGJyE))=L=2_{ z5723^@6W-=K8m&wW<9=>$E-E;LK=kZbO(AfAj`P{D+M`EKV1iTMGtR+lbjS>!^XZfV z@n-3j`?#=BC!-|UGW%>mqFrH-b1~>G}jDiBPMzcOM0 z-V(~y=_}wZtyi$tUx+bkC*N)weClRV+}*$3aFQ$vAcWHQ^^&{TJlvBB$~k}98h~z( z&h8Ww{p_38!T{O4@q1~~aLen|Kv(i3d%J9ql0unvhQtC-|rOTVM^9O085$Q|MKq8 zW9&d3M~2IW+YH`I>A91iM?Y>5=%IohpgRrjewiSm2eur38RilT8vE#JzP_FT$kX&a z<3Iz0{hAQ-4?ZiMp3IMDJ{V+yx|ur;9)za>-=|5586|+af&SJxFogwsnUU+M3*g2~ zX3!pEdj)Cj>|6S{Mb}p@>{^?X?xM>oP-?S4bSfIPPzUzr8nkYiF(w&|DGCy0WzU z_5q(v3J^|D3bF7GT|n7p1Gww7AU8!*5;KVeB3Q;FKP`vUv%}T9ZfFX&w^#tgjoSeN z`iBe`0Ht!HR6peQ7sx)I^T%E~74knSKgD}SY3&ZxWZI+8LL}!d1>G807);lBK&Hwa zL*-+W=atA*_P0x|Mx5S zgEyh`8M2r_w-)2UT9x-S83cF82O~nco*dvsc5{SuqFHJGo-Xa}>}!`E{iX2O?12$e z(=K&=by7i%cq9d0DKB}s*By`;yhCMhEYjTM*|1;s3J%I62kb?V%}0)JPG)swi8}Rb zKwcVc^4RS(<&A$taH6E}TsOEAWOdU!%z6|-u2wamu(L!=xdLBp9RxMCAZhJ!eV9BC zC|iMYi)FW*18MELk7Pko@oeTGN`+K6KryQdFag-Jp94BGtFe4l^UWQ=6AnRbPwQgi za)F@O>Aqg|cICPtaR3Z10rcfpruXZ^pu|@8AtdI_#eed=SNz|0_&ydM@FDZl!qSPQ zXc`NcJ|H7cEu@#FS;AswOdCe)j(m+T1&vf#z>G0`4=RqdJ+VZys+ssz3Zl`+?3Q@c ziGuE6)pz)Wf>%gSQCc2Am3szCt9ZRs^b&#ofc40^%;($5)_vQCt@xc@&Xan#ovr5C z!vmiA)x)bDH@k0qE*2#Ru>nI=xl$jVpur-zs_1kZOSbwoHn+a|zLt>{$T_U|6*mrIo( zK;9Ra1jK)@XFV&q5wvdABOX>YSm0LJ!lkUCIkm1K+K(?P|wmn_NIBtyLx&*yB)^A#W zj~)$|n#nRL4S#*Xi3fUv=Duh_Fq)hqITKHasDOOOQZ^PetS**Hm5XNnwsCN?^;d4; zw?3Y=5>G3Z&EudXwQh+c&(kWQ=T1EkNO|Jrw5hSrDzr+ZpC}AvrT@&+nrbDYBm?c{WK24@bq25nYm@WAQ@LKHd?#`dKEJ23N+$H8C zRIB~+8fmOhQ(ZZ-i(?%Kzy)N|rRZ&6q;62n{fhf=Li!&>i$vTDo&J2LL{C&!R@TP} zpe;uWY8`gxn$F^z5I05JA|ZStU}UJKrY5A|+Sb)IKAVXV&sc0WIX0Mc;l`%j*vxA& z%cZDzjh@y_Eu(L=L4);8*C97MFmYZ{BrE&b3r52%$f!Mw+VxDB+o+GtPa%Q}pw#2# zJ9e1q&84xuPfd4TVUy=%_Boi4AVS$k`IvN1KZc2}zZHSosGR#iu|nKaz#CfqJ&NXj z&Ag#^unaM^P9s6if|CYV76$QcMOaKF-`2=#@IQ@+oN|Rr;p7FP7W3)K0_~=2&;#WL z`l4PRwE7~oar@fa-gvZy$!CErGszBEoxNdQo_nKaC8TI8W4p{_hBV3+)umN=fCbs7Y)M>E_u+V zYSr_a=~)n;WW>%_H!08)7(}6$1fKNsSDAY?FZ~Hi)RawsS?d(H@pnBT;!4IlTz!(nFGt&`- z;{ir*A>UlpHC@y#@3f!IUr&1=5fc+9w2iKSV$Id(*907YuLuP)VFPQ{Y&8}uD=Q&P zWPs)CtlA}Sk^`thEZXOEnzcuIVCV&8a~;P)`ZWN3=k>Uj3w?R9#cZur)4*Ql(mQH} zTw^A}LqKE$h-I9X?q7n2i;$W7b3@4Ue!^oz{r0qVYU=9T+}v$d3x}Hk8LK*ZKgoww zl${7UODM05)}<}$vxA+TkLAV1#ohZnxaQgwCTll&tOzDsX*&5VwW%&l7ZwspM!Qng14WcZVD2ZY7PeET z%4yo>H|gdkxZoT5)FEnnL0n^jUag$ggg<^kSTI!Ca;Y;lUd}HUA;c1S-u3ieF4f30 zDnB`N;yGIl3=_r;=G_G%PMZfaZYJ;O8+0GAcMykY*1b}?mV2RS52wywBkvW$os-ib zMsmLU(F5Hl?G6F$iV!1N;6AaUyth;Gh>7zo(#@yfYpX?(arg1)PAXzN@MI^H;O;DC3^kZk@e(tUu|H-;4<453gD{ zu!1af+SLG}3e)rD%NGC$tkUm|ey`unUAh=oW( zR3a`+?8oyU_bAJ=FQh?l>i-X>7Hog|h1q=g_>Udy3zdREQVcCEE#I)!Tb=;00ay^K z&W~-H{2)Ks1LU2u9B&6ktv~*?=EB%}?pHol^u&Nl%bMKyx~s0LJeWX?nO)?BImALv zt?ynao)V|~SQm0#072UH*QnL!>e3(R?UgrjN7iKx_5x|}#-CN?W=kYqm*4gPJUO#K zaghc>rrd5%RapBTCW1Ms{8w2wm}(bg{1;_=?CuM9FD*b9!rnG0ho%QLns5acp0?hm zJ32mAvUSA>HLht8dheR|71b?5cz}Rc+OuB_$Ga+eah#jlB!2f2R1t-?WFIe-|`p%J-OM8Ym3_H|ASlZP?@-iMO2k4b&42-co$_X1Z z+Gjn&<$*Lf#y!e!1HlnKmO1n85vR%9h3P$+>5b7m&=NheH@P`P&)-(t2TEY>Tj9s% zhz_@|()rKRA$jP8>mJ%7v-!q`9*X#dcABt!MkYh)2WWgx+|x8GF|uVzX7s8XF%pG! z(4p*E5kobPfdxCCNnj1|OpAl0n} zyNkyoY7bHh6`yWF8#GUdv#v!+prDbwed0Aqps}ydM1O|b?fQQAQlHh?K5DdYnS((% zYH3-Y)lL{3DPk$BV!MgpLT2E$_47fzm?Zgh205*sD5gH(P1FQornVpRVo zAl1<}&%2_h;XItNa)OQgHm*xzi|1xbrEVrmCVVP^K!bkCOm++a{2k~`%B8A!D$OJn6 zS^pDX&aZ$APOJ2#_~Qf=>zjKjD*M2T?91Mtt#iPE?-%&dWs^hq0&tR-v$ggwiXmfy zfKiitWYYGdcK^dR`WP-yvvY)p&Z5^DOvMWW15>hUd~Q9ny4n0s4 zAvKG;H+y&W0v6YX(xm|b`M1yxt@bv{Y@t7ii8)V>pN zm`Yn8`pt^%g7|<9z&op~sOUgyu-_cpYuT5NFEbnnt+FoYU>KZpXZps*s$%2ieH%-u zTaqMvAumrzrFS+vjmF^`1Fs=X!bd6H7y-fpSNCfB4(~iDB|(@D=}7BA*aiHAxoT+$ z(1E;)QLCQAwa#!L$;z11#>Lds^vF<{`_)#q#(>CepS&qhA@W^acxScvv8f3wdrufr;j9~%5;#A;=(RO%twHoS)M$| zXQK=(P+TRI2^+9LB^`NH)=QmocZYVlS`Wi>7o4)wSb zFBr@9iF-F;`HPV<`0sRh!s;-pv9VF_{!9Xlnp)hjETyw5a5Op}^70Bg3{!WfQ}J(3 zN-NuGLwPtR&LXd{JhG1(sMqH*5sq3vT4v!821i&AHXtL40k;>bcg?R(`$_h<-FXi{ zH)l3oNw1-JeKmh`l`Yu;nVAZpdx#+eiQFfk2R5hl{aWB|Fv}-M2W=N`#u@SMoQ+EW z!&zEoS1wtS90RYxL81W7l0 z{`~b|2>8<_my;c$3R=3OdeFa0L(2!SLiZYoI5wE(!PtV|LlXfuxYpGgf5}#~X^%6; z8~u?CU2iDa*hds}JA@}gI=wOvfB5nr)}AV>d4vpwn@#|9i^ONiB;xbcx`El~=H})g z&|E-GdC{>78dtUOj8zEKx@!Ayv|UR+pT34edb$K$Quk^l!)jSW{a9mD(@hXx@w
$a&DSr)Tym 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

#8jE) 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 literal 0 HcmV?d00001 diff --git a/docs/get-details/algokit/architecture-decisions/assets/2024-01-13_native_binaries/image_2.png b/docs/get-details/algokit/architecture-decisions/assets/2024-01-13_native_binaries/image_2.png new file mode 100644 index 0000000000000000000000000000000000000000..b88aa71612738cae4cdde214c0a3c5dde366f6b4 GIT binary patch literal 202300 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

%3J{Ko4e+~_A}x*ejr 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 Bd!PUS literal 0 HcmV?d00001 diff --git a/docs/get-details/algokit/cli-reference.md b/docs/get-details/algokit/cli-reference.md index 7be249b0..35971c0c 100644 --- a/docs/get-details/algokit/cli-reference.md +++ b/docs/get-details/algokit/cli-reference.md @@ -186,6 +186,14 @@ Enable/disable interactive prompts. If the CI environment variable is set, defau ### -P, --path Specify the project directory. If not provided, current working directory will be used. + +### --deployer +(Optional) Alias of the deployer account. Otherwise, will prompt the deployer mnemonic if specified in .algokit.toml file. + + +### --dispenser +(Optional) Alias of the dispenser account. Otherwise, will prompt the dispenser mnemonic if specified in .algokit.toml file. + ### Arguments @@ -212,7 +220,7 @@ algokit dispenser fund [OPTIONS] ### -r, --receiver -**Required** Receiver address to fund with TestNet ALGOs. +**Required** Address or alias of the receiver to fund with TestNet ALGOs. ### -a, --amount @@ -394,6 +402,12 @@ automatically open Visual Studio Code. This should be run in the parent directory that you want the project folder created in. +By default, the --workspace flag creates projects within a workspace structure or integrates them into an existing +one, promoting organized management of multiple projects. Alternatively, +to disable this behavior use the --no-workspace flag, which ensures +the new project is created in a standalone target directory. This is +suitable for isolated projects or when workspace integration is unnecessary. + ```shell algokit init [OPTIONS] ``` @@ -406,12 +420,12 @@ Name of the project / directory / repository to create. ### -t, --template -Name of an official template to use. To see a list of descriptions, run this command with no arguments. +Name of an official template to use. To choose interactively, run this command with no arguments. * **Options** - beaker | tealscript | react | fullstack | playground + tealscript | puya | react | fullstack | beaker | base | playground @@ -443,6 +457,10 @@ Whether to run algokit bootstrap to install and configure the new project's depe Whether to open an IDE for you if the IDE and IDE config are detected. Supported IDEs: VS Code. +### --workspace, --no-workspace +Whether to prefer structuring standalone projects as part of a workspace. + + ### -a, --answer Answers key/value pairs to pass to the template. @@ -516,6 +534,12 @@ Start the AlgoKit LocalNet. algokit localnet start [OPTIONS] ``` +### Options + + +### -n, --name +Specify a name for a custom LocalNet instance. AlgoKit will not manage the configuration of named LocalNet instances, allowing developers to configure it in any way they need. + ### status Check the status of the AlgoKit LocalNet. @@ -531,3 +555,479 @@ Stop the AlgoKit LocalNet. ```shell algokit localnet stop [OPTIONS] ``` + +## task + +Collection of useful tasks to help you develop on Algorand. + +```shell +algokit task [OPTIONS] COMMAND [ARGS]... +``` + +### analyze + +Analyze TEAL programs for common vulnerabilities using Tealer. This task uses a third party tool to suggest improvements for your TEAL programs, but remember to always test your smart contracts code, follow modern software engineering practices and use the guidelines for smart contract development. This should not be used as a substitute for an actual audit. For full list of available detectors, please refer to [https://github.com/crytic/tealer?tab=readme-ov-file#detectors](https://github.com/crytic/tealer?tab=readme-ov-file#detectors) + +```shell +algokit task analyze [OPTIONS] INPUT_PATHS... +``` + +### Options + + +### -r, --recursive +Recursively search for all TEAL files within the provided directory. + + +### --force +Force verification without the disclaimer confirmation prompt. + + +### --diff +Exit with a non-zero code if differences are found between current and last reports. Reports are generated each run, but with this flag execution fails if the current report doesn't match the last report. Reports are stored in the .algokit/static-analysis/snapshots folder by default. Use --output for a custom path. + + +### -o, --output +Directory path where to store the results of the static analysis. Defaults to .algokit/static-analysis/snapshots. + + +### -e, --exclude +Exclude specific vulnerabilities from the analysis. Supports multiple exclusions in a single run. + +### Arguments + + +### INPUT_PATHS +Required argument(s) + +### ipfs + +Upload files to IPFS using Pinata provider. + +```shell +algokit task ipfs [OPTIONS] COMMAND [ARGS]... +``` + +#### login + +Login to Pinata ipfs provider. You will be prompted for your JWT. + +```shell +algokit task ipfs login [OPTIONS] +``` + +#### logout + +Logout of Pinata ipfs provider. + +```shell +algokit task ipfs logout [OPTIONS] +``` + +#### upload + +Upload a file to Pinata ipfs provider. Please note, max file size is 100MB. + +```shell +algokit task ipfs upload [OPTIONS] +``` + +### Options + + +### -f, --file +**Required** Path to the file to upload. + + +### -n, --name +Human readable name for this upload, for use in file listings. + +### mint + +Mint new fungible or non-fungible assets on Algorand. + +```shell +algokit task mint [OPTIONS] +``` + +### Options + + +### --creator +**Required** Address or alias of the asset creator. + + +### -n, --name +**Required** Asset name. + + +### -u, --unit +**Required** Unit name of the asset. + + +### -t, --total +Total supply of the asset. Defaults to 1. + + +### -d, --decimals +Number of decimals. Defaults to 0. + + +### -i, --image +**Required** Path to the asset image file to be uploaded to IPFS. + + +### -m, --metadata +Path to the ARC19 compliant asset metadata file to be uploaded to IPFS. If not provided, +a default metadata object will be generated automatically based on asset-name, decimals and image. +For more details refer to [https://arc.algorand.foundation/ARCs/arc-0003#json-metadata-file-schema](https://arc.algorand.foundation/ARCs/arc-0003#json-metadata-file-schema). + + +### --mutable, --immutable +Whether the asset should be mutable or immutable. Refers to ARC19 by default. + + +### --nft, --ft +Whether the asset should be validated as NFT or FT. Refers to NFT by default and validates canonical +definitions of pure or fractional NFTs as per ARC3 standard. + + +### -n, --network +Network to use. Refers to localnet by default. + + +* **Options** + + localnet | testnet | mainnet + + +### nfd-lookup + +Perform a lookup via NFD domain or address, returning the associated address or domain respectively. + +```shell +algokit task nfd-lookup [OPTIONS] VALUE +``` + +### Options + + +### -o, --output +Output format for NFD API response. Defaults to address|domain resolved. + + +* **Options** + + full | tiny | address + + +### Arguments + + +### VALUE +Required argument + +### opt-in + +Opt-in to an asset(s). This is required before you can receive an asset. Use -n to specify localnet, testnet, or mainnet. To supply multiple asset IDs, separate them with a whitespace. + +```shell +algokit task opt-in [OPTIONS] ASSET_IDS... +``` + +### Options + + +### -a, --account +**Required** Address or alias of the signer account. + + +### -n, --network +Network to use. Refers to localnet by default. + + +* **Options** + + localnet | testnet | mainnet + + +### Arguments + + +### ASSET_IDS +Required argument(s) + +### opt-out + +opt-out of an asset(s). You can only opt out of an asset with a zero balance. Use -n to specify localnet, testnet, or mainnet. To supply multiple asset IDs, separate them with a whitespace. + +```shell +algokit task opt-out [OPTIONS] [ASSET_IDS]... +``` + +### Options + + +### -a, --account +**Required** Address or alias of the signer account. + + +### --all +Opt-out of all assets with zero balance. + + +### -n, --network +Network to use. Refers to localnet by default. + + +* **Options** + + localnet | testnet | mainnet + + +### Arguments + + +### ASSET_IDS +Optional argument(s) + +### send + +Send a signed transaction to the given network. + +```shell +algokit task send [OPTIONS] +``` + +### Options + + +### -f, --file +Single or multiple message pack encoded signed transactions from binary file to send. Option is mutually exclusive with transaction. + + +### -t, --transaction +Base64 encoded signed transaction to send. Option is mutually exclusive with file. + + +### -n, --network +Network to use. Refers to localnet by default. + + +* **Options** + + localnet | testnet | mainnet + + +### sign + +Sign goal clerk compatible Algorand transaction(s). + +```shell +algokit task sign [OPTIONS] +``` + +### Options + + +### -a, --account +**Required** Address or alias of the signer account. + + +### -f, --file +Single or multiple message pack encoded transactions from binary file to sign. Option is mutually exclusive with transaction. + + +### -t, --transaction +Single base64 encoded transaction object to sign. Option is mutually exclusive with file. + + +### -o, --output +The output file path to store signed transaction(s). + + +### --force +Force signing without confirmation. + +### transfer + +Transfer algos or assets from one account to another. + +```shell +algokit task transfer [OPTIONS] +``` + +### Options + + +### -s, --sender +**Required** Address or alias of the sender account. + + +### -r, --receiver +**Required** Address or alias to an account that will receive the asset(s). + + +### --asset, --id +Asset ID to transfer. Defaults to 0 (Algo). + + +### -a, --amount +**Required** Amount to transfer. + + +### --whole-units +Use whole units (Algos | ASAs) instead of smallest divisible units (for example, microAlgos). Disabled by default. + + +### -n, --network +Network to use. Refers to localnet by default. + + +* **Options** + + localnet | testnet | mainnet + + +### vanity-address + +Generate a vanity Algorand address. Your KEYWORD can only include letters A - Z and numbers 2 - 7. +Keeping your KEYWORD under 5 characters will usually result in faster generation. +Note: The longer the KEYWORD, the longer it may take to generate a matching address. +Please be patient if you choose a long keyword. + +```shell +algokit task vanity-address [OPTIONS] KEYWORD +``` + +### Options + + +### -m, --match +Location where the keyword will be included. Default is start. + + +* **Options** + + start | anywhere | end + + + +### -o, --output +How the output will be presented. + + +* **Options** + + stdout | alias | file + + + +### -a, --alias +Alias for the address. Required if output is "alias". + + +### --file-path +File path where to dump the output. Required if output is "file". + + +### -f, --force +Allow overwriting an aliases without confirmation, if output option is 'alias'. + +### Arguments + + +### KEYWORD +Required argument + +### wallet + +Create short aliases for your addresses and accounts on AlgoKit CLI. + +```shell +algokit task wallet [OPTIONS] COMMAND [ARGS]... +``` + +#### add + +Add an address or account to be stored against a named alias (at most 50 aliases). + +```shell +algokit task wallet add [OPTIONS] ALIAS_NAME +``` + +### Options + + +### -a, --address

+**Required** The address of the account. + + +### -m, --mnemonic +If specified then prompt the user for a mnemonic phrase interactively using masked input. + + +### -f, --force +Allow overwriting an existing alias. + +### Arguments + + +### ALIAS_NAME +Required argument + +#### get + +Get an address or account stored against a named alias. + +```shell +algokit task wallet get [OPTIONS] ALIAS +``` + +### Arguments + + +### ALIAS +Required argument + +#### list + +List all addresses and accounts stored against a named alias. + +```shell +algokit task wallet list [OPTIONS] +``` + +#### remove + +Remove an address or account stored against a named alias. + +```shell +algokit task wallet remove [OPTIONS] ALIAS +``` + +### Options + + +### -f, --force +Allow removing an alias without confirmation. + +### Arguments + + +### ALIAS +Required argument + +#### reset + +Remove all aliases. + +```shell +algokit task wallet reset [OPTIONS] +``` + +### Options + + +### -f, --force +Allow removing all aliases without confirmation. diff --git a/docs/get-details/algokit/features/deploy.md b/docs/get-details/algokit/features/deploy.md index c509bf74..7fefc9e7 100644 --- a/docs/get-details/algokit/features/deploy.md +++ b/docs/get-details/algokit/features/deploy.md @@ -15,6 +15,8 @@ This command deploys smart contracts from an AlgoKit compliant repository to the - `--command, -C TEXT`: Specifies a custom deploy command. If this option is not provided, the deploy command will be loaded from the `.algokit.toml` file. - `--interactive / --non-interactive, --ci`: Enables or disables the interactive prompt for mnemonics. When the CI environment variable is set, it defaults to non-interactive. - `--path, -P DIRECTORY`: Specifies the project directory. If not provided, the current working directory will be used. +- `--deployer`: Specifies the deployer alias. If not provided and if the deployer is specified in `.algokit.toml` file its mnemonic will be prompted. +- `--dispenser`: Specifies the dispenser alias. If not provided and if the dispenser is specified in `.algokit.toml` file its mnemonic will be prompted. - `-h, --help`: Show this message and exit. ## Environment files diff --git a/docs/get-details/algokit/features/dispenser.md b/docs/get-details/algokit/features/dispenser.md index 4b354f17..861c2ae3 100644 --- a/docs/get-details/algokit/features/dispenser.md +++ b/docs/get-details/algokit/features/dispenser.md @@ -57,7 +57,7 @@ $ algokit dispenser fund [OPTIONS] This command funds your wallet address with TestNet ALGOs. Options -- `--receiver`, -r: Receiver address to fund with TestNet ALGOs. This option is required. +- `--receiver`, -r: Receiver [alias](./tasks/wallet.md#add) or address to fund with TestNet ALGOs. This option is required. - `--amount`, -a: Amount to fund. Defaults to microAlgos. This option is required. - `--whole-units`: Use whole units (Algos) instead of smallest divisible units (microAlgos). Disabled by default. diff --git a/docs/get-details/algokit/features/generate.md b/docs/get-details/algokit/features/generate.md index eb9f2e13..05518b33 100644 --- a/docs/get-details/algokit/features/generate.md +++ b/docs/get-details/algokit/features/generate.md @@ -4,8 +4,7 @@ The `algokit generate` [command](../cli-reference.md#generate) is used to genera ## 1. Typed clients -The `algokit generate client` [command](../cli-reference.md#client) can be used to generate a typed client from an [ARC-0032](https://arc.algorand.foundation/ARCs/arc-0032) application specification with -both Python and TypeScript available as target languages. +The `algokit generate client` [command](../cli-reference.md#client) can be used to generate a typed client from an [ARC-0032](https://arc.algorand.foundation/ARCs/arc-0032) application specification with both Python and TypeScript available as target languages. ### Prerequisites @@ -17,6 +16,10 @@ Each generated client will also have a dependency on `algokit-utils` libraries f - Python clients require: `algokit-utils@^1.2` - TypeScript clients require: `@algorandfoundation/algokit-utils@^2.0` +### Input file / directory + +You can either specify a path to a ARC-0032 JSON file, or to a directory that is recursively scanned for `application.json` or `*.arc32.json` file(s). + ### Output tokens The output path is interpreted as relative to the current working directory, however an absolute path may also be specified e.g. @@ -25,7 +28,7 @@ The output path is interpreted as relative to the current working directory, how There are two tokens available for use with the `-o`, `--output` [option](../cli-reference.md#-o---output-): - `{contract_name}`: This will resolve to a name based on the ARC-0032 contract name, formatted appropriately for the target language. -- `{app_spec_dir}`: This will resolve to the parent directory of an `application.json` which can be useful to output a client relative to its source application.json. +- `{app_spec_dir}`: This will resolve to the parent directory of the `application.json` or `*.arc32.json` file which can be useful to output a client relative to its source file. ### Usage @@ -59,24 +62,24 @@ response = app_client.hello(name="World") ```typescript // A similar working example can be seen in the beaker_production template, when using TypeScript deployment -import { HelloWorldAppClient } from './artifacts/HelloWorldApp/client' +import { HelloWorldAppClient } from "./artifacts/HelloWorldApp/client"; const appClient = new HelloWorldAppClient( { - resolveBy: 'creatorAndName', + resolveBy: "creatorAndName", findExistingUsing: indexer, sender: deployer, creatorAddress: deployer.addr, }, - algod, -) + algod +); const app = await appClient.deploy({ allowDelete: isLocal, allowUpdate: isLocal, - onSchemaBreak: isLocal ? 'replace' : 'fail', - onUpdate: isLocal ? 'update' : 'fail', -}) -const response = await appClient.hello({ name: 'world' }) + onSchemaBreak: isLocal ? "replace" : "fail", + onUpdate: isLocal ? "update" : "fail", +}); +const response = await appClient.hello({ name: "world" }); ``` ### Examples @@ -165,3 +168,7 @@ $ algokit generate smart-contract $ algokit generate smart-contract -a contract_name "MyCoolContract" ``` + +#### Third Party Generators + +It is important to understand that by default, AlgoKit will always prompt you before executing a generator to ensure it's from a trusted source. If you are confident about the source of the generator, you can use the `--force` or `-f` option to execute the generator without this confirmation prompt. Be cautious while using this option and ensure the generator is from a trusted source. At the moment, a trusted source for a generator is defined as _a generator that is included in the official AlgoKit templates (e.g. `smart-contract` generator in `algokit-beaker-default-template`)_ diff --git a/docs/get-details/algokit/features/init.md b/docs/get-details/algokit/features/init.md index bb89ee90..0c3d380b 100644 --- a/docs/get-details/algokit/features/init.md +++ b/docs/get-details/algokit/features/init.md @@ -4,7 +4,7 @@ The `algokit init` [command](../cli-reference.md#init) is used to quickly initia ## Quick start -For a quick start template with all of the defaults you can run: `algokit init --name my_project --template beaker --git --defaults` and then you can run `cd my_project && code .` and you should immediately be able to hit F5 to compile the hello world smart contract to the `smart_contracts/artifacts` folder (with breakpoint debugging - try setting a breakpoint in `smart_contracts/helloworld.py`) and open the `smart_contracts/helloworld.py` file and get linting, automatic formatting and syntax highlighting. +For a quick start template with all of the defaults you can run: `algokit init` which will interactively guide you through picking the right stack to build your AlgoKit project. Afterwards, you should immediately be able to hit F5 to compile the hello world smart contract to the `smart_contracts/artifacts` folder (with breakpoint debugging - try setting a breakpoint in `smart_contracts/helloworld.py`) and open the `smart_contracts/helloworld.py` file and get linting, automatic formatting and syntax highlighting. ## Prerequisites @@ -12,37 +12,60 @@ Git is a prerequisite for the init command as it is used to clone templates and ## Functionality -The simplest use of the command is to just run `algokit init` and you will then be guided through selecting a template and configuring options for that template. e.g. +As outlined in [quick start](#quick-start), the simplest use of the command is to just run `algokit init` and you will then be guided through selecting a template and configuring options for that template. e.g. ``` $ ~ algokit init -? Select a project template: beaker -? Name of project / directory to create the project in: my-smart-contract -🎤 Package author name - Algorand Foundation -🎤 Package author email - info@algorand.foundation -🎤 Do you want to add VSCode configuration? - Yes -🎤 Do you want to use a Python linter? - Ruff -🎤 Do you want to use a Python formatter (via Black)? - Yes -🎤 Do you want to use a Python type checker (via mypy)? - Yes -🎤 Do you want to include unit tests (via pytest)? - Yes -🎤 Do you want to include Python dependency vulnerability scanning (via pip-audit)? - Yes +? Which of these options best describes the project you want to start? `Smart Contract` | `Dapp Frontend` | `Smart Contract & Dapp Frontend` | `Custom` +? Name of project / directory to create the project in: my-cool-app ``` +Once above 2 questions are answered, the `cli` will start instantiating the project and will start asking questions specific to the template you are instantiating. By default official templates such as `puya`, `fullstack`, `react`, `beaker` include a notion of a `preset`. If you want to skip all questions and let the tool preset the answers tailored for a starter project you can pick `Starter`, for a more advanced project that includes unit tests, CI automation and other advanced features, pick `Production`. Lastly, if you prefer to modify the experience and tailor the template to your needs, pick the `Custom` preset. + If you want to accept the default for each option simply hit [enter] or alternatively to speed things up you can run `algokit init --defaults` and they will be auto-accepted. +### Workspaces vs Standalone Projects + +AlgoKit supports two distinct project structures: Workspaces and Standalone Projects. This flexibility allows developers to choose the most suitable approach for their project's needs. + +### Workspaces + +Workspaces are designed for managing multiple related projects under a single root directory. This approach is beneficial for complex applications that consist of multiple sub-projects, such as a smart contract and a corresponding frontend application. Workspaces help in organizing these sub-projects in a structured manner, making it easier to manage dependencies and shared configurations. + +To initialize a project within a workspace, use the `--workspace` flag. If a workspace does not already exist, AlgoKit will create one for you by default (unless you disable it via `--no-workspace` flag). Once established, new projects can be added to this workspace, allowing for centralized management. + +To mark your project as `workspace` fill in the following in your `.algokit.toml` file: + +```toml +[project] +type = 'workspace' # type specifying if the project is a workspace or standalone +projects_root_path = 'projects' # path to the root folder containing all sub-projects in the workspace +``` + +### Standalone Projects + +Standalone projects are suitable for simpler applications or when working on a single component. This structure is straightforward, with each project residing in its own directory, independent of others. Standalone projects are ideal for developers who prefer simplicity or are focusing on a single aspect of their application and are sure that they will not need to add more sub-projects in the future. + +To create a standalone project, use the `--no-workspace` flag during initialization. This instructs AlgoKit to bypass the workspace structure and set up the project as an isolated entity. + +Both workspaces and standalone projects are fully supported by AlgoKit's suite of tools, ensuring developers can choose the structure that best fits their workflow without compromising on functionality. + +To mark your project as a standalone project fill in the following in your `.algokit.toml` file: + +```toml +[project] +type = {'backend' | 'contract' | 'frontend'} # currently support 3 generic categories for standalone projects +name = 'my-project' # unique name for the project inside workspace +``` + +> We recommend using workspaces for most projects (hence enabled by default), as it provides a more organized and scalable approach to managing multiple sub-projects. However, standalone projects are a great choice for simple applications or when you are certain that you will not need to add more sub-projects in the future, for such cases simply append `--no-workspace` when using `algokit init` command. + ## Bootstrapping You will also be prompted if you wish to run the [bootstrap](../cli-reference.md#bootstrap) command, this is useful if you plan to immediately begin developing in the new project. If you passed in `--defaults` or `--bootstrap` then it will automatically run bootstrapping unless you passed in `--no-bootstrap`. ``` + ? Do you want to run `algokit bootstrap` to bootstrap dependencies for this new project so it can be run immediately? Yes Installing Python dependencies and setting up Python virtual environment via Poetry poetry: Creating virtualenv my-smart-contract in /Users/algokit/algokit-init/my-smart-contract/.venv @@ -63,13 +86,17 @@ Copying /Users/algokit/algokit-init/my-smart-contract/smart_contracts/.env.templ 🎉 Performed initial git commit successfully! 🎉 🙌 Project initialized at `my-smart-contract`! For template specific next steps, consult the documentation of your selected template 🧐 Your selected template comes from: -➡️ https://github.com/algorandfoundation/algokit-beaker-default-template +➡️ https://github.com/algorandfoundation/algokit-beaker-default-template As a suggestion, if you wanted to open the project in VS Code you could execute: + > cd my-smart-contract && code . + ``` After bootstrapping you are also given the opportunity to initialize a git repo, upon successful completion of the init command the project is ready to be used. If you pass in `--git` it will automatically initialise the git repository and if you pass in `--no-git` it won't. +> Please note, when using `--no-workspaces`, algokit init will assume a max lookup depth of 1 for a fresh template based project. Otherwise it will assume a max depth of 2, since default algokit workspace structure is at most 2 levels deep. + ## Options There are a number of options that can be used to provide answers to the template prompts. Some of the options requiring further explanation are detailed below, but consult the CLI reference for all available [options](../cli-reference.md#init). @@ -80,16 +107,18 @@ As well as the official Algorand templates shown when running the init command, e.g. `algokit init --template-url https://github.com/algorandfoundation/algokit-beaker-default-template` (that being the url of the official beaker template, the same as `algokit init -t beaker`). -The `--template-url` option can be combined with `--template-url-ref` to specify a specific commit, branch or tag +The `--template-url` option can be combined with `--template-url-ref` to specify a specific commit, branch or tag -e.g. `algokit init --template-url https://github.com/algorandfoundation/algokit-beaker-default-template --template-url-ref 9985005b7389c90c6afed685d75bb8e7608b2a96` +e.g. `algokit init --template-url https://github.com/algorandfoundation/algokit-beaker-default-template --template-url-ref 9985005b7389c90c6afed685d75bb8e7608b2a96` If the URL is not an official template there is a potential security risk and so to continue you must either acknowledge this prompt, or if you are in a non-interactive environment you can pass the `--UNSAFE-SECURITY-accept-template-url` option (but we generally don't recommend this option so users can review the warning message first) e.g. ``` + Community templates have not been reviewed, and can execute arbitrary code. -Please inspect the template repository, and pay particular attention to the values of _tasks, _migrations and _jinja_extensions in copier.yml +Please inspect the template repository, and pay particular attention to the values of \_tasks, \_migrations and \_jinja_extensions in copier.yml ? Continue anyway? Yes + ``` If you want to create a community template, you can use the [AlgoKit guidelines on template building](../tutorials/algokit-template.md#creating-algokit-templates) and [Copier documentation](https://copier.readthedocs.io/en/stable/) as a starting point. @@ -105,12 +134,27 @@ To find out the key for a specific answer you can either look at `.copier-answer By combining a number of options, it is possible to initialize a new project without any interaction. For example, to create a project named `my-smart-contract` using the `beaker` template with no git, no bootstrapping, the author name of `Algorand Foundation`, and defaults for all other values, you could execute the following: ``` -$ ~ algokit init -n my-smart-contract -t beaker --no-git --no-bootstrap --answer author_name "Algorand Foundation" --defaults + +$ ~ algokit init -n my-smart-contract -t puya --no-git --no-bootstrap --answer author_name "Algorand Foundation" --defaults 🙌 Project initialized at `my-smart-contract`! For template specific next steps, consult the documentation of your selected template 🧐 Your selected template comes from: -➡️ https://github.com/algorandfoundation/algokit-beaker-default-template +➡️ https://github.com/algorandfoundation/algokit-beaker-default-template As a suggestion, if you wanted to open the project in VS Code you could execute: + > cd my-smart-contract && code . + ``` For more details about the `AlgoKit init` command, please refer to the [AlgoKit CLI reference documentation](../cli-reference.md#init). + +``` + +``` + +``` + +``` + +``` + +``` diff --git a/docs/get-details/algokit/features/localnet.md b/docs/get-details/algokit/features/localnet.md index 2f104d37..5c107896 100644 --- a/docs/get-details/algokit/features/localnet.md +++ b/docs/get-details/algokit/features/localnet.md @@ -22,11 +22,11 @@ The AlgoKit LocalNet is built with 30,000 participation keys generated and after ## Supported operating environments -We publish DockerHub images for `arm64` and `amd64`, which means that AlgoKit LocalNet is supported on Windows, Linux and Mac on Intel and AMD chipsets (including Mac M1). +We rely on the official Algorand docker images for Indexer, Conduit and Algod, which means that AlgoKit LocalNet is supported on Windows, Linux and Mac on Intel and AMD chipsets (including Apple Silicon). ## Functionality -### Creating / starting the LocalNet +### Creating / Starting the LocalNet To create / start your AlgoKit LocalNet instance you can run `algokit localnet start`. This will: @@ -37,8 +37,9 @@ To create / start your AlgoKit LocalNet instance you can run `algokit localnet s If it's the first time running it on your machine then it will download the following images from DockerHub: -- [`makerxau/algorand-sandbox-dev`](https://hub.docker.com/r/makerxau/algorand-sandbox-dev) (~150-200 MB) -- [`makerxau/algorand-indexer-dev`](https://hub.docker.com/r/makerxau/algorand-indexer-dev) (~25 MB) +- [`algorand/algod`](https://hub.docker.com/r/algorand/algod) (~500 MB) +- [`algorand/indexer`](https://hub.docker.com/r/algorand/indexer) (~96 MB) +- [`algorand/conduit`](https://hub.docker.com/r/algorand/conduit) (~98 MB) - [`postgres:13-alpine`](https://hub.docker.com/_/postgres) (~80 MB) Once they have downloaded, it won't try and re-download images unless you perform a `algokit localnet reset`. @@ -46,15 +47,35 @@ Once they have downloaded, it won't try and re-download images unless you perfor Once the LocalNet has started, the following endpoints will be available: - [algod](https://developer.algorand.org/docs/rest-apis/algod/v2/): - - address: http://localhost:4001 + - address: - token: `aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa` - [kmd](https://developer.algorand.org/docs/rest-apis/kmd/): - - address: http://localhost:4002 + - address: - token: `aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa` - [indexer](https://developer.algorand.org/docs/rest-apis/indexer/): - - address: http://localhost:8980 + - address: - tealdbg port: - - address: http://localhost:9392 + - address: + +### Creating / Starting a Named LocalNet + +AlgoKit manages the default LocalNet environment and automatically keeps the configuration updated with any upstream changes. As a result, configuration changes are reset automatically by AlgoKit, so that developers always have access to a known good LocalNet configuration. This works well for the majority of scenarios, however sometimes developers need the control to make specific configuration changes for specific scenarios. + +When you want more control, named LocalNet instances can be used by running `algokit localnet start --name {name}`. This command will set up and run a named LocalNet environment (based off the default), however AlgoKit will not update the environment or configuration automatically. From here developers are able to modify their named environment in any way they like, for example setting `DevMode: false` in `algod_network_template.json`. + +Once you have a named LocalNet running, the AlgoKit LocalNet commands will target this instance. +If at any point you'd like to switch back to the default LocalNet, simply run `algokit localnet start`. + +### Named LocalNet Configuration Directory + +When running `algokit localnet start --name {name}`, AlgoKit stores configuration files in a specific directory on your system. The location of this directory depends on your operating system: + +- **Windows**: We use the value of the `APPDATA` environment variable to determine the directory to store the configuration files. This is usually `C:\Users\USERNAME\AppData\Roaming`. +- **Linux or Mac**: We use the value of the `XDG_CONFIG_HOME` environment variable to determine the directory to store the configuration files. If `XDG_CONFIG_HOME` is not set, the default location is `~/.config`. + +Assuming you have previously used a default LocalNet, the path `./algokit/sandbox/` will exist inside the configuration directory, containing the configuration settings for the default LocalNet instance. Additionally, for each named LocalNet instance you have created, the path `./algokit/sandbox_{name}/` will exist, containing the configuration settings for the respective named LocalNet instances. + +It is important to note that only the configuration files for a named LocalNet instance should be changed. Any changes made to the default LocalNet instance will be reverted by AlgoKit. ### Stopping and Resetting the LocalNet @@ -95,7 +116,7 @@ Needing to do this manual step every time you spin up a new development environm AlgoKit Utils provides methods to help you do this: -* TypeScript - [`ensureFunded`](https://github.com/algorandfoundation/algokit-utils-ts/blob/main/docs/capabilities/transfer.md#ensurefunded) and [`getDispenserAccount`](https://github.com/algorandfoundation/algokit-utils-ts/blob/main/docs/capabilities/transfer.md#dispenser) -* Python - [`ensure_funded`](https://algorandfoundation.github.io/algokit-utils-py/html/apidocs/algokit_utils/algokit_utils.html#algokit_utils.ensure_funded) and [`get_dispenser_account`](https://algorandfoundation.github.io/algokit-utils-py/html/apidocs/algokit_utils/algokit_utils.html#algokit_utils.get_dispenser_account) +- TypeScript - [`ensureFunded`](https://github.com/algorandfoundation/algokit-utils-ts/blob/main/docs/capabilities/transfer.md#ensurefunded) and [`getDispenserAccount`](https://github.com/algorandfoundation/algokit-utils-ts/blob/main/docs/capabilities/transfer.md#dispenser) +- Python - [`ensure_funded`](https://algorandfoundation.github.io/algokit-utils-py/html/apidocs/algokit_utils/algokit_utils.html#algokit_utils.ensure_funded) and [`get_dispenser_account`](https://algorandfoundation.github.io/algokit-utils-py/html/apidocs/algokit_utils/algokit_utils.html#algokit_utils.get_dispenser_account) For more details about the `AlgoKit localnet` command, please refer to the [AlgoKit CLI reference documentation](../cli-reference.md#localnet). diff --git a/docs/get-details/algokit/features/tasks.md b/docs/get-details/algokit/features/tasks.md new file mode 100644 index 00000000..9e4c286b --- /dev/null +++ b/docs/get-details/algokit/features/tasks.md @@ -0,0 +1,16 @@ +# AlgoKit Tasks + +AlgoKit Tasks are a collection of handy tasks that can be used to perform various operations on Algorand blockchain. + +## Features + +- [Wallet Aliasing](./tasks/wallet.md) - Manage your Algorand addresses and accounts effortlessly with the AlgoKit Wallet feature. This feature allows you to create short aliases for your addresses and accounts on AlgoKit CLI. +- [Vanity Address Generation](./tasks/vanity_address.md) - Generate vanity addresses for your Algorand accounts with the AlgoKit Vanity feature. This feature allows you to generate Algorand addresses which contains a specific keyword of your choice. +- [Transfer Assets or Algos](./tasks/transfer.md) - Transfer Algos or Assets from one account to another with the AlgoKit Transfer feature. This feature allows you to transfer Algos or Assets from one account to another on Algorand blockchain. +- [Opt-(in|out) Assets](./tasks/opt.md) - Opt-in or opt-out of Algorand Asset(s). Supports single or multiple assets. +- [Signing transactions](./tasks/sign.md) - Sign goal clerk compatible Algorand transactions. +- [Sending transactions](./tasks/send.md) - Send signed goal clerk compatible Algorand transactions. +- [NFD lookups](./tasks/nfd.md) - Perform a lookup via NFD domain or address, returning the associated address or domain respectively using the AlgoKit CLI. +- [IPFS uploads](./tasks/ipfs.md) - Upload files to IPFS. +- [Asset minting](./tasks/mint.md) - Mint new fungible or non-fungible assets on Algorand. +- [Analyze TEAL code](./tasks/analyze.md) - Analyze TEAL code using [`tealer`](https://github.com/crytic/tealer) integration for common vulnerabilities. diff --git a/docs/get-details/algokit/features/tasks/analyze.md b/docs/get-details/algokit/features/tasks/analyze.md new file mode 100644 index 00000000..6c5e980e --- /dev/null +++ b/docs/get-details/algokit/features/tasks/analyze.md @@ -0,0 +1,33 @@ +# AlgoKit Task Analyze + +The `analyze` task is a command-line utility that analyzes TEAL programs for common vulnerabilities using [Tealer](https://github.com/crytic/tealer) integration. It allows you to detect a range of common vulnerabilities in code written in TEAL. For full list of vulnerability detectors refer to [Tealer documentation](https://github.com/crytic/tealer?tab=readme-ov-file#detectors). + +## Usage + +```bash +algokit task analyze INPUT_PATHS [OPTIONS] +``` + +### Arguments + +- `INPUT_PATHS`: Paths to the TEAL files or directories containing TEAL files to be analyzed. This argument is required. + +### Options + +- `-r, --recursive`: Recursively search for all TEAL files within any provided directories. +- `--force`: Force verification without the disclaimer confirmation prompt. +- `--diff`: Exit with a non-zero code if differences are found between current and last reports. +- `-o, --output OUTPUT_PATH`: Directory path where to store the reports of the static analysis. +- `-e, --exclude DETECTORS`: Exclude specific vulnerabilities from the analysis. Supports multiple exclusions in a single run. + +## Example + +```bash +algokit task analyze ./contracts -r --exclude rekey-to --exclude missing-fee-check +``` + +This command will recursively analyze all TEAL files in the `contracts` directory and exclude the `missing-fee-check` vulnerability from the analysis. + +## Security considerations + +This task uses [`tealer`](https://github.com/crytic/tealer), a third-party tool, to suggest improvements for your TEAL programs, but remember to always test your smart contracts code, follow modern software engineering practices and use the [guidelines for smart contract development](https://developer.algorand.org/docs/get-details/dapps/smart-contracts/guidelines/). This should not be used as a substitute for an actual audit. diff --git a/docs/get-details/algokit/features/tasks/ipfs.md b/docs/get-details/algokit/features/tasks/ipfs.md new file mode 100644 index 00000000..89cfeabb --- /dev/null +++ b/docs/get-details/algokit/features/tasks/ipfs.md @@ -0,0 +1,66 @@ +# AlgoKit Task IPFS + +The AlgoKit IPFS feature allows you to interact with the IPFS [InterPlanetary File System](https://ipfs.tech/) using the [Piñata provider](https://www.pinata.cloud/). This feature supports logging in and out of the Piñata provider, and uploading files to IPFS. + +## Usage + +Available commands and possible usage as follows: + +```bash +$ ~ algokit task ipfs +Usage: algokit task ipfs [OPTIONS] + +Upload files to IPFS using Pinata provider. + +Options: + -f, --file PATH Path to the file to upload. [required] + -n, --name TEXT Human readable name for this upload, for use in file listings. + -h, --help Show this message and exit. +``` + +## Options + +- `--file, -f PATH`: Specifies the path to the file to upload. This option is required. +- `--name, -n TEXT`: Specifies a human readable name for this upload, for use in file listings. + +## Prerequisites + +Before you can use this feature, you need to ensure that you have signed up for a Piñata account and have a JWT. You can sign up for a Piñata account by reading [quickstart](https://docs.pinata.cloud/docs/getting-started). + +## Login + +Please note, you need to login to the Piñata provider before you can upload files. You can do this using the `login` command: + +```bash +$ algokit task ipfs login +``` + +This will prompt you to enter your Piñata JWT. Once you are logged in, you can upload files to IPFS. + +## Upload + +To upload a file to IPFS, you can use the `ipfs` command as follows: + +```bash +$ algokit task ipfs --file {PATH_TO_YOUR_FILE} +``` + +This will upload the file to IPFS using the Piñata provider and return the CID (Content Identifier) of the uploaded file. + +## Logout + +If you want to logout from the Piñata provider, you can use the `logout` command: + +```bash +$ algokit task ipfs logout +``` + +This will remove your Piñata JWT from the keyring. + +## File Size Limit + +Please note, the maximum file size that can be uploaded is 100MB. If you try to upload a file larger than this, you will receive an error. + +## Further Reading + +For in-depth details, visit the [ipfs section](../../cli-reference.md#ipfs) in the AlgoKit CLI reference documentation. diff --git a/docs/get-details/algokit/features/tasks/mint.md b/docs/get-details/algokit/features/tasks/mint.md new file mode 100644 index 00000000..0b6118fe --- /dev/null +++ b/docs/get-details/algokit/features/tasks/mint.md @@ -0,0 +1,70 @@ +# AlgoKit Task Mint + +The AlgoKit Mint feature allows you to mint new fungible or non-fungible assets on the Algorand blockchain. This feature supports the creation of assets, validation of asset parameters, and uploading of asset metadata and image to IPFS using the Piñata provider. Immutable assets are compliant with [ARC3](https://arc.algorand.foundation/ARCs/arc-0003), while mutable are based using [ARC19](https://arc.algorand.foundation/ARCs/arc-0019) standard. + +## Usage + +Available commands and possible usage as follows: + +```bash +Usage: algokit task mint [OPTIONS] + + Mint new fungible or non-fungible assets on Algorand. + +Options: + --creator TEXT Address or alias of the asset creator. [required] + -n, --name TEXT Asset name. [required] + -u, --unit TEXT Unit name of the asset. [required] + -t, --total INTEGER Total supply of the asset. Defaults to 1. + -d, --decimals INTEGER Number of decimals. Defaults to 0. + -i, --image FILE Path to the asset image file to be uploaded to IPFS. [required] + -m, --metadata FILE Path to the ARC19 compliant asset metadata file to be uploaded to IPFS. If not + provided, a default metadata object will be generated automatically based on asset- + name, decimals and image. For more details refer to + https://arc.algorand.foundation/ARCs/arc-0003#json-metadata-file-schema. + --mutable / --immutable Whether the asset should be mutable or immutable. Refers to `ARC19` by default. + --nft / --ft Whether the asset should be validated as NFT or FT. Refers to NFT by default and + validates canonical definitions of pure or fractional NFTs as per ARC3 standard. + -n, --network [localnet|testnet|mainnet] + Network to use. Refers to `localnet` by default. + -h, --help Show this message and exit. +``` + +## Options + +- `--creator TEXT`: Specifies the address or alias of the asset creator. This option is required. +- `-n, --name TEXT`: Specifies the asset name. This option is required. +- `-u, --unit TEXT`: Specifies the unit name of the asset. This option is required. +- `-t, --total INTEGER`: Specifies the total supply of the asset. Defaults to 1. +- `-d, --decimals INTEGER`: Specifies the number of decimals. Defaults to 0. +- `-i, --image PATH`: Specifies the path to the asset image file to be uploaded to IPFS. This option is required. +- `-m, --metadata PATH`: Specifies the path to the ARC19 compliant asset metadata file to be uploaded to IPFS. If not provided, a default metadata object will be generated automatically based on asset-name, decimals and image. +- `--mutable / --immutable`: Specifies whether the asset should be mutable or immutable. Refers to `ARC19` by default. +- `--nft / --ft`: Specifies whether the asset should be validated as NFT or FT. Refers to NFT by default and validates canonical definitions of pure or fractional NFTs as per ARC3 standard. +- `-n, --network [localnet|testnet|mainnet]`: Specifies the network to use. Refers to `localnet` by default. + +## Example + +To mint a new asset in interactive mode, you can use the mint command as follows: + +```bash +$ algokit task mint +``` + +This will interactively prompt you for the required information, upload the asset image and metadata to IPFS using the Piñata provider and mint a new asset on the Algorand blockchain. The [asset's metadata](https://arc.algorand.foundation/ARCs/arc-0003#json-metadata-file-schema) will be generated automatically based on the provided asset name, decimals, and image. + +If you want to provide a custom metadata file, you can use the --metadata flag: + +```bash +$ algokit task mint --metadata {PATH_TO_METADATA} +``` + +If the minting process is successful, the asset ID and transaction ID will be output to the console. + +For non interactive mode, refer to usage section above for available options. + +> Please note, creator account must have at least 0.2 Algos available to cover minimum balance requirements. + +## Further Reading + +For in-depth details, visit the [mint section](../../cli-reference.md#mint) in the AlgoKit CLI reference documentation. diff --git a/docs/get-details/algokit/features/tasks/nfd.md b/docs/get-details/algokit/features/tasks/nfd.md new file mode 100644 index 00000000..1e30df61 --- /dev/null +++ b/docs/get-details/algokit/features/tasks/nfd.md @@ -0,0 +1,45 @@ +# AlgoKit Task NFD Lookup + +The AlgoKit NFD Lookup feature allows you to perform a lookup via NFD domain or address, returning the associated address or domain respectively using the AlgoKit CLI. The feature is powered by [NFDomains MainNet API](https://api-docs.nf.domains/). + +## Usage + +Available commands and possible usage as follows: + +```bash +$ ~ algokit task nfd-lookup +Usage: algokit task nfd-lookup [OPTIONS] VALUE + +Perform a lookup via NFD domain or address, returning the associated address or domain respectively. + +Options: +-o, --output [full|tiny|address] Output format for NFD API response. Defaults to address|domain resolved. +-h, --help Show this message and exit. +``` + +## Options + +- `VALUE`: Specifies the NFD domain or Algorand address to lookup. This argument is required. +- `--output, -o [full|tiny|address]`: Specifies the output format for NFD API response. Defaults to address|domain resolved. + +> When using the `full` and `tiny` output formats, please be aware that these match the [views in get requests of the NFD API](https://api-docs.nf.domains/quick-start#views-in-get-requests). The `address` output format, which is used by default, refers to the respective domain name or address resolved and outputs it as a string (if found). + +## Example + +To perform a lookup, you can use the nfd-lookup command as follows: + +```bash +$ algokit task nfd-lookup {NFD_DOMAIN_OR_ALGORAND_ADDRESS} +``` + +This will perform a lookup and return the associated address or domain. If you want to specify the output format, you can use the --output flag: + +```bash +$ algokit task nfd-lookup {NFD_DOMAIN_OR_ALGORAND_ADDRESS} --output full +``` + +If the lookup is successful, the result will be output to the console in a JSON format. + +## Further Reading + +For in-depth details, visit the [nfd-lookup section](../../cli-reference.md#nfd-lookup) in the AlgoKit CLI reference documentation. diff --git a/docs/get-details/algokit/features/tasks/opt.md b/docs/get-details/algokit/features/tasks/opt.md new file mode 100644 index 00000000..c09f6b8d --- /dev/null +++ b/docs/get-details/algokit/features/tasks/opt.md @@ -0,0 +1,71 @@ +# AlgoKit Task Asset opt-(in|out) + +AlgoKit Task Asset opt-(in|out) allows you to opt-in or opt-out of Algorand Asset(s). This task supports single or multiple assets. + +## Usage + +Available commands and possible usage as follows: + +### Opt-in + +```bash +Usage: algokit task opt-in [OPTIONS] ASSET_IDS... + + Opt-in to an asset(s). This is required before you can receive an asset. + Use -n to specify localnet, testnet, or mainnet. To supply multiple asset IDs, separate them with a whitespace. + +Options: + --account, -a TEXT Address or alias of the signer account. [required] + -n, --network [localnet|testnet|mainnet] + Network to use. Refers to `localnet` by default. +``` + +### Opt-out + +```bash +Usage: algokit task opt-out [OPTIONS] [ASSET_IDS]... + + Opt-out of an asset(s). You can only opt out of an asset with a zero balance. + Use -n to specify localnet, testnet, or mainnet. To supply multiple asset IDs, separate them with a whitespace. + +Options: + --account, -a TEXT Address or alias of the signer account. [required] + --all Opt-out of all assets with zero balance. + -n, --network [localnet|testnet|mainnet] + Network to use. Refers to `localnet` by default. +``` + +## Options + +- `ASSET_IDS`: Specifies the asset IDs to opt-in or opt-out. To supply multiple asset IDs, separate them with a whitespace. +- `--account`, `-a` TEXT: Specifies the address or alias of the signer account. This option is required. +- `--all`: Specifies to opt-out of all assets with zero balance. +- `-n`, `--network` [localnet|testnet|mainnet]: Specifies the network to use. Refers to localnet by default. + +## Example + +Example + +To opt-in to an asset(s), you can use the opt-in command as follows: + +```bash +$ algokit task opt-in --account {YOUR_ACCOUNT} {ASSET_ID_1} {ASSET_ID_2} {ASSET_ID_3} ... +``` + +To opt-out of an asset(s), you can use the opt-out command as follows: + +```bash +$ algokit task opt-out --account {YOUR_ACCOUNT} {ASSET_ID_1} {ASSET_ID_2} ... +``` + +To opt-out of all assets with zero balance, you can use the opt-out command with the `--all` flag: + +```bash +$ algokit task opt-out --account {YOUR_ACCOUNT} --all +``` + +> Please note, the account must have sufficient balance to cover the transaction fees. + +## Further Reading + +For in-depth details, visit the [opt-in](../../cli-reference.md#opt-in) and [opt-out](../../cli/index#opt-out) sections in the AlgoKit CLI reference documentation. diff --git a/docs/get-details/algokit/features/tasks/send.md b/docs/get-details/algokit/features/tasks/send.md new file mode 100644 index 00000000..9db1ba48 --- /dev/null +++ b/docs/get-details/algokit/features/tasks/send.md @@ -0,0 +1,60 @@ +# AlgoKit Task Send + +The AlgoKit Send feature allows you to send signed Algorand transaction(s) to a specified network using the AlgoKit CLI. This feature supports sending single or multiple transactions, either provided directly as a base64 encoded string or from a binary file. + +## Usage + +Available commands and possible usage as follows: + +```bash +$ ~ algokit task send +Usage: algokit task send [OPTIONS] + + Send a signed transaction to the given network. + +Options: + -f, --file FILE Single or multiple message pack encoded signed transactions from binary file to + send. Option is mutually exclusive with transaction. + -t, --transaction TEXT Base64 encoded signed transaction to send. Option is mutually exclusive with file. + -n, --network [localnet|testnet|mainnet] + Network to use. Refers to `localnet` by default. + -h, --help Show this message and exit. +``` + +## Options + +- `--file, -f PATH`: Specifies the path to a binary file containing single or multiple message pack encoded signed transactions to send. Mutually exclusive with `--transaction` option. +- `--transaction, -t TEXT`: Specifies a single base64 encoded signed transaction to send. Mutually exclusive with `--file` option. +- `--network, -n [localnet|testnet|mainnet]`: Specifies the network to which the transactions will be sent. Refers to `localnet` by default. + +> Please note, `--transaction` flag only supports sending a single transaction. If you want to send multiple transactions, you can use the `--file` flag to specify a binary file containing multiple transactions. + +## Example + +To send a transaction, you can use the `send` command as follows: + +```bash +$ algokit task send --file {PATH_TO_BINARY_FILE_CONTAINING_SIGNED_TRANSACTIONS} +``` + +This will send the transactions to the default `localnet` network. If you want to send the transactions to a different network, you can use the `--network` flag: + +```bash +$ algokit task send --transaction {YOUR_BASE64_ENCODED_SIGNED_TRANSACTION} --network testnet +``` + +You can also pipe in the `stdout` of `algokit sign` command: + +```bash +$ algokit task sign --account {YOUR_ACCOUNT_ALIAS OR YOUR_ADDRESS} --file {PATH_TO_BINARY_FILE_CONTAINING_TRANSACTIONS} --force | algokit task send --network {network_name} +``` + +If the transaction is successfully sent, the transaction ID (txid) will be output to the console. You can check the transaction status at the provided transaction explorer URL. + +## Goal Compatibility + +Please note, at the moment this feature only supports [`goal clerk`](https://developer.algorand.org/docs/clis/goal/clerk/clerk/) compatible transaction objects. + +## Further Reading + +For in-depth details, visit the [send section](../../cli-reference.md#send) in the AlgoKit CLI reference documentation. diff --git a/docs/get-details/algokit/features/tasks/sign.md b/docs/get-details/algokit/features/tasks/sign.md new file mode 100644 index 00000000..d8fc42a8 --- /dev/null +++ b/docs/get-details/algokit/features/tasks/sign.md @@ -0,0 +1,94 @@ +# AlgoKit Task Sign + +The AlgoKit Sign feature allows you to sign Algorand transaction(s) using the AlgoKit CLI. This feature supports signing single or multiple transactions, either provided directly as a base64 encoded string or from a binary file. + +## Usage + +Available commands and possible usage as follows: + +```bash +$ ~ algokit task sign +Usage: algokit task sign [OPTIONS] + +Sign goal clerk compatible Algorand transaction(s). + +Options: +-a, --account TEXT Address or alias of the signer account. [required] +-f, --file PATH Single or multiple message pack encoded transactions from binary file to sign. +-t, --transaction TEXT Single base64 encoded transaction object to sign. +-o, --output PATH The output file path to store signed transaction(s). +--force Force signing without confirmation. +-h, --help Show this message and exit. +``` + +## Options + +- `--account, -a TEXT`: Specifies the address or alias of the signer account. This option is required. +- `--file, -f PATH`: Specifies the path to a binary file containing single or multiple message pack encoded transactions to sign. Mutually exclusive with `--transaction` option. +- `--transaction, -t TEXT`: Specifies a single base64 encoded transaction object to sign. Mutually exclusive with `--file` option. +- `--output, -o PATH`: Specifies the output file path to store signed transaction(s). +- `--force`: If specified, it allows signing without interactive confirmation prompt. + +> Please note, `--transaction` flag only supports signing a single transaction. If you want to sign multiple transactions, you can use the `--file` flag to specify a binary file containing multiple transactions. + +## Example + +To sign a transaction, you can use the `sign` command as follows: + +```bash +$ algokit task sign --account {YOUR_ACCOUNT_ALIAS OR YOUR_ADDRESS} --file {PATH_TO_BINARY_FILE_CONTAINING_TRANSACTIONS} +``` + +This will prompt you to confirm the transaction details before signing. If you want to bypass the confirmation, you can use the `--force` flag: + +```bash +$ algokit task sign --account {YOUR_ACCOUNT_ALIAS OR YOUR_ADDRESS} --transaction {YOUR_BASE64_ENCODED_TRANSACTION} --force +``` + +If the transaction is successfully signed, the signed transaction will be output to the console in a JSON format. If you want to write the signed transaction to a file, you can use the `--output` option: + +```bash +$ algokit task sign --account {YOUR_ACCOUNT_ALIAS OR YOUR_ADDRESS} --transaction {YOUR_BASE64_ENCODED_TRANSACTION} --output /path/to/output/file +``` + +This will write the signed transaction to the specified file. + +## Goal Compatibility + +Please note, at the moment this feature only supports [`goal clerk`](https://developer.algorand.org/docs/clis/goal/clerk/clerk/) compatible transaction objects. + +When `--output` option is not specified, the signed transaction(s) will be output to the console in a following JSON format: + +``` +[ + {transaction_id: "TRANSACTION_ID", content: "BASE64_ENCODED_SIGNED_TRANSACTION"}, +] +``` + +On the other hand, when `--output` option is specified, the signed transaction(s) will be stored to a file as a message pack encoded binary file. + +### Encoding transactins for signing + +Algorand provides a set of options in [py-algorand-sdk](https://github.com/algorand/py-algorand-sdk) and [js-algorand-sdk](https://github.com/algorand/js-algorand-sdk) to encode transactions for signing. + +Encoding simple txn object in python: + +```py +# Encoding single transaction as a base64 encoded string +algosdk.encoding.msgpack_encode({"txn": {YOUR_TXN_OBJECT}.dictify()}) # Resulting string can be passed directy to algokit task sign with --transaction flag + +# Encoding multiple transactions as a message pack encoded binary file +algosdk.transaction.write_to_file([{YOUR_TXN_OBJECT}], "some_file.txn") # Resulting file path can be passed directly to algokit sign with --file flag +``` + +Encoding simple txn object in javascript: + +```ts +Buffer.from(algosdk.encodeObj({ txn: txn.get_obj_for_encoding() })).toString( + "base64" +); // Resulting string can be passed directy to algokit task sign with --transaction flag +``` + +## Further Reading + +For in-depth details, visit the [sign section](../../cli-reference.md#sign) in the AlgoKit CLI reference documentation. diff --git a/docs/get-details/algokit/features/tasks/transfer.md b/docs/get-details/algokit/features/tasks/transfer.md new file mode 100644 index 00000000..1a303c3d --- /dev/null +++ b/docs/get-details/algokit/features/tasks/transfer.md @@ -0,0 +1,54 @@ +# AlgoKit Task Transfer + +The AlgoKit Transfer feature allows you to transfer algos and assets between two accounts. + +## Usage + +Available commands and possible usage as follows: + +```bash +$ ~ algokit task transfer +Usage: algokit task transfer [OPTIONS] + +Transfer algos or assets from one account to another. + +Options: + -s, --sender TEXT Address or alias of the sender account [required] + -r, --receiver TEXT Address or alias to an account that will receive the asset(s) [required] + --asset, --id INTEGER ASA asset id to transfer + -a, --amount INTEGER Amount to transfer [required] + --whole-units Use whole units (Algos | ASAs) instead of smallest divisible units (for example, + microAlgos). Disabled by default. + -n, --network [localnet|testnet|mainnet] + Network to use. Refers to `localnet` by default. + -h, --help Show this message and exit. +``` + +> Note: If you use a wallet address for the `sender` argument, you'll be asked for the mnemonic phrase. To use a wallet alias instead, see the [wallet aliasing](wallet.md) task. For wallet aliases, the sender must have a stored `private key`, but the receiver doesn't need one. This is because the sender signs and sends the transfer transaction, while the receiver reference only needs a valid Algorand address. + +## Examples + +### Transfer algo between accounts on LocalNet + +```bash +$ ~ algokit task transfer -s {SENDER_ALIAS OR SENDER_ADDRESS} -r {RECEIVER_ALIAS OR RECEIVER_ADDRESS} -a {AMOUNT} +``` + +By default: + +- the `amount` is in microAlgos. To use whole units, use the `--whole-units` flag. +- the `network` is `localnet`. + +### Transfer asset between accounts on TestNet + +```bash +$ ~ algokit task transfer -s {SENDER_ALIAS OR SENDER_ADDRESS} -r {RECEIVER_ALIAS OR RECEIVER_ADDRESS} -a {AMOUNT} --id {ASSET_ID} --network testnet +``` + +By default: + +- the `amount` is smallest divisible unit of supplied `ASSET_ID`. To use whole units, use the `--whole-units` flag. + +## Further Reading + +For in-depth details, visit the [transfer section](../../cli-reference.md#transfer) in the AlgoKit CLI reference documentation. diff --git a/docs/get-details/algokit/features/tasks/vanity_address.md b/docs/get-details/algokit/features/tasks/vanity_address.md new file mode 100644 index 00000000..4dc00d4d --- /dev/null +++ b/docs/get-details/algokit/features/tasks/vanity_address.md @@ -0,0 +1,56 @@ +# AlgoKit Task Vanity Address + +The AlgoKit Vanity Address feature allows you to generate a vanity Algorand address. A vanity address is an address that contains a specific keyword in it. The keyword can only include uppercase letters A-Z and numbers 2-7. The longer the keyword, the longer it may take to generate a matching address. + +## Usage + +Available commands and possible usage as follows: + +```bash +$ ~ algokit task vanity-address +Usage: algokit task vanity-address [OPTIONS] KEYWORD + + Generate a vanity Algorand address. Your KEYWORD can only include letters A - Z and numbers 2 - 7. Keeping your + KEYWORD under 5 characters will usually result in faster generation. Note: The longer the KEYWORD, the longer it may + take to generate a matching address. Please be patient if you choose a long keyword. + +Options: + -m, --match [start|anywhere|end] + Location where the keyword will be included. Default is start. + -o, --output [stdout|alias|file] + How the output will be presented. + -a, --alias TEXT Alias for the address. Required if output is "alias". + --file-path PATH File path where to dump the output. Required if output is "file". + -f, --force Allow overwriting an aliases without confirmation, if output option is 'alias'. + -h, --help Show this message and exit. +``` + +## Examples + +Generate a vanity address with the keyword "ALGO" at the start of the address with default output to `stdout`: + +```bash +$ ~ algokit task vanity-address ALGO +``` + +Generate a vanity address with the keyword "ALGO" at the start of the address with output to a file: + +```bash +$ ~ algokit task vanity-address ALGO -o file -f vanity-address.txt +``` + +Generate a vanity address with the keyword "ALGO" anywhere in the address with output to a file: + +```bash +$ ~ algokit task vanity-address ALGO -m anywhere -o file -f vanity-address.txt +``` + +Generate a vanity address with the keyword "ALGO" at the start of the address and store into a [wallet alias](wallet.md): + +```bash +$ ~ algokit task vanity-address ALGO -o alias -a my-vanity-address +``` + +## Further Reading + +For in-depth details, visit the [vanity-address section](../../cli-reference.md#vanity-address) in the AlgoKit CLI reference documentation. diff --git a/docs/get-details/algokit/features/tasks/wallet.md b/docs/get-details/algokit/features/tasks/wallet.md new file mode 100644 index 00000000..ef951512 --- /dev/null +++ b/docs/get-details/algokit/features/tasks/wallet.md @@ -0,0 +1,93 @@ +# AlgoKit Task Wallet + +Manage your Algorand addresses and accounts effortlessly with the AlgoKit Wallet feature. This feature allows you to create short aliases for your addresses and accounts on AlgoKit CLI. + +## Usage + +Available commands and possible usage as follows: + +```bash +$ ~ algokit task wallet +Usage: algokit task wallet [OPTIONS] COMMAND [ARGS]... + +Create short aliases for your addresses and accounts on AlgoKit CLI. + +Options: +-h, --help Show this message and exit. + +Commands: +add Add an address or account to be stored against a named alias. +get Get an address or account stored against a named alias. +list List all addresses and accounts stored against a named alias. +remove Remove an address or account stored against a named alias. +reset Remove all aliases. +``` + +## Commands + +### Add + +This command adds an address or account to be stored against a named alias. If the `--mnemonic` flag is used, it will prompt the user for a mnemonic phrase interactively using masked input. If the `--force` flag is used, it will allow overwriting an existing alias. Maximum number of aliases that can be stored at a time is 50. + +```bash +$ algokit wallet add [OPTIONS] ALIAS_NAME +``` + +> Please note, the command is not designed to be used in CI scope, there is no option to skip interactive masked input of the mnemonic, if you want to alias an `Account` (both private and public key) entity. + +#### Options + +- `--address, -a TEXT`: Specifies the address of the account. This option is required. +- `--mnemonic, -m`: If specified, it prompts the user for a mnemonic phrase interactively using masked input. +- `--force, -f`: If specified, it allows overwriting an existing alias without interactive confirmation prompt. + +### Get + +This command retrieves an address or account stored against a named alias. + +```bash +$ algokit wallet get ALIAS +``` + +### List + +This command lists all addresses and accounts stored against a named alias. If a record contains a `private_key` it will show a boolean flag indicating whether it exists, actual private key values are never exposed. As a user you can obtain the content of the stored aliases by navigating to your dedicated password manager (see [keyring details](https://pypi.org/project/keyring/)). + +```bash +$ algokit wallet list +``` + +### Remove + +This command removes an address or account stored against a named alias. +You must confirm the prompt interactively or pass `--force` | `-f` flag to ignore the prompt. + +```bash +$ algokit wallet remove ALIAS [--force | -f] +``` + +### Reset + +This command removes all aliases. You must confirm the prompt interactively or pass `--force` | `-f` flag to ignore the prompt. + +```bash +$ algokit wallet reset [--force | -f] +``` + +## Keyring + +AlgoKit relies on the [keyring](https://pypi.org/project/keyring/) library, which provides an easy way to interact with the operating system's password manager. This abstraction allows AlgoKit to securely manage sensitive information such as mnemonics and private keys. + +When you use AlgoKit to store a mnemonic, it is never printed or exposed directly in the console. Instead, the mnemonic is converted and stored as a private key in the password manager. This ensures that your sensitive information is kept secure. + +To retrieve the stored mnemonic, you will need to manually navigate to your operating system's password manager. The keyring library supports a variety of password managers across different operating systems. Here are some examples: + +- On macOS, it uses the Keychain Access app. +- On Windows, it uses the Credential Manager. +- On Linux, it can use Secret Service API, KWallet, or an in-memory store depending on your setup. + +> Remember, AlgoKit is designed to keep your sensitive information secure however your storage is only as secure as the device on which it is stored. Always ensure to maintain good security practices on your device, especially when dealing with mnemonics that are to be used on MainNet. + +## Further Reading + +For in-depth details, visit the [wallet section](../../cli-reference.md#wallet) in the AlgoKit CLI reference documentation. diff --git a/docs/get-details/algokit/index.md b/docs/get-details/algokit/index.md index 6c2db772..e16902d8 100644 --- a/docs/get-details/algokit/index.md +++ b/docs/get-details/algokit/index.md @@ -1,22 +1,8 @@ title: Overview -The Algorand AlgoKit CLI is the one-stop shop tool for developers building on the Algorand network. The goal of AlgoKit is to help developers build and launch secure, automated production-ready applications rapidly. AlgoKit contains these components: +The Algorand AlgoKit CLI is the one-stop shop tool for developers building on the Algorand network. The goal of AlgoKit is to help developers build and launch secure, automated production-ready applications rapidly. -- Smart contract templates - kickstart your dApp by selecting from our template library -- Web3 infrastructure - all the network, database, wallet, block explorer and APIs running locally -- Toolchain integrations - for languages you love: TypeScript and Python -- React component generation - frontend design simplified using components generated for each contract method call - -## AlgoKit Tutorials - -The following tutorials guide you through various scenarios: - -- [AlgoKit quick start](./tutorials/intro.md) -- [Creating AlgoKit templates](./tutorials/algokit-template.md) - - - -## AlgoKit Features +## AlgoKit CLI commands For details on how to use individual features see the following @@ -24,12 +10,32 @@ For details on how to use individual features see the following - [Completions](./features/completions.md) - Install shell completions for AlgoKit - [Deploy](./features/deploy.md) - Deploy your smart contracts effortlessly to various networks - [Dispenser](./features/dispenser.md) - interactive TestNet Dispenser for receiveing TestALGO +- [Dispenser](./features/dispenser.md) - Fund your TestNet account with ALGOs from the AlgoKit TestNet Dispenser - [Doctor](./features/doctor.md) - Check AlgoKit installation and dependencies - [Explore](./features/explore.md) - Explore Algorand Blockchains using Dappflow - [Generate](./features/generate.md) - Generate code for an Algorand project - [Goal](./features/goal.md) - Run the Algorand goal CLI against the AlgoKit Sandbox -- [Init](./features/init.md) - Quickly initialize new projects using official Algorand Templates or community provided templates. -- [LocalNet](./features/localnet.md) - Manage a locally sandboxed private Algorand network. +- [Init](./features/init.md) - Quickly initialize new projects using official Algorand Templates or community provided templates +- [LocalNet](./features/localnet.md) - Manage a locally sandboxed private Algorand network +- [Tasks](./features/tasks.md) - Perform a variety of useful operations on Algorand blockchain + +## Common AlgoKit CLI options + +AlgoKit has a number of global options that can impact all commands. Note: these global options must be appended to `algokit` and appear before a command, e.g. `algokit -v localnet start`, but not `algokit localnet start -v`. The exception to this is `-h`, which can be appended to any command or sub-command to see contextual help information. + +- `-h, --help` The help option can be used on any command to get details on any command, its sub-commands and options. +- `-v, --verbose` Enables DEBUG logging, useful when troubleshooting or if you want to peek under the covers and learn what AlgoKit CLI is doing. +- `--color / --no-color` Enables or disables output of console styling, we also support the [NO_COLOR](https://no-color.org) environment variable. +- `--skip-version-check` Skips updated AlgoKit version checking and prompting for that execution, this can also be disabled [permanently on a given machine](./cli-reference.md#version-prompt) with `algokit config version-prompt disable`. + +See also the [AlgoKit CLI Reference](./cli-reference.md), which details every command, sub-command and option. + +## AlgoKit Tutorials + +The following tutorials guide you through various scenarios: + +- [AlgoKit quick start](./tutorials/intro.md) +- [Creating AlgoKit templates](./tutorials/algokit-template.md) ## Guiding Principles @@ -43,14 +49,3 @@ Algorand AlgoKit is guided by the following solution principles which flow throu 6. **Extensible**: Be extensible for community contribution rather than stifling innovation, bottle-necking all changes through the Algorand Foundation and preventing the opportunity for other ecosystems being represented (e.g. Go, Rust, etc.). This helps make developers feel welcome and is part of the developer experience, plus it makes it easier to add features sustainably. 7. **Meet developers where they are**: Make Blockchain development mainstream by giving all developers an idiomatic development experience in the operating system, IDE and language they are comfortable with so they can dive in quickly and have less they need to learn before being productive. 8. **Modular components**: Solution components should be modular and loosely coupled to facilitate efficient parallel development by small, effective teams, reduced architectural complexity and allowing developers to pick and choose the specific tools and capabilities they want to use based on their needs and what they are comfortable with. - -## Common AlgoKit CLI options - -AlgoKit has a number of global options that can impact all commands. Note: these global options must be appended to `algokit` and appear before a command, e.g. `algokit -v localnet start`, but not `algokit localnet start -v`. The exception to this is `-h`, which can be appended to any command or sub-command to see contextual help information. - -- `-h, --help` The help option can be used on any command to get details on any command, its sub-commands and options. -- `-v, --verbose` Enables DEBUG logging, useful when troubleshooting or if you want to peek under the covers and learn what AlgoKit CLI is doing. -- `--color / --no-color` Enables or disables output of console styling, we also support the [NO_COLOR](https://no-color.org) environment variable. -- `--skip-version-check` Skips updated AlgoKit version checking and prompting for that execution, this can also be disabled [permanently on a given machine](./cli-reference.md#version-prompt) with `algokit config version-prompt disable`. - -See also the [AlgoKit CLI Reference](./cli-reference.md), which details every command, sub-command and option. \ No newline at end of file diff --git a/docs/get-details/algokit/tutorials/algokit-template.md b/docs/get-details/algokit/tutorials/algokit-template.md index 712eb4ba..0ba3bcd2 100644 --- a/docs/get-details/algokit/tutorials/algokit-template.md +++ b/docs/get-details/algokit/tutorials/algokit-template.md @@ -126,6 +126,35 @@ When creating an AlgoKit template, there are a few default behaviors that you ca By combining predefined Copier answers with these default behaviors, you can create a smooth, efficient, and intuitive initialization experience for the users of your template. +### Executing Python Tasks in Templates + +If you need to use Python scripts as tasks within your Copier templates, ensure that you have Python installed on the host machine. +By convention, AlgoKit automatically detects the Python installation on your machine and fills in the `python_path` variable accordingly. +This process ensures that any Python scripts included as tasks within your Copier templates will execute using the system's Python interpreter. +It's important to note that the use of `_copier_python` is not recommended. Here's an example of specifying a Python script execution in your `copier.yaml` without needing to explicitly use `_copier_python`: + +```yaml +- "{{ python_path }} your_python_script.py" +``` + +If you'd like your template to be backwards compatible with versions of `algokit-cli` older than `v1.11.3` when executing custom python scripts via `copier` tasks, you can use a conditional statement to determine the Python path: + +```yaml +- "{{ python_path if python_path else _copier_python }} your_python_script.py" +# _copier_python above is used for backwards compatibility with versions < v1.11.3 of the algokit cli +``` + +And to define `python_path` in your Copier questions: + +```yaml +# Auto determined by algokit-cli from v1.11.3 to allow execution of python script +# in binary mode. +python_path: + type: str + help: Path to the sys.executable. + when: false +``` + ### Working with Generators After mastering the use of `copier` and building your templates based on the official AlgoKit template repositories, you can enhance your proficiency by learning to define `custom generators`. Essentially, generators are smaller-scope `copier` templates designed to provide additional functionality after a project has been initialized from the template. diff --git a/docs/get-details/algokit/tutorials/intro.md b/docs/get-details/algokit/tutorials/intro.md index 8786a361..f284eda1 100644 --- a/docs/get-details/algokit/tutorials/intro.md +++ b/docs/get-details/algokit/tutorials/intro.md @@ -1,18 +1,21 @@ -title: AlgoKit Quick Start Guide +title: AlgoKit Quick Start Tutorial -The Algorand AlgoKit CLI is the one-stop shop tool for developers building on the Algorand network. The goal of AlgoKit is to help developers build and launch secure, automated production-ready applications rapidly. AlgoKit contains these components: +AlgoKit is the primary tool used by the Algorand community to develop smart contracts on the Algorand blockchain. It provides the capabilities to develop, test and deploy Algorand smart contracts within minutes! This guide is intended to help you setup AlgoKit and to start developing your application. -- Smart contract templates - kickstart your dApp by selecting from our template library -- Web3 infrastructure - all the network, database, wallet, block explorer and APIs running locally -- Toolchain integrations - for languages you love: TypeScript and Python -- React component generation - frontend design simplified using components generated for each contract method call +## Quick start videos -## 10 minute video walkthrough +If you prefer videos, take a look at this 10 minute guide to getting started. - +[![Learn How to Build on Algorand in 10 Minutes](../imgs/algokit-intro-video-thumbnail.jpg)](https://www.youtube.com/embed/MzBRef_Res8) + +Detailed video guides for both [Windows](https://www.youtube.com/embed/22RvINnZsRo) and [Mac](https://www.youtube.com/embed/zsurtpCGmgE) are also available. ## Prerequisites +This guide presents installing AlgoKit using an OS agnostic procedure. For OS specific instructions take a look at the [quick start videos](#quick-start-videos) above. + +Using this procedure requires the the following components be installed already + - [Python 3.10](https://www.python.org/downloads/) or higher - [PipX](https://pypa.github.io/pipx/#on-linux-install-via-pip-requires-pip-190-or-later) - [Git](https://github.com/git-guides/install-git#install-git) @@ -21,76 +24,15 @@ The Algorand AlgoKit CLI is the one-stop shop tool for developers building on th ## Install AlgoKit -=== "Windows" - !!! Note - This method will install the most recent python3 version [via winget](https://learn.microsoft.com/en-us/windows/package-manager/winget/). If you already have python 3.10+ installed, you may you may prefer to use `pipx install algokit` as explained within the pipx on any OS section so you can control the python version used. - - - Ensure prerequisites are installed - - [Git](https://github.com/git-guides/install-git#install-git-on-windows) (or `winget install git.git`) - - [Docker](https://docs.docker.com/desktop/install/windows-install/) (or `winget install docker.dockerdesktop`) - - !!! Info - See [our LocalNet documentation](https://github.com/algorandfoundation/algokit-cli/blob/main/docs/features/localnet.md#prerequisites) for more tips on installing Docker on Windows - - - Install Python3 using WinGet - - Install python: `winget install python.python.3.11` - - Restart the terminal to ensure Python and pip are available on the path - - !!! Info - Windows has a feature called **App Execution Aliases** that provides redirects for the Python command that guide users to the Windows Store. unfortunately these aliases can prevent normal execution of Python if Python is installed via other means, to disable them search for **Manage app execution aliases** from the start menu, and then turn off entries listed as **App Installer python.exe** or **App Installer python3.exe**. - - - Install pipx: - ``` - pip install --user pipx - python -m pipx ensurepath - ``` - - Restart the terminal to ensure pipx is available on the path - - Install AlgoKit via pipx: `pipx install algokit` - - Restart the terminal to ensure AlgoKit is available on the path - - - -=== "macOS" - !!! Note - This method will install the latest Python3 release as a dependency via Homebrew. If you already have Python 3.10+ installed, you may prefer to use `pipx install algokit` as explained within the OS agnostic tab so you can control the python version used. - - - Ensure prerequisites are installed - - - [Homebrew](https://docs.brew.sh/Installation) - - [Git](https://github.com/git-guides/install-git#install-git-on-mac) (should already be available if `brew` is installed) - - [Docker](https://docs.docker.com/desktop/install/mac-install/), (or `brew install --cask docker`) - - !!! Info - Docker requires MacOS 11+ - - - Install using Homebrew `brew install algorandfoundation/tap/algokit` - - Restart the terminal to ensure AlgoKit is available on the path +To install AlgoKit, run the following command from a terminal. - - -=== "Linux" - - Ensure prerequisites are installed - - - [Python 3.10+](https://www.python.org/downloads/) - - !!! Info - There is probably a better way to install Python than to download it directly, e.g. your local Linux package manager - - - [pipx](https://pypa.github.io/pipx/#on-linux-install-via-pip-requires-pip-190-or-later) - - [Git](https://github.com/git-guides/install-git#install-git-on-linux) - - [Docker](https://docs.docker.com/desktop/install/linux-install/) - - Continue with step 2 in the following section to install via `pipx` on any OS - -=== "OS agnostic" - To install AlgoKit, run the following command from a terminal. - - ```shell - pipx install algokit - ``` +```shell +pipx install algokit +``` - After the installation completes, **restart the terminal**. +After the installation completes, **restart the terminal**. -Additional AlgoKit videos are available on the [@AlgoDevs YouTube channel](https://youtube.com/@AlgoDevs). +For more detailed installation documentation, see the [quick start videos](#quick-start-videos). ## Verify the Installation @@ -103,7 +45,7 @@ algokit --version Output similar to the following should be displayed: ```shell -algokit, version 1.5.0 +algokit, version 0.5.0 ``` ## Start a LocalNet @@ -114,9 +56,9 @@ AlgoKit supports using a [local version of the Algorand blockchain](../features/ algokit localnet start ``` -This should start an instance of the LocalNet within docker. If you open the Docker Desktop application you should something similar to the following: +This should start an instance of the LocalNet within docker. If you open the Docker Desktop application you should see something similar to the following: -![Docker Desktop LocalNet Instance](../../../imgs/localnet.png) +![Docker Desktop LocalNet Instance](../imgs/localnet.png) ## Create an AlgoKit project @@ -126,19 +68,25 @@ Now that AlgoKit is installed, you can rapidly create a new project to get start algokit init ``` -This will launch a guided menu system to create a specific project tailored to your needs. You will first be prompted to select a specific template. The templates are basic starter applications for various Algorand development scenarios. To read more about templates checkout AlgoKit detailed documentation. For now, use the arrow keys to select the `playground` template, which is a lightweight starting point for learning and experimentation. +This will launch a guided menu system to create a specific project tailored to your needs. The templates are basic starter applications for various Algorand development scenarios. To read more about templates checkout AlgoKit detailed documentation. + +For now we'll use the `playground` template, which is a lightweight starting point for learning and experimentation. You can initialise a project using this template by running: + +```shell +algokit init -t playground --no-workspace +``` Next, you will be prompted for the name of your project. Finally, select the default value for the rest of the prompts (enter). Once finished, (if you have it installed) VS Code should automatically be opened with the initialised project and you will be prompted to install appropriate VS Code extensions. This starter app will contain one smart contract (built using the [Beaker](https://beaker.algo.xyz/) smart contract development framework) named `helloworld.py`, in the `hello_world` folder, with one method (`hello`) that takes a `String` and returns a `String`. -![AlgoKit Playground Contract](../../../imgs/algokitplayground.png) +![AlgoKit Playground Contract](../imgs/algokitplayground.png) ## Run the Demo Application Once the playground project is created, you will notice in the `hello_world` folder a file named `demo.py` which is a simple example of using AlgoKit to deploy and make a call to the `helloworld.py` smart contract on the LocalNet instance started earlier. -![AlgoKit Playground Demo](../../../imgs/algokitdemo.png) +![AlgoKit Playground Demo](../imgs/algokitdemo.png) Right clicking on this file and selecting `Run Python File in Terminal` will deploy the `HelloWorldApp` smart contract and then call it passing the parameter `name` with a value of `Beaker`. Alternatively, you can hit F5 (or whatever keyboard shortcut is set in VS Code for running the debugger) while you are viewing the `helloworld.py` file and it will: @@ -164,7 +112,7 @@ At this point you have deployed a simple contract to an Algorand network and cal Additionally, you can find the native TEAL smart contract code and the appropriate smart contract manifest JSON files have been output to the `artifacts` folder. -![AlgoKit Playground Demo](../../../imgs/algokitartifacts.png) +![AlgoKit Playground Demo](../imgs/algokitartifacts.png) Running the `build.py` python file will also generate these artifacts without deploying. These files can be used by tools like [Dappflow](https://dappflow.org/), [goal](https://developer.algorand.org/docs/clis/goal/goal/), etc. to deploy your smart contract to the various Algorand networks. @@ -184,7 +132,7 @@ This command will launch your default web browser and load the Dappflow web appl **Note:** If you are using Safari, then it won't work against LocalNet and you will need to open it in a different browser. -![AlgoKit Dappflow](../../../imgs/dappflow1.png) +![AlgoKit Dappflow](../imgs/dappflow1.png) ### Create test account @@ -192,7 +140,7 @@ To issue commands against the LocalNet network you need an account with ALGOs in Select `Dev Wallets` from the left menu and click on the `Create wallet` button. This will create an account on the LocalNet and fund it with 100 Algos that can be used to test with. -![AlgoKit Dappflow](../../../imgs/dappflow2.png) +![AlgoKit Dappflow](../imgs/dappflow2.png) In the bottom left hand corner of the menu, select `Connect wallet` and you will be prompted with several wallet choices. Choose the `Dev Wallet` option. This will connect the account you just created to Dappflow so you can use that account for signing transactions from the Dappflow user interface. @@ -200,19 +148,19 @@ In the bottom left hand corner of the menu, select `Connect wallet` and you will To deploy the built Beaker smart contract application, select the `Beaker studio` menu and click on the import beaker app. Select `File` and `Upload file`, browse to the artifacts created in the previous section of this guide. Select the `application.json` manifest file. This will load the specific manifest file for the Hello World sample application. -![AlgoKit Dappflow](../../../imgs/dappflow3.png) +![AlgoKit Dappflow](../imgs/dappflow3.png) To deploy this application again, select the `Create app` button followed by the `Create` button from the popup. You should get a `Transaction successful` message with the option to view the specific transaction in the explorer. Close out of the popup and then scroll down to the `ABI` section of the page. The `hello` method should be displayed with an execute button beside it. -![AlgoKit Dappflow](../../../imgs/dappflow4.png) +![AlgoKit Dappflow](../imgs/dappflow4.png) Click on the Execute button and a popup will be displayed allowing you to enter the parameter that we defined in the `HelloWorldApp` smart contract. -![AlgoKit Dappflow](../../../imgs/dappflow5.png) +![AlgoKit Dappflow](../imgs/dappflow5.png) Enter a string in the parameter and click on `Execute`. You should get get a confirmation that the method executed properly and what the smart contract returned. -![AlgoKit Dappflow](../../../imgs/dappflow6.png) +![AlgoKit Dappflow](../imgs/dappflow6.png) You have now successfully deployed and executed a smart contract method call using Dappflow! diff --git a/docs/get-details/algokit/utils/ts/client_generator.md b/docs/get-details/algokit/utils/ts/client_generator.md index f840e0ee..b27db1bf 100644 --- a/docs/get-details/algokit/utils/ts/client_generator.md +++ b/docs/get-details/algokit/utils/ts/client_generator.md @@ -20,6 +20,30 @@ The cli can be used to generate a client via the following command. npx --yes @algorandfoundation/algokit-client-generator generate -a ./application.json -o ./client.generated.ts ``` +Alternatively, a client can be generated from code by invoking the `generate` function paired with either `writeDocumentPartsToString` or `writeDocumentPartsToStream` depending on your needs. We also expose helpers to optionally load and validate an application.json file. + +```ts +import fs from 'fs' +import { + writeDocumentPartsToStream, + writeDocumentPartsToString, + generate, + loadApplicationJson, + validateApplicationJson, +} from '@algorandfoundation/algokit-client-generator' +import appJson from './application.json' + +const appJsonFromFile = loadApplicationJson('./application.json') +const appJsonFromObject = validateApplicationJson(appJson) + +const fileStream = fs.createWriteStream('./client.ts', { + flags: 'w', +}) +writeDocumentPartsToStream(generate(appJsonFromFile, fileStream)) + +const clientAsString = writeDocumentPartsToString(appJsonFromObject) +``` + For details on how to use the generated client see the more detailed [usage docs](../) ## Examples @@ -71,6 +95,8 @@ poetry run python -m examples Or in Visual Studio Code you can use the default build task (Ctrl+Shift+B). +To regenerate the generated clients run `npm run update-approvals`. + ### Continuous Integration / Continuous Deployment (CI/CD) This project uses [GitHub Actions](https://docs.github.com/en/actions/learn-github-actions/understanding-github-actions) to define CI/CD workflows, which are located in the [`.github/workflows`](./.github/workflows) folder. diff --git a/docs/get-details/algokit/utils/ts/code/classes/types_account.MultisigAccount.md b/docs/get-details/algokit/utils/ts/code/classes/types_account.MultisigAccount.md index 6e439f95..d2261b0e 100644 --- a/docs/get-details/algokit/utils/ts/code/classes/types_account.MultisigAccount.md +++ b/docs/get-details/algokit/utils/ts/code/classes/types_account.MultisigAccount.md @@ -165,7 +165,7 @@ Sign the given transaction | Name | Type | Description | | :------ | :------ | :------ | -| `transaction` | `Uint8Array` \| `Transaction` | Either a transaction object or a raw, partially signed transaction | +| `transaction` | `Transaction` \| `Uint8Array` | Either a transaction object or a raw, partially signed transaction | #### Returns diff --git a/docs/get-details/algokit/utils/ts/code/classes/types_config.UpdatableConfig.md b/docs/get-details/algokit/utils/ts/code/classes/types_config.UpdatableConfig.md index 53a22e8a..77d5ed4c 100644 --- a/docs/get-details/algokit/utils/ts/code/classes/types_config.UpdatableConfig.md +++ b/docs/get-details/algokit/utils/ts/code/classes/types_config.UpdatableConfig.md @@ -25,6 +25,7 @@ Updatable AlgoKit config - [debug](types_config.UpdatableConfig.md#debug) - [logger](types_config.UpdatableConfig.md#logger) - [maxSearchDepth](types_config.UpdatableConfig.md#maxsearchdepth) +- [populateAppCallResources](types_config.UpdatableConfig.md#populateappcallresources) - [projectRoot](types_config.UpdatableConfig.md#projectroot) - [traceAll](types_config.UpdatableConfig.md#traceall) - [traceBufferSizeMb](types_config.UpdatableConfig.md#tracebuffersizemb) @@ -48,7 +49,7 @@ Updatable AlgoKit config #### Defined in -[src/types/config.ts:76](https://github.com/algorandfoundation/algokit-utils-ts/blob/main/src/types/config.ts#L76) +[src/types/config.ts:88](https://github.com/algorandfoundation/algokit-utils-ts/blob/main/src/types/config.ts#L88) ## Properties @@ -58,7 +59,7 @@ Updatable AlgoKit config #### Defined in -[src/types/config.ts:23](https://github.com/algorandfoundation/algokit-utils-ts/blob/main/src/types/config.ts#L23) +[src/types/config.ts:31](https://github.com/algorandfoundation/algokit-utils-ts/blob/main/src/types/config.ts#L31) ## Accessors @@ -76,7 +77,7 @@ Readonly.debug #### Defined in -[src/types/config.ts:29](https://github.com/algorandfoundation/algokit-utils-ts/blob/main/src/types/config.ts#L29) +[src/types/config.ts:41](https://github.com/algorandfoundation/algokit-utils-ts/blob/main/src/types/config.ts#L41) ___ @@ -94,7 +95,7 @@ Readonly.logger #### Defined in -[src/types/config.ts:25](https://github.com/algorandfoundation/algokit-utils-ts/blob/main/src/types/config.ts#L25) +[src/types/config.ts:37](https://github.com/algorandfoundation/algokit-utils-ts/blob/main/src/types/config.ts#L37) ___ @@ -112,7 +113,25 @@ Readonly.maxSearchDepth #### Defined in -[src/types/config.ts:45](https://github.com/algorandfoundation/algokit-utils-ts/blob/main/src/types/config.ts#L45) +[src/types/config.ts:57](https://github.com/algorandfoundation/algokit-utils-ts/blob/main/src/types/config.ts#L57) + +___ + +### populateAppCallResources + +• `get` **populateAppCallResources**(): `boolean` + +#### Returns + +`boolean` + +#### Implementation of + +Readonly.populateAppCallResources + +#### Defined in + +[src/types/config.ts:33](https://github.com/algorandfoundation/algokit-utils-ts/blob/main/src/types/config.ts#L33) ___ @@ -130,7 +149,7 @@ Readonly.projectRoot #### Defined in -[src/types/config.ts:33](https://github.com/algorandfoundation/algokit-utils-ts/blob/main/src/types/config.ts#L33) +[src/types/config.ts:45](https://github.com/algorandfoundation/algokit-utils-ts/blob/main/src/types/config.ts#L45) ___ @@ -148,7 +167,7 @@ Readonly.traceAll #### Defined in -[src/types/config.ts:37](https://github.com/algorandfoundation/algokit-utils-ts/blob/main/src/types/config.ts#L37) +[src/types/config.ts:49](https://github.com/algorandfoundation/algokit-utils-ts/blob/main/src/types/config.ts#L49) ___ @@ -166,7 +185,7 @@ Readonly.traceBufferSizeMb #### Defined in -[src/types/config.ts:41](https://github.com/algorandfoundation/algokit-utils-ts/blob/main/src/types/config.ts#L41) +[src/types/config.ts:53](https://github.com/algorandfoundation/algokit-utils-ts/blob/main/src/types/config.ts#L53) ## Methods @@ -188,23 +207,24 @@ Update the AlgoKit configuration with your own configuration settings #### Defined in -[src/types/config.ts:106](https://github.com/algorandfoundation/algokit-utils-ts/blob/main/src/types/config.ts#L106) +[src/types/config.ts:135](https://github.com/algorandfoundation/algokit-utils-ts/blob/main/src/types/config.ts#L135) ___ ### configureProjectRoot -▸ **configureProjectRoot**(): `void` +▸ **configureProjectRoot**(): `Promise`\<`void`\> Configures the project root by searching for a specific file within a depth limit. +This is only supported in a Node environment. #### Returns -`void` +`Promise`\<`void`\> #### Defined in -[src/types/config.ts:91](https://github.com/algorandfoundation/algokit-utils-ts/blob/main/src/types/config.ts#L91) +[src/types/config.ts:108](https://github.com/algorandfoundation/algokit-utils-ts/blob/main/src/types/config.ts#L108) ___ @@ -228,7 +248,7 @@ The requested logger #### Defined in -[src/types/config.ts:54](https://github.com/algorandfoundation/algokit-utils-ts/blob/main/src/types/config.ts#L54) +[src/types/config.ts:66](https://github.com/algorandfoundation/algokit-utils-ts/blob/main/src/types/config.ts#L66) ___ @@ -250,4 +270,4 @@ Temporarily run with debug set to true. #### Defined in -[src/types/config.ts:66](https://github.com/algorandfoundation/algokit-utils-ts/blob/main/src/types/config.ts#L66) +[src/types/config.ts:78](https://github.com/algorandfoundation/algokit-utils-ts/blob/main/src/types/config.ts#L78) diff --git a/docs/get-details/algokit/utils/ts/code/classes/types_debugging.AVMDebuggerSourceMap.md b/docs/get-details/algokit/utils/ts/code/classes/types_debugging.AVMDebuggerSourceMap.md index 902a3049..4198ac5e 100644 --- a/docs/get-details/algokit/utils/ts/code/classes/types_debugging.AVMDebuggerSourceMap.md +++ b/docs/get-details/algokit/utils/ts/code/classes/types_debugging.AVMDebuggerSourceMap.md @@ -4,6 +4,8 @@ [types/debugging](../modules/types_debugging.md).AVMDebuggerSourceMap +AVM debugger source map class. + ## Table of contents ### Constructors @@ -37,7 +39,7 @@ #### Defined in -[src/types/debugging.ts:29](https://github.com/algorandfoundation/algokit-utils-ts/blob/main/src/types/debugging.ts#L29) +[src/types/debugging.ts:47](https://github.com/algorandfoundation/algokit-utils-ts/blob/main/src/types/debugging.ts#L47) ## Properties @@ -47,7 +49,7 @@ #### Defined in -[src/types/debugging.ts:27](https://github.com/algorandfoundation/algokit-utils-ts/blob/main/src/types/debugging.ts#L27) +[src/types/debugging.ts:41](https://github.com/algorandfoundation/algokit-utils-ts/blob/main/src/types/debugging.ts#L41) ## Methods @@ -55,13 +57,17 @@ ▸ **toDict**(): [`AVMDebuggerSourceMapDict`](../interfaces/types_debugging.AVMDebuggerSourceMapDict.md) +Converts the source map to a dictionary that can be passed around and then parsed back using `AVMDebuggerSourceMap.fromDict`. + #### Returns [`AVMDebuggerSourceMapDict`](../interfaces/types_debugging.AVMDebuggerSourceMapDict.md) +The dictionary + #### Defined in -[src/types/debugging.ts:39](https://github.com/algorandfoundation/algokit-utils-ts/blob/main/src/types/debugging.ts#L39) +[src/types/debugging.ts:66](https://github.com/algorandfoundation/algokit-utils-ts/blob/main/src/types/debugging.ts#L66) ___ @@ -69,16 +75,20 @@ ___ ▸ **fromDict**(`data`): [`AVMDebuggerSourceMap`](types_debugging.AVMDebuggerSourceMap.md) +Creates a source map from a dictionary of source map data. + #### Parameters -| Name | Type | -| :------ | :------ | -| `data` | [`AVMDebuggerSourceMapDict`](../interfaces/types_debugging.AVMDebuggerSourceMapDict.md) | +| Name | Type | Description | +| :------ | :------ | :------ | +| `data` | [`AVMDebuggerSourceMapDict`](../interfaces/types_debugging.AVMDebuggerSourceMapDict.md) | The data | #### Returns [`AVMDebuggerSourceMap`](types_debugging.AVMDebuggerSourceMap.md) +The source map + #### Defined in -[src/types/debugging.ts:33](https://github.com/algorandfoundation/algokit-utils-ts/blob/main/src/types/debugging.ts#L33) +[src/types/debugging.ts:56](https://github.com/algorandfoundation/algokit-utils-ts/blob/main/src/types/debugging.ts#L56) diff --git a/docs/get-details/algokit/utils/ts/code/classes/types_debugging.AVMDebuggerSourceMapEntry.md b/docs/get-details/algokit/utils/ts/code/classes/types_debugging.AVMDebuggerSourceMapEntry.md index 158570e0..031c7e44 100644 --- a/docs/get-details/algokit/utils/ts/code/classes/types_debugging.AVMDebuggerSourceMapEntry.md +++ b/docs/get-details/algokit/utils/ts/code/classes/types_debugging.AVMDebuggerSourceMapEntry.md @@ -4,6 +4,8 @@ [types/debugging](../modules/types_debugging.md).AVMDebuggerSourceMapEntry +AVM debugger source map entry class. + ## Table of contents ### Constructors @@ -26,12 +28,14 @@ • **new AVMDebuggerSourceMapEntry**(`location`, `programHash`): [`AVMDebuggerSourceMapEntry`](types_debugging.AVMDebuggerSourceMapEntry.md) +Create an AVM debugger source map entry. + #### Parameters -| Name | Type | -| :------ | :------ | -| `location` | `string` | -| `programHash` | `string` | +| Name | Type | Description | +| :------ | :------ | :------ | +| `location` | `string` | The location of the file the source map is for. | +| `programHash` | `string` | The hash of the TEAL binary. | #### Returns @@ -39,7 +43,7 @@ #### Defined in -[src/types/debugging.ts:12](https://github.com/algorandfoundation/algokit-utils-ts/blob/main/src/types/debugging.ts#L12) +[src/types/debugging.ts:23](https://github.com/algorandfoundation/algokit-utils-ts/blob/main/src/types/debugging.ts#L23) ## Properties @@ -47,9 +51,11 @@ • **location**: `string` +The location of the file the source map is for. + #### Defined in -[src/types/debugging.ts:13](https://github.com/algorandfoundation/algokit-utils-ts/blob/main/src/types/debugging.ts#L13) +[src/types/debugging.ts:24](https://github.com/algorandfoundation/algokit-utils-ts/blob/main/src/types/debugging.ts#L24) ___ @@ -57,9 +63,11 @@ ___ • **programHash**: `string` +The hash of the TEAL binary. + #### Defined in -[src/types/debugging.ts:14](https://github.com/algorandfoundation/algokit-utils-ts/blob/main/src/types/debugging.ts#L14) +[src/types/debugging.ts:25](https://github.com/algorandfoundation/algokit-utils-ts/blob/main/src/types/debugging.ts#L25) ## Methods @@ -79,7 +87,7 @@ ___ #### Defined in -[src/types/debugging.ts:17](https://github.com/algorandfoundation/algokit-utils-ts/blob/main/src/types/debugging.ts#L17) +[src/types/debugging.ts:28](https://github.com/algorandfoundation/algokit-utils-ts/blob/main/src/types/debugging.ts#L28) ___ @@ -93,4 +101,4 @@ ___ #### Defined in -[src/types/debugging.ts:21](https://github.com/algorandfoundation/algokit-utils-ts/blob/main/src/types/debugging.ts#L21) +[src/types/debugging.ts:32](https://github.com/algorandfoundation/algokit-utils-ts/blob/main/src/types/debugging.ts#L32) diff --git a/docs/get-details/algokit/utils/ts/code/classes/types_debugging.PersistSourceMapInput.md b/docs/get-details/algokit/utils/ts/code/classes/types_debugging.PersistSourceMapInput.md index d57b761a..83f3dbc5 100644 --- a/docs/get-details/algokit/utils/ts/code/classes/types_debugging.PersistSourceMapInput.md +++ b/docs/get-details/algokit/utils/ts/code/classes/types_debugging.PersistSourceMapInput.md @@ -53,7 +53,7 @@ Note: rawTeal and compiledTeal are mutually exclusive. Only one of them should b #### Defined in -[src/types/debugging.ts:55](https://github.com/algorandfoundation/algokit-utils-ts/blob/main/src/types/debugging.ts#L55) +[src/types/debugging.ts:82](https://github.com/algorandfoundation/algokit-utils-ts/blob/main/src/types/debugging.ts#L82) ## Properties @@ -63,7 +63,7 @@ Note: rawTeal and compiledTeal are mutually exclusive. Only one of them should b #### Defined in -[src/types/debugging.ts:52](https://github.com/algorandfoundation/algokit-utils-ts/blob/main/src/types/debugging.ts#L52) +[src/types/debugging.ts:79](https://github.com/algorandfoundation/algokit-utils-ts/blob/main/src/types/debugging.ts#L79) ___ @@ -73,7 +73,7 @@ ___ #### Defined in -[src/types/debugging.ts:53](https://github.com/algorandfoundation/algokit-utils-ts/blob/main/src/types/debugging.ts#L53) +[src/types/debugging.ts:80](https://github.com/algorandfoundation/algokit-utils-ts/blob/main/src/types/debugging.ts#L80) ___ @@ -83,7 +83,7 @@ ___ #### Defined in -[src/types/debugging.ts:50](https://github.com/algorandfoundation/algokit-utils-ts/blob/main/src/types/debugging.ts#L50) +[src/types/debugging.ts:77](https://github.com/algorandfoundation/algokit-utils-ts/blob/main/src/types/debugging.ts#L77) ___ @@ -93,7 +93,7 @@ ___ #### Defined in -[src/types/debugging.ts:51](https://github.com/algorandfoundation/algokit-utils-ts/blob/main/src/types/debugging.ts#L51) +[src/types/debugging.ts:78](https://github.com/algorandfoundation/algokit-utils-ts/blob/main/src/types/debugging.ts#L78) ## Accessors @@ -101,13 +101,15 @@ ___ • `get` **fileName**(): `string` +Get the file name + #### Returns `string` #### Defined in -[src/types/debugging.ts:80](https://github.com/algorandfoundation/algokit-utils-ts/blob/main/src/types/debugging.ts#L80) +[src/types/debugging.ts:123](https://github.com/algorandfoundation/algokit-utils-ts/blob/main/src/types/debugging.ts#L123) ___ @@ -115,13 +117,15 @@ ___ • `get` **rawTeal**(): `string` +Get the underlying raw teal + #### Returns `string` #### Defined in -[src/types/debugging.ts:70](https://github.com/algorandfoundation/algokit-utils-ts/blob/main/src/types/debugging.ts#L70) +[src/types/debugging.ts:112](https://github.com/algorandfoundation/algokit-utils-ts/blob/main/src/types/debugging.ts#L112) ## Methods @@ -145,7 +149,7 @@ The filename without the '.teal' extension. #### Defined in -[src/types/debugging.ts:90](https://github.com/algorandfoundation/algokit-utils-ts/blob/main/src/types/debugging.ts#L90) +[src/types/debugging.ts:133](https://github.com/algorandfoundation/algokit-utils-ts/blob/main/src/types/debugging.ts#L133) ___ @@ -153,21 +157,25 @@ ___ ▸ **fromCompiledTeal**(`compiledTeal`, `appName`, `fileName`): [`PersistSourceMapInput`](types_debugging.PersistSourceMapInput.md) +Returns debugger source maps input from compiled TEAL code. + #### Parameters -| Name | Type | -| :------ | :------ | -| `compiledTeal` | [`CompiledTeal`](../interfaces/types_app.CompiledTeal.md) | -| `appName` | `string` | -| `fileName` | `string` | +| Name | Type | Description | +| :------ | :------ | :------ | +| `compiledTeal` | [`CompiledTeal`](../interfaces/types_app.CompiledTeal.md) | The compiled TEAL code | +| `appName` | `string` | The name of the app | +| `fileName` | `string` | The name of the file to persist to | #### Returns [`PersistSourceMapInput`](types_debugging.PersistSourceMapInput.md) +The persist source map input + #### Defined in -[src/types/debugging.ts:66](https://github.com/algorandfoundation/algokit-utils-ts/blob/main/src/types/debugging.ts#L66) +[src/types/debugging.ts:107](https://github.com/algorandfoundation/algokit-utils-ts/blob/main/src/types/debugging.ts#L107) ___ @@ -175,18 +183,22 @@ ___ ▸ **fromRawTeal**(`rawTeal`, `appName`, `fileName`): [`PersistSourceMapInput`](types_debugging.PersistSourceMapInput.md) +Returns debugger source maps input from raw TEAL code. + #### Parameters -| Name | Type | -| :------ | :------ | -| `rawTeal` | `string` | -| `appName` | `string` | -| `fileName` | `string` | +| Name | Type | Description | +| :------ | :------ | :------ | +| `rawTeal` | `string` | The raw TEAL code | +| `appName` | `string` | The name of the app | +| `fileName` | `string` | The name of the file to persist to | #### Returns [`PersistSourceMapInput`](types_debugging.PersistSourceMapInput.md) +The persist source map input + #### Defined in -[src/types/debugging.ts:62](https://github.com/algorandfoundation/algokit-utils-ts/blob/main/src/types/debugging.ts#L62) +[src/types/debugging.ts:96](https://github.com/algorandfoundation/algokit-utils-ts/blob/main/src/types/debugging.ts#L96) diff --git a/docs/get-details/algokit/utils/ts/code/classes/types_logic_error.LogicError.md b/docs/get-details/algokit/utils/ts/code/classes/types_logic_error.LogicError.md index 234996ed..360fe451 100644 --- a/docs/get-details/algokit/utils/ts/code/classes/types_logic_error.LogicError.md +++ b/docs/get-details/algokit/utils/ts/code/classes/types_logic_error.LogicError.md @@ -95,7 +95,7 @@ Error.message #### Defined in -node_modules/typescript/lib/lib.es5.d.ts:1068 +node_modules/typescript/lib/lib.es5.d.ts:1076 ___ @@ -109,7 +109,7 @@ Error.name #### Defined in -node_modules/typescript/lib/lib.es5.d.ts:1067 +node_modules/typescript/lib/lib.es5.d.ts:1075 ___ @@ -151,6 +151,12 @@ ___ ▪ `Static` `Optional` **prepareStackTrace**: (`err`: `Error`, `stackTraces`: `CallSite`[]) => `any` +Optional override for formatting stack traces + +**`See`** + +https://v8.dev/docs/stack-trace-api#customizing-stack-traces + #### Type declaration ▸ (`err`, `stackTraces`): `any` @@ -231,9 +237,9 @@ Takes an error message and parses out the details of any logic errors in there. #### Parameters -| Name | Type | -| :------ | :------ | -| `error` | `any` | +| Name | Type | Description | +| :------ | :------ | :------ | +| `error` | `any` | The error message to parse | #### Returns diff --git a/docs/get-details/algokit/utils/ts/code/enums/types_indexer.AccountStatus.md b/docs/get-details/algokit/utils/ts/code/enums/types_indexer.AccountStatus.md index 361fff48..00b9adec 100644 --- a/docs/get-details/algokit/utils/ts/code/enums/types_indexer.AccountStatus.md +++ b/docs/get-details/algokit/utils/ts/code/enums/types_indexer.AccountStatus.md @@ -24,7 +24,7 @@ Indicates that the associated account is neither a delegator nor a delegate #### Defined in -[src/types/indexer.ts:594](https://github.com/algorandfoundation/algokit-utils-ts/blob/main/src/types/indexer.ts#L594) +[src/types/indexer.ts:774](https://github.com/algorandfoundation/algokit-utils-ts/blob/main/src/types/indexer.ts#L774) ___ @@ -36,7 +36,7 @@ Indicates that the associated account is delegated #### Defined in -[src/types/indexer.ts:590](https://github.com/algorandfoundation/algokit-utils-ts/blob/main/src/types/indexer.ts#L590) +[src/types/indexer.ts:770](https://github.com/algorandfoundation/algokit-utils-ts/blob/main/src/types/indexer.ts#L770) ___ @@ -48,4 +48,4 @@ Indicates that the associated account used as part of the delegation pool #### Defined in -[src/types/indexer.ts:592](https://github.com/algorandfoundation/algokit-utils-ts/blob/main/src/types/indexer.ts#L592) +[src/types/indexer.ts:772](https://github.com/algorandfoundation/algokit-utils-ts/blob/main/src/types/indexer.ts#L772) diff --git a/docs/get-details/algokit/utils/ts/code/enums/types_indexer.ApplicationOnComplete.md b/docs/get-details/algokit/utils/ts/code/enums/types_indexer.ApplicationOnComplete.md index 3dcb938d..b55c8fe1 100644 --- a/docs/get-details/algokit/utils/ts/code/enums/types_indexer.ApplicationOnComplete.md +++ b/docs/get-details/algokit/utils/ts/code/enums/types_indexer.ApplicationOnComplete.md @@ -25,7 +25,7 @@ Defines the what additional actions occur with the transaction https://developer #### Defined in -[src/types/indexer.ts:497](https://github.com/algorandfoundation/algokit-utils-ts/blob/main/src/types/indexer.ts#L497) +[src/types/indexer.ts:677](https://github.com/algorandfoundation/algokit-utils-ts/blob/main/src/types/indexer.ts#L677) ___ @@ -35,7 +35,7 @@ ___ #### Defined in -[src/types/indexer.ts:496](https://github.com/algorandfoundation/algokit-utils-ts/blob/main/src/types/indexer.ts#L496) +[src/types/indexer.ts:676](https://github.com/algorandfoundation/algokit-utils-ts/blob/main/src/types/indexer.ts#L676) ___ @@ -45,7 +45,7 @@ ___ #### Defined in -[src/types/indexer.ts:499](https://github.com/algorandfoundation/algokit-utils-ts/blob/main/src/types/indexer.ts#L499) +[src/types/indexer.ts:679](https://github.com/algorandfoundation/algokit-utils-ts/blob/main/src/types/indexer.ts#L679) ___ @@ -55,7 +55,7 @@ ___ #### Defined in -[src/types/indexer.ts:494](https://github.com/algorandfoundation/algokit-utils-ts/blob/main/src/types/indexer.ts#L494) +[src/types/indexer.ts:674](https://github.com/algorandfoundation/algokit-utils-ts/blob/main/src/types/indexer.ts#L674) ___ @@ -65,7 +65,7 @@ ___ #### Defined in -[src/types/indexer.ts:495](https://github.com/algorandfoundation/algokit-utils-ts/blob/main/src/types/indexer.ts#L495) +[src/types/indexer.ts:675](https://github.com/algorandfoundation/algokit-utils-ts/blob/main/src/types/indexer.ts#L675) ___ @@ -75,4 +75,4 @@ ___ #### Defined in -[src/types/indexer.ts:498](https://github.com/algorandfoundation/algokit-utils-ts/blob/main/src/types/indexer.ts#L498) +[src/types/indexer.ts:678](https://github.com/algorandfoundation/algokit-utils-ts/blob/main/src/types/indexer.ts#L678) diff --git a/docs/get-details/algokit/utils/ts/code/enums/types_indexer.SignatureType.md b/docs/get-details/algokit/utils/ts/code/enums/types_indexer.SignatureType.md index f08552e7..01e3ef06 100644 --- a/docs/get-details/algokit/utils/ts/code/enums/types_indexer.SignatureType.md +++ b/docs/get-details/algokit/utils/ts/code/enums/types_indexer.SignatureType.md @@ -24,7 +24,7 @@ Logic signature #### Defined in -[src/types/indexer.ts:584](https://github.com/algorandfoundation/algokit-utils-ts/blob/main/src/types/indexer.ts#L584) +[src/types/indexer.ts:764](https://github.com/algorandfoundation/algokit-utils-ts/blob/main/src/types/indexer.ts#L764) ___ @@ -36,7 +36,7 @@ Multisig #### Defined in -[src/types/indexer.ts:582](https://github.com/algorandfoundation/algokit-utils-ts/blob/main/src/types/indexer.ts#L582) +[src/types/indexer.ts:762](https://github.com/algorandfoundation/algokit-utils-ts/blob/main/src/types/indexer.ts#L762) ___ @@ -48,4 +48,4 @@ Normal signature #### Defined in -[src/types/indexer.ts:580](https://github.com/algorandfoundation/algokit-utils-ts/blob/main/src/types/indexer.ts#L580) +[src/types/indexer.ts:760](https://github.com/algorandfoundation/algokit-utils-ts/blob/main/src/types/indexer.ts#L760) diff --git a/docs/get-details/algokit/utils/ts/code/interfaces/types_app.AppCallParams.md b/docs/get-details/algokit/utils/ts/code/interfaces/types_app.AppCallParams.md index fec5950a..cb831330 100644 --- a/docs/get-details/algokit/utils/ts/code/interfaces/types_app.AppCallParams.md +++ b/docs/get-details/algokit/utils/ts/code/interfaces/types_app.AppCallParams.md @@ -25,6 +25,7 @@ Parameters representing a call to an app. - [maxFee](types_app.AppCallParams.md#maxfee) - [maxRoundsToWaitForConfirmation](types_app.AppCallParams.md#maxroundstowaitforconfirmation) - [note](types_app.AppCallParams.md#note) +- [populateAppCallResources](types_app.AppCallParams.md#populateappcallresources) - [skipSending](types_app.AppCallParams.md#skipsending) - [skipWaiting](types_app.AppCallParams.md#skipwaiting) - [suppressLog](types_app.AppCallParams.md#suppresslog) @@ -156,6 +157,22 @@ The (optional) transaction note ___ +### populateAppCallResources + +• `Optional` **populateAppCallResources**: `boolean` + +**WARNING**: Not recommended for production use due to https://github.com/algorand/go-algorand/issues/5914. Whether to use simulate to automatically populate app call resources in the txn objects. Defaults to true when there are app calls in the group. + +#### Inherited from + +[SendTransactionParams](types_transaction.SendTransactionParams.md).[populateAppCallResources](types_transaction.SendTransactionParams.md#populateappcallresources) + +#### Defined in + +[src/types/transaction.ts:45](https://github.com/algorandfoundation/algokit-utils-ts/blob/main/src/types/transaction.ts#L45) + +___ + ### skipSending • `Optional` **skipSending**: `boolean` diff --git a/docs/get-details/algokit/utils/ts/code/interfaces/types_app.AppCallTransactionResult.md b/docs/get-details/algokit/utils/ts/code/interfaces/types_app.AppCallTransactionResult.md index d1dc2480..acda7120 100644 --- a/docs/get-details/algokit/utils/ts/code/interfaces/types_app.AppCallTransactionResult.md +++ b/docs/get-details/algokit/utils/ts/code/interfaces/types_app.AppCallTransactionResult.md @@ -36,7 +36,7 @@ The response if the transaction was sent and waited for #### Defined in -[src/types/transaction.ts:51](https://github.com/algorandfoundation/algokit-utils-ts/blob/main/src/types/transaction.ts#L51) +[src/types/transaction.ts:53](https://github.com/algorandfoundation/algokit-utils-ts/blob/main/src/types/transaction.ts#L53) ___ @@ -53,7 +53,7 @@ the index of the confirmation will match the index of the underlying transaction #### Defined in -[src/types/transaction.ts:61](https://github.com/algorandfoundation/algokit-utils-ts/blob/main/src/types/transaction.ts#L61) +[src/types/transaction.ts:63](https://github.com/algorandfoundation/algokit-utils-ts/blob/main/src/types/transaction.ts#L63) ___ @@ -85,7 +85,7 @@ The transaction #### Defined in -[src/types/transaction.ts:49](https://github.com/algorandfoundation/algokit-utils-ts/blob/main/src/types/transaction.ts#L49) +[src/types/transaction.ts:51](https://github.com/algorandfoundation/algokit-utils-ts/blob/main/src/types/transaction.ts#L51) ___ @@ -101,4 +101,4 @@ The transactions that have been prepared and/or sent #### Defined in -[src/types/transaction.ts:57](https://github.com/algorandfoundation/algokit-utils-ts/blob/main/src/types/transaction.ts#L57) +[src/types/transaction.ts:59](https://github.com/algorandfoundation/algokit-utils-ts/blob/main/src/types/transaction.ts#L59) diff --git a/docs/get-details/algokit/utils/ts/code/interfaces/types_app.AppCallTransactionResultOfType.md b/docs/get-details/algokit/utils/ts/code/interfaces/types_app.AppCallTransactionResultOfType.md index b4fd4a54..1d9caaf9 100644 --- a/docs/get-details/algokit/utils/ts/code/interfaces/types_app.AppCallTransactionResultOfType.md +++ b/docs/get-details/algokit/utils/ts/code/interfaces/types_app.AppCallTransactionResultOfType.md @@ -46,7 +46,7 @@ The response if the transaction was sent and waited for #### Defined in -[src/types/transaction.ts:51](https://github.com/algorandfoundation/algokit-utils-ts/blob/main/src/types/transaction.ts#L51) +[src/types/transaction.ts:53](https://github.com/algorandfoundation/algokit-utils-ts/blob/main/src/types/transaction.ts#L53) ___ @@ -63,7 +63,7 @@ the index of the confirmation will match the index of the underlying transaction #### Defined in -[src/types/transaction.ts:61](https://github.com/algorandfoundation/algokit-utils-ts/blob/main/src/types/transaction.ts#L61) +[src/types/transaction.ts:63](https://github.com/algorandfoundation/algokit-utils-ts/blob/main/src/types/transaction.ts#L63) ___ @@ -91,7 +91,7 @@ The transaction #### Defined in -[src/types/transaction.ts:49](https://github.com/algorandfoundation/algokit-utils-ts/blob/main/src/types/transaction.ts#L49) +[src/types/transaction.ts:51](https://github.com/algorandfoundation/algokit-utils-ts/blob/main/src/types/transaction.ts#L51) ___ @@ -107,4 +107,4 @@ The transactions that have been prepared and/or sent #### Defined in -[src/types/transaction.ts:57](https://github.com/algorandfoundation/algokit-utils-ts/blob/main/src/types/transaction.ts#L57) +[src/types/transaction.ts:59](https://github.com/algorandfoundation/algokit-utils-ts/blob/main/src/types/transaction.ts#L59) diff --git a/docs/get-details/algokit/utils/ts/code/interfaces/types_app.AppDeploymentParams.md b/docs/get-details/algokit/utils/ts/code/interfaces/types_app.AppDeploymentParams.md index 3ef05016..884cd9b0 100644 --- a/docs/get-details/algokit/utils/ts/code/interfaces/types_app.AppDeploymentParams.md +++ b/docs/get-details/algokit/utils/ts/code/interfaces/types_app.AppDeploymentParams.md @@ -30,6 +30,7 @@ The parameters to deploy an app - [metadata](types_app.AppDeploymentParams.md#metadata) - [onSchemaBreak](types_app.AppDeploymentParams.md#onschemabreak) - [onUpdate](types_app.AppDeploymentParams.md#onupdate) +- [populateAppCallResources](types_app.AppDeploymentParams.md#populateappcallresources) - [schema](types_app.AppDeploymentParams.md#schema) - [suppressLog](types_app.AppDeploymentParams.md#suppresslog) - [transactionParams](types_app.AppDeploymentParams.md#transactionparams) @@ -229,6 +230,22 @@ What action to perform if a TEAL update is detected ___ +### populateAppCallResources + +• `Optional` **populateAppCallResources**: `boolean` + +**WARNING**: Not recommended for production use due to https://github.com/algorand/go-algorand/issues/5914. Whether to use simulate to automatically populate app call resources in the txn objects. Defaults to true when there are app calls in the group. + +#### Inherited from + +Omit.populateAppCallResources + +#### Defined in + +[src/types/transaction.ts:45](https://github.com/algorandfoundation/algokit-utils-ts/blob/main/src/types/transaction.ts#L45) + +___ + ### schema • **schema**: [`AppStorageSchema`](types_app.AppStorageSchema.md) diff --git a/docs/get-details/algokit/utils/ts/code/interfaces/types_app.CreateAppParams.md b/docs/get-details/algokit/utils/ts/code/interfaces/types_app.CreateAppParams.md index b69cb16f..10071105 100644 --- a/docs/get-details/algokit/utils/ts/code/interfaces/types_app.CreateAppParams.md +++ b/docs/get-details/algokit/utils/ts/code/interfaces/types_app.CreateAppParams.md @@ -26,6 +26,7 @@ Parameters that are passed in when creating an app. - [maxRoundsToWaitForConfirmation](types_app.CreateAppParams.md#maxroundstowaitforconfirmation) - [note](types_app.CreateAppParams.md#note) - [onCompleteAction](types_app.CreateAppParams.md#oncompleteaction) +- [populateAppCallResources](types_app.CreateAppParams.md#populateappcallresources) - [schema](types_app.CreateAppParams.md#schema) - [skipSending](types_app.CreateAppParams.md#skipsending) - [skipWaiting](types_app.CreateAppParams.md#skipwaiting) @@ -190,6 +191,22 @@ Override the on-completion action for the create call; defaults to NoOp ___ +### populateAppCallResources + +• `Optional` **populateAppCallResources**: `boolean` + +**WARNING**: Not recommended for production use due to https://github.com/algorand/go-algorand/issues/5914. Whether to use simulate to automatically populate app call resources in the txn objects. Defaults to true when there are app calls in the group. + +#### Inherited from + +CreateOrUpdateAppParams.populateAppCallResources + +#### Defined in + +[src/types/transaction.ts:45](https://github.com/algorandfoundation/algokit-utils-ts/blob/main/src/types/transaction.ts#L45) + +___ + ### schema • **schema**: [`AppStorageSchema`](types_app.AppStorageSchema.md) diff --git a/docs/get-details/algokit/utils/ts/code/interfaces/types_app.UpdateAppParams.md b/docs/get-details/algokit/utils/ts/code/interfaces/types_app.UpdateAppParams.md index 32c03575..59ee50b0 100644 --- a/docs/get-details/algokit/utils/ts/code/interfaces/types_app.UpdateAppParams.md +++ b/docs/get-details/algokit/utils/ts/code/interfaces/types_app.UpdateAppParams.md @@ -26,6 +26,7 @@ Parameters that are passed in when updating an app. - [maxFee](types_app.UpdateAppParams.md#maxfee) - [maxRoundsToWaitForConfirmation](types_app.UpdateAppParams.md#maxroundstowaitforconfirmation) - [note](types_app.UpdateAppParams.md#note) +- [populateAppCallResources](types_app.UpdateAppParams.md#populateappcallresources) - [skipSending](types_app.UpdateAppParams.md#skipsending) - [skipWaiting](types_app.UpdateAppParams.md#skipwaiting) - [suppressLog](types_app.UpdateAppParams.md#suppresslog) @@ -189,6 +190,22 @@ CreateOrUpdateAppParams.note ___ +### populateAppCallResources + +• `Optional` **populateAppCallResources**: `boolean` + +**WARNING**: Not recommended for production use due to https://github.com/algorand/go-algorand/issues/5914. Whether to use simulate to automatically populate app call resources in the txn objects. Defaults to true when there are app calls in the group. + +#### Inherited from + +CreateOrUpdateAppParams.populateAppCallResources + +#### Defined in + +[src/types/transaction.ts:45](https://github.com/algorandfoundation/algokit-utils-ts/blob/main/src/types/transaction.ts#L45) + +___ + ### skipSending • `Optional` **skipSending**: `boolean` diff --git a/docs/get-details/algokit/utils/ts/code/interfaces/types_asset.AssetOptInParams.md b/docs/get-details/algokit/utils/ts/code/interfaces/types_asset.AssetOptInParams.md index 91299199..4a16c13a 100644 --- a/docs/get-details/algokit/utils/ts/code/interfaces/types_asset.AssetOptInParams.md +++ b/docs/get-details/algokit/utils/ts/code/interfaces/types_asset.AssetOptInParams.md @@ -26,6 +26,7 @@ Parameters for `assetOptIn` call. - [maxFee](types_asset.AssetOptInParams.md#maxfee) - [maxRoundsToWaitForConfirmation](types_asset.AssetOptInParams.md#maxroundstowaitforconfirmation) - [note](types_asset.AssetOptInParams.md#note) +- [populateAppCallResources](types_asset.AssetOptInParams.md#populateappcallresources) - [skipSending](types_asset.AssetOptInParams.md#skipsending) - [skipWaiting](types_asset.AssetOptInParams.md#skipwaiting) - [suppressLog](types_asset.AssetOptInParams.md#suppresslog) @@ -145,6 +146,22 @@ The (optional) transaction note ___ +### populateAppCallResources + +• `Optional` **populateAppCallResources**: `boolean` + +**WARNING**: Not recommended for production use due to https://github.com/algorand/go-algorand/issues/5914. Whether to use simulate to automatically populate app call resources in the txn objects. Defaults to true when there are app calls in the group. + +#### Inherited from + +[SendTransactionParams](types_transaction.SendTransactionParams.md).[populateAppCallResources](types_transaction.SendTransactionParams.md#populateappcallresources) + +#### Defined in + +[src/types/transaction.ts:45](https://github.com/algorandfoundation/algokit-utils-ts/blob/main/src/types/transaction.ts#L45) + +___ + ### skipSending • `Optional` **skipSending**: `boolean` diff --git a/docs/get-details/algokit/utils/ts/code/interfaces/types_asset.AssetOptOutParams.md b/docs/get-details/algokit/utils/ts/code/interfaces/types_asset.AssetOptOutParams.md index 9be4383d..7e45fd54 100644 --- a/docs/get-details/algokit/utils/ts/code/interfaces/types_asset.AssetOptOutParams.md +++ b/docs/get-details/algokit/utils/ts/code/interfaces/types_asset.AssetOptOutParams.md @@ -26,6 +26,7 @@ Parameters for `assetOptOut` call. - [maxFee](types_asset.AssetOptOutParams.md#maxfee) - [maxRoundsToWaitForConfirmation](types_asset.AssetOptOutParams.md#maxroundstowaitforconfirmation) - [note](types_asset.AssetOptOutParams.md#note) +- [populateAppCallResources](types_asset.AssetOptOutParams.md#populateappcallresources) - [skipSending](types_asset.AssetOptOutParams.md#skipsending) - [skipWaiting](types_asset.AssetOptOutParams.md#skipwaiting) - [suppressLog](types_asset.AssetOptOutParams.md#suppresslog) @@ -185,6 +186,22 @@ The (optional) transaction note ___ +### populateAppCallResources + +• `Optional` **populateAppCallResources**: `boolean` + +**WARNING**: Not recommended for production use due to https://github.com/algorand/go-algorand/issues/5914. Whether to use simulate to automatically populate app call resources in the txn objects. Defaults to true when there are app calls in the group. + +#### Inherited from + +[AssetOptInParams](types_asset.AssetOptInParams.md).[populateAppCallResources](types_asset.AssetOptInParams.md#populateappcallresources) + +#### Defined in + +[src/types/transaction.ts:45](https://github.com/algorandfoundation/algokit-utils-ts/blob/main/src/types/transaction.ts#L45) + +___ + ### skipSending • `Optional` **skipSending**: `boolean` diff --git a/docs/get-details/algokit/utils/ts/code/interfaces/types_config.Config.md b/docs/get-details/algokit/utils/ts/code/interfaces/types_config.Config.md index 3e5bace3..6eb273e3 100644 --- a/docs/get-details/algokit/utils/ts/code/interfaces/types_config.Config.md +++ b/docs/get-details/algokit/utils/ts/code/interfaces/types_config.Config.md @@ -13,6 +13,7 @@ The AlgoKit configuration type - [debug](types_config.Config.md#debug) - [logger](types_config.Config.md#logger) - [maxSearchDepth](types_config.Config.md#maxsearchdepth) +- [populateAppCallResources](types_config.Config.md#populateappcallresources) - [projectRoot](types_config.Config.md#projectroot) - [traceAll](types_config.Config.md#traceall) - [traceBufferSizeMb](types_config.Config.md#tracebuffersizemb) @@ -27,7 +28,7 @@ Whether or not debug mode is enabled #### Defined in -[src/types/config.ts:10](https://github.com/algorandfoundation/algokit-utils-ts/blob/main/src/types/config.ts#L10) +[src/types/config.ts:9](https://github.com/algorandfoundation/algokit-utils-ts/blob/main/src/types/config.ts#L9) ___ @@ -39,7 +40,7 @@ Logger #### Defined in -[src/types/config.ts:8](https://github.com/algorandfoundation/algokit-utils-ts/blob/main/src/types/config.ts#L8) +[src/types/config.ts:7](https://github.com/algorandfoundation/algokit-utils-ts/blob/main/src/types/config.ts#L7) ___ @@ -51,7 +52,24 @@ The maximum depth to search for a specific file #### Defined in -[src/types/config.ts:18](https://github.com/algorandfoundation/algokit-utils-ts/blob/main/src/types/config.ts#L18) +[src/types/config.ts:17](https://github.com/algorandfoundation/algokit-utils-ts/blob/main/src/types/config.ts#L17) + +___ + +### populateAppCallResources + +• **populateAppCallResources**: `boolean` + +**WARNING**: This is not production-ready due incompatability with rekeyed +accounts and simulate. This will eventually be enabled by default once +[this issue](https://github.com/algorand/go-algorand/issues/5914) is closed. + +Whether to enable populateAppCallResources in sendParams by default. +Default value is false. + +#### Defined in + +[src/types/config.ts:26](https://github.com/algorandfoundation/algokit-utils-ts/blob/main/src/types/config.ts#L26) ___ @@ -63,7 +81,7 @@ The path to the project root directory #### Defined in -[src/types/config.ts:12](https://github.com/algorandfoundation/algokit-utils-ts/blob/main/src/types/config.ts#L12) +[src/types/config.ts:11](https://github.com/algorandfoundation/algokit-utils-ts/blob/main/src/types/config.ts#L11) ___ @@ -75,7 +93,7 @@ Indicates whether to trace all operations #### Defined in -[src/types/config.ts:14](https://github.com/algorandfoundation/algokit-utils-ts/blob/main/src/types/config.ts#L14) +[src/types/config.ts:13](https://github.com/algorandfoundation/algokit-utils-ts/blob/main/src/types/config.ts#L13) ___ @@ -87,4 +105,4 @@ The size of the trace buffer in megabytes #### Defined in -[src/types/config.ts:16](https://github.com/algorandfoundation/algokit-utils-ts/blob/main/src/types/config.ts#L16) +[src/types/config.ts:15](https://github.com/algorandfoundation/algokit-utils-ts/blob/main/src/types/config.ts#L15) diff --git a/docs/get-details/algokit/utils/ts/code/interfaces/types_debugging.AVMDebuggerSourceMapDict.md b/docs/get-details/algokit/utils/ts/code/interfaces/types_debugging.AVMDebuggerSourceMapDict.md index f8b73987..6fbbf4d7 100644 --- a/docs/get-details/algokit/utils/ts/code/interfaces/types_debugging.AVMDebuggerSourceMapDict.md +++ b/docs/get-details/algokit/utils/ts/code/interfaces/types_debugging.AVMDebuggerSourceMapDict.md @@ -4,6 +4,8 @@ [types/debugging](../modules/types_debugging.md).AVMDebuggerSourceMapDict +AVM debugger source map format. + ## Table of contents ### Properties @@ -18,4 +20,4 @@ #### Defined in -[src/types/debugging.ts:5](https://github.com/algorandfoundation/algokit-utils-ts/blob/main/src/types/debugging.ts#L5) +[src/types/debugging.ts:8](https://github.com/algorandfoundation/algokit-utils-ts/blob/main/src/types/debugging.ts#L8) diff --git a/docs/get-details/algokit/utils/ts/code/interfaces/types_debugging.PersistSourceMapsParams.md b/docs/get-details/algokit/utils/ts/code/interfaces/types_debugging.PersistSourceMapsParams.md index 408426da..ef45fbda 100644 --- a/docs/get-details/algokit/utils/ts/code/interfaces/types_debugging.PersistSourceMapsParams.md +++ b/docs/get-details/algokit/utils/ts/code/interfaces/types_debugging.PersistSourceMapsParams.md @@ -4,6 +4,8 @@ [types/debugging](../modules/types_debugging.md).PersistSourceMapsParams +Parameters to a call that persists source maps + ## Table of contents ### Properties @@ -19,9 +21,11 @@ • **client**: `default` +An Algodv2 client to perform the compilation. + #### Defined in -[src/types/debugging.ts:101](https://github.com/algorandfoundation/algokit-utils-ts/blob/main/src/types/debugging.ts#L101) +[src/types/debugging.ts:148](https://github.com/algorandfoundation/algokit-utils-ts/blob/main/src/types/debugging.ts#L148) ___ @@ -29,9 +33,11 @@ ___ • **projectRoot**: `string` +The root directory of the project. + #### Defined in -[src/types/debugging.ts:100](https://github.com/algorandfoundation/algokit-utils-ts/blob/main/src/types/debugging.ts#L100) +[src/types/debugging.ts:146](https://github.com/algorandfoundation/algokit-utils-ts/blob/main/src/types/debugging.ts#L146) ___ @@ -39,9 +45,11 @@ ___ • **sources**: [`PersistSourceMapInput`](../classes/types_debugging.PersistSourceMapInput.md)[] +An array of PersistSourceMapInput objects. Each object can either contain rawTeal, in which case the function will execute a compile to obtain byte code, or it can accept an object of type CompiledTeal provided by algokit, which is used for source codes that have already been compiled and contain the traces. + #### Defined in -[src/types/debugging.ts:99](https://github.com/algorandfoundation/algokit-utils-ts/blob/main/src/types/debugging.ts#L99) +[src/types/debugging.ts:144](https://github.com/algorandfoundation/algokit-utils-ts/blob/main/src/types/debugging.ts#L144) ___ @@ -49,6 +57,8 @@ ___ • `Optional` **withSources**: `boolean` +A boolean indicating whether to include the source files in the output. + #### Defined in -[src/types/debugging.ts:102](https://github.com/algorandfoundation/algokit-utils-ts/blob/main/src/types/debugging.ts#L102) +[src/types/debugging.ts:150](https://github.com/algorandfoundation/algokit-utils-ts/blob/main/src/types/debugging.ts#L150) diff --git a/docs/get-details/algokit/utils/ts/code/interfaces/types_debugging.SimulateAndPersistResponseParams.md b/docs/get-details/algokit/utils/ts/code/interfaces/types_debugging.SimulateAndPersistResponseParams.md index a28ec1ed..ef89468a 100644 --- a/docs/get-details/algokit/utils/ts/code/interfaces/types_debugging.SimulateAndPersistResponseParams.md +++ b/docs/get-details/algokit/utils/ts/code/interfaces/types_debugging.SimulateAndPersistResponseParams.md @@ -4,6 +4,8 @@ [types/debugging](../modules/types_debugging.md).SimulateAndPersistResponseParams +Parameters to a call that simulates a transaction and persists the response. + ## Table of contents ### Properties @@ -19,9 +21,11 @@ • **algod**: `default` +algod An Algodv2 client to perform the simulation. + #### Defined in -[src/types/debugging.ts:108](https://github.com/algorandfoundation/algokit-utils-ts/blob/main/src/types/debugging.ts#L108) +[src/types/debugging.ts:158](https://github.com/algorandfoundation/algokit-utils-ts/blob/main/src/types/debugging.ts#L158) ___ @@ -29,9 +33,11 @@ ___ • **atc**: `AtomicTransactionComposer` +The AtomicTransactionComposer with transaction(s) loaded. + #### Defined in -[src/types/debugging.ts:106](https://github.com/algorandfoundation/algokit-utils-ts/blob/main/src/types/debugging.ts#L106) +[src/types/debugging.ts:160](https://github.com/algorandfoundation/algokit-utils-ts/blob/main/src/types/debugging.ts#L160) ___ @@ -39,9 +45,11 @@ ___ • **bufferSizeMb**: `number` +bufferSizeMb The buffer size in megabytes. + #### Defined in -[src/types/debugging.ts:109](https://github.com/algorandfoundation/algokit-utils-ts/blob/main/src/types/debugging.ts#L109) +[src/types/debugging.ts:164](https://github.com/algorandfoundation/algokit-utils-ts/blob/main/src/types/debugging.ts#L164) ___ @@ -49,6 +57,8 @@ ___ • **projectRoot**: `string` +projectRoot The root directory of the project. + #### Defined in -[src/types/debugging.ts:107](https://github.com/algorandfoundation/algokit-utils-ts/blob/main/src/types/debugging.ts#L107) +[src/types/debugging.ts:162](https://github.com/algorandfoundation/algokit-utils-ts/blob/main/src/types/debugging.ts#L162) diff --git a/docs/get-details/algokit/utils/ts/code/interfaces/types_indexer.AccountParticipation.md b/docs/get-details/algokit/utils/ts/code/interfaces/types_indexer.AccountParticipation.md index b5f2f4a0..886c0303 100644 --- a/docs/get-details/algokit/utils/ts/code/interfaces/types_indexer.AccountParticipation.md +++ b/docs/get-details/algokit/utils/ts/code/interfaces/types_indexer.AccountParticipation.md @@ -29,7 +29,7 @@ AccountParticipation describes the parameters used by this account in consensus #### Defined in -[src/types/indexer.ts:603](https://github.com/algorandfoundation/algokit-utils-ts/blob/main/src/types/indexer.ts#L603) +[src/types/indexer.ts:783](https://github.com/algorandfoundation/algokit-utils-ts/blob/main/src/types/indexer.ts#L783) ___ @@ -43,7 +43,7 @@ ___ #### Defined in -[src/types/indexer.ts:608](https://github.com/algorandfoundation/algokit-utils-ts/blob/main/src/types/indexer.ts#L608) +[src/types/indexer.ts:788](https://github.com/algorandfoundation/algokit-utils-ts/blob/main/src/types/indexer.ts#L788) ___ @@ -55,7 +55,7 @@ ___ #### Defined in -[src/types/indexer.ts:610](https://github.com/algorandfoundation/algokit-utils-ts/blob/main/src/types/indexer.ts#L610) +[src/types/indexer.ts:790](https://github.com/algorandfoundation/algokit-utils-ts/blob/main/src/types/indexer.ts#L790) ___ @@ -67,7 +67,7 @@ ___ #### Defined in -[src/types/indexer.ts:612](https://github.com/algorandfoundation/algokit-utils-ts/blob/main/src/types/indexer.ts#L612) +[src/types/indexer.ts:792](https://github.com/algorandfoundation/algokit-utils-ts/blob/main/src/types/indexer.ts#L792) ___ @@ -79,7 +79,7 @@ ___ #### Defined in -[src/types/indexer.ts:614](https://github.com/algorandfoundation/algokit-utils-ts/blob/main/src/types/indexer.ts#L614) +[src/types/indexer.ts:794](https://github.com/algorandfoundation/algokit-utils-ts/blob/main/src/types/indexer.ts#L794) ___ @@ -93,4 +93,4 @@ ___ #### Defined in -[src/types/indexer.ts:619](https://github.com/algorandfoundation/algokit-utils-ts/blob/main/src/types/indexer.ts#L619) +[src/types/indexer.ts:799](https://github.com/algorandfoundation/algokit-utils-ts/blob/main/src/types/indexer.ts#L799) diff --git a/docs/get-details/algokit/utils/ts/code/interfaces/types_indexer.AccountResult.md b/docs/get-details/algokit/utils/ts/code/interfaces/types_indexer.AccountResult.md index 8f9a8642..f89294cd 100644 --- a/docs/get-details/algokit/utils/ts/code/interfaces/types_indexer.AccountResult.md +++ b/docs/get-details/algokit/utils/ts/code/interfaces/types_indexer.AccountResult.md @@ -53,7 +53,7 @@ the account public key #### Defined in -[src/types/indexer.ts:181](https://github.com/algorandfoundation/algokit-utils-ts/blob/main/src/types/indexer.ts#L181) +[src/types/indexer.ts:192](https://github.com/algorandfoundation/algokit-utils-ts/blob/main/src/types/indexer.ts#L192) ___ @@ -65,7 +65,7 @@ ___ #### Defined in -[src/types/indexer.ts:183](https://github.com/algorandfoundation/algokit-utils-ts/blob/main/src/types/indexer.ts#L183) +[src/types/indexer.ts:194](https://github.com/algorandfoundation/algokit-utils-ts/blob/main/src/types/indexer.ts#L194) ___ @@ -77,7 +77,7 @@ specifies the amount of MicroAlgos in the account, without the pending rewards. #### Defined in -[src/types/indexer.ts:185](https://github.com/algorandfoundation/algokit-utils-ts/blob/main/src/types/indexer.ts#L185) +[src/types/indexer.ts:196](https://github.com/algorandfoundation/algokit-utils-ts/blob/main/src/types/indexer.ts#L196) ___ @@ -91,7 +91,7 @@ Note the raw object uses map[int] -> AppLocalState for this type. #### Defined in -[src/types/indexer.ts:190](https://github.com/algorandfoundation/algokit-utils-ts/blob/main/src/types/indexer.ts#L190) +[src/types/indexer.ts:201](https://github.com/algorandfoundation/algokit-utils-ts/blob/main/src/types/indexer.ts#L201) ___ @@ -103,7 +103,7 @@ ___ #### Defined in -[src/types/indexer.ts:192](https://github.com/algorandfoundation/algokit-utils-ts/blob/main/src/types/indexer.ts#L192) +[src/types/indexer.ts:203](https://github.com/algorandfoundation/algokit-utils-ts/blob/main/src/types/indexer.ts#L203) ___ @@ -117,7 +117,7 @@ Note: the raw account uses StateSchema for this type. #### Defined in -[src/types/indexer.ts:197](https://github.com/algorandfoundation/algokit-utils-ts/blob/main/src/types/indexer.ts#L197) +[src/types/indexer.ts:208](https://github.com/algorandfoundation/algokit-utils-ts/blob/main/src/types/indexer.ts#L208) ___ @@ -131,7 +131,7 @@ Note the raw object uses map[int] -> AssetHolding for this type. #### Defined in -[src/types/indexer.ts:202](https://github.com/algorandfoundation/algokit-utils-ts/blob/main/src/types/indexer.ts#L202) +[src/types/indexer.ts:213](https://github.com/algorandfoundation/algokit-utils-ts/blob/main/src/types/indexer.ts#L213) ___ @@ -147,7 +147,7 @@ This field can be updated in any transaction by setting the RekeyTo field. #### Defined in -[src/types/indexer.ts:209](https://github.com/algorandfoundation/algokit-utils-ts/blob/main/src/types/indexer.ts#L209) +[src/types/indexer.ts:220](https://github.com/algorandfoundation/algokit-utils-ts/blob/main/src/types/indexer.ts#L220) ___ @@ -159,7 +159,7 @@ Round during which this account was most recently closed. #### Defined in -[src/types/indexer.ts:211](https://github.com/algorandfoundation/algokit-utils-ts/blob/main/src/types/indexer.ts#L211) +[src/types/indexer.ts:222](https://github.com/algorandfoundation/algokit-utils-ts/blob/main/src/types/indexer.ts#L222) ___ @@ -173,7 +173,7 @@ Note: the raw account uses map[int] -> AppParams for this type. #### Defined in -[src/types/indexer.ts:216](https://github.com/algorandfoundation/algokit-utils-ts/blob/main/src/types/indexer.ts#L216) +[src/types/indexer.ts:227](https://github.com/algorandfoundation/algokit-utils-ts/blob/main/src/types/indexer.ts#L227) ___ @@ -187,7 +187,7 @@ Note: the raw account uses map[int] -> Asset for this type. #### Defined in -[src/types/indexer.ts:221](https://github.com/algorandfoundation/algokit-utils-ts/blob/main/src/types/indexer.ts#L221) +[src/types/indexer.ts:232](https://github.com/algorandfoundation/algokit-utils-ts/blob/main/src/types/indexer.ts#L232) ___ @@ -199,7 +199,7 @@ Round during which this account first appeared in a transaction. #### Defined in -[src/types/indexer.ts:223](https://github.com/algorandfoundation/algokit-utils-ts/blob/main/src/types/indexer.ts#L223) +[src/types/indexer.ts:234](https://github.com/algorandfoundation/algokit-utils-ts/blob/main/src/types/indexer.ts#L234) ___ @@ -211,7 +211,7 @@ Whether or not this account is currently closed. #### Defined in -[src/types/indexer.ts:225](https://github.com/algorandfoundation/algokit-utils-ts/blob/main/src/types/indexer.ts#L225) +[src/types/indexer.ts:236](https://github.com/algorandfoundation/algokit-utils-ts/blob/main/src/types/indexer.ts#L236) ___ @@ -223,7 +223,7 @@ If participating in consensus, the parameters used by this account in the consen #### Defined in -[src/types/indexer.ts:227](https://github.com/algorandfoundation/algokit-utils-ts/blob/main/src/types/indexer.ts#L227) +[src/types/indexer.ts:238](https://github.com/algorandfoundation/algokit-utils-ts/blob/main/src/types/indexer.ts#L238) ___ @@ -235,7 +235,7 @@ amount of MicroAlgos of pending rewards in this account. #### Defined in -[src/types/indexer.ts:229](https://github.com/algorandfoundation/algokit-utils-ts/blob/main/src/types/indexer.ts#L229) +[src/types/indexer.ts:240](https://github.com/algorandfoundation/algokit-utils-ts/blob/main/src/types/indexer.ts#L240) ___ @@ -247,7 +247,7 @@ ___ #### Defined in -[src/types/indexer.ts:231](https://github.com/algorandfoundation/algokit-utils-ts/blob/main/src/types/indexer.ts#L231) +[src/types/indexer.ts:242](https://github.com/algorandfoundation/algokit-utils-ts/blob/main/src/types/indexer.ts#L242) ___ @@ -259,7 +259,7 @@ ___ #### Defined in -[src/types/indexer.ts:233](https://github.com/algorandfoundation/algokit-utils-ts/blob/main/src/types/indexer.ts#L233) +[src/types/indexer.ts:244](https://github.com/algorandfoundation/algokit-utils-ts/blob/main/src/types/indexer.ts#L244) ___ @@ -271,7 +271,7 @@ The round for which this information is relevant. #### Defined in -[src/types/indexer.ts:235](https://github.com/algorandfoundation/algokit-utils-ts/blob/main/src/types/indexer.ts#L235) +[src/types/indexer.ts:246](https://github.com/algorandfoundation/algokit-utils-ts/blob/main/src/types/indexer.ts#L246) ___ @@ -283,7 +283,7 @@ Indicates what type of signature is used by this account #### Defined in -[src/types/indexer.ts:237](https://github.com/algorandfoundation/algokit-utils-ts/blob/main/src/types/indexer.ts#L237) +[src/types/indexer.ts:248](https://github.com/algorandfoundation/algokit-utils-ts/blob/main/src/types/indexer.ts#L248) ___ @@ -295,7 +295,7 @@ ___ #### Defined in -[src/types/indexer.ts:239](https://github.com/algorandfoundation/algokit-utils-ts/blob/main/src/types/indexer.ts#L239) +[src/types/indexer.ts:250](https://github.com/algorandfoundation/algokit-utils-ts/blob/main/src/types/indexer.ts#L250) ___ @@ -307,7 +307,7 @@ The count of all applications that have been opted in, equivalent to the count o #### Defined in -[src/types/indexer.ts:241](https://github.com/algorandfoundation/algokit-utils-ts/blob/main/src/types/indexer.ts#L241) +[src/types/indexer.ts:252](https://github.com/algorandfoundation/algokit-utils-ts/blob/main/src/types/indexer.ts#L252) ___ @@ -319,7 +319,7 @@ The count of all assets that have been opted in, equivalent to the count of Asse #### Defined in -[src/types/indexer.ts:243](https://github.com/algorandfoundation/algokit-utils-ts/blob/main/src/types/indexer.ts#L243) +[src/types/indexer.ts:254](https://github.com/algorandfoundation/algokit-utils-ts/blob/main/src/types/indexer.ts#L254) ___ @@ -331,7 +331,7 @@ For app-accounts only. The total number of bytes allocated for the keys and valu #### Defined in -[src/types/indexer.ts:245](https://github.com/algorandfoundation/algokit-utils-ts/blob/main/src/types/indexer.ts#L245) +[src/types/indexer.ts:256](https://github.com/algorandfoundation/algokit-utils-ts/blob/main/src/types/indexer.ts#L256) ___ @@ -343,7 +343,7 @@ For app-accounts only. The total number of boxes which belong to the associated #### Defined in -[src/types/indexer.ts:247](https://github.com/algorandfoundation/algokit-utils-ts/blob/main/src/types/indexer.ts#L247) +[src/types/indexer.ts:258](https://github.com/algorandfoundation/algokit-utils-ts/blob/main/src/types/indexer.ts#L258) ___ @@ -355,7 +355,7 @@ The count of all apps (AppParams objects) created by this account. #### Defined in -[src/types/indexer.ts:249](https://github.com/algorandfoundation/algokit-utils-ts/blob/main/src/types/indexer.ts#L249) +[src/types/indexer.ts:260](https://github.com/algorandfoundation/algokit-utils-ts/blob/main/src/types/indexer.ts#L260) ___ @@ -367,4 +367,4 @@ The count of all assets (AssetParams objects) created by this account. #### Defined in -[src/types/indexer.ts:251](https://github.com/algorandfoundation/algokit-utils-ts/blob/main/src/types/indexer.ts#L251) +[src/types/indexer.ts:262](https://github.com/algorandfoundation/algokit-utils-ts/blob/main/src/types/indexer.ts#L262) diff --git a/docs/get-details/algokit/utils/ts/code/interfaces/types_indexer.AppLocalState.md b/docs/get-details/algokit/utils/ts/code/interfaces/types_indexer.AppLocalState.md index 804ba9b2..39e15383 100644 --- a/docs/get-details/algokit/utils/ts/code/interfaces/types_indexer.AppLocalState.md +++ b/docs/get-details/algokit/utils/ts/code/interfaces/types_indexer.AppLocalState.md @@ -27,7 +27,7 @@ Round when account closed out of the application. #### Defined in -[src/types/indexer.ts:625](https://github.com/algorandfoundation/algokit-utils-ts/blob/main/src/types/indexer.ts#L625) +[src/types/indexer.ts:805](https://github.com/algorandfoundation/algokit-utils-ts/blob/main/src/types/indexer.ts#L805) ___ @@ -39,7 +39,7 @@ Whether or not the application local state is currently deleted from its account #### Defined in -[src/types/indexer.ts:627](https://github.com/algorandfoundation/algokit-utils-ts/blob/main/src/types/indexer.ts#L627) +[src/types/indexer.ts:807](https://github.com/algorandfoundation/algokit-utils-ts/blob/main/src/types/indexer.ts#L807) ___ @@ -51,7 +51,7 @@ The application which this local state is for. #### Defined in -[src/types/indexer.ts:629](https://github.com/algorandfoundation/algokit-utils-ts/blob/main/src/types/indexer.ts#L629) +[src/types/indexer.ts:809](https://github.com/algorandfoundation/algokit-utils-ts/blob/main/src/types/indexer.ts#L809) ___ @@ -63,7 +63,7 @@ ___ #### Defined in -[src/types/indexer.ts:631](https://github.com/algorandfoundation/algokit-utils-ts/blob/main/src/types/indexer.ts#L631) +[src/types/indexer.ts:811](https://github.com/algorandfoundation/algokit-utils-ts/blob/main/src/types/indexer.ts#L811) ___ @@ -75,7 +75,7 @@ Round when the account opted into the application. #### Defined in -[src/types/indexer.ts:633](https://github.com/algorandfoundation/algokit-utils-ts/blob/main/src/types/indexer.ts#L633) +[src/types/indexer.ts:813](https://github.com/algorandfoundation/algokit-utils-ts/blob/main/src/types/indexer.ts#L813) ___ @@ -87,4 +87,4 @@ ___ #### Defined in -[src/types/indexer.ts:635](https://github.com/algorandfoundation/algokit-utils-ts/blob/main/src/types/indexer.ts#L635) +[src/types/indexer.ts:815](https://github.com/algorandfoundation/algokit-utils-ts/blob/main/src/types/indexer.ts#L815) diff --git a/docs/get-details/algokit/utils/ts/code/interfaces/types_indexer.ApplicationParams.md b/docs/get-details/algokit/utils/ts/code/interfaces/types_indexer.ApplicationParams.md index cc8fbebe..f53a3883 100644 --- a/docs/get-details/algokit/utils/ts/code/interfaces/types_indexer.ApplicationParams.md +++ b/docs/get-details/algokit/utils/ts/code/interfaces/types_indexer.ApplicationParams.md @@ -34,7 +34,7 @@ Approval programs may reject the transaction. #### Defined in -[src/types/indexer.ts:457](https://github.com/algorandfoundation/algokit-utils-ts/blob/main/src/types/indexer.ts#L457) +[src/types/indexer.ts:637](https://github.com/algorandfoundation/algokit-utils-ts/blob/main/src/types/indexer.ts#L637) ___ @@ -52,7 +52,7 @@ Clear state programs cannot reject the transaction. #### Defined in -[src/types/indexer.ts:467](https://github.com/algorandfoundation/algokit-utils-ts/blob/main/src/types/indexer.ts#L467) +[src/types/indexer.ts:647](https://github.com/algorandfoundation/algokit-utils-ts/blob/main/src/types/indexer.ts#L647) ___ @@ -64,7 +64,7 @@ The address that created this application. This is the address where the paramet #### Defined in -[src/types/indexer.ts:447](https://github.com/algorandfoundation/algokit-utils-ts/blob/main/src/types/indexer.ts#L447) +[src/types/indexer.ts:627](https://github.com/algorandfoundation/algokit-utils-ts/blob/main/src/types/indexer.ts#L627) ___ @@ -76,7 +76,7 @@ ___ #### Defined in -[src/types/indexer.ts:469](https://github.com/algorandfoundation/algokit-utils-ts/blob/main/src/types/indexer.ts#L469) +[src/types/indexer.ts:649](https://github.com/algorandfoundation/algokit-utils-ts/blob/main/src/types/indexer.ts#L649) ___ @@ -88,7 +88,7 @@ ___ #### Defined in -[src/types/indexer.ts:471](https://github.com/algorandfoundation/algokit-utils-ts/blob/main/src/types/indexer.ts#L471) +[src/types/indexer.ts:651](https://github.com/algorandfoundation/algokit-utils-ts/blob/main/src/types/indexer.ts#L651) ___ @@ -100,7 +100,7 @@ ___ #### Defined in -[src/types/indexer.ts:473](https://github.com/algorandfoundation/algokit-utils-ts/blob/main/src/types/indexer.ts#L473) +[src/types/indexer.ts:653](https://github.com/algorandfoundation/algokit-utils-ts/blob/main/src/types/indexer.ts#L653) ___ @@ -112,4 +112,4 @@ ___ #### Defined in -[src/types/indexer.ts:475](https://github.com/algorandfoundation/algokit-utils-ts/blob/main/src/types/indexer.ts#L475) +[src/types/indexer.ts:655](https://github.com/algorandfoundation/algokit-utils-ts/blob/main/src/types/indexer.ts#L655) diff --git a/docs/get-details/algokit/utils/ts/code/interfaces/types_indexer.ApplicationResult.md b/docs/get-details/algokit/utils/ts/code/interfaces/types_indexer.ApplicationResult.md index a9ceaf56..e088c380 100644 --- a/docs/get-details/algokit/utils/ts/code/interfaces/types_indexer.ApplicationResult.md +++ b/docs/get-details/algokit/utils/ts/code/interfaces/types_indexer.ApplicationResult.md @@ -24,7 +24,7 @@ The result of looking up an application #### Defined in -[src/types/indexer.ts:367](https://github.com/algorandfoundation/algokit-utils-ts/blob/main/src/types/indexer.ts#L367) +[src/types/indexer.ts:547](https://github.com/algorandfoundation/algokit-utils-ts/blob/main/src/types/indexer.ts#L547) ___ @@ -34,7 +34,7 @@ ___ #### Defined in -[src/types/indexer.ts:368](https://github.com/algorandfoundation/algokit-utils-ts/blob/main/src/types/indexer.ts#L368) +[src/types/indexer.ts:548](https://github.com/algorandfoundation/algokit-utils-ts/blob/main/src/types/indexer.ts#L548) ___ @@ -44,7 +44,7 @@ ___ #### Defined in -[src/types/indexer.ts:369](https://github.com/algorandfoundation/algokit-utils-ts/blob/main/src/types/indexer.ts#L369) +[src/types/indexer.ts:549](https://github.com/algorandfoundation/algokit-utils-ts/blob/main/src/types/indexer.ts#L549) ___ @@ -54,7 +54,7 @@ ___ #### Defined in -[src/types/indexer.ts:365](https://github.com/algorandfoundation/algokit-utils-ts/blob/main/src/types/indexer.ts#L365) +[src/types/indexer.ts:545](https://github.com/algorandfoundation/algokit-utils-ts/blob/main/src/types/indexer.ts#L545) ___ @@ -64,4 +64,4 @@ ___ #### Defined in -[src/types/indexer.ts:366](https://github.com/algorandfoundation/algokit-utils-ts/blob/main/src/types/indexer.ts#L366) +[src/types/indexer.ts:546](https://github.com/algorandfoundation/algokit-utils-ts/blob/main/src/types/indexer.ts#L546) diff --git a/docs/get-details/algokit/utils/ts/code/interfaces/types_indexer.ApplicationTransactionResult.md b/docs/get-details/algokit/utils/ts/code/interfaces/types_indexer.ApplicationTransactionResult.md index 2e1cac1d..df9f8c38 100644 --- a/docs/get-details/algokit/utils/ts/code/interfaces/types_indexer.ApplicationTransactionResult.md +++ b/docs/get-details/algokit/utils/ts/code/interfaces/types_indexer.ApplicationTransactionResult.md @@ -38,7 +38,7 @@ Fields for an application transaction https://developer.algorand.org/docs/rest-a #### Defined in -[src/types/indexer.ts:269](https://github.com/algorandfoundation/algokit-utils-ts/blob/main/src/types/indexer.ts#L269) +[src/types/indexer.ts:449](https://github.com/algorandfoundation/algokit-utils-ts/blob/main/src/types/indexer.ts#L449) ___ @@ -50,7 +50,7 @@ ___ #### Defined in -[src/types/indexer.ts:271](https://github.com/algorandfoundation/algokit-utils-ts/blob/main/src/types/indexer.ts#L271) +[src/types/indexer.ts:451](https://github.com/algorandfoundation/algokit-utils-ts/blob/main/src/types/indexer.ts#L451) ___ @@ -62,7 +62,7 @@ ___ #### Defined in -[src/types/indexer.ts:273](https://github.com/algorandfoundation/algokit-utils-ts/blob/main/src/types/indexer.ts#L273) +[src/types/indexer.ts:453](https://github.com/algorandfoundation/algokit-utils-ts/blob/main/src/types/indexer.ts#L453) ___ @@ -84,7 +84,7 @@ Omit.approval-program #### Defined in -[src/types/indexer.ts:457](https://github.com/algorandfoundation/algokit-utils-ts/blob/main/src/types/indexer.ts#L457) +[src/types/indexer.ts:637](https://github.com/algorandfoundation/algokit-utils-ts/blob/main/src/types/indexer.ts#L637) ___ @@ -106,7 +106,7 @@ Omit.clear-state-program #### Defined in -[src/types/indexer.ts:467](https://github.com/algorandfoundation/algokit-utils-ts/blob/main/src/types/indexer.ts#L467) +[src/types/indexer.ts:647](https://github.com/algorandfoundation/algokit-utils-ts/blob/main/src/types/indexer.ts#L647) ___ @@ -122,7 +122,7 @@ Omit.extra-program-pages #### Defined in -[src/types/indexer.ts:469](https://github.com/algorandfoundation/algokit-utils-ts/blob/main/src/types/indexer.ts#L469) +[src/types/indexer.ts:649](https://github.com/algorandfoundation/algokit-utils-ts/blob/main/src/types/indexer.ts#L649) ___ @@ -134,7 +134,7 @@ ___ #### Defined in -[src/types/indexer.ts:275](https://github.com/algorandfoundation/algokit-utils-ts/blob/main/src/types/indexer.ts#L275) +[src/types/indexer.ts:455](https://github.com/algorandfoundation/algokit-utils-ts/blob/main/src/types/indexer.ts#L455) ___ @@ -146,7 +146,7 @@ ___ #### Defined in -[src/types/indexer.ts:277](https://github.com/algorandfoundation/algokit-utils-ts/blob/main/src/types/indexer.ts#L277) +[src/types/indexer.ts:457](https://github.com/algorandfoundation/algokit-utils-ts/blob/main/src/types/indexer.ts#L457) ___ @@ -162,7 +162,7 @@ Omit.global-state-schema #### Defined in -[src/types/indexer.ts:473](https://github.com/algorandfoundation/algokit-utils-ts/blob/main/src/types/indexer.ts#L473) +[src/types/indexer.ts:653](https://github.com/algorandfoundation/algokit-utils-ts/blob/main/src/types/indexer.ts#L653) ___ @@ -178,7 +178,7 @@ Omit.local-state-schema #### Defined in -[src/types/indexer.ts:475](https://github.com/algorandfoundation/algokit-utils-ts/blob/main/src/types/indexer.ts#L475) +[src/types/indexer.ts:655](https://github.com/algorandfoundation/algokit-utils-ts/blob/main/src/types/indexer.ts#L655) ___ @@ -190,4 +190,4 @@ ___ #### Defined in -[src/types/indexer.ts:279](https://github.com/algorandfoundation/algokit-utils-ts/blob/main/src/types/indexer.ts#L279) +[src/types/indexer.ts:459](https://github.com/algorandfoundation/algokit-utils-ts/blob/main/src/types/indexer.ts#L459) diff --git a/docs/get-details/algokit/utils/ts/code/interfaces/types_indexer.AssetConfigTransactionResult.md b/docs/get-details/algokit/utils/ts/code/interfaces/types_indexer.AssetConfigTransactionResult.md index d992108c..de634f31 100644 --- a/docs/get-details/algokit/utils/ts/code/interfaces/types_indexer.AssetConfigTransactionResult.md +++ b/docs/get-details/algokit/utils/ts/code/interfaces/types_indexer.AssetConfigTransactionResult.md @@ -26,16 +26,16 @@ A zero value for asset-id indicates asset creation. A zero value for the params #### Defined in -[src/types/indexer.ts:289](https://github.com/algorandfoundation/algokit-utils-ts/blob/main/src/types/indexer.ts#L289) +[src/types/indexer.ts:469](https://github.com/algorandfoundation/algokit-utils-ts/blob/main/src/types/indexer.ts#L469) ___ ### params -• **params**: [`AssetParams`](types_indexer.AssetParams.md) +• `Optional` **params**: [`AssetParams`](types_indexer.AssetParams.md) [apar] the parameters for the asset. #### Defined in -[src/types/indexer.ts:291](https://github.com/algorandfoundation/algokit-utils-ts/blob/main/src/types/indexer.ts#L291) +[src/types/indexer.ts:471](https://github.com/algorandfoundation/algokit-utils-ts/blob/main/src/types/indexer.ts#L471) diff --git a/docs/get-details/algokit/utils/ts/code/interfaces/types_indexer.AssetFreezeTransactionResult.md b/docs/get-details/algokit/utils/ts/code/interfaces/types_indexer.AssetFreezeTransactionResult.md index 45832343..511374c2 100644 --- a/docs/get-details/algokit/utils/ts/code/interfaces/types_indexer.AssetFreezeTransactionResult.md +++ b/docs/get-details/algokit/utils/ts/code/interfaces/types_indexer.AssetFreezeTransactionResult.md @@ -24,7 +24,7 @@ Fields for an asset freeze transaction. https://developer.algorand.org/docs/rest #### Defined in -[src/types/indexer.ts:297](https://github.com/algorandfoundation/algokit-utils-ts/blob/main/src/types/indexer.ts#L297) +[src/types/indexer.ts:477](https://github.com/algorandfoundation/algokit-utils-ts/blob/main/src/types/indexer.ts#L477) ___ @@ -36,7 +36,7 @@ ___ #### Defined in -[src/types/indexer.ts:299](https://github.com/algorandfoundation/algokit-utils-ts/blob/main/src/types/indexer.ts#L299) +[src/types/indexer.ts:479](https://github.com/algorandfoundation/algokit-utils-ts/blob/main/src/types/indexer.ts#L479) ___ @@ -48,4 +48,4 @@ ___ #### Defined in -[src/types/indexer.ts:301](https://github.com/algorandfoundation/algokit-utils-ts/blob/main/src/types/indexer.ts#L301) +[src/types/indexer.ts:481](https://github.com/algorandfoundation/algokit-utils-ts/blob/main/src/types/indexer.ts#L481) diff --git a/docs/get-details/algokit/utils/ts/code/interfaces/types_indexer.AssetHolding.md b/docs/get-details/algokit/utils/ts/code/interfaces/types_indexer.AssetHolding.md index 6b77975b..72c62f7c 100644 --- a/docs/get-details/algokit/utils/ts/code/interfaces/types_indexer.AssetHolding.md +++ b/docs/get-details/algokit/utils/ts/code/interfaces/types_indexer.AssetHolding.md @@ -27,7 +27,7 @@ Describes an asset held by an account. https://developer.algorand.org/docs/rest- #### Defined in -[src/types/indexer.ts:643](https://github.com/algorandfoundation/algokit-utils-ts/blob/main/src/types/indexer.ts#L643) +[src/types/indexer.ts:823](https://github.com/algorandfoundation/algokit-utils-ts/blob/main/src/types/indexer.ts#L823) ___ @@ -39,7 +39,7 @@ Asset ID of the holding. #### Defined in -[src/types/indexer.ts:647](https://github.com/algorandfoundation/algokit-utils-ts/blob/main/src/types/indexer.ts#L647) +[src/types/indexer.ts:827](https://github.com/algorandfoundation/algokit-utils-ts/blob/main/src/types/indexer.ts#L827) ___ @@ -51,7 +51,7 @@ Whether or not the asset holding is currently deleted from its account. #### Defined in -[src/types/indexer.ts:649](https://github.com/algorandfoundation/algokit-utils-ts/blob/main/src/types/indexer.ts#L649) +[src/types/indexer.ts:829](https://github.com/algorandfoundation/algokit-utils-ts/blob/main/src/types/indexer.ts#L829) ___ @@ -63,7 +63,7 @@ ___ #### Defined in -[src/types/indexer.ts:653](https://github.com/algorandfoundation/algokit-utils-ts/blob/main/src/types/indexer.ts#L653) +[src/types/indexer.ts:833](https://github.com/algorandfoundation/algokit-utils-ts/blob/main/src/types/indexer.ts#L833) ___ @@ -75,7 +75,7 @@ Round during which the account opted into this asset holding. #### Defined in -[src/types/indexer.ts:655](https://github.com/algorandfoundation/algokit-utils-ts/blob/main/src/types/indexer.ts#L655) +[src/types/indexer.ts:835](https://github.com/algorandfoundation/algokit-utils-ts/blob/main/src/types/indexer.ts#L835) ___ @@ -87,4 +87,4 @@ Round during which the account opted out of this asset holding. #### Defined in -[src/types/indexer.ts:657](https://github.com/algorandfoundation/algokit-utils-ts/blob/main/src/types/indexer.ts#L657) +[src/types/indexer.ts:837](https://github.com/algorandfoundation/algokit-utils-ts/blob/main/src/types/indexer.ts#L837) diff --git a/docs/get-details/algokit/utils/ts/code/interfaces/types_indexer.AssetParams.md b/docs/get-details/algokit/utils/ts/code/interfaces/types_indexer.AssetParams.md index fe62589b..efb67d6e 100644 --- a/docs/get-details/algokit/utils/ts/code/interfaces/types_indexer.AssetParams.md +++ b/docs/get-details/algokit/utils/ts/code/interfaces/types_indexer.AssetParams.md @@ -37,7 +37,7 @@ clawback is not permitted. #### Defined in -[src/types/indexer.ts:525](https://github.com/algorandfoundation/algokit-utils-ts/blob/main/src/types/indexer.ts#L525) +[src/types/indexer.ts:705](https://github.com/algorandfoundation/algokit-utils-ts/blob/main/src/types/indexer.ts#L705) ___ @@ -51,7 +51,7 @@ be sent in the worst case. #### Defined in -[src/types/indexer.ts:509](https://github.com/algorandfoundation/algokit-utils-ts/blob/main/src/types/indexer.ts#L509) +[src/types/indexer.ts:689](https://github.com/algorandfoundation/algokit-utils-ts/blob/main/src/types/indexer.ts#L689) ___ @@ -66,7 +66,7 @@ must be between 0 and 19 (inclusive). #### Defined in -[src/types/indexer.ts:516](https://github.com/algorandfoundation/algokit-utils-ts/blob/main/src/types/indexer.ts#L516) +[src/types/indexer.ts:696](https://github.com/algorandfoundation/algokit-utils-ts/blob/main/src/types/indexer.ts#L696) ___ @@ -78,7 +78,7 @@ ___ #### Defined in -[src/types/indexer.ts:529](https://github.com/algorandfoundation/algokit-utils-ts/blob/main/src/types/indexer.ts#L529) +[src/types/indexer.ts:709](https://github.com/algorandfoundation/algokit-utils-ts/blob/main/src/types/indexer.ts#L709) ___ @@ -91,7 +91,7 @@ is not permitted. #### Defined in -[src/types/indexer.ts:534](https://github.com/algorandfoundation/algokit-utils-ts/blob/main/src/types/indexer.ts#L534) +[src/types/indexer.ts:714](https://github.com/algorandfoundation/algokit-utils-ts/blob/main/src/types/indexer.ts#L714) ___ @@ -103,7 +103,7 @@ ___ #### Defined in -[src/types/indexer.ts:538](https://github.com/algorandfoundation/algokit-utils-ts/blob/main/src/types/indexer.ts#L538) +[src/types/indexer.ts:718](https://github.com/algorandfoundation/algokit-utils-ts/blob/main/src/types/indexer.ts#L718) ___ @@ -116,7 +116,7 @@ metadata is up to the application. #### Defined in -[src/types/indexer.ts:543](https://github.com/algorandfoundation/algokit-utils-ts/blob/main/src/types/indexer.ts#L543) +[src/types/indexer.ts:723](https://github.com/algorandfoundation/algokit-utils-ts/blob/main/src/types/indexer.ts#L723) ___ @@ -129,7 +129,7 @@ asset name is composed of printable utf-8 characters. #### Defined in -[src/types/indexer.ts:548](https://github.com/algorandfoundation/algokit-utils-ts/blob/main/src/types/indexer.ts#L548) +[src/types/indexer.ts:728](https://github.com/algorandfoundation/algokit-utils-ts/blob/main/src/types/indexer.ts#L728) ___ @@ -141,7 +141,7 @@ Base64 encoded name of this asset, as supplied by the creator. #### Defined in -[src/types/indexer.ts:552](https://github.com/algorandfoundation/algokit-utils-ts/blob/main/src/types/indexer.ts#L552) +[src/types/indexer.ts:732](https://github.com/algorandfoundation/algokit-utils-ts/blob/main/src/types/indexer.ts#L732) ___ @@ -153,7 +153,7 @@ ___ #### Defined in -[src/types/indexer.ts:556](https://github.com/algorandfoundation/algokit-utils-ts/blob/main/src/types/indexer.ts#L556) +[src/types/indexer.ts:736](https://github.com/algorandfoundation/algokit-utils-ts/blob/main/src/types/indexer.ts#L736) ___ @@ -165,7 +165,7 @@ ___ #### Defined in -[src/types/indexer.ts:520](https://github.com/algorandfoundation/algokit-utils-ts/blob/main/src/types/indexer.ts#L520) +[src/types/indexer.ts:700](https://github.com/algorandfoundation/algokit-utils-ts/blob/main/src/types/indexer.ts#L700) ___ @@ -178,7 +178,7 @@ when the name of a unit of this asset is composed of printable utf-8 characters. #### Defined in -[src/types/indexer.ts:561](https://github.com/algorandfoundation/algokit-utils-ts/blob/main/src/types/indexer.ts#L561) +[src/types/indexer.ts:741](https://github.com/algorandfoundation/algokit-utils-ts/blob/main/src/types/indexer.ts#L741) ___ @@ -190,7 +190,7 @@ Base64 encoded name of a unit of this asset, as supplied by the creator. #### Defined in -[src/types/indexer.ts:565](https://github.com/algorandfoundation/algokit-utils-ts/blob/main/src/types/indexer.ts#L565) +[src/types/indexer.ts:745](https://github.com/algorandfoundation/algokit-utils-ts/blob/main/src/types/indexer.ts#L745) ___ @@ -203,7 +203,7 @@ when the URL is composed of printable utf-8 characters. #### Defined in -[src/types/indexer.ts:570](https://github.com/algorandfoundation/algokit-utils-ts/blob/main/src/types/indexer.ts#L570) +[src/types/indexer.ts:750](https://github.com/algorandfoundation/algokit-utils-ts/blob/main/src/types/indexer.ts#L750) ___ @@ -215,4 +215,4 @@ Base64 encoded URL where more information about the asset can be retrieved. #### Defined in -[src/types/indexer.ts:574](https://github.com/algorandfoundation/algokit-utils-ts/blob/main/src/types/indexer.ts#L574) +[src/types/indexer.ts:754](https://github.com/algorandfoundation/algokit-utils-ts/blob/main/src/types/indexer.ts#L754) diff --git a/docs/get-details/algokit/utils/ts/code/interfaces/types_indexer.AssetResult.md b/docs/get-details/algokit/utils/ts/code/interfaces/types_indexer.AssetResult.md index 4c57722e..7aa2c290 100644 --- a/docs/get-details/algokit/utils/ts/code/interfaces/types_indexer.AssetResult.md +++ b/docs/get-details/algokit/utils/ts/code/interfaces/types_indexer.AssetResult.md @@ -26,7 +26,7 @@ Round during which this asset was created. #### Defined in -[src/types/indexer.ts:354](https://github.com/algorandfoundation/algokit-utils-ts/blob/main/src/types/indexer.ts#L354) +[src/types/indexer.ts:534](https://github.com/algorandfoundation/algokit-utils-ts/blob/main/src/types/indexer.ts#L534) ___ @@ -38,7 +38,7 @@ Whether or not this asset is currently deleted. #### Defined in -[src/types/indexer.ts:352](https://github.com/algorandfoundation/algokit-utils-ts/blob/main/src/types/indexer.ts#L352) +[src/types/indexer.ts:532](https://github.com/algorandfoundation/algokit-utils-ts/blob/main/src/types/indexer.ts#L532) ___ @@ -50,7 +50,7 @@ Round during which this asset was destroyed. #### Defined in -[src/types/indexer.ts:356](https://github.com/algorandfoundation/algokit-utils-ts/blob/main/src/types/indexer.ts#L356) +[src/types/indexer.ts:536](https://github.com/algorandfoundation/algokit-utils-ts/blob/main/src/types/indexer.ts#L536) ___ @@ -62,7 +62,7 @@ Unique asset identifier. #### Defined in -[src/types/indexer.ts:350](https://github.com/algorandfoundation/algokit-utils-ts/blob/main/src/types/indexer.ts#L350) +[src/types/indexer.ts:530](https://github.com/algorandfoundation/algokit-utils-ts/blob/main/src/types/indexer.ts#L530) ___ @@ -74,4 +74,4 @@ The parameters for the asset #### Defined in -[src/types/indexer.ts:358](https://github.com/algorandfoundation/algokit-utils-ts/blob/main/src/types/indexer.ts#L358) +[src/types/indexer.ts:538](https://github.com/algorandfoundation/algokit-utils-ts/blob/main/src/types/indexer.ts#L538) diff --git a/docs/get-details/algokit/utils/ts/code/interfaces/types_indexer.AssetTransferTransactionResult.md b/docs/get-details/algokit/utils/ts/code/interfaces/types_indexer.AssetTransferTransactionResult.md index 573957c1..d38a2966 100644 --- a/docs/get-details/algokit/utils/ts/code/interfaces/types_indexer.AssetTransferTransactionResult.md +++ b/docs/get-details/algokit/utils/ts/code/interfaces/types_indexer.AssetTransferTransactionResult.md @@ -27,7 +27,7 @@ Fields for an asset transfer transaction. https://developer.algorand.org/docs/re #### Defined in -[src/types/indexer.ts:307](https://github.com/algorandfoundation/algokit-utils-ts/blob/main/src/types/indexer.ts#L307) +[src/types/indexer.ts:487](https://github.com/algorandfoundation/algokit-utils-ts/blob/main/src/types/indexer.ts#L487) ___ @@ -39,7 +39,7 @@ ___ #### Defined in -[src/types/indexer.ts:309](https://github.com/algorandfoundation/algokit-utils-ts/blob/main/src/types/indexer.ts#L309) +[src/types/indexer.ts:489](https://github.com/algorandfoundation/algokit-utils-ts/blob/main/src/types/indexer.ts#L489) ___ @@ -51,7 +51,7 @@ Number of assets transfered to the close-to account as part of the transaction. #### Defined in -[src/types/indexer.ts:311](https://github.com/algorandfoundation/algokit-utils-ts/blob/main/src/types/indexer.ts#L311) +[src/types/indexer.ts:491](https://github.com/algorandfoundation/algokit-utils-ts/blob/main/src/types/indexer.ts#L491) ___ @@ -63,7 +63,7 @@ ___ #### Defined in -[src/types/indexer.ts:313](https://github.com/algorandfoundation/algokit-utils-ts/blob/main/src/types/indexer.ts#L313) +[src/types/indexer.ts:493](https://github.com/algorandfoundation/algokit-utils-ts/blob/main/src/types/indexer.ts#L493) ___ @@ -75,7 +75,7 @@ ___ #### Defined in -[src/types/indexer.ts:315](https://github.com/algorandfoundation/algokit-utils-ts/blob/main/src/types/indexer.ts#L315) +[src/types/indexer.ts:495](https://github.com/algorandfoundation/algokit-utils-ts/blob/main/src/types/indexer.ts#L495) ___ @@ -87,4 +87,4 @@ ___ #### Defined in -[src/types/indexer.ts:317](https://github.com/algorandfoundation/algokit-utils-ts/blob/main/src/types/indexer.ts#L317) +[src/types/indexer.ts:497](https://github.com/algorandfoundation/algokit-utils-ts/blob/main/src/types/indexer.ts#L497) diff --git a/docs/get-details/algokit/utils/ts/code/interfaces/types_indexer.EvalDelta.md b/docs/get-details/algokit/utils/ts/code/interfaces/types_indexer.EvalDelta.md index 19e4001a..5322e3f1 100644 --- a/docs/get-details/algokit/utils/ts/code/interfaces/types_indexer.EvalDelta.md +++ b/docs/get-details/algokit/utils/ts/code/interfaces/types_indexer.EvalDelta.md @@ -24,7 +24,7 @@ Represents a TEAL value delta. https://developer.algorand.org/docs/rest-apis/ind #### Defined in -[src/types/indexer.ts:437](https://github.com/algorandfoundation/algokit-utils-ts/blob/main/src/types/indexer.ts#L437) +[src/types/indexer.ts:617](https://github.com/algorandfoundation/algokit-utils-ts/blob/main/src/types/indexer.ts#L617) ___ @@ -36,7 +36,7 @@ ___ #### Defined in -[src/types/indexer.ts:439](https://github.com/algorandfoundation/algokit-utils-ts/blob/main/src/types/indexer.ts#L439) +[src/types/indexer.ts:619](https://github.com/algorandfoundation/algokit-utils-ts/blob/main/src/types/indexer.ts#L619) ___ @@ -48,4 +48,4 @@ ___ #### Defined in -[src/types/indexer.ts:441](https://github.com/algorandfoundation/algokit-utils-ts/blob/main/src/types/indexer.ts#L441) +[src/types/indexer.ts:621](https://github.com/algorandfoundation/algokit-utils-ts/blob/main/src/types/indexer.ts#L621) diff --git a/docs/get-details/algokit/utils/ts/code/interfaces/types_indexer.KeyRegistrationTransactionResult.md b/docs/get-details/algokit/utils/ts/code/interfaces/types_indexer.KeyRegistrationTransactionResult.md index 42707907..d43bf66e 100644 --- a/docs/get-details/algokit/utils/ts/code/interfaces/types_indexer.KeyRegistrationTransactionResult.md +++ b/docs/get-details/algokit/utils/ts/code/interfaces/types_indexer.KeyRegistrationTransactionResult.md @@ -28,7 +28,7 @@ Fields for a `keyreg` transaction https://developer.algorand.org/docs/rest-apis/ #### Defined in -[src/types/indexer.ts:323](https://github.com/algorandfoundation/algokit-utils-ts/blob/main/src/types/indexer.ts#L323) +[src/types/indexer.ts:503](https://github.com/algorandfoundation/algokit-utils-ts/blob/main/src/types/indexer.ts#L503) ___ @@ -42,7 +42,7 @@ ___ #### Defined in -[src/types/indexer.ts:328](https://github.com/algorandfoundation/algokit-utils-ts/blob/main/src/types/indexer.ts#L328) +[src/types/indexer.ts:508](https://github.com/algorandfoundation/algokit-utils-ts/blob/main/src/types/indexer.ts#L508) ___ @@ -56,7 +56,7 @@ ___ #### Defined in -[src/types/indexer.ts:333](https://github.com/algorandfoundation/algokit-utils-ts/blob/main/src/types/indexer.ts#L333) +[src/types/indexer.ts:513](https://github.com/algorandfoundation/algokit-utils-ts/blob/main/src/types/indexer.ts#L513) ___ @@ -68,7 +68,7 @@ ___ #### Defined in -[src/types/indexer.ts:335](https://github.com/algorandfoundation/algokit-utils-ts/blob/main/src/types/indexer.ts#L335) +[src/types/indexer.ts:515](https://github.com/algorandfoundation/algokit-utils-ts/blob/main/src/types/indexer.ts#L515) ___ @@ -80,7 +80,7 @@ ___ #### Defined in -[src/types/indexer.ts:337](https://github.com/algorandfoundation/algokit-utils-ts/blob/main/src/types/indexer.ts#L337) +[src/types/indexer.ts:517](https://github.com/algorandfoundation/algokit-utils-ts/blob/main/src/types/indexer.ts#L517) ___ @@ -92,7 +92,7 @@ ___ #### Defined in -[src/types/indexer.ts:339](https://github.com/algorandfoundation/algokit-utils-ts/blob/main/src/types/indexer.ts#L339) +[src/types/indexer.ts:519](https://github.com/algorandfoundation/algokit-utils-ts/blob/main/src/types/indexer.ts#L519) ___ @@ -106,4 +106,4 @@ ___ #### Defined in -[src/types/indexer.ts:344](https://github.com/algorandfoundation/algokit-utils-ts/blob/main/src/types/indexer.ts#L344) +[src/types/indexer.ts:524](https://github.com/algorandfoundation/algokit-utils-ts/blob/main/src/types/indexer.ts#L524) diff --git a/docs/get-details/algokit/utils/ts/code/interfaces/types_indexer.LogicTransactionSignature.md b/docs/get-details/algokit/utils/ts/code/interfaces/types_indexer.LogicTransactionSignature.md index 3bf04357..d2dc37be 100644 --- a/docs/get-details/algokit/utils/ts/code/interfaces/types_indexer.LogicTransactionSignature.md +++ b/docs/get-details/algokit/utils/ts/code/interfaces/types_indexer.LogicTransactionSignature.md @@ -29,7 +29,7 @@ https://developer.algorand.org/docs/get-details/transactions/signatures/#logic-s #### Defined in -[src/types/indexer.ts:393](https://github.com/algorandfoundation/algokit-utils-ts/blob/main/src/types/indexer.ts#L393) +[src/types/indexer.ts:573](https://github.com/algorandfoundation/algokit-utils-ts/blob/main/src/types/indexer.ts#L573) ___ @@ -45,7 +45,7 @@ Base64 encoded TEAL program. #### Defined in -[src/types/indexer.ts:400](https://github.com/algorandfoundation/algokit-utils-ts/blob/main/src/types/indexer.ts#L400) +[src/types/indexer.ts:580](https://github.com/algorandfoundation/algokit-utils-ts/blob/main/src/types/indexer.ts#L580) ___ @@ -57,7 +57,7 @@ The signature of the multisig the logic signature delegating the logicsig. https #### Defined in -[src/types/indexer.ts:402](https://github.com/algorandfoundation/algokit-utils-ts/blob/main/src/types/indexer.ts#L402) +[src/types/indexer.ts:582](https://github.com/algorandfoundation/algokit-utils-ts/blob/main/src/types/indexer.ts#L582) ___ @@ -71,4 +71,4 @@ ___ #### Defined in -[src/types/indexer.ts:407](https://github.com/algorandfoundation/algokit-utils-ts/blob/main/src/types/indexer.ts#L407) +[src/types/indexer.ts:587](https://github.com/algorandfoundation/algokit-utils-ts/blob/main/src/types/indexer.ts#L587) diff --git a/docs/get-details/algokit/utils/ts/code/interfaces/types_indexer.MerkleArrayProof.md b/docs/get-details/algokit/utils/ts/code/interfaces/types_indexer.MerkleArrayProof.md new file mode 100644 index 00000000..ea8ddf56 --- /dev/null +++ b/docs/get-details/algokit/utils/ts/code/interfaces/types_indexer.MerkleArrayProof.md @@ -0,0 +1,94 @@ +[@algorandfoundation/algokit-utils](../index.md) / [types/indexer](../modules/types_indexer.md) / MerkleArrayProof + +# Interface: MerkleArrayProof + +[types/indexer](../modules/types_indexer.md).MerkleArrayProof + +Merkle array Proof. + +Proof is used to convince a verifier about membership of leaves: h0,h1...hn +at indexes i0,i1...in on a tree. The verifier has a trusted value of the tree +root hash. + +Path is bounded by MaxNumLeaves since there could be multiple reveals, and +given the distribution of the elt positions and the depth of the tree, +the path length can increase up to 2^MaxTreeDepth / 2 + +Consider two different reveals for the same tree: +``` +. z5 +. z3 z4 +. y z z1 z2 +. q r s t u v w x +. a b c d e f g h i j k l m n o p +. ^ +. hints: [a, r, z, z4] +. len(hints) = 4 +``` +You need a to combine with b to get q, need r to combine with the computed q and get y, and so on. + +The worst case is this: +``` +. z5 +. z3 z4 +. y z z1 z2 +. q r s t u v w x +. a b c d e f g h i j k l m n o p +. ^ ^ ^ ^ ^ ^ ^ ^ +. +. hints: [b, d, e, g, j, l, m, o] +. len(hints) = 2^4/2 +``` + +## Table of contents + +### Properties + +- [hash-factory](types_indexer.MerkleArrayProof.md#hash-factory) +- [path](types_indexer.MerkleArrayProof.md#path) +- [tree-depth](types_indexer.MerkleArrayProof.md#tree-depth) + +## Properties + +### hash-factory + +• **hash-factory**: `Object` + +[hsh] The metadata of the hash factory that was used to hash the proofs + +#### Type declaration + +| Name | Type | Description | +| :------ | :------ | :------ | +| `hash-type` | `number` | [t] The type of hash https://github.com/algorand/go-algorand/blob/master/crypto/hashes.go#L42 | + +#### Defined in + +[src/types/indexer.ts:431](https://github.com/algorandfoundation/algokit-utils-ts/blob/main/src/types/indexer.ts#L431) + +___ + +### path + +• **path**: `string`[] + +[pth] Path is bounded by MaxNumLeavesOnEncodedTree since there could be multiple reveals, and +given the distribution of the elt positions and the depth of the tree, +the path length can increase up to 2^MaxEncodedTreeDepth / 2 + +#### Defined in + +[src/types/indexer.ts:439](https://github.com/algorandfoundation/algokit-utils-ts/blob/main/src/types/indexer.ts#L439) + +___ + +### tree-depth + +• **tree-depth**: `number` + +[td] TreeDepth represents the depth of the tree that is being proven. +It is the number of edges from the root to a leaf. + +#### Defined in + +[src/types/indexer.ts:443](https://github.com/algorandfoundation/algokit-utils-ts/blob/main/src/types/indexer.ts#L443) diff --git a/docs/get-details/algokit/utils/ts/code/interfaces/types_indexer.MultisigTransactionSignature.md b/docs/get-details/algokit/utils/ts/code/interfaces/types_indexer.MultisigTransactionSignature.md index 51c12523..4753a63c 100644 --- a/docs/get-details/algokit/utils/ts/code/interfaces/types_indexer.MultisigTransactionSignature.md +++ b/docs/get-details/algokit/utils/ts/code/interfaces/types_indexer.MultisigTransactionSignature.md @@ -18,13 +18,13 @@ ### subsignature -• **subsignature**: [`MultisigTransactionSubSignature`](types_indexer.MultisigTransactionSubSignature.md) +• **subsignature**: [`MultisigTransactionSubSignature`](types_indexer.MultisigTransactionSubSignature.md)[] [subsig] Holds pairs of public key and signatures. #### Defined in -[src/types/indexer.ts:413](https://github.com/algorandfoundation/algokit-utils-ts/blob/main/src/types/indexer.ts#L413) +[src/types/indexer.ts:593](https://github.com/algorandfoundation/algokit-utils-ts/blob/main/src/types/indexer.ts#L593) ___ @@ -36,7 +36,7 @@ ___ #### Defined in -[src/types/indexer.ts:415](https://github.com/algorandfoundation/algokit-utils-ts/blob/main/src/types/indexer.ts#L415) +[src/types/indexer.ts:595](https://github.com/algorandfoundation/algokit-utils-ts/blob/main/src/types/indexer.ts#L595) ___ @@ -48,4 +48,4 @@ ___ #### Defined in -[src/types/indexer.ts:417](https://github.com/algorandfoundation/algokit-utils-ts/blob/main/src/types/indexer.ts#L417) +[src/types/indexer.ts:597](https://github.com/algorandfoundation/algokit-utils-ts/blob/main/src/types/indexer.ts#L597) diff --git a/docs/get-details/algokit/utils/ts/code/interfaces/types_indexer.MultisigTransactionSubSignature.md b/docs/get-details/algokit/utils/ts/code/interfaces/types_indexer.MultisigTransactionSubSignature.md index 713d67e9..2ef33112 100644 --- a/docs/get-details/algokit/utils/ts/code/interfaces/types_indexer.MultisigTransactionSubSignature.md +++ b/docs/get-details/algokit/utils/ts/code/interfaces/types_indexer.MultisigTransactionSubSignature.md @@ -25,13 +25,13 @@ Sub-signature for a multisig signature https://developer.algorand.org/docs/rest- #### Defined in -[src/types/indexer.ts:426](https://github.com/algorandfoundation/algokit-utils-ts/blob/main/src/types/indexer.ts#L426) +[src/types/indexer.ts:606](https://github.com/algorandfoundation/algokit-utils-ts/blob/main/src/types/indexer.ts#L606) ___ ### signature -• **signature**: `string` +• `Optional` **signature**: `string` [s] The signature @@ -39,4 +39,4 @@ ___ #### Defined in -[src/types/indexer.ts:431](https://github.com/algorandfoundation/algokit-utils-ts/blob/main/src/types/indexer.ts#L431) +[src/types/indexer.ts:611](https://github.com/algorandfoundation/algokit-utils-ts/blob/main/src/types/indexer.ts#L611) diff --git a/docs/get-details/algokit/utils/ts/code/interfaces/types_indexer.PaymentTransactionResult.md b/docs/get-details/algokit/utils/ts/code/interfaces/types_indexer.PaymentTransactionResult.md index e8055602..8ffe9b8d 100644 --- a/docs/get-details/algokit/utils/ts/code/interfaces/types_indexer.PaymentTransactionResult.md +++ b/docs/get-details/algokit/utils/ts/code/interfaces/types_indexer.PaymentTransactionResult.md @@ -25,7 +25,7 @@ Fields for a payment transaction https://developer.algorand.org/docs/rest-apis/i #### Defined in -[src/types/indexer.ts:257](https://github.com/algorandfoundation/algokit-utils-ts/blob/main/src/types/indexer.ts#L257) +[src/types/indexer.ts:268](https://github.com/algorandfoundation/algokit-utils-ts/blob/main/src/types/indexer.ts#L268) ___ @@ -37,7 +37,7 @@ Number of MicroAlgos that were sent to the close-remainder-to address when closi #### Defined in -[src/types/indexer.ts:259](https://github.com/algorandfoundation/algokit-utils-ts/blob/main/src/types/indexer.ts#L259) +[src/types/indexer.ts:270](https://github.com/algorandfoundation/algokit-utils-ts/blob/main/src/types/indexer.ts#L270) ___ @@ -49,7 +49,7 @@ ___ #### Defined in -[src/types/indexer.ts:261](https://github.com/algorandfoundation/algokit-utils-ts/blob/main/src/types/indexer.ts#L261) +[src/types/indexer.ts:272](https://github.com/algorandfoundation/algokit-utils-ts/blob/main/src/types/indexer.ts#L272) ___ @@ -61,4 +61,4 @@ ___ #### Defined in -[src/types/indexer.ts:263](https://github.com/algorandfoundation/algokit-utils-ts/blob/main/src/types/indexer.ts#L263) +[src/types/indexer.ts:274](https://github.com/algorandfoundation/algokit-utils-ts/blob/main/src/types/indexer.ts#L274) diff --git a/docs/get-details/algokit/utils/ts/code/interfaces/types_indexer.StateProofTransactionResult.md b/docs/get-details/algokit/utils/ts/code/interfaces/types_indexer.StateProofTransactionResult.md new file mode 100644 index 00000000..13b3f5f2 --- /dev/null +++ b/docs/get-details/algokit/utils/ts/code/interfaces/types_indexer.StateProofTransactionResult.md @@ -0,0 +1,88 @@ +[@algorandfoundation/algokit-utils](../index.md) / [types/indexer](../modules/types_indexer.md) / StateProofTransactionResult + +# Interface: StateProofTransactionResult + +[types/indexer](../modules/types_indexer.md).StateProofTransactionResult + +Fields for a state proof transaction https://developer.algorand.org/docs/rest-apis/indexer/#transactionstateproof. + +See also https://developer.algorand.org/docs/get-details/stateproofs/, +https://developer.algorand.org/docs/get-details/stateproofs/light_client/, +https://github.com/algorand/go-algorand/blob/master/data/transactions/stateproof.go, +https://github.com/algorand/go-algorand/blob/master/crypto/stateproof/structs.go, +https://github.com/algorand/go-algorand/blob/master/data/stateproofmsg/message.go, and +https://developer.algorand.org/docs/rest-apis/algod/#stateproof. + +## Table of contents + +### Properties + +- [message](types_indexer.StateProofTransactionResult.md#message) +- [state-proof](types_indexer.StateProofTransactionResult.md#state-proof) +- [state-proof-type](types_indexer.StateProofTransactionResult.md#state-proof-type) + +## Properties + +### message + +• **message**: `Object` + +[spmsg] State proof message + +Message represents the message that the state proofs are attesting to. This message can be +used by lightweight client and gives it the ability to verify proofs on the Algorand's state. + +In addition to that proof, this message also contains fields that +are needed in order to verify the next state proofs (VotersCommitment and LnProvenWeight). + +#### Type declaration + +| Name | Type | Description | +| :------ | :------ | :------ | +| `block-headers-commitment` | `string` | [b] BlockHeadersCommitment contains a commitment on all light block headers within a state proof interval. | +| `first-attested-round` | `number` | [f] First round the message attests to | +| `latest-attested-round` | `number` | [l] Last round the message attests to | +| `ln-proven-weight` | `number` | [P] An integer value representing the natural log of the proven weight with 16 bits of precision. This value would be used to verify the next state proof. | +| `voters-commitment` | `string` | [v] The vector commitment root of the top N accounts to sign the next StateProof. Pattern : "^(?:[A-Za-z0-9+/]{4})*(?:[A-Za-z0-9+/]{2}==\\|[A-Za-z0-9+/]{3}=)?$" | + +#### Defined in + +[src/types/indexer.ts:295](https://github.com/algorandfoundation/algokit-utils-ts/blob/main/src/types/indexer.ts#L295) + +___ + +### state-proof + +• **state-proof**: `Object` + +[sp] a proof on Algorand's state + +#### Type declaration + +| Name | Type | Description | +| :------ | :------ | :------ | +| `part-proofs` | [`MerkleArrayProof`](types_indexer.MerkleArrayProof.md) | [P] Part proofs that make up the overall proof | +| `positions-to-reveal` | `number`[] | [pr] The positions that are revealed | +| `reveals` | \{ `participant`: \{ `verifier`: \{ `commitment`: `string` ; `key-lifetime`: `number` } ; `weight`: `number` } ; `position`: `number` ; `sig-slot`: \{ `lower-sig-weight`: `number` ; `signature`: \{ `falcon-signature`: `string` ; `merkle-array-index`: `number` ; `proof`: [`MerkleArrayProof`](types_indexer.MerkleArrayProof.md) ; `verifying-key`: `string` } } }[] | [r] Reveals is a sparse map from the position being revealed to the corresponding elements from the sigs and participants arrays. | +| `salt-version` | `number` | [v] Merkle signature salt version | +| `sig-commit` | `string` | [c] Digest of the signature commit | +| `sig-proofs` | [`MerkleArrayProof`](types_indexer.MerkleArrayProof.md) | [S] Proofs for the signature | +| `signed-weight` | `number` | [w] The combined weight of the signatures | + +#### Defined in + +[src/types/indexer.ts:310](https://github.com/algorandfoundation/algokit-utils-ts/blob/main/src/types/indexer.ts#L310) + +___ + +### state-proof-type + +• **state-proof-type**: `number` + +[sptype] State proof type, per https://github.com/algorand/go-algorand/blob/master/protocol/stateproof.go#L24 + + * 0: StateProofBasic is our initial state proof setup. using falcon keys and subset-sum hash + +#### Defined in + +[src/types/indexer.ts:389](https://github.com/algorandfoundation/algokit-utils-ts/blob/main/src/types/indexer.ts#L389) diff --git a/docs/get-details/algokit/utils/ts/code/interfaces/types_indexer.StateSchema.md b/docs/get-details/algokit/utils/ts/code/interfaces/types_indexer.StateSchema.md index 746d4d1a..0ed65f2e 100644 --- a/docs/get-details/algokit/utils/ts/code/interfaces/types_indexer.StateSchema.md +++ b/docs/get-details/algokit/utils/ts/code/interfaces/types_indexer.StateSchema.md @@ -28,7 +28,7 @@ Maximum number of TEAL byte slices that may be stored in the key/value store. #### Defined in -[src/types/indexer.ts:487](https://github.com/algorandfoundation/algokit-utils-ts/blob/main/src/types/indexer.ts#L487) +[src/types/indexer.ts:667](https://github.com/algorandfoundation/algokit-utils-ts/blob/main/src/types/indexer.ts#L667) ___ @@ -40,4 +40,4 @@ Maximum number of TEAL uints that may be stored in the key/value store. #### Defined in -[src/types/indexer.ts:489](https://github.com/algorandfoundation/algokit-utils-ts/blob/main/src/types/indexer.ts#L489) +[src/types/indexer.ts:669](https://github.com/algorandfoundation/algokit-utils-ts/blob/main/src/types/indexer.ts#L669) diff --git a/docs/get-details/algokit/utils/ts/code/interfaces/types_indexer.TransactionResult.md b/docs/get-details/algokit/utils/ts/code/interfaces/types_indexer.TransactionResult.md index 52ba536c..f8a0a97c 100644 --- a/docs/get-details/algokit/utils/ts/code/interfaces/types_indexer.TransactionResult.md +++ b/docs/get-details/algokit/utils/ts/code/interfaces/types_indexer.TransactionResult.md @@ -48,6 +48,7 @@ Indexer result for a transaction, https://developer.algorand.org/docs/rest-apis/ - [sender](types_indexer.TransactionResult.md#sender) - [sender-rewards](types_indexer.TransactionResult.md#sender-rewards) - [signature](types_indexer.TransactionResult.md#signature) +- [state-proof-transaction](types_indexer.TransactionResult.md#state-proof-transaction) - [tx-type](types_indexer.TransactionResult.md#tx-type) ## Properties @@ -60,19 +61,19 @@ If the transaction is an `appl` transaction this will be populated see `tx-type` #### Defined in -[src/types/indexer.ts:117](https://github.com/algorandfoundation/algokit-utils-ts/blob/main/src/types/indexer.ts#L117) +[src/types/indexer.ts:126](https://github.com/algorandfoundation/algokit-utils-ts/blob/main/src/types/indexer.ts#L126) ___ ### asset-config-transaction -• **asset-config-transaction**: [`AssetConfigTransactionResult`](types_indexer.AssetConfigTransactionResult.md) +• `Optional` **asset-config-transaction**: [`AssetConfigTransactionResult`](types_indexer.AssetConfigTransactionResult.md) If the transaction is an `acfg` transaction this will be populated see `tx-type` #### Defined in -[src/types/indexer.ts:123](https://github.com/algorandfoundation/algokit-utils-ts/blob/main/src/types/indexer.ts#L123) +[src/types/indexer.ts:132](https://github.com/algorandfoundation/algokit-utils-ts/blob/main/src/types/indexer.ts#L132) ___ @@ -84,7 +85,7 @@ If the transaction is an `afrz` transaction this will be populated see `tx-type` #### Defined in -[src/types/indexer.ts:129](https://github.com/algorandfoundation/algokit-utils-ts/blob/main/src/types/indexer.ts#L129) +[src/types/indexer.ts:138](https://github.com/algorandfoundation/algokit-utils-ts/blob/main/src/types/indexer.ts#L138) ___ @@ -96,7 +97,7 @@ If the transaction is an `axfer` transaction this will be populated see `tx-type #### Defined in -[src/types/indexer.ts:131](https://github.com/algorandfoundation/algokit-utils-ts/blob/main/src/types/indexer.ts#L131) +[src/types/indexer.ts:140](https://github.com/algorandfoundation/algokit-utils-ts/blob/main/src/types/indexer.ts#L140) ___ @@ -109,7 +110,7 @@ The backend can use this to ensure that auth addr is equal to the accounts auth #### Defined in -[src/types/indexer.ts:139](https://github.com/algorandfoundation/algokit-utils-ts/blob/main/src/types/indexer.ts#L139) +[src/types/indexer.ts:150](https://github.com/algorandfoundation/algokit-utils-ts/blob/main/src/types/indexer.ts#L150) ___ @@ -121,7 +122,7 @@ ___ #### Defined in -[src/types/indexer.ts:174](https://github.com/algorandfoundation/algokit-utils-ts/blob/main/src/types/indexer.ts#L174) +[src/types/indexer.ts:185](https://github.com/algorandfoundation/algokit-utils-ts/blob/main/src/types/indexer.ts#L185) ___ @@ -133,7 +134,7 @@ ___ #### Defined in -[src/types/indexer.ts:141](https://github.com/algorandfoundation/algokit-utils-ts/blob/main/src/types/indexer.ts#L141) +[src/types/indexer.ts:152](https://github.com/algorandfoundation/algokit-utils-ts/blob/main/src/types/indexer.ts#L152) ___ @@ -145,7 +146,7 @@ Round when the transaction was confirmed. #### Defined in -[src/types/indexer.ts:93](https://github.com/algorandfoundation/algokit-utils-ts/blob/main/src/types/indexer.ts#L93) +[src/types/indexer.ts:102](https://github.com/algorandfoundation/algokit-utils-ts/blob/main/src/types/indexer.ts#L102) ___ @@ -158,7 +159,7 @@ specifies the application index (ID) of that application. #### Defined in -[src/types/indexer.ts:121](https://github.com/algorandfoundation/algokit-utils-ts/blob/main/src/types/indexer.ts#L121) +[src/types/indexer.ts:130](https://github.com/algorandfoundation/algokit-utils-ts/blob/main/src/types/indexer.ts#L130) ___ @@ -171,7 +172,7 @@ specifies the asset index (ID) of that asset. #### Defined in -[src/types/indexer.ts:127](https://github.com/algorandfoundation/algokit-utils-ts/blob/main/src/types/indexer.ts#L127) +[src/types/indexer.ts:136](https://github.com/algorandfoundation/algokit-utils-ts/blob/main/src/types/indexer.ts#L136) ___ @@ -183,7 +184,7 @@ ___ #### Defined in -[src/types/indexer.ts:85](https://github.com/algorandfoundation/algokit-utils-ts/blob/main/src/types/indexer.ts#L85) +[src/types/indexer.ts:94](https://github.com/algorandfoundation/algokit-utils-ts/blob/main/src/types/indexer.ts#L94) ___ @@ -195,7 +196,7 @@ ___ #### Defined in -[src/types/indexer.ts:89](https://github.com/algorandfoundation/algokit-utils-ts/blob/main/src/types/indexer.ts#L89) +[src/types/indexer.ts:98](https://github.com/algorandfoundation/algokit-utils-ts/blob/main/src/types/indexer.ts#L98) ___ @@ -209,7 +210,7 @@ ___ #### Defined in -[src/types/indexer.ts:146](https://github.com/algorandfoundation/algokit-utils-ts/blob/main/src/types/indexer.ts#L146) +[src/types/indexer.ts:157](https://github.com/algorandfoundation/algokit-utils-ts/blob/main/src/types/indexer.ts#L157) ___ @@ -221,7 +222,7 @@ ___ #### Defined in -[src/types/indexer.ts:148](https://github.com/algorandfoundation/algokit-utils-ts/blob/main/src/types/indexer.ts#L148) +[src/types/indexer.ts:159](https://github.com/algorandfoundation/algokit-utils-ts/blob/main/src/types/indexer.ts#L159) ___ @@ -233,7 +234,7 @@ ___ #### Defined in -[src/types/indexer.ts:168](https://github.com/algorandfoundation/algokit-utils-ts/blob/main/src/types/indexer.ts#L168) +[src/types/indexer.ts:179](https://github.com/algorandfoundation/algokit-utils-ts/blob/main/src/types/indexer.ts#L179) ___ @@ -250,7 +251,7 @@ When present indicates that this transaction is part of a transaction group #### Defined in -[src/types/indexer.ts:101](https://github.com/algorandfoundation/algokit-utils-ts/blob/main/src/types/indexer.ts#L101) +[src/types/indexer.ts:110](https://github.com/algorandfoundation/algokit-utils-ts/blob/main/src/types/indexer.ts#L110) ___ @@ -274,7 +275,7 @@ Inner transactions produced by application execution. #### Defined in -[src/types/indexer.ts:150](https://github.com/algorandfoundation/algokit-utils-ts/blob/main/src/types/indexer.ts#L150) +[src/types/indexer.ts:161](https://github.com/algorandfoundation/algokit-utils-ts/blob/main/src/types/indexer.ts#L161) ___ @@ -286,7 +287,7 @@ Offset into the round where this transaction was confirmed. #### Defined in -[src/types/indexer.ts:113](https://github.com/algorandfoundation/algokit-utils-ts/blob/main/src/types/indexer.ts#L113) +[src/types/indexer.ts:122](https://github.com/algorandfoundation/algokit-utils-ts/blob/main/src/types/indexer.ts#L122) ___ @@ -298,7 +299,7 @@ If the transaction is a `keyreg` transaction this will be populated see `tx-type #### Defined in -[src/types/indexer.ts:133](https://github.com/algorandfoundation/algokit-utils-ts/blob/main/src/types/indexer.ts#L133) +[src/types/indexer.ts:142](https://github.com/algorandfoundation/algokit-utils-ts/blob/main/src/types/indexer.ts#L142) ___ @@ -310,7 +311,7 @@ ___ #### Defined in -[src/types/indexer.ts:91](https://github.com/algorandfoundation/algokit-utils-ts/blob/main/src/types/indexer.ts#L91) +[src/types/indexer.ts:100](https://github.com/algorandfoundation/algokit-utils-ts/blob/main/src/types/indexer.ts#L100) ___ @@ -329,7 +330,7 @@ While this transaction possesses the lease, no other transaction specifying this #### Defined in -[src/types/indexer.ts:164](https://github.com/algorandfoundation/algokit-utils-ts/blob/main/src/types/indexer.ts#L164) +[src/types/indexer.ts:175](https://github.com/algorandfoundation/algokit-utils-ts/blob/main/src/types/indexer.ts#L175) ___ @@ -341,7 +342,7 @@ ___ #### Defined in -[src/types/indexer.ts:166](https://github.com/algorandfoundation/algokit-utils-ts/blob/main/src/types/indexer.ts#L166) +[src/types/indexer.ts:177](https://github.com/algorandfoundation/algokit-utils-ts/blob/main/src/types/indexer.ts#L177) ___ @@ -353,7 +354,7 @@ ___ #### Defined in -[src/types/indexer.ts:109](https://github.com/algorandfoundation/algokit-utils-ts/blob/main/src/types/indexer.ts#L109) +[src/types/indexer.ts:118](https://github.com/algorandfoundation/algokit-utils-ts/blob/main/src/types/indexer.ts#L118) ___ @@ -367,7 +368,7 @@ ___ #### Defined in -[src/types/indexer.ts:107](https://github.com/algorandfoundation/algokit-utils-ts/blob/main/src/types/indexer.ts#L107) +[src/types/indexer.ts:116](https://github.com/algorandfoundation/algokit-utils-ts/blob/main/src/types/indexer.ts#L116) ___ @@ -379,7 +380,7 @@ If the transaction is a `pay` transaction this will be populated see `tx-type` #### Defined in -[src/types/indexer.ts:135](https://github.com/algorandfoundation/algokit-utils-ts/blob/main/src/types/indexer.ts#L135) +[src/types/indexer.ts:144](https://github.com/algorandfoundation/algokit-utils-ts/blob/main/src/types/indexer.ts#L144) ___ @@ -391,7 +392,7 @@ ___ #### Defined in -[src/types/indexer.ts:170](https://github.com/algorandfoundation/algokit-utils-ts/blob/main/src/types/indexer.ts#L170) +[src/types/indexer.ts:181](https://github.com/algorandfoundation/algokit-utils-ts/blob/main/src/types/indexer.ts#L181) ___ @@ -404,7 +405,7 @@ this value and future signatures must be signed with the key represented by this #### Defined in -[src/types/indexer.ts:154](https://github.com/algorandfoundation/algokit-utils-ts/blob/main/src/types/indexer.ts#L154) +[src/types/indexer.ts:165](https://github.com/algorandfoundation/algokit-utils-ts/blob/main/src/types/indexer.ts#L165) ___ @@ -416,7 +417,7 @@ Time when the block this transaction is in was confirmed. #### Defined in -[src/types/indexer.ts:111](https://github.com/algorandfoundation/algokit-utils-ts/blob/main/src/types/indexer.ts#L111) +[src/types/indexer.ts:120](https://github.com/algorandfoundation/algokit-utils-ts/blob/main/src/types/indexer.ts#L120) ___ @@ -428,7 +429,7 @@ ___ #### Defined in -[src/types/indexer.ts:87](https://github.com/algorandfoundation/algokit-utils-ts/blob/main/src/types/indexer.ts#L87) +[src/types/indexer.ts:96](https://github.com/algorandfoundation/algokit-utils-ts/blob/main/src/types/indexer.ts#L96) ___ @@ -440,7 +441,7 @@ ___ #### Defined in -[src/types/indexer.ts:172](https://github.com/algorandfoundation/algokit-utils-ts/blob/main/src/types/indexer.ts#L172) +[src/types/indexer.ts:183](https://github.com/algorandfoundation/algokit-utils-ts/blob/main/src/types/indexer.ts#L183) ___ @@ -452,7 +453,19 @@ Signature of the transaction #### Defined in -[src/types/indexer.ts:115](https://github.com/algorandfoundation/algokit-utils-ts/blob/main/src/types/indexer.ts#L115) +[src/types/indexer.ts:124](https://github.com/algorandfoundation/algokit-utils-ts/blob/main/src/types/indexer.ts#L124) + +___ + +### state-proof-transaction + +• `Optional` **state-proof-transaction**: [`StateProofTransactionResult`](types_indexer.StateProofTransactionResult.md) + +If the transaction is a `stpf` transaction this will be populated see `tx-type` + +#### Defined in + +[src/types/indexer.ts:146](https://github.com/algorandfoundation/algokit-utils-ts/blob/main/src/types/indexer.ts#L146) ___ @@ -461,7 +474,15 @@ ___ • **tx-type**: `TransactionType` [type] Indicates what type of transaction this is. Different types have different fields. +Valid types, and where their fields are stored: + * [pay] payment-transaction + * [keyreg] keyreg-transaction + * [acfg] asset-config-transaction + * [axfer] asset-transfer-transaction + * [afrz] asset-freeze-transaction + * [appl] application-transaction + * [stpf] state-proof-transaction #### Defined in -[src/types/indexer.ts:83](https://github.com/algorandfoundation/algokit-utils-ts/blob/main/src/types/indexer.ts#L83) +[src/types/indexer.ts:92](https://github.com/algorandfoundation/algokit-utils-ts/blob/main/src/types/indexer.ts#L92) diff --git a/docs/get-details/algokit/utils/ts/code/interfaces/types_indexer.TransactionSignature.md b/docs/get-details/algokit/utils/ts/code/interfaces/types_indexer.TransactionSignature.md index 2b4f4740..f1ce5fa3 100644 --- a/docs/get-details/algokit/utils/ts/code/interfaces/types_indexer.TransactionSignature.md +++ b/docs/get-details/algokit/utils/ts/code/interfaces/types_indexer.TransactionSignature.md @@ -18,31 +18,31 @@ Validation signature associated with some data. Only one of the signatures shoul ### logicsig -• **logicsig**: [`LogicTransactionSignature`](types_indexer.LogicTransactionSignature.md) +• `Optional` **logicsig**: [`LogicTransactionSignature`](types_indexer.LogicTransactionSignature.md) Logicsig signature #### Defined in -[src/types/indexer.ts:375](https://github.com/algorandfoundation/algokit-utils-ts/blob/main/src/types/indexer.ts#L375) +[src/types/indexer.ts:555](https://github.com/algorandfoundation/algokit-utils-ts/blob/main/src/types/indexer.ts#L555) ___ ### multisig -• **multisig**: [`MultisigTransactionSignature`](types_indexer.MultisigTransactionSignature.md) +• `Optional` **multisig**: [`MultisigTransactionSignature`](types_indexer.MultisigTransactionSignature.md) Multisig signature #### Defined in -[src/types/indexer.ts:377](https://github.com/algorandfoundation/algokit-utils-ts/blob/main/src/types/indexer.ts#L377) +[src/types/indexer.ts:557](https://github.com/algorandfoundation/algokit-utils-ts/blob/main/src/types/indexer.ts#L557) ___ ### sig -• **sig**: `string` +• `Optional` **sig**: `string` [sig] Standard ed25519 signature. @@ -50,4 +50,4 @@ ___ #### Defined in -[src/types/indexer.ts:382](https://github.com/algorandfoundation/algokit-utils-ts/blob/main/src/types/indexer.ts#L382) +[src/types/indexer.ts:562](https://github.com/algorandfoundation/algokit-utils-ts/blob/main/src/types/indexer.ts#L562) diff --git a/docs/get-details/algokit/utils/ts/code/interfaces/types_testing.AlgoKitLogCaptureFixture.md b/docs/get-details/algokit/utils/ts/code/interfaces/types_testing.AlgoKitLogCaptureFixture.md index 398101ab..33a63f55 100644 --- a/docs/get-details/algokit/utils/ts/code/interfaces/types_testing.AlgoKitLogCaptureFixture.md +++ b/docs/get-details/algokit/utils/ts/code/interfaces/types_testing.AlgoKitLogCaptureFixture.md @@ -21,6 +21,8 @@ • **afterEach**: () => `void` +Testing framework agnostic handler method to run after each test to reset the logger. + #### Type declaration ▸ (): `void` @@ -41,6 +43,8 @@ ___ • **beforeEach**: () => `void` +Testing framework agnostic handler method to run before each test to prepare the `testLogger` for that test. + #### Type declaration ▸ (): `void` diff --git a/docs/get-details/algokit/utils/ts/code/interfaces/types_testing.AlgorandFixture.md b/docs/get-details/algokit/utils/ts/code/interfaces/types_testing.AlgorandFixture.md index 9b3c4e84..fef843c8 100644 --- a/docs/get-details/algokit/utils/ts/code/interfaces/types_testing.AlgorandFixture.md +++ b/docs/get-details/algokit/utils/ts/code/interfaces/types_testing.AlgorandFixture.md @@ -22,6 +22,8 @@ An Algorand automated testing fixture • **beforeEach**: () => `Promise`\<`void`\> +Testing framework agnostic handler method to run before each test to prepare the `context` for that test. + #### Type declaration ▸ (): `Promise`\<`void`\> diff --git a/docs/get-details/algokit/utils/ts/code/interfaces/types_testing.AlgorandTestAutomationContext.md b/docs/get-details/algokit/utils/ts/code/interfaces/types_testing.AlgorandTestAutomationContext.md index 37167f58..ce6b432b 100644 --- a/docs/get-details/algokit/utils/ts/code/interfaces/types_testing.AlgorandTestAutomationContext.md +++ b/docs/get-details/algokit/utils/ts/code/interfaces/types_testing.AlgorandTestAutomationContext.md @@ -37,6 +37,8 @@ ___ • **generateAccount**: (`params`: [`GetTestAccountParams`](types_testing.GetTestAccountParams.md)) => `Promise`\<`default`\> +Generate and fund an additional ephemerally created account + #### Type declaration ▸ (`params`): `Promise`\<`default`\> @@ -111,6 +113,8 @@ ___ • **waitForIndexer**: () => `Promise`\<`void`\> +Wait for the indexer to catch up with all transactions logged by `transactionLogger` + #### Type declaration ▸ (): `Promise`\<`void`\> @@ -131,6 +135,8 @@ ___ • **waitForIndexerTransaction**: (`transactionId`: `string`) => `Promise`\<[`TransactionLookupResult`](types_indexer.TransactionLookupResult.md)\> +Wait for the indexer to catch up with the given transaction ID + #### Type declaration ▸ (`transactionId`): `Promise`\<[`TransactionLookupResult`](types_indexer.TransactionLookupResult.md)\> diff --git a/docs/get-details/algokit/utils/ts/code/interfaces/types_transaction.AtomicTransactionComposerToSend.md b/docs/get-details/algokit/utils/ts/code/interfaces/types_transaction.AtomicTransactionComposerToSend.md index 3c49874d..c515dfe7 100644 --- a/docs/get-details/algokit/utils/ts/code/interfaces/types_transaction.AtomicTransactionComposerToSend.md +++ b/docs/get-details/algokit/utils/ts/code/interfaces/types_transaction.AtomicTransactionComposerToSend.md @@ -23,7 +23,7 @@ The `AtomicTransactionComposer` with transactions loaded to send #### Defined in -[src/types/transaction.ts:126](https://github.com/algorandfoundation/algokit-utils-ts/blob/main/src/types/transaction.ts#L126) +[src/types/transaction.ts:128](https://github.com/algorandfoundation/algokit-utils-ts/blob/main/src/types/transaction.ts#L128) ___ @@ -35,4 +35,4 @@ Any parameters to control the semantics of the send to the network #### Defined in -[src/types/transaction.ts:128](https://github.com/algorandfoundation/algokit-utils-ts/blob/main/src/types/transaction.ts#L128) +[src/types/transaction.ts:130](https://github.com/algorandfoundation/algokit-utils-ts/blob/main/src/types/transaction.ts#L130) diff --git a/docs/get-details/algokit/utils/ts/code/interfaces/types_transaction.ConfirmedTransactionResult.md b/docs/get-details/algokit/utils/ts/code/interfaces/types_transaction.ConfirmedTransactionResult.md index 897fbd4a..becd3d36 100644 --- a/docs/get-details/algokit/utils/ts/code/interfaces/types_transaction.ConfirmedTransactionResult.md +++ b/docs/get-details/algokit/utils/ts/code/interfaces/types_transaction.ConfirmedTransactionResult.md @@ -33,7 +33,7 @@ The response from sending and waiting for the transaction #### Defined in -[src/types/transaction.ts:77](https://github.com/algorandfoundation/algokit-utils-ts/blob/main/src/types/transaction.ts#L77) +[src/types/transaction.ts:79](https://github.com/algorandfoundation/algokit-utils-ts/blob/main/src/types/transaction.ts#L79) ___ @@ -49,4 +49,4 @@ The transaction #### Defined in -[src/types/transaction.ts:49](https://github.com/algorandfoundation/algokit-utils-ts/blob/main/src/types/transaction.ts#L49) +[src/types/transaction.ts:51](https://github.com/algorandfoundation/algokit-utils-ts/blob/main/src/types/transaction.ts#L51) diff --git a/docs/get-details/algokit/utils/ts/code/interfaces/types_transaction.ConfirmedTransactionResults.md b/docs/get-details/algokit/utils/ts/code/interfaces/types_transaction.ConfirmedTransactionResults.md index c38b6300..1921f26a 100644 --- a/docs/get-details/algokit/utils/ts/code/interfaces/types_transaction.ConfirmedTransactionResults.md +++ b/docs/get-details/algokit/utils/ts/code/interfaces/types_transaction.ConfirmedTransactionResults.md @@ -37,7 +37,7 @@ The response from sending and waiting for the primary transaction #### Defined in -[src/types/transaction.ts:83](https://github.com/algorandfoundation/algokit-utils-ts/blob/main/src/types/transaction.ts#L83) +[src/types/transaction.ts:85](https://github.com/algorandfoundation/algokit-utils-ts/blob/main/src/types/transaction.ts#L85) ___ @@ -53,7 +53,7 @@ The response from sending and waiting for the transactions #### Defined in -[src/types/transaction.ts:85](https://github.com/algorandfoundation/algokit-utils-ts/blob/main/src/types/transaction.ts#L85) +[src/types/transaction.ts:87](https://github.com/algorandfoundation/algokit-utils-ts/blob/main/src/types/transaction.ts#L87) ___ @@ -69,7 +69,7 @@ The transaction #### Defined in -[src/types/transaction.ts:49](https://github.com/algorandfoundation/algokit-utils-ts/blob/main/src/types/transaction.ts#L49) +[src/types/transaction.ts:51](https://github.com/algorandfoundation/algokit-utils-ts/blob/main/src/types/transaction.ts#L51) ___ @@ -85,4 +85,4 @@ The transactions that have been prepared and/or sent #### Defined in -[src/types/transaction.ts:57](https://github.com/algorandfoundation/algokit-utils-ts/blob/main/src/types/transaction.ts#L57) +[src/types/transaction.ts:59](https://github.com/algorandfoundation/algokit-utils-ts/blob/main/src/types/transaction.ts#L59) diff --git a/docs/get-details/algokit/utils/ts/code/interfaces/types_transaction.SendAtomicTransactionComposerResults.md b/docs/get-details/algokit/utils/ts/code/interfaces/types_transaction.SendAtomicTransactionComposerResults.md index 15aaedc6..7d8aca43 100644 --- a/docs/get-details/algokit/utils/ts/code/interfaces/types_transaction.SendAtomicTransactionComposerResults.md +++ b/docs/get-details/algokit/utils/ts/code/interfaces/types_transaction.SendAtomicTransactionComposerResults.md @@ -37,7 +37,7 @@ the index of the confirmation will match the index of the underlying transaction #### Defined in -[src/types/transaction.ts:61](https://github.com/algorandfoundation/algokit-utils-ts/blob/main/src/types/transaction.ts#L61) +[src/types/transaction.ts:63](https://github.com/algorandfoundation/algokit-utils-ts/blob/main/src/types/transaction.ts#L63) ___ @@ -49,7 +49,7 @@ base64 encoded representation of the group ID of the atomic group #### Defined in -[src/types/transaction.ts:67](https://github.com/algorandfoundation/algokit-utils-ts/blob/main/src/types/transaction.ts#L67) +[src/types/transaction.ts:69](https://github.com/algorandfoundation/algokit-utils-ts/blob/main/src/types/transaction.ts#L69) ___ @@ -61,7 +61,7 @@ If ABI method(s) were called the processed return values #### Defined in -[src/types/transaction.ts:71](https://github.com/algorandfoundation/algokit-utils-ts/blob/main/src/types/transaction.ts#L71) +[src/types/transaction.ts:73](https://github.com/algorandfoundation/algokit-utils-ts/blob/main/src/types/transaction.ts#L73) ___ @@ -77,7 +77,7 @@ The transactions that have been prepared and/or sent #### Defined in -[src/types/transaction.ts:57](https://github.com/algorandfoundation/algokit-utils-ts/blob/main/src/types/transaction.ts#L57) +[src/types/transaction.ts:59](https://github.com/algorandfoundation/algokit-utils-ts/blob/main/src/types/transaction.ts#L59) ___ @@ -89,4 +89,4 @@ The transaction IDs that have been prepared and/or sent #### Defined in -[src/types/transaction.ts:69](https://github.com/algorandfoundation/algokit-utils-ts/blob/main/src/types/transaction.ts#L69) +[src/types/transaction.ts:71](https://github.com/algorandfoundation/algokit-utils-ts/blob/main/src/types/transaction.ts#L71) diff --git a/docs/get-details/algokit/utils/ts/code/interfaces/types_transaction.SendTransactionParams.md b/docs/get-details/algokit/utils/ts/code/interfaces/types_transaction.SendTransactionParams.md index b537320e..460f4c07 100644 --- a/docs/get-details/algokit/utils/ts/code/interfaces/types_transaction.SendTransactionParams.md +++ b/docs/get-details/algokit/utils/ts/code/interfaces/types_transaction.SendTransactionParams.md @@ -30,6 +30,7 @@ The sending configuration for a transaction - [fee](types_transaction.SendTransactionParams.md#fee) - [maxFee](types_transaction.SendTransactionParams.md#maxfee) - [maxRoundsToWaitForConfirmation](types_transaction.SendTransactionParams.md#maxroundstowaitforconfirmation) +- [populateAppCallResources](types_transaction.SendTransactionParams.md#populateappcallresources) - [skipSending](types_transaction.SendTransactionParams.md#skipsending) - [skipWaiting](types_transaction.SendTransactionParams.md#skipwaiting) - [suppressLog](types_transaction.SendTransactionParams.md#suppresslog) @@ -84,6 +85,18 @@ The maximum number of rounds to wait for confirmation, only applies if `skipWait ___ +### populateAppCallResources + +• `Optional` **populateAppCallResources**: `boolean` + +**WARNING**: Not recommended for production use due to https://github.com/algorand/go-algorand/issues/5914. Whether to use simulate to automatically populate app call resources in the txn objects. Defaults to true when there are app calls in the group. + +#### Defined in + +[src/types/transaction.ts:45](https://github.com/algorandfoundation/algokit-utils-ts/blob/main/src/types/transaction.ts#L45) + +___ + ### skipSending • `Optional` **skipSending**: `boolean` diff --git a/docs/get-details/algokit/utils/ts/code/interfaces/types_transaction.SendTransactionResult.md b/docs/get-details/algokit/utils/ts/code/interfaces/types_transaction.SendTransactionResult.md index b4e229d4..21239795 100644 --- a/docs/get-details/algokit/utils/ts/code/interfaces/types_transaction.SendTransactionResult.md +++ b/docs/get-details/algokit/utils/ts/code/interfaces/types_transaction.SendTransactionResult.md @@ -33,7 +33,7 @@ The response if the transaction was sent and waited for #### Defined in -[src/types/transaction.ts:51](https://github.com/algorandfoundation/algokit-utils-ts/blob/main/src/types/transaction.ts#L51) +[src/types/transaction.ts:53](https://github.com/algorandfoundation/algokit-utils-ts/blob/main/src/types/transaction.ts#L53) ___ @@ -45,4 +45,4 @@ The transaction #### Defined in -[src/types/transaction.ts:49](https://github.com/algorandfoundation/algokit-utils-ts/blob/main/src/types/transaction.ts#L49) +[src/types/transaction.ts:51](https://github.com/algorandfoundation/algokit-utils-ts/blob/main/src/types/transaction.ts#L51) diff --git a/docs/get-details/algokit/utils/ts/code/interfaces/types_transaction.SendTransactionResults.md b/docs/get-details/algokit/utils/ts/code/interfaces/types_transaction.SendTransactionResults.md index f87e9cb1..7378cbca 100644 --- a/docs/get-details/algokit/utils/ts/code/interfaces/types_transaction.SendTransactionResults.md +++ b/docs/get-details/algokit/utils/ts/code/interfaces/types_transaction.SendTransactionResults.md @@ -34,7 +34,7 @@ the index of the confirmation will match the index of the underlying transaction #### Defined in -[src/types/transaction.ts:61](https://github.com/algorandfoundation/algokit-utils-ts/blob/main/src/types/transaction.ts#L61) +[src/types/transaction.ts:63](https://github.com/algorandfoundation/algokit-utils-ts/blob/main/src/types/transaction.ts#L63) ___ @@ -46,4 +46,4 @@ The transactions that have been prepared and/or sent #### Defined in -[src/types/transaction.ts:57](https://github.com/algorandfoundation/algokit-utils-ts/blob/main/src/types/transaction.ts#L57) +[src/types/transaction.ts:59](https://github.com/algorandfoundation/algokit-utils-ts/blob/main/src/types/transaction.ts#L59) diff --git a/docs/get-details/algokit/utils/ts/code/interfaces/types_transaction.TransactionGroupToSend.md b/docs/get-details/algokit/utils/ts/code/interfaces/types_transaction.TransactionGroupToSend.md index 1632fea6..6699477d 100644 --- a/docs/get-details/algokit/utils/ts/code/interfaces/types_transaction.TransactionGroupToSend.md +++ b/docs/get-details/algokit/utils/ts/code/interfaces/types_transaction.TransactionGroupToSend.md @@ -25,7 +25,7 @@ Any parameters to control the semantics of the send to the network #### Defined in -[src/types/transaction.ts:113](https://github.com/algorandfoundation/algokit-utils-ts/blob/main/src/types/transaction.ts#L113) +[src/types/transaction.ts:115](https://github.com/algorandfoundation/algokit-utils-ts/blob/main/src/types/transaction.ts#L115) ___ @@ -37,7 +37,7 @@ Optional signer to pass in, required if at least one transaction provided is jus #### Defined in -[src/types/transaction.ts:120](https://github.com/algorandfoundation/algokit-utils-ts/blob/main/src/types/transaction.ts#L120) +[src/types/transaction.ts:122](https://github.com/algorandfoundation/algokit-utils-ts/blob/main/src/types/transaction.ts#L122) ___ @@ -51,4 +51,4 @@ The list of transactions to send, which can either be a raw transaction (in whic #### Defined in -[src/types/transaction.ts:118](https://github.com/algorandfoundation/algokit-utils-ts/blob/main/src/types/transaction.ts#L118) +[src/types/transaction.ts:120](https://github.com/algorandfoundation/algokit-utils-ts/blob/main/src/types/transaction.ts#L120) diff --git a/docs/get-details/algokit/utils/ts/code/interfaces/types_transaction.TransactionToSign.md b/docs/get-details/algokit/utils/ts/code/interfaces/types_transaction.TransactionToSign.md index e79b72d1..60bcc7e5 100644 --- a/docs/get-details/algokit/utils/ts/code/interfaces/types_transaction.TransactionToSign.md +++ b/docs/get-details/algokit/utils/ts/code/interfaces/types_transaction.TransactionToSign.md @@ -23,7 +23,7 @@ The account to use to sign the transaction, either an account (with private key #### Defined in -[src/types/transaction.ts:105](https://github.com/algorandfoundation/algokit-utils-ts/blob/main/src/types/transaction.ts#L105) +[src/types/transaction.ts:107](https://github.com/algorandfoundation/algokit-utils-ts/blob/main/src/types/transaction.ts#L107) ___ @@ -35,4 +35,4 @@ The unsigned transaction to sign and send #### Defined in -[src/types/transaction.ts:103](https://github.com/algorandfoundation/algokit-utils-ts/blob/main/src/types/transaction.ts#L103) +[src/types/transaction.ts:105](https://github.com/algorandfoundation/algokit-utils-ts/blob/main/src/types/transaction.ts#L105) diff --git a/docs/get-details/algokit/utils/ts/code/interfaces/types_transfer.AlgoRekeyParams.md b/docs/get-details/algokit/utils/ts/code/interfaces/types_transfer.AlgoRekeyParams.md index c43a3308..b18bbb53 100644 --- a/docs/get-details/algokit/utils/ts/code/interfaces/types_transfer.AlgoRekeyParams.md +++ b/docs/get-details/algokit/utils/ts/code/interfaces/types_transfer.AlgoRekeyParams.md @@ -23,6 +23,7 @@ Parameters for `rekeyAccount` call. - [maxFee](types_transfer.AlgoRekeyParams.md#maxfee) - [maxRoundsToWaitForConfirmation](types_transfer.AlgoRekeyParams.md#maxroundstowaitforconfirmation) - [note](types_transfer.AlgoRekeyParams.md#note) +- [populateAppCallResources](types_transfer.AlgoRekeyParams.md#populateappcallresources) - [rekeyTo](types_transfer.AlgoRekeyParams.md#rekeyto) - [skipSending](types_transfer.AlgoRekeyParams.md#skipsending) - [skipWaiting](types_transfer.AlgoRekeyParams.md#skipwaiting) @@ -131,6 +132,22 @@ The (optional) transaction note ___ +### populateAppCallResources + +• `Optional` **populateAppCallResources**: `boolean` + +**WARNING**: Not recommended for production use due to https://github.com/algorand/go-algorand/issues/5914. Whether to use simulate to automatically populate app call resources in the txn objects. Defaults to true when there are app calls in the group. + +#### Inherited from + +[SendTransactionParams](types_transaction.SendTransactionParams.md).[populateAppCallResources](types_transaction.SendTransactionParams.md#populateappcallresources) + +#### Defined in + +[src/types/transaction.ts:45](https://github.com/algorandfoundation/algokit-utils-ts/blob/main/src/types/transaction.ts#L45) + +___ + ### rekeyTo • **rekeyTo**: `string` \| [`SendTransactionFrom`](../modules/types_transaction.md#sendtransactionfrom) diff --git a/docs/get-details/algokit/utils/ts/code/interfaces/types_transfer.AlgoTransferParams.md b/docs/get-details/algokit/utils/ts/code/interfaces/types_transfer.AlgoTransferParams.md index 906e1a28..14a8f9d1 100644 --- a/docs/get-details/algokit/utils/ts/code/interfaces/types_transfer.AlgoTransferParams.md +++ b/docs/get-details/algokit/utils/ts/code/interfaces/types_transfer.AlgoTransferParams.md @@ -24,6 +24,7 @@ Parameters for `transferAlgos` call. - [maxFee](types_transfer.AlgoTransferParams.md#maxfee) - [maxRoundsToWaitForConfirmation](types_transfer.AlgoTransferParams.md#maxroundstowaitforconfirmation) - [note](types_transfer.AlgoTransferParams.md#note) +- [populateAppCallResources](types_transfer.AlgoTransferParams.md#populateappcallresources) - [skipSending](types_transfer.AlgoTransferParams.md#skipsending) - [skipWaiting](types_transfer.AlgoTransferParams.md#skipwaiting) - [suppressLog](types_transfer.AlgoTransferParams.md#suppresslog) @@ -144,6 +145,22 @@ The (optional) transaction note ___ +### populateAppCallResources + +• `Optional` **populateAppCallResources**: `boolean` + +**WARNING**: Not recommended for production use due to https://github.com/algorand/go-algorand/issues/5914. Whether to use simulate to automatically populate app call resources in the txn objects. Defaults to true when there are app calls in the group. + +#### Inherited from + +[SendTransactionParams](types_transaction.SendTransactionParams.md).[populateAppCallResources](types_transaction.SendTransactionParams.md#populateappcallresources) + +#### Defined in + +[src/types/transaction.ts:45](https://github.com/algorandfoundation/algokit-utils-ts/blob/main/src/types/transaction.ts#L45) + +___ + ### skipSending • `Optional` **skipSending**: `boolean` diff --git a/docs/get-details/algokit/utils/ts/code/interfaces/types_transfer.EnsureFundedParams.md b/docs/get-details/algokit/utils/ts/code/interfaces/types_transfer.EnsureFundedParams.md index 874245d9..f0c6b957 100644 --- a/docs/get-details/algokit/utils/ts/code/interfaces/types_transfer.EnsureFundedParams.md +++ b/docs/get-details/algokit/utils/ts/code/interfaces/types_transfer.EnsureFundedParams.md @@ -26,6 +26,7 @@ Parameters for `ensureFunded` call. - [minFundingIncrement](types_transfer.EnsureFundedParams.md#minfundingincrement) - [minSpendingBalance](types_transfer.EnsureFundedParams.md#minspendingbalance) - [note](types_transfer.EnsureFundedParams.md#note) +- [populateAppCallResources](types_transfer.EnsureFundedParams.md#populateappcallresources) - [skipSending](types_transfer.EnsureFundedParams.md#skipsending) - [skipWaiting](types_transfer.EnsureFundedParams.md#skipwaiting) - [suppressLog](types_transfer.EnsureFundedParams.md#suppresslog) @@ -169,6 +170,22 @@ The (optional) transaction note, default: "Funding account to meet minimum requi ___ +### populateAppCallResources + +• `Optional` **populateAppCallResources**: `boolean` + +**WARNING**: Not recommended for production use due to https://github.com/algorand/go-algorand/issues/5914. Whether to use simulate to automatically populate app call resources in the txn objects. Defaults to true when there are app calls in the group. + +#### Inherited from + +[SendTransactionParams](types_transaction.SendTransactionParams.md).[populateAppCallResources](types_transaction.SendTransactionParams.md#populateappcallresources) + +#### Defined in + +[src/types/transaction.ts:45](https://github.com/algorandfoundation/algokit-utils-ts/blob/main/src/types/transaction.ts#L45) + +___ + ### skipSending • `Optional` **skipSending**: `boolean` diff --git a/docs/get-details/algokit/utils/ts/code/interfaces/types_transfer.TransferAssetParams.md b/docs/get-details/algokit/utils/ts/code/interfaces/types_transfer.TransferAssetParams.md index c557697f..354380f9 100644 --- a/docs/get-details/algokit/utils/ts/code/interfaces/types_transfer.TransferAssetParams.md +++ b/docs/get-details/algokit/utils/ts/code/interfaces/types_transfer.TransferAssetParams.md @@ -26,6 +26,7 @@ Parameters for `transferAsset` call. - [maxFee](types_transfer.TransferAssetParams.md#maxfee) - [maxRoundsToWaitForConfirmation](types_transfer.TransferAssetParams.md#maxroundstowaitforconfirmation) - [note](types_transfer.TransferAssetParams.md#note) +- [populateAppCallResources](types_transfer.TransferAssetParams.md#populateappcallresources) - [skipSending](types_transfer.TransferAssetParams.md#skipsending) - [skipWaiting](types_transfer.TransferAssetParams.md#skipwaiting) - [suppressLog](types_transfer.TransferAssetParams.md#suppresslog) @@ -170,6 +171,22 @@ The (optional) transaction note ___ +### populateAppCallResources + +• `Optional` **populateAppCallResources**: `boolean` + +**WARNING**: Not recommended for production use due to https://github.com/algorand/go-algorand/issues/5914. Whether to use simulate to automatically populate app call resources in the txn objects. Defaults to true when there are app calls in the group. + +#### Inherited from + +[SendTransactionParams](types_transaction.SendTransactionParams.md).[populateAppCallResources](types_transaction.SendTransactionParams.md#populateappcallresources) + +#### Defined in + +[src/types/transaction.ts:45](https://github.com/algorandfoundation/algokit-utils-ts/blob/main/src/types/transaction.ts#L45) + +___ + ### skipSending • `Optional` **skipSending**: `boolean` diff --git a/docs/get-details/algokit/utils/ts/code/modules/index.md b/docs/get-details/algokit/utils/ts/code/modules/index.md index 756cdf27..76508666 100644 --- a/docs/get-details/algokit/utils/ts/code/modules/index.md +++ b/docs/get-details/algokit/utils/ts/code/modules/index.md @@ -3,6 +3,8 @@ title: Overview ### Variables - [Config](index.md#config) +- [MAX\_APP\_CALL\_ACCOUNT\_REFERENCES](index.md#max_app_call_account_references) +- [MAX\_APP\_CALL\_FOREIGN\_REFERENCES](index.md#max_app_call_foreign_references) - [MAX\_TRANSACTION\_GROUP\_SIZE](index.md#max_transaction_group_size) ### Functions @@ -79,6 +81,8 @@ title: Overview - [performAtomicTransactionComposerSimulate](index.md#performatomictransactioncomposersimulate) - [performTemplateSubstitution](index.md#performtemplatesubstitution) - [performTemplateSubstitutionAndCompile](index.md#performtemplatesubstitutionandcompile) +- [persistSourceMaps](index.md#persistsourcemaps) +- [populateAppCallResources](index.md#populateappcallresources) - [randomAccount](index.md#randomaccount) - [rekeyAccount](index.md#rekeyaccount) - [rekeyedAccount](index.md#rekeyedaccount) @@ -88,6 +92,7 @@ title: Overview - [sendGroupOfTransactions](index.md#sendgroupoftransactions) - [sendTransaction](index.md#sendtransaction) - [signTransaction](index.md#signtransaction) +- [simulateAndPersistResponse](index.md#simulateandpersistresponse) - [stripTealComments](index.md#striptealcomments) - [transactionFees](index.md#transactionfees) - [transactionSignerAccount](index.md#transactionsigneraccount) @@ -106,7 +111,27 @@ The AlgoKit config. To update it use the configure method. #### Defined in -[src/index.ts:17](https://github.com/algorandfoundation/algokit-utils-ts/blob/main/src/index.ts#L17) +[src/config.ts:4](https://github.com/algorandfoundation/algokit-utils-ts/blob/main/src/config.ts#L4) + +___ + +### MAX\_APP\_CALL\_ACCOUNT\_REFERENCES + +• `Const` **MAX\_APP\_CALL\_ACCOUNT\_REFERENCES**: ``4`` + +#### Defined in + +[src/transaction/transaction.ts:29](https://github.com/algorandfoundation/algokit-utils-ts/blob/main/src/transaction/transaction.ts#L29) + +___ + +### MAX\_APP\_CALL\_FOREIGN\_REFERENCES + +• `Const` **MAX\_APP\_CALL\_FOREIGN\_REFERENCES**: ``8`` + +#### Defined in + +[src/transaction/transaction.ts:28](https://github.com/algorandfoundation/algokit-utils-ts/blob/main/src/transaction/transaction.ts#L28) ___ @@ -116,7 +141,7 @@ ___ #### Defined in -[src/transaction.ts:27](https://github.com/algorandfoundation/algokit-utils-ts/blob/main/src/transaction.ts#L27) +[src/transaction/transaction.ts:27](https://github.com/algorandfoundation/algokit-utils-ts/blob/main/src/transaction/transaction.ts#L27) ## Functions @@ -208,7 +233,7 @@ algokit.bulkOptOut({ account: account, assetIds: [12345, 67890] }, algod) #### Defined in -[src/asset.ts:236](https://github.com/algorandfoundation/algokit-utils-ts/blob/main/src/asset.ts#L236) +[src/asset.ts:237](https://github.com/algorandfoundation/algokit-utils-ts/blob/main/src/asset.ts#L237) ___ @@ -311,7 +336,7 @@ the estimated rate. | Name | Type | Description | | :------ | :------ | :------ | -| `transaction` | `SuggestedParams` \| `Transaction` | The transaction to cap or suggested params object about to be used to create a transaction | +| `transaction` | `Transaction` \| `SuggestedParams` | The transaction to cap or suggested params object about to be used to create a transaction | | `maxAcceptableFee` | [`AlgoAmount`](../classes/types_amount.AlgoAmount.md) | The maximum acceptable fee to pay | #### Returns @@ -320,7 +345,7 @@ the estimated rate. #### Defined in -[src/transaction.ts:488](https://github.com/algorandfoundation/algokit-utils-ts/blob/main/src/transaction.ts#L488) +[src/transaction/transaction.ts:757](https://github.com/algorandfoundation/algokit-utils-ts/blob/main/src/transaction/transaction.ts#L757) ___ @@ -359,7 +384,7 @@ Allows for control of fees on a `Transaction` or `SuggestedParams` object | Name | Type | | :------ | :------ | -| `T` | extends `SuggestedParams` \| `Transaction` | +| `T` | extends `Transaction` \| `SuggestedParams` | #### Parameters @@ -376,7 +401,7 @@ Allows for control of fees on a `Transaction` or `SuggestedParams` object #### Defined in -[src/transaction.ts:511](https://github.com/algorandfoundation/algokit-utils-ts/blob/main/src/transaction.ts#L511) +[src/transaction/transaction.ts:780](https://github.com/algorandfoundation/algokit-utils-ts/blob/main/src/transaction/transaction.ts#L780) ___ @@ -500,7 +525,7 @@ algokit.encodeLease(new Uint8Array([1, 2, 3])) #### Defined in -[src/transaction.ts:65](https://github.com/algorandfoundation/algokit-utils-ts/blob/main/src/transaction.ts#L65) +[src/transaction/transaction.ts:67](https://github.com/algorandfoundation/algokit-utils-ts/blob/main/src/transaction/transaction.ts#L67) ___ @@ -531,7 +556,7 @@ the transaction note ready for inclusion in a transaction #### Defined in -[src/transaction.ts:41](https://github.com/algorandfoundation/algokit-utils-ts/blob/main/src/transaction.ts#L41) +[src/transaction/transaction.ts:43](https://github.com/algorandfoundation/algokit-utils-ts/blob/main/src/transaction/transaction.ts#L43) ___ @@ -566,7 +591,7 @@ https://developer.algorand.org/docs/get-details/accounts/#minimum-balance #### Defined in -[src/transfer.ts:122](https://github.com/algorandfoundation/algokit-utils-ts/blob/main/src/transfer.ts#L122) +[src/transfer/transfer.ts:89](https://github.com/algorandfoundation/algokit-utils-ts/blob/main/src/transfer/transfer.ts#L89) ___ @@ -692,7 +717,7 @@ If that code runs against LocalNet then a wallet called `ACCOUNT` will automatic #### Defined in -[src/account.ts:97](https://github.com/algorandfoundation/algokit-utils-ts/blob/main/src/account.ts#L97) +[src/account/get-account.ts:43](https://github.com/algorandfoundation/algokit-utils-ts/blob/main/src/account/get-account.ts#L43) ▸ **getAccount**(`account`, `algod`, `kmdClient?`): `Promise`\<`Account` \| [`SigningAccount`](../classes/types_account.SigningAccount.md)\> @@ -730,7 +755,7 @@ If that code runs against LocalNet then a wallet called `ACCOUNT` will automatic #### Defined in -[src/account.ts:124](https://github.com/algorandfoundation/algokit-utils-ts/blob/main/src/account.ts#L124) +[src/account/get-account.ts:70](https://github.com/algorandfoundation/algokit-utils-ts/blob/main/src/account/get-account.ts#L70) ___ @@ -752,7 +777,7 @@ Returns the string address of an Algorand account from a base64 encoded version #### Defined in -[src/account.ts:275](https://github.com/algorandfoundation/algokit-utils-ts/blob/main/src/account.ts#L275) +[src/account/account.ts:127](https://github.com/algorandfoundation/algokit-utils-ts/blob/main/src/account/account.ts#L127) ___ @@ -774,7 +799,7 @@ Returns an account's address as a byte array #### Defined in -[src/account.ts:267](https://github.com/algorandfoundation/algokit-utils-ts/blob/main/src/account.ts#L267) +[src/account/account.ts:119](https://github.com/algorandfoundation/algokit-utils-ts/blob/main/src/account/account.ts#L119) ___ @@ -807,7 +832,7 @@ environment variables #### Defined in -[src/account.ts:303](https://github.com/algorandfoundation/algokit-utils-ts/blob/main/src/account.ts#L303) +[src/account/get-account-config-from-environment.ts:13](https://github.com/algorandfoundation/algokit-utils-ts/blob/main/src/account/get-account-config-from-environment.ts#L13) ___ @@ -831,7 +856,7 @@ Returns an algod SDK client that automatically retries on idempotent calls ```typescript // Uses process.env.ALGOD_SERVER, process.env.ALGOD_PORT and process.env.ALGOD_TOKEN - // Automatically detects if you are using a provider to switch in the right header name for ALGOD_TOKEN + // Automatically detects if you are using PureStake to switch in the right header name for ALGOD_TOKEN const algod = getAlgoClient() await algod.healthCheck().do() ``` @@ -883,7 +908,7 @@ Returns an indexer SDK client that automatically retries on idempotent calls ```typescript // Uses process.env.INDEXER_SERVER, process.env.INDEXER_PORT and process.env.INDEXER_TOKEN - // Automatically detects if you are using a provider to switch in the right header name for INDEXER_TOKEN + // Automatically detects if you are using PureStake to switch in the right header name for INDEXER_TOKEN const indexer = getAlgoIndexerClient() await indexer.makeHealthCheck().do() ``` @@ -993,7 +1018,7 @@ ___ ### getAppArgsForABICall -▸ **getAppArgsForABICall**(`args`, `from`): `Promise`\<\{ `appAccounts`: `undefined` \| `string`[] ; `appForeignApps`: `undefined` \| `number`[] = args.apps; `appForeignAssets`: `undefined` \| `number`[] = args.assets; `boxes`: `undefined` \| `BoxReference`[] ; `lease`: `undefined` \| `Uint8Array` ; `method`: `ABIMethod` ; `methodArgs`: (`string` \| `number` \| `bigint` \| `boolean` \| `Uint8Array` \| `ABIValue`[] \| `TransactionWithSigner`)[] = methodArgs; `rekeyTo`: `undefined` \| `string` ; `sender`: `string` ; `signer`: `TransactionSigner` = signer }\> +▸ **getAppArgsForABICall**(`args`, `from`): `Promise`\<\{ `appAccounts`: `undefined` \| `string`[] ; `appForeignApps`: `undefined` \| `number`[] = args.apps; `appForeignAssets`: `undefined` \| `number`[] = args.assets; `boxes`: `undefined` \| `BoxReference`[] ; `lease`: `undefined` \| `Uint8Array` ; `method`: `ABIMethod` ; `methodArgs`: (`string` \| `number` \| `bigint` \| `boolean` \| `TransactionWithSigner` \| `Uint8Array` \| `ABIValue`[])[] = methodArgs; `rekeyTo`: `undefined` \| `string` ; `sender`: `string` ; `signer`: `TransactionSigner` = signer }\> Returns the app args ready to load onto an ABI method call in `AtomicTransactionComposer` @@ -1006,7 +1031,7 @@ Returns the app args ready to load onto an ABI method call in `AtomicTransaction #### Returns -`Promise`\<\{ `appAccounts`: `undefined` \| `string`[] ; `appForeignApps`: `undefined` \| `number`[] = args.apps; `appForeignAssets`: `undefined` \| `number`[] = args.assets; `boxes`: `undefined` \| `BoxReference`[] ; `lease`: `undefined` \| `Uint8Array` ; `method`: `ABIMethod` ; `methodArgs`: (`string` \| `number` \| `bigint` \| `boolean` \| `Uint8Array` \| `ABIValue`[] \| `TransactionWithSigner`)[] = methodArgs; `rekeyTo`: `undefined` \| `string` ; `sender`: `string` ; `signer`: `TransactionSigner` = signer }\> +`Promise`\<\{ `appAccounts`: `undefined` \| `string`[] ; `appForeignApps`: `undefined` \| `number`[] = args.apps; `appForeignAssets`: `undefined` \| `number`[] = args.assets; `boxes`: `undefined` \| `BoxReference`[] ; `lease`: `undefined` \| `Uint8Array` ; `method`: `ABIMethod` ; `methodArgs`: (`string` \| `number` \| `bigint` \| `boolean` \| `TransactionWithSigner` \| `Uint8Array` \| `ABIValue`[])[] = methodArgs; `rekeyTo`: `undefined` \| `string` ; `sender`: `string` ; `signer`: `TransactionSigner` = signer }\> The parameters ready to pass into `addMethodCall` within AtomicTransactionComposer @@ -1448,7 +1473,7 @@ The array of transactions with signers #### Defined in -[src/transaction.ts:543](https://github.com/algorandfoundation/algokit-utils-ts/blob/main/src/transaction.ts#L543) +[src/transaction/transaction.ts:812](https://github.com/algorandfoundation/algokit-utils-ts/blob/main/src/transaction/transaction.ts#L812) ___ @@ -1563,7 +1588,7 @@ If running on LocalNet then it will return the default dispenser account automat #### Defined in -[src/account.ts:287](https://github.com/algorandfoundation/algokit-utils-ts/blob/main/src/account.ts#L287) +[src/account/get-dispenser-account.ts:18](https://github.com/algorandfoundation/algokit-utils-ts/blob/main/src/account/get-dispenser-account.ts#L18) ___ @@ -1614,7 +1639,7 @@ const defaultDispenserAccount = await getKmdWalletAccount(algod, #### Defined in -[src/localnet.ts:93](https://github.com/algorandfoundation/algokit-utils-ts/blob/main/src/localnet.ts#L93) +[src/localnet/get-kmd-wallet-account.ts:25](https://github.com/algorandfoundation/algokit-utils-ts/blob/main/src/localnet/get-kmd-wallet-account.ts#L25) ___ @@ -1637,7 +1662,7 @@ Returns an Algorand account with private key loaded for the default LocalNet dis #### Defined in -[src/localnet.ts:144](https://github.com/algorandfoundation/algokit-utils-ts/blob/main/src/localnet.ts#L144) +[src/localnet/get-localnet-dispenser-account.ts:13](https://github.com/algorandfoundation/algokit-utils-ts/blob/main/src/localnet/get-localnet-dispenser-account.ts#L13) ___ @@ -1671,7 +1696,7 @@ An Algorand account with private key loaded - either one that already existed in #### Defined in -[src/localnet.ts:35](https://github.com/algorandfoundation/algokit-utils-ts/blob/main/src/localnet.ts#L35) +[src/localnet/get-or-create-kmd-wallet-account.ts:29](https://github.com/algorandfoundation/algokit-utils-ts/blob/main/src/localnet/get-or-create-kmd-wallet-account.ts#L29) ___ @@ -1685,7 +1710,7 @@ Returns the public address of the given transaction sender. | Name | Type | Description | | :------ | :------ | :------ | -| `sender` | [`SendTransactionFrom`](types_transaction.md#sendtransactionfrom) | A transaction sender | +| `sender` | `string` \| [`SendTransactionFrom`](types_transaction.md#sendtransactionfrom) | A transaction sender | #### Returns @@ -1695,7 +1720,7 @@ The public address #### Defined in -[src/transaction.ts:98](https://github.com/algorandfoundation/algokit-utils-ts/blob/main/src/transaction.ts#L98) +[src/transaction/transaction.ts:100](https://github.com/algorandfoundation/algokit-utils-ts/blob/main/src/transaction/transaction.ts#L100) ___ @@ -1720,7 +1745,7 @@ A transaction signer #### Defined in -[src/transaction.ts:108](https://github.com/algorandfoundation/algokit-utils-ts/blob/main/src/transaction.ts#L108) +[src/transaction/transaction.ts:152](https://github.com/algorandfoundation/algokit-utils-ts/blob/main/src/transaction/transaction.ts#L152) ___ @@ -1781,7 +1806,7 @@ The suggested transaction parameters #### Defined in -[src/transaction.ts:534](https://github.com/algorandfoundation/algokit-utils-ts/blob/main/src/transaction.ts#L534) +[src/transaction/transaction.ts:803](https://github.com/algorandfoundation/algokit-utils-ts/blob/main/src/transaction/transaction.ts#L803) ___ @@ -1796,7 +1821,7 @@ AtomicTransactionComposer's addTransaction method. | Name | Type | Description | | :------ | :------ | :------ | -| `transaction` | `Transaction` \| [`TransactionToSign`](../interfaces/types_transaction.TransactionToSign.md) \| `Promise`\<[`SendTransactionResult`](../interfaces/types_transaction.SendTransactionResult.md)\> \| `TransactionWithSigner` | One of: A TransactionWithSigner object (returned as is), a TransactionToSign object (signer is obtained from the signer property), a Transaction object (signer is extracted from the defaultSender parameter), an async SendTransactionResult returned by one of algokit utils' helpers (signer is obtained from the defaultSender parameter) | +| `transaction` | `TransactionWithSigner` \| `Transaction` \| [`TransactionToSign`](../interfaces/types_transaction.TransactionToSign.md) \| `Promise`\<[`SendTransactionResult`](../interfaces/types_transaction.SendTransactionResult.md)\> | One of: A TransactionWithSigner object (returned as is), a TransactionToSign object (signer is obtained from the signer property), a Transaction object (signer is extracted from the defaultSender parameter), an async SendTransactionResult returned by one of algokit utils' helpers (signer is obtained from the defaultSender parameter) | | `defaultSender?` | [`SendTransactionFrom`](types_transaction.md#sendtransactionfrom) | The default sender to be used to obtain a signer where the object provided to the transaction parameter does not include a signer. | #### Returns @@ -1807,7 +1832,7 @@ A TransactionWithSigner object. #### Defined in -[src/transaction.ts:121](https://github.com/algorandfoundation/algokit-utils-ts/blob/main/src/transaction.ts#L121) +[src/transaction/transaction.ts:123](https://github.com/algorandfoundation/algokit-utils-ts/blob/main/src/transaction/transaction.ts#L123) ___ @@ -1829,7 +1854,7 @@ Returns true if the algod client is pointing to a LocalNet Algorand network #### Defined in -[src/localnet.ts:12](https://github.com/algorandfoundation/algokit-utils-ts/blob/main/src/localnet.ts#L12) +[src/localnet/is-localnet.ts:5](https://github.com/algorandfoundation/algokit-utils-ts/blob/main/src/localnet/is-localnet.ts#L5) ___ @@ -1910,7 +1935,7 @@ Looks up an account by address using Indexer. | Name | Type | Description | | :------ | :------ | :------ | -| `accountAddress` | `string` | - | +| `accountAddress` | `string` | The address of the account to look up | | `indexer` | `default` | An indexer client | #### Returns @@ -2019,7 +2044,7 @@ This is a wrapper around algosdk.mnemonicToSecretKey to provide a more friendly/ #### Defined in -[src/account.ts:52](https://github.com/algorandfoundation/algokit-utils-ts/blob/main/src/account.ts#L52) +[src/account/mnemonic-account.ts:11](https://github.com/algorandfoundation/algokit-utils-ts/blob/main/src/account/mnemonic-account.ts#L11) ___ @@ -2065,7 +2090,7 @@ If not running against LocalNet then it will use proces.env.MY_ACCOUNT_MNEMONIC #### Defined in -[src/account.ts:235](https://github.com/algorandfoundation/algokit-utils-ts/blob/main/src/account.ts#L235) +[src/account/account.ts:87](https://github.com/algorandfoundation/algokit-utils-ts/blob/main/src/account/account.ts#L87) ___ @@ -2090,7 +2115,7 @@ A multisig account wrapper #### Defined in -[src/account.ts:21](https://github.com/algorandfoundation/algokit-utils-ts/blob/main/src/account.ts#L21) +[src/account/account.ts:23](https://github.com/algorandfoundation/algokit-utils-ts/blob/main/src/account/account.ts#L23) ___ @@ -2116,7 +2141,7 @@ The dryrun result #### Defined in -[src/transaction.ts:339](https://github.com/algorandfoundation/algokit-utils-ts/blob/main/src/transaction.ts#L339) +[src/transaction/transaction.ts:637](https://github.com/algorandfoundation/algokit-utils-ts/blob/main/src/transaction/transaction.ts#L637) ___ @@ -2141,7 +2166,7 @@ The simulation result, which includes various details about how the transactions #### Defined in -[src/transaction.ts:354](https://github.com/algorandfoundation/algokit-utils-ts/blob/main/src/transaction.ts#L354) +[src/transaction/perform-atomic-transaction-composer-simulate.ts:13](https://github.com/algorandfoundation/algokit-utils-ts/blob/main/src/transaction/perform-atomic-transaction-composer-simulate.ts#L13) ___ @@ -2201,6 +2226,56 @@ The information about the compiled code ___ +### persistSourceMaps + +▸ **persistSourceMaps**(`param0`): `Promise`\<`void`\> + +This function persists the source maps for the given sources. + +#### Parameters + +| Name | Type | Description | +| :------ | :------ | :------ | +| `param0` | [`PersistSourceMapsParams`](../interfaces/types_debugging.PersistSourceMapsParams.md) | The parameters to define the persistence | + +#### Returns + +`Promise`\<`void`\> + +A promise that resolves when the source maps have been persisted. + +#### Defined in + +[src/debugging/debugging.ts:131](https://github.com/algorandfoundation/algokit-utils-ts/blob/main/src/debugging/debugging.ts#L131) + +___ + +### populateAppCallResources + +▸ **populateAppCallResources**(`atc`, `algod`): `Promise`\<`AtomicTransactionComposer`\> + +Take an existing Atomic Transaction Composer and return a new one with the required + app call resources packed into it + +#### Parameters + +| Name | Type | Description | +| :------ | :------ | :------ | +| `atc` | `AtomicTransactionComposer` | The ATC containing the txn group | +| `algod` | `default` | The algod client to use for the simulation | + +#### Returns + +`Promise`\<`AtomicTransactionComposer`\> + +A new ATC with the resources packed into the transactions + +#### Defined in + +[src/transaction/transaction.ts:288](https://github.com/algorandfoundation/algokit-utils-ts/blob/main/src/transaction/transaction.ts#L288) + +___ + ### randomAccount ▸ **randomAccount**(): `Account` @@ -2215,7 +2290,7 @@ This is a wrapper around algosdk.generateAccount to provide a more friendly/obvi #### Defined in -[src/account.ts:62](https://github.com/algorandfoundation/algokit-utils-ts/blob/main/src/account.ts#L62) +[src/account/account.ts:52](https://github.com/algorandfoundation/algokit-utils-ts/blob/main/src/account/account.ts#L52) ___ @@ -2248,7 +2323,7 @@ await algokit.rekeyAccount({ from, rekeyTo }, algod) #### Defined in -[src/transfer.ts:217](https://github.com/algorandfoundation/algokit-utils-ts/blob/main/src/transfer.ts#L217) +[src/transfer/transfer.ts:182](https://github.com/algorandfoundation/algokit-utils-ts/blob/main/src/transfer/transfer.ts#L182) ___ @@ -2273,7 +2348,7 @@ The SigningAccount wrapper #### Defined in -[src/account.ts:31](https://github.com/algorandfoundation/algokit-utils-ts/blob/main/src/account.ts#L31) +[src/account/account.ts:33](https://github.com/algorandfoundation/algokit-utils-ts/blob/main/src/account/account.ts#L33) ___ @@ -2357,7 +2432,7 @@ An object with transaction IDs, transactions, group transaction ID (`groupTransa #### Defined in -[src/transaction.ts:228](https://github.com/algorandfoundation/algokit-utils-ts/blob/main/src/transaction.ts#L228) +[src/transaction/transaction.ts:509](https://github.com/algorandfoundation/algokit-utils-ts/blob/main/src/transaction/transaction.ts#L509) ___ @@ -2382,7 +2457,7 @@ An object with transaction IDs, transactions, group transaction ID (`groupTransa #### Defined in -[src/transaction.ts:386](https://github.com/algorandfoundation/algokit-utils-ts/blob/main/src/transaction.ts#L386) +[src/transaction/transaction.ts:655](https://github.com/algorandfoundation/algokit-utils-ts/blob/main/src/transaction/transaction.ts#L655) ___ @@ -2410,7 +2485,7 @@ An object with transaction (`transaction`) and (if `skipWaiting` is `false` or ` #### Defined in -[src/transaction.ts:184](https://github.com/algorandfoundation/algokit-utils-ts/blob/main/src/transaction.ts#L184) +[src/transaction/transaction.ts:186](https://github.com/algorandfoundation/algokit-utils-ts/blob/main/src/transaction/transaction.ts#L186) ___ @@ -2435,7 +2510,44 @@ The signed transaction as a `Uint8Array` #### Defined in -[src/transaction.ts:164](https://github.com/algorandfoundation/algokit-utils-ts/blob/main/src/transaction.ts#L164) +[src/transaction/transaction.ts:166](https://github.com/algorandfoundation/algokit-utils-ts/blob/main/src/transaction/transaction.ts#L166) + +___ + +### simulateAndPersistResponse + +▸ **simulateAndPersistResponse**(`param0`): `Promise`\<`SimulateResponse`\> + +This function simulates the atomic transactions using the provided `AtomicTransactionComposer` object and `Algodv2` object, +and persists the simulation response to an AlgoKit AVM Debugger compliant JSON file. + +#### Parameters + +| Name | Type | Description | +| :------ | :------ | :------ | +| `param0` | [`SimulateAndPersistResponseParams`](../interfaces/types_debugging.SimulateAndPersistResponseParams.md) | The parameters to control the simulation and persistence. | + +#### Returns + +`Promise`\<`SimulateResponse`\> + +The simulation result, which includes various details about how the transactions would be processed. + +**`Example`** + +```ts +const atc = new AtomicTransactionComposer(); +const algod = new algosdk.Algodv2(token, server, port); +const projectRoot = '/path/to/project'; +const bufferSizeMb = 10; + +const result = await simulateAndPersistResponse({ atc, projectRoot, algod, bufferSizeMb }); +console.log(result); +``` + +#### Defined in + +[src/debugging/simulate-and-persist-response.ts:33](https://github.com/algorandfoundation/algokit-utils-ts/blob/main/src/debugging/simulate-and-persist-response.ts#L33) ___ @@ -2506,7 +2618,7 @@ The SigningAccount wrapper #### Defined in -[src/account.ts:41](https://github.com/algorandfoundation/algokit-utils-ts/blob/main/src/account.ts#L41) +[src/account/account.ts:43](https://github.com/algorandfoundation/algokit-utils-ts/blob/main/src/account/account.ts#L43) ___ @@ -2537,7 +2649,7 @@ await algokit.transferAlgos({ from, to, amount: algokit.algos(1) }, algod) #### Defined in -[src/transfer.ts:85](https://github.com/algorandfoundation/algokit-utils-ts/blob/main/src/transfer.ts#L85) +[src/transfer/transfer-algos.ts:19](https://github.com/algorandfoundation/algokit-utils-ts/blob/main/src/transfer/transfer-algos.ts#L19) ___ @@ -2568,7 +2680,7 @@ await algokit.transferAsset({ from, to, assetId, amount }, algod) #### Defined in -[src/transfer.ts:173](https://github.com/algorandfoundation/algokit-utils-ts/blob/main/src/transfer.ts#L173) +[src/transfer/transfer.ts:140](https://github.com/algorandfoundation/algokit-utils-ts/blob/main/src/transfer/transfer.ts#L140) ___ @@ -2624,4 +2736,4 @@ Throws an error if the transaction is not confirmed or rejected in the next `tim #### Defined in -[src/transaction.ts:431](https://github.com/algorandfoundation/algokit-utils-ts/blob/main/src/transaction.ts#L431) +[src/transaction/transaction.ts:700](https://github.com/algorandfoundation/algokit-utils-ts/blob/main/src/transaction/transaction.ts#L700) diff --git a/docs/get-details/algokit/utils/ts/code/modules/testing.md b/docs/get-details/algokit/utils/ts/code/modules/testing.md index 12a276f7..c5431a0a 100644 --- a/docs/get-details/algokit/utils/ts/code/modules/testing.md +++ b/docs/get-details/algokit/utils/ts/code/modules/testing.md @@ -86,7 +86,7 @@ test('My test', async () => { #### Defined in -[src/testing/fixtures/algorand-fixture.ts:36](https://github.com/algorandfoundation/algokit-utils-ts/blob/main/src/testing/fixtures/algorand-fixture.ts#L36) +[src/testing/fixtures/algorand-fixture.ts:38](https://github.com/algorandfoundation/algokit-utils-ts/blob/main/src/testing/fixtures/algorand-fixture.ts#L38) ▸ **algorandFixture**(`fixtureConfig`, `config`): [`AlgorandFixture`](../interfaces/types_testing.AlgorandFixture.md) @@ -124,7 +124,7 @@ test('My test', async () => { #### Defined in -[src/testing/fixtures/algorand-fixture.ts:61](https://github.com/algorandfoundation/algokit-utils-ts/blob/main/src/testing/fixtures/algorand-fixture.ts#L61) +[src/testing/fixtures/algorand-fixture.ts:63](https://github.com/algorandfoundation/algokit-utils-ts/blob/main/src/testing/fixtures/algorand-fixture.ts#L63) ___ @@ -153,7 +153,7 @@ The account, with private key loaded #### Defined in -[src/testing/account.ts:20](https://github.com/algorandfoundation/algokit-utils-ts/blob/main/src/testing/account.ts#L20) +[src/testing/account.ts:19](https://github.com/algorandfoundation/algokit-utils-ts/blob/main/src/testing/account.ts#L19) ___ diff --git a/docs/get-details/algokit/utils/ts/code/modules/types_indexer.md b/docs/get-details/algokit/utils/ts/code/modules/types_indexer.md index dcf93313..2c5c9a40 100644 --- a/docs/get-details/algokit/utils/ts/code/modules/types_indexer.md +++ b/docs/get-details/algokit/utils/ts/code/modules/types_indexer.md @@ -33,9 +33,11 @@ - [EvalDelta](../interfaces/types_indexer.EvalDelta.md) - [KeyRegistrationTransactionResult](../interfaces/types_indexer.KeyRegistrationTransactionResult.md) - [LogicTransactionSignature](../interfaces/types_indexer.LogicTransactionSignature.md) +- [MerkleArrayProof](../interfaces/types_indexer.MerkleArrayProof.md) - [MultisigTransactionSignature](../interfaces/types_indexer.MultisigTransactionSignature.md) - [MultisigTransactionSubSignature](../interfaces/types_indexer.MultisigTransactionSubSignature.md) - [PaymentTransactionResult](../interfaces/types_indexer.PaymentTransactionResult.md) +- [StateProofTransactionResult](../interfaces/types_indexer.StateProofTransactionResult.md) - [StateSchema](../interfaces/types_indexer.StateSchema.md) - [TransactionLookupResult](../interfaces/types_indexer.TransactionLookupResult.md) - [TransactionResult](../interfaces/types_indexer.TransactionResult.md) diff --git a/docs/get-details/algokit/utils/ts/code/modules/types_transaction.md b/docs/get-details/algokit/utils/ts/code/modules/types_transaction.md index 33174f22..db69bdf8 100644 --- a/docs/get-details/algokit/utils/ts/code/modules/types_transaction.md +++ b/docs/get-details/algokit/utils/ts/code/modules/types_transaction.md @@ -53,7 +53,7 @@ many types of accounts, including: #### Defined in -[src/types/transaction.ts:98](https://github.com/algorandfoundation/algokit-utils-ts/blob/main/src/types/transaction.ts#L98) +[src/types/transaction.ts:100](https://github.com/algorandfoundation/algokit-utils-ts/blob/main/src/types/transaction.ts#L100) ___ diff --git a/docs/get-details/crust.md b/docs/get-details/crust.md index e0890f01..09c22419 100644 --- a/docs/get-details/crust.md +++ b/docs/get-details/crust.md @@ -1,7 +1,7 @@ title: IPFS Pinning With Crust ## IPFS -Algorand offers [various ways to store data in contracts](docs/get-details/dapps/smart-contracts/apps/state.md), but there are still many use cases where storing the data off-chain makes more sense. This is paticularly true when the data is large and not used directly on-chain (for example, NFT metadata and images). A common solution for off-chain data storage is the InterPlanetary File System (IPFS) protocol. In short, IPFS is a peer-to-peer file sharing protocol. For more information on IPFS, see https://docs.ipfs.tech/concepts/faq/. +Algorand offers [various ways to store data in contracts](../dapps/smart-contracts/apps/state/), but there are still many use cases where storing the data off-chain makes more sense. This is paticularly true when the data is large and not used directly on-chain (for example, NFT metadata and images). A common solution for off-chain data storage is the InterPlanetary File System (IPFS) protocol. In short, IPFS is a peer-to-peer file sharing protocol. For more information on IPFS, see https://docs.ipfs.tech/concepts/faq/. In order to share files via IPFS, one must pin a file on the network. Pinning a file means assigning it a unique Content Identifier (CID) and making it availible to download. It is common for developers to use a pinning service like Pinata, web3.storage, or nft.storage. While these services do indeed pin the file on IPFS, they are still using centralized servers to do so. This means those using these services are dependend on them to keep running them and are locked into their pricing model. @@ -153,4 +153,4 @@ async function placeOrder( #### Full Examples -To see the full scripts that use the above functions go to https://github.com/algorand-devrel/crust-examples \ No newline at end of file +To see the full scripts that use the above functions go to https://github.com/algorand-devrel/crust-examples diff --git a/docs/get-started/algokit.md b/docs/get-started/algokit.md index 2b22f130..96b7610b 100644 --- a/docs/get-started/algokit.md +++ b/docs/get-started/algokit.md @@ -108,7 +108,7 @@ algokit, version 1.5.0 ## Start a LocalNet -AlgoKit supports using a [local version of the Algorand blockchain](../features/localnet.md). To start an instance of this LocalNet run the following command from the terminal: +AlgoKit supports using a [local version of the Algorand blockchain](../../get-details/algokit/features/localnet/). To start an instance of this LocalNet run the following command from the terminal: ```shell algokit localnet start diff --git a/scripts/algokit-docs.sh b/scripts/algokit-docs.sh old mode 100644 new mode 100755 diff --git a/scripts/algokit-utils.py b/scripts/algokit-utils.py old mode 100644 new mode 100755