#
tokens: 49768/50000 11/942 files (page 25/74)
lines: off (toggle) GitHub
raw markdown copy
This is page 25 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/tests/resources/indexer/transaction.test.ts:
--------------------------------------------------------------------------------

```typescript
import { McpError, ErrorCode } from '@modelcontextprotocol/sdk/types.js';
import { 
  transactionResources,
  transactionResourceSchemas,
  lookupTransactionByID,
  lookupAccountTransactions,
  searchForTransactions,
  handleTransactionResources
} from '../../../src/resources/indexer/transaction.js';
import { indexerClient } from '../../../src/algorand-client.js';

// Mock algosdk client
jest.mock('../../../src/algorand-client.js', () => ({
  indexerClient: {
    lookupTransactionByID: jest.fn(),
    lookupAccountTransactions: jest.fn(),
    searchForTransactions: jest.fn()
  },
  API_URIS: {
    TRANSACTION_DETAILS: 'algorand://transaction/{txid}',
    TRANSACTION_SEARCH: 'algorand://transactions/search'
  }
}));

describe('Indexer Transaction Resources', () => {
  beforeEach(() => {
    jest.clearAllMocks();
  });

  describe('Resource Definitions', () => {
    it('should define transaction resources', () => {
      expect(transactionResources).toHaveLength(2);
      expect(transactionResources.map(r => r.name)).toEqual([
        'Transaction Details',
        'Search Transactions'
      ]);
    });

    it('should define resource schemas', () => {
      expect(Object.keys(transactionResourceSchemas)).toHaveLength(2);
      expect(transactionResourceSchemas).toHaveProperty('algorand://transaction/{txid}');
      expect(transactionResourceSchemas).toHaveProperty('algorand://transactions/search');
    });
  });

  describe('Transaction Information', () => {
    const mockTxId = 'MOCK_TX_ID';
    const mockResponse = {
      transaction: {
        id: mockTxId,
        type: 'pay',
        sender: 'MOCK_SENDER',
        receiver: 'MOCK_RECEIVER',
        amount: 1000
      },
      currentRound: 1234
    };

    beforeEach(() => {
      (indexerClient.lookupTransactionByID as jest.Mock).mockReturnValue({
        do: jest.fn().mockResolvedValue(mockResponse)
      });
    });

    it('should fetch transaction information', async () => {
      const result = await lookupTransactionByID(mockTxId);
      expect(result).toEqual(mockResponse);
      expect(indexerClient.lookupTransactionByID).toHaveBeenCalledWith(mockTxId);
    });

    it('should handle errors', async () => {
      const error = new Error('Network error');
      (indexerClient.lookupTransactionByID as jest.Mock).mockReturnValue({
        do: jest.fn().mockRejectedValue(error)
      });

      await expect(lookupTransactionByID(mockTxId))
        .rejects
        .toThrow('Failed to get transaction: Network error');
    });
  });

  describe('Account Transactions', () => {
    const mockAddress = 'MOCK_ADDRESS';
    const mockResponse = {
      transactions: [{ id: 'txn1', type: 'pay' }],
      currentRound: 1234
    };

    beforeEach(() => {
      (indexerClient.lookupAccountTransactions as jest.Mock).mockReturnValue({
        limit: jest.fn().mockReturnThis(),
        beforeTime: jest.fn().mockReturnThis(),
        afterTime: jest.fn().mockReturnThis(),
        minRound: jest.fn().mockReturnThis(),
        maxRound: jest.fn().mockReturnThis(),
        txType: jest.fn().mockReturnThis(),
        assetID: jest.fn().mockReturnThis(),
        do: jest.fn().mockResolvedValue(mockResponse)
      });
    });

    it('should fetch account transactions', async () => {
      const result = await lookupAccountTransactions(mockAddress);
      expect(result).toEqual(mockResponse);
      expect(indexerClient.lookupAccountTransactions).toHaveBeenCalledWith(mockAddress);
    });

    it('should handle search parameters', async () => {
      const params = {
        limit: 10,
        beforeTime: '2023-01-01',
        afterTime: '2022-01-01',
        minRound: 1000,
        maxRound: 2000,
        txType: 'pay',
        assetId: 123
      };

      await lookupAccountTransactions(mockAddress, params);
      const mock = indexerClient.lookupAccountTransactions as jest.Mock;
      const chain = mock.mock.results[0].value;

      expect(chain.limit).toHaveBeenCalledWith(params.limit);
      expect(chain.beforeTime).toHaveBeenCalledWith(params.beforeTime);
      expect(chain.afterTime).toHaveBeenCalledWith(params.afterTime);
      expect(chain.minRound).toHaveBeenCalledWith(params.minRound);
      expect(chain.maxRound).toHaveBeenCalledWith(params.maxRound);
      expect(chain.txType).toHaveBeenCalledWith(params.txType);
      expect(chain.assetID).toHaveBeenCalledWith(params.assetId);
    });

    it('should handle errors', async () => {
      const error = new Error('Network error');
      (indexerClient.lookupAccountTransactions as jest.Mock).mockReturnValue({
        do: jest.fn().mockRejectedValue(error)
      });

      await expect(lookupAccountTransactions(mockAddress))
        .rejects
        .toThrow('Failed to get account transactions: Network error');
    });
  });

  describe('Search Transactions', () => {
    const mockResponse = {
      transactions: [{ id: 'txn1', type: 'pay' }],
      currentRound: 1234
    };

    beforeEach(() => {
      (indexerClient.searchForTransactions as jest.Mock).mockReturnValue({
        limit: jest.fn().mockReturnThis(),
        beforeTime: jest.fn().mockReturnThis(),
        afterTime: jest.fn().mockReturnThis(),
        minRound: jest.fn().mockReturnThis(),
        maxRound: jest.fn().mockReturnThis(),
        address: jest.fn().mockReturnThis(),
        addressRole: jest.fn().mockReturnThis(),
        txType: jest.fn().mockReturnThis(),
        assetID: jest.fn().mockReturnThis(),
        applicationID: jest.fn().mockReturnThis(),
        currencyGreaterThan: jest.fn().mockReturnThis(),
        currencyLessThan: jest.fn().mockReturnThis(),
        round: jest.fn().mockReturnThis(),
        nextToken: jest.fn().mockReturnThis(),
        do: jest.fn().mockResolvedValue(mockResponse)
      });
    });

    it('should search transactions', async () => {
      const result = await searchForTransactions();
      expect(result).toEqual(mockResponse);
      expect(indexerClient.searchForTransactions).toHaveBeenCalled();
    });

    it('should handle search parameters', async () => {
      const params = {
        limit: 10,
        beforeTime: '2023-01-01',
        afterTime: '2022-01-01',
        minRound: 1000,
        maxRound: 2000,
        address: 'addr1',
        addressRole: 'sender',
        txType: 'pay',
        assetId: 123,
        applicationId: 456,
        currencyGreaterThan: 1000,
        currencyLessThan: 2000,
        round: 1234,
        nextToken: 'token123'
      };

      await searchForTransactions(params);
      const mock = indexerClient.searchForTransactions as jest.Mock;
      const chain = mock.mock.results[0].value;

      expect(chain.limit).toHaveBeenCalledWith(params.limit);
      expect(chain.beforeTime).toHaveBeenCalledWith(params.beforeTime);
      expect(chain.afterTime).toHaveBeenCalledWith(params.afterTime);
      expect(chain.minRound).toHaveBeenCalledWith(params.minRound);
      expect(chain.maxRound).toHaveBeenCalledWith(params.maxRound);
      expect(chain.address).toHaveBeenCalledWith(params.address);
      expect(chain.addressRole).toHaveBeenCalledWith(params.addressRole);
      expect(chain.txType).toHaveBeenCalledWith(params.txType);
      expect(chain.assetID).toHaveBeenCalledWith(params.assetId);
      expect(chain.applicationID).toHaveBeenCalledWith(params.applicationId);
      expect(chain.currencyGreaterThan).toHaveBeenCalledWith(params.currencyGreaterThan);
      expect(chain.currencyLessThan).toHaveBeenCalledWith(params.currencyLessThan);
      expect(chain.round).toHaveBeenCalledWith(params.round);
      expect(chain.nextToken).toHaveBeenCalledWith(params.nextToken);
    });

    it('should handle errors', async () => {
      const error = new Error('Network error');
      (indexerClient.searchForTransactions as jest.Mock).mockReturnValue({
        do: jest.fn().mockRejectedValue(error)
      });

      await expect(searchForTransactions())
        .rejects
        .toThrow('Failed to search transactions: Network error');
    });
  });

  describe('Resource Handler', () => {
    const mockTxId = 'MOCK_TX_ID';

    beforeEach(() => {
      (indexerClient.lookupTransactionByID as jest.Mock).mockReturnValue({
        do: jest.fn().mockResolvedValue({
          transaction: { id: mockTxId },
          currentRound: 1234
        })
      });
      (indexerClient.searchForTransactions as jest.Mock).mockReturnValue({
        do: jest.fn().mockResolvedValue({
          transactions: [{ id: 'txn1' }],
          currentRound: 1234
        })
      });
    });

    it('should handle transaction details URI', async () => {
      const uri = `algorand://transaction/${mockTxId}`;
      const result = await handleTransactionResources(uri);
      expect(result).toHaveLength(1);
      expect(JSON.parse(result[0].text)).toHaveProperty('transaction');
      expect(JSON.parse(result[0].text)).toHaveProperty('currentRound');
    });

    it('should handle transaction search URI', async () => {
      const uri = 'algorand://transactions/search';
      const result = await handleTransactionResources(uri);
      expect(result).toHaveLength(1);
      expect(JSON.parse(result[0].text)).toHaveProperty('transactions');
      expect(JSON.parse(result[0].text)).toHaveProperty('currentRound');
    });

    it('should return empty array for unknown URI', async () => {
      const uri = 'algorand://unknown';
      const result = await handleTransactionResources(uri);
      expect(result).toHaveLength(0);
    });

    it('should handle errors with McpError', async () => {
      const error = new Error('Network error');
      (indexerClient.lookupTransactionByID as jest.Mock).mockReturnValue({
        do: jest.fn().mockRejectedValue(error)
      });

      const uri = `algorand://transaction/${mockTxId}`;
      await expect(handleTransactionResources(uri))
        .rejects
        .toThrow(new McpError(ErrorCode.InternalError, 'Network error'));
    });
  });
});

```

--------------------------------------------------------------------------------
/packages/server/tests/resources/indexer/account.test.ts:
--------------------------------------------------------------------------------

```typescript
import { McpError, ErrorCode } from '@modelcontextprotocol/sdk/types.js';
import { 
  accountResources,
  accountResourceSchemas,
  lookupAccountByID,
  lookupAccountTransactions,
  lookupAccountAssets,
  searchAccounts,
  handleAccountResources
} from '../../../src/resources/indexer/account.js';
import { indexerClient } from '../../../src/algorand-client.js';

// Mock algosdk client
jest.mock('../../../src/algorand-client.js', () => ({
  indexerClient: {
    lookupAccountByID: jest.fn(),
    lookupAccountTransactions: jest.fn(),
    lookupAccountAssets: jest.fn(),
    searchAccounts: jest.fn()
  },
  API_URIS: {
    TRANSACTION_HISTORY: 'algorand://account/{address}/transactions',
    ASSET_HOLDINGS: 'algorand://account/{address}/assets'
  }
}));

