This is page 31 of 74. Use http://codebase.md/goplausible/algorand-mcp?lines=false&page={x} to view the full context.
# Directory Structure
```
├── .gitignore
├── CONTRIBUTING.md
├── LICENSE
├── llms-install.md
├── llms.txt
├── package.json
├── packages
│ ├── client
│ │ ├── .env.example
│ │ ├── package.json
│ │ ├── README.md
│ │ ├── src
│ │ │ ├── env.ts
│ │ │ ├── index.ts
│ │ │ └── LocalWallet.ts
│ │ └── tsconfig.json
│ └── server
│ ├── .env.example
│ ├── API specs
│ │ ├── algod_api.json
│ │ ├── indexer_api.json
│ │ ├── mcp.json
│ │ ├── nfd_api.json
│ │ ├── ultrade_api.json
│ │ ├── vestige_api.json
│ │ └── vestige_free_api.json
│ ├── Dockerfile
│ ├── jest.config.js
│ ├── package.json
│ ├── README.md
│ ├── smithery.yaml
│ ├── src
│ │ ├── algorand-client.ts
│ │ ├── env.ts
│ │ ├── index.ts
│ │ ├── resources
│ │ │ ├── index.ts
│ │ │ ├── knowledge
│ │ │ │ ├── ARCs.txt
│ │ │ │ ├── developers-algokit-architecture-decisions.txt
│ │ │ │ ├── developers-algokit-cli.txt
│ │ │ │ ├── developers-algokit-utils-python.txt
│ │ │ │ ├── developers-algokit-utils-typescript.txt
│ │ │ │ ├── developers-clis.txt
│ │ │ │ ├── developers-details.txt
│ │ │ │ ├── developers-liquid-auth.txt
│ │ │ │ ├── developers-nodes.txt
│ │ │ │ ├── developers-puya.txt
│ │ │ │ ├── developers-python.txt
│ │ │ │ ├── developers-sdks-js.txt
│ │ │ │ ├── developers-sdks-python.txt
│ │ │ │ ├── developers-tealscript.txt
│ │ │ │ ├── developers.txt
│ │ │ │ ├── index.ts
│ │ │ │ ├── taxonomy
│ │ │ │ │ ├── algokit-cli:README.md
│ │ │ │ │ ├── algokit:cli:algokit.md
│ │ │ │ │ ├── algokit:cli:architecture-decisions:2022-11-14_sandbox-approach.md
│ │ │ │ │ ├── algokit:cli:architecture-decisions:2022-11-22_beaker-testing-strategy.md
│ │ │ │ │ ├── algokit:cli:architecture-decisions:2023-01-11_beaker_productionisation_review.md
│ │ │ │ │ ├── algokit:cli:architecture-decisions:2023-01-11_brew_install.md
│ │ │ │ │ ├── algokit:cli:architecture-decisions:2023-01-12_smart-contract-deployment.md
│ │ │ │ │ ├── algokit:cli:architecture-decisions:2023-06-06_frontend-templates.md
│ │ │ │ │ ├── algokit:cli:architecture-decisions:2023-07-19_advanced_generate_command.md
│ │ │ │ │ ├── algokit:cli:architecture-decisions:2024-01-13_native_binaries.md
│ │ │ │ │ ├── algokit:cli:architecture-decisions:2024-01-23_init-wizard-v2.md
│ │ │ │ │ ├── algokit:cli:architecture-decisions:2024-01-31_binary_distribution.md
│ │ │ │ │ ├── algokit:cli:architecture-decisions:2024-03-06_local_dev_ui_packaging.md
│ │ │ │ │ ├── algokit:cli:articles:output_stability.md
│ │ │ │ │ ├── algokit:cli:cli:index.md
│ │ │ │ │ ├── algokit:cli:features:compile.md
│ │ │ │ │ ├── algokit:cli:features:completions.md
│ │ │ │ │ ├── algokit:cli:features:config.md
│ │ │ │ │ ├── algokit:cli:features:dispenser.md
│ │ │ │ │ ├── algokit:cli:features:doctor.md
│ │ │ │ │ ├── algokit:cli:features:explore.md
│ │ │ │ │ ├── algokit:cli:features:generate.md
│ │ │ │ │ ├── algokit:cli:features:goal.md
│ │ │ │ │ ├── algokit:cli:features:init.md
│ │ │ │ │ ├── algokit:cli:features:localnet.md
│ │ │ │ │ ├── algokit:cli:features:project:bootstrap.md
│ │ │ │ │ ├── algokit:cli:features:project:deploy.md
│ │ │ │ │ ├── algokit:cli:features:project:link.md
│ │ │ │ │ ├── algokit:cli:features:project:list.md
│ │ │ │ │ ├── algokit:cli:features:project:run.md
│ │ │ │ │ ├── algokit:cli:features:project.md
│ │ │ │ │ ├── algokit:cli:features:tasks:analyze.md
│ │ │ │ │ ├── algokit:cli:features:tasks:ipfs.md
│ │ │ │ │ ├── algokit:cli:features:tasks:mint.md
│ │ │ │ │ ├── algokit:cli:features:tasks:nfd.md
│ │ │ │ │ ├── algokit:cli:features:tasks:opt.md
│ │ │ │ │ ├── algokit:cli:features:tasks:send.md
│ │ │ │ │ ├── algokit:cli:features:tasks:sign.md
│ │ │ │ │ ├── algokit:cli:features:tasks:transfer.md
│ │ │ │ │ ├── algokit:cli:features:tasks:vanity_address.md
│ │ │ │ │ ├── algokit:cli:features:tasks:wallet.md
│ │ │ │ │ ├── algokit:cli:features:tasks.md
│ │ │ │ │ ├── algokit:cli:tutorials:algokit-template.md
│ │ │ │ │ ├── algokit:cli:tutorials:intro.md
│ │ │ │ │ ├── algokit:cli:tutorials:smart-contracts.md
│ │ │ │ │ ├── algokit:docs:testnet_api.md
│ │ │ │ │ ├── algokit:lora:README.md
│ │ │ │ │ ├── algokit:README.md
│ │ │ │ │ ├── algokit:utils:python:markdown:apidocs:algokit_utils:algokit_utils.md
│ │ │ │ │ ├── algokit:utils:python:markdown:capabilities:account.md
│ │ │ │ │ ├── algokit:utils:python:markdown:capabilities:app-client.md
│ │ │ │ │ ├── algokit:utils:python:markdown:capabilities:app-deploy.md
│ │ │ │ │ ├── algokit:utils:python:markdown:capabilities:client.md
│ │ │ │ │ ├── algokit:utils:python:markdown:capabilities:debugger.md
│ │ │ │ │ ├── algokit:utils:python:markdown:capabilities:dispenser-client.md
│ │ │ │ │ ├── algokit:utils:python:markdown:capabilities:transfer.md
│ │ │ │ │ ├── algokit:utils:python:markdown:index.md
│ │ │ │ │ ├── algokit:utils:python:README.md
│ │ │ │ │ ├── algokit:utils:python:source:capabilities:account.md
│ │ │ │ │ ├── algokit:utils:python:source:capabilities:app-client.md
│ │ │ │ │ ├── algokit:utils:python:source:capabilities:app-deploy.md
│ │ │ │ │ ├── algokit:utils:python:source:capabilities:client.md
│ │ │ │ │ ├── algokit:utils:python:source:capabilities:debugger.md
│ │ │ │ │ ├── algokit:utils:python:source:capabilities:dispenser-client.md
│ │ │ │ │ ├── algokit:utils:python:source:capabilities:transfer.md
│ │ │ │ │ ├── algokit:utils:python:source:index.md
│ │ │ │ │ ├── algokit:utils:typescript:capabilities:account.md
│ │ │ │ │ ├── algokit:utils:typescript:capabilities:algorand-client.md
│ │ │ │ │ ├── algokit:utils:typescript:capabilities:amount.md
│ │ │ │ │ ├── algokit:utils:typescript:capabilities:app-client.md
│ │ │ │ │ ├── algokit:utils:typescript:capabilities:app-deploy.md
│ │ │ │ │ ├── algokit:utils:typescript:capabilities:app.md
│ │ │ │ │ ├── algokit:utils:typescript:capabilities:asset.md
│ │ │ │ │ ├── algokit:utils:typescript:capabilities:client.md
│ │ │ │ │ ├── algokit:utils:typescript:capabilities:debugging.md
│ │ │ │ │ ├── algokit:utils:typescript:capabilities:dispenser-client.md
│ │ │ │ │ ├── algokit:utils:typescript:capabilities:event-emitter.md
│ │ │ │ │ ├── algokit:utils:typescript:capabilities:indexer.md
│ │ │ │ │ ├── algokit:utils:typescript:capabilities:testing.md
│ │ │ │ │ ├── algokit:utils:typescript:capabilities:transaction-composer.md
│ │ │ │ │ ├── algokit:utils:typescript:capabilities:transaction.md
│ │ │ │ │ ├── algokit:utils:typescript:capabilities:transfer.md
│ │ │ │ │ ├── algokit:utils:typescript:capabilities:typed-app-clients.md
│ │ │ │ │ ├── algokit:utils:typescript:code:classes:testing.TestLogger.md
│ │ │ │ │ ├── algokit:utils:typescript:code:classes:testing.TransactionLogger.md
│ │ │ │ │ ├── algokit:utils:typescript:code:classes:types_account_manager.AccountManager.md
│ │ │ │ │ ├── algokit:utils:typescript:code:classes:types_account.MultisigAccount.md
│ │ │ │ │ ├── algokit:utils:typescript:code:classes:types_account.SigningAccount.md
│ │ │ │ │ ├── algokit:utils:typescript:code:classes:types_algo_http_client_with_retry.AlgoHttpClientWithRetry.md
│ │ │ │ │ ├── algokit:utils:typescript:code:classes:types_algorand_client_transaction_creator.AlgorandClientTransactionCreator.md
│ │ │ │ │ ├── algokit:utils:typescript:code:classes:types_algorand_client_transaction_sender.AlgorandClientTransactionSender.md
│ │ │ │ │ ├── algokit:utils:typescript:code:classes:types_algorand_client.AlgorandClient.md
│ │ │ │ │ ├── algokit:utils:typescript:code:classes:types_amount.AlgoAmount.md
│ │ │ │ │ ├── algokit:utils:typescript:code:classes:types_app_arc56.Arc56Method.md
│ │ │ │ │ ├── algokit:utils:typescript:code:classes:types_app_client.AppClient.md
│ │ │ │ │ ├── algokit:utils:typescript:code:classes:types_app_client.ApplicationClient.md
│ │ │ │ │ ├── algokit:utils:typescript:code:classes:types_app_deployer.AppDeployer.md
│ │ │ │ │ ├── algokit:utils:typescript:code:classes:types_app_factory.AppFactory.md
│ │ │ │ │ ├── algokit:utils:typescript:code:classes:types_app_manager.AppManager.md
│ │ │ │ │ ├── algokit:utils:typescript:code:classes:types_asset_manager.AssetManager.md
│ │ │ │ │ ├── algokit:utils:typescript:code:classes:types_async_event_emitter.AsyncEventEmitter.md
│ │ │ │ │ ├── algokit:utils:typescript:code:classes:types_client_manager.ClientManager.md
│ │ │ │ │ ├── algokit:utils:typescript:code:classes:types_composer.TransactionComposer.md
│ │ │ │ │ ├── algokit:utils:typescript:code:classes:types_config.UpdatableConfig.md
│ │ │ │ │ ├── algokit:utils:typescript:code:classes:types_dispenser_client.TestNetDispenserApiClient.md
│ │ │ │ │ ├── algokit:utils:typescript:code:classes:types_kmd_account_manager.KmdAccountManager.md
│ │ │ │ │ ├── algokit:utils:typescript:code:classes:types_logic_error.LogicError.md
│ │ │ │ │ ├── algokit:utils:typescript:code:enums:types_app.OnSchemaBreak.md
│ │ │ │ │ ├── algokit:utils:typescript:code:enums:types_app.OnUpdate.md
│ │ │ │ │ ├── algokit:utils:typescript:code:enums:types_indexer.AccountStatus.md
│ │ │ │ │ ├── algokit:utils:typescript:code:enums:types_indexer.ApplicationOnComplete.md
│ │ │ │ │ ├── algokit:utils:typescript:code:enums:types_indexer.SignatureType.md
│ │ │ │ │ ├── algokit:utils:typescript:code:enums:types_lifecycle_events.EventType.md
│ │ │ │ │ ├── algokit:utils:typescript:code:interfaces:types_account_manager.EnsureFundedResult.md
│ │ │ │ │ ├── algokit:utils:typescript:code:interfaces:types_account.AccountConfig.md
│ │ │ │ │ ├── algokit:utils:typescript:code:interfaces:types_account.TransactionSignerAccount.md
│ │ │ │ │ ├── algokit:utils:typescript:code:interfaces:types_algorand_client_interface.AlgorandClientInterface.md
│ │ │ │ │ ├── algokit:utils:typescript:code:interfaces:types_app_arc56.Arc56Contract.md
│ │ │ │ │ ├── algokit:utils:typescript:code:interfaces:types_app_arc56.Event.md
│ │ │ │ │ ├── algokit:utils:typescript:code:interfaces:types_app_arc56.Method.md
│ │ │ │ │ ├── algokit:utils:typescript:code:interfaces:types_app_arc56.ProgramSourceInfo.md
│ │ │ │ │ ├── algokit:utils:typescript:code:interfaces:types_app_arc56.StorageKey.md
│ │ │ │ │ ├── algokit:utils:typescript:code:interfaces:types_app_arc56.StorageMap.md
│ │ │ │ │ ├── algokit:utils:typescript:code:interfaces:types_app_arc56.StructField.md
│ │ │ │ │ ├── algokit:utils:typescript:code:interfaces:types_app_client.AppClientCallABIArgs.md
│ │ │ │ │ ├── algokit:utils:typescript:code:interfaces:types_app_client.AppClientCallCoreParams.md
│ │ │ │ │ ├── algokit:utils:typescript:code:interfaces:types_app_client.AppClientCompilationParams.md
│ │ │ │ │ ├── algokit:utils:typescript:code:interfaces:types_app_client.AppClientCompilationResult.md
│ │ │ │ │ ├── algokit:utils:typescript:code:interfaces:types_app_client.AppClientDeployCallInterfaceParams.md
│ │ │ │ │ ├── algokit:utils:typescript:code:interfaces:types_app_client.AppClientDeployCoreParams.md
│ │ │ │ │ ├── algokit:utils:typescript:code:interfaces:types_app_client.AppClientDeployParams.md
│ │ │ │ │ ├── algokit:utils:typescript:code:interfaces:types_app_client.AppClientParams.md
│ │ │ │ │ ├── algokit:utils:typescript:code:interfaces:types_app_client.AppSourceMaps.md
│ │ │ │ │ ├── algokit:utils:typescript:code:interfaces:types_app_client.FundAppAccountParams.md
│ │ │ │ │ ├── algokit:utils:typescript:code:interfaces:types_app_client.ResolveAppById.md
│ │ │ │ │ ├── algokit:utils:typescript:code:interfaces:types_app_client.ResolveAppByIdBase.md
│ │ │ │ │ ├── algokit:utils:typescript:code:interfaces:types_app_client.SourceMapExport.md
│ │ │ │ │ ├── algokit:utils:typescript:code:interfaces:types_app_deployer.AppLookup.md
│ │ │ │ │ ├── algokit:utils:typescript:code:interfaces:types_app_deployer.AppMetadata.md
│ │ │ │ │ ├── algokit:utils:typescript:code:interfaces:types_app_factory.AppFactoryParams.md
│ │ │ │ │ ├── algokit:utils:typescript:code:interfaces:types_app_manager.AppInformation.md
│ │ │ │ │ ├── algokit:utils:typescript:code:interfaces:types_app_manager.BoxReference.md
│ │ │ │ │ ├── algokit:utils:typescript:code:interfaces:types_app_manager.BoxValueRequestParams.md
│ │ │ │ │ ├── algokit:utils:typescript:code:interfaces:types_app_manager.BoxValuesRequestParams.md
│ │ │ │ │ ├── algokit:utils:typescript:code:interfaces:types_app_spec.AppSources.md
│ │ │ │ │ ├── algokit:utils:typescript:code:interfaces:types_app_spec.AppSpec.md
│ │ │ │ │ ├── algokit:utils:typescript:code:interfaces:types_app_spec.CallConfig.md
│ │ │ │ │ ├── algokit:utils:typescript:code:interfaces:types_app_spec.DeclaredSchemaValueSpec.md
│ │ │ │ │ ├── algokit:utils:typescript:code:interfaces:types_app_spec.Hint.md
│ │ │ │ │ ├── algokit:utils:typescript:code:interfaces:types_app_spec.ReservedSchemaValueSpec.md
│ │ │ │ │ ├── algokit:utils:typescript:code:interfaces:types_app_spec.Schema.md
│ │ │ │ │ ├── algokit:utils:typescript:code:interfaces:types_app_spec.SchemaSpec.md
│ │ │ │ │ ├── algokit:utils:typescript:code:interfaces:types_app_spec.StateSchemaSpec.md
│ │ │ │ │ ├── algokit:utils:typescript:code:interfaces:types_app_spec.Struct.md
│ │ │ │ │ ├── algokit:utils:typescript:code:interfaces:types_app.AppCallParams.md
│ │ │ │ │ ├── algokit:utils:typescript:code:interfaces:types_app.AppCallTransactionResultOfType.md
│ │ │ │ │ ├── algokit:utils:typescript:code:interfaces:types_app.AppCompilationResult.md
│ │ │ │ │ ├── algokit:utils:typescript:code:interfaces:types_app.AppDeploymentParams.md
│ │ │ │ │ ├── algokit:utils:typescript:code:interfaces:types_app.AppDeployMetadata.md
│ │ │ │ │ ├── algokit:utils:typescript:code:interfaces:types_app.AppLookup.md
│ │ │ │ │ ├── algokit:utils:typescript:code:interfaces:types_app.AppMetadata.md
│ │ │ │ │ ├── algokit:utils:typescript:code:interfaces:types_app.AppReference.md
│ │ │ │ │ ├── algokit:utils:typescript:code:interfaces:types_app.AppState.md
│ │ │ │ │ ├── algokit:utils:typescript:code:interfaces:types_app.AppStorageSchema.md
│ │ │ │ │ ├── algokit:utils:typescript:code:interfaces:types_app.BoxName.md
│ │ │ │ │ ├── algokit:utils:typescript:code:interfaces:types_app.BoxReference.md
│ │ │ │ │ ├── algokit:utils:typescript:code:interfaces:types_app.BoxValueRequestParams.md
│ │ │ │ │ ├── algokit:utils:typescript:code:interfaces:types_app.BoxValuesRequestParams.md
│ │ │ │ │ ├── algokit:utils:typescript:code:interfaces:types_app.CompiledTeal.md
│ │ │ │ │ ├── algokit:utils:typescript:code:interfaces:types_app.CoreAppCallArgs.md
│ │ │ │ │ ├── algokit:utils:typescript:code:interfaces:types_app.CreateAppParams.md
│ │ │ │ │ ├── algokit:utils:typescript:code:interfaces:types_app.RawAppCallArgs.md
│ │ │ │ │ ├── algokit:utils:typescript:code:interfaces:types_app.TealTemplateParams.md
│ │ │ │ │ ├── algokit:utils:typescript:code:interfaces:types_app.UpdateAppParams.md
│ │ │ │ │ ├── algokit:utils:typescript:code:interfaces:types_asset_manager.AssetInformation.md
│ │ │ │ │ ├── algokit:utils:typescript:code:interfaces:types_asset_manager.BulkAssetOptInOutResult.md
│ │ │ │ │ ├── algokit:utils:typescript:code:interfaces:types_asset.AssetBulkOptInOutParams.md
│ │ │ │ │ ├── algokit:utils:typescript:code:interfaces:types_asset.AssetOptInParams.md
│ │ │ │ │ ├── algokit:utils:typescript:code:interfaces:types_asset.AssetOptOutParams.md
│ │ │ │ │ ├── algokit:utils:typescript:code:interfaces:types_asset.CreateAssetParams.md
│ │ │ │ │ ├── algokit:utils:typescript:code:interfaces:types_client_manager.AlgoSdkClients.md
│ │ │ │ │ ├── algokit:utils:typescript:code:interfaces:types_client_manager.TypedAppClient.md
│ │ │ │ │ ├── algokit:utils:typescript:code:interfaces:types_client_manager.TypedAppFactory.md
│ │ │ │ │ ├── algokit:utils:typescript:code:interfaces:types_composer.BuiltTransactions.md
│ │ │ │ │ ├── algokit:utils:typescript:code:interfaces:types_config.Config.md
│ │ │ │ │ ├── algokit:utils:typescript:code:interfaces:types_debugging.AVMTracesEventData.md
│ │ │ │ │ ├── algokit:utils:typescript:code:interfaces:types_debugging.TealSourceDebugEventData.md
│ │ │ │ │ ├── algokit:utils:typescript:code:interfaces:types_debugging.TealSourcesDebugEventData.md
│ │ │ │ │ ├── algokit:utils:typescript:code:interfaces:types_dispenser_client.DispenserFundResponse.md
│ │ │ │ │ ├── algokit:utils:typescript:code:interfaces:types_dispenser_client.DispenserLimitResponse.md
│ │ │ │ │ ├── algokit:utils:typescript:code:interfaces:types_dispenser_client.TestNetDispenserApiClientParams.md
│ │ │ │ │ ├── algokit:utils:typescript:code:interfaces:types_indexer.LookupAssetHoldingsOptions.md
│ │ │ │ │ ├── algokit:utils:typescript:code:interfaces:types_logic_error.LogicErrorDetails.md
│ │ │ │ │ ├── algokit:utils:typescript:code:interfaces:types_network_client.AlgoClientConfig.md
│ │ │ │ │ ├── algokit:utils:typescript:code:interfaces:types_network_client.AlgoConfig.md
│ │ │ │ │ ├── algokit:utils:typescript:code:interfaces:types_network_client.NetworkDetails.md
│ │ │ │ │ ├── algokit:utils:typescript:code:interfaces:types_testing.AlgoKitLogCaptureFixture.md
│ │ │ │ │ ├── algokit:utils:typescript:code:interfaces:types_testing.AlgorandFixture.md
│ │ │ │ │ ├── algokit:utils:typescript:code:interfaces:types_testing.AlgorandFixtureConfig.md
│ │ │ │ │ ├── algokit:utils:typescript:code:interfaces:types_testing.AlgorandTestAutomationContext.md
│ │ │ │ │ ├── algokit:utils:typescript:code:interfaces:types_testing.GetTestAccountParams.md
│ │ │ │ │ ├── algokit:utils:typescript:code:interfaces:types_testing.LogSnapshotConfig.md
│ │ │ │ │ ├── algokit:utils:typescript:code:interfaces:types_transaction.AtomicTransactionComposerToSend.md
│ │ │ │ │ ├── algokit:utils:typescript:code:interfaces:types_transaction.ConfirmedTransactionResult.md
│ │ │ │ │ ├── algokit:utils:typescript:code:interfaces:types_transaction.ConfirmedTransactionResults.md
│ │ │ │ │ ├── algokit:utils:typescript:code:interfaces:types_transaction.SendAtomicTransactionComposerResults.md
│ │ │ │ │ ├── algokit:utils:typescript:code:interfaces:types_transaction.SendParams.md
│ │ │ │ │ ├── algokit:utils:typescript:code:interfaces:types_transaction.SendTransactionParams.md
│ │ │ │ │ ├── algokit:utils:typescript:code:interfaces:types_transaction.SendTransactionResult.md
│ │ │ │ │ ├── algokit:utils:typescript:code:interfaces:types_transaction.SendTransactionResults.md
│ │ │ │ │ ├── algokit:utils:typescript:code:interfaces:types_transaction.TransactionGroupToSend.md
│ │ │ │ │ ├── algokit:utils:typescript:code:interfaces:types_transaction.TransactionToSign.md
│ │ │ │ │ ├── algokit:utils:typescript:code:interfaces:types_transfer.AlgoRekeyParams.md
│ │ │ │ │ ├── algokit:utils:typescript:code:interfaces:types_transfer.AlgoTransferParams.md
│ │ │ │ │ ├── algokit:utils:typescript:code:interfaces:types_transfer.EnsureFundedParams.md
│ │ │ │ │ ├── algokit:utils:typescript:code:interfaces:types_transfer.EnsureFundedReturnType.md
│ │ │ │ │ ├── algokit:utils:typescript:code:interfaces:types_transfer.TransferAssetParams.md
│ │ │ │ │ ├── algokit:utils:typescript:code:modules:index.indexer.md
│ │ │ │ │ ├── algokit:utils:typescript:code:modules:index.md
│ │ │ │ │ ├── algokit:utils:typescript:code:modules:testing.md
│ │ │ │ │ ├── algokit:utils:typescript:code:modules:types_account_manager_spec.md
│ │ │ │ │ ├── algokit:utils:typescript:code:modules:types_account_manager.md
│ │ │ │ │ ├── algokit:utils:typescript:code:modules:types_account.md
│ │ │ │ │ ├── algokit:utils:typescript:code:modules:types_algo_http_client_with_retry.md
│ │ │ │ │ ├── algokit:utils:typescript:code:modules:types_algorand_client_asset_spec.md
│ │ │ │ │ ├── algokit:utils:typescript:code:modules:types_algorand_client_interface.md
│ │ │ │ │ ├── algokit:utils:typescript:code:modules:types_algorand_client_spec.md
│ │ │ │ │ ├── algokit:utils:typescript:code:modules:types_algorand_client_transaction_creator.md
│ │ │ │ │ ├── algokit:utils:typescript:code:modules:types_algorand_client_transaction_sender.md
│ │ │ │ │ ├── algokit:utils:typescript:code:modules:types_algorand_client_transfer_spec.md
│ │ │ │ │ ├── algokit:utils:typescript:code:modules:types_algorand_client.md
│ │ │ │ │ ├── algokit:utils:typescript:code:modules:types_amount_spec.md
│ │ │ │ │ ├── algokit:utils:typescript:code:modules:types_amount.md
│ │ │ │ │ ├── algokit:utils:typescript:code:modules:types_app_arc56.md
│ │ │ │ │ ├── algokit:utils:typescript:code:modules:types_app_client_spec.md
│ │ │ │ │ ├── algokit:utils:typescript:code:modules:types_app_client.md
│ │ │ │ │ ├── algokit:utils:typescript:code:modules:types_app_deployer.md
│ │ │ │ │ ├── algokit:utils:typescript:code:modules:types_app_factory_and_client_spec.md
│ │ │ │ │ ├── algokit:utils:typescript:code:modules:types_app_factory.md
│ │ │ │ │ ├── algokit:utils:typescript:code:modules:types_app_manager.md
│ │ │ │ │ ├── algokit:utils:typescript:code:modules:types_app_spec.md
│ │ │ │ │ ├── algokit:utils:typescript:code:modules:types_app.md
│ │ │ │ │ ├── algokit:utils:typescript:code:modules:types_asset_manager.md
│ │ │ │ │ ├── algokit:utils:typescript:code:modules:types_asset.md
│ │ │ │ │ ├── algokit:utils:typescript:code:modules:types_async_event_emitter_spec.md
│ │ │ │ │ ├── algokit:utils:typescript:code:modules:types_async_event_emitter.md
│ │ │ │ │ ├── algokit:utils:typescript:code:modules:types_client_manager_spec.md
│ │ │ │ │ ├── algokit:utils:typescript:code:modules:types_client_manager.md
│ │ │ │ │ ├── algokit:utils:typescript:code:modules:types_composer.md
│ │ │ │ │ ├── algokit:utils:typescript:code:modules:types_config.md
│ │ │ │ │ ├── algokit:utils:typescript:code:modules:types_debugging.md
│ │ │ │ │ ├── algokit:utils:typescript:code:modules:types_dispenser_client_spec.md
│ │ │ │ │ ├── algokit:utils:typescript:code:modules:types_dispenser_client.md
│ │ │ │ │ ├── algokit:utils:typescript:code:modules:types_expand.md
│ │ │ │ │ ├── algokit:utils:typescript:code:modules:types_indexer.md
│ │ │ │ │ ├── algokit:utils:typescript:code:modules:types_kmd_account_manager.md
│ │ │ │ │ ├── algokit:utils:typescript:code:modules:types_lifecycle_events.md
│ │ │ │ │ ├── algokit:utils:typescript:code:modules:types_logging.md
│ │ │ │ │ ├── algokit:utils:typescript:code:modules:types_logic_error.md
│ │ │ │ │ ├── algokit:utils:typescript:code:modules:types_network_client.md
│ │ │ │ │ ├── algokit:utils:typescript:code:modules:types_testing.md
│ │ │ │ │ ├── algokit:utils:typescript:code:modules:types_transaction.md
│ │ │ │ │ ├── algokit:utils:typescript:code:modules:types_transfer.md
│ │ │ │ │ ├── algokit:utils:typescript:code:README.md
│ │ │ │ │ ├── algokit:utils:typescript:README.md
│ │ │ │ │ ├── algokit:utils:typescript:v7-migration.md
│ │ │ │ │ ├── algokit:utils:typescript:v8-migration.md
│ │ │ │ │ ├── ARCs:ARC-template.md
│ │ │ │ │ ├── ARCs:assets:arc-0012:README.md
│ │ │ │ │ ├── ARCs:assets:arc-0034:TemplateForm.md
│ │ │ │ │ ├── ARCs:assets:arc-0062:README.md
│ │ │ │ │ ├── ARCs:pages:nfts.md
│ │ │ │ │ ├── ARCs:pages:wallets.md
│ │ │ │ │ ├── ARCs:README.md
│ │ │ │ │ ├── ARCs:specs:arc-0000.md
│ │ │ │ │ ├── ARCs:specs:arc-0001.md
│ │ │ │ │ ├── ARCs:specs:arc-0002.md
│ │ │ │ │ ├── ARCs:specs:arc-0003.md
│ │ │ │ │ ├── ARCs:specs:arc-0004.md
│ │ │ │ │ ├── ARCs:specs:arc-0005.md
│ │ │ │ │ ├── ARCs:specs:arc-0006.md
│ │ │ │ │ ├── ARCs:specs:arc-0007.md
│ │ │ │ │ ├── ARCs:specs:arc-0008.md
│ │ │ │ │ ├── ARCs:specs:arc-0009.md
│ │ │ │ │ ├── ARCs:specs:arc-0010.md
│ │ │ │ │ ├── ARCs:specs:arc-0011.md
│ │ │ │ │ ├── ARCs:specs:arc-0012.md
│ │ │ │ │ ├── ARCs:specs:arc-0015.md
│ │ │ │ │ ├── ARCs:specs:arc-0016.md
│ │ │ │ │ ├── ARCs:specs:arc-0018.md
│ │ │ │ │ ├── ARCs:specs:arc-0019.md
│ │ │ │ │ ├── ARCs:specs:arc-0020.md
│ │ │ │ │ ├── ARCs:specs:arc-0021.md
│ │ │ │ │ ├── ARCs:specs:arc-0022.md
│ │ │ │ │ ├── ARCs:specs:arc-0023.md
│ │ │ │ │ ├── ARCs:specs:arc-0025.md
│ │ │ │ │ ├── ARCs:specs:arc-0026.md
│ │ │ │ │ ├── ARCs:specs:arc-0028.md
│ │ │ │ │ ├── ARCs:specs:arc-0032.md
│ │ │ │ │ ├── ARCs:specs:arc-0033.md
│ │ │ │ │ ├── ARCs:specs:arc-0034.md
│ │ │ │ │ ├── ARCs:specs:arc-0035.md
│ │ │ │ │ ├── ARCs:specs:arc-0036.md
│ │ │ │ │ ├── ARCs:specs:arc-0042.md
│ │ │ │ │ ├── ARCs:specs:arc-0047.md
│ │ │ │ │ ├── ARCs:specs:arc-0048.md
│ │ │ │ │ ├── ARCs:specs:arc-0049.md
│ │ │ │ │ ├── ARCs:specs:arc-0054.md
│ │ │ │ │ ├── ARCs:specs:arc-0055.md
│ │ │ │ │ ├── ARCs:specs:arc-0056.md
│ │ │ │ │ ├── ARCs:specs:arc-0059.md
│ │ │ │ │ ├── ARCs:specs:arc-0062.md
│ │ │ │ │ ├── ARCs:specs:arc-0065.md
│ │ │ │ │ ├── ARCs:specs:arc-0069.md
│ │ │ │ │ ├── ARCs:specs:arc-0072.md
│ │ │ │ │ ├── ARCs:specs:arc-0073.md
│ │ │ │ │ ├── ARCs:specs:arc-0074.md
│ │ │ │ │ ├── ARCs:specs:arc-0076.md
│ │ │ │ │ ├── ARCs:specs:arc-0078.md
│ │ │ │ │ ├── ARCs:specs:arc-0079.md
│ │ │ │ │ ├── ARCs:specs:arc-0200.md
│ │ │ │ │ ├── clis_index.md
│ │ │ │ │ ├── developer:docs:about.md
│ │ │ │ │ ├── developer:docs:clis:algokey:algokey.md
│ │ │ │ │ ├── developer:docs:clis:algokey:generate.md
│ │ │ │ │ ├── developer:docs:clis:algokey:import.md
│ │ │ │ │ ├── developer:docs:clis:algokey:multisig:append-auth-addr.md
│ │ │ │ │ ├── developer:docs:clis:algokey:multisig:multisig.md
│ │ │ │ │ ├── developer:docs:clis:algokey:part:info.md
│ │ │ │ │ ├── developer:docs:clis:algokey:part:part.md
│ │ │ │ │ ├── developer:docs:clis:algokey:part:reparent.md
│ │ │ │ │ ├── developer:docs:clis:algokey:sign.md
│ │ │ │ │ ├── developer:docs:clis:conduit:conduit.md
│ │ │ │ │ ├── developer:docs:clis:conduit:init.md
│ │ │ │ │ ├── developer:docs:clis:conduit:list:exporters.md
│ │ │ │ │ ├── developer:docs:clis:conduit:list:importers.md
│ │ │ │ │ ├── developer:docs:clis:conduit:list:list.md
│ │ │ │ │ ├── developer:docs:clis:conduit:list:processors.md
│ │ │ │ │ ├── developer:docs:clis:diagcfg:diagcfg.md
│ │ │ │ │ ├── developer:docs:clis:diagcfg:metric:disable.md
│ │ │ │ │ ├── developer:docs:clis:diagcfg:metric:enable.md
│ │ │ │ │ ├── developer:docs:clis:diagcfg:metric:metric.md
│ │ │ │ │ ├── developer:docs:clis:diagcfg:metric:status.md
│ │ │ │ │ ├── developer:docs:clis:diagcfg:telemetry:disable.md
│ │ │ │ │ ├── developer:docs:clis:diagcfg:telemetry:enable.md
│ │ │ │ │ ├── developer:docs:clis:diagcfg:telemetry:endpoint.md
│ │ │ │ │ ├── developer:docs:clis:diagcfg:telemetry:name.md
│ │ │ │ │ ├── developer:docs:clis:diagcfg:telemetry:status.md
│ │ │ │ │ ├── developer:docs:clis:diagcfg:telemetry:telemetry.md
│ │ │ │ │ ├── developer:docs:clis:goal:node:restart.md
│ │ │ │ │ ├── developer:docs:clis:goal:node:start.md
│ │ │ │ │ ├── developer:docs:clis:goal:node:status.md
│ │ │ │ │ ├── developer:docs:clis:goal:node:stop.md
│ │ │ │ │ ├── developer:docs:clis:goal:node:wait.md
│ │ │ │ │ ├── developer:docs:clis:goal:protocols.md
│ │ │ │ │ ├── developer:docs:clis:goal:report.md
│ │ │ │ │ ├── developer:docs:clis:goal:version.md
│ │ │ │ │ ├── developer:docs:clis:goal:wallet:list.md
│ │ │ │ │ ├── developer:docs:clis:goal:wallet:new.md
│ │ │ │ │ ├── developer:docs:clis:goal:wallet:wallet.md
│ │ │ │ │ ├── developer:docs:clis:indexer:api-config.md
│ │ │ │ │ ├── developer:docs:clis:indexer:daemon.md
│ │ │ │ │ ├── developer:docs:clis:indexer:indexer.md
│ │ │ │ │ ├── developer:docs:clis:indexer:util:util.md
│ │ │ │ │ ├── developer:docs:clis:indexer:util:validator.md
│ │ │ │ │ ├── developer:docs:clis:kmd.md
│ │ │ │ │ ├── developer:docs:clis:tealdbg:debug.md
│ │ │ │ │ ├── developer:docs:clis:tealdbg:remote.md
│ │ │ │ │ ├── developer:docs:clis:tealdbg:tealdbg.md
│ │ │ │ │ ├── developer:docs:details:accounts:create.md
│ │ │ │ │ ├── developer:docs:details:accounts:index.md
│ │ │ │ │ ├── developer:docs:details:accounts:rekey.md
│ │ │ │ │ ├── developer:docs:details:algorand_consensus.md
│ │ │ │ │ ├── developer:docs:details:algorand-networks:betanet.md
│ │ │ │ │ ├── developer:docs:details:algorand-networks:index.md
│ │ │ │ │ ├── developer:docs:details:algorand-networks:mainnet.md
│ │ │ │ │ ├── developer:docs:details:algorand-networks:testnet.md
│ │ │ │ │ ├── developer:docs:details:asa.md
│ │ │ │ │ ├── developer:docs:details:atc.md
│ │ │ │ │ ├── developer:docs:details:atomic_transfers.md
│ │ │ │ │ ├── developer:docs:details:conduit.md
│ │ │ │ │ ├── developer:docs:details:crust.md
│ │ │ │ │ ├── developer:docs:details:dapps:avm:index.md
│ │ │ │ │ ├── developer:docs:details:dapps:avm:teal:guidelines.md
│ │ │ │ │ ├── developer:docs:details:dapps:avm:teal:index.md
│ │ │ │ │ ├── developer:docs:details:dapps:avm:teal:jsonspec.md
│ │ │ │ │ ├── developer:docs:details:dapps:avm:teal:opcodes:index.md
│ │ │ │ │ ├── developer:docs:details:dapps:avm:teal:opcodes:v1.md
│ │ │ │ │ ├── developer:docs:details:dapps:avm:teal:opcodes:v10.md
│ │ │ │ │ ├── developer:docs:details:dapps:avm:teal:opcodes:v2.md
│ │ │ │ │ ├── developer:docs:details:dapps:avm:teal:opcodes:v3.md
│ │ │ │ │ ├── developer:docs:details:dapps:avm:teal:opcodes:v4.md
│ │ │ │ │ ├── developer:docs:details:dapps:avm:teal:opcodes:v5.md
│ │ │ │ │ ├── developer:docs:details:dapps:avm:teal:opcodes:v6.md
│ │ │ │ │ ├── developer:docs:details:dapps:avm:teal:opcodes:v7.md
│ │ │ │ │ ├── developer:docs:details:dapps:avm:teal:opcodes:v8.md
│ │ │ │ │ ├── developer:docs:details:dapps:avm:teal:opcodes:v9.md
│ │ │ │ │ ├── developer:docs:details:dapps:avm:teal:specification.md
│ │ │ │ │ ├── developer:docs:details:dapps:smart-contracts:ABI:index.md
│ │ │ │ │ ├── developer:docs:details:dapps:smart-contracts:apps:create.md
│ │ │ │ │ ├── developer:docs:details:dapps:smart-contracts:apps:index.md
│ │ │ │ │ ├── developer:docs:details:dapps:smart-contracts:apps:innertx.md
│ │ │ │ │ ├── developer:docs:details:dapps:smart-contracts:apps:state.md
│ │ │ │ │ ├── developer:docs:details:dapps:smart-contracts:apps:txs.md
│ │ │ │ │ ├── developer:docs:details:dapps:smart-contracts:debugging.md
│ │ │ │ │ ├── developer:docs:details:dapps:smart-contracts:frontend:apps.md
│ │ │ │ │ ├── developer:docs:details:dapps:smart-contracts:frontend:smartsigs.md
│ │ │ │ │ ├── developer:docs:details:dapps:smart-contracts:guidelines.md
│ │ │ │ │ ├── developer:docs:details:dapps:smart-contracts:index.md
│ │ │ │ │ ├── developer:docs:details:dapps:smart-contracts:smartsigs:index.md
│ │ │ │ │ ├── developer:docs:details:dapps:smart-contracts:smartsigs:modes.md
│ │ │ │ │ ├── developer:docs:details:dapps:smart-contracts:smartsigs:walkthrough.md
│ │ │ │ │ ├── developer:docs:details:dapps:writing-contracts:beaker.md
│ │ │ │ │ ├── developer:docs:details:dapps:writing-contracts:pyteal.md
│ │ │ │ │ ├── developer:docs:details:dapps:writing-contracts:python.md
│ │ │ │ │ ├── developer:docs:details:encoding.md
│ │ │ │ │ ├── developer:docs:details:ethereum_to_algorand.md
│ │ │ │ │ ├── developer:docs:details:index.md
│ │ │ │ │ ├── developer:docs:details:indexer.md
│ │ │ │ │ ├── developer:docs:details:parameter_tables.md
│ │ │ │ │ ├── developer:docs:details:stateproofs:index.md
│ │ │ │ │ ├── developer:docs:details:stateproofs:light_client.md
│ │ │ │ │ ├── developer:docs:details:technical_faq.md
│ │ │ │ │ ├── developer:docs:details:transactions:index.md
│ │ │ │ │ ├── developer:docs:details:transactions:offline_transactions.md
│ │ │ │ │ ├── developer:docs:details:transactions:payment_prompts.md
│ │ │ │ │ ├── developer:docs:details:transactions:signatures.md
│ │ │ │ │ ├── developer:docs:details:transactions:transactions.md
│ │ │ │ │ ├── developer:docs:details:useful_resources.md
│ │ │ │ │ ├── developer:docs:get-started:algokit.md
│ │ │ │ │ ├── developer:docs:get-started:basics:what_is_blockchain.md
│ │ │ │ │ ├── developer:docs:get-started:basics:whats_a_dapp.md
│ │ │ │ │ ├── developer:docs:get-started:basics:where_to_start.md
│ │ │ │ │ ├── developer:docs:get-started:basics:why_algorand.md
│ │ │ │ │ ├── developer:docs:get-started:tokenization:ft.md
│ │ │ │ │ ├── developer:docs:get-started:tokenization:nft.md
│ │ │ │ │ ├── developer:docs:index.md
│ │ │ │ │ ├── developer:docs:rest-apis:algod.md
│ │ │ │ │ ├── developer:docs:rest-apis:indexer.md
│ │ │ │ │ ├── developer:docs:rest-apis:kmd.md
│ │ │ │ │ ├── developer:docs:rest-apis:restendpoints.md
│ │ │ │ │ ├── developer:docs:run-a-node:operations:catchup.md
│ │ │ │ │ ├── developer:docs:run-a-node:operations:switch_networks.md
│ │ │ │ │ ├── developer:docs:run-a-node:participate:generate_keys.md
│ │ │ │ │ ├── developer:docs:run-a-node:participate:index.md
│ │ │ │ │ ├── developer:docs:run-a-node:participate:offline.md
│ │ │ │ │ ├── developer:docs:run-a-node:participate:online.md
│ │ │ │ │ ├── developer:docs:run-a-node:participate:renew.md
│ │ │ │ │ ├── developer:docs:run-a-node:reference:artifacts.md
│ │ │ │ │ ├── developer:docs:run-a-node:reference:config.md
│ │ │ │ │ ├── developer:docs:run-a-node:reference:relay.md
│ │ │ │ │ ├── developer:docs:run-a-node:reference:telemetry-config.md
│ │ │ │ │ ├── developer:docs:run-a-node:setup:indexer.md
│ │ │ │ │ ├── developer:docs:run-a-node:setup:install.md
│ │ │ │ │ ├── developer:docs:run-a-node:setup:node-troubleshooting.md
│ │ │ │ │ ├── developer:docs:run-a-node:setup:types.md
│ │ │ │ │ ├── developer:docs:sdks:go:index.md
│ │ │ │ │ ├── developer:docs:sdks:index.md
│ │ │ │ │ ├── developer:docs:sdks:java:index.md
│ │ │ │ │ ├── developer:docs:sdks:javascript:index.md
│ │ │ │ │ ├── developer:docs:sdks:python:index.md
│ │ │ │ │ ├── developer:python:code:example:accounts.md
│ │ │ │ │ ├── developer:python:code:example:arc4_types.md
│ │ │ │ │ ├── developer:python:code:example:assets.md
│ │ │ │ │ ├── developer:python:code:example:box_storage.md
│ │ │ │ │ ├── developer:python:code:example:control_flow.md
│ │ │ │ │ ├── developer:python:code:example:crypto:merkle_tree.md
│ │ │ │ │ ├── developer:python:code:example:defi:amm.md
│ │ │ │ │ ├── developer:python:code:example:defi:auction.md
│ │ │ │ │ ├── developer:python:code:example:defi:htlc_logicsig.md
│ │ │ │ │ ├── developer:python:code:example:defi:marketplace.md
│ │ │ │ │ ├── developer:python:code:example:events:arc28_events.md
│ │ │ │ │ ├── developer:python:code:example:global_storage.md
│ │ │ │ │ ├── developer:python:code:example:governance:simple_voting.md
│ │ │ │ │ ├── developer:python:code:example:hello_world.md
│ │ │ │ │ ├── developer:python:code:example:inner_transactions.md
│ │ │ │ │ ├── developer:python:code:example:local_storage.md
│ │ │ │ │ ├── developer:python:code:example:nft:proof_of_attendance.md
│ │ │ │ │ ├── developer:python:code:example:privacy:zk_whitelist.md
│ │ │ │ │ ├── developer:python:code:example:scratch_storage.md
│ │ │ │ │ ├── developer:python:code:example:self_payment.md
│ │ │ │ │ ├── developer:python:code:example:struct_in_box.md
│ │ │ │ │ ├── developer:python:code:example:subsidize_app_call.md
│ │ │ │ │ ├── developer:python:code:example:transactions.md
│ │ │ │ │ ├── developer:python:code:example:utility:calculator.md
│ │ │ │ │ ├── devportal-code-examples:projects:python-contract-examples:README.md
│ │ │ │ │ ├── devportal-code-examples:README.md
│ │ │ │ │ ├── docs:.walletconnect:index.md
│ │ │ │ │ ├── docs:.walletconnect:walletconnect-schema.md
│ │ │ │ │ ├── docs:README.md
│ │ │ │ │ ├── docs:scripts:example_tracker:example_list.md
│ │ │ │ │ ├── docs:scripts:README.md
│ │ │ │ │ ├── index.md
│ │ │ │ │ ├── liquid_auth_index.md
│ │ │ │ │ ├── liquid-auth:ARCHITECTURE.md
│ │ │ │ │ ├── liquid-auth:decisions:1-Service-Authentication.md
│ │ │ │ │ ├── liquid-auth:decisions:2-Bidirectional-Communication.md
│ │ │ │ │ ├── liquid-auth:decisions:3-Peer-to-Peer-Signaling.md
│ │ │ │ │ ├── liquid-auth:decisions:4-Fido-Extension.md
│ │ │ │ │ ├── liquid-auth:decisions:README.md
│ │ │ │ │ ├── liquid-auth:docs:architecture.md
│ │ │ │ │ ├── liquid-auth:docs:clients:android:provider-service:authenticate.md
│ │ │ │ │ ├── liquid-auth:docs:clients:android:provider-service:register.md
│ │ │ │ │ ├── liquid-auth:docs:clients:browser:authentication.md
│ │ │ │ │ ├── liquid-auth:docs:clients:browser:example.md
│ │ │ │ │ ├── liquid-auth:docs:introduction.md
│ │ │ │ │ ├── liquid-auth:docs:README.md
│ │ │ │ │ ├── liquid-auth:docs:server:environment-variables.md
│ │ │ │ │ ├── liquid-auth:docs:server:integrations.md
│ │ │ │ │ ├── liquid-auth:docs:server:introduction.md
│ │ │ │ │ ├── liquid-auth:docs:server:running-locally.md
│ │ │ │ │ ├── liquid-auth:README.md
│ │ │ │ │ ├── liquid-auth:SEQUENCE.md
│ │ │ │ │ ├── liquid-auth:services:liquid-auth-api-js:src:assertion:assertion.controller.post.request.md
│ │ │ │ │ ├── liquid-auth:services:liquid-auth-api-js:src:assertion:assertion.controller.post.response.md
│ │ │ │ │ ├── liquid-auth:services:liquid-auth-api-js:src:attestation:attestation.controller.post.request.md
│ │ │ │ │ ├── liquid-auth:services:liquid-auth-api-js:src:auth:auth.controller.get.user.md
│ │ │ │ │ ├── liquid-auth:sites:express-dapp:README.md
│ │ │ │ │ ├── liquid-auth:VISION.md
│ │ │ │ │ ├── puya_index.md
│ │ │ │ │ ├── puya:docs:algopy_testing:index.md
│ │ │ │ │ ├── puya:docs:api-algopy.arc4.md
│ │ │ │ │ ├── puya:docs:api-algopy.gtxn.md
│ │ │ │ │ ├── puya:docs:api-algopy.itxn.md
│ │ │ │ │ ├── puya:docs:api-algopy.md
│ │ │ │ │ ├── puya:docs:api-algopy.op.md
│ │ │ │ │ ├── puya:docs:api.md
│ │ │ │ │ ├── puya:docs:compiler.md
│ │ │ │ │ ├── puya:docs:index.md
│ │ │ │ │ ├── puya:docs:language-guide.md
│ │ │ │ │ ├── puya:docs:lg-arc28.md
│ │ │ │ │ ├── puya:docs:lg-arc4.md
│ │ │ │ │ ├── puya:docs:lg-builtins.md
│ │ │ │ │ ├── puya:docs:lg-calling-apps.md
│ │ │ │ │ ├── puya:docs:lg-compile.md
│ │ │ │ │ ├── puya:docs:lg-control.md
│ │ │ │ │ ├── puya:docs:lg-errors.md
│ │ │ │ │ ├── puya:docs:lg-logs.md
│ │ │ │ │ ├── puya:docs:lg-modules.md
│ │ │ │ │ ├── puya:docs:lg-opcode-budget.md
│ │ │ │ │ ├── puya:docs:lg-ops.md
│ │ │ │ │ ├── puya:docs:lg-storage.md
│ │ │ │ │ ├── puya:docs:lg-structure.md
│ │ │ │ │ ├── puya:docs:lg-transactions.md
│ │ │ │ │ ├── puya:docs:lg-types.md
│ │ │ │ │ ├── puya:docs:lg-unsupported-python-features.md
│ │ │ │ │ ├── puya:docs:principles.md
│ │ │ │ │ ├── puya:examples:auction:README.md
│ │ │ │ │ ├── puya:python:testing:docs:algopy.md
│ │ │ │ │ ├── puya:python:testing:docs:api.md
│ │ │ │ │ ├── puya:python:testing:docs:coverage.md
│ │ │ │ │ ├── puya:python:testing:docs:examples.md
│ │ │ │ │ ├── puya:python:testing:docs:faq.md
│ │ │ │ │ ├── puya:python:testing:docs:index.md
│ │ │ │ │ ├── puya:python:testing:docs:testing-guide:arc4-types.md
│ │ │ │ │ ├── puya:python:testing:docs:testing-guide:avm-types.md
│ │ │ │ │ ├── puya:python:testing:docs:testing-guide:concepts.md
│ │ │ │ │ ├── puya:python:testing:docs:testing-guide:contract-testing.md
│ │ │ │ │ ├── puya:python:testing:docs:testing-guide:index.md
│ │ │ │ │ ├── puya:python:testing:docs:testing-guide:opcodes.md
│ │ │ │ │ ├── puya:python:testing:docs:testing-guide:signature-testing.md
│ │ │ │ │ ├── puya:python:testing:docs:testing-guide:state-management.md
│ │ │ │ │ ├── puya:python:testing:docs:testing-guide:subroutines.md
│ │ │ │ │ ├── puya:python:testing:docs:testing-guide:transactions.md
│ │ │ │ │ ├── puya:python:testing:examples:README.md
│ │ │ │ │ ├── puya:python:testing:README.md
│ │ │ │ │ ├── puya:README.md
│ │ │ │ │ ├── puya:src:puya:ARCHITECTURE.md
│ │ │ │ │ ├── puya:src:puyapy:_typeshed:README.md
│ │ │ │ │ ├── puya:src:puyapy:_vendor:mypy:typeshed:stdlib:_typeshed:README.md
│ │ │ │ │ ├── puya:src:puyapy:awst_build:README.md
│ │ │ │ │ ├── puya:stubs:README.md
│ │ │ │ │ ├── puya:tests:test_expected_output:README.md
│ │ │ │ │ ├── puya:typescript:docs:architecture-decisions:2024-05-21_primitive-bytes-and-strings.md
│ │ │ │ │ ├── puya:typescript:docs:architecture-decisions:2024-05-21_primitive-integer-types.md
│ │ │ │ │ ├── puya:typescript:docs:README.md
│ │ │ │ │ ├── puya:typescript:packages:algo-ts:readme.md
│ │ │ │ │ ├── puya:typescript:README.md
│ │ │ │ │ ├── SDKs:javascript:classes:ABIAddressType.md
│ │ │ │ │ ├── SDKs:javascript:classes:ABIArrayDynamicType.md
│ │ │ │ │ ├── SDKs:javascript:classes:ABIArrayStaticType.md
│ │ │ │ │ ├── SDKs:javascript:classes:ABIBoolType.md
│ │ │ │ │ ├── SDKs:javascript:classes:ABIByteType.md
│ │ │ │ │ ├── SDKs:javascript:classes:ABIContract.md
│ │ │ │ │ ├── SDKs:javascript:classes:ABIInterface.md
│ │ │ │ │ ├── SDKs:javascript:classes:ABIMethod.md
│ │ │ │ │ ├── SDKs:javascript:classes:ABIStringType.md
│ │ │ │ │ ├── SDKs:javascript:classes:ABITupleType.md
│ │ │ │ │ ├── SDKs:javascript:classes:ABIType.md
│ │ │ │ │ ├── SDKs:javascript:classes:ABIUfixedType.md
│ │ │ │ │ ├── SDKs:javascript:classes:ABIUintType.md
│ │ │ │ │ ├── SDKs:javascript:classes:Algodv2.md
│ │ │ │ │ ├── SDKs:javascript:classes:AtomicTransactionComposer.md
│ │ │ │ │ ├── SDKs:javascript:classes:DryrunResult.md
│ │ │ │ │ ├── SDKs:javascript:classes:Indexer.md
│ │ │ │ │ ├── SDKs:javascript:classes:indexerModels.Account.md
│ │ │ │ │ ├── SDKs:javascript:classes:indexerModels.AccountParticipation.md
│ │ │ │ │ ├── SDKs:javascript:classes:indexerModels.AccountResponse.md
│ │ │ │ │ ├── SDKs:javascript:classes:indexerModels.AccountsResponse.md
│ │ │ │ │ ├── SDKs:javascript:classes:indexerModels.AccountStateDelta.md
│ │ │ │ │ ├── SDKs:javascript:classes:indexerModels.Application.md
│ │ │ │ │ ├── SDKs:javascript:classes:indexerModels.ApplicationLocalState.md
│ │ │ │ │ ├── SDKs:javascript:classes:indexerModels.ApplicationLocalStatesResponse.md
│ │ │ │ │ ├── SDKs:javascript:classes:indexerModels.ApplicationLogData.md
│ │ │ │ │ ├── SDKs:javascript:classes:indexerModels.ApplicationLogsResponse.md
│ │ │ │ │ ├── SDKs:javascript:classes:indexerModels.ApplicationParams.md
│ │ │ │ │ ├── SDKs:javascript:classes:indexerModels.ApplicationResponse.md
│ │ │ │ │ ├── SDKs:javascript:classes:indexerModels.ApplicationsResponse.md
│ │ │ │ │ ├── SDKs:javascript:classes:indexerModels.ApplicationStateSchema.md
│ │ │ │ │ ├── SDKs:javascript:classes:indexerModels.Asset.md
│ │ │ │ │ ├── SDKs:javascript:classes:indexerModels.AssetBalancesResponse.md
│ │ │ │ │ ├── SDKs:javascript:classes:indexerModels.AssetHolding.md
│ │ │ │ │ ├── SDKs:javascript:classes:indexerModels.AssetHoldingsResponse.md
│ │ │ │ │ ├── SDKs:javascript:classes:indexerModels.AssetParams.md
│ │ │ │ │ ├── SDKs:javascript:classes:indexerModels.AssetResponse.md
│ │ │ │ │ ├── SDKs:javascript:classes:indexerModels.AssetsResponse.md
│ │ │ │ │ ├── SDKs:javascript:classes:indexerModels.Block.md
│ │ │ │ │ ├── SDKs:javascript:classes:indexerModels.BlockRewards.md
│ │ │ │ │ ├── SDKs:javascript:classes:indexerModels.BlockUpgradeState.md
│ │ │ │ │ ├── SDKs:javascript:classes:indexerModels.BlockUpgradeVote.md
│ │ │ │ │ ├── SDKs:javascript:classes:indexerModels.Box.md
│ │ │ │ │ ├── SDKs:javascript:classes:indexerModels.BoxDescriptor.md
│ │ │ │ │ ├── SDKs:javascript:classes:indexerModels.BoxesResponse.md
│ │ │ │ │ ├── SDKs:javascript:classes:indexerModels.ErrorResponse.md
│ │ │ │ │ ├── SDKs:javascript:classes:indexerModels.EvalDelta.md
│ │ │ │ │ ├── SDKs:javascript:classes:indexerModels.EvalDeltaKeyValue.md
│ │ │ │ │ ├── SDKs:javascript:classes:indexerModels.HashFactory.md
│ │ │ │ │ ├── SDKs:javascript:classes:indexerModels.HealthCheck.md
│ │ │ │ │ ├── SDKs:javascript:classes:indexerModels.IndexerStateProofMessage.md
│ │ │ │ │ ├── SDKs:javascript:classes:indexerModels.MerkleArrayProof.md
│ │ │ │ │ ├── SDKs:javascript:classes:indexerModels.MiniAssetHolding.md
│ │ │ │ │ ├── SDKs:javascript:classes:indexerModels.ParticipationUpdates.md
│ │ │ │ │ ├── SDKs:javascript:classes:indexerModels.StateProofFields.md
│ │ │ │ │ ├── SDKs:javascript:classes:indexerModels.StateProofParticipant.md
│ │ │ │ │ ├── SDKs:javascript:classes:indexerModels.StateProofReveal.md
│ │ │ │ │ ├── SDKs:javascript:classes:indexerModels.StateProofSignature.md
│ │ │ │ │ ├── SDKs:javascript:classes:indexerModels.StateProofSigSlot.md
│ │ │ │ │ ├── SDKs:javascript:classes:indexerModels.StateProofTracking.md
│ │ │ │ │ ├── SDKs:javascript:classes:indexerModels.StateProofVerifier.md
│ │ │ │ │ ├── SDKs:javascript:classes:indexerModels.StateSchema.md
│ │ │ │ │ ├── SDKs:javascript:classes:indexerModels.TealKeyValue.md
│ │ │ │ │ ├── SDKs:javascript:classes:indexerModels.TealValue.md
│ │ │ │ │ ├── SDKs:javascript:classes:indexerModels.Transaction.md
│ │ │ │ │ ├── SDKs:javascript:classes:indexerModels.TransactionApplication.md
│ │ │ │ │ ├── SDKs:javascript:classes:indexerModels.TransactionAssetConfig.md
│ │ │ │ │ ├── SDKs:javascript:classes:indexerModels.TransactionAssetFreeze.md
│ │ │ │ │ ├── SDKs:javascript:classes:indexerModels.TransactionAssetTransfer.md
│ │ │ │ │ ├── SDKs:javascript:classes:indexerModels.TransactionKeyreg.md
│ │ │ │ │ ├── SDKs:javascript:classes:indexerModels.TransactionPayment.md
│ │ │ │ │ ├── SDKs:javascript:classes:indexerModels.TransactionResponse.md
│ │ │ │ │ ├── SDKs:javascript:classes:indexerModels.TransactionSignature.md
│ │ │ │ │ ├── SDKs:javascript:classes:indexerModels.TransactionSignatureLogicsig.md
│ │ │ │ │ ├── SDKs:javascript:classes:indexerModels.TransactionSignatureMultisig.md
│ │ │ │ │ ├── SDKs:javascript:classes:indexerModels.TransactionSignatureMultisigSubsignature.md
│ │ │ │ │ ├── SDKs:javascript:classes:indexerModels.TransactionsResponse.md
│ │ │ │ │ ├── SDKs:javascript:classes:indexerModels.TransactionStateProof.md
│ │ │ │ │ ├── SDKs:javascript:classes:Kmd.md
│ │ │ │ │ ├── SDKs:javascript:classes:LogicSig.md
│ │ │ │ │ ├── SDKs:javascript:classes:LogicSigAccount.md
│ │ │ │ │ ├── SDKs:javascript:classes:modelsv2.Account.md
│ │ │ │ │ ├── SDKs:javascript:classes:modelsv2.AccountApplicationResponse.md
│ │ │ │ │ ├── SDKs:javascript:classes:modelsv2.AccountAssetHolding.md
│ │ │ │ │ ├── SDKs:javascript:classes:modelsv2.AccountAssetResponse.md
│ │ │ │ │ ├── SDKs:javascript:classes:modelsv2.AccountAssetsInformationResponse.md
│ │ │ │ │ ├── SDKs:javascript:classes:modelsv2.AccountParticipation.md
│ │ │ │ │ ├── SDKs:javascript:classes:modelsv2.AccountStateDelta.md
│ │ │ │ │ ├── SDKs:javascript:classes:modelsv2.AppCallLogs.md
│ │ │ │ │ ├── SDKs:javascript:classes:modelsv2.Application.md
│ │ │ │ │ ├── SDKs:javascript:classes:modelsv2.ApplicationInitialStates.md
│ │ │ │ │ ├── SDKs:javascript:classes:modelsv2.ApplicationKVStorage.md
│ │ │ │ │ ├── SDKs:javascript:classes:modelsv2.ApplicationLocalReference.md
│ │ │ │ │ ├── SDKs:javascript:classes:modelsv2.ApplicationLocalState.md
│ │ │ │ │ ├── SDKs:javascript:classes:modelsv2.ApplicationParams.md
│ │ │ │ │ ├── SDKs:javascript:classes:modelsv2.ApplicationStateOperation.md
│ │ │ │ │ ├── SDKs:javascript:classes:modelsv2.ApplicationStateSchema.md
│ │ │ │ │ ├── SDKs:javascript:classes:modelsv2.Asset.md
│ │ │ │ │ ├── SDKs:javascript:classes:modelsv2.AssetHolding.md
│ │ │ │ │ ├── SDKs:javascript:classes:modelsv2.AssetHoldingReference.md
│ │ │ │ │ ├── SDKs:javascript:classes:modelsv2.AssetParams.md
│ │ │ │ │ ├── SDKs:javascript:classes:modelsv2.AvmKeyValue.md
│ │ │ │ │ ├── SDKs:javascript:classes:modelsv2.AvmValue.md
│ │ │ │ │ ├── SDKs:javascript:classes:modelsv2.BlockHashResponse.md
│ │ │ │ │ ├── SDKs:javascript:classes:modelsv2.BlockLogsResponse.md
│ │ │ │ │ ├── SDKs:javascript:classes:modelsv2.BlockResponse.md
│ │ │ │ │ ├── SDKs:javascript:classes:modelsv2.BlockTxidsResponse.md
│ │ │ │ │ ├── SDKs:javascript:classes:modelsv2.Box.md
│ │ │ │ │ ├── SDKs:javascript:classes:modelsv2.BoxDescriptor.md
│ │ │ │ │ ├── SDKs:javascript:classes:modelsv2.BoxesResponse.md
│ │ │ │ │ ├── SDKs:javascript:classes:modelsv2.BoxReference.md
│ │ │ │ │ ├── SDKs:javascript:classes:modelsv2.BuildVersion.md
│ │ │ │ │ ├── SDKs:javascript:classes:modelsv2.CompileResponse.md
│ │ │ │ │ ├── SDKs:javascript:classes:modelsv2.DisassembleResponse.md
│ │ │ │ │ ├── SDKs:javascript:classes:modelsv2.DryrunRequest.md
│ │ │ │ │ ├── SDKs:javascript:classes:modelsv2.DryrunResponse.md
│ │ │ │ │ ├── SDKs:javascript:classes:modelsv2.DryrunSource.md
│ │ │ │ │ ├── SDKs:javascript:classes:modelsv2.DryrunState.md
│ │ │ │ │ ├── SDKs:javascript:classes:modelsv2.DryrunTxnResult.md
│ │ │ │ │ ├── SDKs:javascript:classes:modelsv2.ErrorResponse.md
│ │ │ │ │ ├── SDKs:javascript:classes:modelsv2.EvalDelta.md
│ │ │ │ │ ├── SDKs:javascript:classes:modelsv2.EvalDeltaKeyValue.md
│ │ │ │ │ ├── SDKs:javascript:classes:modelsv2.GetBlockTimeStampOffsetResponse.md
│ │ │ │ │ ├── SDKs:javascript:classes:modelsv2.GetSyncRoundResponse.md
│ │ │ │ │ ├── SDKs:javascript:classes:modelsv2.KvDelta.md
│ │ │ │ │ ├── SDKs:javascript:classes:modelsv2.LedgerStateDeltaForTransactionGroup.md
│ │ │ │ │ ├── SDKs:javascript:classes:modelsv2.LightBlockHeaderProof.md
│ │ │ │ │ ├── SDKs:javascript:classes:modelsv2.NodeStatusResponse.md
│ │ │ │ │ ├── SDKs:javascript:classes:modelsv2.PendingTransactionResponse.md
│ │ │ │ │ ├── SDKs:javascript:classes:modelsv2.PendingTransactionsResponse.md
│ │ │ │ │ ├── SDKs:javascript:classes:modelsv2.PostTransactionsResponse.md
│ │ │ │ │ ├── SDKs:javascript:classes:modelsv2.ScratchChange.md
│ │ │ │ │ ├── SDKs:javascript:classes:modelsv2.SimulateInitialStates.md
│ │ │ │ │ ├── SDKs:javascript:classes:modelsv2.SimulateRequest.md
│ │ │ │ │ ├── SDKs:javascript:classes:modelsv2.SimulateRequestTransactionGroup.md
│ │ │ │ │ ├── SDKs:javascript:classes:modelsv2.SimulateResponse.md
│ │ │ │ │ ├── SDKs:javascript:classes:modelsv2.SimulateTraceConfig.md
│ │ │ │ │ ├── SDKs:javascript:classes:modelsv2.SimulateTransactionGroupResult.md
│ │ │ │ │ ├── SDKs:javascript:classes:modelsv2.SimulateTransactionResult.md
│ │ │ │ │ ├── SDKs:javascript:classes:modelsv2.SimulateUnnamedResourcesAccessed.md
│ │ │ │ │ ├── SDKs:javascript:classes:modelsv2.SimulationEvalOverrides.md
│ │ │ │ │ ├── SDKs:javascript:classes:modelsv2.SimulationOpcodeTraceUnit.md
│ │ │ │ │ ├── SDKs:javascript:classes:modelsv2.SimulationTransactionExecTrace.md
│ │ │ │ │ ├── SDKs:javascript:classes:modelsv2.StateProof.md
│ │ │ │ │ ├── SDKs:javascript:classes:modelsv2.StateProofMessage.md
│ │ │ │ │ ├── SDKs:javascript:classes:modelsv2.SupplyResponse.md
│ │ │ │ │ ├── SDKs:javascript:classes:modelsv2.TealKeyValue.md
│ │ │ │ │ ├── SDKs:javascript:classes:modelsv2.TealValue.md
│ │ │ │ │ ├── SDKs:javascript:classes:modelsv2.TransactionGroupLedgerStateDeltasForRoundResponse.md
│ │ │ │ │ ├── SDKs:javascript:classes:modelsv2.TransactionParametersResponse.md
│ │ │ │ │ ├── SDKs:javascript:classes:modelsv2.TransactionProofResponse.md
│ │ │ │ │ ├── SDKs:javascript:classes:modelsv2.Version.md
│ │ │ │ │ ├── SDKs:javascript:classes:SourceMap.md
│ │ │ │ │ ├── SDKs:javascript:classes:Transaction.md
│ │ │ │ │ ├── SDKs:javascript:enums:ABIReferenceType.md
│ │ │ │ │ ├── SDKs:javascript:enums:ABITransactionType.md
│ │ │ │ │ ├── SDKs:javascript:enums:AtomicTransactionComposerStatus.md
│ │ │ │ │ ├── SDKs:javascript:enums:IntDecoding.md
│ │ │ │ │ ├── SDKs:javascript:enums:OnApplicationComplete.md
│ │ │ │ │ ├── SDKs:javascript:enums:TransactionType.md
│ │ │ │ │ ├── SDKs:javascript:examples:README.md
│ │ │ │ │ ├── SDKs:javascript:FAQ.md
│ │ │ │ │ ├── SDKs:javascript:interfaces:ABIContractNetworkInfo.md
│ │ │ │ │ ├── SDKs:javascript:interfaces:ABIContractNetworks.md
│ │ │ │ │ ├── SDKs:javascript:interfaces:ABIContractParams.md
│ │ │ │ │ ├── SDKs:javascript:interfaces:ABIInterfaceParams.md
│ │ │ │ │ ├── SDKs:javascript:interfaces:ABIMethodArgParams.md
│ │ │ │ │ ├── SDKs:javascript:interfaces:ABIMethodParams.md
│ │ │ │ │ ├── SDKs:javascript:interfaces:ABIMethodReturnParams.md
│ │ │ │ │ ├── SDKs:javascript:interfaces:ABIResult.md
│ │ │ │ │ ├── SDKs:javascript:interfaces:Account.md
│ │ │ │ │ ├── SDKs:javascript:interfaces:Address.md
│ │ │ │ │ ├── SDKs:javascript:interfaces:AlgodTokenHeader.md
│ │ │ │ │ ├── SDKs:javascript:interfaces:BaseHTTPClient.md
│ │ │ │ │ ├── SDKs:javascript:interfaces:BaseHTTPClientError.md
│ │ │ │ │ ├── SDKs:javascript:interfaces:BaseHTTPClientResponse.md
│ │ │ │ │ ├── SDKs:javascript:interfaces:BoxReference.md
│ │ │ │ │ ├── SDKs:javascript:interfaces:CustomTokenHeader.md
│ │ │ │ │ ├── SDKs:javascript:interfaces:EncodedAssetParams.md
│ │ │ │ │ ├── SDKs:javascript:interfaces:EncodedBoxReference.md
│ │ │ │ │ ├── SDKs:javascript:interfaces:EncodedGlobalStateSchema.md
│ │ │ │ │ ├── SDKs:javascript:interfaces:EncodedLocalStateSchema.md
│ │ │ │ │ ├── SDKs:javascript:interfaces:EncodedLogicSig.md
│ │ │ │ │ ├── SDKs:javascript:interfaces:EncodedLogicSigAccount.md
│ │ │ │ │ ├── SDKs:javascript:interfaces:EncodedMultisig.md
│ │ │ │ │ ├── SDKs:javascript:interfaces:EncodedSignedTransaction.md
│ │ │ │ │ ├── SDKs:javascript:interfaces:EncodedSubsig.md
│ │ │ │ │ ├── SDKs:javascript:interfaces:EncodedTransaction.md
│ │ │ │ │ ├── SDKs:javascript:interfaces:IndexerTokenHeader.md
│ │ │ │ │ ├── SDKs:javascript:interfaces:KMDTokenHeader.md
│ │ │ │ │ ├── SDKs:javascript:interfaces:MultisigMetadata.md
│ │ │ │ │ ├── SDKs:javascript:interfaces:SignedTransaction.md
│ │ │ │ │ ├── SDKs:javascript:interfaces:SuggestedParams.md
│ │ │ │ │ ├── SDKs:javascript:interfaces:TransactionParams.md
│ │ │ │ │ ├── SDKs:javascript:interfaces:TransactionWithSigner.md
│ │ │ │ │ ├── SDKs:javascript:modules:indexerModels.md
│ │ │ │ │ ├── SDKs:javascript:modules:modelsv2.md
│ │ │ │ │ ├── SDKs:javascript:modules.md
│ │ │ │ │ ├── SDKs:javascript:README.md
│ │ │ │ │ ├── SDKs:python:algosdk:v2client:harness:README.md
│ │ │ │ │ ├── SDKs:python:examples:README.md
│ │ │ │ │ ├── SDKs:python:README.md
│ │ │ │ │ ├── tealscript:examples_amm_README.md
│ │ │ │ │ ├── tealscript:examples_auction_README.md
│ │ │ │ │ ├── tealscript:examples_big_box_README.md
│ │ │ │ │ ├── tealscript:examples_itxns_README.md
│ │ │ │ │ ├── tealscript:examples_lsig_with_app_README.md
│ │ │ │ │ ├── tealscript:examples_reti_README.md
│ │ │ │ │ ├── tealscript:FEATURES.md
│ │ │ │ │ ├── tealscript:guides_atomic_txn.md
│ │ │ │ │ ├── tealscript:guides_features.md
│ │ │ │ │ ├── tealscript:guides_getting_started.md
│ │ │ │ │ ├── tealscript:guides_inner_transactions.md
│ │ │ │ │ ├── tealscript:guides_lifecycle.md
│ │ │ │ │ ├── tealscript:guides_math.md
│ │ │ │ │ ├── tealscript:guides_methods.md
│ │ │ │ │ ├── tealscript:guides_multiple_contracts.md
│ │ │ │ │ ├── tealscript:guides_pyteal.md
│ │ │ │ │ ├── tealscript:guides_storage.md
│ │ │ │ │ ├── tealscript:guides_Supported Types_arrays.md
│ │ │ │ │ ├── tealscript:guides_Supported Types_numbers.md
│ │ │ │ │ ├── TEALScript:README.md
│ │ │ │ │ ├── tealscript:tests_test_package_README.md
│ │ │ │ │ ├── tealscript:tutorials_Hello World_0001-intro.md
│ │ │ │ │ ├── tealscript:tutorials_Hello World_0002-init.md
│ │ │ │ │ ├── tealscript:tutorials_Hello World_0003-contract.md
│ │ │ │ │ ├── tealscript:tutorials_Hello World_0004-artifacts.md
│ │ │ │ │ ├── tealscript:tutorials_Hello World_0005-hello.md
│ │ │ │ │ └── tealscript:tutorials_Hello World_0006-test.md
│ │ │ │ └── taxonomy-categories
│ │ │ │ ├── algokit-utils.json
│ │ │ │ ├── algokit.json
│ │ │ │ ├── arcs.json
│ │ │ │ ├── clis.json
│ │ │ │ ├── details.json
│ │ │ │ ├── developers.json
│ │ │ │ ├── liquid-auth.json
│ │ │ │ ├── nodes.json
│ │ │ │ ├── puya.json
│ │ │ │ ├── python.json
│ │ │ │ ├── sdks.json
│ │ │ │ └── tealscript.json
│ │ │ └── wallet
│ │ │ └── index.ts
│ │ ├── tools
│ │ │ ├── accountManager.ts
│ │ │ ├── algodManager.ts
│ │ │ ├── apiManager
│ │ │ │ ├── algod
│ │ │ │ │ ├── account.ts
│ │ │ │ │ ├── application.ts
│ │ │ │ │ ├── asset.ts
│ │ │ │ │ ├── index.ts
│ │ │ │ │ └── transaction.ts
│ │ │ │ ├── example
│ │ │ │ │ ├── get-balance.ts
│ │ │ │ │ └── index.ts
│ │ │ │ ├── index.ts
│ │ │ │ ├── indexer
│ │ │ │ │ ├── account.ts
│ │ │ │ │ ├── application.ts
│ │ │ │ │ ├── asset.ts
│ │ │ │ │ ├── index.ts
│ │ │ │ │ └── transaction.ts
│ │ │ │ ├── nfd
│ │ │ │ │ └── index.ts
│ │ │ │ ├── tinyman
│ │ │ │ │ ├── analytics.ts
│ │ │ │ │ ├── bootstrap.ts
│ │ │ │ │ ├── index.ts
│ │ │ │ │ ├── liquidity.ts
│ │ │ │ │ ├── opt_in.ts
│ │ │ │ │ ├── pool.ts
│ │ │ │ │ ├── remove_liquidity.ts
│ │ │ │ │ └── swap.ts
│ │ │ │ ├── ultrade
│ │ │ │ │ ├── index.ts
│ │ │ │ │ ├── market.ts
│ │ │ │ │ ├── system.ts
│ │ │ │ │ └── wallet.ts
│ │ │ │ └── vestige
│ │ │ │ ├── assets.ts
│ │ │ │ ├── balances.ts
│ │ │ │ ├── index.ts
│ │ │ │ ├── networks.ts
│ │ │ │ ├── notes.ts
│ │ │ │ ├── pools.ts
│ │ │ │ ├── protocols.ts
│ │ │ │ ├── swaps.ts
│ │ │ │ └── vaults.ts
│ │ │ ├── arc26Manager.ts
│ │ │ ├── index.ts
│ │ │ ├── knowledgeManager.ts
│ │ │ ├── transactionManager
│ │ │ │ ├── accountTransactions.ts
│ │ │ │ ├── appTransactions
│ │ │ │ │ ├── callTxn.ts
│ │ │ │ │ ├── clearTxn.ts
│ │ │ │ │ ├── closeOutTxn.ts
│ │ │ │ │ ├── createTxn.ts
│ │ │ │ │ ├── deleteTxn.ts
│ │ │ │ │ ├── index.ts
│ │ │ │ │ ├── optInTxn.ts
│ │ │ │ │ ├── test
│ │ │ │ │ │ ├── counter_approval.teal
│ │ │ │ │ │ ├── counter_clear.teal
│ │ │ │ │ │ ├── storage_test_approval_v2.teal
│ │ │ │ │ │ ├── storage_test_approval.teal
│ │ │ │ │ │ └── storage_test_clear.teal
│ │ │ │ │ ├── types.ts
│ │ │ │ │ └── updateTxn.ts
│ │ │ │ ├── assetTransactions.ts
│ │ │ │ ├── generalTransaction.ts
│ │ │ │ └── index.ts
│ │ │ └── utilityManager.ts
│ │ ├── types.ts
│ │ └── utils
│ │ └── responseProcessor.ts
│ ├── tests
│ │ ├── resources
│ │ │ ├── algod
│ │ │ │ ├── account.test.ts
│ │ │ │ ├── application.test.ts
│ │ │ │ ├── asset.test.ts
│ │ │ │ └── transaction.test.ts
│ │ │ └── indexer
│ │ │ ├── account.test.ts
│ │ │ ├── application.test.ts
│ │ │ ├── asset.test.ts
│ │ │ └── transaction.test.ts
│ │ └── tools
│ │ ├── accountManager.test.ts
│ │ ├── algodManager.test.ts
│ │ ├── apiManager
│ │ │ └── example
│ │ │ └── get-balance.test.ts
│ │ ├── transactionManager
│ │ │ ├── accountTransactionManager.test.ts
│ │ │ ├── appTransactionManager.test.ts
│ │ │ ├── assetTransactionManager.test.ts
│ │ │ ├── generalTransactionManager.test.ts
│ │ │ └── transactionManager.test.ts
│ │ └── utilityManager.test.ts
│ └── tsconfig.json
├── README.md
├── rename_files.sh
└── tsconfig.json
```
# Files
--------------------------------------------------------------------------------
/packages/server/src/resources/knowledge/taxonomy-categories/clis.json:
--------------------------------------------------------------------------------
```json
{
"name": "CLI Tools",
"description": "Command Line Interface tools for Algorand development",
"path": "developer:docs:clis",
"subcategories": {
"goal": {
"name": "Goal",
"description": "Main Algorand CLI tool",
"path": "developer:docs:clis:goal",
"documents": [
{"name": "Goal Overview", "path": "developer:docs:clis:goal:goal.md"},
{"name": "License", "path": "developer:docs:clis:goal:license.md"},
{"name": "Protocols", "path": "developer:docs:clis:goal:protocols.md"},
{"name": "Report", "path": "developer:docs:clis:goal:report.md"},
{"name": "Version", "path": "developer:docs:clis:goal:version.md"}
],
"subcategories": {
"account": {
"name": "Account Commands",
"description": "Account management commands",
"path": "developer:docs:clis:goal:account",
"documents": [
{"name": "Account Overview", "path": "developer:docs:clis:goal:account:account.md"},
{"name": "Add Part Key", "path": "developer:docs:clis:goal:account:addpartkey.md"},
{"name": "Asset Details", "path": "developer:docs:clis:goal:account:assetdetails.md"},
{"name": "Balance", "path": "developer:docs:clis:goal:account:balance.md"},
{"name": "Change Online Status", "path": "developer:docs:clis:goal:account:changeonlinestatus.md"},
{"name": "Delete", "path": "developer:docs:clis:goal:account:delete.md"},
{"name": "Delete Part Key", "path": "developer:docs:clis:goal:account:deletepartkey.md"},
{"name": "Dump", "path": "developer:docs:clis:goal:account:dump.md"},
{"name": "Export", "path": "developer:docs:clis:goal:account:export.md"},
{"name": "Import", "path": "developer:docs:clis:goal:account:import.md"},
{"name": "Import Root Key", "path": "developer:docs:clis:goal:account:importrootkey.md"},
{"name": "Info", "path": "developer:docs:clis:goal:account:info.md"},
{"name": "Install Part Key", "path": "developer:docs:clis:goal:account:installpartkey.md"},
{"name": "List", "path": "developer:docs:clis:goal:account:list.md"},
{"name": "List Part Keys", "path": "developer:docs:clis:goal:account:listpartkeys.md"},
{"name": "Mark Non Participating", "path": "developer:docs:clis:goal:account:marknonparticipating.md"},
{"name": "New", "path": "developer:docs:clis:goal:account:new.md"},
{"name": "Part Key Info", "path": "developer:docs:clis:goal:account:partkeyinfo.md"},
{"name": "Rename", "path": "developer:docs:clis:goal:account:rename.md"},
{"name": "Renew All Part Keys", "path": "developer:docs:clis:goal:account:renewallpartkeys.md"},
{"name": "Renew Part Key", "path": "developer:docs:clis:goal:account:renewpartkey.md"},
{"name": "Rewards", "path": "developer:docs:clis:goal:account:rewards.md"}
],
"subcategories": {
"multisig": {
"name": "Multisig Commands",
"description": "Multisignature account commands",
"path": "developer:docs:clis:goal:account:multisig",
"documents": [
{"name": "Multisig Overview", "path": "developer:docs:clis:goal:account:multisig:multisig.md"},
{"name": "Delete", "path": "developer:docs:clis:goal:account:multisig:delete.md"},
{"name": "Info", "path": "developer:docs:clis:goal:account:multisig:info.md"},
{"name": "New", "path": "developer:docs:clis:goal:account:multisig:new.md"}
]
}
}
},
"app": {
"name": "Application Commands",
"description": "Smart contract application commands",
"path": "developer:docs:clis:goal:app",
"documents": [
{"name": "App Overview", "path": "developer:docs:clis:goal:app:app.md"},
{"name": "Call", "path": "developer:docs:clis:goal:app:call.md"},
{"name": "Clear", "path": "developer:docs:clis:goal:app:clear.md"},
{"name": "Close Out", "path": "developer:docs:clis:goal:app:closeout.md"},
{"name": "Create", "path": "developer:docs:clis:goal:app:create.md"},
{"name": "Delete", "path": "developer:docs:clis:goal:app:delete.md"},
{"name": "Info", "path": "developer:docs:clis:goal:app:info.md"},
{"name": "Method", "path": "developer:docs:clis:goal:app:method.md"},
{"name": "Opt In", "path": "developer:docs:clis:goal:app:optin.md"},
{"name": "Read", "path": "developer:docs:clis:goal:app:read.md"},
{"name": "Update", "path": "developer:docs:clis:goal:app:update.md"}
],
"subcategories": {
"box": {
"name": "Box Commands",
"description": "Application box storage commands",
"path": "developer:docs:clis:goal:app:box",
"documents": [
{"name": "Box Overview", "path": "developer:docs:clis:goal:app:box:box.md"},
{"name": "Info", "path": "developer:docs:clis:goal:app:box:info.md"},
{"name": "List", "path": "developer:docs:clis:goal:app:box:list.md"}
]
},
"interact": {
"name": "Interaction Commands",
"description": "Application interaction commands",
"path": "developer:docs:clis:goal:app:interact",
"documents": [
{"name": "Interact Overview", "path": "developer:docs:clis:goal:app:interact:interact.md"},
{"name": "Execute", "path": "developer:docs:clis:goal:app:interact:execute.md"},
{"name": "Query", "path": "developer:docs:clis:goal:app:interact:query.md"}
]
}
}
},
"asset": {
"name": "Asset Commands",
"description": "Asset management commands",
"path": "developer:docs:clis:goal:asset",
"documents": [
{"name": "Asset Overview", "path": "developer:docs:clis:goal:asset:asset.md"},
{"name": "Config", "path": "developer:docs:clis:goal:asset:config.md"},
{"name": "Create", "path": "developer:docs:clis:goal:asset:create.md"},
{"name": "Destroy", "path": "developer:docs:clis:goal:asset:destroy.md"},
{"name": "Freeze", "path": "developer:docs:clis:goal:asset:freeze.md"},
{"name": "Info", "path": "developer:docs:clis:goal:asset:info.md"},
{"name": "Opt In", "path": "developer:docs:clis:goal:asset:optin.md"},
{"name": "Send", "path": "developer:docs:clis:goal:asset:send.md"}
]
},
"clerk": {
"name": "Clerk Commands",
"description": "Transaction commands",
"path": "developer:docs:clis:goal:clerk",
"documents": [
{"name": "Clerk Overview", "path": "developer:docs:clis:goal:clerk:clerk.md"},
{"name": "Compile", "path": "developer:docs:clis:goal:clerk:compile.md"},
{"name": "Dryrun", "path": "developer:docs:clis:goal:clerk:dryrun.md"},
{"name": "Dryrun Remote", "path": "developer:docs:clis:goal:clerk:dryrun-remote.md"},
{"name": "Group", "path": "developer:docs:clis:goal:clerk:group.md"},
{"name": "Inspect", "path": "developer:docs:clis:goal:clerk:inspect.md"},
{"name": "Raw Send", "path": "developer:docs:clis:goal:clerk:rawsend.md"},
{"name": "Send", "path": "developer:docs:clis:goal:clerk:send.md"},
{"name": "Sign", "path": "developer:docs:clis:goal:clerk:sign.md"},
{"name": "Simulate", "path": "developer:docs:clis:goal:clerk:simulate.md"},
{"name": "Split", "path": "developer:docs:clis:goal:clerk:split.md"},
{"name": "TEAL Sign", "path": "developer:docs:clis:goal:clerk:tealsign.md"}
],
"subcategories": {
"multisig": {
"name": "Multisig Commands",
"description": "Multisignature transaction commands",
"path": "developer:docs:clis:goal:clerk:multisig",
"documents": [
{"name": "Multisig Overview", "path": "developer:docs:clis:goal:clerk:multisig:multisig.md"},
{"name": "Merge", "path": "developer:docs:clis:goal:clerk:multisig:merge.md"},
{"name": "Sign", "path": "developer:docs:clis:goal:clerk:multisig:sign.md"},
{"name": "Sign Program", "path": "developer:docs:clis:goal:clerk:multisig:signprogram.md"}
]
}
}
}
}
},
"indexer": {
"name": "Indexer",
"description": "Algorand blockchain indexer",
"path": "developer:docs:clis:indexer",
"documents": [
{"name": "Indexer Overview", "path": "developer:docs:clis:indexer:indexer.md"},
{"name": "API Config", "path": "developer:docs:clis:indexer:api-config.md"},
{"name": "Daemon", "path": "developer:docs:clis:indexer:daemon.md"}
],
"subcategories": {
"util": {
"name": "Utility Commands",
"description": "Indexer utility commands",
"path": "developer:docs:clis:indexer:util",
"documents": [
{"name": "Util Overview", "path": "developer:docs:clis:indexer:util:util.md"},
{"name": "Validator", "path": "developer:docs:clis:indexer:util:validator.md"}
]
}
}
},
"algokey": {
"name": "Algokey",
"description": "Key management tool",
"path": "developer:docs:clis:algokey",
"documents": [
{"name": "Algokey Overview", "path": "developer:docs:clis:algokey:algokey.md"},
{"name": "Export", "path": "developer:docs:clis:algokey:export.md"},
{"name": "Generate", "path": "developer:docs:clis:algokey:generate.md"},
{"name": "Import", "path": "developer:docs:clis:algokey:import.md"},
{"name": "Sign", "path": "developer:docs:clis:algokey:sign.md"}
],
"subcategories": {
"multisig": {
"name": "Multisig Commands",
"description": "Multisignature key commands",
"path": "developer:docs:clis:algokey:multisig",
"documents": [
{"name": "Multisig Overview", "path": "developer:docs:clis:algokey:multisig:multisig.md"},
{"name": "Append Auth Address", "path": "developer:docs:clis:algokey:multisig:append-auth-addr.md"}
]
},
"part": {
"name": "Participation Key Commands",
"description": "Participation key management commands",
"path": "developer:docs:clis:algokey:part",
"documents": [
{"name": "Part Overview", "path": "developer:docs:clis:algokey:part:part.md"},
{"name": "Generate", "path": "developer:docs:clis:algokey:part:generate.md"},
{"name": "Info", "path": "developer:docs:clis:algokey:part:info.md"},
{"name": "Key Registration", "path": "developer:docs:clis:algokey:part:keyreg.md"},
{"name": "Reparent", "path": "developer:docs:clis:algokey:part:reparent.md"}
]
}
}
},
"diagcfg": {
"name": "Diagnostic Config",
"description": "Diagnostic configuration tool",
"path": "developer:docs:clis:diagcfg",
"documents": [
{"name": "Diagcfg Overview", "path": "developer:docs:clis:diagcfg:diagcfg.md"}
],
"subcategories": {
"metric": {
"name": "Metric Commands",
"description": "Metric configuration commands",
"path": "developer:docs:clis:diagcfg:metric",
"documents": [
{"name": "Metric Overview", "path": "developer:docs:clis:diagcfg:metric:metric.md"},
{"name": "Disable", "path": "developer:docs:clis:diagcfg:metric:disable.md"},
{"name": "Enable", "path": "developer:docs:clis:diagcfg:metric:enable.md"},
{"name": "Status", "path": "developer:docs:clis:diagcfg:metric:status.md"}
]
},
"telemetry": {
"name": "Telemetry Commands",
"description": "Telemetry configuration commands",
"path": "developer:docs:clis:diagcfg:telemetry",
"documents": [
{"name": "Telemetry Overview", "path": "developer:docs:clis:diagcfg:telemetry:telemetry.md"},
{"name": "Disable", "path": "developer:docs:clis:diagcfg:telemetry:disable.md"},
{"name": "Enable", "path": "developer:docs:clis:diagcfg:telemetry:enable.md"},
{"name": "Endpoint", "path": "developer:docs:clis:diagcfg:telemetry:endpoint.md"},
{"name": "Name", "path": "developer:docs:clis:diagcfg:telemetry:name.md"},
{"name": "Status", "path": "developer:docs:clis:diagcfg:telemetry:status.md"}
]
}
}
},
"tealdbg": {
"name": "TEAL Debugger",
"description": "TEAL program debugger",
"path": "developer:docs:clis:tealdbg",
"documents": [
{"name": "Tealdbg Overview", "path": "developer:docs:clis:tealdbg:tealdbg.md"},
{"name": "Debug", "path": "developer:docs:clis:tealdbg:debug.md"},
{"name": "Remote", "path": "developer:docs:clis:tealdbg:remote.md"}
]
},
"conduit": {
"name": "Conduit",
"description": "Data pipeline tool",
"path": "developer:docs:clis:conduit",
"documents": [
{"name": "Conduit Overview", "path": "developer:docs:clis:conduit:conduit.md"},
{"name": "Init", "path": "developer:docs:clis:conduit:init.md"}
],
"subcategories": {
"list": {
"name": "List Commands",
"description": "List available components",
"path": "developer:docs:clis:conduit:list",
"documents": [
{"name": "List Overview", "path": "developer:docs:clis:conduit:list:list.md"},
{"name": "Exporters", "path": "developer:docs:clis:conduit:list:exporters.md"},
{"name": "Importers", "path": "developer:docs:clis:conduit:list:importers.md"},
{"name": "Processors", "path": "developer:docs:clis:conduit:list:processors.md"}
]
}
}
},
"kmd": {
"name": "Key Management Daemon",
"description": "Key management service",
"path": "developer:docs:clis:kmd",
"documents": [
{"name": "KMD Overview", "path": "developer:docs:clis:kmd:kmd.md"}
]
}
}
}
```
--------------------------------------------------------------------------------
/packages/server/src/resources/knowledge/taxonomy/puya:docs:compiler.md:
--------------------------------------------------------------------------------
```markdown
# PuyaPy compiler
The PuyaPy compiler is a multi-stage, optimising compiler that takes Algorand Python and prepares it for execution on the AVM. PuyaPy ensures the resulting AVM bytecode execution semantics that match the given Python code. PuyaPy produces output that is directly compatible with [AlgoKit typed clients](https://github.com/algorandfoundation/algokit-cli/blob/main/docs/features/generate.md#1-typed-clients) to make deployment and calling easy (among other formats).
The PuyaPy compiler is based on the [Puya compiler architecture](#compiler-architecture), which allows for multiple frontend languages to leverage the majority of the compiler logic so adding new frontend languages for execution on Algorand is relatively easy.
## Compiler installation
The minimum supported Python version for running the PuyaPy compiler is 3.12.
There are three ways of installing the PuyaPy compiler.
1. You can install [AlgoKit CLI](https://github.com/algorandfoundation/algokit-cli?tab=readme-ov-file#install) and you can then use the `algokit compile py` command.
2. You can install the PuyaPy compiler into your project and thus lock the compiler version for that project:
```shell
pip install puyapy
# OR
poetry add puyapy --group=dev
```
Note: if you do this then when you use`algokit compile py` within that project directory it will invoke the installed compiler rather than a global one.
3. You can install the compiler globally using [pipx](https://pipx.pypa.io/stable/):
```shell
pipx install puya
```
Alternatively, it can be installed per project. For example, if you're using [poetry](https://python-poetry.org),
you can install it as a dev-dependency like so:
If you just want to play with some examples, you can clone the repo and have a poke around:
```shell
git clone https://github.com/algorandfoundation/puya.git
cd puya
poetry install
poetry shell
# compile the "Hello World" example
puyapy examples/hello_world
```
## Using the compiler
To check that you can run the compiler successfully after installation, you can run the
help command:
```
puyapy -h
# OR
algokit compile py -h
```
To compile a contract or contracts, just supply the path(s) - either to the .py files themselves,
or the containing directories. In the case of containing directories, any (non-abstract) contracts
discovered therein will be compiled, allowing you to compile multiple contracts at once. You can
also supply more than one path at a time to the compiler.
e.g. either `puyapy my_project/` or `puyapy my_project/contract.py` will work to compile a single contract.
## Compiler architecture
The PuyaPy compiler is based on the Puya compiler architecture, which allows for multiple frontend languages to leverage the majority of the compiler logic so adding new frontend languages for execution on Algorand is relatively easy.
The PuyaPy compiler takes Algorand Python through a series of transformations with each transformation serving a specific purpose:
Python code
-> Python Abstract Syntax Tree (AST)
-> MyPy AST
-> Puya AST (AWST)
-> Intermediate Representation (IR) in SSA form
-> Optimizations (multiple rounds)
-> Destructured IR
-> Optimizations (multiple rounds)
-> Memory IR (MIR)
-> Optimizations (multiple rounds)
-> TealOps IR
-> Optimizations (multiple rounds)
-> TEAL code
-> AVM bytecode
While this may appear complex, splitting it in this manner allows for each step to be expressed in a simple form to do one thing (well) and allows us to make use of industry research into compiler algorithms and formats.
## Type checking
The first and second steps of the [compiler pipeline](#compiler-architecture) are significant to note, because it's where we perform type checking. We leverage [MyPy](https://mypy-lang.org/) to do this, so we recommend that you install and use the latest version of MyPy in your development environment to get the best typing information that aligns to what the PuyaPy compiler expects. This should work with standard Python tooling e.g. with Visual Studio Code, PyCharm, et. al.
The easiest way to get a productive development environment with Algorand Python is to instantiate a template with AlgoKit via `algokit init -t python`. This will give you a full development environment with intellisense, linting, automatic formatting, breakpoint debugging, deployment and CI/CD.
Alternatively, you can construct your own environment by configuring MyPy, Ruff, etc. with the same configuration files [used by that template](https://github.com/algorandfoundation/algokit-python-template).
The MyPy config that PuyaPy uses is in [compile.py](https://github.com/algorandfoundation/puya/blob/main/src/puya/compile.py#L79)
## Compiler usage
The options available for the compile can be seen by executing `puyapy -h` or `algokit compile py -h`:
```
puyapy [-h] [--version] [-O {0,1,2}]
[--output-teal | --no-output-teal] [--output-arc32 | --no-output-arc32]
[--output-client | --no-output-client] [--out-dir OUT_DIR]
[--log-level {notset,debug,info,warning,error,critical}] [-g {0,1,2}] [--output-awst | --no-output-awst]
[--output-ssa-ir | --no-output-ssa-ir] [--output-optimization-ir | --no-output-optimization-ir]
[--output-destructured-ir | --no-output-destructured-ir] [--output-memory-ir | --no-output-memory-ir]
[--target-avm-version {10}]
[--locals-coalescing-strategy {root_operand,root_operand_excluding_args,aggressive}]
PATH [PATH ...]
```
### Options
| Option | Description | Default |
|----------------------------------------------------------|-----------------------------------------------------------------------------------------------------------------------------------------------------------------------|-------------------------|
| `-h`, `--help` | Show the help message and exit | N/A |
| `--version` | Show program's version number and exit | N/A |
| `-O {0,1,2}` <br />`--optimization-level {0,1,2}` | Set optimization level of output TEAL / AVM bytecode | `1` |
| `--output-teal`, `--no-output-teal` | Output TEAL | `True` |
| `--output-arc32`, `--no-output-arc32` | Output {contract}.arc32.json ARC-32 app spec file if the contract is an ARC-4 contract | `True` |
| `--output-arc56`, `--no-output-arc56` | Output {contract}.arc56.json ARC-56 app spec file if the contract is an ARC-4 contract | `False` |
| `--output-client`, `--no-output-client` | Output Algorand Python contract client for typed ARC4 ABI calls | `False` |
| `--output-bytecode`, `--no-output-bytecode` | Output AVM bytecode | `False` |
| `--out-dir OUT_DIR` | The path for outputting artefacts | Same folder as contract |
| `--log-level {notset,debug,info,warning,error,critical}` | Minimum level to log to console | `info` |
| `-g {0,1,2}`, `--debug-level {0,1,2}` | Output debug information level<br /> `0` = No debug annotations <br /> `1` = Output debug annotations <br /> `2` = Reserved for future use, currently the same as `1` | `1` |
| `--template-var` | Allows specifying template values. Can be used multiple times, see below for examples | N/A |
| `--template-vars-prefix` | Prefix to use for template variables | "TMPL_" |
### Defining template values
[Template Variables](#algopy.TemplateVar), can be replaced with literal values during compilation to bytecode using the `--template-var` option.
Additionally, Algorand Python functions that create AVM bytecode, such as [compile_contract](#algopy.compile_contract) and [compile_logicsig](#algopy.compile_logicsig), can also provide the specified values.
#### Examples of Variable Definitions
The table below illustrates how different variables and values can be defined:
| Variable Type | Example Algorand Python | Value definition example |
|--------------------------|-------------------------------------------|--------------------------|
| [UInt64](#algopy.UInt64) | `algopy.TemplateVar[UInt64]("SOME_INT")` | `SOME_INT=1234` |
| [Bytes](#algopy.Bytes) | `algopy.TemplateVar[Bytes]("SOME_BYTES")` | `SOME_BYTES=0x1A2B` |
| [String](#algopy.String) | `algopy.TemplateVar[String]("SOME_STR")` | `SOME_STR="hello"` |
All template values specified via the command line are prefixed with "TMPL_" by default.
The default prefix can be modified using the `--template-vars-prefix` option.
### Advanced options
There are additional compiler options that allow you to tweak the behaviour in more advanced ways or tweak the output to receive intermediate representations from the compiler pipeline. Most users won't need to use these options unless exploring the inner workings of the compiler or performing more advanced optimisations.
| Option | Description | Default |
| ------------------------------------------------------------------------------------ | --------------------------------------------------------------------------------------------------------------------------------- | -------------- |
| `--output-awst`, `--no-output-awst` | Output parsed result of Puya Abstract Syntax Tree (AWST) | `False` |
| `--output-ssa-ir`, `--no-output-ssa-ir` | Output the Intermediate Representation (IR) in Single Static Assignment (SSA) form before optimisations form | `False` |
| `--output-optimization-ir`, `--no-output-optimization-ir` | Output the IR after each optimization step | `False` |
| `--output-destructured-ir`, `--no-output-destructured-ir` | Output the IR after SSA destructuring and before Memory IR (MIR) | `False` |
| `--output-memory-ir`, `--no-output-memory-ir` | Output Memory IR (MIR) before lowering to TealOps IR | |
| `--target-avm-version {10}` | Target AVM version for the output | `10` |
| `--locals-coalescing-strategy {root_operand,root_operand_excluding_args,aggressive}` | Strategy choice for out-of-ssa local variable coalescing. The best choice for your app is best determined through experimentation | `root_operand` |
## Sample `pyproject.toml`
A sample `pyproject.toml` file with known good configuration is:
```ini
[tool.poetry]
name = "algorand_python_contract"
version = "0.1.0"
description = "Algorand smart contracts"
authors = ["Name <[email protected]>"]
readme = "README.md"
[tool.poetry.dependencies]
python = "^3.12"
algokit-utils = "^2.2.0"
python-dotenv = "^1.0.0"
algorand-python = "^1.0.0"
[tool.poetry.group.dev.dependencies]
black = { extras = ["d"], version = "*" }
ruff = "^0.1.6"
mypy = "*"
pytest = "*"
pytest-cov = "*"
pip-audit = "*"
pre-commit = "*"
puyapy = "^1.0"
[build-system]
requires = ["poetry-core"]
build-backend = "poetry.core.masonry.api"
[tool.ruff]
line-length = 120
select = [
"E",
"F",
"ANN",
"UP",
"N",
"C4",
"B",
"A",
"YTT",
"W",
"FBT",
"Q",
"RUF",
"I",
]
ignore = [
"ANN101", # no type for self
"ANN102", # no type for cls
]
unfixable = ["B", "RUF"]
[tool.ruff.flake8-annotations]
allow-star-arg-any = true
suppress-none-returning = true
[tool.pytest.ini_options]
pythonpath = ["smart_contracts", "tests"]
[tool.mypy]
files = "smart_contracts/"
python_version = "3.12"
disallow_any_generics = true
disallow_subclassing_any = true
disallow_untyped_calls = true
disallow_untyped_defs = true
disallow_incomplete_defs = true
check_untyped_defs = true
disallow_untyped_decorators = true
warn_redundant_casts = true
warn_unused_ignores = true
warn_return_any = true
strict_equality = true
strict_concatenate = true
disallow_any_unimported = true
disallow_any_expr = true
disallow_any_decorated = true
disallow_any_explicit = true
```
```
--------------------------------------------------------------------------------
/packages/server/src/resources/knowledge/taxonomy/developer:docs:details:dapps:writing-contracts:beaker.md:
--------------------------------------------------------------------------------
```markdown
title: Beaker
!!! note
For a native Python experience, checkout our [Algorand Python](https://algorandfoundation.github.io/puya/) docs.
Beaker is a framework for building Smart Contracts using PyTeal. Beaker is designed to simplify writing, testing and deploying Algorand smart contracts. The Beaker source code available on [github](https://github.com/algorand-devrel/beaker).
This page provides an overview of the features available in Beaker. For complete details see the [Beaker's documentation](https://beaker.algo.xyz).
# Quick start videos
If you prefer videos, take a look at this playlist to learn about Beaker. Most of the videos in the list are under 12 minutes each.
<iframe width="100%" style="aspect-ratio:16/9" src="https://www.youtube-nocookie.com/embed/RhfC5Xd25dk" title="YouTube video player" frameborder="0" allow="accelerometer; autoplay; clipboard-write; encrypted-media; gyroscope; picture-in-picture; web-share" allowfullscreen></iframe>
# High Level Overview
Beaker provides several packages that extend PyTeal and provide convenience functionality for testing and deploying smart contracts.
The `Application` class is Beaker's primary class. It is used to create [ABI](/docs/get-details/dapps/smart-contracts/ABI/) compliant Algorand smart contracts. Beaker also provides decorators to route specific [application transactions](/docs/get-details/dapps/smart-contracts/apps/) to the proper functionality within a smart contract. Beaker facilitates management of [local](/docs/get-details/dapps/smart-contracts/apps/state#local-storage) and [global](/docs/get-details/dapps/smart-contracts/apps/state#global-storage) state, and [box storage](/docs/get-details/dapps/smart-contracts/apps/state#box-storage).
The `ApplicationSpecification` class is used to generate a JSON manifest that describes the contract methods, source, and state schema used. This manifest can be used by other modules and utilities to deploy the smart contract.
The `ApplicationClient` class can be used to connect to an Algorand node and interact with a specific `Application`.
Beaker's sandbox module can be used to quickly connect to the default docker sandbox installation to deploy and call a contract.
# Install
Beaker can be installed using pip package manager.
`pip install beaker-pyteal`
Alternatively, Beaker can be installed with [AlgoKit](/docs/get-details/algokit) using the beaker project template.
`algokit init --template beaker`
Either of these methods will also install PyTeal in addition to Beaker.
!!!note
Beaker requires python version 3.10 or higher
# Initialize Application
To create an application simply initialize a new Beaker Application object, supplying the name and description.
<!-- ===BEAKER_INIT_APP=== -->
```python
from beaker import Application
app = Application("MyRadApp", descr="This is a rad app")
```
[Snippet Source](https://github.com/algorand-devrel/beaker/blob/examples/examples/docs_app/app_handlers.py#L1-L4)
<!-- ===BEAKER_INIT_APP=== -->
This is enough to generate the `ApplicationSpecification` that can be exported for use by other tools. This spec can be generated using the `Application` `build` method. Optionally you can use the `export` method to export the approval and clear TEAL programs, the ABI contract manifest, and the application specification.
!!!note
At this point a complete smart contract has been written, albeit with no utility.
<!-- ===BEAKER_APP_SPEC=== -->
```python
app_spec = app.build()
print(app_spec.to_json())
```
[Snippet Source](https://github.com/algorand-devrel/beaker/blob/examples/examples/docs_app/app_handlers.py#L7-L9)
<!-- ===BEAKER_APP_SPEC=== -->
# Add Method Handlers
Method handlers can be added to provide functionality within the smart contract. This can be accomplished using the `external` decorator or by using a blueprint.
## external
To provide a method that can be invoked by an application call transaction, Beaker provides the `external` decorator. This instructs the framework to expose the method publicly for incoming transactions. The method is then defined with its required [method signature](/docs/get-details/dapps/smart-contracts/ABI/#methods), where the parameter types in the method signature describe the input types and output type. These types of the arguments must be valid ABI data types, using [PyTeal's ABI](https://pyteal.readthedocs.io/en/stable/abi.html) package. Arguments and output types are optional, omitting any arguments is perfectly valid.
!!! note
Note that input types come first, and if a value is returned it should be denoted in the method signature at the end using the notation `*, output: abi.ValidABIType`, which provides a variable to write the output into.
<!-- ===BEAKER_HANDLERS_DIRECT=== -->
```python
import pyteal as pt
# use the decorator provided on the `app` object to register a handler
@app.external
def add(a: pt.abi.Uint64, b: pt.abi.Uint64, *, output: pt.abi.Uint64) -> pt.Expr:
return output.set(a.get() + b.get())
```
[Snippet Source](https://github.com/algorand-devrel/beaker/blob/examples/examples/docs_app/app_handlers.py#L13-L22)
<!-- ===BEAKER_HANDLERS_DIRECT=== -->
In the example above the add method is defined to take two `Uint64` arguments (`a`, `b`) and return a `Uint64` (`output`).
The full method signature for the above is `add(uint64,uint64)uint64` and will, by default, field only application call transactions with an `OnComplete` of `NoOp`.
## On Complete handlers
There are other decorators that can be used to modify the behavior of the method handler including `create`, `optin`, `closeout`, `clear`, `update`, and `delete`. These decorators can be used to register handlers for specific `OnComplete` values. See the [full docs](https://beaker.algo.xyz) for more details.
## Blueprints
Beaker allows for a pattern called `blueprints` apply a set of method handlers to an Application. Adding handlers using a blueprint allows for code re-use and makes it easier to add behaviors, especially for applications that wish to adhere to some ARC standard.
Blueprints can be defined using a standard python method definition that accepts an Application as an argument and applies the handlers.
The code below defines a calculator blueprint that applies method handlers for a set of functions to implement a simple calculator. The blueprint must take an `Application` argument and optionally other arguments to modify the behavior of the blueprint
An instantiated `Application` can apply this blueprint using the `.apply` method passing blueprint method as an argument. If other arguments in the blueprint method are defined, they can be passed with standard python kwarg format (i.e. `.apply(bp, arg1="hello")`)
<!-- ===BEAKER_HANDLERS_BLUEPRINT=== -->
```python
# passing the app to this method will register the handlers on the app
def calculator_blueprint(app: Application) -> Application:
@app.external
def add(a: pt.abi.Uint64, b: pt.abi.Uint64, *, output: pt.abi.Uint64) -> pt.Expr:
return output.set(a.get() + b.get())
@app.external
def sub(a: pt.abi.Uint64, b: pt.abi.Uint64, *, output: pt.abi.Uint64) -> pt.Expr:
return output.set(a.get() - b.get())
@app.external
def div(a: pt.abi.Uint64, b: pt.abi.Uint64, *, output: pt.abi.Uint64) -> pt.Expr:
return output.set(a.get() / b.get())
@app.external
def mul(a: pt.abi.Uint64, b: pt.abi.Uint64, *, output: pt.abi.Uint64) -> pt.Expr:
return output.set(a.get() * b.get())
return app
calculator_app = Application("CalculatorApp", descr="This is a calculator app")
calculator_app.apply(calculator_blueprint)
calculator_app_spec = calculator_app.build()
print(calculator_app_spec.to_json())
```
[Snippet Source](https://github.com/algorand-devrel/beaker/blob/examples/examples/docs_app/app_handlers.py#L25-L51)
<!-- ===BEAKER_HANDLERS_BLUEPRINT=== -->
An application that has a blueprint applied can also implement additional handlers or apply additional blueprints. Identical method signatures are not allowed. However, if necessary, an identical method signature still be registered by adding the override attribute to the decorator, `external(override=True)`.
# Add State
An Application can define the state it uses to store data. This is done by defining a class that contains some number of `StateValue` objects as attributes and passing an instance of that class to the Application constructor.
Beaker's `GlobalStateValue` class can be used to define and alter a contract's global state values. Global state values are defined by passing the `TealType` and a description the `GlobalStateValue` constructor.
!!! note
`TealType` is specific to the AVM and only `bytes`, `unit64` are acceptable values for state.
The code below illustrates creating global integer counter that is stored in state. First, a `CounterState` class is created with an instance of a `GlobalStateValue` as an attribute. This class is then instantiated and passed in the `Application` constructor. Two method handlers are also added to the app to increment and decrement the counter.
<!-- ===BEAKER_STATE_GLOBAL=== -->
```python
import pyteal as pt
from beaker import Application, GlobalStateValue
class CounterState:
counter = GlobalStateValue(
stack_type=pt.TealType.uint64,
descr="A counter for showing how to use application state",
)
app = Application(
"CounterApp", descr="An app that holds a counter", state=CounterState()
)
@app.external
def increment() -> pt.Expr:
return app.state.counter.set(app.state.counter + pt.Int(1))
@app.external
def decrement() -> pt.Expr:
return app.state.counter.set(app.state.counter - pt.Int(1))
app_spec = app.build()
print(app_spec.global_state_schema.dictify())
```
[Snippet Source](https://github.com/algorand-devrel/beaker/blob/examples/examples/docs_app/app_state.py#L3-L31)
<!-- ===BEAKER_STATE_GLOBAL=== -->
Similarly, a `LocalStateValue` can be used to alter and store local state values. The code below is identical to the previous example, except the counter is stored locally.
<!-- ===BEAKER_STATE_LOCAL=== -->
```python
import pyteal as pt
from beaker import Application, LocalStateValue
class LocalCounterState:
local_counter = LocalStateValue(
stack_type=pt.TealType.uint64,
descr="A counter for showing how to use application state",
)
local_app = Application(
"CounterApp", descr="An app that holds a counter", state=LocalCounterState()
)
@local_app.external
def user_increment() -> pt.Expr:
return local_app.state.local_counter.set(local_app.state.local_counter + pt.Int(1))
@local_app.external
def user_decrement() -> pt.Expr:
return local_app.state.local_counter.set(local_app.state.local_counter - pt.Int(1))
local_app_spec = local_app.build()
print(local_app_spec.local_state_schema.dictify())
```
[Snippet Source](https://github.com/algorand-devrel/beaker/blob/examples/examples/docs_app/app_state.py#L34-L62)
<!-- ===BEAKER_STATE_LOCAL=== -->
Beaker provides the `BoxMapping` and `BoxList` classes to work in conjunction with existing PyTeal [box functionality](/docs/get-details/dapps/smart-contracts/apps/state#box-storage).
In the example below a `BoxMapping` instance is defined in the `MappingState` class. Each entry in the map is keyed using the type of `Address` and stores a `Uint64` value.
The method handler we define allows us to set an integer for the specific application caller's address.
<!-- ===BEAKER_STATE_MAPPING=== -->
```python
import pyteal as pt
from beaker.lib.storage import BoxMapping
class MappingState:
users = BoxMapping(pt.abi.Address, pt.abi.Uint64)
mapping_app = Application(
"MappingApp", descr="An app that holds a mapping", state=MappingState()
)
@mapping_app.external
def store_user_value(value: pt.abi.Uint64) -> pt.Expr:
# access an element in the mapping by key
return mapping_app.state.users[pt.Txn.sender()].set(value)
```
[Snippet Source](https://github.com/algorand-devrel/beaker/blob/examples/examples/docs_app/app_state.py#L65-L84)
<!-- ===BEAKER_STATE_MAPPING=== -->
The `BoxList` class can be used to store a list of specific _static_ ABI types. The example below creates a box named `users` that stores a list of five addresses. The `store_user` method is passed an address and an index. The passed-in address is then stored in the `BoxList` at the specified index.
<!-- ===BEAKER_STATE_LIST=== -->
```python
import pyteal as pt
from beaker.lib.storage import BoxList
class ListState:
users = BoxList(pt.abi.Address, 5)
list_app = Application("ListApp", descr="An app that holds a list", state=ListState())
@list_app.external
def store_user(user: pt.abi.Address, index: pt.abi.Uint64) -> pt.Expr:
# access an element in the list by index
return list_app.state.users[index.get()].set(user)
```
[Snippet Source](https://github.com/algorand-devrel/beaker/blob/examples/examples/docs_app/app_state.py#L88-L105)
<!-- ===BEAKER_STATE_LIST=== -->
# Interacting with the Application
The contract can be deployed and tested using Beaker's sandbox module and the `ApplicationClient` class.
The code below first retrieves the accounts from the currently running sandbox instance. A `ApplicationClient` (app_client) is then instantiated with an algod client, the `Application` class that is going to be used, and the first sandbox account (sandbox default starts with a couple of predefined accounts) which will be used to sign transactions.
<!-- ===BEAKER_APP_CLIENT_INIT=== -->
```python
from beaker import sandbox, client
# grab funded accounts from the sandbox KMD
accts = sandbox.get_accounts()
# get a client for the sandbox algod
algod_client = sandbox.get_algod_client()
# create an application client for the calculator app
app_client = client.ApplicationClient(
algod_client, calculator_app, signer=accts[0].signer
)
```
[Snippet Source](https://github.com/algorand-devrel/beaker/blob/examples/examples/docs_app/app_client.py#L3-L15)
<!-- ===BEAKER_APP_CLIENT_INIT=== -->
The instance of `AppliationClient` can deploy the calculator app now using the `create` method.
<!-- ===BEAKER_APP_CLIENT_DEPLOY=== -->
```python
app_id, app_addr, txid = app_client.create()
print(f"Created app with id: {app_id} and address: {app_addr} in tx: {txid}")
```
[Snippet Source](https://github.com/algorand-devrel/beaker/blob/examples/examples/docs_app/app_client.py#L19-L21)
<!-- ===BEAKER_APP_CLIENT_DEPLOY=== -->
The contract can then be used to call the contract. In this example the contracts `add` method is called, and two integers are passed as method arguments. Finally, the return value is printed.
<!-- ===BEAKER_APP_CLIENT_CALL=== -->
```python
result = app_client.call("add", a=1, b=2)
print(result.return_value) # 3
```
[Snippet Source](https://github.com/algorand-devrel/beaker/blob/examples/examples/docs_app/app_client.py#L25-L27)
<!-- ===BEAKER_APP_CLIENT_CALL=== -->
This is only a small sample of what Beaker can do. For more see [Beaker's documentation](https://beaker.algo.xyz)
```
--------------------------------------------------------------------------------
/packages/server/src/resources/knowledge/taxonomy/algokit:utils:typescript:code:classes:types_app_manager.AppManager.md:
--------------------------------------------------------------------------------
```markdown
[@algorandfoundation/algokit-utils](../README.md) / [types/app-manager](../modules/types_app_manager.md) / AppManager
# Class: AppManager
[types/app-manager](../modules/types_app_manager.md).AppManager
Allows management of application information.
## Table of contents
### Constructors
- [constructor](types_app_manager.AppManager.md#constructor)
### Properties
- [\_algod](types_app_manager.AppManager.md#_algod)
- [\_compilationResults](types_app_manager.AppManager.md#_compilationresults)
### Methods
- [compileTeal](types_app_manager.AppManager.md#compileteal)
- [compileTealTemplate](types_app_manager.AppManager.md#compiletealtemplate)
- [getBoxNames](types_app_manager.AppManager.md#getboxnames)
- [getBoxValue](types_app_manager.AppManager.md#getboxvalue)
- [getBoxValueFromABIType](types_app_manager.AppManager.md#getboxvaluefromabitype)
- [getBoxValues](types_app_manager.AppManager.md#getboxvalues)
- [getBoxValuesFromABIType](types_app_manager.AppManager.md#getboxvaluesfromabitype)
- [getById](types_app_manager.AppManager.md#getbyid)
- [getCompilationResult](types_app_manager.AppManager.md#getcompilationresult)
- [getGlobalState](types_app_manager.AppManager.md#getglobalstate)
- [getLocalState](types_app_manager.AppManager.md#getlocalstate)
- [decodeAppState](types_app_manager.AppManager.md#decodeappstate)
- [getABIReturn](types_app_manager.AppManager.md#getabireturn)
- [getBoxReference](types_app_manager.AppManager.md#getboxreference)
- [replaceTealTemplateDeployTimeControlParams](types_app_manager.AppManager.md#replacetealtemplatedeploytimecontrolparams)
- [replaceTealTemplateParams](types_app_manager.AppManager.md#replacetealtemplateparams)
- [stripTealComments](types_app_manager.AppManager.md#striptealcomments)
## Constructors
### constructor
• **new AppManager**(`algod`): [`AppManager`](types_app_manager.AppManager.md)
Creates an `AppManager`
#### Parameters
| Name | Type | Description |
| :------ | :------ | :------ |
| `algod` | `AlgodClient` | An algod instance |
#### Returns
[`AppManager`](types_app_manager.AppManager.md)
#### Defined in
[src/types/app-manager.ts:106](https://github.com/algorandfoundation/algokit-utils-ts/blob/main/src/types/app-manager.ts#L106)
## Properties
### \_algod
• `Private` **\_algod**: `AlgodClient`
#### Defined in
[src/types/app-manager.ts:99](https://github.com/algorandfoundation/algokit-utils-ts/blob/main/src/types/app-manager.ts#L99)
___
### \_compilationResults
• `Private` **\_compilationResults**: `Record`\<`string`, [`CompiledTeal`](../interfaces/types_app.CompiledTeal.md)\> = `{}`
#### Defined in
[src/types/app-manager.ts:100](https://github.com/algorandfoundation/algokit-utils-ts/blob/main/src/types/app-manager.ts#L100)
## Methods
### compileTeal
▸ **compileTeal**(`tealCode`): `Promise`\<[`CompiledTeal`](../interfaces/types_app.CompiledTeal.md)\>
Compiles the given TEAL using algod and returns the result, including source map.
The result of this compilation is also cached keyed by the TEAL
code so it can be retrieved via `getCompilationResult`.
This function is re-entrant; it will only compile the same code once.
#### Parameters
| Name | Type | Description |
| :------ | :------ | :------ |
| `tealCode` | `string` | The TEAL code |
#### Returns
`Promise`\<[`CompiledTeal`](../interfaces/types_app.CompiledTeal.md)\>
The information about the compiled file
#### Defined in
[src/types/app-manager.ts:121](https://github.com/algorandfoundation/algokit-utils-ts/blob/main/src/types/app-manager.ts#L121)
___
### compileTealTemplate
▸ **compileTealTemplate**(`tealTemplateCode`, `templateParams?`, `deploymentMetadata?`): `Promise`\<[`CompiledTeal`](../interfaces/types_app.CompiledTeal.md)\>
Performs template substitution of a teal template and compiles it, returning the compiled result.
Looks for `TMPL_{parameter}` for template replacements and replaces AlgoKit deploy-time control parameters
if deployment metadata is specified.
* `TMPL_UPDATABLE` for updatability / immutability control
* `TMPL_DELETABLE` for deletability / permanence control
#### Parameters
| Name | Type | Description |
| :------ | :------ | :------ |
| `tealTemplateCode` | `string` | The TEAL logic to compile |
| `templateParams?` | [`TealTemplateParams`](../interfaces/types_app.TealTemplateParams.md) | Any parameters to replace in the .teal file before compiling |
| `deploymentMetadata?` | `Object` | The deployment metadata the app will be deployed with |
| `deploymentMetadata.deletable?` | `boolean` | - |
| `deploymentMetadata.updatable?` | `boolean` | - |
#### Returns
`Promise`\<[`CompiledTeal`](../interfaces/types_app.CompiledTeal.md)\>
The information about the compiled code
#### Defined in
[src/types/app-manager.ts:153](https://github.com/algorandfoundation/algokit-utils-ts/blob/main/src/types/app-manager.ts#L153)
___
### getBoxNames
▸ **getBoxNames**(`appId`): `Promise`\<[`BoxName`](../interfaces/types_app.BoxName.md)[]\>
Returns the names of the current boxes for the given app.
#### Parameters
| Name | Type | Description |
| :------ | :------ | :------ |
| `appId` | `bigint` | The ID of the app return box names for |
#### Returns
`Promise`\<[`BoxName`](../interfaces/types_app.BoxName.md)[]\>
The current box names
#### Defined in
[src/types/app-manager.ts:239](https://github.com/algorandfoundation/algokit-utils-ts/blob/main/src/types/app-manager.ts#L239)
___
### getBoxValue
▸ **getBoxValue**(`appId`, `boxName`): `Promise`\<`Uint8Array`\>
Returns the value of the given box name for the given app.
#### Parameters
| Name | Type | Description |
| :------ | :------ | :------ |
| `appId` | `bigint` | The ID of the app return box names for |
| `boxName` | [`BoxName`](../interfaces/types_app.BoxName.md) \| [`BoxIdentifier`](../modules/types_app_manager.md#boxidentifier) | The name of the box to return either as a string, binary array or `BoxName` |
#### Returns
`Promise`\<`Uint8Array`\>
The current box value as a byte array
#### Defined in
[src/types/app-manager.ts:256](https://github.com/algorandfoundation/algokit-utils-ts/blob/main/src/types/app-manager.ts#L256)
___
### getBoxValueFromABIType
▸ **getBoxValueFromABIType**(`request`): `Promise`\<`ABIValue`\>
Returns the value of the given box name for the given app decoded based on the given ABI type.
#### Parameters
| Name | Type | Description |
| :------ | :------ | :------ |
| `request` | [`BoxValueRequestParams`](../interfaces/types_app_manager.BoxValueRequestParams.md) | The parameters for the box value request |
#### Returns
`Promise`\<`ABIValue`\>
The current box value as an ABI value
#### Defined in
[src/types/app-manager.ts:278](https://github.com/algorandfoundation/algokit-utils-ts/blob/main/src/types/app-manager.ts#L278)
___
### getBoxValues
▸ **getBoxValues**(`appId`, `boxNames`): `Promise`\<`Uint8Array`[]\>
Returns the value of the given box names for the given app.
#### Parameters
| Name | Type | Description |
| :------ | :------ | :------ |
| `appId` | `bigint` | The ID of the app return box names for |
| `boxNames` | ([`BoxName`](../interfaces/types_app.BoxName.md) \| [`BoxIdentifier`](../modules/types_app_manager.md#boxidentifier))[] | The names of the boxes to return either as a string, binary array or `BoxName` |
#### Returns
`Promise`\<`Uint8Array`[]\>
The current box values as a byte array in the same order as the passed in box names
#### Defined in
[src/types/app-manager.ts:269](https://github.com/algorandfoundation/algokit-utils-ts/blob/main/src/types/app-manager.ts#L269)
___
### getBoxValuesFromABIType
▸ **getBoxValuesFromABIType**(`request`): `Promise`\<`ABIValue`[]\>
Returns the value of the given box names for the given app decoded based on the given ABI type.
#### Parameters
| Name | Type | Description |
| :------ | :------ | :------ |
| `request` | [`BoxValuesRequestParams`](../interfaces/types_app_manager.BoxValuesRequestParams.md) | The parameters for the box value request |
#### Returns
`Promise`\<`ABIValue`[]\>
The current box values as an ABI value in the same order as the passed in box names
#### Defined in
[src/types/app-manager.ts:289](https://github.com/algorandfoundation/algokit-utils-ts/blob/main/src/types/app-manager.ts#L289)
___
### getById
▸ **getById**(`appId`): `Promise`\<[`AppInformation`](../interfaces/types_app_manager.AppInformation.md)\>
Returns the current app information for the app with the given ID.
#### Parameters
| Name | Type | Description |
| :------ | :------ | :------ |
| `appId` | `bigint` | The ID of the app |
#### Returns
`Promise`\<[`AppInformation`](../interfaces/types_app_manager.AppInformation.md)\>
The app information
**`Example`**
```typescript
const appInfo = await appManager.getById(12353n);
```
#### Defined in
[src/types/app-manager.ts:190](https://github.com/algorandfoundation/algokit-utils-ts/blob/main/src/types/app-manager.ts#L190)
___
### getCompilationResult
▸ **getCompilationResult**(`tealCode`): `undefined` \| [`CompiledTeal`](../interfaces/types_app.CompiledTeal.md)
Returns a previous compilation result.
#### Parameters
| Name | Type | Description |
| :------ | :------ | :------ |
| `tealCode` | `string` | The TEAL code |
#### Returns
`undefined` \| [`CompiledTeal`](../interfaces/types_app.CompiledTeal.md)
The information about the previously compiled file
or `undefined` if that TEAL code wasn't previously compiled
#### Defined in
[src/types/app-manager.ts:175](https://github.com/algorandfoundation/algokit-utils-ts/blob/main/src/types/app-manager.ts#L175)
___
### getGlobalState
▸ **getGlobalState**(`appId`): `Promise`\<[`AppState`](../interfaces/types_app.AppState.md)\>
Returns the current global state values for the given app ID and account address
#### Parameters
| Name | Type | Description |
| :------ | :------ | :------ |
| `appId` | `bigint` | The ID of the app to return global state for |
#### Returns
`Promise`\<[`AppState`](../interfaces/types_app.AppState.md)\>
The current global state for the given app
#### Defined in
[src/types/app-manager.ts:213](https://github.com/algorandfoundation/algokit-utils-ts/blob/main/src/types/app-manager.ts#L213)
___
### getLocalState
▸ **getLocalState**(`appId`, `address`): `Promise`\<[`AppState`](../interfaces/types_app.AppState.md)\>
Returns the current local state values for the given app ID and account address
#### Parameters
| Name | Type | Description |
| :------ | :------ | :------ |
| `appId` | `bigint` | The ID of the app to return local state for |
| `address` | `string` \| `Address` | The string address of the account to get local state for the given app |
#### Returns
`Promise`\<[`AppState`](../interfaces/types_app.AppState.md)\>
The current local state for the given (app, account) combination
#### Defined in
[src/types/app-manager.ts:224](https://github.com/algorandfoundation/algokit-utils-ts/blob/main/src/types/app-manager.ts#L224)
___
### decodeAppState
▸ **decodeAppState**(`state`): [`AppState`](../interfaces/types_app.AppState.md)
Converts an array of global/local state values from the algod api to a more friendly
generic object keyed by the UTF-8 value of the key.
#### Parameters
| Name | Type | Description |
| :------ | :------ | :------ |
| `state` | \{ `key`: `Uint8Array` ; `value`: `TealValue` \| `EvalDelta` }[] | A `global-state`, `local-state`, `global-state-deltas` or `local-state-deltas` |
#### Returns
[`AppState`](../interfaces/types_app.AppState.md)
An object keyeed by the UTF-8 representation of the key with various parsings of the values
#### Defined in
[src/types/app-manager.ts:313](https://github.com/algorandfoundation/algokit-utils-ts/blob/main/src/types/app-manager.ts#L313)
___
### getABIReturn
▸ **getABIReturn**(`confirmation`, `method`): `undefined` \| [`ABIReturn`](../modules/types_app.md#abireturn)
Returns any ABI return values for the given app call arguments and transaction confirmation.
#### Parameters
| Name | Type | Description |
| :------ | :------ | :------ |
| `confirmation` | `undefined` \| `PendingTransactionResponse` | The transaction confirmation from algod |
| `method` | `undefined` \| `ABIMethod` | The ABI method |
#### Returns
`undefined` \| [`ABIReturn`](../modules/types_app.md#abireturn)
The return value for the method call
#### Defined in
[src/types/app-manager.ts:362](https://github.com/algorandfoundation/algokit-utils-ts/blob/main/src/types/app-manager.ts#L362)
___
### getBoxReference
▸ **getBoxReference**(`boxId`): `BoxReference`
Returns a `algosdk.BoxReference` given a `BoxIdentifier` or `BoxReference`.
#### Parameters
| Name | Type | Description |
| :------ | :------ | :------ |
| `boxId` | [`BoxIdentifier`](../modules/types_app_manager.md#boxidentifier) \| [`BoxReference`](../interfaces/types_app_manager.BoxReference.md) | The box to return a reference for |
#### Returns
`BoxReference`
The box reference ready to pass into a `algosdk.Transaction`
#### Defined in
[src/types/app-manager.ts:299](https://github.com/algorandfoundation/algokit-utils-ts/blob/main/src/types/app-manager.ts#L299)
___
### replaceTealTemplateDeployTimeControlParams
▸ **replaceTealTemplateDeployTimeControlParams**(`tealTemplateCode`, `params`): `string`
Replaces AlgoKit deploy-time deployment control parameters within the given TEAL template code.
* `TMPL_UPDATABLE` for updatability / immutability control
* `TMPL_DELETABLE` for deletability / permanence control
Note: If these values are defined, but the corresponding `TMPL_*` value
isn't in the teal code it will throw an exception.
#### Parameters
| Name | Type | Description |
| :------ | :------ | :------ |
| `tealTemplateCode` | `string` | The TEAL template code to substitute |
| `params` | `Object` | The deploy-time deployment control parameter value to replace |
| `params.deletable?` | `boolean` | - |
| `params.updatable?` | `boolean` | - |
#### Returns
`string`
The replaced TEAL code
#### Defined in
[src/types/app-manager.ts:392](https://github.com/algorandfoundation/algokit-utils-ts/blob/main/src/types/app-manager.ts#L392)
___
### replaceTealTemplateParams
▸ **replaceTealTemplateParams**(`tealTemplateCode`, `templateParams?`): `string`
Performs template substitution of a teal file.
Looks for `TMPL_{parameter}` for template replacements.
#### Parameters
| Name | Type | Description |
| :------ | :------ | :------ |
| `tealTemplateCode` | `string` | The TEAL template code to make parameter replacements in |
| `templateParams?` | [`TealTemplateParams`](../interfaces/types_app.TealTemplateParams.md) | Any parameters to replace in the teal code |
#### Returns
`string`
The TEAL code with replacements
#### Defined in
[src/types/app-manager.ts:423](https://github.com/algorandfoundation/algokit-utils-ts/blob/main/src/types/app-manager.ts#L423)
___
### stripTealComments
▸ **stripTealComments**(`tealCode`): `string`
Remove comments from TEAL code (useful to reduce code size before compilation).
#### Parameters
| Name | Type | Description |
| :------ | :------ | :------ |
| `tealCode` | `string` | The TEAL logic to strip |
#### Returns
`string`
The TEAL without comments
#### Defined in
[src/types/app-manager.ts:458](https://github.com/algorandfoundation/algokit-utils-ts/blob/main/src/types/app-manager.ts#L458)
```
--------------------------------------------------------------------------------
/packages/server/src/resources/knowledge/taxonomy/algokit:cli:features:localnet.md:
--------------------------------------------------------------------------------
```markdown
# AlgoKit LocalNet
The AlgoKit LocalNet feature allows you to manage (start, stop, reset, manage) a locally sandboxed private Algorand network. This allows you to interact and deploy changes against your own Algorand network without needing to worry about funding TestNet accounts, information you submit being publicly visible or being connected to an active Internet connection (once the network has been started).
AlgoKit LocalNet uses Docker images that are optimised for a great dev experience. This means the Docker images are small and start fast. It also means that features suited to developers are enabled such as KMD (so you can programmatically get faucet private keys).
The philosophy we take with AlgoKit LocalNet is that you should treat it as an ephemeral network. This means assume it could be reset at any time - don't store data on there that you can't recover / recreate. We have optimised the AlgoKit LocalNet experience to minimise situations where the network will get reset to improve the experience, but it can and will still happen in a number of situations.
> For details on executing `algokit localnet` without `docker` or `podman` refer to the [codespaces](#codespaces) section.
## Prerequisites
AlgoKit LocalNet relies on Docker and Docker Compose being present and running on your system. Alternatively, you can use Podman as a replacement for Docker see [Podman support](#podman-support).
You can install Docker by following the [official installation instructions](https://docs.docker.com/get-docker/). Most of the time this will also install Docker Compose, but if not you can [follow the instructions](https://docs.docker.com/compose/install/) for that too.
If you are on Windows then you will need WSL 2 installed first, for which you can find the [official installation instructions](https://learn.microsoft.com/en-us/windows/wsl/install). If you are using Windows 10 then ensure you are on the latest version to reduce likelihood of installation problems.
Alternatively, the Windows 10/11 Pro+ supported [Hyper-V backend](https://docs.docker.com/desktop/install/windows-install/) for Docker can be used instead of the WSL 2 backend.
### Podman support
If you prefer to use [Podman](https://podman.io/) as your container engine, make sure to install and configure Podman first. Then you can set the default container engine that AlgoKit will use, by running: `algokit config container-engine podman`. See [Container-based LocalNet](#container-based-localnet) for more details.
## Known issues
The AlgoKit LocalNet is built with 30,000 participation keys generated and after 30,000 rounds is reached it will no longer be able to add rounds. At this point you can simply reset the LocalNet to continue development. Participation keys are slow to generate hence why they are pre-generated to improve experience.
## Supported operating environments
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).
## Container-based LocalNet
AlgoKit cli supports both [Docker](https://www.docker.com/) and [Podman](https://podman.io/) as container engines. While `docker` is used by default, executing the below:
```
algokit config container-engine
# or
algokit config container-engine podman|docker
```
Will set the default container engine to use when executing `localnet` related commands via `subprocess`.
### Creating / Starting the LocalNet
To create / start your AlgoKit LocalNet instance you can run `algokit localnet start`. This will:
- Detect if you have Docker and Docker Compose installed
- Detect if you have the Docker engine running
- Create a new Docker Compose deployment for AlgoKit LocalNet if it doesn't already exist
- (Re-)Start the containers
You can also specify additional options:
- `--name`: Specify a name for a custom LocalNet instance. This allows you to have multiple LocalNet configurations. Refer to [Named LocalNet Configuration Directory](#named-localnet-configuration-directory) for more details.
- `--config-dir`: Specify a custom configuration directory for the LocalNet.
- `--dev/--no-dev`: Control whether to launch 'algod' in developer mode or not. Defaults to 'yes' (developer mode enabled).
If it's the first time running it on your machine then it will download the following images from DockerHub:
- [`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`.
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>
- token: `aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa`
- [kmd](https://developer.algorand.org/docs/rest-apis/kmd/):
- address: <http://localhost:4002>
- token: `aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa`
- [indexer](https://developer.algorand.org/docs/rest-apis/indexer/):
- address: <http://localhost:8980>
- tealdbg port:
- address: <http://localhost:9392>
### 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`.
### Specifying a custom LocalNet configuration directory
You can specify a custom LocalNet configuration directory by using the `--config-dir` option or by setting the `ALGOKIT_LOCALNET_CONFIG_DIR` environment variable. This allows you to have multiple LocalNet instances with different configurations in different directories, which is useful in 'CI/CD' scenarios where you can save your custom localnet in your version control and then run `algokit localnet start --config-dir /path/to/custom/config` to use it within your pipeline.
For example, to create a LocalNet instance with a custom configuration directory, you can run:
```
algokit localnet start --config-dir /path/to/custom/config
```
### 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.
You can use `--name` flag along with `--config-dir` option to specify a custom path for the LocalNet configuration directory. This allows you to manage multiple LocalNet instances with different configurations in different directories on your system.
### Controlling Algod Developer Mode
By default, AlgoKit LocalNet starts algod in developer mode. This mode enables certain features that are useful for development but may not reflect the behavior of a production network. You can control this setting using the `--dev/--no-dev` flag when starting the LocalNet:
```bash
algokit localnet start --no-dev # Starts algod without developer mode
algokit localnet start --dev # Starts algod with developer mode (default)
```
If you change this setting for an existing LocalNet instance, AlgoKit will prompt you to restart the LocalNet to apply the changes.
### Stopping and Resetting the LocalNet
To stop the LocalNet you can execute `algokit localnet stop`. This will turn off the containers, but keep them ready to be started again in the same state by executing `algokit localnet start`.
To reset the LocalNet you can execute `algokit localnet reset`, which will tear down the existing containers, refresh the container definition from the latest stored within AlgoKit and update to the latest Docker images. If you want to keep the same container spec and versions as you currently have, but quickly tear down and start a new instance then run `algokit localnet reset --no-update`.
### Viewing transactions in the LocalNet
You can see a web-based user interface of the current state of your LocalNet including all transactions by using the [AlgoKit Explore](./explore.md) feature, e.g. by executing `algokit localnet explore`.
### Executing goal commands against AlgoKit LocalNet
See the [AlgoKit Goal](./goal.md) feature. You can also execute `algokit localnet console` to open a [Bash shell which allows you to run the goal commandline](./goal.md#running-multiple-commands).
Note: if you want to copy files into the container so you can access them via goal then you can use the following:
```
docker cp foo.txt algokit_algod:/root
```
### Getting access to the private key of the faucet account
If you want to use the LocalNet then you need to get the private key of the initial wallet so you can transfer ALGOs out of it to other accounts you create.
There are two ways to do this:
**Option 1: Manually via goal**
```
algokit goal account list
algokit goal account export -a {address_from_an_online_account_from_above_command_output}
```
**Option 2: Automatically via kmd API**
Needing to do this manual step every time you spin up a new development environment or reset your LocalNet is frustrating. Instead, it's useful to have code that uses the Sandbox APIs to automatically retrieve the private key of the default account.
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)
For more details about the `AlgoKit localnet` command, please refer to the [AlgoKit CLI reference documentation](../cli/index.md#localnet).
## GitHub Codespaces-based LocalNet
The AlgoKit LocalNet feature also supports running the LocalNet in a GitHub Codespace with port forwarding by utilizing the [GitHub CLI](https://github.com/cli/gh). This allows you to run the LocalNet without the need to use Docker. This is especially useful for scenarios where certain hardware or software limitations may prevent you from being able to run Docker.
To run the LocalNet in a GitHub Codespace, you can use the `algokit localnet codespace` command.
By default without `--force` flag it will prompt you to delete stale codespaces created earlier (if any). Upon termination it will also prompt to delete the codespace that was used prior to termination.
Running an interactive session ensures that you have control over the lifecycle of your Codespace, preventing unnecessary usage and potential costs. GitHub Codespaces offers a free tier with certain limits, which you can review in the [GitHub Codespaces documentation](https://docs.github.com/en/codespaces/overview#pricing).
### Options
- `-m`, `--machine`: Specifies the GitHub Codespace machine type to use. Defaults to `basicLinux32gb`. Available options are `basicLinux32gb`, `standardLinux32gb`, `premiumLinux`, and `largePremiumLinux`. Refer to [GitHub Codespaces documentation](https://docs.github.com/en/codespaces/overview/machine-types) for more details.
- `-a`, `--algod-port`: Sets the port for the Algorand daemon. Defaults to `4001`.
- `-i`, `--indexer-port`: Sets the port for the Algorand indexer. Defaults to `8980`.
- `-k`, `--kmd-port`: Sets the port for the Algorand kmd. Defaults to `4002`.
- `-n`, `--codespace-name`: Specifies the name of the codespace. Defaults to a random name with a timestamp.
- `-t`, `--timeout`: Max duration for running the port forwarding process. Defaults to 1 hour. This timeout ensures the codespace **will automatically shut down** after the specified duration to prevent accidental overspending of free quota on GitHub Codespaces. [More details](https://docs.github.com/en/codespaces/setting-your-user-preferences/setting-your-timeout-period-for-github-codespaces).
- `-r`, `--repo-url`: The URL of the repository to use. Defaults to the AlgoKit base template repository (`algorandfoundation/algokit-base-template`). The reason why algokit-base-template is used by default is due to [.devcontainer.json](https://github.com/algorandfoundation/algokit-base-template/blob/main/template_content/.devcontainer.json) which defines the scripts that take care of setting up AlgoKit CLI during container start. You can use any custom repo as a base, however it's important to ensure the reference [.devcontainer.json](https://github.com/algorandfoundation/algokit-base-template/blob/main/template_content/.devcontainer.json) file exists in your repository **otherwise there will be no ports to forward from the codespace**.
- `--force`, `-f`: Force deletes stale codespaces and skips confirmation prompts. Defaults to explicitly prompting for confirmation.
For more details about managing LocalNet in GitHub Codespaces, please refer to the [AlgoKit CLI reference documentation](../cli/index.md#codespace).
> Tip: By specifying alternative port values it is possible to have several LocalNet instances running where one is using default ports via `algokit localnet start` with Docker | Podman and the other relies on port forwarding via `algokit localnet codespace`.
```
--------------------------------------------------------------------------------
/packages/server/src/resources/knowledge/taxonomy/SDKs:javascript:classes:Transaction.md:
--------------------------------------------------------------------------------
```markdown
[algosdk](../README.md) / [Exports](../modules.md) / Transaction
# Class: Transaction
Transaction enables construction of Algorand transactions
## Implements
- `TransactionStorageStructure`
## Table of contents
### Constructors
- [constructor](Transaction.md#constructor)
### Properties
- [amount](Transaction.md#amount)
- [appAccounts](Transaction.md#appaccounts)
- [appApprovalProgram](Transaction.md#appapprovalprogram)
- [appArgs](Transaction.md#appargs)
- [appClearProgram](Transaction.md#appclearprogram)
- [appForeignApps](Transaction.md#appforeignapps)
- [appForeignAssets](Transaction.md#appforeignassets)
- [appGlobalByteSlices](Transaction.md#appglobalbyteslices)
- [appGlobalInts](Transaction.md#appglobalints)
- [appIndex](Transaction.md#appindex)
- [appLocalByteSlices](Transaction.md#applocalbyteslices)
- [appLocalInts](Transaction.md#applocalints)
- [appOnComplete](Transaction.md#apponcomplete)
- [assetClawback](Transaction.md#assetclawback)
- [assetDecimals](Transaction.md#assetdecimals)
- [assetDefaultFrozen](Transaction.md#assetdefaultfrozen)
- [assetFreeze](Transaction.md#assetfreeze)
- [assetIndex](Transaction.md#assetindex)
- [assetManager](Transaction.md#assetmanager)
- [assetMetadataHash](Transaction.md#assetmetadatahash)
- [assetName](Transaction.md#assetname)
- [assetReserve](Transaction.md#assetreserve)
- [assetRevocationTarget](Transaction.md#assetrevocationtarget)
- [assetTotal](Transaction.md#assettotal)
- [assetURL](Transaction.md#asseturl)
- [assetUnitName](Transaction.md#assetunitname)
- [boxes](Transaction.md#boxes)
- [closeRemainderTo](Transaction.md#closeremainderto)
- [extraPages](Transaction.md#extrapages)
- [fee](Transaction.md#fee)
- [firstRound](Transaction.md#firstround)
- [flatFee](Transaction.md#flatfee)
- [freezeAccount](Transaction.md#freezeaccount)
- [freezeState](Transaction.md#freezestate)
- [from](Transaction.md#from)
- [genesisHash](Transaction.md#genesishash)
- [genesisID](Transaction.md#genesisid)
- [group](Transaction.md#group)
- [lastRound](Transaction.md#lastround)
- [lease](Transaction.md#lease)
- [name](Transaction.md#name)
- [nonParticipation](Transaction.md#nonparticipation)
- [note](Transaction.md#note)
- [reKeyTo](Transaction.md#rekeyto)
- [selectionKey](Transaction.md#selectionkey)
- [stateProof](Transaction.md#stateproof)
- [stateProofKey](Transaction.md#stateproofkey)
- [stateProofMessage](Transaction.md#stateproofmessage)
- [stateProofType](Transaction.md#stateprooftype)
- [tag](Transaction.md#tag)
- [to](Transaction.md#to)
- [type](Transaction.md#type)
- [voteFirst](Transaction.md#votefirst)
- [voteKey](Transaction.md#votekey)
- [voteKeyDilution](Transaction.md#votekeydilution)
- [voteLast](Transaction.md#votelast)
### Methods
- [\_getDictForDisplay](Transaction.md#_getdictfordisplay)
- [addLease](Transaction.md#addlease)
- [addRekey](Transaction.md#addrekey)
- [attachSignature](Transaction.md#attachsignature)
- [bytesToSign](Transaction.md#bytestosign)
- [estimateSize](Transaction.md#estimatesize)
- [get\_obj\_for\_encoding](Transaction.md#get_obj_for_encoding)
- [prettyPrint](Transaction.md#prettyprint)
- [rawSignTxn](Transaction.md#rawsigntxn)
- [rawTxID](Transaction.md#rawtxid)
- [signTxn](Transaction.md#signtxn)
- [toByte](Transaction.md#tobyte)
- [toString](Transaction.md#tostring)
- [txID](Transaction.md#txid)
- [from\_obj\_for\_encoding](Transaction.md#from_obj_for_encoding)
## Constructors
### constructor
• **new Transaction**(`«destructured»`)
#### Parameters
| Name | Type |
| :------ | :------ |
| `«destructured»` | `AnyTransaction` |
#### Defined in
transaction.ts:213
## Properties
### amount
• **amount**: `number` \| `bigint`
#### Implementation of
TransactionStorageStructure.amount
#### Defined in
transaction.ts:161
___
### appAccounts
• `Optional` **appAccounts**: [`Address`](../interfaces/Address.md)[]
#### Implementation of
TransactionStorageStructure.appAccounts
#### Defined in
transaction.ts:199
___
### appApprovalProgram
• **appApprovalProgram**: `Uint8Array`
#### Implementation of
TransactionStorageStructure.appApprovalProgram
#### Defined in
transaction.ts:196
___
### appArgs
• `Optional` **appArgs**: `Uint8Array`[]
#### Implementation of
TransactionStorageStructure.appArgs
#### Defined in
transaction.ts:198
___
### appClearProgram
• **appClearProgram**: `Uint8Array`
#### Implementation of
TransactionStorageStructure.appClearProgram
#### Defined in
transaction.ts:197
___
### appForeignApps
• `Optional` **appForeignApps**: `number`[]
#### Implementation of
TransactionStorageStructure.appForeignApps
#### Defined in
transaction.ts:200
___
### appForeignAssets
• `Optional` **appForeignAssets**: `number`[]
#### Implementation of
TransactionStorageStructure.appForeignAssets
#### Defined in
transaction.ts:201
___
### appGlobalByteSlices
• **appGlobalByteSlices**: `number`
#### Implementation of
TransactionStorageStructure.appGlobalByteSlices
#### Defined in
transaction.ts:195
___
### appGlobalInts
• **appGlobalInts**: `number`
#### Implementation of
TransactionStorageStructure.appGlobalInts
#### Defined in
transaction.ts:194
___
### appIndex
• **appIndex**: `number`
#### Implementation of
TransactionStorageStructure.appIndex
#### Defined in
transaction.ts:190
___
### appLocalByteSlices
• **appLocalByteSlices**: `number`
#### Implementation of
TransactionStorageStructure.appLocalByteSlices
#### Defined in
transaction.ts:193
___
### appLocalInts
• **appLocalInts**: `number`
#### Implementation of
TransactionStorageStructure.appLocalInts
#### Defined in
transaction.ts:192
___
### appOnComplete
• **appOnComplete**: [`OnApplicationComplete`](../enums/OnApplicationComplete.md)
#### Implementation of
TransactionStorageStructure.appOnComplete
#### Defined in
transaction.ts:191
___
### assetClawback
• **assetClawback**: [`Address`](../interfaces/Address.md)
#### Implementation of
TransactionStorageStructure.assetClawback
#### Defined in
transaction.ts:182
___
### assetDecimals
• **assetDecimals**: `number`
#### Implementation of
TransactionStorageStructure.assetDecimals
#### Defined in
transaction.ts:177
___
### assetDefaultFrozen
• **assetDefaultFrozen**: `boolean`
#### Implementation of
TransactionStorageStructure.assetDefaultFrozen
#### Defined in
transaction.ts:178
___
### assetFreeze
• **assetFreeze**: [`Address`](../interfaces/Address.md)
#### Implementation of
TransactionStorageStructure.assetFreeze
#### Defined in
transaction.ts:181
___
### assetIndex
• **assetIndex**: `number`
#### Implementation of
TransactionStorageStructure.assetIndex
#### Defined in
transaction.ts:175
___
### assetManager
• **assetManager**: [`Address`](../interfaces/Address.md)
#### Implementation of
TransactionStorageStructure.assetManager
#### Defined in
transaction.ts:179
___
### assetMetadataHash
• `Optional` **assetMetadataHash**: `Uint8Array`
#### Implementation of
TransactionStorageStructure.assetMetadataHash
#### Defined in
transaction.ts:186
___
### assetName
• **assetName**: `string`
#### Implementation of
TransactionStorageStructure.assetName
#### Defined in
transaction.ts:184
___
### assetReserve
• **assetReserve**: [`Address`](../interfaces/Address.md)
#### Implementation of
TransactionStorageStructure.assetReserve
#### Defined in
transaction.ts:180
___
### assetRevocationTarget
• `Optional` **assetRevocationTarget**: [`Address`](../interfaces/Address.md)
#### Implementation of
TransactionStorageStructure.assetRevocationTarget
#### Defined in
transaction.ts:189
___
### assetTotal
• **assetTotal**: `number` \| `bigint`
#### Implementation of
TransactionStorageStructure.assetTotal
#### Defined in
transaction.ts:176
___
### assetURL
• **assetURL**: `string`
#### Implementation of
TransactionStorageStructure.assetURL
#### Defined in
transaction.ts:185
___
### assetUnitName
• **assetUnitName**: `string`
#### Implementation of
TransactionStorageStructure.assetUnitName
#### Defined in
transaction.ts:183
___
### boxes
• `Optional` **boxes**: [`BoxReference`](../interfaces/BoxReference.md)[]
#### Implementation of
TransactionStorageStructure.boxes
#### Defined in
transaction.ts:202
___
### closeRemainderTo
• `Optional` **closeRemainderTo**: [`Address`](../interfaces/Address.md)
#### Implementation of
TransactionStorageStructure.closeRemainderTo
#### Defined in
transaction.ts:168
___
### extraPages
• `Optional` **extraPages**: `number`
#### Implementation of
TransactionStorageStructure.extraPages
#### Defined in
transaction.ts:208
___
### fee
• **fee**: `number`
#### Implementation of
TransactionStorageStructure.fee
#### Defined in
transaction.ts:160
___
### firstRound
• **firstRound**: `number`
#### Implementation of
TransactionStorageStructure.firstRound
#### Defined in
transaction.ts:162
___
### flatFee
• **flatFee**: `boolean`
#### Implementation of
TransactionStorageStructure.flatFee
#### Defined in
transaction.ts:204
___
### freezeAccount
• **freezeAccount**: [`Address`](../interfaces/Address.md)
#### Implementation of
TransactionStorageStructure.freezeAccount
#### Defined in
transaction.ts:187
___
### freezeState
• **freezeState**: `boolean`
#### Implementation of
TransactionStorageStructure.freezeState
#### Defined in
transaction.ts:188
___
### from
• **from**: [`Address`](../interfaces/Address.md)
#### Implementation of
TransactionStorageStructure.from
#### Defined in
transaction.ts:158
___
### genesisHash
• **genesisHash**: `Buffer`
#### Implementation of
TransactionStorageStructure.genesisHash
#### Defined in
transaction.ts:166
___
### genesisID
• **genesisID**: `string`
#### Implementation of
TransactionStorageStructure.genesisID
#### Defined in
transaction.ts:165
___
### group
• `Optional` **group**: `Buffer`
#### Implementation of
TransactionStorageStructure.group
#### Defined in
transaction.ts:207
___
### lastRound
• **lastRound**: `number`
#### Implementation of
TransactionStorageStructure.lastRound
#### Defined in
transaction.ts:163
___
### lease
• `Optional` **lease**: `Uint8Array`
#### Implementation of
TransactionStorageStructure.lease
#### Defined in
transaction.ts:167
___
### name
• **name**: `string` = `'Transaction'`
#### Defined in
transaction.ts:154
___
### nonParticipation
• `Optional` **nonParticipation**: `boolean`
#### Implementation of
TransactionStorageStructure.nonParticipation
#### Defined in
transaction.ts:206
___
### note
• `Optional` **note**: `Uint8Array`
#### Implementation of
TransactionStorageStructure.note
#### Defined in
transaction.ts:164
___
### reKeyTo
• `Optional` **reKeyTo**: [`Address`](../interfaces/Address.md)
#### Implementation of
TransactionStorageStructure.reKeyTo
#### Defined in
transaction.ts:205
___
### selectionKey
• **selectionKey**: `Buffer`
#### Implementation of
TransactionStorageStructure.selectionKey
#### Defined in
transaction.ts:170
___
### stateProof
• `Optional` **stateProof**: `Uint8Array`
#### Implementation of
TransactionStorageStructure.stateProof
#### Defined in
transaction.ts:210
___
### stateProofKey
• **stateProofKey**: `Buffer`
#### Implementation of
TransactionStorageStructure.stateProofKey
#### Defined in
transaction.ts:171
___
### stateProofMessage
• `Optional` **stateProofMessage**: `Uint8Array`
#### Implementation of
TransactionStorageStructure.stateProofMessage
#### Defined in
transaction.ts:211
___
### stateProofType
• `Optional` **stateProofType**: `number` \| `bigint`
#### Implementation of
TransactionStorageStructure.stateProofType
#### Defined in
transaction.ts:209
___
### tag
• **tag**: `Buffer`
#### Defined in
transaction.ts:155
___
### to
• **to**: [`Address`](../interfaces/Address.md)
#### Implementation of
TransactionStorageStructure.to
#### Defined in
transaction.ts:159
___
### type
• `Optional` **type**: [`TransactionType`](../enums/TransactionType.md)
#### Implementation of
TransactionStorageStructure.type
#### Defined in
transaction.ts:203
___
### voteFirst
• **voteFirst**: `number`
#### Implementation of
TransactionStorageStructure.voteFirst
#### Defined in
transaction.ts:172
___
### voteKey
• **voteKey**: `Buffer`
#### Implementation of
TransactionStorageStructure.voteKey
#### Defined in
transaction.ts:169
___
### voteKeyDilution
• **voteKeyDilution**: `number`
#### Implementation of
TransactionStorageStructure.voteKeyDilution
#### Defined in
transaction.ts:174
___
### voteLast
• **voteLast**: `number`
#### Implementation of
TransactionStorageStructure.voteLast
#### Defined in
transaction.ts:173
## Methods
### \_getDictForDisplay
▸ **_getDictForDisplay**(): `TransactionStorageStructure` & `Record`\<`string`, `any`\>
#### Returns
`TransactionStorageStructure` & `Record`\<`string`, `any`\>
#### Defined in
transaction.ts:1219
___
### addLease
▸ **addLease**(`lease`, `feePerByte?`): `void`
#### Parameters
| Name | Type | Default value |
| :------ | :------ | :------ |
| `lease` | `Uint8Array` | `undefined` |
| `feePerByte` | `number` | `0` |
#### Returns
`void`
#### Defined in
transaction.ts:1179
___
### addRekey
▸ **addRekey**(`reKeyTo`, `feePerByte?`): `void`
#### Parameters
| Name | Type | Default value |
| :------ | :------ | :------ |
| `reKeyTo` | `string` | `undefined` |
| `feePerByte` | `number` | `0` |
#### Returns
`void`
#### Defined in
transaction.ts:1205
___
### attachSignature
▸ **attachSignature**(`signerAddr`, `signature`): `Uint8Array`
#### Parameters
| Name | Type |
| :------ | :------ |
| `signerAddr` | `string` |
| `signature` | `Uint8Array` |
#### Returns
`Uint8Array`
#### Defined in
transaction.ts:1150
___
### bytesToSign
▸ **bytesToSign**(): `Buffer`
#### Returns
`Buffer`
#### Defined in
transaction.ts:1116
___
### estimateSize
▸ **estimateSize**(): `number`
#### Returns
`number`
#### Defined in
transaction.ts:1112
___
### get\_obj\_for\_encoding
▸ **get_obj_for_encoding**(): [`EncodedTransaction`](../interfaces/EncodedTransaction.md)
#### Returns
[`EncodedTransaction`](../interfaces/EncodedTransaction.md)
#### Defined in
transaction.ts:580
___
### prettyPrint
▸ **prettyPrint**(): `void`
#### Returns
`void`
#### Defined in
transaction.ts:1269
___
### rawSignTxn
▸ **rawSignTxn**(`sk`): `Buffer`
#### Parameters
| Name | Type |
| :------ | :------ |
| `sk` | `Uint8Array` |
#### Returns
`Buffer`
#### Defined in
transaction.ts:1126
___
### rawTxID
▸ **rawTxID**(): `Buffer`
#### Returns
`Buffer`
#### Defined in
transaction.ts:1166
___
### signTxn
▸ **signTxn**(`sk`): `Uint8Array`
#### Parameters
| Name | Type |
| :------ | :------ |
| `sk` | `Uint8Array` |
#### Returns
`Uint8Array`
#### Defined in
transaction.ts:1132
___
### toByte
▸ **toByte**(): `Uint8Array`
#### Returns
`Uint8Array`
#### Defined in
transaction.ts:1121
___
### toString
▸ **toString**(): `string`
#### Returns
`string`
#### Defined in
transaction.ts:1275
___
### txID
▸ **txID**(): `string`
#### Returns
`string`
#### Defined in
transaction.ts:1172
___
### from\_obj\_for\_encoding
▸ `Static` **from_obj_for_encoding**(`txnForEnc`): [`Transaction`](Transaction.md)
#### Parameters
| Name | Type |
| :------ | :------ |
| `txnForEnc` | [`EncodedTransaction`](../interfaces/EncodedTransaction.md) |
#### Returns
[`Transaction`](Transaction.md)
#### Defined in
transaction.ts:926
```
--------------------------------------------------------------------------------
/packages/server/src/resources/knowledge/taxonomy/developer:docs:details:atc.md:
--------------------------------------------------------------------------------
```markdown
title: Atomic Transaction Composer
Constructing [atomic transactions](../get-details/atomic_transfers.md) requires building up the set of transactions, assigning a group id, and then signing the transactions. While this is not a difficult thing to do on its own, it can be made more difficult if one of the transactions is an Application Call to an [ABI](/docs/get-details/dapps/smart-contracts/ABI/) compliant application. This is because the arguments passed to the application call must be properly encoded and may include transactions or accounts that are part of the application call or group.
The Atomic Transaction Composer is a convenient way to build out an atomic group of transactions that handles encoding and decoding of ABI arguments and return values.
!!! Note
The following code examples are snippits to demonstrate usage. Additional examples are available [here](https://github.com/algorand-devrel/demo-abi).
## Create Atomic Transaction Composer
To use the Atomic Transaction Composer, first initialize the composer:
=== "JavaScript"
<!-- ===JSSDK_ATC_CREATE=== -->
```javascript
const atc = new algosdk.AtomicTransactionComposer();
```
[Snippet Source](https://github.com/algorand/js-algorand-sdk/blob/examples/examples/atc.ts#L52-L53)
<!-- ===JSSDK_ATC_CREATE=== -->
=== "Python"
<!-- ===PYSDK_ATC_CREATE=== -->
```python
atc = AtomicTransactionComposer()
```
[Snippet Source](https://github.com/algorand/py-algorand-sdk/blob/examples/examples/atc.py#L12-L13)
<!-- ===PYSDK_ATC_CREATE=== -->
=== "Go"
<!-- ===GOSDK_ATC_CREATE=== -->
```go
// Create the atc we'll use to compose our transaction group
var atc = transaction.AtomicTransactionComposer{}
```
[Snippet Source](https://github.com/algorand/go-algorand-sdk/blob/examples/examples/atc/main.go#L40-L42)
<!-- ===GOSDK_ATC_CREATE=== -->
=== "Java"
<!-- ===JAVASDK_ATC_CREATE=== -->
```java
AtomicTransactionComposer atc = new AtomicTransactionComposer();
```
[Snippet Source](https://github.com/algorand/java-algorand-sdk/blob/examples/examples/src/main/java/com/algorand/examples/ATC.java#L49-L50)
<!-- ===JAVASDK_ATC_CREATE=== -->
## Add individual transactions
Individual transactions being passed to the composer must be wrapped in a `TransactionWithSigner`. This allows some conveniences we'll see later on.
Constructing a Transaction with Signer and adding it to the transaction composer can be done as follows:
=== "Python"
<!-- ===PYSDK_ATC_ADD_TRANSACTION=== -->
```python
addr, sk = acct.address, acct.private_key
# Create signer object
signer = AccountTransactionSigner(sk)
# Get suggested params from the client
sp = algod_client.suggested_params()
# Create a transaction
ptxn = transaction.PaymentTxn(addr, sp, addr, 10000)
# Construct TransactionWithSigner
tws = TransactionWithSigner(ptxn, signer)
# Pass TransactionWithSigner to ATC
atc.add_transaction(tws)
```
[Snippet Source](https://github.com/algorand/py-algorand-sdk/blob/examples/examples/atc.py#L22-L38)
<!-- ===PYSDK_ATC_ADD_TRANSACTION=== -->
=== "JavaScript"
<!-- ===JSSDK_ATC_ADD_TRANSACTION=== -->
```javascript
// construct a transaction
const paymentTxn = algosdk.makePaymentTxnWithSuggestedParamsFromObject({
from: sender.addr,
suggestedParams,
to: sender.addr,
amount: 1000,
});
// add the transaction to the ATC with a signer
atc.addTransaction({ txn: paymentTxn, signer: sender.signer });
```
[Snippet Source](https://github.com/algorand/js-algorand-sdk/blob/examples/examples/atc.ts#L63-L73)
<!-- ===JSSDK_ATC_ADD_TRANSACTION=== -->
=== "Go"
<!-- ===GOSDK_ATC_ADD_TRANSACTION=== -->
```go
// Get suggested params and make a transaction as usual
sp, err := algodClient.SuggestedParams().Do(context.Background())
if err != nil {
log.Fatalf("error getting suggested tx params: %s", err)
}
txn, err := transaction.MakePaymentTxn(acct1.Address.String(), acct1.Address.String(), 10000, nil, "", sp)
if err != nil {
log.Fatalf("failed to make transaction: %s", err)
}
// Construct a TransactionWithSigner and pass it to the atc
signer := transaction.BasicAccountTransactionSigner{Account: acct1}
atc.AddTransaction(transaction.TransactionWithSigner{Txn: txn, Signer: signer})
```
[Snippet Source](https://github.com/algorand/go-algorand-sdk/blob/examples/examples/atc/main.go#L45-L59)
<!-- ===GOSDK_ATC_ADD_TRANSACTION=== -->
=== "Java"
<!-- ===JAVASDK_ATC_ADD_TRANSACTION=== -->
```java
// Create a transaction
Transaction ptxn = PaymentTransactionBuilder.Builder().amount(10000).suggestedParams(sp)
.sender(acct.getAddress()).receiver(acct.getAddress()).build();
// Construct TransactionWithSigner
TransactionWithSigner tws = new TransactionWithSigner(ptxn,
acct.getTransactionSigner());
// Pass TransactionWithSigner to atc
atc.addTransaction(tws);
```
[Snippet Source](https://github.com/algorand/java-algorand-sdk/blob/examples/examples/src/main/java/com/algorand/examples/ATC.java#L53-L63)
<!-- ===JAVASDK_ATC_ADD_TRANSACTION=== -->
The call to add a transaction may be performed multiple times, each time adding a new transaction to the atomic group. Recall that a maximum of 16 transactions may be included in a single group.
## Calling ABI Methods
When calling an [ABI](/docs/get-details/dapps/smart-contracts/ABI/) compliant application, the Atomic Transaction Composer will handle encoding and decoding of the arguments passed and the return value. It will also make sure that any [reference types](/docs/get-details/dapps/smart-contracts/ABI/#reference-types) are packed into the transaction group appropriately. Additionally, since it knows the method signature and types required, it will do some type checking to make sure the arguments passed are valid for the method call.
In order to call the methods, a Contract or Interface is constructed. Typically this will be done using a [json file](/docs/get-details/dapps/smart-contracts/ABI/#api) that describes the api for the application.
Once the Contract object is constructed, it can be used to look up and pass method objects into the Atomic Transaction Composers `add_method_call`
=== "Python"
<!-- ===PYSDK_ATC_CONTRACT_INIT=== -->
```python
with open("calculator/contract.json") as f:
js = f.read()
contract = abi.Contract.from_json(js)
```
[Snippet Source](https://github.com/algorand/py-algorand-sdk/blob/examples/examples/atc.py#L44-L47)
<!-- ===PYSDK_ATC_CONTRACT_INIT=== -->
<!-- ===PYSDK_ATC_ADD_METHOD_CALL=== -->
```python
# Simple call to the `add` method, method_args can be any type but _must_
# match those in the method signature of the contract
atc.add_method_call(
app_id,
contract.get_method_by_name("add"),
addr,
sp,
signer,
method_args=[1, 1],
)
```
[Snippet Source](https://github.com/algorand/py-algorand-sdk/blob/examples/examples/atc.py#L50-L61)
<!-- ===PYSDK_ATC_ADD_METHOD_CALL=== -->
<!-- ===PYSDK_ATC_RESULTS=== -->
```python
# Other options:
# txngroup = atc.build_group()
# txids = atc.submit(client)
result = atc.execute(algod_client, 4)
for res in result.abi_results:
print(res.return_value)
```
[Snippet Source](https://github.com/algorand/py-algorand-sdk/blob/examples/examples/atc.py#L65-L71)
<!-- ===PYSDK_ATC_RESULTS=== -->
=== "JavaScript"
<!-- ===JSSDK_ATC_CONTRACT_INIT=== -->
```javascript
const abi = JSON.parse(
fs.readFileSync(path.join(__dirname, '/calculator/contract.json'), 'utf8')
);
const contract = new algosdk.ABIContract(abi);
```
[Snippet Source](https://github.com/algorand/js-algorand-sdk/blob/examples/examples/atc.ts#L56-L60)
<!-- ===JSSDK_ATC_CONTRACT_INIT=== -->
<!-- ===JSSDK_ATC_ADD_METHOD_CALL=== -->
```javascript
atc.addMethodCall({
appID: appIndex,
method: contract.getMethodByName('add'),
methodArgs: [1, 2],
sender: sender.addr,
signer: sender.signer,
suggestedParams,
});
```
[Snippet Source](https://github.com/algorand/js-algorand-sdk/blob/examples/examples/atc.ts#L76-L84)
<!-- ===JSSDK_ATC_ADD_METHOD_CALL=== -->
<!-- ===JSSDK_ATC_RESULTS=== -->
```javascript
const result = await atc.execute(client, 4);
for (const mr of result.methodResults) {
console.log(`${mr.returnValue}`);
}
```
[Snippet Source](https://github.com/algorand/js-algorand-sdk/blob/examples/examples/atc.ts#L87-L91)
<!-- ===JSSDK_ATC_RESULTS=== -->
=== "Go"
<!-- ===GOSDK_ATC_CONTRACT_INIT=== -->
```go
b, err := ioutil.ReadFile("calculator/contract.json")
if err != nil {
log.Fatalf("failed to read contract file: %s", err)
}
contract := &abi.Contract{}
if err := json.Unmarshal(b, contract); err != nil {
log.Fatalf("failed to unmarshal contract: %s", err)
}
```
[Snippet Source](https://github.com/algorand/go-algorand-sdk/blob/examples/examples/atc/main.go#L28-L37)
<!-- ===GOSDK_ATC_CONTRACT_INIT=== -->
<!-- ===GOSDK_ATC_ADD_METHOD_CALL=== -->
```go
// Grab the method from out contract object
addMethod, err := contract.GetMethodByName("add")
if err != nil {
log.Fatalf("failed to get add method: %s", err)
}
// Set up method call params
mcp := transaction.AddMethodCallParams{
AppID: appID,
Sender: acct1.Address,
SuggestedParams: sp,
OnComplete: types.NoOpOC,
Signer: signer,
Method: addMethod,
MethodArgs: []interface{}{1, 1},
}
if err := atc.AddMethodCall(mcp); err != nil {
log.Fatalf("failed to add method call: %s", err)
}
```
[Snippet Source](https://github.com/algorand/go-algorand-sdk/blob/examples/examples/atc/main.go#L62-L81)
<!-- ===GOSDK_ATC_ADD_METHOD_CALL=== -->
<!-- ===GOSDK_ATC_RESULTS=== -->
```go
result, err := atc.Execute(algodClient, context.Background(), 4)
if err != nil {
log.Fatalf("failed to get add method: %s", err)
}
for _, r := range result.MethodResults {
log.Printf("%s => %v", r.Method.Name, r.ReturnValue)
}
```
[Snippet Source](https://github.com/algorand/go-algorand-sdk/blob/examples/examples/atc/main.go#L84-L92)
<!-- ===GOSDK_ATC_RESULTS=== -->
=== "Java"
<!-- ===JAVASDK_ATC_CONTRACT_INIT=== -->
```java
// Read the json from disk
String jsonContract = Files.readString(Paths.get("calculator/contract.json"));
// Create Contract from Json
Contract contract = Encoder.decodeFromJson(jsonContract, Contract.class);
```
[Snippet Source](https://github.com/algorand/java-algorand-sdk/blob/examples/examples/src/main/java/com/algorand/examples/ATC.java#L66-L70)
<!-- ===JAVASDK_ATC_CONTRACT_INIT=== -->
<!-- ===JAVASDK_ATC_ADD_METHOD_CALL=== -->
```java
// create methodCallParams by builder (or create by constructor) for add method
List<Object> methodArgs = new ArrayList<Object>();
methodArgs.add(1);
methodArgs.add(1);
MethodCallTransactionBuilder<?> mctb = MethodCallTransactionBuilder.Builder();
MethodCallParams mcp = mctb.applicationId(appId).signer(acct.getTransactionSigner())
.sender(acct.getAddress())
.method(contract.getMethodByName("add")).methodArguments(methodArgs)
.onComplete(Transaction.OnCompletion.NoOpOC).suggestedParams(sp).build();
atc.addMethodCall(mcp);
```
[Snippet Source](https://github.com/algorand/java-algorand-sdk/blob/examples/examples/src/main/java/com/algorand/examples/ATC.java#L73-L86)
<!-- ===JAVASDK_ATC_ADD_METHOD_CALL=== -->
<!-- ===JAVASDK_ATC_RESULTS=== -->
```java
ExecuteResult res = atc.execute(algodClient, 2);
System.out.printf("App call (%s) confirmed in round %d\n", res.txIDs, res.confirmedRound);
res.methodResults.forEach(methodResult -> {
System.out.printf("Result from calling '%s' method: %s\n", methodResult.method.name,
methodResult.value);
});
```
[Snippet Source](https://github.com/algorand/java-algorand-sdk/blob/examples/examples/src/main/java/com/algorand/examples/ATC.java#L89-L95)
<!-- ===JAVASDK_ATC_RESULTS=== -->
## Foreign References
In order to inspect state for an Account, Asset, Application, or Box, you must pass a reference to the foreign object. This is done by passing a reference to the foreign object in one of the reference arrays. While the ABI takes care of some of this by allowing arguments to be reference types, sometimes you need to pass a reference to an object that is not an argument to the method.
=== "JavaScript"
<!-- ===JSSDK_ATC_FOREIGN_REFS=== -->
```javascript
const foreignRefAtc = new algosdk.AtomicTransactionComposer();
foreignRefAtc.addMethodCall({
suggestedParams,
appID: appIndex,
method: contract.getMethodByName('add'),
methodArgs: [1, 2],
sender: sender.addr,
signer: sender.signer,
// pass foreign refs
appAccounts: [otherAcct.addr],
appForeignApps: [1337],
appForeignAssets: [42],
boxes: [
{
appIndex,
name: new Uint8Array(Buffer.from('coolBoxName')),
},
],
});
```
[Snippet Source](https://github.com/algorand/js-algorand-sdk/blob/examples/examples/atc.ts#L120-L139)
<!-- ===JSSDK_ATC_FOREIGN_REFS=== -->
=== "Python"
<!-- ===PYSDK_ATC_FOREIGN_REFS=== -->
```python
atc = AtomicTransactionComposer()
atc.add_method_call(
app_id,
my_method,
addr,
sp,
signer,
accounts=[acct2.address],
foreign_apps=[1337],
foreign_assets=[42],
boxes=[[app_id, b"key"]],
)
```
[Snippet Source](https://github.com/algorand/py-algorand-sdk/blob/examples/examples/atc.py#L90-L102)
<!-- ===PYSDK_ATC_FOREIGN_REFS=== -->
=== "Go"
<!-- ===GOSDK_ATC_FOREIGN_REFS=== -->
```go
mcp = transaction.AddMethodCallParams{
AppID: appID,
Sender: acct1.Address,
SuggestedParams: sp,
OnComplete: types.NoOpOC,
Signer: signer,
Method: addMethod,
MethodArgs: []interface{}{1, 1},
// Pass foreign references to the app
ForeignAccounts: []string{acct2.Address.String()},
ForeignApps: []uint64{1337},
ForeignAssets: []uint64{42},
BoxReferences: []types.AppBoxReference{
{AppID: appID, Name: []byte("coolBoxName")},
},
}
```
[Snippet Source](https://github.com/algorand/go-algorand-sdk/blob/examples/examples/atc/main.go#L114-L130)
<!-- ===GOSDK_ATC_FOREIGN_REFS=== -->
=== "Java"
<!-- ===JAVASDK_ATC_FOREIGN_REFS=== -->
```java
MethodCallTransactionBuilder<?> refBuilder = MethodCallTransactionBuilder.Builder();
List<AppBoxReference> boxReferences = new ArrayList<>();
boxRefs.add(new AppBoxReference(appId.intValue(), "cool-box".getBytes()));
List<Address> acctReferences = new ArrayList<>();
acctReferences.add(otherAccount.getAddress());
List<Long> appReferences = new ArrayList<>();
appReferences.add(1337l);
List<Long> assetReferences = new ArrayList<>();
appReferences.add(42l);
MethodCallParams foreignRefMCP = refBuilder
.suggestedParams(sp)
.applicationId(appId)
.sender(acct.getAddress())
.method(contract.getMethodByName("add"))
.methodArguments(methodArgs)
.signer(acct.getTransactionSigner())
.onComplete(Transaction.OnCompletion.NoOpOC)
.accounts(acctReferences)
.foreignApps(appReferences)
.foreignAssets(assetReferences)
.boxReferences(boxReferences)
.build();
```
[Snippet Source](https://github.com/algorand/java-algorand-sdk/blob/examples/examples/src/main/java/com/algorand/examples/ATC.java#L117-L144)
<!-- ===JAVASDK_ATC_FOREIGN_REFS=== -->
```