#
tokens: 49847/50000 11/942 files (page 28/93)
lines: on (toggle) GitHub
raw markdown copy reset
This is page 28 of 93. Use http://codebase.md/goplausible/algorand-mcp?lines=true&page={x} to view the full context.

# Directory Structure

```
├── .gitignore
├── CONTRIBUTING.md
├── LICENSE
├── llms-install.md
├── llms.txt
├── package.json
├── packages
│   ├── client
│   │   ├── .env.example
│   │   ├── package.json
│   │   ├── README.md
│   │   ├── src
│   │   │   ├── env.ts
│   │   │   ├── index.ts
│   │   │   └── LocalWallet.ts
│   │   └── tsconfig.json
│   └── server
│       ├── .env.example
│       ├── API specs
│       │   ├── algod_api.json
│       │   ├── indexer_api.json
│       │   ├── mcp.json
│       │   ├── nfd_api.json
│       │   ├── ultrade_api.json
│       │   ├── vestige_api.json
│       │   └── vestige_free_api.json
│       ├── Dockerfile
│       ├── jest.config.js
│       ├── package.json
│       ├── README.md
│       ├── smithery.yaml
│       ├── src
│       │   ├── algorand-client.ts
│       │   ├── env.ts
│       │   ├── index.ts
│       │   ├── resources
│       │   │   ├── index.ts
│       │   │   ├── knowledge
│       │   │   │   ├── ARCs.txt
│       │   │   │   ├── developers-algokit-architecture-decisions.txt
│       │   │   │   ├── developers-algokit-cli.txt
│       │   │   │   ├── developers-algokit-utils-python.txt
│       │   │   │   ├── developers-algokit-utils-typescript.txt
│       │   │   │   ├── developers-clis.txt
│       │   │   │   ├── developers-details.txt
│       │   │   │   ├── developers-liquid-auth.txt
│       │   │   │   ├── developers-nodes.txt
│       │   │   │   ├── developers-puya.txt
│       │   │   │   ├── developers-python.txt
│       │   │   │   ├── developers-sdks-js.txt
│       │   │   │   ├── developers-sdks-python.txt
│       │   │   │   ├── developers-tealscript.txt
│       │   │   │   ├── developers.txt
│       │   │   │   ├── index.ts
│       │   │   │   ├── taxonomy
│       │   │   │   │   ├── algokit-cli:README.md
│       │   │   │   │   ├── algokit:cli:algokit.md
│       │   │   │   │   ├── algokit:cli:architecture-decisions:2022-11-14_sandbox-approach.md
│       │   │   │   │   ├── algokit:cli:architecture-decisions:2022-11-22_beaker-testing-strategy.md
│       │   │   │   │   ├── algokit:cli:architecture-decisions:2023-01-11_beaker_productionisation_review.md
│       │   │   │   │   ├── algokit:cli:architecture-decisions:2023-01-11_brew_install.md
│       │   │   │   │   ├── algokit:cli:architecture-decisions:2023-01-12_smart-contract-deployment.md
│       │   │   │   │   ├── algokit:cli:architecture-decisions:2023-06-06_frontend-templates.md
│       │   │   │   │   ├── algokit:cli:architecture-decisions:2023-07-19_advanced_generate_command.md
│       │   │   │   │   ├── algokit:cli:architecture-decisions:2024-01-13_native_binaries.md
│       │   │   │   │   ├── algokit:cli:architecture-decisions:2024-01-23_init-wizard-v2.md
│       │   │   │   │   ├── algokit:cli:architecture-decisions:2024-01-31_binary_distribution.md
│       │   │   │   │   ├── algokit:cli:architecture-decisions:2024-03-06_local_dev_ui_packaging.md
│       │   │   │   │   ├── algokit:cli:articles:output_stability.md
│       │   │   │   │   ├── algokit:cli:cli:index.md
│       │   │   │   │   ├── algokit:cli:features:compile.md
│       │   │   │   │   ├── algokit:cli:features:completions.md
│       │   │   │   │   ├── algokit:cli:features:config.md
│       │   │   │   │   ├── algokit:cli:features:dispenser.md
│       │   │   │   │   ├── algokit:cli:features:doctor.md
│       │   │   │   │   ├── algokit:cli:features:explore.md
│       │   │   │   │   ├── algokit:cli:features:generate.md
│       │   │   │   │   ├── algokit:cli:features:goal.md
│       │   │   │   │   ├── algokit:cli:features:init.md
│       │   │   │   │   ├── algokit:cli:features:localnet.md
│       │   │   │   │   ├── algokit:cli:features:project:bootstrap.md
│       │   │   │   │   ├── algokit:cli:features:project:deploy.md
│       │   │   │   │   ├── algokit:cli:features:project:link.md
│       │   │   │   │   ├── algokit:cli:features:project:list.md
│       │   │   │   │   ├── algokit:cli:features:project:run.md
│       │   │   │   │   ├── algokit:cli:features:project.md
│       │   │   │   │   ├── algokit:cli:features:tasks:analyze.md
│       │   │   │   │   ├── algokit:cli:features:tasks:ipfs.md
│       │   │   │   │   ├── algokit:cli:features:tasks:mint.md
│       │   │   │   │   ├── algokit:cli:features:tasks:nfd.md
│       │   │   │   │   ├── algokit:cli:features:tasks:opt.md
│       │   │   │   │   ├── algokit:cli:features:tasks:send.md
│       │   │   │   │   ├── algokit:cli:features:tasks:sign.md
│       │   │   │   │   ├── algokit:cli:features:tasks:transfer.md
│       │   │   │   │   ├── algokit:cli:features:tasks:vanity_address.md
│       │   │   │   │   ├── algokit:cli:features:tasks:wallet.md
│       │   │   │   │   ├── algokit:cli:features:tasks.md
│       │   │   │   │   ├── algokit:cli:tutorials:algokit-template.md
│       │   │   │   │   ├── algokit:cli:tutorials:intro.md
│       │   │   │   │   ├── algokit:cli:tutorials:smart-contracts.md
│       │   │   │   │   ├── algokit:docs:testnet_api.md
│       │   │   │   │   ├── algokit:lora:README.md
│       │   │   │   │   ├── algokit:README.md
│       │   │   │   │   ├── algokit:utils:python:markdown:apidocs:algokit_utils:algokit_utils.md
│       │   │   │   │   ├── algokit:utils:python:markdown:capabilities:account.md
│       │   │   │   │   ├── algokit:utils:python:markdown:capabilities:app-client.md
│       │   │   │   │   ├── algokit:utils:python:markdown:capabilities:app-deploy.md
│       │   │   │   │   ├── algokit:utils:python:markdown:capabilities:client.md
│       │   │   │   │   ├── algokit:utils:python:markdown:capabilities:debugger.md
│       │   │   │   │   ├── algokit:utils:python:markdown:capabilities:dispenser-client.md
│       │   │   │   │   ├── algokit:utils:python:markdown:capabilities:transfer.md
│       │   │   │   │   ├── algokit:utils:python:markdown:index.md
│       │   │   │   │   ├── algokit:utils:python:README.md
│       │   │   │   │   ├── algokit:utils:python:source:capabilities:account.md
│       │   │   │   │   ├── algokit:utils:python:source:capabilities:app-client.md
│       │   │   │   │   ├── algokit:utils:python:source:capabilities:app-deploy.md
│       │   │   │   │   ├── algokit:utils:python:source:capabilities:client.md
│       │   │   │   │   ├── algokit:utils:python:source:capabilities:debugger.md
│       │   │   │   │   ├── algokit:utils:python:source:capabilities:dispenser-client.md
│       │   │   │   │   ├── algokit:utils:python:source:capabilities:transfer.md
│       │   │   │   │   ├── algokit:utils:python:source:index.md
│       │   │   │   │   ├── algokit:utils:typescript:capabilities:account.md
│       │   │   │   │   ├── algokit:utils:typescript:capabilities:algorand-client.md
│       │   │   │   │   ├── algokit:utils:typescript:capabilities:amount.md
│       │   │   │   │   ├── algokit:utils:typescript:capabilities:app-client.md
│       │   │   │   │   ├── algokit:utils:typescript:capabilities:app-deploy.md
│       │   │   │   │   ├── algokit:utils:typescript:capabilities:app.md
│       │   │   │   │   ├── algokit:utils:typescript:capabilities:asset.md
│       │   │   │   │   ├── algokit:utils:typescript:capabilities:client.md
│       │   │   │   │   ├── algokit:utils:typescript:capabilities:debugging.md
│       │   │   │   │   ├── algokit:utils:typescript:capabilities:dispenser-client.md
│       │   │   │   │   ├── algokit:utils:typescript:capabilities:event-emitter.md
│       │   │   │   │   ├── algokit:utils:typescript:capabilities:indexer.md
│       │   │   │   │   ├── algokit:utils:typescript:capabilities:testing.md
│       │   │   │   │   ├── algokit:utils:typescript:capabilities:transaction-composer.md
│       │   │   │   │   ├── algokit:utils:typescript:capabilities:transaction.md
│       │   │   │   │   ├── algokit:utils:typescript:capabilities:transfer.md
│       │   │   │   │   ├── algokit:utils:typescript:capabilities:typed-app-clients.md
│       │   │   │   │   ├── algokit:utils:typescript:code:classes:testing.TestLogger.md
│       │   │   │   │   ├── algokit:utils:typescript:code:classes:testing.TransactionLogger.md
│       │   │   │   │   ├── algokit:utils:typescript:code:classes:types_account_manager.AccountManager.md
│       │   │   │   │   ├── algokit:utils:typescript:code:classes:types_account.MultisigAccount.md
│       │   │   │   │   ├── algokit:utils:typescript:code:classes:types_account.SigningAccount.md
│       │   │   │   │   ├── algokit:utils:typescript:code:classes:types_algo_http_client_with_retry.AlgoHttpClientWithRetry.md
│       │   │   │   │   ├── algokit:utils:typescript:code:classes:types_algorand_client_transaction_creator.AlgorandClientTransactionCreator.md
│       │   │   │   │   ├── algokit:utils:typescript:code:classes:types_algorand_client_transaction_sender.AlgorandClientTransactionSender.md
│       │   │   │   │   ├── algokit:utils:typescript:code:classes:types_algorand_client.AlgorandClient.md
│       │   │   │   │   ├── algokit:utils:typescript:code:classes:types_amount.AlgoAmount.md
│       │   │   │   │   ├── algokit:utils:typescript:code:classes:types_app_arc56.Arc56Method.md
│       │   │   │   │   ├── algokit:utils:typescript:code:classes:types_app_client.AppClient.md
│       │   │   │   │   ├── algokit:utils:typescript:code:classes:types_app_client.ApplicationClient.md
│       │   │   │   │   ├── algokit:utils:typescript:code:classes:types_app_deployer.AppDeployer.md
│       │   │   │   │   ├── algokit:utils:typescript:code:classes:types_app_factory.AppFactory.md
│       │   │   │   │   ├── algokit:utils:typescript:code:classes:types_app_manager.AppManager.md
│       │   │   │   │   ├── algokit:utils:typescript:code:classes:types_asset_manager.AssetManager.md
│       │   │   │   │   ├── algokit:utils:typescript:code:classes:types_async_event_emitter.AsyncEventEmitter.md
│       │   │   │   │   ├── algokit:utils:typescript:code:classes:types_client_manager.ClientManager.md
│       │   │   │   │   ├── algokit:utils:typescript:code:classes:types_composer.TransactionComposer.md
│       │   │   │   │   ├── algokit:utils:typescript:code:classes:types_config.UpdatableConfig.md
│       │   │   │   │   ├── algokit:utils:typescript:code:classes:types_dispenser_client.TestNetDispenserApiClient.md
│       │   │   │   │   ├── algokit:utils:typescript:code:classes:types_kmd_account_manager.KmdAccountManager.md
│       │   │   │   │   ├── algokit:utils:typescript:code:classes:types_logic_error.LogicError.md
│       │   │   │   │   ├── algokit:utils:typescript:code:enums:types_app.OnSchemaBreak.md
│       │   │   │   │   ├── algokit:utils:typescript:code:enums:types_app.OnUpdate.md
│       │   │   │   │   ├── algokit:utils:typescript:code:enums:types_indexer.AccountStatus.md
│       │   │   │   │   ├── algokit:utils:typescript:code:enums:types_indexer.ApplicationOnComplete.md
│       │   │   │   │   ├── algokit:utils:typescript:code:enums:types_indexer.SignatureType.md
│       │   │   │   │   ├── algokit:utils:typescript:code:enums:types_lifecycle_events.EventType.md
│       │   │   │   │   ├── algokit:utils:typescript:code:interfaces:types_account_manager.EnsureFundedResult.md
│       │   │   │   │   ├── algokit:utils:typescript:code:interfaces:types_account.AccountConfig.md
│       │   │   │   │   ├── algokit:utils:typescript:code:interfaces:types_account.TransactionSignerAccount.md
│       │   │   │   │   ├── algokit:utils:typescript:code:interfaces:types_algorand_client_interface.AlgorandClientInterface.md
│       │   │   │   │   ├── algokit:utils:typescript:code:interfaces:types_app_arc56.Arc56Contract.md
│       │   │   │   │   ├── algokit:utils:typescript:code:interfaces:types_app_arc56.Event.md
│       │   │   │   │   ├── algokit:utils:typescript:code:interfaces:types_app_arc56.Method.md
│       │   │   │   │   ├── algokit:utils:typescript:code:interfaces:types_app_arc56.ProgramSourceInfo.md
│       │   │   │   │   ├── algokit:utils:typescript:code:interfaces:types_app_arc56.StorageKey.md
│       │   │   │   │   ├── algokit:utils:typescript:code:interfaces:types_app_arc56.StorageMap.md
│       │   │   │   │   ├── algokit:utils:typescript:code:interfaces:types_app_arc56.StructField.md
│       │   │   │   │   ├── algokit:utils:typescript:code:interfaces:types_app_client.AppClientCallABIArgs.md
│       │   │   │   │   ├── algokit:utils:typescript:code:interfaces:types_app_client.AppClientCallCoreParams.md
│       │   │   │   │   ├── algokit:utils:typescript:code:interfaces:types_app_client.AppClientCompilationParams.md
│       │   │   │   │   ├── algokit:utils:typescript:code:interfaces:types_app_client.AppClientCompilationResult.md
│       │   │   │   │   ├── algokit:utils:typescript:code:interfaces:types_app_client.AppClientDeployCallInterfaceParams.md
│       │   │   │   │   ├── algokit:utils:typescript:code:interfaces:types_app_client.AppClientDeployCoreParams.md
│       │   │   │   │   ├── algokit:utils:typescript:code:interfaces:types_app_client.AppClientDeployParams.md
│       │   │   │   │   ├── algokit:utils:typescript:code:interfaces:types_app_client.AppClientParams.md
│       │   │   │   │   ├── algokit:utils:typescript:code:interfaces:types_app_client.AppSourceMaps.md
│       │   │   │   │   ├── algokit:utils:typescript:code:interfaces:types_app_client.FundAppAccountParams.md
│       │   │   │   │   ├── algokit:utils:typescript:code:interfaces:types_app_client.ResolveAppById.md
│       │   │   │   │   ├── algokit:utils:typescript:code:interfaces:types_app_client.ResolveAppByIdBase.md
│       │   │   │   │   ├── algokit:utils:typescript:code:interfaces:types_app_client.SourceMapExport.md
│       │   │   │   │   ├── algokit:utils:typescript:code:interfaces:types_app_deployer.AppLookup.md
│       │   │   │   │   ├── algokit:utils:typescript:code:interfaces:types_app_deployer.AppMetadata.md
│       │   │   │   │   ├── algokit:utils:typescript:code:interfaces:types_app_factory.AppFactoryParams.md
│       │   │   │   │   ├── algokit:utils:typescript:code:interfaces:types_app_manager.AppInformation.md
│       │   │   │   │   ├── algokit:utils:typescript:code:interfaces:types_app_manager.BoxReference.md
│       │   │   │   │   ├── algokit:utils:typescript:code:interfaces:types_app_manager.BoxValueRequestParams.md
│       │   │   │   │   ├── algokit:utils:typescript:code:interfaces:types_app_manager.BoxValuesRequestParams.md
│       │   │   │   │   ├── algokit:utils:typescript:code:interfaces:types_app_spec.AppSources.md
│       │   │   │   │   ├── algokit:utils:typescript:code:interfaces:types_app_spec.AppSpec.md
│       │   │   │   │   ├── algokit:utils:typescript:code:interfaces:types_app_spec.CallConfig.md
│       │   │   │   │   ├── algokit:utils:typescript:code:interfaces:types_app_spec.DeclaredSchemaValueSpec.md
│       │   │   │   │   ├── algokit:utils:typescript:code:interfaces:types_app_spec.Hint.md
│       │   │   │   │   ├── algokit:utils:typescript:code:interfaces:types_app_spec.ReservedSchemaValueSpec.md
│       │   │   │   │   ├── algokit:utils:typescript:code:interfaces:types_app_spec.Schema.md
│       │   │   │   │   ├── algokit:utils:typescript:code:interfaces:types_app_spec.SchemaSpec.md
│       │   │   │   │   ├── algokit:utils:typescript:code:interfaces:types_app_spec.StateSchemaSpec.md
│       │   │   │   │   ├── algokit:utils:typescript:code:interfaces:types_app_spec.Struct.md
│       │   │   │   │   ├── algokit:utils:typescript:code:interfaces:types_app.AppCallParams.md
│       │   │   │   │   ├── algokit:utils:typescript:code:interfaces:types_app.AppCallTransactionResultOfType.md
│       │   │   │   │   ├── algokit:utils:typescript:code:interfaces:types_app.AppCompilationResult.md
│       │   │   │   │   ├── algokit:utils:typescript:code:interfaces:types_app.AppDeploymentParams.md
│       │   │   │   │   ├── algokit:utils:typescript:code:interfaces:types_app.AppDeployMetadata.md
│       │   │   │   │   ├── algokit:utils:typescript:code:interfaces:types_app.AppLookup.md
│       │   │   │   │   ├── algokit:utils:typescript:code:interfaces:types_app.AppMetadata.md
│       │   │   │   │   ├── algokit:utils:typescript:code:interfaces:types_app.AppReference.md
│       │   │   │   │   ├── algokit:utils:typescript:code:interfaces:types_app.AppState.md
│       │   │   │   │   ├── algokit:utils:typescript:code:interfaces:types_app.AppStorageSchema.md
│       │   │   │   │   ├── algokit:utils:typescript:code:interfaces:types_app.BoxName.md
│       │   │   │   │   ├── algokit:utils:typescript:code:interfaces:types_app.BoxReference.md
│       │   │   │   │   ├── algokit:utils:typescript:code:interfaces:types_app.BoxValueRequestParams.md
│       │   │   │   │   ├── algokit:utils:typescript:code:interfaces:types_app.BoxValuesRequestParams.md
│       │   │   │   │   ├── algokit:utils:typescript:code:interfaces:types_app.CompiledTeal.md
│       │   │   │   │   ├── algokit:utils:typescript:code:interfaces:types_app.CoreAppCallArgs.md
│       │   │   │   │   ├── algokit:utils:typescript:code:interfaces:types_app.CreateAppParams.md
│       │   │   │   │   ├── algokit:utils:typescript:code:interfaces:types_app.RawAppCallArgs.md
│       │   │   │   │   ├── algokit:utils:typescript:code:interfaces:types_app.TealTemplateParams.md
│       │   │   │   │   ├── algokit:utils:typescript:code:interfaces:types_app.UpdateAppParams.md
│       │   │   │   │   ├── algokit:utils:typescript:code:interfaces:types_asset_manager.AssetInformation.md
│       │   │   │   │   ├── algokit:utils:typescript:code:interfaces:types_asset_manager.BulkAssetOptInOutResult.md
│       │   │   │   │   ├── algokit:utils:typescript:code:interfaces:types_asset.AssetBulkOptInOutParams.md
│       │   │   │   │   ├── algokit:utils:typescript:code:interfaces:types_asset.AssetOptInParams.md
│       │   │   │   │   ├── algokit:utils:typescript:code:interfaces:types_asset.AssetOptOutParams.md
│       │   │   │   │   ├── algokit:utils:typescript:code:interfaces:types_asset.CreateAssetParams.md
│       │   │   │   │   ├── algokit:utils:typescript:code:interfaces:types_client_manager.AlgoSdkClients.md
│       │   │   │   │   ├── algokit:utils:typescript:code:interfaces:types_client_manager.TypedAppClient.md
│       │   │   │   │   ├── algokit:utils:typescript:code:interfaces:types_client_manager.TypedAppFactory.md
│       │   │   │   │   ├── algokit:utils:typescript:code:interfaces:types_composer.BuiltTransactions.md
│       │   │   │   │   ├── algokit:utils:typescript:code:interfaces:types_config.Config.md
│       │   │   │   │   ├── algokit:utils:typescript:code:interfaces:types_debugging.AVMTracesEventData.md
│       │   │   │   │   ├── algokit:utils:typescript:code:interfaces:types_debugging.TealSourceDebugEventData.md
│       │   │   │   │   ├── algokit:utils:typescript:code:interfaces:types_debugging.TealSourcesDebugEventData.md
│       │   │   │   │   ├── algokit:utils:typescript:code:interfaces:types_dispenser_client.DispenserFundResponse.md
│       │   │   │   │   ├── algokit:utils:typescript:code:interfaces:types_dispenser_client.DispenserLimitResponse.md
│       │   │   │   │   ├── algokit:utils:typescript:code:interfaces:types_dispenser_client.TestNetDispenserApiClientParams.md
│       │   │   │   │   ├── algokit:utils:typescript:code:interfaces:types_indexer.LookupAssetHoldingsOptions.md
│       │   │   │   │   ├── algokit:utils:typescript:code:interfaces:types_logic_error.LogicErrorDetails.md
│       │   │   │   │   ├── algokit:utils:typescript:code:interfaces:types_network_client.AlgoClientConfig.md
│       │   │   │   │   ├── algokit:utils:typescript:code:interfaces:types_network_client.AlgoConfig.md
│       │   │   │   │   ├── algokit:utils:typescript:code:interfaces:types_network_client.NetworkDetails.md
│       │   │   │   │   ├── algokit:utils:typescript:code:interfaces:types_testing.AlgoKitLogCaptureFixture.md
│       │   │   │   │   ├── algokit:utils:typescript:code:interfaces:types_testing.AlgorandFixture.md
│       │   │   │   │   ├── algokit:utils:typescript:code:interfaces:types_testing.AlgorandFixtureConfig.md
│       │   │   │   │   ├── algokit:utils:typescript:code:interfaces:types_testing.AlgorandTestAutomationContext.md
│       │   │   │   │   ├── algokit:utils:typescript:code:interfaces:types_testing.GetTestAccountParams.md
│       │   │   │   │   ├── algokit:utils:typescript:code:interfaces:types_testing.LogSnapshotConfig.md
│       │   │   │   │   ├── algokit:utils:typescript:code:interfaces:types_transaction.AtomicTransactionComposerToSend.md
│       │   │   │   │   ├── algokit:utils:typescript:code:interfaces:types_transaction.ConfirmedTransactionResult.md
│       │   │   │   │   ├── algokit:utils:typescript:code:interfaces:types_transaction.ConfirmedTransactionResults.md
│       │   │   │   │   ├── algokit:utils:typescript:code:interfaces:types_transaction.SendAtomicTransactionComposerResults.md
│       │   │   │   │   ├── algokit:utils:typescript:code:interfaces:types_transaction.SendParams.md
│       │   │   │   │   ├── algokit:utils:typescript:code:interfaces:types_transaction.SendTransactionParams.md
│       │   │   │   │   ├── algokit:utils:typescript:code:interfaces:types_transaction.SendTransactionResult.md
│       │   │   │   │   ├── algokit:utils:typescript:code:interfaces:types_transaction.SendTransactionResults.md
│       │   │   │   │   ├── algokit:utils:typescript:code:interfaces:types_transaction.TransactionGroupToSend.md
│       │   │   │   │   ├── algokit:utils:typescript:code:interfaces:types_transaction.TransactionToSign.md
│       │   │   │   │   ├── algokit:utils:typescript:code:interfaces:types_transfer.AlgoRekeyParams.md
│       │   │   │   │   ├── algokit:utils:typescript:code:interfaces:types_transfer.AlgoTransferParams.md
│       │   │   │   │   ├── algokit:utils:typescript:code:interfaces:types_transfer.EnsureFundedParams.md
│       │   │   │   │   ├── algokit:utils:typescript:code:interfaces:types_transfer.EnsureFundedReturnType.md
│       │   │   │   │   ├── algokit:utils:typescript:code:interfaces:types_transfer.TransferAssetParams.md
│       │   │   │   │   ├── algokit:utils:typescript:code:modules:index.indexer.md
│       │   │   │   │   ├── algokit:utils:typescript:code:modules:index.md
│       │   │   │   │   ├── algokit:utils:typescript:code:modules:testing.md
│       │   │   │   │   ├── algokit:utils:typescript:code:modules:types_account_manager_spec.md
│       │   │   │   │   ├── algokit:utils:typescript:code:modules:types_account_manager.md
│       │   │   │   │   ├── algokit:utils:typescript:code:modules:types_account.md
│       │   │   │   │   ├── algokit:utils:typescript:code:modules:types_algo_http_client_with_retry.md
│       │   │   │   │   ├── algokit:utils:typescript:code:modules:types_algorand_client_asset_spec.md
│       │   │   │   │   ├── algokit:utils:typescript:code:modules:types_algorand_client_interface.md
│       │   │   │   │   ├── algokit:utils:typescript:code:modules:types_algorand_client_spec.md
│       │   │   │   │   ├── algokit:utils:typescript:code:modules:types_algorand_client_transaction_creator.md
│       │   │   │   │   ├── algokit:utils:typescript:code:modules:types_algorand_client_transaction_sender.md
│       │   │   │   │   ├── algokit:utils:typescript:code:modules:types_algorand_client_transfer_spec.md
│       │   │   │   │   ├── algokit:utils:typescript:code:modules:types_algorand_client.md
│       │   │   │   │   ├── algokit:utils:typescript:code:modules:types_amount_spec.md
│       │   │   │   │   ├── algokit:utils:typescript:code:modules:types_amount.md
│       │   │   │   │   ├── algokit:utils:typescript:code:modules:types_app_arc56.md
│       │   │   │   │   ├── algokit:utils:typescript:code:modules:types_app_client_spec.md
│       │   │   │   │   ├── algokit:utils:typescript:code:modules:types_app_client.md
│       │   │   │   │   ├── algokit:utils:typescript:code:modules:types_app_deployer.md
│       │   │   │   │   ├── algokit:utils:typescript:code:modules:types_app_factory_and_client_spec.md
│       │   │   │   │   ├── algokit:utils:typescript:code:modules:types_app_factory.md
│       │   │   │   │   ├── algokit:utils:typescript:code:modules:types_app_manager.md
│       │   │   │   │   ├── algokit:utils:typescript:code:modules:types_app_spec.md
│       │   │   │   │   ├── algokit:utils:typescript:code:modules:types_app.md
│       │   │   │   │   ├── algokit:utils:typescript:code:modules:types_asset_manager.md
│       │   │   │   │   ├── algokit:utils:typescript:code:modules:types_asset.md
│       │   │   │   │   ├── algokit:utils:typescript:code:modules:types_async_event_emitter_spec.md
│       │   │   │   │   ├── algokit:utils:typescript:code:modules:types_async_event_emitter.md
│       │   │   │   │   ├── algokit:utils:typescript:code:modules:types_client_manager_spec.md
│       │   │   │   │   ├── algokit:utils:typescript:code:modules:types_client_manager.md
│       │   │   │   │   ├── algokit:utils:typescript:code:modules:types_composer.md
│       │   │   │   │   ├── algokit:utils:typescript:code:modules:types_config.md
│       │   │   │   │   ├── algokit:utils:typescript:code:modules:types_debugging.md
│       │   │   │   │   ├── algokit:utils:typescript:code:modules:types_dispenser_client_spec.md
│       │   │   │   │   ├── algokit:utils:typescript:code:modules:types_dispenser_client.md
│       │   │   │   │   ├── algokit:utils:typescript:code:modules:types_expand.md
│       │   │   │   │   ├── algokit:utils:typescript:code:modules:types_indexer.md
│       │   │   │   │   ├── algokit:utils:typescript:code:modules:types_kmd_account_manager.md
│       │   │   │   │   ├── algokit:utils:typescript:code:modules:types_lifecycle_events.md
│       │   │   │   │   ├── algokit:utils:typescript:code:modules:types_logging.md
│       │   │   │   │   ├── algokit:utils:typescript:code:modules:types_logic_error.md
│       │   │   │   │   ├── algokit:utils:typescript:code:modules:types_network_client.md
│       │   │   │   │   ├── algokit:utils:typescript:code:modules:types_testing.md
│       │   │   │   │   ├── algokit:utils:typescript:code:modules:types_transaction.md
│       │   │   │   │   ├── algokit:utils:typescript:code:modules:types_transfer.md
│       │   │   │   │   ├── algokit:utils:typescript:code:README.md
│       │   │   │   │   ├── algokit:utils:typescript:README.md
│       │   │   │   │   ├── algokit:utils:typescript:v7-migration.md
│       │   │   │   │   ├── algokit:utils:typescript:v8-migration.md
│       │   │   │   │   ├── ARCs:ARC-template.md
│       │   │   │   │   ├── ARCs:assets:arc-0012:README.md
│       │   │   │   │   ├── ARCs:assets:arc-0034:TemplateForm.md
│       │   │   │   │   ├── ARCs:assets:arc-0062:README.md
│       │   │   │   │   ├── ARCs:pages:nfts.md
│       │   │   │   │   ├── ARCs:pages:wallets.md
│       │   │   │   │   ├── ARCs:README.md
│       │   │   │   │   ├── ARCs:specs:arc-0000.md
│       │   │   │   │   ├── ARCs:specs:arc-0001.md
│       │   │   │   │   ├── ARCs:specs:arc-0002.md
│       │   │   │   │   ├── ARCs:specs:arc-0003.md
│       │   │   │   │   ├── ARCs:specs:arc-0004.md
│       │   │   │   │   ├── ARCs:specs:arc-0005.md
│       │   │   │   │   ├── ARCs:specs:arc-0006.md
│       │   │   │   │   ├── ARCs:specs:arc-0007.md
│       │   │   │   │   ├── ARCs:specs:arc-0008.md
│       │   │   │   │   ├── ARCs:specs:arc-0009.md
│       │   │   │   │   ├── ARCs:specs:arc-0010.md
│       │   │   │   │   ├── ARCs:specs:arc-0011.md
│       │   │   │   │   ├── ARCs:specs:arc-0012.md
│       │   │   │   │   ├── ARCs:specs:arc-0015.md
│       │   │   │   │   ├── ARCs:specs:arc-0016.md
│       │   │   │   │   ├── ARCs:specs:arc-0018.md
│       │   │   │   │   ├── ARCs:specs:arc-0019.md
│       │   │   │   │   ├── ARCs:specs:arc-0020.md
│       │   │   │   │   ├── ARCs:specs:arc-0021.md
│       │   │   │   │   ├── ARCs:specs:arc-0022.md
│       │   │   │   │   ├── ARCs:specs:arc-0023.md
│       │   │   │   │   ├── ARCs:specs:arc-0025.md
│       │   │   │   │   ├── ARCs:specs:arc-0026.md
│       │   │   │   │   ├── ARCs:specs:arc-0028.md
│       │   │   │   │   ├── ARCs:specs:arc-0032.md
│       │   │   │   │   ├── ARCs:specs:arc-0033.md
│       │   │   │   │   ├── ARCs:specs:arc-0034.md
│       │   │   │   │   ├── ARCs:specs:arc-0035.md
│       │   │   │   │   ├── ARCs:specs:arc-0036.md
│       │   │   │   │   ├── ARCs:specs:arc-0042.md
│       │   │   │   │   ├── ARCs:specs:arc-0047.md
│       │   │   │   │   ├── ARCs:specs:arc-0048.md
│       │   │   │   │   ├── ARCs:specs:arc-0049.md
│       │   │   │   │   ├── ARCs:specs:arc-0054.md
│       │   │   │   │   ├── ARCs:specs:arc-0055.md
│       │   │   │   │   ├── ARCs:specs:arc-0056.md
│       │   │   │   │   ├── ARCs:specs:arc-0059.md
│       │   │   │   │   ├── ARCs:specs:arc-0062.md
│       │   │   │   │   ├── ARCs:specs:arc-0065.md
│       │   │   │   │   ├── ARCs:specs:arc-0069.md
│       │   │   │   │   ├── ARCs:specs:arc-0072.md
│       │   │   │   │   ├── ARCs:specs:arc-0073.md
│       │   │   │   │   ├── ARCs:specs:arc-0074.md
│       │   │   │   │   ├── ARCs:specs:arc-0076.md
│       │   │   │   │   ├── ARCs:specs:arc-0078.md
│       │   │   │   │   ├── ARCs:specs:arc-0079.md
│       │   │   │   │   ├── ARCs:specs:arc-0200.md
│       │   │   │   │   ├── clis_index.md
│       │   │   │   │   ├── developer:docs:about.md
│       │   │   │   │   ├── developer:docs:clis:algokey:algokey.md
│       │   │   │   │   ├── developer:docs:clis:algokey:generate.md
│       │   │   │   │   ├── developer:docs:clis:algokey:import.md
│       │   │   │   │   ├── developer:docs:clis:algokey:multisig:append-auth-addr.md
│       │   │   │   │   ├── developer:docs:clis:algokey:multisig:multisig.md
│       │   │   │   │   ├── developer:docs:clis:algokey:part:info.md
│       │   │   │   │   ├── developer:docs:clis:algokey:part:part.md
│       │   │   │   │   ├── developer:docs:clis:algokey:part:reparent.md
│       │   │   │   │   ├── developer:docs:clis:algokey:sign.md
│       │   │   │   │   ├── developer:docs:clis:conduit:conduit.md
│       │   │   │   │   ├── developer:docs:clis:conduit:init.md
│       │   │   │   │   ├── developer:docs:clis:conduit:list:exporters.md
│       │   │   │   │   ├── developer:docs:clis:conduit:list:importers.md
│       │   │   │   │   ├── developer:docs:clis:conduit:list:list.md
│       │   │   │   │   ├── developer:docs:clis:conduit:list:processors.md
│       │   │   │   │   ├── developer:docs:clis:diagcfg:diagcfg.md
│       │   │   │   │   ├── developer:docs:clis:diagcfg:metric:disable.md
│       │   │   │   │   ├── developer:docs:clis:diagcfg:metric:enable.md
│       │   │   │   │   ├── developer:docs:clis:diagcfg:metric:metric.md
│       │   │   │   │   ├── developer:docs:clis:diagcfg:metric:status.md
│       │   │   │   │   ├── developer:docs:clis:diagcfg:telemetry:disable.md
│       │   │   │   │   ├── developer:docs:clis:diagcfg:telemetry:enable.md
│       │   │   │   │   ├── developer:docs:clis:diagcfg:telemetry:endpoint.md
│       │   │   │   │   ├── developer:docs:clis:diagcfg:telemetry:name.md
│       │   │   │   │   ├── developer:docs:clis:diagcfg:telemetry:status.md
│       │   │   │   │   ├── developer:docs:clis:diagcfg:telemetry:telemetry.md
│       │   │   │   │   ├── developer:docs:clis:goal:node:restart.md
│       │   │   │   │   ├── developer:docs:clis:goal:node:start.md
│       │   │   │   │   ├── developer:docs:clis:goal:node:status.md
│       │   │   │   │   ├── developer:docs:clis:goal:node:stop.md
│       │   │   │   │   ├── developer:docs:clis:goal:node:wait.md
│       │   │   │   │   ├── developer:docs:clis:goal:protocols.md
│       │   │   │   │   ├── developer:docs:clis:goal:report.md
│       │   │   │   │   ├── developer:docs:clis:goal:version.md
│       │   │   │   │   ├── developer:docs:clis:goal:wallet:list.md
│       │   │   │   │   ├── developer:docs:clis:goal:wallet:new.md
│       │   │   │   │   ├── developer:docs:clis:goal:wallet:wallet.md
│       │   │   │   │   ├── developer:docs:clis:indexer:api-config.md
│       │   │   │   │   ├── developer:docs:clis:indexer:daemon.md
│       │   │   │   │   ├── developer:docs:clis:indexer:indexer.md
│       │   │   │   │   ├── developer:docs:clis:indexer:util:util.md
│       │   │   │   │   ├── developer:docs:clis:indexer:util:validator.md
│       │   │   │   │   ├── developer:docs:clis:kmd.md
│       │   │   │   │   ├── developer:docs:clis:tealdbg:debug.md
│       │   │   │   │   ├── developer:docs:clis:tealdbg:remote.md
│       │   │   │   │   ├── developer:docs:clis:tealdbg:tealdbg.md
│       │   │   │   │   ├── developer:docs:details:accounts:create.md
│       │   │   │   │   ├── developer:docs:details:accounts:index.md
│       │   │   │   │   ├── developer:docs:details:accounts:rekey.md
│       │   │   │   │   ├── developer:docs:details:algorand_consensus.md
│       │   │   │   │   ├── developer:docs:details:algorand-networks:betanet.md
│       │   │   │   │   ├── developer:docs:details:algorand-networks:index.md
│       │   │   │   │   ├── developer:docs:details:algorand-networks:mainnet.md
│       │   │   │   │   ├── developer:docs:details:algorand-networks:testnet.md
│       │   │   │   │   ├── developer:docs:details:asa.md
│       │   │   │   │   ├── developer:docs:details:atc.md
│       │   │   │   │   ├── developer:docs:details:atomic_transfers.md
│       │   │   │   │   ├── developer:docs:details:conduit.md
│       │   │   │   │   ├── developer:docs:details:crust.md
│       │   │   │   │   ├── developer:docs:details:dapps:avm:index.md
│       │   │   │   │   ├── developer:docs:details:dapps:avm:teal:guidelines.md
│       │   │   │   │   ├── developer:docs:details:dapps:avm:teal:index.md
│       │   │   │   │   ├── developer:docs:details:dapps:avm:teal:jsonspec.md
│       │   │   │   │   ├── developer:docs:details:dapps:avm:teal:opcodes:index.md
│       │   │   │   │   ├── developer:docs:details:dapps:avm:teal:opcodes:v1.md
│       │   │   │   │   ├── developer:docs:details:dapps:avm:teal:opcodes:v10.md
│       │   │   │   │   ├── developer:docs:details:dapps:avm:teal:opcodes:v2.md
│       │   │   │   │   ├── developer:docs:details:dapps:avm:teal:opcodes:v3.md
│       │   │   │   │   ├── developer:docs:details:dapps:avm:teal:opcodes:v4.md
│       │   │   │   │   ├── developer:docs:details:dapps:avm:teal:opcodes:v5.md
│       │   │   │   │   ├── developer:docs:details:dapps:avm:teal:opcodes:v6.md
│       │   │   │   │   ├── developer:docs:details:dapps:avm:teal:opcodes:v7.md
│       │   │   │   │   ├── developer:docs:details:dapps:avm:teal:opcodes:v8.md
│       │   │   │   │   ├── developer:docs:details:dapps:avm:teal:opcodes:v9.md
│       │   │   │   │   ├── developer:docs:details:dapps:avm:teal:specification.md
│       │   │   │   │   ├── developer:docs:details:dapps:smart-contracts:ABI:index.md
│       │   │   │   │   ├── developer:docs:details:dapps:smart-contracts:apps:create.md
│       │   │   │   │   ├── developer:docs:details:dapps:smart-contracts:apps:index.md
│       │   │   │   │   ├── developer:docs:details:dapps:smart-contracts:apps:innertx.md
│       │   │   │   │   ├── developer:docs:details:dapps:smart-contracts:apps:state.md
│       │   │   │   │   ├── developer:docs:details:dapps:smart-contracts:apps:txs.md
│       │   │   │   │   ├── developer:docs:details:dapps:smart-contracts:debugging.md
│       │   │   │   │   ├── developer:docs:details:dapps:smart-contracts:frontend:apps.md
│       │   │   │   │   ├── developer:docs:details:dapps:smart-contracts:frontend:smartsigs.md
│       │   │   │   │   ├── developer:docs:details:dapps:smart-contracts:guidelines.md
│       │   │   │   │   ├── developer:docs:details:dapps:smart-contracts:index.md
│       │   │   │   │   ├── developer:docs:details:dapps:smart-contracts:smartsigs:index.md
│       │   │   │   │   ├── developer:docs:details:dapps:smart-contracts:smartsigs:modes.md
│       │   │   │   │   ├── developer:docs:details:dapps:smart-contracts:smartsigs:walkthrough.md
│       │   │   │   │   ├── developer:docs:details:dapps:writing-contracts:beaker.md
│       │   │   │   │   ├── developer:docs:details:dapps:writing-contracts:pyteal.md
│       │   │   │   │   ├── developer:docs:details:dapps:writing-contracts:python.md
│       │   │   │   │   ├── developer:docs:details:encoding.md
│       │   │   │   │   ├── developer:docs:details:ethereum_to_algorand.md
│       │   │   │   │   ├── developer:docs:details:index.md
│       │   │   │   │   ├── developer:docs:details:indexer.md
│       │   │   │   │   ├── developer:docs:details:parameter_tables.md
│       │   │   │   │   ├── developer:docs:details:stateproofs:index.md
│       │   │   │   │   ├── developer:docs:details:stateproofs:light_client.md
│       │   │   │   │   ├── developer:docs:details:technical_faq.md
│       │   │   │   │   ├── developer:docs:details:transactions:index.md
│       │   │   │   │   ├── developer:docs:details:transactions:offline_transactions.md
│       │   │   │   │   ├── developer:docs:details:transactions:payment_prompts.md
│       │   │   │   │   ├── developer:docs:details:transactions:signatures.md
│       │   │   │   │   ├── developer:docs:details:transactions:transactions.md
│       │   │   │   │   ├── developer:docs:details:useful_resources.md
│       │   │   │   │   ├── developer:docs:get-started:algokit.md
│       │   │   │   │   ├── developer:docs:get-started:basics:what_is_blockchain.md
│       │   │   │   │   ├── developer:docs:get-started:basics:whats_a_dapp.md
│       │   │   │   │   ├── developer:docs:get-started:basics:where_to_start.md
│       │   │   │   │   ├── developer:docs:get-started:basics:why_algorand.md
│       │   │   │   │   ├── developer:docs:get-started:tokenization:ft.md
│       │   │   │   │   ├── developer:docs:get-started:tokenization:nft.md
│       │   │   │   │   ├── developer:docs:index.md
│       │   │   │   │   ├── developer:docs:rest-apis:algod.md
│       │   │   │   │   ├── developer:docs:rest-apis:indexer.md
│       │   │   │   │   ├── developer:docs:rest-apis:kmd.md
│       │   │   │   │   ├── developer:docs:rest-apis:restendpoints.md
│       │   │   │   │   ├── developer:docs:run-a-node:operations:catchup.md
│       │   │   │   │   ├── developer:docs:run-a-node:operations:switch_networks.md
│       │   │   │   │   ├── developer:docs:run-a-node:participate:generate_keys.md
│       │   │   │   │   ├── developer:docs:run-a-node:participate:index.md
│       │   │   │   │   ├── developer:docs:run-a-node:participate:offline.md
│       │   │   │   │   ├── developer:docs:run-a-node:participate:online.md
│       │   │   │   │   ├── developer:docs:run-a-node:participate:renew.md
│       │   │   │   │   ├── developer:docs:run-a-node:reference:artifacts.md
│       │   │   │   │   ├── developer:docs:run-a-node:reference:config.md
│       │   │   │   │   ├── developer:docs:run-a-node:reference:relay.md
│       │   │   │   │   ├── developer:docs:run-a-node:reference:telemetry-config.md
│       │   │   │   │   ├── developer:docs:run-a-node:setup:indexer.md
│       │   │   │   │   ├── developer:docs:run-a-node:setup:install.md
│       │   │   │   │   ├── developer:docs:run-a-node:setup:node-troubleshooting.md
│       │   │   │   │   ├── developer:docs:run-a-node:setup:types.md
│       │   │   │   │   ├── developer:docs:sdks:go:index.md
│       │   │   │   │   ├── developer:docs:sdks:index.md
│       │   │   │   │   ├── developer:docs:sdks:java:index.md
│       │   │   │   │   ├── developer:docs:sdks:javascript:index.md
│       │   │   │   │   ├── developer:docs:sdks:python:index.md
│       │   │   │   │   ├── developer:python:code:example:accounts.md
│       │   │   │   │   ├── developer:python:code:example:arc4_types.md
│       │   │   │   │   ├── developer:python:code:example:assets.md
│       │   │   │   │   ├── developer:python:code:example:box_storage.md
│       │   │   │   │   ├── developer:python:code:example:control_flow.md
│       │   │   │   │   ├── developer:python:code:example:crypto:merkle_tree.md
│       │   │   │   │   ├── developer:python:code:example:defi:amm.md
│       │   │   │   │   ├── developer:python:code:example:defi:auction.md
│       │   │   │   │   ├── developer:python:code:example:defi:htlc_logicsig.md
│       │   │   │   │   ├── developer:python:code:example:defi:marketplace.md
│       │   │   │   │   ├── developer:python:code:example:events:arc28_events.md
│       │   │   │   │   ├── developer:python:code:example:global_storage.md
│       │   │   │   │   ├── developer:python:code:example:governance:simple_voting.md
│       │   │   │   │   ├── developer:python:code:example:hello_world.md
│       │   │   │   │   ├── developer:python:code:example:inner_transactions.md
│       │   │   │   │   ├── developer:python:code:example:local_storage.md
│       │   │   │   │   ├── developer:python:code:example:nft:proof_of_attendance.md
│       │   │   │   │   ├── developer:python:code:example:privacy:zk_whitelist.md
│       │   │   │   │   ├── developer:python:code:example:scratch_storage.md
│       │   │   │   │   ├── developer:python:code:example:self_payment.md
│       │   │   │   │   ├── developer:python:code:example:struct_in_box.md
│       │   │   │   │   ├── developer:python:code:example:subsidize_app_call.md
│       │   │   │   │   ├── developer:python:code:example:transactions.md
│       │   │   │   │   ├── developer:python:code:example:utility:calculator.md
│       │   │   │   │   ├── devportal-code-examples:projects:python-contract-examples:README.md
│       │   │   │   │   ├── devportal-code-examples:README.md
│       │   │   │   │   ├── docs:.walletconnect:index.md
│       │   │   │   │   ├── docs:.walletconnect:walletconnect-schema.md
│       │   │   │   │   ├── docs:README.md
│       │   │   │   │   ├── docs:scripts:example_tracker:example_list.md
│       │   │   │   │   ├── docs:scripts:README.md
│       │   │   │   │   ├── index.md
│       │   │   │   │   ├── liquid_auth_index.md
│       │   │   │   │   ├── liquid-auth:ARCHITECTURE.md
│       │   │   │   │   ├── liquid-auth:decisions:1-Service-Authentication.md
│       │   │   │   │   ├── liquid-auth:decisions:2-Bidirectional-Communication.md
│       │   │   │   │   ├── liquid-auth:decisions:3-Peer-to-Peer-Signaling.md
│       │   │   │   │   ├── liquid-auth:decisions:4-Fido-Extension.md
│       │   │   │   │   ├── liquid-auth:decisions:README.md
│       │   │   │   │   ├── liquid-auth:docs:architecture.md
│       │   │   │   │   ├── liquid-auth:docs:clients:android:provider-service:authenticate.md
│       │   │   │   │   ├── liquid-auth:docs:clients:android:provider-service:register.md
│       │   │   │   │   ├── liquid-auth:docs:clients:browser:authentication.md
│       │   │   │   │   ├── liquid-auth:docs:clients:browser:example.md
│       │   │   │   │   ├── liquid-auth:docs:introduction.md
│       │   │   │   │   ├── liquid-auth:docs:README.md
│       │   │   │   │   ├── liquid-auth:docs:server:environment-variables.md
│       │   │   │   │   ├── liquid-auth:docs:server:integrations.md
│       │   │   │   │   ├── liquid-auth:docs:server:introduction.md
│       │   │   │   │   ├── liquid-auth:docs:server:running-locally.md
│       │   │   │   │   ├── liquid-auth:README.md
│       │   │   │   │   ├── liquid-auth:SEQUENCE.md
│       │   │   │   │   ├── liquid-auth:services:liquid-auth-api-js:src:assertion:assertion.controller.post.request.md
│       │   │   │   │   ├── liquid-auth:services:liquid-auth-api-js:src:assertion:assertion.controller.post.response.md
│       │   │   │   │   ├── liquid-auth:services:liquid-auth-api-js:src:attestation:attestation.controller.post.request.md
│       │   │   │   │   ├── liquid-auth:services:liquid-auth-api-js:src:auth:auth.controller.get.user.md
│       │   │   │   │   ├── liquid-auth:sites:express-dapp:README.md
│       │   │   │   │   ├── liquid-auth:VISION.md
│       │   │   │   │   ├── puya_index.md
│       │   │   │   │   ├── puya:docs:algopy_testing:index.md
│       │   │   │   │   ├── puya:docs:api-algopy.arc4.md
│       │   │   │   │   ├── puya:docs:api-algopy.gtxn.md
│       │   │   │   │   ├── puya:docs:api-algopy.itxn.md
│       │   │   │   │   ├── puya:docs:api-algopy.md
│       │   │   │   │   ├── puya:docs:api-algopy.op.md
│       │   │   │   │   ├── puya:docs:api.md
│       │   │   │   │   ├── puya:docs:compiler.md
│       │   │   │   │   ├── puya:docs:index.md
│       │   │   │   │   ├── puya:docs:language-guide.md
│       │   │   │   │   ├── puya:docs:lg-arc28.md
│       │   │   │   │   ├── puya:docs:lg-arc4.md
│       │   │   │   │   ├── puya:docs:lg-builtins.md
│       │   │   │   │   ├── puya:docs:lg-calling-apps.md
│       │   │   │   │   ├── puya:docs:lg-compile.md
│       │   │   │   │   ├── puya:docs:lg-control.md
│       │   │   │   │   ├── puya:docs:lg-errors.md
│       │   │   │   │   ├── puya:docs:lg-logs.md
│       │   │   │   │   ├── puya:docs:lg-modules.md
│       │   │   │   │   ├── puya:docs:lg-opcode-budget.md
│       │   │   │   │   ├── puya:docs:lg-ops.md
│       │   │   │   │   ├── puya:docs:lg-storage.md
│       │   │   │   │   ├── puya:docs:lg-structure.md
│       │   │   │   │   ├── puya:docs:lg-transactions.md
│       │   │   │   │   ├── puya:docs:lg-types.md
│       │   │   │   │   ├── puya:docs:lg-unsupported-python-features.md
│       │   │   │   │   ├── puya:docs:principles.md
│       │   │   │   │   ├── puya:examples:auction:README.md
│       │   │   │   │   ├── puya:python:testing:docs:algopy.md
│       │   │   │   │   ├── puya:python:testing:docs:api.md
│       │   │   │   │   ├── puya:python:testing:docs:coverage.md
│       │   │   │   │   ├── puya:python:testing:docs:examples.md
│       │   │   │   │   ├── puya:python:testing:docs:faq.md
│       │   │   │   │   ├── puya:python:testing:docs:index.md
│       │   │   │   │   ├── puya:python:testing:docs:testing-guide:arc4-types.md
│       │   │   │   │   ├── puya:python:testing:docs:testing-guide:avm-types.md
│       │   │   │   │   ├── puya:python:testing:docs:testing-guide:concepts.md
│       │   │   │   │   ├── puya:python:testing:docs:testing-guide:contract-testing.md
│       │   │   │   │   ├── puya:python:testing:docs:testing-guide:index.md
│       │   │   │   │   ├── puya:python:testing:docs:testing-guide:opcodes.md
│       │   │   │   │   ├── puya:python:testing:docs:testing-guide:signature-testing.md
│       │   │   │   │   ├── puya:python:testing:docs:testing-guide:state-management.md
│       │   │   │   │   ├── puya:python:testing:docs:testing-guide:subroutines.md
│       │   │   │   │   ├── puya:python:testing:docs:testing-guide:transactions.md
│       │   │   │   │   ├── puya:python:testing:examples:README.md
│       │   │   │   │   ├── puya:python:testing:README.md
│       │   │   │   │   ├── puya:README.md
│       │   │   │   │   ├── puya:src:puya:ARCHITECTURE.md
│       │   │   │   │   ├── puya:src:puyapy:_typeshed:README.md
│       │   │   │   │   ├── puya:src:puyapy:_vendor:mypy:typeshed:stdlib:_typeshed:README.md
│       │   │   │   │   ├── puya:src:puyapy:awst_build:README.md
│       │   │   │   │   ├── puya:stubs:README.md
│       │   │   │   │   ├── puya:tests:test_expected_output:README.md
│       │   │   │   │   ├── puya:typescript:docs:architecture-decisions:2024-05-21_primitive-bytes-and-strings.md
│       │   │   │   │   ├── puya:typescript:docs:architecture-decisions:2024-05-21_primitive-integer-types.md
│       │   │   │   │   ├── puya:typescript:docs:README.md
│       │   │   │   │   ├── puya:typescript:packages:algo-ts:readme.md
│       │   │   │   │   ├── puya:typescript:README.md
│       │   │   │   │   ├── SDKs:javascript:classes:ABIAddressType.md
│       │   │   │   │   ├── SDKs:javascript:classes:ABIArrayDynamicType.md
│       │   │   │   │   ├── SDKs:javascript:classes:ABIArrayStaticType.md
│       │   │   │   │   ├── SDKs:javascript:classes:ABIBoolType.md
│       │   │   │   │   ├── SDKs:javascript:classes:ABIByteType.md
│       │   │   │   │   ├── SDKs:javascript:classes:ABIContract.md
│       │   │   │   │   ├── SDKs:javascript:classes:ABIInterface.md
│       │   │   │   │   ├── SDKs:javascript:classes:ABIMethod.md
│       │   │   │   │   ├── SDKs:javascript:classes:ABIStringType.md
│       │   │   │   │   ├── SDKs:javascript:classes:ABITupleType.md
│       │   │   │   │   ├── SDKs:javascript:classes:ABIType.md
│       │   │   │   │   ├── SDKs:javascript:classes:ABIUfixedType.md
│       │   │   │   │   ├── SDKs:javascript:classes:ABIUintType.md
│       │   │   │   │   ├── SDKs:javascript:classes:Algodv2.md
│       │   │   │   │   ├── SDKs:javascript:classes:AtomicTransactionComposer.md
│       │   │   │   │   ├── SDKs:javascript:classes:DryrunResult.md
│       │   │   │   │   ├── SDKs:javascript:classes:Indexer.md
│       │   │   │   │   ├── SDKs:javascript:classes:indexerModels.Account.md
│       │   │   │   │   ├── SDKs:javascript:classes:indexerModels.AccountParticipation.md
│       │   │   │   │   ├── SDKs:javascript:classes:indexerModels.AccountResponse.md
│       │   │   │   │   ├── SDKs:javascript:classes:indexerModels.AccountsResponse.md
│       │   │   │   │   ├── SDKs:javascript:classes:indexerModels.AccountStateDelta.md
│       │   │   │   │   ├── SDKs:javascript:classes:indexerModels.Application.md
│       │   │   │   │   ├── SDKs:javascript:classes:indexerModels.ApplicationLocalState.md
│       │   │   │   │   ├── SDKs:javascript:classes:indexerModels.ApplicationLocalStatesResponse.md
│       │   │   │   │   ├── SDKs:javascript:classes:indexerModels.ApplicationLogData.md
│       │   │   │   │   ├── SDKs:javascript:classes:indexerModels.ApplicationLogsResponse.md
│       │   │   │   │   ├── SDKs:javascript:classes:indexerModels.ApplicationParams.md
│       │   │   │   │   ├── SDKs:javascript:classes:indexerModels.ApplicationResponse.md
│       │   │   │   │   ├── SDKs:javascript:classes:indexerModels.ApplicationsResponse.md
│       │   │   │   │   ├── SDKs:javascript:classes:indexerModels.ApplicationStateSchema.md
│       │   │   │   │   ├── SDKs:javascript:classes:indexerModels.Asset.md
│       │   │   │   │   ├── SDKs:javascript:classes:indexerModels.AssetBalancesResponse.md
│       │   │   │   │   ├── SDKs:javascript:classes:indexerModels.AssetHolding.md
│       │   │   │   │   ├── SDKs:javascript:classes:indexerModels.AssetHoldingsResponse.md
│       │   │   │   │   ├── SDKs:javascript:classes:indexerModels.AssetParams.md
│       │   │   │   │   ├── SDKs:javascript:classes:indexerModels.AssetResponse.md
│       │   │   │   │   ├── SDKs:javascript:classes:indexerModels.AssetsResponse.md
│       │   │   │   │   ├── SDKs:javascript:classes:indexerModels.Block.md
│       │   │   │   │   ├── SDKs:javascript:classes:indexerModels.BlockRewards.md
│       │   │   │   │   ├── SDKs:javascript:classes:indexerModels.BlockUpgradeState.md
│       │   │   │   │   ├── SDKs:javascript:classes:indexerModels.BlockUpgradeVote.md
│       │   │   │   │   ├── SDKs:javascript:classes:indexerModels.Box.md
│       │   │   │   │   ├── SDKs:javascript:classes:indexerModels.BoxDescriptor.md
│       │   │   │   │   ├── SDKs:javascript:classes:indexerModels.BoxesResponse.md
│       │   │   │   │   ├── SDKs:javascript:classes:indexerModels.ErrorResponse.md
│       │   │   │   │   ├── SDKs:javascript:classes:indexerModels.EvalDelta.md
│       │   │   │   │   ├── SDKs:javascript:classes:indexerModels.EvalDeltaKeyValue.md
│       │   │   │   │   ├── SDKs:javascript:classes:indexerModels.HashFactory.md
│       │   │   │   │   ├── SDKs:javascript:classes:indexerModels.HealthCheck.md
│       │   │   │   │   ├── SDKs:javascript:classes:indexerModels.IndexerStateProofMessage.md
│       │   │   │   │   ├── SDKs:javascript:classes:indexerModels.MerkleArrayProof.md
│       │   │   │   │   ├── SDKs:javascript:classes:indexerModels.MiniAssetHolding.md
│       │   │   │   │   ├── SDKs:javascript:classes:indexerModels.ParticipationUpdates.md
│       │   │   │   │   ├── SDKs:javascript:classes:indexerModels.StateProofFields.md
│       │   │   │   │   ├── SDKs:javascript:classes:indexerModels.StateProofParticipant.md
│       │   │   │   │   ├── SDKs:javascript:classes:indexerModels.StateProofReveal.md
│       │   │   │   │   ├── SDKs:javascript:classes:indexerModels.StateProofSignature.md
│       │   │   │   │   ├── SDKs:javascript:classes:indexerModels.StateProofSigSlot.md
│       │   │   │   │   ├── SDKs:javascript:classes:indexerModels.StateProofTracking.md
│       │   │   │   │   ├── SDKs:javascript:classes:indexerModels.StateProofVerifier.md
│       │   │   │   │   ├── SDKs:javascript:classes:indexerModels.StateSchema.md
│       │   │   │   │   ├── SDKs:javascript:classes:indexerModels.TealKeyValue.md
│       │   │   │   │   ├── SDKs:javascript:classes:indexerModels.TealValue.md
│       │   │   │   │   ├── SDKs:javascript:classes:indexerModels.Transaction.md
│       │   │   │   │   ├── SDKs:javascript:classes:indexerModels.TransactionApplication.md
│       │   │   │   │   ├── SDKs:javascript:classes:indexerModels.TransactionAssetConfig.md
│       │   │   │   │   ├── SDKs:javascript:classes:indexerModels.TransactionAssetFreeze.md
│       │   │   │   │   ├── SDKs:javascript:classes:indexerModels.TransactionAssetTransfer.md
│       │   │   │   │   ├── SDKs:javascript:classes:indexerModels.TransactionKeyreg.md
│       │   │   │   │   ├── SDKs:javascript:classes:indexerModels.TransactionPayment.md
│       │   │   │   │   ├── SDKs:javascript:classes:indexerModels.TransactionResponse.md
│       │   │   │   │   ├── SDKs:javascript:classes:indexerModels.TransactionSignature.md
│       │   │   │   │   ├── SDKs:javascript:classes:indexerModels.TransactionSignatureLogicsig.md
│       │   │   │   │   ├── SDKs:javascript:classes:indexerModels.TransactionSignatureMultisig.md
│       │   │   │   │   ├── SDKs:javascript:classes:indexerModels.TransactionSignatureMultisigSubsignature.md
│       │   │   │   │   ├── SDKs:javascript:classes:indexerModels.TransactionsResponse.md
│       │   │   │   │   ├── SDKs:javascript:classes:indexerModels.TransactionStateProof.md
│       │   │   │   │   ├── SDKs:javascript:classes:Kmd.md
│       │   │   │   │   ├── SDKs:javascript:classes:LogicSig.md
│       │   │   │   │   ├── SDKs:javascript:classes:LogicSigAccount.md
│       │   │   │   │   ├── SDKs:javascript:classes:modelsv2.Account.md
│       │   │   │   │   ├── SDKs:javascript:classes:modelsv2.AccountApplicationResponse.md
│       │   │   │   │   ├── SDKs:javascript:classes:modelsv2.AccountAssetHolding.md
│       │   │   │   │   ├── SDKs:javascript:classes:modelsv2.AccountAssetResponse.md
│       │   │   │   │   ├── SDKs:javascript:classes:modelsv2.AccountAssetsInformationResponse.md
│       │   │   │   │   ├── SDKs:javascript:classes:modelsv2.AccountParticipation.md
│       │   │   │   │   ├── SDKs:javascript:classes:modelsv2.AccountStateDelta.md
│       │   │   │   │   ├── SDKs:javascript:classes:modelsv2.AppCallLogs.md
│       │   │   │   │   ├── SDKs:javascript:classes:modelsv2.Application.md
│       │   │   │   │   ├── SDKs:javascript:classes:modelsv2.ApplicationInitialStates.md
│       │   │   │   │   ├── SDKs:javascript:classes:modelsv2.ApplicationKVStorage.md
│       │   │   │   │   ├── SDKs:javascript:classes:modelsv2.ApplicationLocalReference.md
│       │   │   │   │   ├── SDKs:javascript:classes:modelsv2.ApplicationLocalState.md
│       │   │   │   │   ├── SDKs:javascript:classes:modelsv2.ApplicationParams.md
│       │   │   │   │   ├── SDKs:javascript:classes:modelsv2.ApplicationStateOperation.md
│       │   │   │   │   ├── SDKs:javascript:classes:modelsv2.ApplicationStateSchema.md
│       │   │   │   │   ├── SDKs:javascript:classes:modelsv2.Asset.md
│       │   │   │   │   ├── SDKs:javascript:classes:modelsv2.AssetHolding.md
│       │   │   │   │   ├── SDKs:javascript:classes:modelsv2.AssetHoldingReference.md
│       │   │   │   │   ├── SDKs:javascript:classes:modelsv2.AssetParams.md
│       │   │   │   │   ├── SDKs:javascript:classes:modelsv2.AvmKeyValue.md
│       │   │   │   │   ├── SDKs:javascript:classes:modelsv2.AvmValue.md
│       │   │   │   │   ├── SDKs:javascript:classes:modelsv2.BlockHashResponse.md
│       │   │   │   │   ├── SDKs:javascript:classes:modelsv2.BlockLogsResponse.md
│       │   │   │   │   ├── SDKs:javascript:classes:modelsv2.BlockResponse.md
│       │   │   │   │   ├── SDKs:javascript:classes:modelsv2.BlockTxidsResponse.md
│       │   │   │   │   ├── SDKs:javascript:classes:modelsv2.Box.md
│       │   │   │   │   ├── SDKs:javascript:classes:modelsv2.BoxDescriptor.md
│       │   │   │   │   ├── SDKs:javascript:classes:modelsv2.BoxesResponse.md
│       │   │   │   │   ├── SDKs:javascript:classes:modelsv2.BoxReference.md
│       │   │   │   │   ├── SDKs:javascript:classes:modelsv2.BuildVersion.md
│       │   │   │   │   ├── SDKs:javascript:classes:modelsv2.CompileResponse.md
│       │   │   │   │   ├── SDKs:javascript:classes:modelsv2.DisassembleResponse.md
│       │   │   │   │   ├── SDKs:javascript:classes:modelsv2.DryrunRequest.md
│       │   │   │   │   ├── SDKs:javascript:classes:modelsv2.DryrunResponse.md
│       │   │   │   │   ├── SDKs:javascript:classes:modelsv2.DryrunSource.md
│       │   │   │   │   ├── SDKs:javascript:classes:modelsv2.DryrunState.md
│       │   │   │   │   ├── SDKs:javascript:classes:modelsv2.DryrunTxnResult.md
│       │   │   │   │   ├── SDKs:javascript:classes:modelsv2.ErrorResponse.md
│       │   │   │   │   ├── SDKs:javascript:classes:modelsv2.EvalDelta.md
│       │   │   │   │   ├── SDKs:javascript:classes:modelsv2.EvalDeltaKeyValue.md
│       │   │   │   │   ├── SDKs:javascript:classes:modelsv2.GetBlockTimeStampOffsetResponse.md
│       │   │   │   │   ├── SDKs:javascript:classes:modelsv2.GetSyncRoundResponse.md
│       │   │   │   │   ├── SDKs:javascript:classes:modelsv2.KvDelta.md
│       │   │   │   │   ├── SDKs:javascript:classes:modelsv2.LedgerStateDeltaForTransactionGroup.md
│       │   │   │   │   ├── SDKs:javascript:classes:modelsv2.LightBlockHeaderProof.md
│       │   │   │   │   ├── SDKs:javascript:classes:modelsv2.NodeStatusResponse.md
│       │   │   │   │   ├── SDKs:javascript:classes:modelsv2.PendingTransactionResponse.md
│       │   │   │   │   ├── SDKs:javascript:classes:modelsv2.PendingTransactionsResponse.md
│       │   │   │   │   ├── SDKs:javascript:classes:modelsv2.PostTransactionsResponse.md
│       │   │   │   │   ├── SDKs:javascript:classes:modelsv2.ScratchChange.md
│       │   │   │   │   ├── SDKs:javascript:classes:modelsv2.SimulateInitialStates.md
│       │   │   │   │   ├── SDKs:javascript:classes:modelsv2.SimulateRequest.md
│       │   │   │   │   ├── SDKs:javascript:classes:modelsv2.SimulateRequestTransactionGroup.md
│       │   │   │   │   ├── SDKs:javascript:classes:modelsv2.SimulateResponse.md
│       │   │   │   │   ├── SDKs:javascript:classes:modelsv2.SimulateTraceConfig.md
│       │   │   │   │   ├── SDKs:javascript:classes:modelsv2.SimulateTransactionGroupResult.md
│       │   │   │   │   ├── SDKs:javascript:classes:modelsv2.SimulateTransactionResult.md
│       │   │   │   │   ├── SDKs:javascript:classes:modelsv2.SimulateUnnamedResourcesAccessed.md
│       │   │   │   │   ├── SDKs:javascript:classes:modelsv2.SimulationEvalOverrides.md
│       │   │   │   │   ├── SDKs:javascript:classes:modelsv2.SimulationOpcodeTraceUnit.md
│       │   │   │   │   ├── SDKs:javascript:classes:modelsv2.SimulationTransactionExecTrace.md
│       │   │   │   │   ├── SDKs:javascript:classes:modelsv2.StateProof.md
│       │   │   │   │   ├── SDKs:javascript:classes:modelsv2.StateProofMessage.md
│       │   │   │   │   ├── SDKs:javascript:classes:modelsv2.SupplyResponse.md
│       │   │   │   │   ├── SDKs:javascript:classes:modelsv2.TealKeyValue.md
│       │   │   │   │   ├── SDKs:javascript:classes:modelsv2.TealValue.md
│       │   │   │   │   ├── SDKs:javascript:classes:modelsv2.TransactionGroupLedgerStateDeltasForRoundResponse.md
│       │   │   │   │   ├── SDKs:javascript:classes:modelsv2.TransactionParametersResponse.md
│       │   │   │   │   ├── SDKs:javascript:classes:modelsv2.TransactionProofResponse.md
│       │   │   │   │   ├── SDKs:javascript:classes:modelsv2.Version.md
│       │   │   │   │   ├── SDKs:javascript:classes:SourceMap.md
│       │   │   │   │   ├── SDKs:javascript:classes:Transaction.md
│       │   │   │   │   ├── SDKs:javascript:enums:ABIReferenceType.md
│       │   │   │   │   ├── SDKs:javascript:enums:ABITransactionType.md
│       │   │   │   │   ├── SDKs:javascript:enums:AtomicTransactionComposerStatus.md
│       │   │   │   │   ├── SDKs:javascript:enums:IntDecoding.md
│       │   │   │   │   ├── SDKs:javascript:enums:OnApplicationComplete.md
│       │   │   │   │   ├── SDKs:javascript:enums:TransactionType.md
│       │   │   │   │   ├── SDKs:javascript:examples:README.md
│       │   │   │   │   ├── SDKs:javascript:FAQ.md
│       │   │   │   │   ├── SDKs:javascript:interfaces:ABIContractNetworkInfo.md
│       │   │   │   │   ├── SDKs:javascript:interfaces:ABIContractNetworks.md
│       │   │   │   │   ├── SDKs:javascript:interfaces:ABIContractParams.md
│       │   │   │   │   ├── SDKs:javascript:interfaces:ABIInterfaceParams.md
│       │   │   │   │   ├── SDKs:javascript:interfaces:ABIMethodArgParams.md
│       │   │   │   │   ├── SDKs:javascript:interfaces:ABIMethodParams.md
│       │   │   │   │   ├── SDKs:javascript:interfaces:ABIMethodReturnParams.md
│       │   │   │   │   ├── SDKs:javascript:interfaces:ABIResult.md
│       │   │   │   │   ├── SDKs:javascript:interfaces:Account.md
│       │   │   │   │   ├── SDKs:javascript:interfaces:Address.md
│       │   │   │   │   ├── SDKs:javascript:interfaces:AlgodTokenHeader.md
│       │   │   │   │   ├── SDKs:javascript:interfaces:BaseHTTPClient.md
│       │   │   │   │   ├── SDKs:javascript:interfaces:BaseHTTPClientError.md
│       │   │   │   │   ├── SDKs:javascript:interfaces:BaseHTTPClientResponse.md
│       │   │   │   │   ├── SDKs:javascript:interfaces:BoxReference.md
│       │   │   │   │   ├── SDKs:javascript:interfaces:CustomTokenHeader.md
│       │   │   │   │   ├── SDKs:javascript:interfaces:EncodedAssetParams.md
│       │   │   │   │   ├── SDKs:javascript:interfaces:EncodedBoxReference.md
│       │   │   │   │   ├── SDKs:javascript:interfaces:EncodedGlobalStateSchema.md
│       │   │   │   │   ├── SDKs:javascript:interfaces:EncodedLocalStateSchema.md
│       │   │   │   │   ├── SDKs:javascript:interfaces:EncodedLogicSig.md
│       │   │   │   │   ├── SDKs:javascript:interfaces:EncodedLogicSigAccount.md
│       │   │   │   │   ├── SDKs:javascript:interfaces:EncodedMultisig.md
│       │   │   │   │   ├── SDKs:javascript:interfaces:EncodedSignedTransaction.md
│       │   │   │   │   ├── SDKs:javascript:interfaces:EncodedSubsig.md
│       │   │   │   │   ├── SDKs:javascript:interfaces:EncodedTransaction.md
│       │   │   │   │   ├── SDKs:javascript:interfaces:IndexerTokenHeader.md
│       │   │   │   │   ├── SDKs:javascript:interfaces:KMDTokenHeader.md
│       │   │   │   │   ├── SDKs:javascript:interfaces:MultisigMetadata.md
│       │   │   │   │   ├── SDKs:javascript:interfaces:SignedTransaction.md
│       │   │   │   │   ├── SDKs:javascript:interfaces:SuggestedParams.md
│       │   │   │   │   ├── SDKs:javascript:interfaces:TransactionParams.md
│       │   │   │   │   ├── SDKs:javascript:interfaces:TransactionWithSigner.md
│       │   │   │   │   ├── SDKs:javascript:modules:indexerModels.md
│       │   │   │   │   ├── SDKs:javascript:modules:modelsv2.md
│       │   │   │   │   ├── SDKs:javascript:modules.md
│       │   │   │   │   ├── SDKs:javascript:README.md
│       │   │   │   │   ├── SDKs:python:algosdk:v2client:harness:README.md
│       │   │   │   │   ├── SDKs:python:examples:README.md
│       │   │   │   │   ├── SDKs:python:README.md
│       │   │   │   │   ├── tealscript:examples_amm_README.md
│       │   │   │   │   ├── tealscript:examples_auction_README.md
│       │   │   │   │   ├── tealscript:examples_big_box_README.md
│       │   │   │   │   ├── tealscript:examples_itxns_README.md
│       │   │   │   │   ├── tealscript:examples_lsig_with_app_README.md
│       │   │   │   │   ├── tealscript:examples_reti_README.md
│       │   │   │   │   ├── tealscript:FEATURES.md
│       │   │   │   │   ├── tealscript:guides_atomic_txn.md
│       │   │   │   │   ├── tealscript:guides_features.md
│       │   │   │   │   ├── tealscript:guides_getting_started.md
│       │   │   │   │   ├── tealscript:guides_inner_transactions.md
│       │   │   │   │   ├── tealscript:guides_lifecycle.md
│       │   │   │   │   ├── tealscript:guides_math.md
│       │   │   │   │   ├── tealscript:guides_methods.md
│       │   │   │   │   ├── tealscript:guides_multiple_contracts.md
│       │   │   │   │   ├── tealscript:guides_pyteal.md
│       │   │   │   │   ├── tealscript:guides_storage.md
│       │   │   │   │   ├── tealscript:guides_Supported Types_arrays.md
│       │   │   │   │   ├── tealscript:guides_Supported Types_numbers.md
│       │   │   │   │   ├── TEALScript:README.md
│       │   │   │   │   ├── tealscript:tests_test_package_README.md
│       │   │   │   │   ├── tealscript:tutorials_Hello World_0001-intro.md
│       │   │   │   │   ├── tealscript:tutorials_Hello World_0002-init.md
│       │   │   │   │   ├── tealscript:tutorials_Hello World_0003-contract.md
│       │   │   │   │   ├── tealscript:tutorials_Hello World_0004-artifacts.md
│       │   │   │   │   ├── tealscript:tutorials_Hello World_0005-hello.md
│       │   │   │   │   └── tealscript:tutorials_Hello World_0006-test.md
│       │   │   │   └── taxonomy-categories
│       │   │   │       ├── algokit-utils.json
│       │   │   │       ├── algokit.json
│       │   │   │       ├── arcs.json
│       │   │   │       ├── clis.json
│       │   │   │       ├── details.json
│       │   │   │       ├── developers.json
│       │   │   │       ├── liquid-auth.json
│       │   │   │       ├── nodes.json
│       │   │   │       ├── puya.json
│       │   │   │       ├── python.json
│       │   │   │       ├── sdks.json
│       │   │   │       └── tealscript.json
│       │   │   └── wallet
│       │   │       └── index.ts
│       │   ├── tools
│       │   │   ├── accountManager.ts
│       │   │   ├── algodManager.ts
│       │   │   ├── apiManager
│       │   │   │   ├── algod
│       │   │   │   │   ├── account.ts
│       │   │   │   │   ├── application.ts
│       │   │   │   │   ├── asset.ts
│       │   │   │   │   ├── index.ts
│       │   │   │   │   └── transaction.ts
│       │   │   │   ├── example
│       │   │   │   │   ├── get-balance.ts
│       │   │   │   │   └── index.ts
│       │   │   │   ├── index.ts
│       │   │   │   ├── indexer
│       │   │   │   │   ├── account.ts
│       │   │   │   │   ├── application.ts
│       │   │   │   │   ├── asset.ts
│       │   │   │   │   ├── index.ts
│       │   │   │   │   └── transaction.ts
│       │   │   │   ├── nfd
│       │   │   │   │   └── index.ts
│       │   │   │   ├── tinyman
│       │   │   │   │   ├── analytics.ts
│       │   │   │   │   ├── bootstrap.ts
│       │   │   │   │   ├── index.ts
│       │   │   │   │   ├── liquidity.ts
│       │   │   │   │   ├── opt_in.ts
│       │   │   │   │   ├── pool.ts
│       │   │   │   │   ├── remove_liquidity.ts
│       │   │   │   │   └── swap.ts
│       │   │   │   ├── ultrade
│       │   │   │   │   ├── index.ts
│       │   │   │   │   ├── market.ts
│       │   │   │   │   ├── system.ts
│       │   │   │   │   └── wallet.ts
│       │   │   │   └── vestige
│       │   │   │       ├── assets.ts
│       │   │   │       ├── balances.ts
│       │   │   │       ├── index.ts
│       │   │   │       ├── networks.ts
│       │   │   │       ├── notes.ts
│       │   │   │       ├── pools.ts
│       │   │   │       ├── protocols.ts
│       │   │   │       ├── swaps.ts
│       │   │   │       └── vaults.ts
│       │   │   ├── arc26Manager.ts
│       │   │   ├── index.ts
│       │   │   ├── knowledgeManager.ts
│       │   │   ├── transactionManager
│       │   │   │   ├── accountTransactions.ts
│       │   │   │   ├── appTransactions
│       │   │   │   │   ├── callTxn.ts
│       │   │   │   │   ├── clearTxn.ts
│       │   │   │   │   ├── closeOutTxn.ts
│       │   │   │   │   ├── createTxn.ts
│       │   │   │   │   ├── deleteTxn.ts
│       │   │   │   │   ├── index.ts
│       │   │   │   │   ├── optInTxn.ts
│       │   │   │   │   ├── test
│       │   │   │   │   │   ├── counter_approval.teal
│       │   │   │   │   │   ├── counter_clear.teal
│       │   │   │   │   │   ├── storage_test_approval_v2.teal
│       │   │   │   │   │   ├── storage_test_approval.teal
│       │   │   │   │   │   └── storage_test_clear.teal
│       │   │   │   │   ├── types.ts
│       │   │   │   │   └── updateTxn.ts
│       │   │   │   ├── assetTransactions.ts
│       │   │   │   ├── generalTransaction.ts
│       │   │   │   └── index.ts
│       │   │   └── utilityManager.ts
│       │   ├── types.ts
│       │   └── utils
│       │       └── responseProcessor.ts
│       ├── tests
│       │   ├── resources
│       │   │   ├── algod
│       │   │   │   ├── account.test.ts
│       │   │   │   ├── application.test.ts
│       │   │   │   ├── asset.test.ts
│       │   │   │   └── transaction.test.ts
│       │   │   └── indexer
│       │   │       ├── account.test.ts
│       │   │       ├── application.test.ts
│       │   │       ├── asset.test.ts
│       │   │       └── transaction.test.ts
│       │   └── tools
│       │       ├── accountManager.test.ts
│       │       ├── algodManager.test.ts
│       │       ├── apiManager
│       │       │   └── example
│       │       │       └── get-balance.test.ts
│       │       ├── transactionManager
│       │       │   ├── accountTransactionManager.test.ts
│       │       │   ├── appTransactionManager.test.ts
│       │       │   ├── assetTransactionManager.test.ts
│       │       │   ├── generalTransactionManager.test.ts
│       │       │   └── transactionManager.test.ts
│       │       └── utilityManager.test.ts
│       └── tsconfig.json
├── README.md
├── rename_files.sh
└── tsconfig.json
```