describe('Indexer Account Resources', () => {
  beforeEach(() => {
    jest.clearAllMocks();
  });

  describe('Resource Definitions', () => {
    it('should define account resources', () => {
      expect(accountResources).toHaveLength(2);
      expect(accountResources.map(r => r.name)).toEqual([
        'Transaction History',
        'Asset Holdings'
      ]);
    });

    it('should define resource schemas', () => {
      expect(Object.keys(accountResourceSchemas)).toHaveLength(2);
      expect(accountResourceSchemas).toHaveProperty('algorand://account/{address}/transactions');
      expect(accountResourceSchemas).toHaveProperty('algorand://account/{address}/assets');
    });
  });

  describe('Account Information', () => {
    const mockAddress = 'MOCK_ADDRESS';
    const mockResponse = {
      account: {
        address: mockAddress,
        amount: 1000000,
        assets: []
      },
      currentRound: 1234
    };

    beforeEach(() => {
      (indexerClient.lookupAccountByID as jest.Mock).mockReturnValue({
        do: jest.fn().mockResolvedValue(mockResponse)
      });
    });

    it('should fetch account information', async () => {
      const result = await lookupAccountByID(mockAddress);
      expect(result).toEqual(mockResponse);
      expect(indexerClient.lookupAccountByID).toHaveBeenCalledWith(mockAddress);
    });

    it('should handle errors', async () => {
      const error = new Error('Network error');
      (indexerClient.lookupAccountByID as jest.Mock).mockReturnValue({
        do: jest.fn().mockRejectedValue(error)
      });

      await expect(lookupAccountByID(mockAddress))
        .rejects
        .toThrow('Failed to get account info: Network error');
    });
  });

  describe('Account Transactions', () => {
    const mockAddress = 'MOCK_ADDRESS';
    const mockResponse = {
      transactions: [{ id: 'txn1' }],
      currentRound: 1234
    };

    beforeEach(() => {
      (indexerClient.lookupAccountTransactions as jest.Mock).mockReturnValue({
        limit: jest.fn().mockReturnThis(),
        beforeTime: jest.fn().mockReturnThis(),
        afterTime: jest.fn().mockReturnThis(),
        nextToken: jest.fn().mockReturnThis(),
        do: jest.fn().mockResolvedValue(mockResponse)
      });
    });

    it('should fetch account transactions', async () => {
      const result = await lookupAccountTransactions(mockAddress);
      expect(result).toEqual(mockResponse);
      expect(indexerClient.lookupAccountTransactions).toHaveBeenCalledWith(mockAddress);
    });

    it('should handle search parameters', async () => {
      const params = {
        limit: 10,
        beforeTime: '2023-01-01',
        afterTime: '2022-01-01',
        nextToken: 'token123'
      };

      await lookupAccountTransactions(mockAddress, params);
      const mock = indexerClient.lookupAccountTransactions as jest.Mock;
      const chain = mock.mock.results[0].value;

      expect(chain.limit).toHaveBeenCalledWith(params.limit);
      expect(chain.beforeTime).toHaveBeenCalledWith(params.beforeTime);
      expect(chain.afterTime).toHaveBeenCalledWith(params.afterTime);
      expect(chain.nextToken).toHaveBeenCalledWith(params.nextToken);
    });

    it('should handle errors', async () => {
      const error = new Error('Network error');
      (indexerClient.lookupAccountTransactions as jest.Mock).mockReturnValue({
        do: jest.fn().mockRejectedValue(error)
      });

      await expect(lookupAccountTransactions(mockAddress))
        .rejects
        .toThrow('Failed to get account transactions: Network error');
    });
  });

  describe('Account Assets', () => {
    const mockAddress = 'MOCK_ADDRESS';
    const mockResponse = {
      assets: [{ assetId: 1, amount: 100 }],
      currentRound: 1234
    };

    beforeEach(() => {
      (indexerClient.lookupAccountAssets as jest.Mock).mockReturnValue({
        limit: jest.fn().mockReturnThis(),
        assetId: jest.fn().mockReturnThis(),
        nextToken: jest.fn().mockReturnThis(),
        do: jest.fn().mockResolvedValue(mockResponse)
      });
    });

    it('should fetch account assets', async () => {
      const result = await lookupAccountAssets(mockAddress);
      expect(result).toEqual(mockResponse);
      expect(indexerClient.lookupAccountAssets).toHaveBeenCalledWith(mockAddress);
    });

    it('should handle search parameters', async () => {
      const params = {
        limit: 10,
        assetId: 123,
        nextToken: 'token123'
      };

      await lookupAccountAssets(mockAddress, params);
      const mock = indexerClient.lookupAccountAssets as jest.Mock;
      const chain = mock.mock.results[0].value;

      expect(chain.limit).toHaveBeenCalledWith(params.limit);
      expect(chain.assetId).toHaveBeenCalledWith(params.assetId);
      expect(chain.nextToken).toHaveBeenCalledWith(params.nextToken);
    });

    it('should handle errors', async () => {
      const error = new Error('Network error');
      (indexerClient.lookupAccountAssets as jest.Mock).mockReturnValue({
        do: jest.fn().mockRejectedValue(error)
      });

      await expect(lookupAccountAssets(mockAddress))
        .rejects
        .toThrow('Failed to get account assets: Network error');
    });
  });

  describe('Search Accounts', () => {
    const mockResponse = {
      accounts: [{ address: 'addr1' }],
      currentRound: 1234
    };

    beforeEach(() => {
      (indexerClient.searchAccounts as jest.Mock).mockReturnValue({
        limit: jest.fn().mockReturnThis(),
        assetID: jest.fn().mockReturnThis(),
        applicationID: jest.fn().mockReturnThis(),
        currencyGreaterThan: jest.fn().mockReturnThis(),
        currencyLessThan: jest.fn().mockReturnThis(),
        nextToken: jest.fn().mockReturnThis(),
        do: jest.fn().mockResolvedValue(mockResponse)
      });
    });

    it('should search accounts', async () => {
      const result = await searchAccounts();
      expect(result).toEqual(mockResponse);
      expect(indexerClient.searchAccounts).toHaveBeenCalled();
    });

    it('should handle search parameters', async () => {
      const params = {
        limit: 10,
        assetId: 123,
        applicationId: 456,
        currencyGreaterThan: 1000,
        currencyLessThan: 2000,
        nextToken: 'token123'
      };

      await searchAccounts(params);
      const mock = indexerClient.searchAccounts as jest.Mock;
      const chain = mock.mock.results[0].value;

      expect(chain.limit).toHaveBeenCalledWith(params.limit);
      expect(chain.assetID).toHaveBeenCalledWith(params.assetId);
      expect(chain.applicationID).toHaveBeenCalledWith(params.applicationId);
      expect(chain.currencyGreaterThan).toHaveBeenCalledWith(params.currencyGreaterThan);
      expect(chain.currencyLessThan).toHaveBeenCalledWith(params.currencyLessThan);
      expect(chain.nextToken).toHaveBeenCalledWith(params.nextToken);
    });

    it('should handle errors', async () => {
      const error = new Error('Network error');
      (indexerClient.searchAccounts as jest.Mock).mockReturnValue({
        do: jest.fn().mockRejectedValue(error)
      });

      await expect(searchAccounts())
        .rejects
        .toThrow('Failed to search accounts: Network error');
    });
  });

  describe('Resource Handler', () => {
    const mockAddress = 'MOCK_ADDRESS';

    beforeEach(() => {
      (indexerClient.lookupAccountTransactions as jest.Mock).mockReturnValue({
        do: jest.fn().mockResolvedValue({
          transactions: [],
          currentRound: 1234
        })
      });
      (indexerClient.lookupAccountAssets as jest.Mock).mockReturnValue({
        do: jest.fn().mockResolvedValue({
          assets: [],
          currentRound: 1234
        })
      });
    });

    it('should handle transaction history URI', async () => {
      const uri = `algorand://account/${mockAddress}/transactions`;
      const result = await handleAccountResources(uri);
      expect(result).toHaveLength(1);
      expect(JSON.parse(result[0].text)).toHaveProperty('transactions');
      expect(JSON.parse(result[0].text)).toHaveProperty('currentRound');
    });

    it('should handle asset holdings URI', async () => {
      const uri = `algorand://account/${mockAddress}/assets`;
      const result = await handleAccountResources(uri);
      expect(result).toHaveLength(1);
      expect(JSON.parse(result[0].text)).toHaveProperty('assets');
      expect(JSON.parse(result[0].text)).toHaveProperty('currentRound');
    });

    it('should return empty array for unknown URI', async () => {
      const uri = 'algorand://unknown';
      const result = await handleAccountResources(uri);
      expect(result).toHaveLength(0);
    });

    it('should handle errors with McpError', async () => {
      const error = new Error('Network error');
      (indexerClient.lookupAccountTransactions as jest.Mock).mockReturnValue({
        do: jest.fn().mockRejectedValue(error)
      });

      const uri = `algorand://account/${mockAddress}/transactions`;
      await expect(handleAccountResources(uri))
        .rejects
        .toThrow(new McpError(ErrorCode.InternalError, 'Failed to get transaction history: Network error'));
    });
  });
});

```

--------------------------------------------------------------------------------
/packages/server/tests/tools/transactionManager/assetTransactionManager.test.ts:
--------------------------------------------------------------------------------

```typescript
import { McpError, ErrorCode } from '@modelcontextprotocol/sdk/types.js';
import { AssetTransactionManager, assetTransactionTools } from '../../../src/tools/transactionManager/assetTransactions.js';
import { algodClient } from '../../../src/algorand-client.js';
import algosdk from 'algosdk';

// Mock algosdk
jest.mock('algosdk', () => ({
  makeAssetCreateTxnWithSuggestedParamsFromObject: jest.fn(),
  makeAssetConfigTxnWithSuggestedParamsFromObject: jest.fn(),
  makeAssetDestroyTxnWithSuggestedParamsFromObject: jest.fn(),
  makeAssetFreezeTxnWithSuggestedParamsFromObject: jest.fn(),
  makeAssetTransferTxnWithSuggestedParamsFromObject: jest.fn(),
}));

// Mock algodClient
jest.mock('../../../src/algorand-client.js', () => ({
  algodClient: {
    getTransactionParams: jest.fn().mockReturnValue({
      do: jest.fn().mockResolvedValue({
        firstRound: 1000,
        lastRound: 2000,
        genesisHash: 'hash',
        genesisID: 'testnet-v1.0',
        fee: 1000,
        flatFee: true,
      }),
    }),
  },
}));

describe('AssetTransactionManager', () => {
  const mockSuggestedParams = {
    firstRound: 1000,
    lastRound: 2000,
    genesisHash: 'hash',
    genesisID: 'testnet-v1.0',
    fee: 1000,
    flatFee: true,
  };

  beforeEach(() => {
    jest.clearAllMocks();
    (algodClient.getTransactionParams as jest.Mock)().do.mockResolvedValue(mockSuggestedParams);
  });

  describe('Tool Schemas', () => {
    it('should have valid tool schemas', () => {
      expect(assetTransactionTools).toHaveLength(5);
      expect(assetTransactionTools.map((t: { name: string }) => t.name)).toEqual([
        'make_asset_create_txn',
        'make_asset_config_txn',
        'make_asset_destroy_txn',
        'make_asset_freeze_txn',
        'make_asset_transfer_txn',
      ]);
    });
  });

  describe('Asset Creation', () => {
    const mockAssetCreateTxn = { type: 'acfg', from: 'sender' };

    beforeEach(() => {
      (algosdk.makeAssetCreateTxnWithSuggestedParamsFromObject as jest.Mock).mockReturnValue(mockAssetCreateTxn);
    });

    it('should create a basic asset creation transaction', async () => {
      const args = {
        from: 'sender',
        total: 1000000,
        decimals: 6,
        defaultFrozen: false,
      };

      const result = await AssetTransactionManager.handleTool('make_asset_create_txn', args);

      expect(result).toEqual({
        content: [{
          type: 'text',
          text: JSON.stringify(mockAssetCreateTxn, null, 2),
        }],
      });

      expect(algosdk.makeAssetCreateTxnWithSuggestedParamsFromObject).toHaveBeenCalledWith(
        expect.objectContaining({
          from: 'sender',
          total: 1000000,
          decimals: 6,
          defaultFrozen: false,
          suggestedParams: expect.objectContaining(mockSuggestedParams),
        })
      );
    });

    it('should create an asset with optional parameters', async () => {
      const args = {
        from: 'sender',
        total: 1000000,
        decimals: 6,
        defaultFrozen: false,
        unitName: 'TEST',
        assetName: 'Test Asset',
        assetURL: 'https://test.com',
        assetMetadataHash: 'hash',
        manager: 'manager-addr',
        reserve: 'reserve-addr',
        freeze: 'freeze-addr',
        clawback: 'clawback-addr',
        note: 'test note',
        rekeyTo: 'rekey-addr',
      };

      const result = await AssetTransactionManager.handleTool('make_asset_create_txn', args);

      expect(algosdk.makeAssetCreateTxnWithSuggestedParamsFromObject).toHaveBeenCalledWith(
        expect.objectContaining({
          ...args,
          note: new TextEncoder().encode(args.note),
          suggestedParams: expect.any(Object)
        })
      );
    });
  });

  describe('Asset Configuration', () => {
    const mockAssetConfigTxn = { type: 'acfg', from: 'sender' };

    beforeEach(() => {
      (algosdk.makeAssetConfigTxnWithSuggestedParamsFromObject as jest.Mock).mockReturnValue(mockAssetConfigTxn);
    });

    it('should create an asset configuration transaction', async () => {
      const args = {
        from: 'sender',
        assetIndex: 123,
        strictEmptyAddressChecking: true,
        manager: 'new-manager',
      };

      const result = await AssetTransactionManager.handleTool('make_asset_config_txn', args);

      expect(result).toEqual({
        content: [{
          type: 'text',
          text: JSON.stringify(mockAssetConfigTxn, null, 2),
        }],
      });

      expect(algosdk.makeAssetConfigTxnWithSuggestedParamsFromObject).toHaveBeenCalledWith(
        expect.objectContaining(args)
      );
    });
  });

  describe('Asset Destruction', () => {
    const mockAssetDestroyTxn = { type: 'acfg', from: 'sender' };

    beforeEach(() => {
      (algosdk.makeAssetDestroyTxnWithSuggestedParamsFromObject as jest.Mock).mockReturnValue(mockAssetDestroyTxn);
    });

    it('should create an asset destroy transaction', async () => {
      const args = {
        from: 'sender',
        assetIndex: 123,
      };

      const result = await AssetTransactionManager.handleTool('make_asset_destroy_txn', args);

      expect(result).toEqual({
        content: [{
          type: 'text',
          text: JSON.stringify(mockAssetDestroyTxn, null, 2),
        }],
      });

      expect(algosdk.makeAssetDestroyTxnWithSuggestedParamsFromObject).toHaveBeenCalledWith(
        expect.objectContaining(args)
      );
    });
  });

  describe('Asset Freeze', () => {
    const mockAssetFreezeTxn = { type: 'afrz', from: 'sender' };

    beforeEach(() => {
      (algosdk.makeAssetFreezeTxnWithSuggestedParamsFromObject as jest.Mock).mockReturnValue(mockAssetFreezeTxn);
    });

    it('should create an asset freeze transaction', async () => {
      const args = {
        from: 'sender',
        assetIndex: 123,
        freezeTarget: 'target-addr',
        freezeState: true,
      };

      const result = await AssetTransactionManager.handleTool('make_asset_freeze_txn', args);

      expect(result).toEqual({
        content: [{
          type: 'text',
          text: JSON.stringify(mockAssetFreezeTxn, null, 2),
        }],
      });

      expect(algosdk.makeAssetFreezeTxnWithSuggestedParamsFromObject).toHaveBeenCalledWith(
        expect.objectContaining(args)
      );
    });
  });

  describe('Asset Transfer', () => {
    const mockAssetTransferTxn = { type: 'axfer', from: 'sender' };

    beforeEach(() => {
      (algosdk.makeAssetTransferTxnWithSuggestedParamsFromObject as jest.Mock).mockReturnValue(mockAssetTransferTxn);
    });

    it('should create an asset transfer transaction', async () => {
      const args = {
        from: 'sender',
        to: 'receiver',
        assetIndex: 123,
        amount: 1000,
      };

      const result = await AssetTransactionManager.handleTool('make_asset_transfer_txn', args);

      expect(result).toEqual({
        content: [{
          type: 'text',
          text: JSON.stringify(mockAssetTransferTxn, null, 2),
        }],
      });

      expect(algosdk.makeAssetTransferTxnWithSuggestedParamsFromObject).toHaveBeenCalledWith(
        expect.objectContaining(args)
      );
    });

    it('should create an asset transfer with optional parameters', async () => {
      const args = {
        from: 'sender',
        to: 'receiver',
        assetIndex: 123,
        amount: 1000,
        closeRemainderTo: 'close-to',
        note: 'test note',
        rekeyTo: 'rekey-to',
      };

      const result = await AssetTransactionManager.handleTool('make_asset_transfer_txn', args);

      expect(algosdk.makeAssetTransferTxnWithSuggestedParamsFromObject).toHaveBeenCalledWith(
        expect.objectContaining({
          ...args,
          note: new TextEncoder().encode('test note'),
        })
      );
    });
  });

  describe('Error Handling', () => {
    it('should throw error for unknown tool', async () => {
      await expect(AssetTransactionManager.handleTool('unknown_tool', {}))
        .rejects
        .toThrow(new McpError(ErrorCode.MethodNotFound, 'Unknown asset transaction tool: unknown_tool'));
    });

    it('should throw error for missing asset creation parameters', async () => {
      await expect(AssetTransactionManager.handleTool('make_asset_create_txn', {}))
        .rejects
        .toThrow(new McpError(ErrorCode.InvalidParams, 'Invalid asset creation parameters'));
    });

    it('should throw error for missing asset config parameters', async () => {
      await expect(AssetTransactionManager.handleTool('make_asset_config_txn', {}))
        .rejects
        .toThrow(new McpError(ErrorCode.InvalidParams, 'Invalid asset configuration parameters'));
    });

    it('should throw error for missing asset destroy parameters', async () => {
      await expect(AssetTransactionManager.handleTool('make_asset_destroy_txn', {}))
        .rejects
        .toThrow(new McpError(ErrorCode.InvalidParams, 'Invalid asset destroy parameters'));
    });

    it('should throw error for missing asset freeze parameters', async () => {
      await expect(AssetTransactionManager.handleTool('make_asset_freeze_txn', {}))
        .rejects
        .toThrow(new McpError(ErrorCode.InvalidParams, 'Invalid asset freeze parameters'));
    });

    it('should throw error for missing asset transfer parameters', async () => {
      await expect(AssetTransactionManager.handleTool('make_asset_transfer_txn', {}))
        .rejects
        .toThrow(new McpError(ErrorCode.InvalidParams, 'Invalid asset transfer parameters'));
    });

    it('should handle algod client errors', async () => {
      const error = new Error('Network error');
      (algodClient.getTransactionParams as jest.Mock)().do.mockRejectedValue(error);

      await expect(AssetTransactionManager.handleTool('make_asset_create_txn', {
        from: 'sender',
        total: 1000000,
        decimals: 6,
        defaultFrozen: false,
      }))
        .rejects
        .toThrow(error);
    });
  });
});

```

--------------------------------------------------------------------------------
/packages/server/src/resources/knowledge/taxonomy/puya:python:testing:docs:testing-guide:contract-testing.md:
--------------------------------------------------------------------------------

```markdown
# Smart Contract Testing

This guide provides an overview of how to test smart contracts using the Algorand Python SDK (`algopy`). We will cover the basics of testing `ARC4Contract` and `Contract` classes, focusing on `abimethod` and `baremethod` decorators.

![](https://mermaid.ink/img/pako:eNqVkrFugzAQhl_Fujnp1ImhEiJrJNREWeoOV9sNVsFG9iEVBd69R5w0JE2llsk2n7-7_-AAymsDGewDtpXYrqQT_GyKFwl5vfcBnRZlT5V3IjYYSCjvKKAiCa-JzXfrObyzgTqsxRpVZZ25YOX2nnRrIomCneZzpszLkllktu0f8ratrUKyjFsXCZ1K2gTH7i01_8dGUjOT_55YeLdUFVr3zRunf5b6R5hZoFnBq9cX72_Br_Cj8bl4vJCHaVucvowYxHk5Xg_sfPkY6SbbphDL5dMgQZu29n0U5DMJwzTVGyApySKZKFSNMXKVxPJYYAGNCQ1azX_VYboqgSrTcAcZLzWGDwnSjcxhR37TOwUZhc4sIPhuX0H2jnXkXddqrrCyyKNpTqfjF5m74B8?type=png)

```{note}
The code snippets showcasing the contract testing capabilities are using [pytest](https://docs.pytest.org/en/latest/) as the test framework. However, note that the `algorand-python-testing` package can be used with any other test framework that supports Python. `pytest` is used for demonstration purposes in this documentation.
```

```{testsetup}
import algopy
import algopy_testing
from algopy_testing import algopy_testing_context

# Create the context manager for snippets below
ctx_manager = algopy_testing_context()

# Enter the context
context = ctx_manager.__enter__()
```

## `algopy.ARC4Contract`

Subclasses of `algopy.ARC4Contract` are **required** to be instantiated with an active test context. As part of instantiation, the test context will automatically create a matching `algopy.Application` object instance.

Within the class implementation, methods decorated with `algopy.arc4.abimethod` and `algopy.arc4.baremethod` will automatically assemble an `algopy.gtxn.ApplicationCallTransaction` transaction to emulate the AVM application call. This behavior can be overriden by setting the transaction group manually as part of test setup, this is done via implicit invocation of `algopy_testing.context.any_application()` _value generator_ (refer to [APIs](../apis.md) for more details).

```{testcode}
class SimpleVotingContract(algopy.ARC4Contract):
    def __init__(self) -> None:
        self.topic = algopy.GlobalState(algopy.Bytes(b"default_topic"), key="topic", description="Voting topic")
        self.votes = algopy.GlobalState(
            algopy.UInt64(0),
            key="votes",
            description="Votes for the option",
        )
        self.voted = algopy.LocalState(algopy.UInt64, key="voted", description="Tracks if an account has voted")

    @algopy.arc4.abimethod(create="require")
    def create(self, initial_topic: algopy.Bytes) -> None:
        self.topic.value = initial_topic
        self.votes.value = algopy.UInt64(0)

    @algopy.arc4.abimethod
    def vote(self) -> algopy.UInt64:
        assert self.voted[algopy.Txn.sender] == algopy.UInt64(0), "Account has already voted"
        self.votes.value += algopy.UInt64(1)
        self.voted[algopy.Txn.sender] = algopy.UInt64(1)
        return self.votes.value

    @algopy.arc4.abimethod(readonly=True)
    def get_votes(self) -> algopy.UInt64:
        return self.votes.value

    @algopy.arc4.abimethod
    def change_topic(self, new_topic: algopy.Bytes) -> None:
        assert algopy.Txn.sender == algopy.Txn.application_id.creator, "Only creator can change topic"
        self.topic.value = new_topic
        self.votes.value = algopy.UInt64(0)
        # Reset user's vote (this is simplified per single user for the sake of example)
        self.voted[algopy.Txn.sender] = algopy.UInt64(0)

# Arrange
initial_topic = algopy.Bytes(b"initial_topic")
contract = SimpleVotingContract()
contract.voted[context.default_sender] = algopy.UInt64(0)

# Act - Create the contract
contract.create(initial_topic)

# Assert - Check initial state
assert contract.topic.value == initial_topic
assert contract.votes.value == algopy.UInt64(0)

# Act - Vote
# The method `.vote()` is decorated with `algopy.arc4.abimethod`, which means it will assemble a transaction to emulate the AVM application call
result = contract.vote()

# Assert - you can access the corresponding auto generated application call transaction via test context
assert len(context.txn.last_group.txns) == 1

# Assert - Note how local and global state are accessed via regular python instance attributes
assert result == algopy.UInt64(1)
assert contract.votes.value == algopy.UInt64(1)
assert contract.voted[context.default_sender] == algopy.UInt64(1)

# Act - Change topic
new_topic = algopy.Bytes(b"new_topic")
contract.change_topic(new_topic)

# Assert - Check topic changed and votes reset
assert contract.topic.value == new_topic
assert contract.votes.value == algopy.UInt64(0)
assert contract.voted[context.default_sender] == algopy.UInt64(0)

# Act - Get votes (should be 0 after reset)
votes = contract.get_votes()

# Assert - Check votes
assert votes == algopy.UInt64(0)

```

For more examples of tests using `algopy.ARC4Contract`, see the [examples](../examples.md) section.

## `algopy.Contract``

Subclasses of `algopy.Contract` are **required** to be instantiated with an active test context. As part of instantiation, the test context will automatically create a matching `algopy.Application` object instance. This behavior is identical to `algopy.ARC4Contract` class instances.

Unlike `algopy.ARC4Contract`, `algopy.Contract` requires manual setup of the transaction context and explicit method calls. Alternatively, you can use `active_txn_overrides` to specify application arguments and foreign arrays without needing to create a full transaction group if your aim is to patch a specific active transaction related metadata.

Here's an updated example demonstrating how to test a `Contract` class:

```{testcode}
import algopy
import pytest
from algopy_testing import AlgopyTestContext, algopy_testing_context

class CounterContract(algopy.Contract):
    def __init__(self):
        self.counter = algopy.UInt64(0)

    @algopy.subroutine
    def increment(self):
        self.counter += algopy.UInt64(1)
        return algopy.UInt64(1)

    @algopy.arc4.baremethod
    def approval_program(self):
        return self.increment()

    @algopy.arc4.baremethod
    def clear_state_program(self):
        return algopy.UInt64(1)

@pytest.fixture()
def context():
    with algopy_testing_context() as ctx:
        yield ctx

def test_counter_contract(context: AlgopyTestContext):
    # Instantiate contract
    contract = CounterContract()

    # Set up the transaction context using active_txn_overrides
    with context.txn.create_group(
        active_txn_overrides={
            "sender": context.default_sender,
            "app_args": [algopy.Bytes(b"increment")],
        }
    ):
        # Invoke approval program
        result = contract.approval_program()

        # Assert approval program result
        assert result == algopy.UInt64(1)

        # Assert counter value
        assert contract.counter == algopy.UInt64(1)

    # Test clear state program
    assert contract.clear_state_program() == algopy.UInt64(1)

def test_counter_contract_multiple_txns(context: AlgopyTestContext):
    contract = CounterContract()

    # For scenarios with multiple transactions, you can still use gtxns
    extra_payment = context.any.txn.payment()

    with context.txn.create_group(
        gtxns=[
            extra_payment,
            context.any.txn.application_call(
                sender=context.default_sender,
                app_id=contract.app_id,
                app_args=[algopy.Bytes(b"increment")],
            ),
        ],
        active_txn_index=1  # Set the application call as the active transaction
    ):
        result = contract.approval_program()

        assert result == algopy.UInt64(1)
        assert contract.counter == algopy.UInt64(1)

    assert len(context.txn.last_group.txns) == 2
```

In this updated example:

1. We use `context.txn.create_group()` with `active_txn_overrides` to set up the transaction context for a single application call. This simplifies the process when you don't need to specify a full transaction group.

2. The `active_txn_overrides` parameter allows you to specify `app_args` and other transaction fields directly, without creating a full `ApplicationCallTransaction` object.

3. For scenarios involving multiple transactions, you can still use the `gtxns` parameter to create a transaction group, as shown in the `test_counter_contract_multiple_txns` function.

4. The `app_id` is automatically set to the contract's application ID, so you don't need to specify it explicitly when using `active_txn_overrides`.

This approach provides more flexibility in setting up the transaction context for testing `Contract` classes, allowing for both simple single-transaction scenarios and more complex multi-transaction tests.

## Defer contract method invocation

You can create deferred application calls for more complex testing scenarios where order of transactions needs to be controlled:

```python
def test_deferred_call(context):
    contract = MyARC4Contract()

    extra_payment = context.any.txn.payment()
    extra_asset_transfer = context.any.txn.asset_transfer()
    implicit_payment = context.any.txn.payment()
    deferred_call = context.txn.defer_app_call(contract.some_method, implicit_payment)

    with context.txn.create_group([extra_payment, deferred_call, extra_asset_transfer]):
        result = deferred_call.submit()

    print(context.txn.last_group) # [extra_payment, implicit_payment, app call, extra_asset_transfer]
```

A deferred application call prepares the application call transaction without immediately executing it. The call can be executed later by invoking the `.submit()` method on the deferred application call instance. As demonstrated in the example, you can also include the deferred call in a transaction group creation context manager to execute it as part of a larger transaction group. When `.submit()` is called, only the specific method passed to `defer_app_call()` will be executed.

```{testcleanup}
ctx_manager.__exit__(None, None, None)
```

```

--------------------------------------------------------------------------------
/packages/server/src/resources/knowledge/taxonomy/developer:docs:details:accounts:index.md:
--------------------------------------------------------------------------------

```markdown
title: Overview

This section is an overview of **Accounts** on Algorand. It reviews core terminology and guides developers on how to interpret these terms in different contexts. 




# Quick start videos

If you prefer videos, take a look at this 6 minute guide to Learn How to Manage Private / Public Algorand Account Keys.

<iframe width="100%" style="aspect-ratio:16/9" src="https://www.youtube-nocookie.com/embed/SewNDCBvk58" title="YouTube video player" frameborder="0" allow="accelerometer; autoplay; clipboard-write; encrypted-media; gyroscope; picture-in-picture; web-share" allowfullscreen></iframe>

# Terminology
## Keys and Addresses

Algorand uses Ed25519 high-speed, high-security elliptic-curve signatures. The keys are produced through standard, open-source cryptographic libraries packaged with each of the SDKs. The key generation algorithm takes a random value as input and outputs two 32-byte arrays, representing a public key and its associated private key. These are also referred to as a public/private key pair. These keys perform important cryptographic functions like signing data and verifying signatures. 

<center> ![Key Generation](../../imgs/accounts-0.png) </center>
<center>*Public/Private Key Generation* </center>

For reasons that include the need to make the keys human-readable and robust to human error when transferred, both the public and private keys undergo transformations. The output of these transformations is what the majority of developers, and usually all end-users, see. In fact, the Algorand developer tools actively seek to mask the complexity involved in these transformations. So unless you are a protocol-level developer modifying cryptographic-related source code, you may never actually encounter the true public/private key pair. 


### Transformation: Public Key to Algorand Address

The **public key** is transformed into an Algorand address, by adding a 4-byte checksum to the end of the public key and then encoding it in base32. The result is what both the developer and end-user recognize as an **Algorand address**. The address is 58 characters long.

<center> ![Algorand Address](../../imgs/accounts-1.png) </center>
<center>*Public Key to Algorand Address* </center>

!!! info
	Since users almost never see the true public key, and the Algorand address is a unique mapping back to the public key, the use of the term **public key** is frequently (and inaccurately) used to mean **address**. 
	
!!! tip
	Assuming the [Python SDK is installed](../../sdks/python/#install-sdk), it is possible to convert addresses to (base32-encoded) public keys and vice-versa using the following one-liners (here used on the address `VCMJKWOY5P5P7SKMZFFOCEROPJCZOTIJMNIYNUCKH7LRO45JMJP6UYBIJA`):
	```bash
	python3 -c "import base64, sys, algosdk; [print(base64.b32encode(algosdk.encoding.decode_address(line.strip())).decode()) for line in sys.stdin if line.strip()]" <<< VCMJKWOY5P5P7SKMZFFOCEROPJCZOTIJMNIYNUCKH7LRO45JMJP6UYBIJA

	python3 -c "import base64, sys, algosdk; [print(algosdk.encoding.encode_address(base64.b32decode(line.strip()))) for line in sys.stdin if line.strip()]" <<< VCMJKWOY5P5P7SKMZFFOCEROPJCZOTIJMNIYNUCKH7LRO45JMJPQ====
	```

### Transformation: Private Key to base64 private key

A base64 encoded concatenation of the private and public keys is a representation of the private key most commonly used by developers interfacing with the SDKs. It is likely not a representation familiar to end users.

<center> ![base64 private key](../../imgs/accounts-2.png) </center>
<center>*Base64 Private Key* </center>

### Transformation: Private Key to 25-word mnemonic

The 25-word mnemonic is the most user-friendly representation of the private key. It is generated by converting the private key bytes into 11-bit integers and then mapping those integers to the [bip-0039 English word list](https://raw.githubusercontent.com/bitcoin/bips/master/bip-0039/english.txt), where integer _n_ maps to the word in the _nth_ position in the list. By itself, this creates a 24-word mnemonic. A checksum is added by taking the first two bytes of the hash of the private key and converting them to 11-bit integers and then to their corresponding word in the word list. This word is added to the end of the 24 words to create a 25-word mnemonic.

This representation is called the private key **mnemonic**. You may also see it referred to as a **passphrase**. 

<center> ![Mnemonic](../../imgs/accounts-3.png) </center>
<center>*Private Key Mnemonic* </center>

!!! info
	Both the base64 representation of a private key and the private key mnemonic are considered **private keys**. It is important to disambiguate in contexts where the representation is important. 

## Wallets

Wallets, in the context of Algorand developer tools, refer to wallets generated and managed by the Key Management Daemon (kmd) process. A wallet stores a collection of keys. kmd stores collections of wallets and allows users to perform operations using the keys stored within these wallets. Every wallet is associated with a master key, represented as a 25-word mnemonic, from which all accounts in that wallet are derived. This allows the owner of the wallet to only need to remember a single passphrase for all of their accounts. Wallets are stored encrypted on disk. 

See [Wallet-derived (kmd)](./create.md#wallet-derived-kmd) accounts in the [Creation Methods](./create.md) section for more details.

## Accounts
Accounts are entities on the Algorand blockchain associated with specific onchain data, like a balance. An Algorand Address is the identifier for an Algorand account. 

After generating a private key and corresponding address, sending Algos to the address on Algorand will initialize its state on the Algorand blockchain. 

<center> ![Account](../../imgs/accounts-4.png) </center>
<center>*Initializing an Account* </center>

### Attributes
#### Minimum Balance
Every account on Algorand must have a minimum balance of 100,000 microAlgos. If ever a transaction is sent that would result in a balance lower than the minimum, the transaction will fail. The minimum balance increases with each asset holding the account has (whether the asset was created or owned by the account) and with each application the account created or opted in. Destroying a created asset, opting out/closing out an owned asset, destroying a created app, or opting out an opted in app decreases accordingly the minimum balance.

Read more about assets, applications, and changes to the minimum balance requirement in the [Algorand Standard Assets](../asa) and [Smart contracts details](../dapps/smart-contracts/apps) sections.

#### Online/Offline
By default, Algorand accounts are set to **offline**. An **online** account is one that participates in Algorand consensus. For an account to go online, it must generate a participation key and send a special key registration transaction. Read more about how to register an account online in the [Network Participation](../../run-a-node/participate/index.md) section.

### Other Account Types
Creating an Algorand address from a public key is not the only way. A valid address can also be produced from a compiled TEAL contract and through multisignature accounts. These accounts differ in how they authorize spends, but they look like any other account on Algorand. Read more about contract accounts in the [Algorand Smart Contracts](/docs/get-details/dapps/smart-contracts/apps/#application-account) section. Multisignature accounts are described [below](create#multisignature).

### Special Accounts

Two accounts carry special meaning on the Algorand blockchain. They are the **FeeSink** and the **RewardsPool**. The FeeSink is where all fees from transactions are sent. The FeeSink can only spend to the RewardsPool account. The RewardsPool was first used to distribute rewards to balance holding accounts. Currently this account is not used. 

In addition, the ZeroAddress `AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAY5HFKQ` is an address that represents a blank byte array. It is used when you leave an address field in a transaction blank.

_MainNet [FeeSink](../algorand-networks/mainnet#feesink-address) and [RewardsPool](../algorand-networks/mainnet#rewardspool-address) addresses_

_TestNet [FeeSink](../algorand-networks/testnet#feesink-address) and [RewardsPool](../algorand-networks/testnet#rewardspool-address) addresses_

## A note about term usage in these docs
Even in these docs, use of these terms may be inconsistent. At times this is a deliberate style choice to ensure clarity around a broader concept. Sometimes it is to emphasize the inherent pairing of the public and private portions of a key. (e.g. In code examples, it is sometimes clearer to name variables as such to emphasize the connection between these two entities). Other times it is to abstract away from complexity related to generating an account on Algorand. For example, code samples may use terms like "generateAccount" to generate a private key and Algorand address. There is an underlying assumption that this pair will be used as an Algorand account even though on generation it is not yet represented on the blockchain and therefore is not yet technically an Algorand account.


??? tip "Interpretation Guide"
	Here are a few examples of the way these terms appear in the wild and suggestions on how to interpret them. It is always best to ask for clarification when the terms are ambiguous.

	1. A developer says they are looking to create a wallet for Algorand and are asking about kmd. - _In this situation, it is probably best to direct them to this page so they understand all the ways to create accounts on Algorand. They may want to support more than one generation method, including kmd._
	2. A consumer says: "I have 5 accounts in my wallet." - _Consumers are likely referring to mobile or web wallets, and probably not the underlying kmd wallet mechanism._
	3. A protocol developer wants to explore the signature validation mechanism in the Algorand protocol. - _This developer will most definitely encounter the true public/private key pairs as well as many of the concepts detailed above._

```

--------------------------------------------------------------------------------
/packages/server/src/resources/knowledge/taxonomy/ARCs:specs:arc-0034.md:
--------------------------------------------------------------------------------

```markdown
---
arc: 34
title: xGov Pilot - Proposal Process
description: Criteria for the creation of proposals.
author: Stéphane Barroso (@SudoWeezy), Adriana Belotti, Michel Treccani
discussions-to: https://github.com/algorandfoundation/ARCs/issues/151
status: Deprecated
type: Meta
created: 2022-11-22
---

## Abstract

The Goal of this ARC is to clearly define the steps involved in submitting proposals for the xGov Program, to increase transparency and efficiency, ensuring all proposals are given proper consideration. The goal of this grants scheme is to fund proposals that will help us in our goal of increasing the adoption of the Algorand network, as the most advanced layer 1 blockchain to date. The program aims to fund proposals to develop open source software, including tooling, as well as educational resources to help inform and grow the Algorand community.

## Specification

The key words "**MUST**", "**MUST NOT**", "**REQUIRED**", "**SHALL**", "**SHALL NOT**", "**SHOULD**", "**SHOULD NOT**", "**RECOMMENDED**", "**MAY**", and "**OPTIONAL**" in this document are to be interpreted as described in <a href="https://www.ietf.org/rfc/rfc2119.txt">RFC-2119</a>.

### What is a proposal

The xGov program aims to provide funding for individuals or teams to:

- Develop of open source applications and tools (eg. an open source AMM or contributing content to an Algorand software library).
- Develop Algorand education resources, preferably in languages where the resources are not yet available(eg. a video series teaching developers about Algorand in Portuguese or Indonesian).

The remainder of the xGov program pilot will not fund proposals for:

- Supplying liquidity.
- Reserving funds to pay for ad-hoc open-source development (devs can apply directly for an xGov grant).
- Buying ASAs, including NFTs.

Proposals **SHALL NOT** be divided in small chunks.
> Issues requiring resolution may have been discussed on various online platforms such as forums, discord, and social media networks.
> Proposals requesting a large amount of funds **MUST BE** split into a milestone-based plan. See [Submit a proposal](./arc-0034.md#submit-a-proposal)

### Duty of a proposer

Having the ability to propose measures for a vote is a significant privilege, which requires:

- A thorough understanding of the needs of the community.
- Alignment of personal interests with the advancement of the Algorand ecosystem.
- Promoting good behavior amongst proposers and discouraging "gaming the system".
- Reporting flaws and discussing possible solutions with the AF team and community using either the Algorand Forum or the xGov Discord channels.

### Life of a proposal

The proposal process will follow the steps below:

- Anyone can submit a proposal at any time.
- Proposals will be evaluated and refined by the community and xGovs before they are available for voting.
- Up to one month is allocated for voting on proposals.
- The community will vote on proposals that have passed the refinement and temperature check stage.

> If too many proposals are received in a short period of time. xGovs can elect to close proposals, in order to be able to handle the volume appropriately.

### Submit a proposal

In order to submit a proposal, a proposer needs to create a pull request on the following repository: <a href="https://github.com/algorandfoundation/xGov">xGov Proposals</a>.

Proposals **MUST**:

- Be posted on the <a href="https://forum.algorand.org/">Algorand Forum</a> (using tags: Governance and xGov Proposals) and discussed with the community during the review phased. Proposals without a discussion thread WILL NOT be included in the voting session.
- Follow the [template form provided](../assets/arc-0034/TemplateForm.md), filling all the template sections
- Follow the rules of the xGov Proposals Repository.
- The minimum requested Amount is 10000 Algo
- Have the status `Final` before the end of the temperature check.
- Be either Proactive (the content of the proposal is yet to be created) or Retroactive (the content of the proposal is already created)
- Milestone-based grants must submit a proposal for one milestone at a time.
- Milestones need to follow the governance periods cycle. With the current 3-months cycle, a milestone could be 3-months, 6 months, 9 months etc.
- The proposal must display all milestones with clear deliverables and the amount requested must match the 1st milestone. If a second milestone proposal is submitted, it must display the first completed milestone, linking all deliverables. If a third milestone proposal is submitted, it must display the first and second completed milestone, linking all deliverables. This repeats until all milestones are completed.
- Funding will only be disbursed upon the completion of deliverables.
- A proposal must specify how its delivery can be verified,  so that it can be checked prior to payment.
- Proposals must include clear, non-technical descriptions of deliverables. We encourage the use of multimedia (blog/video) to help explain your proposal’s benefits to the community.
- Contain the maintenance period, availability, and sustainability plans. This includes information on potential costs and the duration for which services will be offered at no or reduced cost.

Proposals **MUST NOT**:

- Request funds for marketing campaigns or organizing future meetups.

> Each entity, individual, or project can submit at most two proposals (one proactive proposal and one retroactive proposal). Attempts to circumvent this rule may lead to disqualification or denial of funds.

### Disclaimer jurisdictions and exclusions

To be eligible to apply for a grant, projects must abide by the <a href="https://www.algorand.foundation/disclaimers">Disclaimers</a> (in particular the “Excluded Jurisdictions” section) and be willing to enter into <a href="https://drive.google.com/file/d/1dsKwQGhnS3h_PrSkoidhnvqlX7soLpZ-/view">a binding contract with the Algorand Foundation</a>.
Additionally, applications promoting gambling, adult content, drug use, and violence of any kind are not permitted.

> We are currently accepting grant applications from US-based individual/business. If the grant is approved, Algos will be converted to USDCa upon payment. This exception will be reviewed periodically.

### Voting Power

When an account participates in its first session, the voting power assigned to it will be equivalent to the total governance rewards it would have received. For all following sessions, the account's voting power will adjust based on the rewards lost by members in their pool who did not meet their obligations.

The voting power for an upcoming session is computed as:
`new_account_voting_power = (initial_pool_voting_power * initial_account_voting_power) / pool_voting_power_used`

Where:

- `new_account_voting_power`: Voting power allocated to an account for the next session.
- `initial_account_voting_power`: The voting power originally assigned to an account, based on the governance rewards.
- `initial_pool_voting_power`: The total voting power of the pool during its initial phase. This is the sum of governance rewards for all pool participants.
- `pool_voting_power_used`: The voting power from the pool that was actually used in the last session.

### Proposal Approval Threshold

In order for a proposal to be approved, it is necessary for the number of votes in favor of the proposal to be proportionate to the amount of funds requested. This ensures that the allocation of funds is in line with the community's consensus and in accordance with democratic principles.

The formula to calculate the voting power needed to pass a proposal is as follows:
`voting_power_needed = (amount_requested) / (amount_available) * (current_session_voting_power_used)`

Where:

- `voting_power_needed`: Voting power required for a proposal to be accepted.
- `amount_requested`: The requested amount a proposal is seeking.
- `amount_available`: The entire grant funds available for the current session.
- `current_session_voting_power_used`: The voting power used in the current session.

> eg. 2 000 000 Algo are available to be given away as grants, 300 000 000 Algo are committed to the xGov Process, 200 000 000 Algo are used during the vote:
>
> - Proposal A request 100 000 Algos (5 % of the Amount available)
> - Proposal A needs 5 % of the used votes (10 000 000 Votes) to go through

### Voting on proposal

At the start of the voting period xGovs [ARC-33](arc-0033.md) will vote on proposals using the voting tool hosted at <a href="https://xgov.algorand.foundation/">https://xgov.algorand.foundation/</a>.

Vote will refer to the PR number and a cid hash of the proposal itself.

The CID MUST:

- Represent the file.

- Be a version V1 CID
  - E.g., use the option --cid-version=1 of ipfs add

- Use SHA-256 hash algorithm
  - E.g., use the option --hash=sha2-256 of ipfs add

### Grants calculation

The allocation of grants will consider the funding request amounts and the available amount of ALGO to be distributed.

### Grants contract & payment

- Once grants are approved, the Algorand Foundation team will handle the applicable contract and payment.
- **Before submitting your grant proposal**, review the contract template and ensure you're comfortable with its terms: <a href="https://drive.google.com/file/d/1dsKwQGhnS3h_PrSkoidhnvqlX7soLpZ-/view">Contract Template</a>.

> For milestone-based grants, please also refer to the [Submit a proposal section](./arc-0034.md#submit-a-proposal)

## Rationale

The current status of the proposal process includes the following elements:

- Proposals will be submitted off-chain and linked to the on-chain voting through a hash.
- Projects that require multiple funding rounds will need to submit separate proposals.
- The allocation of funds will be subject to review and adjustment during each governance period.
- Voting on proposals will take place on-chain.

We encourage the community to continue to provide input on this topic through the submission of questions and ideas in this ARC document.

## Security Considerations

None

## Copyright

Copyright and related rights waived via <a href="https://creativecommons.org/publicdomain/zero/1.0/">CCO</a>.

```

--------------------------------------------------------------------------------
/packages/server/src/resources/knowledge/taxonomy/algokit:cli:architecture-decisions:2024-01-13_native_binaries.md:
--------------------------------------------------------------------------------

```markdown
# AlgoKit CLI native binaries

- **Status**: Approved
- **Owner:** Altynbek Orumbayev (MakerX), Negar Abbasi (MakerX)
- **Deciders**: Alessandro (Algorand Foundation), MakerX
- **Date created**: 2024-01-13
- **Date decided:** 2024-01-25
- **Date updated**: 2024-01-16

## Context

The primary motivation for this decision is to streamline the installation process of AlgoKit CLI and reduce the friction associated with installing it on various operating systems. Currently, users often encounter minor environment-specific bugs during installation, which can be a significant deterrent. By providing native binaries, we aim to speed up the installation time and eliminate these bugs by **removing requirements to install python by the user**, thereby improving the overall user experience.

The north star for this decision is to provide a distribution model that can be described as:

```mermaid
graph TD
    A[GitHub Runners] -->|Windows| B[Packaging tool]
    A -->|Mac| C[Packaging tool]
    A -->|Linux| D[Packaging tool]
    B --> E[Windows Binary]
    C --> F[Mac Binary]
    D --> G[Linux Binary]
    E -->|Winget| H[Windows Users]
    F -->|Brew| I[Mac Users]
    G -->|Snap| J[Linux Users]
    A -->|Wheel Build| K[Poetry]
    K --> L[PyPi]
    L -->|pipx| M[Python Users]
```

> ⚠️⚠️⚠️ Please note diagram above is a draft and is to be separately discussed in a follow up ADR that will focus on distribution of the binaries.

The scope of this ADR only concerns the packaging for the CLI. The distribution via `snap`, `winget` and etc will be handled separately/in-parallel after decision and implementation of this ADR is in place.

## Requirements

- The native binaries should be easy to maintain and understand from a CI/CD deployment perspective.
- The solution should support a wide variety of Linux distributions, macOS (both Apple Silicon and Intel architectures), and Windows.
- The solution should integrate seamlessly with existing installation options, including Homebrew, or provide an easier alternative.
- The solution should be designed with future scalability in mind, allowing for the addition of support for other variations of architectures or else as needed.
- The solution should not significantly increase the complexity of the build process.
- The solution should provide clear error messages and debugging information to assist in troubleshooting any issues that may arise.
- You don't need to install Python on your system to use AlgoKit if you aren't creating a Python project.

## Options

### Option 1 - PyInstaller

**Pros**

- Easy to use and configure
- Supports multiple platforms and architectures
- Can handle complex packages and dependencies
- Generates a single file executable
- Active development and community support
- Fairly fast build time via ci - ~3-4 minutes
- Fairly small executable size (see benchmarking results below)
- Marginally equal executable load time in `onedir` mode compared to `onefile` mode

**Cons**

- Occasionally requires manual configuration for more complex packages
- Requires complex build packaging matrix to support multiple platforms and architectures
- Requires minor tweaks in algokit cli to account for the fact that features relying on `sys.executable` will point to algokit cli executable instead of python interpreter. This is a minor change and can be done in a backwards compatible way however still a con to consider.
- Requires minor tweaks in algokit cli to introduce `multiprocessing.freeze_support()` to avoid issues with `vanity-address` task when executing via binary.

#### PoC

The PoC is available [here](https://github.com/algorandfoundation/algokit-cli/pull/382). It outlines a simple github action with extra setup that compiles algokit cli as a single file executable on latest versions of Windows, Mac and Linux github runners.

### Option 2 - Nuitka

**Pros**

- Nuitka translates Python code into C and then compiles it, which can result in performance improvements.
- Cross-Platform: Supports multiple platforms including Windows, macOS, and Linux.
- More cross compilations options than PyInstaller
- Official github action simplifies the process of building executables for different platforms.

**Cons**

- Compilation Time: The process of converting Python to C and then compiling can be time-consuming. Up to ~30 minutes on github with 3 parallel jobs.
- Size of Executable: The resulting executables can be larger due to the inclusion of the Python interpreter and the compiled C code (see benchmarking results below).
- Does not support Python 3.12.
- Requires minor tweaks in algokit cli to account for the fact that features relying on `sys.executable` will point to algokit cli executable instead of python interpreter. This is a minor change and can be done in a backwards compatible way however still a con to consider.
- Requires minor tweaks in algokit cli to introduce `multiprocessing.freeze_support()` to avoid issues with `vanity-address` task when executing via binary.

#### PoC

The PoC is available [here](https://github.com/algorandfoundation/algokit-cli/pull/393). It outlines a simple github action with extra setup that compiles algokit cli as a single file executable on latest versions of Windows, Mac and Linux github runners.

### Benchmarking `pyinstaller` vs `nuitka` vs pipx installed `algokit`

#### Methodology

`hyperfine` was used to benchmark 5 different executables:

- Nuitka Onefile - Nuitka compiled executable with `--onefile` flag, which produces a single file executable.
- Nuitka Onedir - Nuitka compiled executable with `--onedir` flag, which produces a directory with the executable and other dependencies unzipped.
- PyInstaller Onedir - PyInstaller compiled executable with `--standalone` flag, which produces a directory with the executable and other dependencies unzipped.
- PyInstaller Onefile - PyInstaller compiled executable with `--onefile` flag, which produces a single file executable.
- AlgoKit from `pipx` - AlgoKit CLI installed via `pipx` with all dependencies frozen (current latest stable release).

The benchmarking was performed on a MacBook M2 running macOS 14.2.1 and an ARM based Ubuntu 20.04.3 LTS running on a Parallels Desktop on the same machine.

#### Results

| Method              | macOS M2 | Ubuntu 20 ARM Linux VM | Windows 11 ARM |
| ------------------- | -------- | ---------------------- | -------------- |
| nuitka_onefile      | 3.634    | 1.465                  | 3.874          |
| nuitka_onedir       | 0.2515   | 0.6200                 | 0.5136         |
| pyinstaller_onedir  | 0.3228   | 0.7927                 | 0.6668         |
| pyinstaller_onefile | 3.031    | 1.466                  | 1.875          |
| algokit             | 0.3126   | 0.6111                 | 0.7579         |

![Benchmarking Results](./assets/2024-01-13_native_binaries/image_1.png)
_Figure: Benchmarking results comparing the performance of Nuitka (onefile, onedir modes), PyInstaller (onefile, onedir modes), and pipx installed Algokit CLI on macOS M2, Windows 11 ARM VM, Ubuntu 20 ARM VM._

| Method              | Windows (MB) | Ubuntu (MB) | macOS (MB) |
| ------------------- | ------------ | ----------- | ---------- |
| nuitka_onedir       | 92.10        | 106         | 166        |
| nuitka_onefile      | 22.48        | 23          | 41         |
| pyinstaller_onedir  | 46.07        | 52          | 113        |
| pyinstaller_onefile | 26.47        | 25          | 45         |

![Bundle sizes](./assets/2024-01-13_native_binaries/image_2.png)
_Figure: Bundle sizes of folders with executables build with Nuitka (onefile, onedir modes), PyInstaller (onefile, onedir modes)._

#### Preliminary Observations

- Nuitka's warmed up execution time is **fast**
- Nuitka produces largest executables in `onedir` mode
- Nuitka is the slowest to build (no charts for build benchmarks, this is observations based on CI build time from PoC, see links above)
- PyInstaller produces smallest executables in `onedir` mode
- PyInstaller is the fastest to build (no charts for build benchmarks, this is observations based on CI build time from PoC, see links above)

### Honorable Mentions

#### cx_Freeze

cx_Freeze is a set of scripts and modules for freezing Python scripts into executables. It is similar to PyInstaller in many ways, but PyInstaller is preferred due to its more mature and comprehensive documentation.

#### PyOxidizer

PyOxidizer is a utility for producing binaries that embed Python. However, it is no longer actively maintained, which makes it a less desirable option for our needs.

## Preferred option

Based on observations so far we are leaning towards an Option 1. Where we would use PyInstaller to build native binaries for Windows, Mac and Linux.

While `nuitka` in `onedir` mode is even faster than pip installed algokit, it generates larger executables, and is the slowest option in terms of build time. Pyinstaller is only marginally slower than `nuitka` or pip installed algokit in terms of execution time, has mature documentation, and is the fastest option to build (in `onedir` mode) and produces smaller executables than `nuitka`. Given that and the fact that `nuitka` does not support Python 3.12 yet and has a lot of `magical` optimizations hidden under the hood, we are leaning towards PyInstaller as the preferred option for building native binaries given its maturity and straightforwardness despite marginally slower execution time (which is not a big deal given that we are talking of deviations of 5-10 milliseconds).

## Selected option

The team has formally pre-discussed this ADR and has agreed to proceed with Option 1 - PyInstaller.

## Next Steps

- [ ] Finalize the decision on the preferred option.
- [ ] Expand PoC and polish the github action to build native binaries for Windows, Mac and Linux for x86, x86-64 and ARM architectures.
- [ ] Implement portability snapshot tests, expanding existing algokit cli snapshot tests by running against real executable covering main functionality to test and ensure that the native binaries are portable and behave the same way as pip installed algokit cli.
- [ ] Submit follow up ADR to discuss strategies on how to distribute the binaries in most accessible, user friendly and secure way.

```

--------------------------------------------------------------------------------
/packages/server/src/resources/knowledge/taxonomy/algokit:utils:typescript:code:modules:types_app_arc56.md:
--------------------------------------------------------------------------------

```markdown
[@algorandfoundation/algokit-utils](../README.md) / types/app-arc56

# Module: types/app-arc56

## Table of contents

### Classes

- [Arc56Method](../classes/types_app_arc56.Arc56Method.md)

### Interfaces

- [Arc56Contract](../interfaces/types_app_arc56.Arc56Contract.md)
- [Event](../interfaces/types_app_arc56.Event.md)
- [Method](../interfaces/types_app_arc56.Method.md)
- [ProgramSourceInfo](../interfaces/types_app_arc56.ProgramSourceInfo.md)
- [StorageKey](../interfaces/types_app_arc56.StorageKey.md)
- [StorageMap](../interfaces/types_app_arc56.StorageMap.md)
- [StructField](../interfaces/types_app_arc56.StructField.md)

### Type Aliases

- [ABIStruct](types_app_arc56.md#abistruct)
- [ABIType](types_app_arc56.md#abitype)
- [AVMBytes](types_app_arc56.md#avmbytes)
- [AVMString](types_app_arc56.md#avmstring)
- [AVMType](types_app_arc56.md#avmtype)
- [AVMUint64](types_app_arc56.md#avmuint64)
- [Arc56MethodArg](types_app_arc56.md#arc56methodarg)
- [Arc56MethodReturnType](types_app_arc56.md#arc56methodreturntype)
- [StructName](types_app_arc56.md#structname)

### Functions

- [getABIDecodedValue](types_app_arc56.md#getabidecodedvalue)
- [getABIEncodedValue](types_app_arc56.md#getabiencodedvalue)
- [getABIStructFromABITuple](types_app_arc56.md#getabistructfromabituple)
- [getABITupleFromABIStruct](types_app_arc56.md#getabituplefromabistruct)
- [getABITupleTypeFromABIStructDefinition](types_app_arc56.md#getabitupletypefromabistructdefinition)
- [getArc56Method](types_app_arc56.md#getarc56method)
- [getArc56ReturnValue](types_app_arc56.md#getarc56returnvalue)

## Type Aliases

### ABIStruct

Ƭ **ABIStruct**: `Object`

Decoded ARC-56 struct as a struct rather than a tuple.

#### Index signature

▪ [key: `string`]: [`ABIStruct`](types_app_arc56.md#abistruct) \| `algosdk.ABIValue`

#### Defined in

[src/types/app-arc56.ts:108](https://github.com/algorandfoundation/algokit-utils-ts/blob/main/src/types/app-arc56.ts#L108)

___

### ABIType

Ƭ **ABIType**: `string`

An ABI-encoded type

#### Defined in

[src/types/app-arc56.ts:436](https://github.com/algorandfoundation/algokit-utils-ts/blob/main/src/types/app-arc56.ts#L436)

___

### AVMBytes

Ƭ **AVMBytes**: ``"AVMBytes"``

Raw byteslice without the length prefixed that is specified in ARC-4

#### Defined in

[src/types/app-arc56.ts:442](https://github.com/algorandfoundation/algokit-utils-ts/blob/main/src/types/app-arc56.ts#L442)

___

### AVMString

Ƭ **AVMString**: ``"AVMString"``

A utf-8 string without the length prefix that is specified in ARC-4

#### Defined in

[src/types/app-arc56.ts:445](https://github.com/algorandfoundation/algokit-utils-ts/blob/main/src/types/app-arc56.ts#L445)

___

### AVMType

Ƭ **AVMType**: [`AVMBytes`](types_app_arc56.md#avmbytes) \| [`AVMString`](types_app_arc56.md#avmstring) \| [`AVMUint64`](types_app_arc56.md#avmuint64)

A native AVM type

#### Defined in

[src/types/app-arc56.ts:451](https://github.com/algorandfoundation/algokit-utils-ts/blob/main/src/types/app-arc56.ts#L451)

___

### AVMUint64

Ƭ **AVMUint64**: ``"AVMUint64"``

A 64-bit unsigned integer

#### Defined in

[src/types/app-arc56.ts:448](https://github.com/algorandfoundation/algokit-utils-ts/blob/main/src/types/app-arc56.ts#L448)

___

### Arc56MethodArg

Ƭ **Arc56MethodArg**: [`Expand`](types_expand.md#expand)\<`Omit`\<[`Method`](../interfaces/types_app_arc56.Method.md)[``"args"``][`number`], ``"type"``\> & \{ `type`: `algosdk.ABIArgumentType`  }\>

Type to describe an argument within an `Arc56Method`.

#### Defined in

[src/types/app-arc56.ts:6](https://github.com/algorandfoundation/algokit-utils-ts/blob/main/src/types/app-arc56.ts#L6)

___

### Arc56MethodReturnType

Ƭ **Arc56MethodReturnType**: [`Expand`](types_expand.md#expand)\<`Omit`\<[`Method`](../interfaces/types_app_arc56.Method.md)[``"returns"``], ``"type"``\> & \{ `type`: `algosdk.ABIReturnType`  }\>

Type to describe a return type within an `Arc56Method`.

#### Defined in

[src/types/app-arc56.ts:13](https://github.com/algorandfoundation/algokit-utils-ts/blob/main/src/types/app-arc56.ts#L13)

___

### StructName

Ƭ **StructName**: `string`

The name of a defined struct

#### Defined in

[src/types/app-arc56.ts:439](https://github.com/algorandfoundation/algokit-utils-ts/blob/main/src/types/app-arc56.ts#L439)

## Functions

### getABIDecodedValue

▸ **getABIDecodedValue**(`value`, `type`, `structs`): `algosdk.ABIValue` \| [`ABIStruct`](types_app_arc56.md#abistruct)

Returns the decoded ABI value (or struct for a struct type)
for the given raw Algorand value given an ARC-56 type and defined ARC-56 structs.

#### Parameters

| Name | Type | Description |
| :------ | :------ | :------ |
| `value` | `number` \| `bigint` \| `Uint8Array` | The raw Algorand value (bytes or uint64) |
| `type` | `string` | The ARC-56 type - either an ABI Type string or a struct name |
| `structs` | `Record`\<`string`, [`StructField`](../interfaces/types_app_arc56.StructField.md)[]\> | The defined ARC-56 structs |

#### Returns

`algosdk.ABIValue` \| [`ABIStruct`](types_app_arc56.md#abistruct)

The decoded ABI value or struct

#### Defined in

[src/types/app-arc56.ts:120](https://github.com/algorandfoundation/algokit-utils-ts/blob/main/src/types/app-arc56.ts#L120)

___

### getABIEncodedValue

▸ **getABIEncodedValue**(`value`, `type`, `structs`): `Uint8Array`

Returns the ABI-encoded value for the given value.

#### Parameters

| Name | Type | Description |
| :------ | :------ | :------ |
| `value` | `ABIValue` \| [`ABIStruct`](types_app_arc56.md#abistruct) | The value to encode either already in encoded binary form (`Uint8Array`), a decoded ABI value or an ARC-56 struct |
| `type` | `string` | The ARC-56 type - either an ABI Type string or a struct name |
| `structs` | `Record`\<`string`, [`StructField`](../interfaces/types_app_arc56.StructField.md)[]\> | The defined ARC-56 structs |

#### Returns

`Uint8Array`

The binary ABI-encoded value

#### Defined in

[src/types/app-arc56.ts:142](https://github.com/algorandfoundation/algokit-utils-ts/blob/main/src/types/app-arc56.ts#L142)

___

### getABIStructFromABITuple

▸ **getABIStructFromABITuple**\<`TReturn`\>(`decodedABITuple`, `structFields`, `structs`): `TReturn`

Converts a decoded ABI tuple as a struct.

#### Type parameters

| Name | Type |
| :------ | :------ |
| `TReturn` | extends [`ABIStruct`](types_app_arc56.md#abistruct) = `Record`\<`string`, `any`\> |

#### Parameters

| Name | Type | Description |
| :------ | :------ | :------ |
| `decodedABITuple` | `ABIValue`[] | The decoded ABI tuple value |
| `structFields` | [`StructField`](../interfaces/types_app_arc56.StructField.md)[] | The struct fields from an ARC-56 app spec |
| `structs` | `Record`\<`string`, [`StructField`](../interfaces/types_app_arc56.StructField.md)[]\> | - |

#### Returns

`TReturn`

The struct as a Record<string, any>

#### Defined in

[src/types/app-arc56.ts:70](https://github.com/algorandfoundation/algokit-utils-ts/blob/main/src/types/app-arc56.ts#L70)

___

### getABITupleFromABIStruct

▸ **getABITupleFromABIStruct**(`struct`, `structFields`, `structs`): `algosdk.ABIValue`[]

Converts an ARC-56 struct as an ABI tuple.

#### Parameters

| Name | Type | Description |
| :------ | :------ | :------ |
| `struct` | [`ABIStruct`](types_app_arc56.md#abistruct) | The struct to convert |
| `structFields` | [`StructField`](../interfaces/types_app_arc56.StructField.md)[] | The struct fields from an ARC-56 app spec |
| `structs` | `Record`\<`string`, [`StructField`](../interfaces/types_app_arc56.StructField.md)[]\> | - |

#### Returns

`algosdk.ABIValue`[]

The struct as a decoded ABI tuple

#### Defined in

[src/types/app-arc56.ts:94](https://github.com/algorandfoundation/algokit-utils-ts/blob/main/src/types/app-arc56.ts#L94)

___

### getABITupleTypeFromABIStructDefinition

▸ **getABITupleTypeFromABIStructDefinition**(`struct`, `structs`): `algosdk.ABITupleType`

Returns the `ABITupleType` for the given ARC-56 struct definition

#### Parameters

| Name | Type | Description |
| :------ | :------ | :------ |
| `struct` | [`StructField`](../interfaces/types_app_arc56.StructField.md)[] | The ARC-56 struct definition |
| `structs` | `Record`\<`string`, [`StructField`](../interfaces/types_app_arc56.StructField.md)[]\> | - |

#### Returns

`algosdk.ABITupleType`

The `ABITupleType`

#### Defined in

[src/types/app-arc56.ts:48](https://github.com/algorandfoundation/algokit-utils-ts/blob/main/src/types/app-arc56.ts#L48)

___

### getArc56Method

▸ **getArc56Method**(`methodNameOrSignature`, `appSpec`): [`Arc56Method`](../classes/types_app_arc56.Arc56Method.md)

Returns the ARC-56 ABI method object for a given method name or signature and ARC-56 app spec.

#### Parameters

| Name | Type | Description |
| :------ | :------ | :------ |
| `methodNameOrSignature` | `string` | The method name or method signature to call if an ABI call is being emitted. e.g. `my_method` or `my_method(unit64,string)bytes` |
| `appSpec` | [`Arc56Contract`](../interfaces/types_app_arc56.Arc56Contract.md) | The app spec for the app |

#### Returns

[`Arc56Method`](../classes/types_app_arc56.Arc56Method.md)

The `Arc56Method`

#### Defined in

[src/types/app-arc56.ts:172](https://github.com/algorandfoundation/algokit-utils-ts/blob/main/src/types/app-arc56.ts#L172)

___

### getArc56ReturnValue

▸ **getArc56ReturnValue**\<`TReturn`\>(`returnValue`, `method`, `structs`): `TReturn`

Checks for decode errors on the AppCallTransactionResult and maps the return value to the specified generic type

#### Type parameters

| Name | Type |
| :------ | :------ |
| `TReturn` | extends `undefined` \| `ABIValue` \| [`ABIStruct`](types_app_arc56.md#abistruct) |

#### Parameters

| Name | Type | Description |
| :------ | :------ | :------ |
| `returnValue` | `undefined` \| [`ABIReturn`](types_app.md#abireturn) | The smart contract response |
| `method` | [`Method`](../interfaces/types_app_arc56.Method.md) \| [`Arc56Method`](../classes/types_app_arc56.Arc56Method.md) | The method that was called |
| `structs` | `Record`\<`string`, [`StructField`](../interfaces/types_app_arc56.StructField.md)[]\> | The struct fields from the app spec |

#### Returns

`TReturn`

The smart contract response with an updated return value

#### Defined in

[src/types/app-arc56.ts:203](https://github.com/algorandfoundation/algokit-utils-ts/blob/main/src/types/app-arc56.ts#L203)

```

--------------------------------------------------------------------------------
/packages/server/src/resources/knowledge/developers-sdks-js.txt:
--------------------------------------------------------------------------------

```
SDKs:javascript:FAQ.md
SDKs:javascript:classes:Kmd.md
SDKs:javascript:classes:modelsv2.SimulateTraceConfig.md
SDKs:javascript:classes:indexerModels.Block.md
SDKs:javascript:classes:modelsv2.ApplicationInitialStates.md
SDKs:javascript:classes:Indexer.md
SDKs:javascript:classes:indexerModels.EvalDelta.md
SDKs:javascript:classes:indexerModels.StateProofSigSlot.md
SDKs:javascript:classes:indexerModels.AssetParams.md
SDKs:javascript:classes:indexerModels.TealValue.md
SDKs:javascript:classes:indexerModels.ParticipationUpdates.md
SDKs:javascript:classes:modelsv2.DisassembleResponse.md
SDKs:javascript:classes:indexerModels.StateProofVerifier.md
SDKs:javascript:classes:indexerModels.ApplicationsResponse.md
SDKs:javascript:classes:modelsv2.AssetHolding.md
SDKs:javascript:classes:modelsv2.BlockLogsResponse.md
SDKs:javascript:classes:indexerModels.StateProofSignature.md
SDKs:javascript:classes:LogicSig.md
SDKs:javascript:classes:ABIBoolType.md
SDKs:javascript:classes:indexerModels.AccountResponse.md
SDKs:javascript:classes:indexerModels.AssetsResponse.md
SDKs:javascript:classes:modelsv2.SupplyResponse.md
SDKs:javascript:classes:modelsv2.DryrunTxnResult.md
SDKs:javascript:classes:modelsv2.Application.md
SDKs:javascript:classes:ABIArrayDynamicType.md
SDKs:javascript:classes:indexerModels.BoxDescriptor.md
SDKs:javascript:classes:modelsv2.BuildVersion.md
SDKs:javascript:classes:DryrunResult.md
SDKs:javascript:classes:modelsv2.StateProof.md
SDKs:javascript:classes:modelsv2.SimulationTransactionExecTrace.md
SDKs:javascript:classes:indexerModels.TransactionSignature.md
SDKs:javascript:classes:modelsv2.SimulateTransactionGroupResult.md
SDKs:javascript:classes:modelsv2.AssetHoldingReference.md
SDKs:javascript:classes:modelsv2.TealKeyValue.md
SDKs:javascript:classes:indexerModels.StateProofTracking.md
SDKs:javascript:classes:indexerModels.ApplicationLogData.md
SDKs:javascript:classes:modelsv2.ApplicationStateSchema.md
SDKs:javascript:classes:ABIType.md
SDKs:javascript:classes:indexerModels.TransactionSignatureMultisig.md
SDKs:javascript:classes:modelsv2.SimulateTransactionResult.md
SDKs:javascript:classes:indexerModels.ApplicationParams.md
SDKs:javascript:classes:modelsv2.StateProofMessage.md
SDKs:javascript:classes:indexerModels.ErrorResponse.md
SDKs:javascript:classes:SourceMap.md
SDKs:javascript:classes:modelsv2.BlockHashResponse.md
SDKs:javascript:classes:modelsv2.SimulateRequest.md
SDKs:javascript:classes:ABIInterface.md
SDKs:javascript:classes:indexerModels.EvalDeltaKeyValue.md
SDKs:javascript:classes:indexerModels.AccountParticipation.md
SDKs:javascript:classes:Algodv2.md
SDKs:javascript:classes:indexerModels.TransactionsResponse.md
SDKs:javascript:classes:indexerModels.BoxesResponse.md
SDKs:javascript:classes:modelsv2.PostTransactionsResponse.md
SDKs:javascript:classes:indexerModels.TransactionAssetConfig.md
SDKs:javascript:classes:indexerModels.Transaction.md
SDKs:javascript:classes:indexerModels.ApplicationLocalState.md
SDKs:javascript:classes:modelsv2.AccountStateDelta.md
SDKs:javascript:classes:indexerModels.AssetResponse.md
SDKs:javascript:classes:modelsv2.TransactionGroupLedgerStateDeltasForRoundResponse.md
SDKs:javascript:classes:modelsv2.SimulateInitialStates.md
SDKs:javascript:classes:indexerModels.StateProofReveal.md
SDKs:javascript:classes:modelsv2.Box.md
SDKs:javascript:classes:indexerModels.HealthCheck.md
SDKs:javascript:classes:ABIMethod.md
SDKs:javascript:classes:indexerModels.ApplicationResponse.md
SDKs:javascript:classes:indexerModels.Account.md
SDKs:javascript:classes:indexerModels.TransactionPayment.md
SDKs:javascript:classes:modelsv2.Version.md
SDKs:javascript:classes:modelsv2.GetBlockTimeStampOffsetResponse.md
SDKs:javascript:classes:modelsv2.LightBlockHeaderProof.md
SDKs:javascript:classes:modelsv2.DryrunRequest.md
SDKs:javascript:classes:modelsv2.AvmKeyValue.md
SDKs:javascript:classes:ABIAddressType.md
SDKs:javascript:classes:modelsv2.AccountAssetsInformationResponse.md
SDKs:javascript:classes:modelsv2.DryrunSource.md
SDKs:javascript:classes:modelsv2.AssetParams.md
SDKs:javascript:classes:modelsv2.DryrunState.md
SDKs:javascript:classes:modelsv2.EvalDeltaKeyValue.md
SDKs:javascript:classes:indexerModels.TealKeyValue.md
SDKs:javascript:classes:modelsv2.AccountParticipation.md
SDKs:javascript:classes:modelsv2.SimulateRequestTransactionGroup.md
SDKs:javascript:classes:indexerModels.Application.md
SDKs:javascript:classes:modelsv2.SimulationOpcodeTraceUnit.md
SDKs:javascript:classes:ABITupleType.md
SDKs:javascript:classes:indexerModels.ApplicationLogsResponse.md
SDKs:javascript:classes:modelsv2.AvmValue.md
SDKs:javascript:classes:modelsv2.ApplicationParams.md
SDKs:javascript:classes:modelsv2.BlockTxidsResponse.md
SDKs:javascript:classes:indexerModels.TransactionStateProof.md
SDKs:javascript:classes:indexerModels.BlockUpgradeVote.md
SDKs:javascript:classes:indexerModels.StateSchema.md
SDKs:javascript:classes:modelsv2.BoxDescriptor.md
SDKs:javascript:classes:modelsv2.LedgerStateDeltaForTransactionGroup.md
SDKs:javascript:classes:AtomicTransactionComposer.md
SDKs:javascript:classes:modelsv2.SimulateResponse.md
SDKs:javascript:classes:indexerModels.AccountsResponse.md
SDKs:javascript:classes:indexerModels.AssetHolding.md
SDKs:javascript:classes:modelsv2.ApplicationKVStorage.md
SDKs:javascript:classes:ABIArrayStaticType.md
SDKs:javascript:classes:modelsv2.PendingTransactionResponse.md
SDKs:javascript:classes:modelsv2.Account.md
SDKs:javascript:classes:modelsv2.AccountApplicationResponse.md
SDKs:javascript:classes:indexerModels.AssetHoldingsResponse.md
SDKs:javascript:classes:modelsv2.DryrunResponse.md
SDKs:javascript:classes:modelsv2.AccountAssetResponse.md
SDKs:javascript:classes:modelsv2.NodeStatusResponse.md
SDKs:javascript:classes:modelsv2.CompileResponse.md
SDKs:javascript:classes:indexerModels.MerkleArrayProof.md
SDKs:javascript:classes:indexerModels.Box.md
SDKs:javascript:classes:indexerModels.BlockRewards.md
SDKs:javascript:classes:modelsv2.ScratchChange.md
SDKs:javascript:classes:modelsv2.AccountAssetHolding.md
SDKs:javascript:classes:indexerModels.AssetBalancesResponse.md
SDKs:javascript:classes:indexerModels.AccountStateDelta.md
SDKs:javascript:classes:modelsv2.ApplicationStateOperation.md
SDKs:javascript:classes:indexerModels.TransactionSignatureLogicsig.md
SDKs:javascript:classes:indexerModels.TransactionSignatureMultisigSubsignature.md
SDKs:javascript:classes:indexerModels.TransactionAssetTransfer.md
SDKs:javascript:classes:indexerModels.TransactionAssetFreeze.md
SDKs:javascript:classes:modelsv2.TransactionProofResponse.md
SDKs:javascript:classes:modelsv2.ApplicationLocalState.md
SDKs:javascript:classes:modelsv2.BoxReference.md
SDKs:javascript:classes:ABIUintType.md
SDKs:javascript:classes:modelsv2.ErrorResponse.md
SDKs:javascript:classes:ABIUfixedType.md
SDKs:javascript:classes:modelsv2.TransactionParametersResponse.md
SDKs:javascript:classes:ABIStringType.md
SDKs:javascript:classes:modelsv2.ApplicationLocalReference.md
SDKs:javascript:classes:modelsv2.BoxesResponse.md
SDKs:javascript:classes:modelsv2.SimulateUnnamedResourcesAccessed.md
SDKs:javascript:classes:indexerModels.IndexerStateProofMessage.md
SDKs:javascript:classes:indexerModels.BlockUpgradeState.md
SDKs:javascript:classes:Transaction.md
SDKs:javascript:classes:indexerModels.StateProofFields.md
SDKs:javascript:classes:LogicSigAccount.md
SDKs:javascript:classes:modelsv2.Asset.md
SDKs:javascript:classes:indexerModels.TransactionKeyreg.md
SDKs:javascript:classes:modelsv2.TealValue.md
SDKs:javascript:classes:indexerModels.ApplicationLocalStatesResponse.md
SDKs:javascript:classes:modelsv2.BlockResponse.md
SDKs:javascript:classes:indexerModels.Asset.md
SDKs:javascript:classes:modelsv2.SimulationEvalOverrides.md
SDKs:javascript:classes:modelsv2.EvalDelta.md
SDKs:javascript:classes:indexerModels.StateProofParticipant.md
SDKs:javascript:classes:ABIByteType.md
SDKs:javascript:classes:indexerModels.MiniAssetHolding.md
SDKs:javascript:classes:indexerModels.TransactionResponse.md
SDKs:javascript:classes:modelsv2.GetSyncRoundResponse.md
SDKs:javascript:classes:modelsv2.KvDelta.md
SDKs:javascript:classes:indexerModels.TransactionApplication.md
SDKs:javascript:classes:indexerModels.HashFactory.md
SDKs:javascript:classes:modelsv2.AppCallLogs.md
SDKs:javascript:classes:modelsv2.PendingTransactionsResponse.md
SDKs:javascript:classes:indexerModels.ApplicationStateSchema.md
SDKs:javascript:classes:ABIContract.md
SDKs:javascript:enums:IntDecoding.md
SDKs:javascript:enums:ABITransactionType.md
SDKs:javascript:enums:OnApplicationComplete.md
SDKs:javascript:enums:AtomicTransactionComposerStatus.md
SDKs:javascript:enums:TransactionType.md
SDKs:javascript:enums:ABIReferenceType.md
SDKs:javascript:modules.md
SDKs:javascript:README.md
SDKs:javascript:modules:indexerModels.md
SDKs:javascript:modules:modelsv2.md
SDKs:javascript:interfaces:EncodedSignedTransaction.md
SDKs:javascript:interfaces:ABIContractParams.md
SDKs:javascript:interfaces:ABIMethodArgParams.md
SDKs:javascript:interfaces:BoxReference.md
SDKs:javascript:interfaces:EncodedLogicSig.md
SDKs:javascript:interfaces:BaseHTTPClientResponse.md
SDKs:javascript:interfaces:TransactionWithSigner.md
SDKs:javascript:interfaces:BaseHTTPClient.md
SDKs:javascript:interfaces:EncodedBoxReference.md
SDKs:javascript:interfaces:ABIResult.md
SDKs:javascript:interfaces:TransactionParams.md
SDKs:javascript:interfaces:Account.md
SDKs:javascript:interfaces:SignedTransaction.md
SDKs:javascript:interfaces:MultisigMetadata.md
SDKs:javascript:interfaces:EncodedGlobalStateSchema.md
SDKs:javascript:interfaces:EncodedLogicSigAccount.md
SDKs:javascript:interfaces:SuggestedParams.md
SDKs:javascript:interfaces:EncodedLocalStateSchema.md
SDKs:javascript:interfaces:ABIContractNetworkInfo.md
SDKs:javascript:interfaces:ABIContractNetworks.md
SDKs:javascript:interfaces:EncodedSubsig.md
SDKs:javascript:interfaces:ABIMethodParams.md
SDKs:javascript:interfaces:Address.md
SDKs:javascript:interfaces:EncodedTransaction.md
SDKs:javascript:interfaces:BaseHTTPClientError.md
SDKs:javascript:interfaces:ABIMethodReturnParams.md
SDKs:javascript:interfaces:AlgodTokenHeader.md
SDKs:javascript:interfaces:ABIInterfaceParams.md
SDKs:javascript:interfaces:EncodedMultisig.md
SDKs:javascript:interfaces:IndexerTokenHeader.md
SDKs:javascript:interfaces:KMDTokenHeader.md
SDKs:javascript:interfaces:CustomTokenHeader.md
SDKs:javascript:interfaces:EncodedAssetParams.md
SDKs:javascript:README.md
SDKs:javascript:examples:README.md
```

--------------------------------------------------------------------------------
/packages/server/src/resources/knowledge/taxonomy/SDKs:javascript:classes:modelsv2.NodeStatusResponse.md:
--------------------------------------------------------------------------------

```markdown
[algosdk](../README.md) / [Exports](../modules.md) / [modelsv2](../modules/modelsv2.md) / NodeStatusResponse

# Class: NodeStatusResponse

[modelsv2](../modules/modelsv2.md).NodeStatusResponse

## Hierarchy

- `default`

  ↳ **`NodeStatusResponse`**

## Table of contents

### Constructors

- [constructor](modelsv2.NodeStatusResponse.md#constructor)

### Properties

- [attribute\_map](modelsv2.NodeStatusResponse.md#attribute_map)
- [catchpoint](modelsv2.NodeStatusResponse.md#catchpoint)
- [catchpointAcquiredBlocks](modelsv2.NodeStatusResponse.md#catchpointacquiredblocks)
- [catchpointProcessedAccounts](modelsv2.NodeStatusResponse.md#catchpointprocessedaccounts)
- [catchpointProcessedKvs](modelsv2.NodeStatusResponse.md#catchpointprocessedkvs)
- [catchpointTotalAccounts](modelsv2.NodeStatusResponse.md#catchpointtotalaccounts)
- [catchpointTotalBlocks](modelsv2.NodeStatusResponse.md#catchpointtotalblocks)
- [catchpointTotalKvs](modelsv2.NodeStatusResponse.md#catchpointtotalkvs)
- [catchpointVerifiedAccounts](modelsv2.NodeStatusResponse.md#catchpointverifiedaccounts)
- [catchpointVerifiedKvs](modelsv2.NodeStatusResponse.md#catchpointverifiedkvs)
- [catchupTime](modelsv2.NodeStatusResponse.md#catchuptime)
- [lastCatchpoint](modelsv2.NodeStatusResponse.md#lastcatchpoint)
- [lastRound](modelsv2.NodeStatusResponse.md#lastround)
- [lastVersion](modelsv2.NodeStatusResponse.md#lastversion)
- [nextVersion](modelsv2.NodeStatusResponse.md#nextversion)
- [nextVersionRound](modelsv2.NodeStatusResponse.md#nextversionround)
- [nextVersionSupported](modelsv2.NodeStatusResponse.md#nextversionsupported)
- [stoppedAtUnsupportedRound](modelsv2.NodeStatusResponse.md#stoppedatunsupportedround)
- [timeSinceLastRound](modelsv2.NodeStatusResponse.md#timesincelastround)
- [upgradeDelay](modelsv2.NodeStatusResponse.md#upgradedelay)
- [upgradeNextProtocolVoteBefore](modelsv2.NodeStatusResponse.md#upgradenextprotocolvotebefore)
- [upgradeNoVotes](modelsv2.NodeStatusResponse.md#upgradenovotes)
- [upgradeNodeVote](modelsv2.NodeStatusResponse.md#upgradenodevote)
- [upgradeVoteRounds](modelsv2.NodeStatusResponse.md#upgradevoterounds)
- [upgradeVotes](modelsv2.NodeStatusResponse.md#upgradevotes)
- [upgradeVotesRequired](modelsv2.NodeStatusResponse.md#upgradevotesrequired)
- [upgradeYesVotes](modelsv2.NodeStatusResponse.md#upgradeyesvotes)

### Methods

- [get\_obj\_for\_encoding](modelsv2.NodeStatusResponse.md#get_obj_for_encoding)
- [from\_obj\_for\_encoding](modelsv2.NodeStatusResponse.md#from_obj_for_encoding)

## Constructors

### constructor

• **new NodeStatusResponse**(`«destructured»`)

Creates a new `NodeStatusResponse` object.

#### Parameters

| Name | Type |
| :------ | :------ |
| `«destructured»` | `Object` |
| › `catchpoint?` | `string` |
| › `catchpointAcquiredBlocks?` | `number` \| `bigint` |
| › `catchpointProcessedAccounts?` | `number` \| `bigint` |
| › `catchpointProcessedKvs?` | `number` \| `bigint` |
| › `catchpointTotalAccounts?` | `number` \| `bigint` |
| › `catchpointTotalBlocks?` | `number` \| `bigint` |
| › `catchpointTotalKvs?` | `number` \| `bigint` |
| › `catchpointVerifiedAccounts?` | `number` \| `bigint` |
| › `catchpointVerifiedKvs?` | `number` \| `bigint` |
| › `catchupTime` | `number` \| `bigint` |
| › `lastCatchpoint?` | `string` |
| › `lastRound` | `number` \| `bigint` |
| › `lastVersion` | `string` |
| › `nextVersion` | `string` |
| › `nextVersionRound` | `number` \| `bigint` |
| › `nextVersionSupported` | `boolean` |
| › `stoppedAtUnsupportedRound` | `boolean` |
| › `timeSinceLastRound` | `number` \| `bigint` |
| › `upgradeDelay?` | `number` \| `bigint` |
| › `upgradeNextProtocolVoteBefore?` | `number` \| `bigint` |
| › `upgradeNoVotes?` | `number` \| `bigint` |
| › `upgradeNodeVote?` | `boolean` |
| › `upgradeVoteRounds?` | `number` \| `bigint` |
| › `upgradeVotes?` | `number` \| `bigint` |
| › `upgradeVotesRequired?` | `number` \| `bigint` |
| › `upgradeYesVotes?` | `number` \| `bigint` |

#### Overrides

BaseModel.constructor

#### Defined in

client/v2/algod/models/types.ts:3666

## Properties

### attribute\_map

• **attribute\_map**: `Record`\<`string`, `string`\>

#### Inherited from

BaseModel.attribute\_map

#### Defined in

client/v2/basemodel.ts:56

___

### catchpoint

• `Optional` **catchpoint**: `string`

The current catchpoint that is being caught up to

#### Defined in

client/v2/algod/models/types.ts:3536

___

### catchpointAcquiredBlocks

• `Optional` **catchpointAcquiredBlocks**: `number` \| `bigint`

The number of blocks that have already been obtained by the node as part of the
catchup

#### Defined in

client/v2/algod/models/types.ts:3542

___

### catchpointProcessedAccounts

• `Optional` **catchpointProcessedAccounts**: `number` \| `bigint`

The number of accounts from the current catchpoint that have been processed so
far as part of the catchup

#### Defined in

client/v2/algod/models/types.ts:3548

___

### catchpointProcessedKvs

• `Optional` **catchpointProcessedKvs**: `number` \| `bigint`

The number of key-values (KVs) from the current catchpoint that have been
processed so far as part of the catchup

#### Defined in

client/v2/algod/models/types.ts:3554

___

### catchpointTotalAccounts

• `Optional` **catchpointTotalAccounts**: `number` \| `bigint`

The total number of accounts included in the current catchpoint

#### Defined in

client/v2/algod/models/types.ts:3559

___

### catchpointTotalBlocks

• `Optional` **catchpointTotalBlocks**: `number` \| `bigint`

The total number of blocks that are required to complete the current catchpoint
catchup

#### Defined in

client/v2/algod/models/types.ts:3565

___

### catchpointTotalKvs

• `Optional` **catchpointTotalKvs**: `number` \| `bigint`

The total number of key-values (KVs) included in the current catchpoint

#### Defined in

client/v2/algod/models/types.ts:3570

___

### catchpointVerifiedAccounts

• `Optional` **catchpointVerifiedAccounts**: `number` \| `bigint`

The number of accounts from the current catchpoint that have been verified so
far as part of the catchup

#### Defined in

client/v2/algod/models/types.ts:3576

___

### catchpointVerifiedKvs

• `Optional` **catchpointVerifiedKvs**: `number` \| `bigint`

The number of key-values (KVs) from the current catchpoint that have been
verified so far as part of the catchup

#### Defined in

client/v2/algod/models/types.ts:3582

___

### catchupTime

• **catchupTime**: `number` \| `bigint`

CatchupTime in nanoseconds

#### Defined in

client/v2/algod/models/types.ts:3494

___

### lastCatchpoint

• `Optional` **lastCatchpoint**: `string`

The last catchpoint seen by the node

#### Defined in

client/v2/algod/models/types.ts:3587

___

### lastRound

• **lastRound**: `number` \| `bigint`

LastRound indicates the last round seen

#### Defined in

client/v2/algod/models/types.ts:3499

___

### lastVersion

• **lastVersion**: `string`

LastVersion indicates the last consensus version supported

#### Defined in

client/v2/algod/models/types.ts:3504

___

### nextVersion

• **nextVersion**: `string`

NextVersion of consensus protocol to use

#### Defined in

client/v2/algod/models/types.ts:3509

___

### nextVersionRound

• **nextVersionRound**: `number` \| `bigint`

NextVersionRound is the round at which the next consensus version will apply

#### Defined in

client/v2/algod/models/types.ts:3514

___

### nextVersionSupported

• **nextVersionSupported**: `boolean`

NextVersionSupported indicates whether the next consensus version is supported
by this node

#### Defined in

client/v2/algod/models/types.ts:3520

___

### stoppedAtUnsupportedRound

• **stoppedAtUnsupportedRound**: `boolean`

StoppedAtUnsupportedRound indicates that the node does not support the new
rounds and has stopped making progress

#### Defined in

client/v2/algod/models/types.ts:3526

___

### timeSinceLastRound

• **timeSinceLastRound**: `number` \| `bigint`

TimeSinceLastRound in nanoseconds

#### Defined in

client/v2/algod/models/types.ts:3531

___

### upgradeDelay

• `Optional` **upgradeDelay**: `number` \| `bigint`

Upgrade delay

#### Defined in

client/v2/algod/models/types.ts:3592

___

### upgradeNextProtocolVoteBefore

• `Optional` **upgradeNextProtocolVoteBefore**: `number` \| `bigint`

Next protocol round

#### Defined in

client/v2/algod/models/types.ts:3597

___

### upgradeNoVotes

• `Optional` **upgradeNoVotes**: `number` \| `bigint`

No votes cast for consensus upgrade

#### Defined in

client/v2/algod/models/types.ts:3602

___

### upgradeNodeVote

• `Optional` **upgradeNodeVote**: `boolean`

This node's upgrade vote

#### Defined in

client/v2/algod/models/types.ts:3607

___

### upgradeVoteRounds

• `Optional` **upgradeVoteRounds**: `number` \| `bigint`

Total voting rounds for current upgrade

#### Defined in

client/v2/algod/models/types.ts:3612

___

### upgradeVotes

• `Optional` **upgradeVotes**: `number` \| `bigint`

Total votes cast for consensus upgrade

#### Defined in

client/v2/algod/models/types.ts:3617

___

### upgradeVotesRequired

• `Optional` **upgradeVotesRequired**: `number` \| `bigint`

Yes votes required for consensus upgrade

#### Defined in

client/v2/algod/models/types.ts:3622

___

### upgradeYesVotes

• `Optional` **upgradeYesVotes**: `number` \| `bigint`

Yes votes cast for consensus upgrade

#### Defined in

client/v2/algod/models/types.ts:3627

## Methods

### get\_obj\_for\_encoding

▸ **get_obj_for_encoding**(`binary?`): `Record`\<`string`, `any`\>

Get an object ready for encoding to either JSON or msgpack.

#### Parameters

| Name | Type | Default value | Description |
| :------ | :------ | :------ | :------ |
| `binary` | `boolean` | `false` | Use true to indicate that the encoding can handle raw binary objects (Uint8Arrays). Use false to indicate that raw binary objects should be converted to base64 strings. True should be used for objects that will be encoded with msgpack, and false should be used for objects that will be encoded with JSON. |

#### Returns

`Record`\<`string`, `any`\>

#### Inherited from

BaseModel.get\_obj\_for\_encoding

#### Defined in

client/v2/basemodel.ts:65

___

### from\_obj\_for\_encoding

▸ `Static` **from_obj_for_encoding**(`data`): [`NodeStatusResponse`](modelsv2.NodeStatusResponse.md)

#### Parameters

| Name | Type |
| :------ | :------ |
| `data` | `Record`\<`string`, `any`\> |

#### Returns

[`NodeStatusResponse`](modelsv2.NodeStatusResponse.md)

#### Defined in

client/v2/algod/models/types.ts:3780

```

--------------------------------------------------------------------------------
/packages/server/src/resources/knowledge/taxonomy/puya:docs:lg-arc4.md:
--------------------------------------------------------------------------------

```markdown
# ARC-4: Application Binary Interface

[ARC4](https://github.com/algorandfoundation/ARCs/blob/main/ARCs/arc-0004.md) defines a set of encodings and behaviors for authoring and interacting with an Algorand Smart Contract. It is not the only way to author a smart contract, but adhering to it will make it easier for other clients and users to interop with your contract.

To author an arc4 contract you should extend the `ARC4Contract` base class.

```python
from algopy import ARC4Contract

class HelloWorldContract(ARC4Contract):
    ...
```

## ARC-32 and ARC-56

[ARC32](https://github.com/algorandfoundation/ARCs/blob/main/ARCs/arc-0032.md) extends the concepts in ARC4 to include an Application Specification which more holistically describes a smart contract and its associated state.

ARC-32/ARC-56 Application Specification files are automatically generated by the compiler for ARC4 
contracts as `<ContractName>.arc32.json` or `<ContractName>.arc56.json`

## Methods

Individual methods on a smart contract should be annotated with an `abimethod` decorator. This decorator is used to indicate a method which should be externally callable. The decorator itself includes properties to restrict when the method should be callable, for instance only when the application is being created or only when the OnComplete action is OptIn.

A method that should not be externally available should be annotated with a `subroutine` decorator.

Method docstrings will be used when outputting ARC-32 or ARC-56 application specifications, the following docstrings styles are supported ReST, Google, Numpydoc-style and Epydoc.

```python
from algopy import ARC4Contract, subroutine, arc4


class HelloWorldContract(ARC4Contract):
    @arc4.abimethod(create=False, allow_actions=["NoOp", "OptIn"], name="external_name")
    def hello(self, name: arc4.String) -> arc4.String:
        return self.internal_method() + name

    @subroutine
    def internal_method(self) -> arc4.String:
        return arc4.String("Hello, ")
```

## Router

Algorand Smart Contracts only have two possible programs that are invoked when making an ApplicationCall Transaction (`appl`). The "clear state" program which is called when using an OnComplete action of `ClearState` or the "approval" program which is called for all other OnComplete actions.

Routing is required to dispatch calls handled by the approval program to the relevant ABI methods. When extending `ARC4Contract`, the routing code is automatically generated for you by the PuyaPy compiler.  

## Types

ARC4 defines a number of [data types](https://github.com/algorandfoundation/ARCs/blob/main/ARCs/arc-0004.md#types) which can be used in an ARC4 compatible contract and details how these types should be encoded in binary.

Algorand Python exposes these through a number of types which can be imported from the `algopy.arc4` module. These types represent binary encoded values following the rules prescribed in the ARC which can mean operations performed directly on these types are not as efficient as ones performed on natively supported types (such as `algopy.UInt64` or `algopy.Bytes`)

Where supported, the native equivalent of an ARC4 type can be obtained via the `.native` property. It is possible to use native types in an ABI method and the router will automatically encode and decode these types to their ARC4 equivalent.

### Booleans

**Type:** `algopy.arc4.Bool`  
**Encoding:** A single byte where the most significant bit is `1` for `True` and `0` for `False`  
**Native equivalent:** `builtins.bool`  

### Unsigned ints

**Types:** `algopy.arc4.UIntN` (<= 64 bits) `algopy.arc4.BigUIntN` (> 64 bits)  
**Encoding:** A big endian byte array of N bits  
**Native equivalent:** `algopy.UInt64` or `puya.py.BigUInt`  

Common bit sizes have also been aliased under `algopy.arc4.UInt8`, `algopy.arc4.UInt16` etc. A uint of any size between 8 and 512 bits (in intervals of 8bits) can be created using a generic parameter. It can be helpful to define your own alias for this type. 

```python
import typing as t
from algopy import arc4

UInt40: t.TypeAlias = arc4.UIntN[t.Literal[40]]
```

### Unsigned fixed point decimals

**Types:** `algopy.arc4.UFixedNxM` (<= 64 bits) `algopy.arc4.BigUFixedNxM` (> 64 bits)  
**Encoding:** A big endian byte array of N bits where `encoded_value = value / (10^M)`  
**Native equivalent:** _none_  

```python
import typing as t
from algopy import arc4

Decimal: t.TypeAlias = arc4.UFixedNxM[t.Literal[64], t.Literal[10]]
```

### Bytes and strings

**Types:** `algopy.arc4.DynamicBytes` and `algopy.arc4.String`  
**Encoding:** A variable length byte array prefixed with a 16-bit big endian header indicating the length of the data  
**Native equivalent:** `algopy.Bytes` and `algopy.String`  

Strings are assumed to be utf-8 encoded and the length of a string is the total number of bytes, _not the total number of characters_. 

### Static arrays

**Type:** `algopy.arc4.StaticArray`  
**Encoding:** See [ARC4 Container Packing](#ARC4-Container-Packing)  
**Native equivalent:** _none_  

An ARC4 StaticArray is an array of a fixed size. The item type is specified by the first generic parameter and the size is specified by the second. 

```python
import typing as t
from algopy import arc4

FourBytes: t.TypeAlias = arc4.StaticArray[arc4.Byte, t.Literal[4]]
```


### Address
**Type:** `algopy.arc4.Address`  
**Encoding:** A byte array 32 bytes long
**Native equivalent:** [`algopy.Account`](#algopy.Account)  

Address represents an Algorand address's public key, and can be used instead of `algopy.Account` when needing to
reference an address in an ARC4 struct, tuple or return type. It is a subclass of `arc4.StaticArray[arc4.Byte, typing.Literal[32]]`

### Dynamic arrays

**Type:** `algopy.arc4.DynamicArray`  
**Encoding:** See [ARC4 Container Packing](#ARC4-Container-Packing)  
**Native equivalent:** _none_  

An ARC4 DynamicArray is an array of a variable size. The item type is specified by the first generic parameter. Items can be added and removed via `.pop`, `.append`, and `.extend`. 

The current length of the array is encoded in a 16-bit prefix similar to the `arc4.DynamicBytes` and `arc4.String` types

```python
import typing as t
from algopy import arc4

UInt64Array: t.TypeAlias = arc4.DynamicArray[arc4.UInt64]
```

### Tuples

**Type:** `algopy.arc4.Tuple`  
**Encoding:** See [ARC4 Container Packing](#ARC4-Container-Packing)  
**Native equivalent:** `builtins.tuple`  

ARC4 Tuples are immutable statically sized arrays of mixed item types. Item types can be specified via generic parameters or inferred from constructor parameters.

### Structs

**Type:** `algopy.arc4.Struct`  
**Encoding:** See [ARC4 Container Packing](#ARC4-Container-Packing)  
**Native equivalent:** `typing.NamedTuple`

ARC4 Structs are named tuples. The class keyword `frozen` can be used to indicate if a struct can be mutated. 
Items can be accessed and mutated via names instead of indexes. Structs do not have a `.native` property,
but a NamedTuple can be used in ABI methods are will be encoded/decode to an ARC4 struct automatically.

```python
import typing

from algopy import arc4

Decimal: typing.TypeAlias = arc4.UFixedNxM[typing.Literal[64], typing.Literal[9]]

class Vector(arc4.Struct, kw_only=True, frozen=True):
    x: Decimal
    y: Decimal
```

### ARC4 Container Packing

ARC4 encoding rules are detailed explicitly in the [ARC](https://github.com/algorandfoundation/ARCs/blob/main/ARCs/arc-0004.md#encoding-rules). A summary is included here.

Containers are composed of a head and tail portion. 
 - For dynamic arrays, the head is prefixed with the length of the array encoded as a 16-bit number. This prefix is not included in offset calculation
 - For fixed sized items (eg. Bool, UIntN, or a StaticArray of UIntN), the item is included in the head
 - Consecutive Bool items are compressed into the minimum number of whole bytes possible by using a single bit to represent each Bool
 - For variable sized items (eg. DynamicArray, String etc), a pointer is included to the head and the data is added to the tail. This pointer represents the offset from the start of the head to the start of the item data in the tail.


### Reference types

**Types:** `algopy.Account`, `algopy.Application`, `algopy.Asset`, `algopy.gtxn.PaymentTransaction`, `algopy.gtxn.KeyRegistrationTransaction`, `algopy.gtxn.AssetConfigTransaction`, `algopy.gtxn.AssetTransferTransaction`, `algopy.gtxn.AssetFreezeTransaction`, `algopy.gtxn.ApplicationCallTransaction` 

The ARC4 specification allows for using a number of [reference types](https://github.com/algorandfoundation/ARCs/blob/main/ARCs/arc-0004.md#reference-types) in an ABI method signature where this reference type refers to...
 - another transaction in the group
 - an account in the accounts array (`apat` property of the transaction)
 - an asset in the foreign assets array (`apas` property of the transaction)
 - an application in the foreign apps array (`apfa` property of the transaction)

These types can only be used as parameters, and not as return types.

```python
from algopy import (
    Account,
    Application,
    ARC4Contract,
    Asset,
    arc4,
    gtxn,
)

class Reference(ARC4Contract):
    @arc4.abimethod
    def with_transactions(
        self,
        asset: Asset,
        pay: gtxn.PaymentTransaction,
        account: Account,
        app: Application,
        axfr: gtxn.AssetTransferTransaction        
    ) -> None:
        ...

```
### Mutability

To ensure semantic compatability the compiler will also check for any usages of mutable ARC4 types (arrays and structs) and ensure that any additional references are copied using the `.copy()` method.

Python values are passed by reference, and when an object (eg. an array or struct) is mutated in one place, all references to that object see the mutated version. In Python this is managed via the heap. 
In Algorand Python these mutable values are instead stored on the stack, so when an additional reference is made (i.e. by assigning to another variable) a copy is added to the stack.
Which means if one reference is mutated, the other references would not see the change.
In order to keep the semantics the same, the compiler forces the addition of `.copy()` each time a new reference to the same object to match what will happen on the AVM.

Struct types can be indicated as `frozen` which will eliminate the need for a `.copy()` as long as the struct also contains no mutable fields (such as arrays or another mutable struct)

```
Page 25/74FirstPrevNextLast