# Files

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

```markdown
  1 | [@algorandfoundation/algokit-utils](../README.md) / testing
  2 | 
  3 | # Module: testing
  4 | 
  5 | ## Table of contents
  6 | 
  7 | ### Classes
  8 | 
  9 | - [TestLogger](../classes/testing.TestLogger.md)
 10 | - [TransactionLogger](../classes/testing.TransactionLogger.md)
 11 | 
 12 | ### Functions
 13 | 
 14 | - [algoKitLogCaptureFixture](testing.md#algokitlogcapturefixture)
 15 | - [algorandFixture](testing.md#algorandfixture)
 16 | - [getTestAccount](testing.md#gettestaccount)
 17 | - [runWhenIndexerCaughtUp](testing.md#runwhenindexercaughtup)
 18 | 
 19 | ## Functions
 20 | 
 21 | ### algoKitLogCaptureFixture
 22 | 
 23 | ▸ **algoKitLogCaptureFixture**(): [`AlgoKitLogCaptureFixture`](../interfaces/types_testing.AlgoKitLogCaptureFixture.md)
 24 | 
 25 | Creates a test fixture for capturing AlgoKit logs.
 26 | 
 27 | #### Returns
 28 | 
 29 | [`AlgoKitLogCaptureFixture`](../interfaces/types_testing.AlgoKitLogCaptureFixture.md)
 30 | 
 31 | The fixture
 32 | 
 33 | **`Example`**
 34 | 
 35 | ```typescript
 36 | const logs = algoKitLogCaptureFixture()
 37 | 
 38 | beforeEach(logs.beforeEach)
 39 | afterEach(logs.afterEach)
 40 | 
 41 | test('My test', () => {
 42 |     const capturedLogs = logs.testLogger.capturedLogs
 43 | })
 44 | ```
 45 | 
 46 | #### Defined in
 47 | 
 48 | [src/testing/fixtures/algokit-log-capture-fixture.ts:22](https://github.com/algorandfoundation/algokit-utils-ts/blob/main/src/testing/fixtures/algokit-log-capture-fixture.ts#L22)
 49 | 
 50 | ___
 51 | 
 52 | ### algorandFixture
 53 | 
 54 | ▸ **algorandFixture**(`fixtureConfig?`): [`AlgorandFixture`](../interfaces/types_testing.AlgorandFixture.md)
 55 | 
 56 | Creates a test fixture for automated testing against Algorand.
 57 | By default it tests against an environment variable specified client
 58 |  if the standard environment variables are specified, otherwise against
 59 |  a default LocalNet instance, but you can pass in an algod, indexer
 60 |  and/or kmd (or their respective config) if you want to test against
 61 | an explicitly defined network.
 62 | 
 63 | #### Parameters
 64 | 
 65 | | Name | Type | Description |
 66 | | :------ | :------ | :------ |
 67 | | `fixtureConfig?` | [`AlgorandFixtureConfig`](../interfaces/types_testing.AlgorandFixtureConfig.md) | The fixture configuration |
 68 | 
 69 | #### Returns
 70 | 
 71 | [`AlgorandFixture`](../interfaces/types_testing.AlgorandFixture.md)
 72 | 
 73 | The fixture
 74 | 
 75 | **`Example`**
 76 | 
 77 | ```typescript
 78 | const algorand = algorandFixture()
 79 | 
 80 | beforeEach(algorand.beforeEach, 10_000)
 81 | 
 82 | test('My test', async () => {
 83 |     const {algod, indexer, testAccount, ...} = algorand.context
 84 |     // test things...
 85 | })
 86 | ```
 87 | 
 88 | **`Example`**
 89 | 
 90 | ```typescript
 91 | const algorand = algorandFixture({
 92 |  algod: new Algodv2('localhost', 12345, 'aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa'),
 93 |  // ...
 94 | })
 95 | 
 96 | beforeEach(algorand.beforeEach, 10_000)
 97 | 
 98 | test('My test', async () => {
 99 |     const {algod, indexer, testAccount, ...} = algorand.context
100 |     // test things...
101 | })
102 | ```
103 | 
104 | #### Defined in
105 | 
106 | [src/testing/fixtures/algorand-fixture.ts:48](https://github.com/algorandfoundation/algokit-utils-ts/blob/main/src/testing/fixtures/algorand-fixture.ts#L48)
107 | 
108 | ▸ **algorandFixture**(`fixtureConfig`, `config`): [`AlgorandFixture`](../interfaces/types_testing.AlgorandFixture.md)
109 | 
110 | #### Parameters
111 | 
112 | | Name | Type | Description |
113 | | :------ | :------ | :------ |
114 | | `fixtureConfig` | `undefined` \| [`AlgorandFixtureConfig`](../interfaces/types_testing.AlgorandFixtureConfig.md) | The fixture configuration |
115 | | `config` | [`AlgoConfig`](../interfaces/types_network_client.AlgoConfig.md) | The fixture configuration |
116 | 
117 | #### Returns
118 | 
119 | [`AlgorandFixture`](../interfaces/types_testing.AlgorandFixture.md)
120 | 
121 | The fixture
122 | 
123 | **`Deprecated`**
124 | 
125 | Config can be passed in directly to fixture config now.
126 | 
127 | Creates a test fixture for automated testing against Algorand.
128 | By default it tests against an environment variable specified client
129 |  if the standard environment variables are specified, otherwise against
130 |  a default LocalNet instance, but you can pass in an algod, indexer
131 |  and/or kmd if you want to test against an explicitly defined network.
132 | 
133 | **`Example`**
134 | 
135 | ```typescript
136 | const algorand = algorandFixture(undefined, getConfigFromEnvOrDefaults())
137 | 
138 | beforeEach(algorand.beforeEach, 10_000)
139 | 
140 | test('My test', async () => {
141 |     const {algod, indexer, testAccount, ...} = algorand.context
142 |     // test things...
143 | })
144 | ```
145 | 
146 | #### Defined in
147 | 
148 | [src/testing/fixtures/algorand-fixture.ts:75](https://github.com/algorandfoundation/algokit-utils-ts/blob/main/src/testing/fixtures/algorand-fixture.ts#L75)
149 | 
150 | ___
151 | 
152 | ### getTestAccount
153 | 
154 | ▸ **getTestAccount**(`params`, `algod`, `kmd?`): `Promise`\<`Address` & `Account` & [`TransactionSignerAccount`](../interfaces/types_account.TransactionSignerAccount.md)\>
155 | 
156 | #### Parameters
157 | 
158 | | Name | Type | Description |
159 | | :------ | :------ | :------ |
160 | | `params` | [`GetTestAccountParams`](../interfaces/types_testing.GetTestAccountParams.md) | The config for the test account to generate |
161 | | `algod` | `AlgodClient` | An algod client |
162 | | `kmd?` | `KmdClient` | A KMD client, if not specified then a default KMD client will be loaded from environment variables and if not found fallback to the default LocalNet KMD client |
163 | 
164 | #### Returns
165 | 
166 | `Promise`\<`Address` & `Account` & [`TransactionSignerAccount`](../interfaces/types_account.TransactionSignerAccount.md)\>
167 | 
168 | The account, with private key loaded
169 | 
170 | **`Deprecated`**
171 | 
172 | Use `getTestAccount(params, algorandClient)` instead. The `algorandClient` object can be created using `AlgorandClient.fromClients({ algod, kmd })`.
173 | 
174 | Creates an ephemeral Algorand account for the purposes of testing.
175 | Returns a newly created random test account that is funded from the dispenser
176 | DO NOT USE THIS TO CREATE A MAINNET ACCOUNT!
177 | Note: By default this will log the mnemonic of the account.
178 | 
179 | #### Defined in
180 | 
181 | [src/testing/account.ts:21](https://github.com/algorandfoundation/algokit-utils-ts/blob/main/src/testing/account.ts#L21)
182 | 
183 | ▸ **getTestAccount**(`params`, `algorand`): `Promise`\<`Address` & `Account` & [`TransactionSignerAccount`](../interfaces/types_account.TransactionSignerAccount.md)\>
184 | 
185 | Creates an ephemeral Algorand account for the purposes of testing.
186 | Returns a newly created random test account that is funded from the dispenser
187 | DO NOT USE THIS TO CREATE A MAINNET ACCOUNT!
188 | Note: By default this will log the mnemonic of the account.
189 | 
190 | #### Parameters
191 | 
192 | | Name | Type | Description |
193 | | :------ | :------ | :------ |
194 | | `params` | [`GetTestAccountParams`](../interfaces/types_testing.GetTestAccountParams.md) | The config for the test account to generate |
195 | | `algorand` | [`AlgorandClient`](../classes/types_algorand_client.AlgorandClient.md) | An AlgorandClient client |
196 | 
197 | #### Returns
198 | 
199 | `Promise`\<`Address` & `Account` & [`TransactionSignerAccount`](../interfaces/types_account.TransactionSignerAccount.md)\>
200 | 
201 | The account, with private key loaded
202 | 
203 | #### Defined in
204 | 
205 | [src/testing/account.ts:35](https://github.com/algorandfoundation/algokit-utils-ts/blob/main/src/testing/account.ts#L35)
206 | 
207 | ___
208 | 
209 | ### runWhenIndexerCaughtUp
210 | 
211 | ▸ **runWhenIndexerCaughtUp**\<`T`\>(`run`): `Promise`\<`T`\>
212 | 
213 | Runs the given indexer call until a 404 error is no longer returned.
214 | Tried every 200ms up to 100 times.
215 | Very rudimentary implementation designed for automated testing.
216 | 
217 | #### Type parameters
218 | 
219 | | Name |
220 | | :------ |
221 | | `T` |
222 | 
223 | #### Parameters
224 | 
225 | | Name | Type | Description |
226 | | :------ | :------ | :------ |
227 | | `run` | () => `Promise`\<`T`\> | The code to run |
228 | 
229 | #### Returns
230 | 
231 | `Promise`\<`T`\>
232 | 
233 | The result (as a promise), or throws if the indexer didn't catch up in time
234 | 
235 | **`Example`**
236 | 
237 | ```typescript
238 | const transaction = await runWhenIndexerCaughtUp(() => indexer.lookupTransactionByID(txnId).do())
239 | ```
240 | 
241 | #### Defined in
242 | 
243 | [src/testing/indexer.ts:12](https://github.com/algorandfoundation/algokit-utils-ts/blob/main/src/testing/indexer.ts#L12)
244 | 
```

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

```typescript
  1 | import { McpError, ErrorCode } from '@modelcontextprotocol/sdk/types.js';
  2 | import { 
  3 |   applicationResources,
  4 |   applicationResourceSchemas,
  5 |   lookupApplications,
  6 |   lookupApplicationLogs,
  7 |   searchForApplications,
  8 |   handleApplicationResources
  9 | } from '../../../src/resources/indexer/application.js';
 10 | import { indexerClient } from '../../../src/algorand-client.js';
 11 | 
 12 | // Mock algosdk client
 13 | jest.mock('../../../src/algorand-client.js', () => ({
 14 |   indexerClient: {
 15 |     lookupApplications: jest.fn(),
 16 |     lookupApplicationLogs: jest.fn(),
 17 |     searchForApplications: jest.fn()
 18 |   },
 19 |   API_URIS: {
 20 |     APPLICATION_STATE: 'algorand://app/{app-id}/state'
 21 |   }
 22 | }));
 23 | 
 24 | describe('Indexer Application Resources', () => {
 25 |   beforeEach(() => {
 26 |     jest.clearAllMocks();
 27 |   });
 28 | 
 29 |   describe('Resource Definitions', () => {
 30 |     it('should define application resources', () => {
 31 |       expect(applicationResources).toHaveLength(1);
 32 |       expect(applicationResources[0].name).toBe('Application State');
 33 |     });
 34 | 
 35 |     it('should define resource schemas', () => {
 36 |       expect(Object.keys(applicationResourceSchemas)).toHaveLength(1);
 37 |       expect(applicationResourceSchemas).toHaveProperty('algorand://app/{app-id}/state');
 38 |     });
 39 |   });
 40 | 
 41 |   describe('Application Information', () => {
 42 |     const mockAppId = 123;
 43 |     const mockResponse = {
 44 |       application: {
 45 |         id: mockAppId,
 46 |         params: {
 47 |           creator: 'MOCK_ADDRESS',
 48 |           approvalProgram: 'base64...',
 49 |           clearStateProgram: 'base64...',
 50 |           globalState: []
 51 |         }
 52 |       },
 53 |       currentRound: 1234
 54 |     };
 55 | 
 56 |     beforeEach(() => {
 57 |       (indexerClient.lookupApplications as jest.Mock).mockReturnValue({
 58 |         do: jest.fn().mockResolvedValue(mockResponse)
 59 |       });
 60 |     });
 61 | 
 62 |     it('should fetch application information', async () => {
 63 |       const result = await lookupApplications(mockAppId);
 64 |       expect(result).toEqual(mockResponse);
 65 |       expect(indexerClient.lookupApplications).toHaveBeenCalledWith(mockAppId);
 66 |     });
 67 | 
 68 |     it('should handle errors', async () => {
 69 |       const error = new Error('Network error');
 70 |       (indexerClient.lookupApplications as jest.Mock).mockReturnValue({
 71 |         do: jest.fn().mockRejectedValue(error)
 72 |       });
 73 | 
 74 |       await expect(lookupApplications(mockAppId))
 75 |         .rejects
 76 |         .toThrow('Failed to get application info: Network error');
 77 |     });
 78 |   });
 79 | 
 80 |   describe('Application Logs', () => {
 81 |     const mockAppId = 123;
 82 |     const mockResponse = {
 83 |       logs: [{ txid: 'txn1', log: 'base64...' }],
 84 |       currentRound: 1234
 85 |     };
 86 | 
 87 |     beforeEach(() => {
 88 |       (indexerClient.lookupApplicationLogs as jest.Mock).mockReturnValue({
 89 |         limit: jest.fn().mockReturnThis(),
 90 |         minRound: jest.fn().mockReturnThis(),
 91 |         maxRound: jest.fn().mockReturnThis(),
 92 |         txid: jest.fn().mockReturnThis(),
 93 |         sender: jest.fn().mockReturnThis(),
 94 |         nextToken: jest.fn().mockReturnThis(),
 95 |         do: jest.fn().mockResolvedValue(mockResponse)
 96 |       });
 97 |     });
 98 | 
 99 |     it('should fetch application logs', async () => {
100 |       const result = await lookupApplicationLogs(mockAppId);
101 |       expect(result).toEqual(mockResponse);
102 |       expect(indexerClient.lookupApplicationLogs).toHaveBeenCalledWith(mockAppId);
103 |     });
104 | 
105 |     it('should handle search parameters', async () => {
106 |       const params = {
107 |         limit: 10,
108 |         minRound: 1000,
109 |         maxRound: 2000,
110 |         txid: 'txn1',
111 |         sender: 'addr1',
112 |         nextToken: 'token123'
113 |       };
114 | 
115 |       await lookupApplicationLogs(mockAppId, params);
116 |       const mock = indexerClient.lookupApplicationLogs as jest.Mock;
117 |       const chain = mock.mock.results[0].value;
118 | 
119 |       expect(chain.limit).toHaveBeenCalledWith(params.limit);
120 |       expect(chain.minRound).toHaveBeenCalledWith(params.minRound);
121 |       expect(chain.maxRound).toHaveBeenCalledWith(params.maxRound);
122 |       expect(chain.txid).toHaveBeenCalledWith(params.txid);
123 |       expect(chain.sender).toHaveBeenCalledWith(params.sender);
124 |       expect(chain.nextToken).toHaveBeenCalledWith(params.nextToken);
125 |     });
126 | 
127 |     it('should handle errors', async () => {
128 |       const error = new Error('Network error');
129 |       (indexerClient.lookupApplicationLogs as jest.Mock).mockReturnValue({
130 |         do: jest.fn().mockRejectedValue(error)
131 |       });
132 | 
133 |       await expect(lookupApplicationLogs(mockAppId))
134 |         .rejects
135 |         .toThrow('Failed to get application logs: Network error');
136 |     });
137 |   });
138 | 
139 |   describe('Search Applications', () => {
140 |     const mockResponse = {
141 |       applications: [{ id: 1, params: { creator: 'addr1' } }],
142 |       currentRound: 1234
143 |     };
144 | 
145 |     beforeEach(() => {
146 |       (indexerClient.searchForApplications as jest.Mock).mockReturnValue({
147 |         limit: jest.fn().mockReturnThis(),
148 |         creator: jest.fn().mockReturnThis(),
149 |         nextToken: jest.fn().mockReturnThis(),
150 |         do: jest.fn().mockResolvedValue(mockResponse)
151 |       });
152 |     });
153 | 
154 |     it('should search applications', async () => {
155 |       const result = await searchForApplications();
156 |       expect(result).toEqual(mockResponse);
157 |       expect(indexerClient.searchForApplications).toHaveBeenCalled();
158 |     });
159 | 
160 |     it('should handle search parameters', async () => {
161 |       const params = {
162 |         limit: 10,
163 |         creator: 'addr1',
164 |         nextToken: 'token123'
165 |       };
166 | 
167 |       await searchForApplications(params);
168 |       const mock = indexerClient.searchForApplications as jest.Mock;
169 |       const chain = mock.mock.results[0].value;
170 | 
171 |       expect(chain.limit).toHaveBeenCalledWith(params.limit);
172 |       expect(chain.creator).toHaveBeenCalledWith(params.creator);
173 |       expect(chain.nextToken).toHaveBeenCalledWith(params.nextToken);
174 |     });
175 | 
176 |     it('should handle errors', async () => {
177 |       const error = new Error('Network error');
178 |       (indexerClient.searchForApplications as jest.Mock).mockReturnValue({
179 |         do: jest.fn().mockRejectedValue(error)
180 |       });
181 | 
182 |       await expect(searchForApplications())
183 |         .rejects
184 |         .toThrow('Failed to search applications: Network error');
185 |     });
186 |   });
187 | 
188 |   describe('Resource Handler', () => {
189 |     const mockAppId = 123;
190 |     const mockResponse = {
191 |       application: {
192 |         id: mockAppId,
193 |         params: {
194 |           creator: 'MOCK_ADDRESS',
195 |           globalState: []
196 |         }
197 |       },
198 |       currentRound: 1234
199 |     };
200 | 
201 |     beforeEach(() => {
202 |       (indexerClient.lookupApplications as jest.Mock).mockReturnValue({
203 |         do: jest.fn().mockResolvedValue(mockResponse)
204 |       });
205 |     });
206 | 
207 |     it('should handle application state URI', async () => {
208 |       const uri = `algorand://app/${mockAppId}/state`;
209 |       const result = await handleApplicationResources(uri);
210 |       expect(result).toHaveLength(1);
211 |       expect(JSON.parse(result[0].text)).toHaveProperty('application');
212 |       expect(JSON.parse(result[0].text)).toHaveProperty('currentRound');
213 |     });
214 | 
215 |     it('should return empty array for unknown URI', async () => {
216 |       const uri = 'algorand://unknown';
217 |       const result = await handleApplicationResources(uri);
218 |       expect(result).toHaveLength(0);
219 |     });
220 | 
221 |     it('should handle errors with McpError', async () => {
222 |       const error = new Error('Network error');
223 |       (indexerClient.lookupApplications as jest.Mock).mockReturnValue({
224 |         do: jest.fn().mockRejectedValue(error)
225 |       });
226 | 
227 |       const uri = `algorand://app/${mockAppId}/state`;
228 |       await expect(handleApplicationResources(uri))
229 |         .rejects
230 |         .toThrow(new McpError(ErrorCode.InternalError, 'Network error'));
231 |     });
232 |   });
233 | });
234 | 
```

--------------------------------------------------------------------------------
/packages/server/src/resources/knowledge/taxonomy/developer:docs:details:dapps:smart-contracts:ABI:index.md:
--------------------------------------------------------------------------------

```markdown
  1 | title: ABI details
  2 | 
  3 | 
  4 | The ABI (Application Binary Interface) is a specification that defines the encoding/decoding of data types and a standard for exposing and invoking methods in a smart contract.
  5 | 
  6 | The specification is defined in [ARC4](https://github.com/algorandfoundation/ARCs/blob/main/ARCs/arc-0004.md).
  7 | 
  8 | At a high level, the ABI allows contracts to define an API with rich types and offer an interface description so clients know exactly what the contract is expecting to be passed. 
  9 | 
 10 | To encode or decode ABI types with the SDKs, see the [ABI encoding and decoding](../../../encoding.md#abi-encoding) documentation.
 11 | 
 12 | !!! note
 13 |     When constructing Application Call transactions that are expected to encode arguments, using the [Atomic Transaction Composer](../../../atc.md) is recommended.
 14 | 
 15 | # Data Types
 16 | 
 17 | Encoding for the data types is specified [here](https://github.com/algorandfoundation/ARCs/blob/main/ARCs/arc-0004.md#encoding).
 18 | 
 19 | The data types specified are:
 20 | 
 21 | | Type | Description | 
 22 | | ---- | ----------- |
 23 | |uintN| An N-bit unsigned integer, where 8 <= N <= 512 and N % 8 = 0|
 24 | |byte| An alias for uint8|
 25 | |bool| A boolean value that is restricted to either 0 or 1. When encoded, up to 8 consecutive bool values will be packed into a single byte|
 26 | |ufixedNxM| An N-bit unsigned fixed-point decimal number with precision M, where 8 <= N <= 512, N % 8 = 0, and 0 < M <= 160, which denotes a value v as v / (10^M)|
 27 | |type[N]| A fixed-length array of length N, where N >= 0. type can be any other type|
 28 | |address| Used to represent a 32-byte Algorand address. This is equivalent to byte[32]|
 29 | |type[]| A variable-length array. type can be any other type|
 30 | |string| A variable-length byte array (byte[]) assumed to contain UTF-8 encoded content|
 31 | |(T1,T2,...,TN)| A tuple of the types T1, T2, …, TN, N >= 0|
 32 | |reference type | account, asset, application only for arguments, in which case they are an alias for uint8. See section "Reference Types" below|
 33 | 
 34 | The encoding and decoding of these types should be handled by the SDKs for calling methods and reading out return values.  
 35 | 
 36 | Because stack types in the AVM are limited to uint64 and bytes, a smart contract may rely on ABI types defined in PyTeal to encode or decode the data passed in the application args. 
 37 | 
 38 | ## Reference Types
 39 | 
 40 | Reference types may be specified in the method signature referring to some transaction parameters that must be passed.  The value encoded is a uint8 reference to the index of element in the relevant array (i.e. for account, the index in the foreign accounts array).
 41 | 
 42 | 
 43 | # Methods
 44 | 
 45 | Methods may be exposed by the smart contract and called by submitting an ApplicationCall transaction to the existing application id. 
 46 | 
 47 | A *method signature* is defined as a name, argument types, and return type. The stringified version is then hashed and the first 4 bytes are taken as a *method selector*.
 48 | 
 49 | For example:
 50 | 
 51 | A *method signature* for an `add` method that takes 2 uint64s and returns 1 uint128:
 52 | ```
 53 | Method signature: add(uint64,uint64)uint128
 54 | ```
 55 | 
 56 | The string version of the *method signature* is hashed and the first 4 bytes are its *method selector*:
 57 | ```
 58 | SHA-512/256 hash (in hex): 8aa3b61f0f1965c3a1cbfa91d46b24e54c67270184ff89dc114e877b1753254a
 59 | Method selector (in hex): 8aa3b61f
 60 | ```
 61 | 
 62 | Once the method selector is known, it is used in the smart contract logic to route to the appropriate logic that implements the `add` method. 
 63 | 
 64 | The `method` pseudo-opcode can be used in a contract to do the above work and produce a *method selector* given the *method signature* string.
 65 | 
 66 | ```
 67 | method "add(uint64,uint64)uint128"
 68 | ```
 69 | 
 70 | ## Implementing a method
 71 | 
 72 | [Implementing a method](https://github.com/algorandfoundation/ARCs/blob/main/ARCs/arc-0004.md#implementing-a-method) is done by handling an ApplicationCall transaction where the first element matches its method selector and the subsequent elements are used by the logic in the method body.
 73 | 
 74 | The initial handling logic of the contract should route to the correct method given a match against the method selector passed and the known method selector of the application method.
 75 | 
 76 | The return value of the method _must_ be logged with the prefix `151f7c75` which is the result of `sha256("return")[:4]`.  Only the last logged element with this prefix is considered the return value of this method call.
 77 | 
 78 | 
 79 | # API
 80 | 
 81 | The API of a smart contract can be published as an [interface description object](https://github.com/algorandfoundation/ARCs/blob/main/ARCs/arc-0004.md#interface-description). A user may read this object and instantiate a client that handles the encoding/decoding of the arguments and returns values using one of the SDKs.
 82 | 
 83 | 
 84 | A full example of a contract json file might look like:
 85 | ```json
 86 | {
 87 |     "name":"super-awesome-contract",
 88 |     "networks":{
 89 |         "MainNet":{
 90 |             "appID": 123456
 91 |         }
 92 |     },
 93 |     "methods":[
 94 |         {
 95 |             "name":"add",
 96 |             "desc":"Add 2 integers",
 97 |             "args":[ { "type":"uint64" }, { "type":"uint64" } ],
 98 |             "returns": {"type":"uint64"}
 99 |         },
100 |         {
101 |             "name":"sub",
102 |             "desc":"Subtract 2 integers",
103 |             "args":[ { "type":"uint64" }, { "type":"uint64" } ],
104 |             "returns": {"type":"uint64"}
105 |         },
106 |         {
107 |             "name":"mul",
108 |             "desc":"Multiply 2 integers",
109 |             "args":[ { "type":"uint64" }, { "type":"uint64" } ],
110 |             "returns": {"type":"uint64"}
111 |         },
112 |         {
113 |             "name":"div",
114 |             "desc":"Divide 2 integers, throw away the remainder",
115 |             "args":[ { "type":"uint64" }, { "type":"uint64" } ],
116 |             "returns": {"type":"uint64"}
117 |         },
118 |         {
119 |             "name":"qrem",
120 |             "desc":"Divide 2 integers, return both the quotient and remainder",
121 |             "args":[ { "type":"uint64" }, { "type":"uint64" } ],
122 |             "returns": {"type":"(uint64,uint64)"}
123 |         },
124 |         {
125 |             "name":"reverse",
126 |             "desc":"Reverses a string",
127 |             "args":[ { "type":"string" } ],
128 |             "returns": {"type":"string"}
129 |         },
130 |         {
131 |             "name":"txntest",
132 |             "desc":"just check it",
133 |             "args":[{"type":"uint64"}, {"type": "pay"}, {"type":"uint64"}],
134 |             "returns":{"type": "uint64"}
135 |         },
136 |         {
137 |             "name":"concat_strings",
138 |             "desc":"concat some strings",
139 |             "args":[{"type":"string[]"}],
140 |             "returns":{"type": "string"}
141 |         },
142 |         {
143 |             "name":"manyargs",
144 |             "desc":"Try to send 20 arguments",
145 |             "args":[
146 |                 {"type":"uint64"}, {"type": "uint64"}, {"type":"uint64"},{"type":"uint64"},
147 |                 {"type":"uint64"}, {"type": "uint64"}, {"type":"uint64"},{"type":"uint64"},
148 |                 {"type":"uint64"}, {"type": "uint64"}, {"type":"uint64"},{"type":"uint64"},
149 |                 {"type":"uint64"}, {"type": "uint64"}, {"type":"uint64"},{"type":"uint64"},
150 |                 {"type":"uint64"}, {"type": "uint64"}, {"type":"uint64"},{"type":"uint64"}
151 |             ],
152 |             "returns":{"type": "uint64"}
153 |         },
154 |         {
155 |             "name":"min_bal",
156 |             "desc":"Get the minimum balance for given account",
157 |             "args":[
158 |                 {"type":"account"}
159 |             ],
160 |             "returns":{"type":"uint64"}
161 |         },
162 |         {
163 |             "name":"tupler",
164 |             "desc":"",
165 |             "args":[
166 |                 {"type":"(string,uint64,string)"}
167 |             ],
168 |             "returns":{"type":"uint64"}
169 |         }
170 |     ]
171 | }
172 | ```
173 | 
```

--------------------------------------------------------------------------------
/packages/server/src/resources/knowledge/taxonomy/SDKs:javascript:interfaces:EncodedTransaction.md:
--------------------------------------------------------------------------------

```markdown
  1 | [algosdk](../README.md) / [Exports](../modules.md) / EncodedTransaction
  2 | 
  3 | # Interface: EncodedTransaction
  4 | 
  5 | A rough structure for the encoded transaction object. Every property is labelled with its associated Transaction type property
  6 | 
  7 | ## Table of contents
  8 | 
  9 | ### Properties
 10 | 
 11 | - [aamt](EncodedTransaction.md#aamt)
 12 | - [aclose](EncodedTransaction.md#aclose)
 13 | - [afrz](EncodedTransaction.md#afrz)
 14 | - [amt](EncodedTransaction.md#amt)
 15 | - [apaa](EncodedTransaction.md#apaa)
 16 | - [apan](EncodedTransaction.md#apan)
 17 | - [apap](EncodedTransaction.md#apap)
 18 | - [apar](EncodedTransaction.md#apar)
 19 | - [apas](EncodedTransaction.md#apas)
 20 | - [apat](EncodedTransaction.md#apat)
 21 | - [apbx](EncodedTransaction.md#apbx)
 22 | - [apep](EncodedTransaction.md#apep)
 23 | - [apfa](EncodedTransaction.md#apfa)
 24 | - [apgs](EncodedTransaction.md#apgs)
 25 | - [apid](EncodedTransaction.md#apid)
 26 | - [apls](EncodedTransaction.md#apls)
 27 | - [apsu](EncodedTransaction.md#apsu)
 28 | - [arcv](EncodedTransaction.md#arcv)
 29 | - [asnd](EncodedTransaction.md#asnd)
 30 | - [caid](EncodedTransaction.md#caid)
 31 | - [close](EncodedTransaction.md#close)
 32 | - [fadd](EncodedTransaction.md#fadd)
 33 | - [faid](EncodedTransaction.md#faid)
 34 | - [fee](EncodedTransaction.md#fee)
 35 | - [fv](EncodedTransaction.md#fv)
 36 | - [gen](EncodedTransaction.md#gen)
 37 | - [gh](EncodedTransaction.md#gh)
 38 | - [grp](EncodedTransaction.md#grp)
 39 | - [lv](EncodedTransaction.md#lv)
 40 | - [lx](EncodedTransaction.md#lx)
 41 | - [nonpart](EncodedTransaction.md#nonpart)
 42 | - [note](EncodedTransaction.md#note)
 43 | - [rcv](EncodedTransaction.md#rcv)
 44 | - [rekey](EncodedTransaction.md#rekey)
 45 | - [selkey](EncodedTransaction.md#selkey)
 46 | - [snd](EncodedTransaction.md#snd)
 47 | - [sp](EncodedTransaction.md#sp)
 48 | - [spmsg](EncodedTransaction.md#spmsg)
 49 | - [sprfkey](EncodedTransaction.md#sprfkey)
 50 | - [sptype](EncodedTransaction.md#sptype)
 51 | - [type](EncodedTransaction.md#type)
 52 | - [votefst](EncodedTransaction.md#votefst)
 53 | - [votekd](EncodedTransaction.md#votekd)
 54 | - [votekey](EncodedTransaction.md#votekey)
 55 | - [votelst](EncodedTransaction.md#votelst)
 56 | - [xaid](EncodedTransaction.md#xaid)
 57 | 
 58 | ## Properties
 59 | 
 60 | ### aamt
 61 | 
 62 | • `Optional` **aamt**: `number` \| `bigint`
 63 | 
 64 | amount (but for asset transfers)
 65 | 
 66 | #### Defined in
 67 | 
 68 | types/transactions/encoded.ts:162
 69 | 
 70 | ___
 71 | 
 72 | ### aclose
 73 | 
 74 | • `Optional` **aclose**: `Buffer`
 75 | 
 76 | closeRemainderTo (but for asset transfers)
 77 | 
 78 | #### Defined in
 79 | 
 80 | types/transactions/encoded.ts:172
 81 | 
 82 | ___
 83 | 
 84 | ### afrz
 85 | 
 86 | • `Optional` **afrz**: `boolean`
 87 | 
 88 | freezeState
 89 | 
 90 | #### Defined in
 91 | 
 92 | types/transactions/encoded.ts:242
 93 | 
 94 | ___
 95 | 
 96 | ### amt
 97 | 
 98 | • `Optional` **amt**: `number` \| `bigint`
 99 | 
100 | amount
101 | 
102 | #### Defined in
103 | 
104 | types/transactions/encoded.ts:157
105 | 
106 | ___
107 | 
108 | ### apaa
109 | 
110 | • `Optional` **apaa**: `Buffer`[]
111 | 
112 | appArgs
113 | 
114 | #### Defined in
115 | 
116 | types/transactions/encoded.ts:302
117 | 
118 | ___
119 | 
120 | ### apan
121 | 
122 | • `Optional` **apan**: `number`
123 | 
124 | appOnComplete
125 | 
126 | #### Defined in
127 | 
128 | types/transactions/encoded.ts:267
129 | 
130 | ___
131 | 
132 | ### apap
133 | 
134 | • `Optional` **apap**: `Buffer`
135 | 
136 | appApprovalProgram
137 | 
138 | #### Defined in
139 | 
140 | types/transactions/encoded.ts:292
141 | 
142 | ___
143 | 
144 | ### apar
145 | 
146 | • `Optional` **apar**: [`EncodedAssetParams`](EncodedAssetParams.md)
147 | 
148 | See EncodedAssetParams type
149 | 
150 | #### Defined in
151 | 
152 | types/transactions/encoded.ts:257
153 | 
154 | ___
155 | 
156 | ### apas
157 | 
158 | • `Optional` **apas**: `number`[]
159 | 
160 | appForeignAssets
161 | 
162 | #### Defined in
163 | 
164 | types/transactions/encoded.ts:287
165 | 
166 | ___
167 | 
168 | ### apat
169 | 
170 | • `Optional` **apat**: `Buffer`[]
171 | 
172 | appAccounts
173 | 
174 | #### Defined in
175 | 
176 | types/transactions/encoded.ts:307
177 | 
178 | ___
179 | 
180 | ### apbx
181 | 
182 | • `Optional` **apbx**: [`EncodedBoxReference`](EncodedBoxReference.md)[]
183 | 
184 | boxes
185 | 
186 | #### Defined in
187 | 
188 | types/transactions/encoded.ts:317
189 | 
190 | ___
191 | 
192 | ### apep
193 | 
194 | • `Optional` **apep**: `number`
195 | 
196 | extraPages
197 | 
198 | #### Defined in
199 | 
200 | types/transactions/encoded.ts:312
201 | 
202 | ___
203 | 
204 | ### apfa
205 | 
206 | • `Optional` **apfa**: `number`[]
207 | 
208 | appForeignApps
209 | 
210 | #### Defined in
211 | 
212 | types/transactions/encoded.ts:282
213 | 
214 | ___
215 | 
216 | ### apgs
217 | 
218 | • `Optional` **apgs**: [`EncodedGlobalStateSchema`](EncodedGlobalStateSchema.md)
219 | 
220 | See EncodedGlobalStateSchema type
221 | 
222 | #### Defined in
223 | 
224 | types/transactions/encoded.ts:277
225 | 
226 | ___
227 | 
228 | ### apid
229 | 
230 | • `Optional` **apid**: `number`
231 | 
232 | appIndex
233 | 
234 | #### Defined in
235 | 
236 | types/transactions/encoded.ts:262
237 | 
238 | ___
239 | 
240 | ### apls
241 | 
242 | • `Optional` **apls**: [`EncodedLocalStateSchema`](EncodedLocalStateSchema.md)
243 | 
244 | See EncodedLocalStateSchema type
245 | 
246 | #### Defined in
247 | 
248 | types/transactions/encoded.ts:272
249 | 
250 | ___
251 | 
252 | ### apsu
253 | 
254 | • `Optional` **apsu**: `Buffer`
255 | 
256 | appClearProgram
257 | 
258 | #### Defined in
259 | 
260 | types/transactions/encoded.ts:297
261 | 
262 | ___
263 | 
264 | ### arcv
265 | 
266 | • `Optional` **arcv**: `Buffer`
267 | 
268 | to (but for asset transfers)
269 | 
270 | #### Defined in
271 | 
272 | types/transactions/encoded.ts:187
273 | 
274 | ___
275 | 
276 | ### asnd
277 | 
278 | • `Optional` **asnd**: `Buffer`
279 | 
280 | assetRevocationTarget
281 | 
282 | #### Defined in
283 | 
284 | types/transactions/encoded.ts:252
285 | 
286 | ___
287 | 
288 | ### caid
289 | 
290 | • `Optional` **caid**: `number`
291 | 
292 | assetIndex
293 | 
294 | #### Defined in
295 | 
296 | types/transactions/encoded.ts:227
297 | 
298 | ___
299 | 
300 | ### close
301 | 
302 | • `Optional` **close**: `Buffer`
303 | 
304 | closeRemainderTo
305 | 
306 | #### Defined in
307 | 
308 | types/transactions/encoded.ts:167
309 | 
310 | ___
311 | 
312 | ### fadd
313 | 
314 | • `Optional` **fadd**: `Buffer`
315 | 
316 | freezeAccount
317 | 
318 | #### Defined in
319 | 
320 | types/transactions/encoded.ts:247
321 | 
322 | ___
323 | 
324 | ### faid
325 | 
326 | • `Optional` **faid**: `number`
327 | 
328 | assetIndex (but for asset freezing/unfreezing)
329 | 
330 | #### Defined in
331 | 
332 | types/transactions/encoded.ts:237
333 | 
334 | ___
335 | 
336 | ### fee
337 | 
338 | • `Optional` **fee**: `number`
339 | 
340 | fee
341 | 
342 | #### Defined in
343 | 
344 | types/transactions/encoded.ts:107
345 | 
346 | ___
347 | 
348 | ### fv
349 | 
350 | • `Optional` **fv**: `number`
351 | 
352 | firstRound
353 | 
354 | #### Defined in
355 | 
356 | types/transactions/encoded.ts:112
357 | 
358 | ___
359 | 
360 | ### gen
361 | 
362 | • **gen**: `string`
363 | 
364 | genesisID
365 | 
366 | #### Defined in
367 | 
368 | types/transactions/encoded.ts:137
369 | 
370 | ___
371 | 
372 | ### gh
373 | 
374 | • **gh**: `Buffer`
375 | 
376 | genesisHash
377 | 
378 | #### Defined in
379 | 
380 | types/transactions/encoded.ts:142
381 | 
382 | ___
383 | 
384 | ### grp
385 | 
386 | • `Optional` **grp**: `Buffer`
387 | 
388 | group
389 | 
390 | #### Defined in
391 | 
392 | types/transactions/encoded.ts:152
393 | 
394 | ___
395 | 
396 | ### lv
397 | 
398 | • **lv**: `number`
399 | 
400 | lastRound
401 | 
402 | #### Defined in
403 | 
404 | types/transactions/encoded.ts:117
405 | 
406 | ___
407 | 
408 | ### lx
409 | 
410 | • `Optional` **lx**: `Buffer`
411 | 
412 | lease
413 | 
414 | #### Defined in
415 | 
416 | types/transactions/encoded.ts:147
417 | 
418 | ___
419 | 
420 | ### nonpart
421 | 
422 | • `Optional` **nonpart**: `boolean`
423 | 
424 | nonParticipation
425 | 
426 | #### Defined in
427 | 
428 | types/transactions/encoded.ts:222
429 | 
430 | ___
431 | 
432 | ### note
433 | 
434 | • `Optional` **note**: `Buffer`
435 | 
436 | note
437 | 
438 | #### Defined in
439 | 
440 | types/transactions/encoded.ts:122
441 | 
442 | ___
443 | 
444 | ### rcv
445 | 
446 | • `Optional` **rcv**: `Buffer`
447 | 
448 | to
449 | 
450 | #### Defined in
451 | 
452 | types/transactions/encoded.ts:182
453 | 
454 | ___
455 | 
456 | ### rekey
457 | 
458 | • `Optional` **rekey**: `Buffer`
459 | 
460 | reKeyTo
461 | 
462 | #### Defined in
463 | 
464 | types/transactions/encoded.ts:177
465 | 
466 | ___
467 | 
468 | ### selkey
469 | 
470 | • `Optional` **selkey**: `Buffer`
471 | 
472 | selectionKey
473 | 
474 | #### Defined in
475 | 
476 | types/transactions/encoded.ts:197
477 | 
478 | ___
479 | 
480 | ### snd
481 | 
482 | • **snd**: `Buffer`
483 | 
484 | from
485 | 
486 | #### Defined in
487 | 
488 | types/transactions/encoded.ts:127
489 | 
490 | ___
491 | 
492 | ### sp
493 | 
494 | • `Optional` **sp**: `Buffer`
495 | 
496 | stateProof
497 | 
498 | #### Defined in
499 | 
500 | types/transactions/encoded.ts:327
501 | 
502 | ___
503 | 
504 | ### spmsg
505 | 
506 | • `Optional` **spmsg**: `Buffer`
507 | 
508 | stateProofMessage
509 | 
510 | #### Defined in
511 | 
512 | types/transactions/encoded.ts:332
513 | 
514 | ___
515 | 
516 | ### sprfkey
517 | 
518 | • `Optional` **sprfkey**: `Buffer`
519 | 
520 | stateProofKey
521 | 
522 | #### Defined in
523 | 
524 | types/transactions/encoded.ts:202
525 | 
526 | ___
527 | 
528 | ### sptype
529 | 
530 | • `Optional` **sptype**: `number` \| `bigint`
531 | 
532 | #### Defined in
533 | 
534 | types/transactions/encoded.ts:322
535 | 
536 | ___
537 | 
538 | ### type
539 | 
540 | • **type**: `string`
541 | 
542 | type
543 | 
544 | #### Defined in
545 | 
546 | types/transactions/encoded.ts:132
547 | 
548 | ___
549 | 
550 | ### votefst
551 | 
552 | • `Optional` **votefst**: `number`
553 | 
554 | voteFirst
555 | 
556 | #### Defined in
557 | 
558 | types/transactions/encoded.ts:207
559 | 
560 | ___
561 | 
562 | ### votekd
563 | 
564 | • `Optional` **votekd**: `number`
565 | 
566 | voteKeyDilution
567 | 
568 | #### Defined in
569 | 
570 | types/transactions/encoded.ts:217
571 | 
572 | ___
573 | 
574 | ### votekey
575 | 
576 | • `Optional` **votekey**: `Buffer`
577 | 
578 | voteKey
579 | 
580 | #### Defined in
581 | 
582 | types/transactions/encoded.ts:192
583 | 
584 | ___
585 | 
586 | ### votelst
587 | 
588 | • `Optional` **votelst**: `number`
589 | 
590 | voteLast
591 | 
592 | #### Defined in
593 | 
594 | types/transactions/encoded.ts:212
595 | 
596 | ___
597 | 
598 | ### xaid
599 | 
600 | • `Optional` **xaid**: `number`
601 | 
602 | assetIndex (but for asset transfers)
603 | 
604 | #### Defined in
605 | 
606 | types/transactions/encoded.ts:232
607 | 
```

--------------------------------------------------------------------------------
/packages/server/src/resources/knowledge/taxonomy/algokit:utils:typescript:code:interfaces:types_app.CreateAppParams.md:
--------------------------------------------------------------------------------

```markdown
  1 | [@algorandfoundation/algokit-utils](../README.md) / [types/app](../modules/types_app.md) / CreateAppParams
  2 | 
  3 | # Interface: CreateAppParams
  4 | 
  5 | [types/app](../modules/types_app.md).CreateAppParams
  6 | 
  7 | **`Deprecated`**
  8 | 
  9 | Use `TransactionComposer` to construct create app transactions instead.
 10 | 
 11 | Parameters that are passed in when creating an app.
 12 | 
 13 | ## Hierarchy
 14 | 
 15 | - `CreateOrUpdateAppParams`
 16 | 
 17 |   ↳ **`CreateAppParams`**
 18 | 
 19 | ## Table of contents
 20 | 
 21 | ### Properties
 22 | 
 23 | - [approvalProgram](types_app.CreateAppParams.md#approvalprogram)
 24 | - [args](types_app.CreateAppParams.md#args)
 25 | - [atc](types_app.CreateAppParams.md#atc)
 26 | - [clearStateProgram](types_app.CreateAppParams.md#clearstateprogram)
 27 | - [fee](types_app.CreateAppParams.md#fee)
 28 | - [from](types_app.CreateAppParams.md#from)
 29 | - [maxFee](types_app.CreateAppParams.md#maxfee)
 30 | - [maxRoundsToWaitForConfirmation](types_app.CreateAppParams.md#maxroundstowaitforconfirmation)
 31 | - [note](types_app.CreateAppParams.md#note)
 32 | - [onCompleteAction](types_app.CreateAppParams.md#oncompleteaction)
 33 | - [populateAppCallResources](types_app.CreateAppParams.md#populateappcallresources)
 34 | - [schema](types_app.CreateAppParams.md#schema)
 35 | - [skipSending](types_app.CreateAppParams.md#skipsending)
 36 | - [skipWaiting](types_app.CreateAppParams.md#skipwaiting)
 37 | - [suppressLog](types_app.CreateAppParams.md#suppresslog)
 38 | - [transactionParams](types_app.CreateAppParams.md#transactionparams)
 39 | 
 40 | ## Properties
 41 | 
 42 | ### approvalProgram
 43 | 
 44 | • **approvalProgram**: `string` \| `Uint8Array`
 45 | 
 46 | The approval program as raw teal (string) or compiled teal, base 64 encoded as a byte array (Uint8Array)
 47 | 
 48 | #### Inherited from
 49 | 
 50 | CreateOrUpdateAppParams.approvalProgram
 51 | 
 52 | #### Defined in
 53 | 
 54 | [src/types/app.ts:135](https://github.com/algorandfoundation/algokit-utils-ts/blob/main/src/types/app.ts#L135)
 55 | 
 56 | ___
 57 | 
 58 | ### args
 59 | 
 60 | • `Optional` **args**: [`AppCallArgs`](../modules/types_app.md#appcallargs)
 61 | 
 62 | The arguments passed in to the app call
 63 | 
 64 | #### Inherited from
 65 | 
 66 | CreateOrUpdateAppParams.args
 67 | 
 68 | #### Defined in
 69 | 
 70 | [src/types/app.ts:143](https://github.com/algorandfoundation/algokit-utils-ts/blob/main/src/types/app.ts#L143)
 71 | 
 72 | ___
 73 | 
 74 | ### atc
 75 | 
 76 | • `Optional` **atc**: `AtomicTransactionComposer`
 77 | 
 78 | An optional `AtomicTransactionComposer` to add the transaction to, if specified then `skipSending: undefined` has the same effect as `skipSending: true`
 79 | 
 80 | #### Inherited from
 81 | 
 82 | CreateOrUpdateAppParams.atc
 83 | 
 84 | #### Defined in
 85 | 
 86 | [src/types/transaction.ts:36](https://github.com/algorandfoundation/algokit-utils-ts/blob/main/src/types/transaction.ts#L36)
 87 | 
 88 | ___
 89 | 
 90 | ### clearStateProgram
 91 | 
 92 | • **clearStateProgram**: `string` \| `Uint8Array`
 93 | 
 94 | The clear state program as raw teal (string) or compiled teal, base 64 encoded as a byte array (Uint8Array)
 95 | 
 96 | #### Inherited from
 97 | 
 98 | CreateOrUpdateAppParams.clearStateProgram
 99 | 
100 | #### Defined in
101 | 
102 | [src/types/app.ts:137](https://github.com/algorandfoundation/algokit-utils-ts/blob/main/src/types/app.ts#L137)
103 | 
104 | ___
105 | 
106 | ### fee
107 | 
108 | • `Optional` **fee**: [`AlgoAmount`](../classes/types_amount.AlgoAmount.md)
109 | 
110 | The flat fee you want to pay, useful for covering extra fees in a transaction group or app call
111 | 
112 | #### Inherited from
113 | 
114 | CreateOrUpdateAppParams.fee
115 | 
116 | #### Defined in
117 | 
118 | [src/types/transaction.ts:40](https://github.com/algorandfoundation/algokit-utils-ts/blob/main/src/types/transaction.ts#L40)
119 | 
120 | ___
121 | 
122 | ### from
123 | 
124 | • **from**: [`SendTransactionFrom`](../modules/types_transaction.md#sendtransactionfrom)
125 | 
126 | The account (with private key loaded) that will send the transaction
127 | 
128 | #### Inherited from
129 | 
130 | CreateOrUpdateAppParams.from
131 | 
132 | #### Defined in
133 | 
134 | [src/types/app.ts:133](https://github.com/algorandfoundation/algokit-utils-ts/blob/main/src/types/app.ts#L133)
135 | 
136 | ___
137 | 
138 | ### maxFee
139 | 
140 | • `Optional` **maxFee**: [`AlgoAmount`](../classes/types_amount.AlgoAmount.md)
141 | 
142 | The maximum fee that you are happy to pay (default: unbounded) - if this is set it's possible the transaction could get rejected during network congestion
143 | 
144 | #### Inherited from
145 | 
146 | CreateOrUpdateAppParams.maxFee
147 | 
148 | #### Defined in
149 | 
150 | [src/types/transaction.ts:42](https://github.com/algorandfoundation/algokit-utils-ts/blob/main/src/types/transaction.ts#L42)
151 | 
152 | ___
153 | 
154 | ### maxRoundsToWaitForConfirmation
155 | 
156 | • `Optional` **maxRoundsToWaitForConfirmation**: `number`
157 | 
158 | The maximum number of rounds to wait for confirmation, only applies if `skipWaiting` is `undefined` or `false`, default: wait up to 5 rounds
159 | 
160 | #### Inherited from
161 | 
162 | CreateOrUpdateAppParams.maxRoundsToWaitForConfirmation
163 | 
164 | #### Defined in
165 | 
166 | [src/types/transaction.ts:44](https://github.com/algorandfoundation/algokit-utils-ts/blob/main/src/types/transaction.ts#L44)
167 | 
168 | ___
169 | 
170 | ### note
171 | 
172 | • `Optional` **note**: [`TransactionNote`](../modules/types_transaction.md#transactionnote)
173 | 
174 | The (optional) transaction note
175 | 
176 | #### Inherited from
177 | 
178 | CreateOrUpdateAppParams.note
179 | 
180 | #### Defined in
181 | 
182 | [src/types/app.ts:141](https://github.com/algorandfoundation/algokit-utils-ts/blob/main/src/types/app.ts#L141)
183 | 
184 | ___
185 | 
186 | ### onCompleteAction
187 | 
188 | • `Optional` **onCompleteAction**: ``"no_op"`` \| ``"opt_in"`` \| ``"close_out"`` \| ``"update_application"`` \| ``"delete_application"`` \| `NoOpOC` \| `OptInOC` \| `CloseOutOC` \| `UpdateApplicationOC` \| `DeleteApplicationOC`
189 | 
190 | Override the on-completion action for the create call; defaults to NoOp
191 | 
192 | #### Defined in
193 | 
194 | [src/types/app.ts:154](https://github.com/algorandfoundation/algokit-utils-ts/blob/main/src/types/app.ts#L154)
195 | 
196 | ___
197 | 
198 | ### populateAppCallResources
199 | 
200 | • `Optional` **populateAppCallResources**: `boolean`
201 | 
202 | Whether to use simulate to automatically populate app call resources in the txn objects. Defaults to true when there are app calls in the group.
203 | 
204 | #### Inherited from
205 | 
206 | CreateOrUpdateAppParams.populateAppCallResources
207 | 
208 | #### Defined in
209 | 
210 | [src/types/transaction.ts:46](https://github.com/algorandfoundation/algokit-utils-ts/blob/main/src/types/transaction.ts#L46)
211 | 
212 | ___
213 | 
214 | ### schema
215 | 
216 | • **schema**: [`AppStorageSchema`](types_app.AppStorageSchema.md)
217 | 
218 | The storage schema to request for the created app
219 | 
220 | #### Defined in
221 | 
222 | [src/types/app.ts:152](https://github.com/algorandfoundation/algokit-utils-ts/blob/main/src/types/app.ts#L152)
223 | 
224 | ___
225 | 
226 | ### skipSending
227 | 
228 | • `Optional` **skipSending**: `boolean`
229 | 
230 | Whether to skip signing and sending the transaction to the chain (default: transaction signed and sent to chain, unless `atc` specified)
231 | and instead just return the raw transaction, e.g. so you can add it to a group of transactions
232 | 
233 | #### Inherited from
234 | 
235 | CreateOrUpdateAppParams.skipSending
236 | 
237 | #### Defined in
238 | 
239 | [src/types/transaction.ts:32](https://github.com/algorandfoundation/algokit-utils-ts/blob/main/src/types/transaction.ts#L32)
240 | 
241 | ___
242 | 
243 | ### skipWaiting
244 | 
245 | • `Optional` **skipWaiting**: `boolean`
246 | 
247 | Whether to skip waiting for the submitted transaction (only relevant if `skipSending` is `false` or unset)
248 | 
249 | #### Inherited from
250 | 
251 | CreateOrUpdateAppParams.skipWaiting
252 | 
253 | #### Defined in
254 | 
255 | [src/types/transaction.ts:34](https://github.com/algorandfoundation/algokit-utils-ts/blob/main/src/types/transaction.ts#L34)
256 | 
257 | ___
258 | 
259 | ### suppressLog
260 | 
261 | • `Optional` **suppressLog**: `boolean`
262 | 
263 | Whether to suppress log messages from transaction send, default: do not suppress
264 | 
265 | #### Inherited from
266 | 
267 | CreateOrUpdateAppParams.suppressLog
268 | 
269 | #### Defined in
270 | 
271 | [src/types/transaction.ts:38](https://github.com/algorandfoundation/algokit-utils-ts/blob/main/src/types/transaction.ts#L38)
272 | 
273 | ___
274 | 
275 | ### transactionParams
276 | 
277 | • `Optional` **transactionParams**: `SuggestedParams`
278 | 
279 | Optional transaction parameters
280 | 
281 | #### Inherited from
282 | 
283 | CreateOrUpdateAppParams.transactionParams
284 | 
285 | #### Defined in
286 | 
287 | [src/types/app.ts:139](https://github.com/algorandfoundation/algokit-utils-ts/blob/main/src/types/app.ts#L139)
288 | 
```

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

```markdown
  1 | # AVM Types
  2 | 
  3 | These types are available directly under the `algopy` namespace. They represent the basic AVM primitive types and can be instantiated directly or via _value generators_:
  4 | 
  5 | ```{note}
  6 | For 'primitive `algopy` types such as `Account`, `Application`, `Asset`, `UInt64`, `BigUint`, `Bytes`, `Sting` with and without respective _value generator_, instantiation can be performed directly. If you have a suggestion for a new _value generator_ implementation, please open an issue in the [`algorand-python-testing`](https://github.com/algorandfoundation/algorand-python-testing) repository or contribute by following the [contribution guide](https://github.com/algorandfoundation/algorand-python-testing/blob/main/CONTRIBUTING.md).
  7 | ```
  8 | 
  9 | ```{testsetup}
 10 | import algopy
 11 | from algopy_testing import algopy_testing_context
 12 | 
 13 | # Create the context manager for snippets below
 14 | ctx_manager = algopy_testing_context()
 15 | 
 16 | # Enter the context
 17 | context = ctx_manager.__enter__()
 18 | ```
 19 | 
 20 | ## UInt64
 21 | 
 22 | ```{testcode}
 23 | # Direct instantiation
 24 | uint64_value = algopy.UInt64(100)
 25 | 
 26 | # Instantiate test context
 27 | ...
 28 | 
 29 | # Generate a random UInt64 value
 30 | random_uint64 = context.any.uint64()
 31 | 
 32 | # Specify a range
 33 | random_uint64 = context.any.uint64(min_value=1000, max_value=9999)
 34 | ```
 35 | 
 36 | ## Bytes
 37 | 
 38 | ```{testcode}
 39 | # Direct instantiation
 40 | bytes_value = algopy.Bytes(b"Hello, Algorand!")
 41 | 
 42 | 
 43 | # Instantiate test context
 44 | ...
 45 | 
 46 | # Generate random byte sequences
 47 | random_bytes = context.any.bytes()
 48 | 
 49 | # Specify the length
 50 | random_bytes = context.any.bytes(length=32)
 51 | ```
 52 | 
 53 | ## String
 54 | 
 55 | ```{testcode}
 56 | # Direct instantiation
 57 | string_value = algopy.String("Hello, Algorand!")
 58 | 
 59 | # Generate random strings
 60 | random_string = context.any.string()
 61 | 
 62 | # Specify the length
 63 | random_string = context.any.string(length=16)
 64 | ```
 65 | 
 66 | ## BigUInt
 67 | 
 68 | ```{testcode}
 69 | # Direct instantiation
 70 | biguint_value = algopy.BigUInt(100)
 71 | 
 72 | # Generate a random BigUInt value
 73 | random_biguint = context.any.biguint()
 74 | ```
 75 | 
 76 | ## Asset
 77 | 
 78 | ```{testcode}
 79 | # Direct instantiation
 80 | asset = algopy.Asset(asset_id=1001)
 81 | 
 82 | # Instantiate test context
 83 | ...
 84 | 
 85 | # Generate a random asset
 86 | random_asset = context.any.asset(
 87 |     creator=...,  # Optional: Creator account
 88 |     name=...,  # Optional: Asset name
 89 |     unit_name=...,  # Optional: Unit name
 90 |     total=...,  # Optional: Total supply
 91 |     decimals=...,  # Optional: Number of decimals
 92 |     default_frozen=...,  # Optional: Default frozen state
 93 |     url=...,  # Optional: Asset URL
 94 |     metadata_hash=...,  # Optional: Metadata hash
 95 |     manager=...,  # Optional: Manager address
 96 |     reserve=...,  # Optional: Reserve address
 97 |     freeze=...,  # Optional: Freeze address
 98 |     clawback=...  # Optional: Clawback address
 99 | )
100 | 
101 | # Get an asset by ID
102 | asset = context.ledger.get_asset(asset_id=random_asset.id)
103 | 
104 | # Update an asset
105 | context.ledger.update_asset(
106 |     random_asset,
107 |     name=...,  # Optional: New asset name
108 |     total=...,  # Optional: New total supply
109 |     decimals=...,  # Optional: Number of decimals
110 |     default_frozen=...,  # Optional: Default frozen state
111 |     url=...,  # Optional: New asset URL
112 |     metadata_hash=...,  # Optional: New metadata hash
113 |     manager=...,  # Optional: New manager address
114 |     reserve=...,  # Optional: New reserve address
115 |     freeze=...,  # Optional: New freeze address
116 |     clawback=...  # Optional: New clawback address
117 | )
118 | ```
119 | 
120 | ## Account
121 | 
122 | ```{testcode}
123 | # Direct instantiation
124 | raw_address = 'PUYAGEGVCOEBP57LUKPNOCSMRWHZJSU4S62RGC2AONDUEIHC6P7FOPJQ4I'
125 | account = algopy.Account(raw_address) # zero address by default
126 | 
127 | # Instantiate test context
128 | ...
129 | 
130 | # Generate a random account
131 | random_account = context.any.account(
132 |     address=str(raw_address),  # Optional: Specify a custom address, defaults to a random address
133 |     opted_asset_balances={},  # Optional: Specify opted asset balances as dict of assets to balance
134 |     opted_apps=[],  # Optional: Specify opted apps as sequence of algopy.Application objects
135 |     balance=...,  # Optional: Specify an initial balance
136 |     min_balance=...,  # Optional: Specify a minimum balance
137 |     auth_address=...,  # Optional: Specify an auth address
138 |     total_assets=...,  # Optional: Specify the total number of assets
139 |     total_assets_created=...,  # Optional: Specify the total number of created assets
140 |     total_apps_created=...,  # Optional: Specify the total number of created applications
141 |     total_apps_opted_in=...,  # Optional: Specify the total number of applications opted into
142 |     total_extra_app_pages=...,  # Optional: Specify the total number of extra
143 | )
144 | 
145 | # Generate a random account that is opted into a specific asset
146 | mock_asset = context.any.asset()
147 | mock_account = context.any.account(
148 |     opted_asset_balances={mock_asset: 123}
149 | )
150 | 
151 | # Get an account by address
152 | account = context.ledger.get_account(str(mock_account))
153 | 
154 | # Update an account
155 | context.ledger.update_account(
156 |     mock_account,
157 |     balance=...,  # Optional: New balance
158 |     min_balance=...,  # Optional: New minimum balance
159 |     auth_address=context.any.account(),  # Optional: New auth address
160 |     total_assets=...,  # Optional: New total number of assets
161 |     total_created_assets=...,  # Optional: New total number of created assets
162 |     total_apps_created=...,  # Optional: New total number of created applications
163 |     total_apps_opted_in=...,  # Optional: New total number of applications opted into
164 |     total_extra_app_pages=...,  # Optional: New total number of extra application pages
165 |     rewards=...,  # Optional: New rewards
166 |     status=...  # Optional: New account status
167 | )
168 | 
169 | # Check if an account is opted into a specific asset
170 | opted_in = account.is_opted_in(mock_asset)
171 | ```
172 | 
173 | ## Application
174 | 
175 | ```{testcode}
176 | # Direct instantiation
177 | application = algopy.Application()
178 | 
179 | # Instantiate test context
180 | ...
181 | 
182 | # Generate a random application
183 | random_app = context.any.application(
184 |     approval_program=algopy.Bytes(b''),  # Optional: Specify a custom approval program
185 |     clear_state_program=algopy.Bytes(b''),  # Optional: Specify a custom clear state program
186 |     global_num_uint=algopy.UInt64(1),  # Optional: Number of global uint values
187 |     global_num_bytes=algopy.UInt64(1),  # Optional: Number of global byte values
188 |     local_num_uint=algopy.UInt64(1),  # Optional: Number of local uint values
189 |     local_num_bytes=algopy.UInt64(1),  # Optional: Number of local byte values
190 |     extra_program_pages=algopy.UInt64(1),  # Optional: Number of extra program pages
191 |     creator=context.default_sender  # Optional: Specify the creator account
192 | )
193 | 
194 | # Get an application by ID
195 | app = context.ledger.get_app(app_id=random_app.id)
196 | 
197 | # Update an application
198 | context.ledger.update_app(
199 |     random_app,
200 |     approval_program=...,  # Optional: New approval program
201 |     clear_state_program=...,  # Optional: New clear state program
202 |     global_num_uint=...,  # Optional: New number of global uint values
203 |     global_num_bytes=...,  # Optional: New number of global byte values
204 |     local_num_uint=...,  # Optional: New number of local uint values
205 |     local_num_bytes=...,  # Optional: New number of local byte values
206 |     extra_program_pages=...,  # Optional: New number of extra program pages
207 |     creator=...  # Optional: New creator account
208 | )
209 | 
210 | # Patch logs for an application. When accessing via transactions or inner transaction related opcodes, will return the patched logs unless new logs where added into the transaction during execution.
211 | test_app = context.any.application(logs=b"log entry" or [b"log entry 1", b"log entry 2"])
212 | 
213 | # Get app associated with the active contract
214 | class MyContract(algopy.ARC4Contract):
215 |     ...
216 | 
217 | contract = MyContract()
218 | active_app = context.ledger.get_app(contract)
219 | ```
220 | 
221 | ```{testcleanup}
222 | ctx_manager.__exit__(None, None, None)
223 | ```
224 | 
```

--------------------------------------------------------------------------------
/packages/server/src/tools/transactionManager/accountTransactions.ts:
--------------------------------------------------------------------------------

```typescript
  1 | import { 
  2 |   Transaction,
  3 |   makePaymentTxnWithSuggestedParamsFromObject,
  4 |   makeKeyRegistrationTxnWithSuggestedParamsFromObject,
  5 |   SuggestedParams
  6 | } from 'algosdk';
  7 | import { McpError, ErrorCode } from '@modelcontextprotocol/sdk/types.js';
  8 | import { algodClient } from '../../algorand-client.js';
  9 | 
 10 | // Tool schemas
 11 | export const accountTransactionSchemas = {
 12 |   makePaymentTxn: {
 13 |     type: 'object',
 14 |     description: 'Create a payment transaction with proper Algorand address strings',
 15 |     properties: {
 16 |       from: { 
 17 |         type: 'string',
 18 |         description: 'Sender address in standard Algorand format (58 characters)'
 19 |       },
 20 |       to: { 
 21 |         type: 'string',
 22 |         description: 'Receiver address in standard Algorand format (58 characters)'
 23 |       },
 24 |       amount: { 
 25 |         type: 'integer',
 26 |         description: 'Amount in microAlgos'
 27 |       },
 28 |       note: { 
 29 |         type: 'string', 
 30 |         optional: true,
 31 |         description: 'Optional transaction note'
 32 |       },
 33 |       closeRemainderTo: { 
 34 |         type: 'string', 
 35 |         optional: true,
 36 |         description: 'Optional close remainder to address in standard Algorand format'
 37 |       },
 38 |       rekeyTo: { 
 39 |         type: 'string', 
 40 |         optional: true,
 41 |         description: 'Optional rekey to address in standard Algorand format'
 42 |       }
 43 |     },
 44 |     required: ['from', 'to', 'amount']
 45 |   },
 46 |   makeKeyRegTxn: {
 47 |     type: 'object',
 48 |     properties: {
 49 |       from: { type: 'string', description: 'Sender address in standard Algorand format (58 characters)' },
 50 |       voteKey: { type: 'string', description: 'The root participation public key (58 bytes base64 encoded)' },
 51 |       selectionKey: { type: 'string', description: 'VRF public key (32 bytes base64 encoded)' },
 52 |       stateProofKey: { type: 'string', description: 'State proof public key (64 bytes base64 encoded)' },
 53 |       voteFirst: { type: 'integer', description: 'First round this participation key is valid' },
 54 |       voteLast: { type: 'integer', description: 'Last round this participation key is valid' },
 55 |       voteKeyDilution: { type: 'integer', description: 'Dilution for the 2-level participation key' },
 56 |       nonParticipation: { type: 'boolean', optional: true, description: 'Mark account as nonparticipating for rewards' },
 57 |       note: { type: 'string', optional: true, description: 'Transaction note field (up to 1000 bytes)' },
 58 |       rekeyTo: { type: 'string', optional: true, description: 'Address to rekey the sender account to' }
 59 |     },
 60 |     required: ['from', 'voteKey', 'selectionKey', 'stateProofKey', 'voteFirst', 'voteLast', 'voteKeyDilution']
 61 |   }
 62 | };
 63 | 
 64 | // Tool definitions
 65 | export const accountTransactionTools = [
 66 |   {
 67 |     name: 'make_payment_txn',
 68 |     description: 'Create a payment transaction',
 69 |     inputSchema: accountTransactionSchemas.makePaymentTxn,
 70 |   },
 71 |   {
 72 |     name: 'make_keyreg_txn',
 73 |     description: 'Create a key registration transaction',
 74 |     inputSchema: accountTransactionSchemas.makeKeyRegTxn,
 75 |   }
 76 | ];
 77 | 
 78 | export class AccountTransactionManager {
 79 |   /**
 80 |    * Creates a payment transaction
 81 |    */
 82 |   static makePaymentTxn(txn: {
 83 |     from: string;
 84 |     to: string;
 85 |     amount: number;
 86 |     closeRemainderTo?: string;
 87 |     note?: Uint8Array;
 88 |     rekeyTo?: string;
 89 |     suggestedParams: SuggestedParams;
 90 |   }): Transaction {
 91 |     return makePaymentTxnWithSuggestedParamsFromObject(txn);
 92 |   }
 93 | 
 94 |   /**
 95 |    * Creates a key registration transaction
 96 |    */
 97 |   static makeKeyRegTxn(txn: {
 98 |     from: string;
 99 |     note?: Uint8Array;
100 |     rekeyTo?: string;
101 |     suggestedParams: SuggestedParams;
102 |     voteKey: string;
103 |     selectionKey: string;
104 |     stateProofKey: string;
105 |     voteFirst: number;
106 |     voteLast: number;
107 |     voteKeyDilution: number;
108 |     nonParticipation?: boolean;
109 |   }): Transaction {
110 |     return makeKeyRegistrationTxnWithSuggestedParamsFromObject(txn);
111 |   }
112 | 
113 |   // Tool handlers
114 |   static async handleTool(name: string, args: Record<string, unknown>) {
115 |     const params = await algodClient.getTransactionParams().do();
116 |     const suggestedParams = { ...params, flatFee: true, fee: params.minFee  };
117 | 
118 |     switch (name) {
119 |       case 'make_payment_txn':
120 |         if (!args.from || !args.to || typeof args.amount !== 'number') {
121 |           throw new McpError(ErrorCode.InvalidParams, 'Invalid payment transaction parameters');
122 |         }
123 |         try {
124 |           // Create payment transaction using SDK's maker function
125 |           const txn = AccountTransactionManager.makePaymentTxn({
126 |             from: String(args.from),
127 |             to: String(args.to),
128 |             amount: Number(args.amount),
129 |             note: typeof args.note === 'string' ? new TextEncoder().encode(args.note) : undefined,
130 |             closeRemainderTo: typeof args.closeRemainderTo === 'string' ? args.closeRemainderTo : undefined,
131 |             rekeyTo: typeof args.rekeyTo === 'string' ? args.rekeyTo : undefined,
132 |             suggestedParams
133 |           });
134 | 
135 |           // Create a clean transaction object for JSON serialization
136 |           const cleanTxn: Record<string, any> = {
137 |             from: String(args.from),
138 |             to: String(args.to),
139 |             amount: Number(args.amount),
140 |             fee: suggestedParams.fee,
141 |             firstRound: suggestedParams.firstRound,
142 |             lastRound: suggestedParams.lastRound,
143 |             genesisID: suggestedParams.genesisID,
144 |             genesisHash: suggestedParams.genesisHash,
145 |             type: 'pay'
146 |           };
147 | 
148 |           // Add note if provided
149 |           if (typeof args.note === 'string') {
150 |             const noteBytes = new TextEncoder().encode(args.note);
151 |             cleanTxn['note'] = Buffer.from(noteBytes).toString('base64');
152 |           }
153 | 
154 |           // Add optional parameters if they exist
155 |           if (args.closeRemainderTo) {
156 |             cleanTxn['closeRemainderTo'] = String(args.closeRemainderTo);
157 |           }
158 |           if (args.rekeyTo) {
159 |             cleanTxn['rekeyTo'] = String(args.rekeyTo);
160 |           }
161 | 
162 |           return {
163 |             content: [{
164 |               type: 'text',
165 |               text: JSON.stringify(cleanTxn, null, 2),
166 |             }],
167 |           };
168 |         } catch (error) {
169 |           throw new McpError(
170 |             ErrorCode.InvalidParams,
171 |             `Failed to create payment transaction: ${error instanceof Error ? error.message : String(error)}`
172 |           );
173 |         }
174 | 
175 |       case 'make_keyreg_txn':
176 |         if (!args.from || !args.voteKey || !args.selectionKey || !args.stateProofKey ||
177 |             typeof args.voteFirst !== 'number' || typeof args.voteLast !== 'number' ||
178 |             typeof args.voteKeyDilution !== 'number') {
179 |           throw new McpError(ErrorCode.InvalidParams, 'Invalid key registration parameters');
180 |         }
181 |         const keyRegTxn = AccountTransactionManager.makeKeyRegTxn({
182 |           from: String(args.from),
183 |           voteKey: String(args.voteKey),
184 |           selectionKey: String(args.selectionKey),
185 |           stateProofKey: String(args.stateProofKey),
186 |           voteFirst: Number(args.voteFirst),
187 |           voteLast: Number(args.voteLast),
188 |           voteKeyDilution: Number(args.voteKeyDilution),
189 |           nonParticipation: typeof args.nonParticipation === 'boolean' ? args.nonParticipation : undefined,
190 |           note: typeof args.note === 'string' ? new TextEncoder().encode(args.note) : undefined,
191 |           rekeyTo: typeof args.rekeyTo === 'string' ? args.rekeyTo : undefined,
192 |           suggestedParams,
193 |         });
194 |         return {
195 |           content: [{
196 |             type: 'text',
197 |             text: JSON.stringify(keyRegTxn, null, 2),
198 |           }],
199 |         };
200 | 
201 |       default:
202 |         throw new McpError(
203 |           ErrorCode.MethodNotFound,
204 |           `Unknown account transaction tool: ${name}`
205 |         );
206 |     }
207 |   }
208 | }
209 | 
```

--------------------------------------------------------------------------------
/packages/server/src/tools/transactionManager/generalTransaction.ts:
--------------------------------------------------------------------------------

```typescript
  1 | import algosdk, { 
  2 |   Transaction,
  3 |   SignedTransaction,
  4 |   encodeUnsignedTransaction,
  5 |   TransactionType
  6 | } from 'algosdk';
  7 | import { McpError, ErrorCode } from '@modelcontextprotocol/sdk/types.js';
  8 | 
  9 | // Tool schemas
 10 | export const generalTransactionSchemas = {
 11 |   assignGroupId: {
 12 |     type: 'object',
 13 |     properties: {
 14 |       transactions: {
 15 |         type: 'array',
 16 |         items: { type: 'object' },
 17 |         description: 'Array of transaction objects to be assigned a group ID'
 18 |       }
 19 |     },
 20 |     required: ['transactions']
 21 |   },
 22 |   signTransaction: {
 23 |     type: 'object',
 24 |     properties: {
 25 |       transaction: { type: 'object', description: 'Transaction object to be signed' },
 26 |       sk: { type: 'string', description: 'Secret key in hexadecimal format to sign the transaction with' }
 27 |     },
 28 |     required: ['transaction', 'sk']
 29 |   },
 30 |   signBytes: {
 31 |     type: 'object',
 32 |     properties: {
 33 |       bytes: { type: 'string', description: 'Base64-encoded bytes to be signed' },
 34 |       sk: { type: 'string', description: 'Secret key in hexadecimal format to sign the bytes with' }
 35 |     },
 36 |     required: ['bytes', 'sk']
 37 |   },
 38 |   encodeObj: {
 39 |     type: 'object',
 40 |     properties: {
 41 |       obj: { type: 'object', description: 'Object to be encoded into msgpack format' }
 42 |     },
 43 |     required: ['obj']
 44 |   },
 45 |   decodeObj: {
 46 |     type: 'object',
 47 |     properties: {
 48 |       bytes: { type: 'string', description: 'Base64-encoded msgpack bytes to be decoded into an object' }
 49 |     },
 50 |     required: ['bytes']
 51 |   }
 52 | };
 53 | 
 54 | // Tool definitions
 55 | export const generalTransactionTools = [
 56 |   {
 57 |     name: 'assign_group_id',
 58 |     description: 'Assign a group ID to a list of transactions',
 59 |     inputSchema: generalTransactionSchemas.assignGroupId,
 60 |   },
 61 |   {
 62 |     name: 'sign_transaction',
 63 |     description: 'Sign a transaction with a secret key',
 64 |     inputSchema: generalTransactionSchemas.signTransaction,
 65 |   },
 66 |   {
 67 |     name: 'sign_bytes',
 68 |     description: 'Sign arbitrary bytes with a secret key',
 69 |     inputSchema: generalTransactionSchemas.signBytes,
 70 |   },
 71 |   {
 72 |     name: 'encode_obj',
 73 |     description: 'Encode an object to msgpack format',
 74 |     inputSchema: generalTransactionSchemas.encodeObj,
 75 |   },
 76 |   {
 77 |     name: 'decode_obj',
 78 |     description: 'Decode msgpack bytes to an object',
 79 |     inputSchema: generalTransactionSchemas.decodeObj,
 80 |   }
 81 | ];
 82 | 
 83 | export class GeneralTransactionManager {
 84 |   /**
 85 |    * Assigns a group ID to a list of transactions
 86 |    */
 87 |   // Tool handlers
 88 |   static async handleTool(name: string, args: Record<string, unknown>) {
 89 |     switch (name) {
 90 |       case 'assign_group_id': {
 91 |         if (!args.transactions || !Array.isArray(args.transactions)) {
 92 |           throw new McpError(ErrorCode.InvalidParams, 'Transactions array is required');
 93 |         }
 94 | 
 95 |         // Validate each transaction object
 96 |         for (const txn of args.transactions) {
 97 |           if (typeof txn !== 'object' || txn === null) {
 98 |             throw new McpError(ErrorCode.InvalidParams, 'Each transaction must be a valid transaction object');
 99 |           }
100 |         }
101 | 
102 |         // Create all transactions first
103 |         let txns;
104 |         try {
105 |           txns = args.transactions.map(txn => new algosdk.Transaction(txn));
106 |         } catch (error) {
107 |           throw new McpError(
108 |             ErrorCode.InvalidParams,
109 |             `Failed to assign group ID: ${error instanceof Error ? error.message : String(error)}`
110 |           );
111 |         }
112 | 
113 |         // Then try to assign group ID
114 |         try {
115 |           const groupedTxns = algosdk.assignGroupID(txns);
116 |           return {
117 |             content: [{
118 |               type: 'text',
119 |               text: JSON.stringify(groupedTxns, null, 2)
120 |             }]
121 |           };
122 |         } catch (error) {
123 |           throw new McpError(
124 |             ErrorCode.InvalidParams,
125 |             `Failed to assign group ID: ${error instanceof Error ? error.message : String(error)}`
126 |           );
127 |         }
128 |       }
129 | 
130 |       case 'sign_transaction': {
131 |         if (!args.transaction || typeof args.transaction !== 'object' || !args.sk || typeof args.sk !== 'string') {
132 |           throw new McpError(ErrorCode.InvalidParams, 'Invalid sign transaction parameters');
133 |         }
134 | 
135 |         try {
136 |           const transaction = args.transaction as any;
137 | 
138 |           // Create a new transaction object with proper fields
139 |           // const txn: any = {
140 |           //   from: transaction.from,
141 |           //   fee: transaction.fee,
142 |           //   firstRound: transaction.firstRound,
143 |           //   lastRound: transaction.lastRound,
144 |           //   genesisID: transaction.genesisID,
145 |           //   genesisHash: transaction.genesisHash,
146 |           //   type: transaction.type,
147 |           //   appIndex: transaction.appIndex || 0,
148 |           //   onComplete: transaction.onComplete,
149 | 
150 |           // };
151 | 
152 |           // Convert base64 fields
153 |           if (transaction.note) {
154 |             transaction.note = new Uint8Array(Buffer.from(transaction.note, 'base64'));
155 |           }
156 | 
157 |           // Handle application-specific fields
158 |           if (transaction.type === 'appl') {
159 |             // Set approval program
160 |             if (transaction.approvalProgram) {
161 |               const approvalBytes = Buffer.from(transaction.approvalProgram, 'base64');
162 |               transaction.appApprovalProgram = new Uint8Array(approvalBytes);
163 |             }
164 | 
165 |             // Set clear program
166 |             if (transaction.clearProgram) {
167 |               const clearBytes = Buffer.from(transaction.clearProgram, 'base64');
168 |               transaction.appClearProgram = new Uint8Array(clearBytes);
169 |             }
170 | 
171 |             // Set schema
172 |         
173 |             if (transaction.numGlobalInts !== undefined) {
174 |               transaction.appGlobalInts = transaction.numGlobalInts;
175 |             }
176 |             if (transaction.numGlobalByteSlices !== undefined) {
177 |               transaction.appGlobalByteSlices = transaction.numGlobalByteSlices;
178 |             }
179 |             if (transaction.numLocalInts !== undefined) {
180 |               transaction.appLocalInts = transaction.numLocalInts;
181 |             }
182 |             if (transaction.numLocalByteSlices !== undefined) {
183 |               transaction.appLocalByteSlices = transaction.numLocalByteSlices;
184 |             }
185 |             if(transaction.onComplete)transaction.appOnComplete = transaction.onComplete;
186 | 
187 |             // Set optional arrays
188 |             if (transaction.appArgs) {
189 |               transaction.appArgs = transaction.appArgs.map((arg: string) => 
190 |                 new Uint8Array(Buffer.from(arg, 'base64'))
191 |               );
192 |             }
193 |             if (transaction.accounts) {
194 |               transaction.appAccounts = transaction.accounts;
195 |             }
196 |             if (transaction.foreignApps) {
197 |               transaction.appForeignApps = transaction.foreignApps;
198 |             }
199 |             if (transaction.foreignAssets) {
200 |               transaction.appForeignAssets = transaction.foreignAssets;
201 |             }
202 |           }
203 |           // Convert hex string secret key to Uint8Array
204 |           const sk = new Uint8Array(Buffer.from(args.sk, 'hex'));
205 |           const signedTxn = algosdk.signTransaction(new algosdk.Transaction(transaction), sk);
206 |           return {
207 |             content: [{
208 |               type: 'text',
209 |               text: JSON.stringify({
210 |                 txID: signedTxn.txID,
211 |                 blob: Buffer.from(signedTxn.blob).toString('base64')
212 |               }, null, 2)
213 |             }]
214 |           };
215 |         } catch (error) {
216 |           throw new McpError(
217 |             ErrorCode.InvalidParams,
218 |             `Failed to sign transaction: ${error instanceof Error ? error.message : String(error)}`
219 |           );
220 |         }
221 |       }
222 | 
223 |       
224 | 
225 |       default:
226 |         throw new McpError(
227 |           ErrorCode.MethodNotFound,
228 |           `Unknown general transaction tool: ${name}`
229 |         );
230 |     }
231 |   }
232 | }
233 | 
```

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

```typescript
  1 | import { McpError, ErrorCode } from '@modelcontextprotocol/sdk/types.js';
  2 | import { AccountTransactionManager, accountTransactionTools } from '../../../src/tools/transactionManager/accountTransactions.js';
  3 | import { algodClient } from '../../../src/algorand-client.js';
  4 | import algosdk from 'algosdk';
  5 | 
  6 | // Mock algosdk
  7 | jest.mock('algosdk', () => ({
  8 |   makePaymentTxnWithSuggestedParamsFromObject: jest.fn(),
  9 |   makeKeyRegistrationTxnWithSuggestedParamsFromObject: jest.fn(),
 10 | }));
 11 | 
 12 | // Mock algodClient
 13 | jest.mock('../../../src/algorand-client.js', () => ({
 14 |   algodClient: {
 15 |     getTransactionParams: jest.fn().mockReturnValue({
 16 |       do: jest.fn().mockResolvedValue({
 17 |         firstRound: 1000,
 18 |         lastRound: 2000,
 19 |         genesisHash: 'hash',
 20 |         genesisID: 'testnet-v1.0',
 21 |         fee: 1000,
 22 |         flatFee: true,
 23 |       }),
 24 |     }),
 25 |   },
 26 | }));
 27 | 
 28 | describe('AccountTransactionManager', () => {
 29 |   const mockSuggestedParams = {
 30 |     firstRound: 1000,
 31 |     lastRound: 2000,
 32 |     genesisHash: 'hash',
 33 |     genesisID: 'testnet-v1.0',
 34 |     fee: 1000,
 35 |     flatFee: true,
 36 |   };
 37 | 
 38 |   beforeEach(() => {
 39 |     jest.clearAllMocks();
 40 |     (algodClient.getTransactionParams as jest.Mock)().do.mockResolvedValue(mockSuggestedParams);
 41 |   });
 42 | 
 43 |   describe('Tool Schemas', () => {
 44 |     it('should have valid tool schemas', () => {
 45 |       expect(accountTransactionTools).toHaveLength(2);
 46 |       expect(accountTransactionTools.map((t: { name: string }) => t.name)).toEqual([
 47 |         'make_payment_txn',
 48 |         'make_keyreg_txn',
 49 |       ]);
 50 |     });
 51 |   });
 52 | 
 53 |   describe('Payment Transactions', () => {
 54 |     const mockPaymentTxn = { type: 'pay', from: 'sender', to: 'receiver' };
 55 | 
 56 |     beforeEach(() => {
 57 |       (algosdk.makePaymentTxnWithSuggestedParamsFromObject as jest.Mock).mockReturnValue(mockPaymentTxn);
 58 |     });
 59 | 
 60 |     it('should create a basic payment transaction', async () => {
 61 |       const args = {
 62 |         from: 'sender',
 63 |         to: 'receiver',
 64 |         amount: 1000,
 65 |       };
 66 | 
 67 |       const result = await AccountTransactionManager.handleTool('make_payment_txn', args);
 68 | 
 69 |       expect(result).toEqual({
 70 |         content: [{
 71 |           type: 'text',
 72 |           text: JSON.stringify(mockPaymentTxn, null, 2),
 73 |         }],
 74 |       });
 75 | 
 76 |       expect(algosdk.makePaymentTxnWithSuggestedParamsFromObject).toHaveBeenCalledWith(
 77 |         expect.objectContaining({
 78 |           from: 'sender',
 79 |           to: 'receiver',
 80 |           amount: 1000,
 81 |           suggestedParams: expect.objectContaining(mockSuggestedParams),
 82 |         })
 83 |       );
 84 |     });
 85 | 
 86 |     it('should create a payment transaction with optional parameters', async () => {
 87 |       const args = {
 88 |         from: 'sender',
 89 |         to: 'receiver',
 90 |         amount: 1000,
 91 |         note: 'test note',
 92 |         closeRemainderTo: 'close-to',
 93 |         rekeyTo: 'rekey-to',
 94 |       };
 95 | 
 96 |       const result = await AccountTransactionManager.handleTool('make_payment_txn', args);
 97 | 
 98 |       expect(result).toEqual({
 99 |         content: [{
100 |           type: 'text',
101 |           text: JSON.stringify(mockPaymentTxn, null, 2),
102 |         }],
103 |       });
104 | 
105 |       expect(algosdk.makePaymentTxnWithSuggestedParamsFromObject).toHaveBeenCalledWith(
106 |         expect.objectContaining({
107 |           from: 'sender',
108 |           to: 'receiver',
109 |           amount: 1000,
110 |           note: new TextEncoder().encode('test note'),
111 |           closeRemainderTo: 'close-to',
112 |           rekeyTo: 'rekey-to',
113 |           suggestedParams: expect.objectContaining(mockSuggestedParams),
114 |         })
115 |       );
116 |     });
117 | 
118 |     it('should throw error for missing required parameters', async () => {
119 |       await expect(AccountTransactionManager.handleTool('make_payment_txn', {}))
120 |         .rejects
121 |         .toThrow(new McpError(ErrorCode.InvalidParams, 'Invalid payment transaction parameters'));
122 |     });
123 |   });
124 | 
125 |   describe('Key Registration Transactions', () => {
126 |     const mockKeyRegTxn = { type: 'keyreg', from: 'sender' };
127 | 
128 |     beforeEach(() => {
129 |       (algosdk.makeKeyRegistrationTxnWithSuggestedParamsFromObject as jest.Mock).mockReturnValue(mockKeyRegTxn);
130 |     });
131 | 
132 |     it('should create a basic key registration transaction', async () => {
133 |       const args = {
134 |         from: 'sender',
135 |         voteKey: 'vote-key',
136 |         selectionKey: 'selection-key',
137 |         stateProofKey: 'stateproof-key',
138 |         voteFirst: 1000,
139 |         voteLast: 2000,
140 |         voteKeyDilution: 10,
141 |       };
142 | 
143 |       const result = await AccountTransactionManager.handleTool('make_keyreg_txn', args);
144 | 
145 |       expect(result).toEqual({
146 |         content: [{
147 |           type: 'text',
148 |           text: JSON.stringify(mockKeyRegTxn, null, 2),
149 |         }],
150 |       });
151 | 
152 |       expect(algosdk.makeKeyRegistrationTxnWithSuggestedParamsFromObject).toHaveBeenCalledWith(
153 |         expect.objectContaining({
154 |           from: 'sender',
155 |           voteKey: 'vote-key',
156 |           selectionKey: 'selection-key',
157 |           stateProofKey: 'stateproof-key',
158 |           voteFirst: 1000,
159 |           voteLast: 2000,
160 |           voteKeyDilution: 10,
161 |           suggestedParams: expect.objectContaining(mockSuggestedParams),
162 |         })
163 |       );
164 |     });
165 | 
166 |     it('should create a key registration transaction with optional parameters', async () => {
167 |       const args = {
168 |         from: 'sender',
169 |         voteKey: 'vote-key',
170 |         selectionKey: 'selection-key',
171 |         stateProofKey: 'stateproof-key',
172 |         voteFirst: 1000,
173 |         voteLast: 2000,
174 |         voteKeyDilution: 10,
175 |         nonParticipation: true,
176 |         note: 'test note',
177 |         rekeyTo: 'rekey-to',
178 |       };
179 | 
180 |       const result = await AccountTransactionManager.handleTool('make_keyreg_txn', args);
181 | 
182 |       expect(result).toEqual({
183 |         content: [{
184 |           type: 'text',
185 |           text: JSON.stringify(mockKeyRegTxn, null, 2),
186 |         }],
187 |       });
188 | 
189 |       expect(algosdk.makeKeyRegistrationTxnWithSuggestedParamsFromObject).toHaveBeenCalledWith(
190 |         expect.objectContaining({
191 |           from: 'sender',
192 |           voteKey: 'vote-key',
193 |           selectionKey: 'selection-key',
194 |           stateProofKey: 'stateproof-key',
195 |           voteFirst: 1000,
196 |           voteLast: 2000,
197 |           voteKeyDilution: 10,
198 |           nonParticipation: true,
199 |           note: new TextEncoder().encode('test note'),
200 |           rekeyTo: 'rekey-to',
201 |           suggestedParams: expect.objectContaining(mockSuggestedParams),
202 |         })
203 |       );
204 |     });
205 | 
206 |     it('should throw error for missing required parameters', async () => {
207 |       await expect(AccountTransactionManager.handleTool('make_keyreg_txn', {}))
208 |         .rejects
209 |         .toThrow(new McpError(ErrorCode.InvalidParams, 'Invalid key registration parameters'));
210 |     });
211 |   });
212 | 
213 |   describe('Error Handling', () => {
214 |     it('should throw error for unknown tool', async () => {
215 |       await expect(AccountTransactionManager.handleTool('unknown_tool', {}))
216 |         .rejects
217 |         .toThrow(new McpError(ErrorCode.MethodNotFound, 'Unknown account transaction tool: unknown_tool'));
218 |     });
219 | 
220 |     it('should handle algod client errors', async () => {
221 |       const error = new Error('Network error');
222 |       (algodClient.getTransactionParams as jest.Mock)().do.mockRejectedValue(error);
223 | 
224 |       await expect(AccountTransactionManager.handleTool('make_payment_txn', {
225 |         from: 'sender',
226 |         to: 'receiver',
227 |         amount: 1000,
228 |       }))
229 |         .rejects
230 |         .toThrow(error);
231 |     });
232 | 
233 |     it('should handle transaction creation errors', async () => {
234 |       const error = new Error('Invalid parameters');
235 |       (algosdk.makePaymentTxnWithSuggestedParamsFromObject as jest.Mock).mockImplementation(() => {
236 |         throw error;
237 |       });
238 | 
239 |       await expect(AccountTransactionManager.handleTool('make_payment_txn', {
240 |         from: 'sender',
241 |         to: 'receiver',
242 |         amount: 1000,
243 |       }))
244 |         .rejects
245 |         .toThrow(error);
246 |     });
247 |   });
248 | });
249 | 
```

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

```markdown
 1 | title: Algorand consensus
 2 | 
 3 | The Algorand blockchain uses a decentralized Byzantine Agreement protocol that leverages pure proof of stake (Pure POS). This means that it can tolerate malicious users, achieving consensus without a central authority, as long as a supermajority of the stake is in non-malicious hands. This protocol is very fast and requires minimal computational power per node, giving it the ability to finalize transactions efficiently. 
 4 | 
 5 | Before getting into detail on the protocol, we discuss two functional concepts that Algorand uses. This is a simplified version of the protocol that covers the ideal conditions. For all technical details see the white paper<LINK> or the source code<LINK>.
 6 | 
 7 | # Verifiable Random Function
 8 | Recently we released the source code<LINK> for our implementation of a Verifiable Random Function (VRF). The VRF takes a secret key and a value and produces a pseudorandom output, with a proof that anyone can use to verify the result. The VRF functions similar to a lottery and is used to choose leaders to propose a block and committee members to vote on a block. This VRF output, when executed for an account, is used to sample from a binomial distribution<LINK> to emulate a call for every algo in a user’s account. The more algos in an account, the greater chance the account has of being selected -- it’s as if every algo in an account participates in its own lottery. This method ensures that a user does not gain any advantage by creating multiple accounts.
 9 | 
10 | # Participation Keys
11 | A user account must be online to participate in the consensus protocol. To reduce exposure, online users do not use their spending keys (i.e., the keys they use to sign transactions) for consensus. Instead, a user generates and registers a participation key for a certain number of rounds.  It also generates a collection of ephemeral keys, one for each round, signs these keys with the participation key, and then deletes the participation key. Each ephemeral key is used to sign messages for the corresponding round, and is deleted after the round is over. Using participation keys ensures that a user's tokens are secure even if their participating node is compromised. Deleting the participation and ephemeral keys after they are used ensures that the blockchain is forward-secure and cannot be compromised by attacks on old blocks using old keys. 
12 | 
13 | # State Proof Keys
14 | As of go-algorand 3.4.2 (released March 2022), users also generate a state proof key, with associated ephemeral keys, alongside their participation keys. State proof keys will be used to generate Post-Quantum secure state proofs that attest to the state of the blockchain at different points in time. These will be useful for applications that want a portable, lightweight way to cryptographically verify Algorand state without running a full participation node.
15 | 
16 | # The Algorand Consensus Protocol
17 | Consensus refers to the way blocks are selected and written to the blockchain. Algorand uses the VRF described above to select leaders to propose blocks for a given round. When a block is proposed to the blockchain, a committee of voters is selected to vote on the block proposal.  If a super majority of the votes are from honest participants, the block can be certified. What makes this algorithm a Pure Proof of Stake is that users are chosen for committees based on the number of algos in their accounts. Committees are made up of pseudorandomly selected accounts with voting power dependent on their online stake. It is as if every token gets an execution of the VRF. Users with more tokens are likely to be selected more. For a committee membership this means higher stake accounts will most likely have more votes than a selected account with less tokens. Using randomly selected committees allows the protocol to still have good performance while allowing anyone in the network to participate.
18 | 
19 | Consensus requires three steps to propose, confirm and write the block to the blockchain. These steps are: 1) propose, 2) soft vote and 3) certify vote. Each is described below, assuming the ideal case when there are no malicious users and the network is not partitioned (i.e., none of the network is down due to technical issues or from DDoS attacks). Note that all messages are cryptographically signed with the user’s participation key and committee membership is verified using the VRF in these steps.
20 | 
21 | # Block Proposal
22 | In the block proposal phase, accounts are selected to propose new blocks to the network. This phase starts with every node in the network looping through each online account for which it has valid participation keys, running Algorand’s VRF to determine if the account is selected to propose the block. The VRF acts similar to a weighted lottery where the number of Algos that the account has participating online determines the account’s chance of being selected. Once an account is selected by the VRF, the node propagates the proposed block along with the VRF output, which proves that the account is a valid proposer. We then move from the propose step to the soft vote step.
23 | 
24 | ![Block Proposal](../imgs/algorand_consensus-1.png)
25 | <center>*Block Proposal*</center>
26 | 
27 | # Soft Vote
28 | The purpose of this phase is to filter the number of proposals down to one, guaranteeing that only one block gets certified. Each node in the network will get many proposal messages from other nodes. Nodes will verify the signature of the message and then validate the selection using the VRF proof. Next, the node will compare the hash from each validated winner’s VRF proof to determine which is the lowest and will only propagate the block proposal with the lowest VRF hash. This process continues for a fixed amount of time to allow votes to be propagated across the network. 
29 | 
30 | ![Soft Vote 1](../imgs/algorand_consensus-2.png)
31 | <center>*Soft Vote Part 1*</center>
32 | 
33 | Each node will then run the VRF for every participating account it manages to see if they have been chosen to participate in the soft vote committee. If any account is chosen it will have a weighted vote based on the number of Algos the account has, and these votes will be propagated to the network. These votes will be for the lowest VRF block proposal calculated at the timeout and will be sent out to the other nodes along with the VRF Proof.
34 | 
35 | ![Soft Vote 2](../imgs/algorand_consensus-3.png)
36 | <center>*Soft Vote Part 2*</center>
37 | 
38 | A new committee is selected for every step in the process and each step has a different committee size. This committee size is quantified in algos.  A quorum of votes is needed to move to the next step and must be a certain percentage of the expected committee size. These votes will be received from other nodes on the network and each node will validate the committee membership VRF proof before adding to the vote tally. Once a quorum is reached for the soft vote the process moves to the certify vote step.
39 | 
40 | # Certify Vote
41 | A new committee checks the block proposal that was voted on in the soft vote stage for overspending, double-spending, or any other problems. If valid, the new committee votes again to certify the block. This is done in a similar manner as the soft vote where each node iterates through its managed accounts to select a committee and to send votes. These votes are collected and validated by each node until a quorum is reached, triggering an end to the round and prompting the node to create a certificate for the block and write it to the ledger. At that point, a new round is initiated and the process starts over.
42 | 
43 | ![Certify Vote](../imgs/algorand_consensus-4.png)
44 | <center>*Certify Vote*</center>
45 | 
46 | If a quorum is not reached in a certifying committee vote by a certain timeout then the network will enter recovery mode.
47 | 
```

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

```markdown
  1 | # Transactions
  2 | 
  3 | Algorand Python provides types for accessing fields of other transactions in a group, as well as
  4 | creating and submitting inner transactions from your smart contract.
  5 | 
  6 | The following types are available:
  7 | 
  8 | | Group Transactions                                                   | Inner Transaction Field sets                     | Inner Transaction                                                              |
  9 | | -------------------------------------------------------------------- | ------------------------------------------------ | ------------------------------------------------------------------------------ |
 10 | | [PaymentTransaction](algopy.gtxn.PaymentTransaction)                 | [Payment](algopy.itxn.Payment)                   | [PaymentInnerTransaction](algopy.itxn.PaymentInnerTransaction)                 |
 11 | | [KeyRegistrationTransaction](algopy.gtxn.KeyRegistrationTransaction) | [KeyRegistration](algopy.itxn.KeyRegistration)   | [KeyRegistrationInnerTransaction](algopy.itxn.KeyRegistrationInnerTransaction) |
 12 | | [AssetConfigTransaction](algopy.gtxn.AssetConfigTransaction)         | [AssetConfig](algopy.itxn.AssetConfig)           | [AssetConfigInnerTransaction](algopy.itxn.AssetConfigInnerTransaction)         |
 13 | | [AssetTransferTransaction](algopy.gtxn.AssetTransferTransaction)     | [AssetTransfer](algopy.itxn.AssetTransfer)       | [AssetTransferInnerTransaction](algopy.itxn.AssetTransferInnerTransaction)     |
 14 | | [AssetFreezeTransaction](algopy.gtxn.AssetFreezeTransaction)         | [AssetFreeze](algopy.itxn.AssetFreeze)           | [AssetFreezeInnerTransaction](algopy.itxn.AssetFreezeInnerTransaction)         |
 15 | | [ApplicationCallTransaction](algopy.gtxn.ApplicationCallTransaction) | [ApplicationCall](algopy.itxn.ApplicationCall)   | [ApplicationCallInnerTransaction](algopy.itxn.ApplicationCallInnerTransaction) |
 16 | | [Transaction](algopy.gtxn.Transaction)                               | [InnerTransaction](algopy.itxn.InnerTransaction) | [InnerTransactionResult](algopy.itxn.InnerTransactionResult)                   |
 17 | 
 18 | ## Group Transactions
 19 | 
 20 | Group transactions can be used as ARC4 parameters or instantiated from a group index.
 21 | 
 22 | ### ARC4 parameter
 23 | 
 24 | Group transactions can be used as parameters in ARC4 method
 25 | 
 26 | For example to require a payment transaction in an ARC4 ABI method:
 27 | 
 28 | ```python
 29 | import algopy
 30 | 
 31 | 
 32 | class MyContract(algopy.ARC4Contract):
 33 | 
 34 |     @algopy.arc4.abimethod()
 35 |     def process_payment(self: algopy.gtxn.PaymentTransaction) -> None:
 36 |         ...
 37 | ```
 38 | 
 39 | ### Group Index
 40 | 
 41 | Group transactions can also be created using the group index of the transaction.
 42 | If instantiating one of the type specific transactions they will be checked to ensure the transaction is of the expected type.
 43 | [Transaction](algopy.gtxn.Transaction) is not checked for a specific type and provides access to all transaction fields
 44 | 
 45 | For example, to obtain a reference to a payment transaction:
 46 | 
 47 | ```python
 48 | import algopy
 49 | 
 50 | 
 51 | @algopy.subroutine()
 52 | def process_payment(group_index: algopy.UInt64) -> None:
 53 |     pay_txn = algopy.gtxn.PaymentTransaction(group_index)
 54 |     ...
 55 | ```
 56 | 
 57 | ## Inner Transactions
 58 | 
 59 | Inner transactions are defined using the parameter types, and can then be submitted individually by calling the
 60 | `.submit()` method, or as a group by calling [`submit_txns`](#algopy.itxn.submit_txns)
 61 | 
 62 | ### Examples
 63 | 
 64 | #### Create and submit an inner transaction
 65 | 
 66 | ```python
 67 | from algopy import Account, UInt64, itxn, subroutine
 68 | 
 69 | 
 70 | @subroutine
 71 | def example(amount: UInt64, receiver: Account) -> None:
 72 |     itxn.Payment(
 73 |         amount=amount,
 74 |         receiver=receiver,
 75 |         fee=0,
 76 |     ).submit()
 77 | ```
 78 | 
 79 | #### Accessing result of a submitted inner transaction
 80 | 
 81 | ```python
 82 | from algopy import Asset, itxn, subroutine
 83 | 
 84 | 
 85 | @subroutine
 86 | def example() -> Asset:
 87 |     asset_txn = itxn.AssetConfig(
 88 |         asset_name=b"Puya",
 89 |         unit_name=b"PYA",
 90 |         total=1000,
 91 |         decimals=3,
 92 |         fee=0,
 93 |     ).submit()
 94 |     return asset_txn.created_asset
 95 | ```
 96 | 
 97 | #### Submitting multiple transactions
 98 | 
 99 | ```python
100 | from algopy import Asset, Bytes, itxn, log, subroutine
101 | 
102 | 
103 | @subroutine
104 | def example() -> tuple[Asset, Bytes]:
105 |     asset1_params = itxn.AssetConfig(
106 |         asset_name=b"Puya",
107 |         unit_name=b"PYA",
108 |         total=1000,
109 |         decimals=3,
110 |         fee=0,
111 |     )
112 |     app_params = itxn.ApplicationCall(
113 |         app_id=1234,
114 |         app_args=(Bytes(b"arg1"), Bytes(b"arg1"))
115 |     )
116 |     asset1_txn, app_txn = itxn.submit_txns(asset1_params, app_params)
117 |     # log some details
118 |     log(app_txn.logs(0))
119 |     log(asset1_txn.txn_id)
120 |     log(app_txn.txn_id)
121 | 
122 |     return asset1_txn.created_asset, app_txn.logs(1)
123 | ```
124 | 
125 | #### Create an ARC4 application, and then call it
126 | 
127 | ```python
128 | from algopy import Bytes, arc4, itxn, subroutine
129 | 
130 | HELLO_WORLD_APPROVAL: bytes = ...
131 | HELLO_WORLD_CLEAR: bytes = ...
132 | 
133 | 
134 | @subroutine
135 | def example() -> None:
136 |     # create an application
137 |     application_txn = itxn.ApplicationCall(
138 |         approval_program=HELLO_WORLD_APPROVAL,
139 |         clear_state_program=HELLO_WORLD_CLEAR,
140 |         fee=0,
141 |     ).submit()
142 |     app = application_txn.created_app
143 | 
144 |     # invoke an ABI method
145 |     call_txn = itxn.ApplicationCall(
146 |         app_id=app,
147 |         app_args=(arc4.arc4_signature("hello(string)string"), arc4.String("World")),
148 |         fee=0,
149 |     ).submit()
150 |     # extract result
151 |     hello_world_result = arc4.String.from_log(call_txn.last_log)
152 | ```
153 | 
154 | #### Create and submit transactions in a loop
155 | 
156 | ```python
157 | from algopy import Account, UInt64, itxn, subroutine
158 | 
159 | 
160 | @subroutine
161 | def example(receivers: tuple[Account, Account, Account]) -> None:
162 |     for receiver in receivers:
163 |         itxn.Payment(
164 |             amount=UInt64(1_000_000),
165 |             receiver=receiver,
166 |             fee=0,
167 |         ).submit()
168 | ```
169 | 
170 | ### Limitations
171 | 
172 | Inner transactions are powerful, but currently do have some restrictions in how they are used.
173 | 
174 | #### Inner transaction objects cannot be passed to or returned from subroutines
175 | 
176 | ```python
177 | from algopy import Application, Bytes, itxn, subroutine
178 | 
179 | 
180 | @subroutine
181 | def parameter_not_allowed(txn: itxn.PaymentInnerTransaction) -> None:
182 |     # this is a compile error
183 |     ...
184 | 
185 | 
186 | @subroutine
187 | def return_not_allowed() -> itxn.PaymentInnerTransaction:
188 |     # this is a compile error
189 |     ...
190 | 
191 | 
192 | @subroutine
193 | def passing_fields_allowed() -> Application:
194 |     txn = itxn.ApplicationCall(...).submit()
195 |     do_something(txn.txn_id, txn.logs(0))  # this is ok
196 |     return txn.created_app  # and this is ok
197 | 
198 | 
199 | @subroutine
200 | def do_something(txn_id: Bytes):  # this is just a regular subroutine
201 |     ...
202 | ```
203 | 
204 | #### Inner transaction parameters cannot be reassigned without a `.copy()`
205 | 
206 | ```python
207 | from algopy import itxn, subroutine
208 | 
209 | 
210 | @subroutine
211 | def example() -> None:
212 |     payment = itxn.Payment(...)
213 |     reassigned_payment = payment  # this is an error
214 |     copied_payment = payment.copy()  # this is ok
215 | ```
216 | 
217 | #### Inner transactions cannot be reassigned
218 | 
219 | ```python
220 | from algopy import itxn, subroutine
221 | 
222 | 
223 | @subroutine
224 | def example() -> None:
225 |     payment_txn = itxn.Payment(...).submit()
226 |     reassigned_payment_txn = payment_txn  # this is an error
227 |     txn_id = payment_txn.txn_id  # this is ok
228 | ```
229 | 
230 | #### Inner transactions methods cannot be called if there is a subsequent inner transaction submitted or another subroutine is called.
231 | 
232 | ```python
233 | from algopy import itxn, subroutine
234 | 
235 | 
236 | @subroutine
237 | def example() -> None:
238 |     app_1 = itxn.ApplicationCall(...).submit()
239 |     log_from_call1 = app_1.logs(0)  # this is ok
240 | 
241 |     # another inner transaction is submitted
242 |     itxn.ApplicationCall(...).submit()
243 |     # or another subroutine is called
244 |     call_some_other_subroutine()
245 | 
246 |     app1_txn_id = app_1.txn_id  # this is ok, properties are still available
247 |     another_log_from_call1 = app_1.logs(1)  # this is not allowed as the array results may no longer be available, instead assign to a variable before submitting another transaction
248 | ```
249 | 
```
Page 28/93FirstPrevNextLast