This is page 16 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/developer:python:code:example:hello_world.md:
--------------------------------------------------------------------------------
```markdown
1 | # Hello World Smart Contract
2 |
3 | This example demonstrates how to create a basic smart contract using Algorand Python. The contract implements a simple "hello" function that takes a name parameter and returns a greeting.
4 |
5 | ## Contract Implementation
6 |
7 | ```python
8 | from algopy import ARC4Contract, String
9 | from algopy.arc4 import abimethod
10 |
11 | class HelloWorld(ARC4Contract):
12 | @abimethod()
13 | def hello(self, name: String) -> String:
14 | return "Hello, " + name
15 | ```
16 |
17 | ### Key Components
18 |
19 | 1. **Imports**:
20 | - `ARC4Contract`: Base class for ARC4-compliant smart contracts
21 | - `String`: Type for string values in the contract
22 | - `abimethod`: Decorator to define ABI-compliant methods
23 |
24 | 2. **Contract Class**:
25 | - Inherits from `ARC4Contract`
26 | - Implements a single method `hello`
27 | - Uses type hints for parameters and return values
28 |
29 | 3. **Hello Method**:
30 | - Takes a `name` parameter of type `String`
31 | - Returns a greeting string concatenating "Hello, " with the provided name
32 | - Decorated with `@abimethod()` to make it callable from outside the contract
33 |
34 | ## Testing the Contract
35 |
36 | Here's how to interact with the contract using the AlgoKit Utils Python SDK:
37 |
38 | ```python
39 | from algokit_utils import (
40 | AlgoAmount,
41 | AlgorandClient,
42 | OnSchemaBreak,
43 | OnUpdate,
44 | PaymentParams,
45 | SigningAccount,
46 | )
47 | from smart_contracts.artifacts.hello_world.hello_world_client import (
48 | HelloArgs,
49 | HelloWorldClient,
50 | HelloWorldFactory,
51 | )
52 |
53 | # Deploy the contract
54 | factory = algorand.client.get_typed_app_factory(
55 | HelloWorldFactory,
56 | default_sender=creator.address,
57 | default_signer=creator.signer,
58 | )
59 |
60 | client, deploy_result = factory.deploy(
61 | on_update=OnUpdate.ReplaceApp,
62 | on_schema_break=OnSchemaBreak.Fail,
63 | )
64 |
65 | # Fund the contract with 1 Algo
66 | algorand.send.payment(
67 | PaymentParams(
68 | sender=dispenser.address,
69 | receiver=client.app_address,
70 | amount=AlgoAmount(algo=1),
71 | )
72 | )
73 |
74 | # Call the hello method
75 | result = client.send.hello(HelloArgs(name="World"))
76 | assert result.abi_return == "Hello, World"
77 |
78 | # Simulate multiple calls
79 | result = (
80 | client.new_group()
81 | .hello(HelloArgs(name="World"))
82 | .hello(HelloArgs(name="Jane"))
83 | .simulate()
84 | )
85 | ```
86 |
87 | ### Testing Features
88 |
89 | 1. **Basic Call**:
90 | - Create an instance of the contract client
91 | - Call the `hello` method with a name argument
92 | - Verify the returned greeting
93 |
94 | 2. **Transaction Group Simulation**:
95 | - Create a group of transactions
96 | - Call the `hello` method multiple times
97 | - Simulate the execution
98 | - Verify the results and check the app budget consumption
99 |
100 | ## Key Concepts
101 |
102 | 1. **ARC4 Compliance**:
103 | - The contract follows the ARC4 standard for method calls
104 | - Uses typed parameters and return values
105 | - Provides ABI-compatible methods
106 |
107 | 2. **Contract Deployment**:
108 | - Uses `AlgoKit` for deployment
109 | - Configures update behavior and schema break handling
110 | - Funds the contract with initial Algos
111 |
112 | 3. **Contract Interaction**:
113 | - Uses generated client code for type-safe interactions
114 | - Supports both direct calls and transaction group simulations
115 | - Provides budget consumption insights
116 |
117 | ## Best Practices
118 |
119 | 1. **Type Safety**:
120 | - Use proper type hints for parameters and return values
121 | - Leverage the generated client code for type-safe interactions
122 |
123 | 2. **Testing**:
124 | - Write comprehensive tests for contract methods
125 | - Use simulation to verify behavior before deployment
126 | - Check resource consumption through budget metrics
127 |
128 | 3. **Deployment**:
129 | - Configure appropriate update and schema break behaviors
130 | - Ensure proper funding for contract operations
131 | - Use AlgoKit's deployment utilities for consistency
132 |
133 | This Hello World example serves as a foundation for understanding basic smart contract development with Algorand Python. It demonstrates the essential components of contract creation, deployment, and interaction while following best practices for development and testing.
134 |
```
--------------------------------------------------------------------------------
/packages/server/src/resources/knowledge/taxonomy/SDKs:javascript:classes:indexerModels.BlockUpgradeState.md:
--------------------------------------------------------------------------------
```markdown
1 | [algosdk](../README.md) / [Exports](../modules.md) / [indexerModels](../modules/indexerModels.md) / BlockUpgradeState
2 |
3 | # Class: BlockUpgradeState
4 |
5 | [indexerModels](../modules/indexerModels.md).BlockUpgradeState
6 |
7 | Fields relating to a protocol upgrade.
8 |
9 | ## Hierarchy
10 |
11 | - `default`
12 |
13 | ↳ **`BlockUpgradeState`**
14 |
15 | ## Table of contents
16 |
17 | ### Constructors
18 |
19 | - [constructor](indexerModels.BlockUpgradeState.md#constructor)
20 |
21 | ### Properties
22 |
23 | - [attribute\_map](indexerModels.BlockUpgradeState.md#attribute_map)
24 | - [currentProtocol](indexerModels.BlockUpgradeState.md#currentprotocol)
25 | - [nextProtocol](indexerModels.BlockUpgradeState.md#nextprotocol)
26 | - [nextProtocolApprovals](indexerModels.BlockUpgradeState.md#nextprotocolapprovals)
27 | - [nextProtocolSwitchOn](indexerModels.BlockUpgradeState.md#nextprotocolswitchon)
28 | - [nextProtocolVoteBefore](indexerModels.BlockUpgradeState.md#nextprotocolvotebefore)
29 |
30 | ### Methods
31 |
32 | - [get\_obj\_for\_encoding](indexerModels.BlockUpgradeState.md#get_obj_for_encoding)
33 | - [from\_obj\_for\_encoding](indexerModels.BlockUpgradeState.md#from_obj_for_encoding)
34 |
35 | ## Constructors
36 |
37 | ### constructor
38 |
39 | • **new BlockUpgradeState**(`«destructured»`)
40 |
41 | Creates a new `BlockUpgradeState` object.
42 |
43 | #### Parameters
44 |
45 | | Name | Type |
46 | | :------ | :------ |
47 | | `«destructured»` | `Object` |
48 | | › `currentProtocol` | `string` |
49 | | › `nextProtocol?` | `string` |
50 | | › `nextProtocolApprovals?` | `number` \| `bigint` |
51 | | › `nextProtocolSwitchOn?` | `number` \| `bigint` |
52 | | › `nextProtocolVoteBefore?` | `number` \| `bigint` |
53 |
54 | #### Overrides
55 |
56 | BaseModel.constructor
57 |
58 | #### Defined in
59 |
60 | client/v2/indexer/models/types.ts:2632
61 |
62 | ## Properties
63 |
64 | ### attribute\_map
65 |
66 | • **attribute\_map**: `Record`\<`string`, `string`\>
67 |
68 | #### Inherited from
69 |
70 | BaseModel.attribute\_map
71 |
72 | #### Defined in
73 |
74 | client/v2/basemodel.ts:56
75 |
76 | ___
77 |
78 | ### currentProtocol
79 |
80 | • **currentProtocol**: `string`
81 |
82 | (proto) The current protocol version.
83 |
84 | #### Defined in
85 |
86 | client/v2/indexer/models/types.ts:2600
87 |
88 | ___
89 |
90 | ### nextProtocol
91 |
92 | • `Optional` **nextProtocol**: `string`
93 |
94 | (nextproto) The next proposed protocol version.
95 |
96 | #### Defined in
97 |
98 | client/v2/indexer/models/types.ts:2605
99 |
100 | ___
101 |
102 | ### nextProtocolApprovals
103 |
104 | • `Optional` **nextProtocolApprovals**: `number` \| `bigint`
105 |
106 | (nextyes) Number of blocks which approved the protocol upgrade.
107 |
108 | #### Defined in
109 |
110 | client/v2/indexer/models/types.ts:2610
111 |
112 | ___
113 |
114 | ### nextProtocolSwitchOn
115 |
116 | • `Optional` **nextProtocolSwitchOn**: `number` \| `bigint`
117 |
118 | (nextswitch) Round on which the protocol upgrade will take effect.
119 |
120 | #### Defined in
121 |
122 | client/v2/indexer/models/types.ts:2615
123 |
124 | ___
125 |
126 | ### nextProtocolVoteBefore
127 |
128 | • `Optional` **nextProtocolVoteBefore**: `number` \| `bigint`
129 |
130 | (nextbefore) Deadline round for this protocol upgrade (No votes will be consider
131 | after this round).
132 |
133 | #### Defined in
134 |
135 | client/v2/indexer/models/types.ts:2621
136 |
137 | ## Methods
138 |
139 | ### get\_obj\_for\_encoding
140 |
141 | ▸ **get_obj_for_encoding**(`binary?`): `Record`\<`string`, `any`\>
142 |
143 | Get an object ready for encoding to either JSON or msgpack.
144 |
145 | #### Parameters
146 |
147 | | Name | Type | Default value | Description |
148 | | :------ | :------ | :------ | :------ |
149 | | `binary` | `boolean` | `false` | Use true to indicate that the encoding can handle raw binary objects (Uint8Arrays). Use false to indicate that raw binary objects should be converted to base64 strings. True should be used for objects that will be encoded with msgpack, and false should be used for objects that will be encoded with JSON. |
150 |
151 | #### Returns
152 |
153 | `Record`\<`string`, `any`\>
154 |
155 | #### Inherited from
156 |
157 | BaseModel.get\_obj\_for\_encoding
158 |
159 | #### Defined in
160 |
161 | client/v2/basemodel.ts:65
162 |
163 | ___
164 |
165 | ### from\_obj\_for\_encoding
166 |
167 | ▸ `Static` **from_obj_for_encoding**(`data`): [`BlockUpgradeState`](indexerModels.BlockUpgradeState.md)
168 |
169 | #### Parameters
170 |
171 | | Name | Type |
172 | | :------ | :------ |
173 | | `data` | `Record`\<`string`, `any`\> |
174 |
175 | #### Returns
176 |
177 | [`BlockUpgradeState`](indexerModels.BlockUpgradeState.md)
178 |
179 | #### Defined in
180 |
181 | client/v2/indexer/models/types.ts:2662
182 |
```
--------------------------------------------------------------------------------
/packages/server/src/resources/knowledge/taxonomy/algokit:utils:typescript:code:interfaces:types_app.AppMetadata.md:
--------------------------------------------------------------------------------
```markdown
1 | [@algorandfoundation/algokit-utils](../README.md) / [types/app](../modules/types_app.md) / AppMetadata
2 |
3 | # Interface: AppMetadata
4 |
5 | [types/app](../modules/types_app.md).AppMetadata
6 |
7 | The metadata that can be collected about a deployed app
8 |
9 | ## Hierarchy
10 |
11 | - [`AppReference`](types_app.AppReference.md)
12 |
13 | - [`AppDeployMetadata`](types_app.AppDeployMetadata.md)
14 |
15 | ↳ **`AppMetadata`**
16 |
17 | ## Table of contents
18 |
19 | ### Properties
20 |
21 | - [appAddress](types_app.AppMetadata.md#appaddress)
22 | - [appId](types_app.AppMetadata.md#appid)
23 | - [createdMetadata](types_app.AppMetadata.md#createdmetadata)
24 | - [createdRound](types_app.AppMetadata.md#createdround)
25 | - [deletable](types_app.AppMetadata.md#deletable)
26 | - [deleted](types_app.AppMetadata.md#deleted)
27 | - [name](types_app.AppMetadata.md#name)
28 | - [updatable](types_app.AppMetadata.md#updatable)
29 | - [updatedRound](types_app.AppMetadata.md#updatedround)
30 | - [version](types_app.AppMetadata.md#version)
31 |
32 | ## Properties
33 |
34 | ### appAddress
35 |
36 | • **appAddress**: `string`
37 |
38 | The Algorand address of the account associated with the app
39 |
40 | #### Inherited from
41 |
42 | [AppReference](types_app.AppReference.md).[appAddress](types_app.AppReference.md#appaddress)
43 |
44 | #### Defined in
45 |
46 | [src/types/app.ts:43](https://github.com/algorandfoundation/algokit-utils-ts/blob/main/src/types/app.ts#L43)
47 |
48 | ___
49 |
50 | ### appId
51 |
52 | • **appId**: `number` \| `bigint`
53 |
54 | The id of the app
55 |
56 | #### Inherited from
57 |
58 | [AppReference](types_app.AppReference.md).[appId](types_app.AppReference.md#appid)
59 |
60 | #### Defined in
61 |
62 | [src/types/app.ts:41](https://github.com/algorandfoundation/algokit-utils-ts/blob/main/src/types/app.ts#L41)
63 |
64 | ___
65 |
66 | ### createdMetadata
67 |
68 | • **createdMetadata**: [`AppDeployMetadata`](types_app.AppDeployMetadata.md)
69 |
70 | The metadata when the app was created
71 |
72 | #### Defined in
73 |
74 | [src/types/app.ts:265](https://github.com/algorandfoundation/algokit-utils-ts/blob/main/src/types/app.ts#L265)
75 |
76 | ___
77 |
78 | ### createdRound
79 |
80 | • **createdRound**: `number`
81 |
82 | The round the app was created
83 |
84 | #### Defined in
85 |
86 | [src/types/app.ts:261](https://github.com/algorandfoundation/algokit-utils-ts/blob/main/src/types/app.ts#L261)
87 |
88 | ___
89 |
90 | ### deletable
91 |
92 | • `Optional` **deletable**: `boolean`
93 |
94 | Whether or not the app is deletable / permanent / unspecified
95 |
96 | #### Inherited from
97 |
98 | [AppDeployMetadata](types_app.AppDeployMetadata.md).[deletable](types_app.AppDeployMetadata.md#deletable)
99 |
100 | #### Defined in
101 |
102 | [src/types/app.ts:253](https://github.com/algorandfoundation/algokit-utils-ts/blob/main/src/types/app.ts#L253)
103 |
104 | ___
105 |
106 | ### deleted
107 |
108 | • **deleted**: `boolean`
109 |
110 | Whether or not the app is deleted
111 |
112 | #### Defined in
113 |
114 | [src/types/app.ts:267](https://github.com/algorandfoundation/algokit-utils-ts/blob/main/src/types/app.ts#L267)
115 |
116 | ___
117 |
118 | ### name
119 |
120 | • **name**: `string`
121 |
122 | The unique name identifier of the app within the creator account
123 |
124 | #### Inherited from
125 |
126 | [AppDeployMetadata](types_app.AppDeployMetadata.md).[name](types_app.AppDeployMetadata.md#name)
127 |
128 | #### Defined in
129 |
130 | [src/types/app.ts:249](https://github.com/algorandfoundation/algokit-utils-ts/blob/main/src/types/app.ts#L249)
131 |
132 | ___
133 |
134 | ### updatable
135 |
136 | • `Optional` **updatable**: `boolean`
137 |
138 | Whether or not the app is updatable / immutable / unspecified
139 |
140 | #### Inherited from
141 |
142 | [AppDeployMetadata](types_app.AppDeployMetadata.md).[updatable](types_app.AppDeployMetadata.md#updatable)
143 |
144 | #### Defined in
145 |
146 | [src/types/app.ts:255](https://github.com/algorandfoundation/algokit-utils-ts/blob/main/src/types/app.ts#L255)
147 |
148 | ___
149 |
150 | ### updatedRound
151 |
152 | • **updatedRound**: `number`
153 |
154 | The last round that the app was updated
155 |
156 | #### Defined in
157 |
158 | [src/types/app.ts:263](https://github.com/algorandfoundation/algokit-utils-ts/blob/main/src/types/app.ts#L263)
159 |
160 | ___
161 |
162 | ### version
163 |
164 | • **version**: `string`
165 |
166 | The version of app that is / will be deployed
167 |
168 | #### Inherited from
169 |
170 | [AppDeployMetadata](types_app.AppDeployMetadata.md).[version](types_app.AppDeployMetadata.md#version)
171 |
172 | #### Defined in
173 |
174 | [src/types/app.ts:251](https://github.com/algorandfoundation/algokit-utils-ts/blob/main/src/types/app.ts#L251)
175 |
```
--------------------------------------------------------------------------------
/packages/server/src/resources/knowledge/taxonomy/puya:python:testing:docs:testing-guide:concepts.md:
--------------------------------------------------------------------------------
```markdown
1 | # Concepts
2 |
3 | The following sections provide an overview of key concepts and features in the Algorand Python Testing framework.
4 |
5 | ## Test Context
6 |
7 | The main abstraction for interacting with the testing framework is the [`AlgopyTestContext`](../api-context.md#algopy_testing.AlgopyTestContext). It creates an emulated Algorand environment that closely mimics AVM behavior relevant to unit testing the contracts and provides a Pythonic interface for interacting with the emulated environment.
8 |
9 | ```python
10 | from algopy_testing import algopy_testing_context
11 |
12 | def test_my_contract():
13 | # Recommended way to instantiate the test context
14 | with algopy_testing_context() as ctx:
15 | # Your test code here
16 | pass
17 | # ctx is automatically reset after the test code is executed
18 | ```
19 |
20 | The context manager interface exposes three main properties:
21 |
22 | 1. `ledger`: An instance of `LedgerContext` for interacting with and querying the emulated Algorand ledger state.
23 | 2. `txn`: An instance of `TransactionContext` for creating and managing transaction groups, submitting transactions, and accessing transaction results.
24 | 3. `any`: An instance of `AlgopyValueGenerator` for generating randomized test data.
25 |
26 | For detailed method signatures, parameters, and return types, refer to the following API sections:
27 | - [`algopy_testing.LedgerContext`](../api.md)
28 | - [`algopy_testing.TransactionContext`](../api.md)
29 | - [`algopy_testing.AVMValueGenerator`, `algopy_testing.TxnValueGenerator`, `algopy_testing.ARC4ValueGenerator`](../api.md)
30 |
31 | The `any` property provides access to different value generators:
32 |
33 | - `AVMValueGenerator`: Base abstractions for AVM types. All methods are available directly on the instance returned from `any`.
34 | - `TxnValueGenerator`: Accessible via `any.txn`, for transaction-related data.
35 | - `ARC4ValueGenerator`: Accessible via `any.arc4`, for ARC4 type data.
36 |
37 | These generators allow creation of constrained random values for various AVM entities (accounts, assets, applications, etc.) when specific values are not required.
38 |
39 | ```{hint}
40 | Value generators are powerful tools for generating test data for specified AVM types. They allow further constraints on random value generation via arguments, making it easier to generate test data when exact values are not necessary.
41 |
42 | When used with the 'Arrange, Act, Assert' pattern, value generators can be especially useful in setting up clear and concise test data in arrange steps.
43 |
44 | They can also serve as a base building block that can be integrated/reused with popular Python property-based testing frameworks like [`hypothesis`](https://hypothesis.readthedocs.io/en/latest/).
45 | ```
46 |
47 | ## Types of `algopy` stub implementations
48 |
49 | As explained in the [introduction](index.md), `algorand-python-testing` _injects_ test implementations for stubs available in the `algorand-python` package. However, not all of the stubs are implemented in the same manner:
50 |
51 | 1. **Native**: Fully matches AVM computation in Python. For example, `algopy.op.sha256` and other cryptographic operations behave identically in AVM and unit tests. This implies that the majority of opcodes that are 'pure' functions in AVM also have a native Python implementation provided by this package. These abstractions and opcodes can be used within and outside of the testing context.
52 |
53 | 2. **Emulated**: Uses `AlgopyTestContext` to mimic AVM behavior. For example, `Box.put` on an `algopy.Box` within a test context stores data in the test manager, not the real Algorand network, but provides the same interface.
54 |
55 | 3. **Mockable**: Not implemented, but can be mocked or patched. For example, `algopy.abi_call` can be mocked to return specific values or behaviors; otherwise, it raises a `NotImplementedError`. This category covers cases where native or emulated implementation in a unit test context is impractical or overly complex.
56 |
57 | For a full list of all public `algopy` types and their corresponding implementation category, refer to the [Coverage](coverage.md) section.
58 | ```
59 |
```
--------------------------------------------------------------------------------
/packages/server/src/resources/knowledge/taxonomy/algokit:utils:python:markdown:capabilities:debugger.md:
--------------------------------------------------------------------------------
```markdown
1 | # Debugger
2 |
3 | The AlgoKit Python Utilities package provides a set of debugging tools that can be used to simulate and trace transactions on the Algorand blockchain. These tools and methods are optimized for developers who are building applications on Algorand and need to test and debug their smart contracts via [AlgoKit AVM Debugger extension](https://marketplace.visualstudio.com/items?itemName=algorandfoundation.algokit-avm-vscode-debugger).
4 |
5 | ## Configuration
6 |
7 | The `config.py` file contains the `UpdatableConfig` class which manages and updates configuration settings for the AlgoKit project. The class has the following attributes:
8 |
9 | - `debug`: Indicates whether debug mode is enabled.
10 | - `project_root`: The path to the project root directory. Can be ignored if you are using `algokit_utils` inside an `algokit` compliant project (containing `.algokit.toml` file). For non algokit compliant projects, simply provide the path to the folder where you want to store sourcemaps and traces to be used with [`AlgoKit AVM Debugger`](https://github.com/algorandfoundation/algokit-avm-vscode-debugger). Alternatively you can also set the value via the `ALGOKIT_PROJECT_ROOT` environment variable.
11 | - `trace_all`: Indicates whether to trace all operations. Defaults to false, this means that when debug mode is enabled, any (or all) application client calls performed via `algokit_utils` will store responses from `simulate` endpoint. These files are called traces, and can be used with `AlgoKit AVM Debugger` to debug TEAL source codes, transactions in the atomic group and etc.
12 | - `trace_buffer_size_mb`: The size of the trace buffer in megabytes. By default uses 256 megabytes. When output folder containing debug trace files exceedes the size, oldest files are removed to optimize for storage consumption.
13 | - `max_search_depth`: The maximum depth to search for a an `algokit` config file. By default it will traverse at most 10 folders searching for `.algokit.toml` file which will be used to assume algokit compliant project root path.
14 |
15 | The `configure` method can be used to set these attributes.
16 |
17 | To enable debug mode in your project you can configure it as follows:
18 |
19 | ```py
20 | from algokit_utils.config import config
21 |
22 | config.configure(debug=True)
23 | ```
24 |
25 | ## Debugging Utilities
26 |
27 | Debugging utilities can be used to simplify gathering artifacts to be used with [AlgoKit AVM Debugger](https://github.com/algorandfoundation/algokit-avm-vscode-debugger) in non algokit compliant projects. The following methods are provided:
28 |
29 | - `simulate_and_persist_response`: This method simulates the atomic transactions using the provided `AtomicTransactionComposer` object and `AlgodClient` object, and persists the simulation response to an AVM Debugger compliant JSON file. It takes an `AtomicTransactionComposer` object representing the atomic transactions to be simulated and persisted, a `Path` object representing the root directory of the project, an `AlgodClient` object representing the Algorand client, and a float representing the size of the trace buffer in megabytes.
30 |
31 | ### Trace filename format
32 |
33 | The trace files are named in a specific format to provide useful information about the transactions they contain. The format is as follows:
34 |
35 | ```ts
36 | `${timestamp}_lr${last_round}_${transaction_types}.trace.avm.json`;
37 | ```
38 |
39 | Where:
40 |
41 | - `timestamp`: The time when the trace file was created, in ISO 8601 format, with colons and periods removed.
42 | - `last_round`: The last round when the simulation was performed.
43 | - `transaction_types`: A string representing the types and counts of transactions in the atomic group. Each transaction type is represented as `${count}${type}`, and different transaction types are separated by underscores.
44 |
45 | For example, a trace file might be named `20220301T123456Z_lr1000_2pay_1axfer.trace.avm.json`, indicating that the trace file was created at `2022-03-01T12:34:56Z`, the last round was `1000`, and the atomic group contained 2 payment transactions and 1 asset transfer transaction.
46 |
```
--------------------------------------------------------------------------------
/packages/server/src/resources/knowledge/taxonomy/algokit:utils:python:source:capabilities:debugger.md:
--------------------------------------------------------------------------------
```markdown
1 | # Debugger
2 |
3 | The AlgoKit Python Utilities package provides a set of debugging tools that can be used to simulate and trace transactions on the Algorand blockchain. These tools and methods are optimized for developers who are building applications on Algorand and need to test and debug their smart contracts via [AlgoKit AVM Debugger extension](https://marketplace.visualstudio.com/items?itemName=algorandfoundation.algokit-avm-vscode-debugger).
4 |
5 | ## Configuration
6 |
7 | The `config.py` file contains the `UpdatableConfig` class which manages and updates configuration settings for the AlgoKit project. The class has the following attributes:
8 |
9 | - `debug`: Indicates whether debug mode is enabled.
10 | - `project_root`: The path to the project root directory. Can be ignored if you are using `algokit_utils` inside an `algokit` compliant project (containing `.algokit.toml` file). For non algokit compliant projects, simply provide the path to the folder where you want to store sourcemaps and traces to be used with [`AlgoKit AVM Debugger`](https://github.com/algorandfoundation/algokit-avm-vscode-debugger). Alternatively you can also set the value via the `ALGOKIT_PROJECT_ROOT` environment variable.
11 | - `trace_all`: Indicates whether to trace all operations. Defaults to false, this means that when debug mode is enabled, any (or all) application client calls performed via `algokit_utils` will store responses from `simulate` endpoint. These files are called traces, and can be used with `AlgoKit AVM Debugger` to debug TEAL source codes, transactions in the atomic group and etc.
12 | - `trace_buffer_size_mb`: The size of the trace buffer in megabytes. By default uses 256 megabytes. When output folder containing debug trace files exceedes the size, oldest files are removed to optimize for storage consumption.
13 | - `max_search_depth`: The maximum depth to search for a an `algokit` config file. By default it will traverse at most 10 folders searching for `.algokit.toml` file which will be used to assume algokit compliant project root path.
14 |
15 | The `configure` method can be used to set these attributes.
16 |
17 | To enable debug mode in your project you can configure it as follows:
18 |
19 | ```py
20 | from algokit_utils.config import config
21 |
22 | config.configure(debug=True)
23 | ```
24 |
25 | ## Debugging Utilities
26 |
27 | Debugging utilities can be used to simplify gathering artifacts to be used with [AlgoKit AVM Debugger](https://github.com/algorandfoundation/algokit-avm-vscode-debugger) in non algokit compliant projects. The following methods are provided:
28 |
29 | - `simulate_and_persist_response`: This method simulates the atomic transactions using the provided `AtomicTransactionComposer` object and `AlgodClient` object, and persists the simulation response to an AVM Debugger compliant JSON file. It takes an `AtomicTransactionComposer` object representing the atomic transactions to be simulated and persisted, a `Path` object representing the root directory of the project, an `AlgodClient` object representing the Algorand client, and a float representing the size of the trace buffer in megabytes.
30 |
31 | ### Trace filename format
32 |
33 | The trace files are named in a specific format to provide useful information about the transactions they contain. The format is as follows:
34 |
35 | ```ts
36 | `${timestamp}_lr${last_round}_${transaction_types}.trace.avm.json`;
37 | ```
38 |
39 | Where:
40 |
41 | - `timestamp`: The time when the trace file was created, in ISO 8601 format, with colons and periods removed.
42 | - `last_round`: The last round when the simulation was performed.
43 | - `transaction_types`: A string representing the types and counts of transactions in the atomic group. Each transaction type is represented as `${count}${type}`, and different transaction types are separated by underscores.
44 |
45 | For example, a trace file might be named `20220301T123456Z_lr1000_2pay_1axfer.trace.avm.json`, indicating that the trace file was created at `2022-03-01T12:34:56Z`, the last round was `1000`, and the atomic group contained 2 payment transactions and 1 asset transfer transaction.
46 |
```
--------------------------------------------------------------------------------
/packages/server/src/resources/knowledge/taxonomy/ARCs:pages:wallets.md:
--------------------------------------------------------------------------------
```markdown
1 | ---
2 | layout: page
3 | title: Algorand Wallet Compatiblity Matrix
4 | permalink: /wallets
5 | ---
6 | ## Status
7 | Allowed Status are:
8 | - Supported
9 | - Not Supported
10 | - Planned
11 | - EXPERIMENTAL
12 | - UNKNOWN
13 | - DEPRECATED
14 |
15 | ## Wallet ARCs
16 |
17 | | ARCS | Daffi | Defly | Exodus | Pera Wallet |
18 | | -------------- | ------------- | ------------- | ------------- | ------------- |
19 | | [1][ARC-1] | UNKNOWN | Supported | Supported | Supported |
20 | | [5][ARC-5] | UNKNOWN | Supported | Supported | Supported |
21 | | [6][ARC-6] | UNKNOWN | Not Supported | Not Supported | Not Supported |
22 | | [7][ARC-7] | UNKNOWN | Not Supported | Supported | Not Supported |
23 | | [8][ARC-8] | UNKNOWN | Not Supported | Supported | Not Supported |
24 | | [9][ARC-9] | UNKNOWN | Not Supported | Supported | Not Supported |
25 | | [10][ARC-10] | UNKNOWN | Not Supported | Supported | Not Supported |
26 | | [11][ARC-11] | UNKNOWN | Not Supported | Supported | Not Supported |
27 | | [25][ARC-25] | UNKNOWN | Supported | Supported | Supported |
28 | | [35][ARC-35] | UNKNOWN | Supported | Not Supported | Planned |
29 |
30 | [ARC-1]: ../ARCs/arc-0001.md "Algorand Wallet Transaction Signing API"
31 | [ARC-5]: ../ARCs/arc-0005.md "Wallet Transaction Signing API (Functional)"
32 | [ARC-6]: ../ARCs/arc-0006.md "Algorand Wallet Address Discovery API"
33 | [ARC-7]: ../ARCs/arc-0007.md "Algorand Wallet Post Transactions API"
34 | [ARC-8]: ../ARCs/arc-0008.md "Algorand Wallet Sign and Post API"
35 | [ARC-9]: ../ARCs/arc-0009.md "Algorand Wallet Algodv2 and Indexer API"
36 | [ARC-10]: ../ARCs/arc-0010.md "Algorand Wallet Reach Minimum Requirements"
37 | [ARC-11]: ../ARCs/arc-0011.md "Algorand Wallet Reach Browser Spec"
38 | [ARC-25]: ../ARCs/arc-0025.md "Algorand WalletConnect v1 API"
39 | [ARC-35]: ../ARCs/arc-0035.md "Algorand Offline Wallet Backup Protocol"
40 |
41 | ## NFT & Token ARCs
42 |
43 | | ARCS | Daffi | Defly | Exodus | Pera Wallet |
44 | | -------------- | ------------- | ------------- | ------------- | ------------- |
45 | | [3][ARC-3] | UNKNOWN | UNKNOWN | Supported | UNKNOWN |
46 | | [16][ARC-16] | UNKNOWN | UNKNOWN | Supported | UNKNOWN |
47 | | [19][ARC-19] | UNKNOWN | UNKNOWN | Supported | UNKNOWN |
48 | | [20][ARC-20] | UNKNOWN | UNKNOWN | Not Supported | UNKNOWN |
49 | | [69][ARC-69] | UNKNOWN | UNKNOWN | Supported | UNKNOWN |
50 | | [72][ARC-72] | UNKNOWN | UNKNOWN | Not Supported | UNKNOWN |
51 | | [200][ARC-200] | UNKNOWN | UNKNOWN | Not Supported | UNKNOWN |
52 |
53 | [ARC-3]: ../ARCs/arc-0003.md "Conventions Fungible/Non-Fungible Tokens"
54 | [ARC-16]: ../ARCs/arc-0016.md "Convention for declaring traits of an NFT's"
55 | [ARC-19]: ../ARCs/arc-0019.md "Templating of NFT ASA URLs for mutability"
56 | [ARC-20]: ../ARCs/arc-0020.md "Smart ASA"
57 | [ARC-69]: ../ARCs/arc-0069.md "ASA Parameters Conventions, Digital Media"
58 | [ARC-72]: ../ARCs/arc-0072.md "Algorand Smart Contract NFT Specification"
59 | [ARC-200]: ../ARCs/arc-0200.md "Algorand Smart Contract Token Specification"
60 |
61 |
62 | ## BIPS
63 |
64 | | BIPS | Daffi | Defly | Exodus | Pera Wallet |
65 | | -------------- | ------------- | ------------- | ------------- | ------------- |
66 | | [32][BIP-32] | UNKNOWN | Not supported | Supported | Not supported |
67 | | [39][BIP-39] | UNKNOWN | Planned | Supported | Planned |
68 | | [44][BIP-44] | UNKNOWN | Not supported | Supported | Not supported |
69 |
70 | [BIP-32]: https://github.com/bitcoin/bips/blob/master/bip-0032.mediawiki "Hierarchical Deterministic Wallets"
71 | [BIP-39]: https://github.com/bitcoin/bips/blob/master/bip-0039.mediawiki "Mnemonic code for generating deterministic keys"
72 | [BIP-44]: https://github.com/bitcoin/bips/blob/master/bip-0044.mediawiki "Multi-Account Hierarchy for Deterministic Wallets"
73 |
74 | **Disclaimer:** This website is under constant modification.
75 |
```
--------------------------------------------------------------------------------
/packages/server/src/resources/knowledge/taxonomy/algokit:utils:typescript:code:classes:types_account.MultisigAccount.md:
--------------------------------------------------------------------------------
```markdown
1 | [@algorandfoundation/algokit-utils](../README.md) / [types/account](../modules/types_account.md) / MultisigAccount
2 |
3 | # Class: MultisigAccount
4 |
5 | [types/account](../modules/types_account.md).MultisigAccount
6 |
7 | Account wrapper that supports partial or full multisig signing.
8 |
9 | ## Table of contents
10 |
11 | ### Constructors
12 |
13 | - [constructor](types_account.MultisigAccount.md#constructor)
14 |
15 | ### Properties
16 |
17 | - [\_addr](types_account.MultisigAccount.md#_addr)
18 | - [\_params](types_account.MultisigAccount.md#_params)
19 | - [\_signer](types_account.MultisigAccount.md#_signer)
20 | - [\_signingAccounts](types_account.MultisigAccount.md#_signingaccounts)
21 |
22 | ### Accessors
23 |
24 | - [addr](types_account.MultisigAccount.md#addr)
25 | - [params](types_account.MultisigAccount.md#params)
26 | - [signer](types_account.MultisigAccount.md#signer)
27 | - [signingAccounts](types_account.MultisigAccount.md#signingaccounts)
28 |
29 | ### Methods
30 |
31 | - [sign](types_account.MultisigAccount.md#sign)
32 |
33 | ## Constructors
34 |
35 | ### constructor
36 |
37 | • **new MultisigAccount**(`multisigParams`, `signingAccounts`): [`MultisigAccount`](types_account.MultisigAccount.md)
38 |
39 | #### Parameters
40 |
41 | | Name | Type |
42 | | :------ | :------ |
43 | | `multisigParams` | `MultisigMetadata` |
44 | | `signingAccounts` | (`default` \| [`SigningAccount`](types_account.SigningAccount.md))[] |
45 |
46 | #### Returns
47 |
48 | [`MultisigAccount`](types_account.MultisigAccount.md)
49 |
50 | #### Defined in
51 |
52 | [src/types/account.ts:45](https://github.com/algorandfoundation/algokit-utils-ts/blob/main/src/types/account.ts#L45)
53 |
54 | ## Properties
55 |
56 | ### \_addr
57 |
58 | • **\_addr**: `Address`
59 |
60 | #### Defined in
61 |
62 | [src/types/account.ts:23](https://github.com/algorandfoundation/algokit-utils-ts/blob/main/src/types/account.ts#L23)
63 |
64 | ___
65 |
66 | ### \_params
67 |
68 | • **\_params**: `MultisigMetadata`
69 |
70 | #### Defined in
71 |
72 | [src/types/account.ts:21](https://github.com/algorandfoundation/algokit-utils-ts/blob/main/src/types/account.ts#L21)
73 |
74 | ___
75 |
76 | ### \_signer
77 |
78 | • **\_signer**: `TransactionSigner`
79 |
80 | #### Defined in
81 |
82 | [src/types/account.ts:24](https://github.com/algorandfoundation/algokit-utils-ts/blob/main/src/types/account.ts#L24)
83 |
84 | ___
85 |
86 | ### \_signingAccounts
87 |
88 | • **\_signingAccounts**: (`default` \| [`SigningAccount`](types_account.SigningAccount.md))[]
89 |
90 | #### Defined in
91 |
92 | [src/types/account.ts:22](https://github.com/algorandfoundation/algokit-utils-ts/blob/main/src/types/account.ts#L22)
93 |
94 | ## Accessors
95 |
96 | ### addr
97 |
98 | • `get` **addr**(): `Readonly`\<`Address`\>
99 |
100 | The address of the multisig account
101 |
102 | #### Returns
103 |
104 | `Readonly`\<`Address`\>
105 |
106 | #### Defined in
107 |
108 | [src/types/account.ts:37](https://github.com/algorandfoundation/algokit-utils-ts/blob/main/src/types/account.ts#L37)
109 |
110 | ___
111 |
112 | ### params
113 |
114 | • `get` **params**(): `Readonly`\<`MultisigMetadata`\>
115 |
116 | The parameters for the multisig account
117 |
118 | #### Returns
119 |
120 | `Readonly`\<`MultisigMetadata`\>
121 |
122 | #### Defined in
123 |
124 | [src/types/account.ts:27](https://github.com/algorandfoundation/algokit-utils-ts/blob/main/src/types/account.ts#L27)
125 |
126 | ___
127 |
128 | ### signer
129 |
130 | • `get` **signer**(): `TransactionSigner`
131 |
132 | #### Returns
133 |
134 | `TransactionSigner`
135 |
136 | #### Defined in
137 |
138 | [src/types/account.ts:41](https://github.com/algorandfoundation/algokit-utils-ts/blob/main/src/types/account.ts#L41)
139 |
140 | ___
141 |
142 | ### signingAccounts
143 |
144 | • `get` **signingAccounts**(): readonly (`default` \| [`SigningAccount`](types_account.SigningAccount.md))[]
145 |
146 | The list of accounts that are present to sign
147 |
148 | #### Returns
149 |
150 | readonly (`default` \| [`SigningAccount`](types_account.SigningAccount.md))[]
151 |
152 | #### Defined in
153 |
154 | [src/types/account.ts:32](https://github.com/algorandfoundation/algokit-utils-ts/blob/main/src/types/account.ts#L32)
155 |
156 | ## Methods
157 |
158 | ### sign
159 |
160 | ▸ **sign**(`transaction`): `Uint8Array`
161 |
162 | Sign the given transaction
163 |
164 | #### Parameters
165 |
166 | | Name | Type | Description |
167 | | :------ | :------ | :------ |
168 | | `transaction` | `Uint8Array` \| `Transaction` | Either a transaction object or a raw, partially signed transaction |
169 |
170 | #### Returns
171 |
172 | `Uint8Array`
173 |
174 | The transaction signed by the present signers
175 |
176 | #### Defined in
177 |
178 | [src/types/account.ts:60](https://github.com/algorandfoundation/algokit-utils-ts/blob/main/src/types/account.ts#L60)
179 |
```
--------------------------------------------------------------------------------
/packages/server/src/tools/transactionManager/appTransactions/callTxn.ts:
--------------------------------------------------------------------------------
```typescript
1 | import { Transaction, makeApplicationNoOpTxnFromObject, OnApplicationComplete } from 'algosdk';
2 | import { McpError, ErrorCode } from '@modelcontextprotocol/sdk/types.js';
3 | import { AppCallTxnParams } from './types.js';
4 |
5 | /**
6 | * Creates an application call (NoOp) transaction
7 | * @param params The parameters for calling the application
8 | * @returns The created transaction
9 | * @throws {McpError} If the transaction creation fails
10 | */
11 | export function makeApplicationCallTxn(params: AppCallTxnParams): Transaction {
12 | try {
13 | // Create a new object with the required structure
14 | const txnParams = {
15 | from: params.from,
16 | appIndex: params.appIndex,
17 | suggestedParams: params.suggestedParams,
18 | note: params.note,
19 | lease: params.lease,
20 | rekeyTo: params.rekeyTo,
21 | appArgs: params.appArgs,
22 | accounts: params.accounts,
23 | foreignApps: params.foreignApps,
24 | foreignAssets: params.foreignAssets,
25 | boxes: params.boxes
26 | };
27 |
28 | // Pass the onComplete parameter separately
29 | return makeApplicationNoOpTxnFromObject({
30 | ...txnParams,
31 | onComplete: OnApplicationComplete.NoOpOC
32 | } as any); // Use type assertion since the types are not perfectly aligned
33 | } catch (error) {
34 | console.error('[MCP Error] Failed to create application call transaction:', error);
35 | throw new McpError(
36 | ErrorCode.InternalError,
37 | `Failed to create application call transaction: ${error instanceof Error ? error.message : 'Unknown error'}`
38 | );
39 | }
40 | }
41 |
42 | /**
43 | * Handles the application call tool request
44 | * @param args The tool arguments
45 | * @param suggestedParams The suggested transaction parameters
46 | * @returns The transaction parameters
47 | * @throws {McpError} If the parameters are invalid
48 | */
49 | export function handleCallTxn(args: Record<string, unknown>, suggestedParams: any): Record<string, any> {
50 | try {
51 | if (!args.from || !args.appIndex) {
52 | console.error('[MCP Error] Invalid application call parameters');
53 | throw new McpError(ErrorCode.InvalidParams, 'Invalid application call parameters');
54 | }
55 |
56 | // Create transaction with proper parameter handling
57 | const txnParams: Record<string, any> = {
58 | from: String(args.from),
59 | appIndex: Number(args.appIndex),
60 | fee: suggestedParams.fee,
61 | firstRound: suggestedParams.firstRound,
62 | lastRound: suggestedParams.lastRound,
63 | genesisID: suggestedParams.genesisID,
64 | genesisHash: suggestedParams.genesisHash,
65 | type: 'appl',
66 | onComplete: OnApplicationComplete.NoOpOC
67 | };
68 |
69 | // Handle optional fields
70 | if (typeof args.note === 'string') {
71 | const noteBytes = new TextEncoder().encode(args.note);
72 | txnParams.note = Buffer.from(noteBytes).toString('base64');
73 | }
74 | if (typeof args.lease === 'string') {
75 | const leaseBytes = new TextEncoder().encode(args.lease);
76 | txnParams.lease = Buffer.from(leaseBytes).toString('base64');
77 | }
78 | if (typeof args.rekeyTo === 'string') {
79 | txnParams.rekeyTo = String(args.rekeyTo);
80 | }
81 | if (Array.isArray(args.appArgs)) {
82 | txnParams.appArgs = args.appArgs.map(arg => {
83 | const bytes = new TextEncoder().encode(String(arg));
84 | return Buffer.from(bytes).toString('base64');
85 | });
86 | }
87 | if (Array.isArray(args.accounts)) {
88 | txnParams.accounts = args.accounts.filter((acc): acc is string => typeof acc === 'string');
89 | }
90 | if (Array.isArray(args.foreignApps)) {
91 | txnParams.foreignApps = args.foreignApps.filter((app): app is number => typeof app === 'number');
92 | }
93 | if (Array.isArray(args.foreignAssets)) {
94 | txnParams.foreignAssets = args.foreignAssets.filter((asset): asset is number => typeof asset === 'number');
95 | }
96 |
97 | return txnParams;
98 | } catch (error) {
99 | if (error instanceof McpError) {
100 | throw error;
101 | }
102 | console.error('[MCP Error] Failed to handle application call:', error);
103 | throw new McpError(
104 | ErrorCode.InternalError,
105 | `Failed to handle application call: ${error instanceof Error ? error.message : 'Unknown error'}`
106 | );
107 | }
108 | }
109 |
```
--------------------------------------------------------------------------------
/packages/server/src/resources/knowledge/taxonomy/algokit:utils:typescript:code:interfaces:types_testing.AlgorandFixtureConfig.md:
--------------------------------------------------------------------------------
```markdown
1 | [@algorandfoundation/algokit-utils](../README.md) / [types/testing](../modules/types_testing.md) / AlgorandFixtureConfig
2 |
3 | # Interface: AlgorandFixtureConfig
4 |
5 | [types/testing](../modules/types_testing.md).AlgorandFixtureConfig
6 |
7 | Configuration for creating an Algorand testing fixture.
8 |
9 | ## Hierarchy
10 |
11 | - `Partial`\<[`AlgoConfig`](types_network_client.AlgoConfig.md)\>
12 |
13 | ↳ **`AlgorandFixtureConfig`**
14 |
15 | ## Table of contents
16 |
17 | ### Properties
18 |
19 | - [accountGetter](types_testing.AlgorandFixtureConfig.md#accountgetter)
20 | - [algod](types_testing.AlgorandFixtureConfig.md#algod)
21 | - [algodConfig](types_testing.AlgorandFixtureConfig.md#algodconfig)
22 | - [indexer](types_testing.AlgorandFixtureConfig.md#indexer)
23 | - [indexerConfig](types_testing.AlgorandFixtureConfig.md#indexerconfig)
24 | - [kmd](types_testing.AlgorandFixtureConfig.md#kmd)
25 | - [kmdConfig](types_testing.AlgorandFixtureConfig.md#kmdconfig)
26 | - [testAccountFunding](types_testing.AlgorandFixtureConfig.md#testaccountfunding)
27 |
28 | ## Properties
29 |
30 | ### accountGetter
31 |
32 | • `Optional` **accountGetter**: (`algod`: `AlgodClient`, `kmd?`: `KmdClient`) => `Promise`\<`default`\>
33 |
34 | Optional override for how to get an account; this allows you to retrieve accounts from a known or cached list of accounts.
35 |
36 | #### Type declaration
37 |
38 | ▸ (`algod`, `kmd?`): `Promise`\<`default`\>
39 |
40 | ##### Parameters
41 |
42 | | Name | Type |
43 | | :------ | :------ |
44 | | `algod` | `AlgodClient` |
45 | | `kmd?` | `KmdClient` |
46 |
47 | ##### Returns
48 |
49 | `Promise`\<`default`\>
50 |
51 | #### Defined in
52 |
53 | [src/types/testing.ts:62](https://github.com/algorandfoundation/algokit-utils-ts/blob/main/src/types/testing.ts#L62)
54 |
55 | ___
56 |
57 | ### algod
58 |
59 | • `Optional` **algod**: `AlgodClient`
60 |
61 | An optional algod client, if not specified then it will create one against `algodConfig` (if present) then environment variables defined network (if present) or default LocalNet.
62 |
63 | #### Defined in
64 |
65 | [src/types/testing.ts:54](https://github.com/algorandfoundation/algokit-utils-ts/blob/main/src/types/testing.ts#L54)
66 |
67 | ___
68 |
69 | ### algodConfig
70 |
71 | • `Optional` **algodConfig**: [`AlgoClientConfig`](types_network_client.AlgoClientConfig.md)
72 |
73 | Algod client configuration
74 |
75 | #### Inherited from
76 |
77 | Partial.algodConfig
78 |
79 | #### Defined in
80 |
81 | [src/types/network-client.ts:16](https://github.com/algorandfoundation/algokit-utils-ts/blob/main/src/types/network-client.ts#L16)
82 |
83 | ___
84 |
85 | ### indexer
86 |
87 | • `Optional` **indexer**: `IndexerClient`
88 |
89 | An optional indexer client, if not specified then it will create one against `indexerConfig` (if present) then environment variables defined network (if present) or default LocalNet.
90 |
91 | #### Defined in
92 |
93 | [src/types/testing.ts:56](https://github.com/algorandfoundation/algokit-utils-ts/blob/main/src/types/testing.ts#L56)
94 |
95 | ___
96 |
97 | ### indexerConfig
98 |
99 | • `Optional` **indexerConfig**: [`AlgoClientConfig`](types_network_client.AlgoClientConfig.md)
100 |
101 | Indexer client configuration
102 |
103 | #### Inherited from
104 |
105 | Partial.indexerConfig
106 |
107 | #### Defined in
108 |
109 | [src/types/network-client.ts:18](https://github.com/algorandfoundation/algokit-utils-ts/blob/main/src/types/network-client.ts#L18)
110 |
111 | ___
112 |
113 | ### kmd
114 |
115 | • `Optional` **kmd**: `KmdClient`
116 |
117 | An optional kmd client, if not specified then it will create one against `kmdConfig` (if present) then environment variables defined network (if present) or default LocalNet.
118 |
119 | #### Defined in
120 |
121 | [src/types/testing.ts:58](https://github.com/algorandfoundation/algokit-utils-ts/blob/main/src/types/testing.ts#L58)
122 |
123 | ___
124 |
125 | ### kmdConfig
126 |
127 | • `Optional` **kmdConfig**: [`AlgoClientConfig`](types_network_client.AlgoClientConfig.md)
128 |
129 | Kmd configuration
130 |
131 | #### Inherited from
132 |
133 | Partial.kmdConfig
134 |
135 | #### Defined in
136 |
137 | [src/types/network-client.ts:20](https://github.com/algorandfoundation/algokit-utils-ts/blob/main/src/types/network-client.ts#L20)
138 |
139 | ___
140 |
141 | ### testAccountFunding
142 |
143 | • `Optional` **testAccountFunding**: [`AlgoAmount`](../classes/types_amount.AlgoAmount.md)
144 |
145 | The amount of funds to allocate to the default testing account, if not specified then it will get 10 ALGO.
146 |
147 | #### Defined in
148 |
149 | [src/types/testing.ts:60](https://github.com/algorandfoundation/algokit-utils-ts/blob/main/src/types/testing.ts#L60)
150 |
```
--------------------------------------------------------------------------------
/packages/server/src/tools/transactionManager/appTransactions/optInTxn.ts:
--------------------------------------------------------------------------------
```typescript
1 | import { Transaction, makeApplicationOptInTxnFromObject, OnApplicationComplete } from 'algosdk';
2 | import { McpError, ErrorCode } from '@modelcontextprotocol/sdk/types.js';
3 | import { AppOptInTxnParams } from './types.js';
4 |
5 | /**
6 | * Creates an application opt-in transaction
7 | * @param params The parameters for opting into the application
8 | * @returns The created transaction
9 | * @throws {McpError} If the transaction creation fails
10 | */
11 | export function makeApplicationOptInTxn(params: AppOptInTxnParams): Transaction {
12 | try {
13 | // Create a new object with the required structure
14 | const txnParams = {
15 | from: params.from,
16 | appIndex: params.appIndex,
17 | suggestedParams: params.suggestedParams,
18 | note: params.note,
19 | lease: params.lease,
20 | rekeyTo: params.rekeyTo,
21 | appArgs: params.appArgs,
22 | accounts: params.accounts,
23 | foreignApps: params.foreignApps,
24 | foreignAssets: params.foreignAssets,
25 | boxes: params.boxes
26 | };
27 |
28 | // Pass the onComplete parameter separately
29 | return makeApplicationOptInTxnFromObject({
30 | ...txnParams,
31 | onComplete: OnApplicationComplete.OptInOC
32 | } as any); // Use type assertion since the types are not perfectly aligned
33 | } catch (error) {
34 | console.error('[MCP Error] Failed to create application opt-in transaction:', error);
35 | throw new McpError(
36 | ErrorCode.InternalError,
37 | `Failed to create application opt-in transaction: ${error instanceof Error ? error.message : 'Unknown error'}`
38 | );
39 | }
40 | }
41 |
42 | /**
43 | * Handles the application opt-in tool request
44 | * @param args The tool arguments
45 | * @param suggestedParams The suggested transaction parameters
46 | * @returns The transaction parameters
47 | * @throws {McpError} If the parameters are invalid
48 | */
49 | export function handleOptInTxn(args: Record<string, unknown>, suggestedParams: any): Record<string, any> {
50 | try {
51 | if (!args.from || !args.appIndex) {
52 | console.error('[MCP Error] Invalid application opt-in parameters');
53 | throw new McpError(ErrorCode.InvalidParams, 'Invalid application opt-in parameters');
54 | }
55 |
56 | // Create transaction with proper parameter handling
57 | const txnParams: Record<string, any> = {
58 | from: String(args.from),
59 | appIndex: Number(args.appIndex),
60 | fee: suggestedParams.fee,
61 | firstRound: suggestedParams.firstRound,
62 | lastRound: suggestedParams.lastRound,
63 | genesisID: suggestedParams.genesisID,
64 | genesisHash: suggestedParams.genesisHash,
65 | type: 'appl',
66 | onComplete: OnApplicationComplete.OptInOC
67 | };
68 |
69 | // Handle optional fields
70 | if (typeof args.note === 'string') {
71 | const noteBytes = new TextEncoder().encode(args.note);
72 | txnParams.note = Buffer.from(noteBytes).toString('base64');
73 | }
74 | if (typeof args.lease === 'string') {
75 | const leaseBytes = new TextEncoder().encode(args.lease);
76 | txnParams.lease = Buffer.from(leaseBytes).toString('base64');
77 | }
78 | if (typeof args.rekeyTo === 'string') {
79 | txnParams.rekeyTo = String(args.rekeyTo);
80 | }
81 | if (Array.isArray(args.appArgs)) {
82 | txnParams.appArgs = args.appArgs.map(arg => {
83 | const bytes = new TextEncoder().encode(String(arg));
84 | return Buffer.from(bytes).toString('base64');
85 | });
86 | }
87 | if (Array.isArray(args.accounts)) {
88 | txnParams.accounts = args.accounts.filter((acc): acc is string => typeof acc === 'string');
89 | }
90 | if (Array.isArray(args.foreignApps)) {
91 | txnParams.foreignApps = args.foreignApps.filter((app): app is number => typeof app === 'number');
92 | }
93 | if (Array.isArray(args.foreignAssets)) {
94 | txnParams.foreignAssets = args.foreignAssets.filter((asset): asset is number => typeof asset === 'number');
95 | }
96 |
97 | return txnParams;
98 | } catch (error) {
99 | if (error instanceof McpError) {
100 | throw error;
101 | }
102 | console.error('[MCP Error] Failed to handle application opt-in:', error);
103 | throw new McpError(
104 | ErrorCode.InternalError,
105 | `Failed to handle application opt-in: ${error instanceof Error ? error.message : 'Unknown error'}`
106 | );
107 | }
108 | }
109 |
```
--------------------------------------------------------------------------------
/packages/server/src/resources/knowledge/taxonomy/liquid-auth:docs:server:integrations.md:
--------------------------------------------------------------------------------
```markdown
1 | ---
2 | title: "Server: Integrations"
3 | sidebar:
4 | order: 3
5 | label: 'Integrations'
6 | next: false
7 | ---
8 |
9 | ### NGINX
10 |
11 | The official Docker image supports ENV variable substitution in the template folder.
12 | Add your distribution to the container under `/usr/share/nginx/html`
13 | Make sure to configure a `LIQUID_API_HOST` ENV variable that points to your deployed Liquid Auth API.
14 |
15 | ```nginx
16 | ///etc/nginx/template/default.conf.template
17 |
18 | server {
19 | listen 80;
20 | listen [::]:80;
21 | server_name localhost;
22 |
23 | root /usr/share/nginx/html;
24 |
25 | location / {
26 | index index.html index.htm;
27 | expires -1;
28 | try_files $uri $uri/ @fallback;
29 | }
30 |
31 | location @fallback {
32 | proxy_set_header Host ${LIQUID_API_HOST};
33 | proxy_set_header X-Real-IP $remote_addr;
34 | proxy_ssl_server_name on;
35 | proxy_pass https://${LIQUID_API_HOST};
36 | }
37 | }
38 |
39 | ```
40 |
41 | ### Vite
42 | > We recommend running a proxy server like Nginx in production. This will work for local development
43 |
44 | ```typescript
45 | //vite.config.ts
46 |
47 | const DEFAULT_PROXY_URL = 'http://localhost:3000';
48 | const DEFAULT_WSS_PROXY_URL = 'ws://localhost:3000';
49 | export default defineConfig({
50 | server: {
51 | proxy: {
52 | '^/auth/.*': process.env.PROXY_URL || DEFAULT_PROXY_URL,
53 | '^/.well-known/.*': process.env.PROXY_URL || DEFAULT_PROXY_URL,
54 | '^/attestation/.*': process.env.PROXY_URL || DEFAULT_PROXY_URL,
55 | '^/assertion/.*': process.env.PROXY_URL || DEFAULT_PROXY_URL,
56 | '/socket.io': {
57 | target: process.env.WSS_PROXY_SERVER || DEFAULT_WSS_PROXY_URL,
58 | ws: true,
59 | },
60 | }
61 | },
62 | })
63 | ```
64 |
65 | ### Next.js
66 | > We recommend running a proxy server like Nginx in production. This will work in a pinch or to test locally.
67 |
68 | Deploy the service to a platform like Render or AWS then configure the Proxy in `next.config.js`.
69 |
70 | ```typescript
71 | //next.config.js
72 | /** @type {import('next').NextConfig} */
73 |
74 | const serverURL = "https://my-liquid-service.com";
75 |
76 | const nextConfig = {
77 | trailingSlash: true,
78 | async rewrites() {
79 | return [
80 | {
81 | source: '/auth/:path*',
82 | destination: `${serverURL}/auth/:path*`,
83 | },
84 | {
85 | source: '/.well-known/:path*',
86 | destination: `${serverURL}/.well-known/:path*`,
87 | },
88 | {
89 | source: '/attestation/:path*',
90 | destination: `${serverURL}/attestation/:path*`,
91 | },
92 |
93 | {
94 | source: '/assertion/:path*',
95 | destination: `${serverURL}/assertion/:path*`,
96 | },
97 | {
98 | source: '/socket.io/',
99 | destination: `${serverURL}/socket.io/`,
100 | },
101 | {
102 | source: '/socket.io',
103 | destination: `${serverURL}/socket.io/`,
104 | },
105 | ]
106 | },
107 | };
108 |
109 | export default nextConfig;
110 | ```
111 |
112 | ### Nest.js[WIP]
113 | > Warning, the Service package is not available publicly.
114 | > Please contact if you are interested in mounting the server
115 |
116 | See the [Demo Express](https://github.com/algorandfoundation/liquid-auth/blob/develop/sites/express-dapp/src/main.ts) app for an example of how to mount the server.
117 |
118 | ```shell
119 | npm install @algorandfoundation/liquid-server --save
120 | ```
121 |
122 | ```typescript
123 | //src/main.ts
124 | import { AppModule, RedisIoAdapter } from '@algorandfoundation/liquid-server';
125 |
126 | async function bootstrap() {
127 | const app = await NestFactory.create(AppModule);
128 | app.useWebSocketAdapter(new RedisIoAdapter(app));
129 | await app.listen(3000);
130 | }
131 | ```
132 |
133 | ### Vercel
134 | > We recommend running a proxy server like Nginx in production. This will work in a pinch
135 |
136 | ```json
137 | //vercel.json
138 | {
139 | "rewrites": [
140 | {
141 | "source": "/auth/:path*",
142 | "destination": "${serverURL}/auth/:path*"
143 | },
144 | {
145 | "source": "/.well-known/:path*",
146 | "destination": "${serverURL}/.well-known/:path*"
147 | },
148 | {
149 | "source": "/attestation/:path*",
150 | "destination": "/attestation/:path*"
151 | },
152 |
153 | {
154 | "source": "/assertion/:path*",
155 | "destination": "${serverURL}/assertion/:path*"
156 | },
157 | {
158 | "source": "/socket.io/",
159 | "destination": "${serverURL}/socket.io/"
160 | },
161 | {
162 | "source": "/socket.io",
163 | "destination": "${serverURL}/socket.io/"
164 | }
165 | ]
166 | }
167 | ```
168 |
169 |
```
--------------------------------------------------------------------------------
/packages/server/src/tools/transactionManager/appTransactions/deleteTxn.ts:
--------------------------------------------------------------------------------
```typescript
1 | import { Transaction, makeApplicationDeleteTxnFromObject, OnApplicationComplete } from 'algosdk';
2 | import { McpError, ErrorCode } from '@modelcontextprotocol/sdk/types.js';
3 | import { AppDeleteTxnParams } from './types.js';
4 |
5 | /**
6 | * Creates an application delete transaction
7 | * @param params The parameters for deleting the application
8 | * @returns The created transaction
9 | * @throws {McpError} If the transaction creation fails
10 | */
11 | export function makeApplicationDeleteTxn(params: AppDeleteTxnParams): Transaction {
12 | try {
13 | // Create a new object with the required structure
14 | const txnParams = {
15 | from: params.from,
16 | appIndex: params.appIndex,
17 | suggestedParams: params.suggestedParams,
18 | note: params.note,
19 | lease: params.lease,
20 | rekeyTo: params.rekeyTo,
21 | appArgs: params.appArgs,
22 | accounts: params.accounts,
23 | foreignApps: params.foreignApps,
24 | foreignAssets: params.foreignAssets,
25 | boxes: params.boxes
26 | };
27 |
28 | // Pass the onComplete parameter separately
29 | return makeApplicationDeleteTxnFromObject({
30 | ...txnParams,
31 | onComplete: OnApplicationComplete.DeleteApplicationOC
32 | } as any); // Use type assertion since the types are not perfectly aligned
33 | } catch (error) {
34 | console.error('[MCP Error] Failed to create application delete transaction:', error);
35 | throw new McpError(
36 | ErrorCode.InternalError,
37 | `Failed to create application delete transaction: ${error instanceof Error ? error.message : 'Unknown error'}`
38 | );
39 | }
40 | }
41 |
42 | /**
43 | * Handles the application delete tool request
44 | * @param args The tool arguments
45 | * @param suggestedParams The suggested transaction parameters
46 | * @returns The transaction parameters
47 | * @throws {McpError} If the parameters are invalid
48 | */
49 | export function handleDeleteTxn(args: Record<string, unknown>, suggestedParams: any): Record<string, any> {
50 | try {
51 | if (!args.from || !args.appIndex) {
52 | console.error('[MCP Error] Invalid application delete parameters');
53 | throw new McpError(ErrorCode.InvalidParams, 'Invalid application delete parameters');
54 | }
55 |
56 | // Create transaction with proper parameter handling
57 | const txnParams: Record<string, any> = {
58 | from: String(args.from),
59 | appIndex: Number(args.appIndex),
60 | fee: suggestedParams.fee,
61 | firstRound: suggestedParams.firstRound,
62 | lastRound: suggestedParams.lastRound,
63 | genesisID: suggestedParams.genesisID,
64 | genesisHash: suggestedParams.genesisHash,
65 | type: 'appl',
66 | onComplete: OnApplicationComplete.DeleteApplicationOC
67 | };
68 |
69 | // Handle optional fields
70 | if (typeof args.note === 'string') {
71 | const noteBytes = new TextEncoder().encode(args.note);
72 | txnParams.note = Buffer.from(noteBytes).toString('base64');
73 | }
74 | if (typeof args.lease === 'string') {
75 | const leaseBytes = new TextEncoder().encode(args.lease);
76 | txnParams.lease = Buffer.from(leaseBytes).toString('base64');
77 | }
78 | if (typeof args.rekeyTo === 'string') {
79 | txnParams.rekeyTo = String(args.rekeyTo);
80 | }
81 | if (Array.isArray(args.appArgs)) {
82 | txnParams.appArgs = args.appArgs.map(arg => {
83 | const bytes = new TextEncoder().encode(String(arg));
84 | return Buffer.from(bytes).toString('base64');
85 | });
86 | }
87 | if (Array.isArray(args.accounts)) {
88 | txnParams.accounts = args.accounts.filter((acc): acc is string => typeof acc === 'string');
89 | }
90 | if (Array.isArray(args.foreignApps)) {
91 | txnParams.foreignApps = args.foreignApps.filter((app): app is number => typeof app === 'number');
92 | }
93 | if (Array.isArray(args.foreignAssets)) {
94 | txnParams.foreignAssets = args.foreignAssets.filter((asset): asset is number => typeof asset === 'number');
95 | }
96 |
97 | return txnParams;
98 | } catch (error) {
99 | if (error instanceof McpError) {
100 | throw error;
101 | }
102 | console.error('[MCP Error] Failed to handle application delete:', error);
103 | throw new McpError(
104 | ErrorCode.InternalError,
105 | `Failed to handle application delete: ${error instanceof Error ? error.message : 'Unknown error'}`
106 | );
107 | }
108 | }
109 |
```
--------------------------------------------------------------------------------
/packages/server/src/resources/knowledge/taxonomy/algokit:cli:features:tasks:wallet.md:
--------------------------------------------------------------------------------
```markdown
1 | # AlgoKit Task Wallet
2 |
3 | Manage your Algorand addresses and accounts effortlessly with the AlgoKit Wallet feature. This feature allows you to create short aliases for your addresses and accounts on AlgoKit CLI.
4 |
5 | ## Usage
6 |
7 | Available commands and possible usage as follows:
8 |
9 | ```bash
10 | $ ~ algokit task wallet
11 | Usage: algokit task wallet [OPTIONS] COMMAND [ARGS]...
12 |
13 | Create short aliases for your addresses and accounts on AlgoKit CLI.
14 |
15 | Options:
16 | -h, --help Show this message and exit.
17 |
18 | Commands:
19 | add Add an address or account to be stored against a named alias.
20 | get Get an address or account stored against a named alias.
21 | list List all addresses and accounts stored against a named alias.
22 | remove Remove an address or account stored against a named alias.
23 | reset Remove all aliases.
24 | ```
25 |
26 | ## Commands
27 |
28 | ### Add
29 |
30 | This command adds an address or account to be stored against a named alias. If the `--mnemonic` flag is used, it will prompt the user for a mnemonic phrase interactively using masked input. If the `--force` flag is used, it will allow overwriting an existing alias. Maximum number of aliases that can be stored at a time is 50.
31 |
32 | ```bash
33 | $ algokit wallet add [OPTIONS] ALIAS_NAME
34 | ```
35 |
36 | > Please note, the command is not designed to be used in CI scope, there is no option to skip interactive masked input of the mnemonic, if you want to alias an `Account` (both private and public key) entity.
37 |
38 | #### Options
39 |
40 | - `--address, -a TEXT`: Specifies the address of the account. This option is required.
41 | - `--mnemonic, -m`: If specified, it prompts the user for a mnemonic phrase interactively using masked input.
42 | - `--force, -f`: If specified, it allows overwriting an existing alias without interactive confirmation prompt.
43 |
44 | ### Get
45 |
46 | This command retrieves an address or account stored against a named alias.
47 |
48 | ```bash
49 | $ algokit wallet get ALIAS
50 | ```
51 |
52 | ### List
53 |
54 | This command lists all addresses and accounts stored against a named alias. If a record contains a `private_key` it will show a boolean flag indicating whether it exists, actual private key values are never exposed. As a user you can obtain the content of the stored aliases by navigating to your dedicated password manager (see [keyring details](https://pypi.org/project/keyring/)).
55 |
56 | ```bash
57 | $ algokit wallet list
58 | ```
59 |
60 | ### Remove
61 |
62 | This command removes an address or account stored against a named alias.
63 | You must confirm the prompt interactively or pass `--force` | `-f` flag to ignore the prompt.
64 |
65 | ```bash
66 | $ algokit wallet remove ALIAS [--force | -f]
67 | ```
68 |
69 | ### Reset
70 |
71 | This command removes all aliases. You must confirm the prompt interactively or pass `--force` | `-f` flag to ignore the prompt.
72 |
73 | ```bash
74 | $ algokit wallet reset [--force | -f]
75 | ```
76 |
77 | ## Keyring
78 |
79 | AlgoKit relies on the [keyring](https://pypi.org/project/keyring/) library, which provides an easy way to interact with the operating system's password manager. This abstraction allows AlgoKit to securely manage sensitive information such as mnemonics and private keys.
80 |
81 | When you use AlgoKit to store a mnemonic, it is never printed or exposed directly in the console. Instead, the mnemonic is converted and stored as a private key in the password manager. This ensures that your sensitive information is kept secure.
82 |
83 | To retrieve the stored mnemonic, you will need to manually navigate to your operating system's password manager. The keyring library supports a variety of password managers across different operating systems. Here are some examples:
84 |
85 | - On macOS, it uses the Keychain Access app.
86 | - On Windows, it uses the Credential Manager.
87 | - On Linux, it can use Secret Service API, KWallet, or an in-memory store depending on your setup.
88 |
89 | > Remember, AlgoKit is designed to keep your sensitive information secure however your storage is only as secure as the device on which it is stored. Always ensure to maintain good security practices on your device, especially when dealing with mnemonics that are to be used on MainNet.
90 |
91 | ## Further Reading
92 |
93 | For in-depth details, visit the [wallet section](../../cli/index.md#wallet) in the AlgoKit CLI reference documentation.
94 |
```
--------------------------------------------------------------------------------
/packages/server/src/resources/knowledge/taxonomy/SDKs:javascript:classes:indexerModels.ApplicationLocalState.md:
--------------------------------------------------------------------------------
```markdown
1 | [algosdk](../README.md) / [Exports](../modules.md) / [indexerModels](../modules/indexerModels.md) / ApplicationLocalState
2 |
3 | # Class: ApplicationLocalState
4 |
5 | [indexerModels](../modules/indexerModels.md).ApplicationLocalState
6 |
7 | Stores local state associated with an application.
8 |
9 | ## Hierarchy
10 |
11 | - `default`
12 |
13 | ↳ **`ApplicationLocalState`**
14 |
15 | ## Table of contents
16 |
17 | ### Constructors
18 |
19 | - [constructor](indexerModels.ApplicationLocalState.md#constructor)
20 |
21 | ### Properties
22 |
23 | - [attribute\_map](indexerModels.ApplicationLocalState.md#attribute_map)
24 | - [closedOutAtRound](indexerModels.ApplicationLocalState.md#closedoutatround)
25 | - [deleted](indexerModels.ApplicationLocalState.md#deleted)
26 | - [id](indexerModels.ApplicationLocalState.md#id)
27 | - [keyValue](indexerModels.ApplicationLocalState.md#keyvalue)
28 | - [optedInAtRound](indexerModels.ApplicationLocalState.md#optedinatround)
29 | - [schema](indexerModels.ApplicationLocalState.md#schema)
30 |
31 | ### Methods
32 |
33 | - [get\_obj\_for\_encoding](indexerModels.ApplicationLocalState.md#get_obj_for_encoding)
34 | - [from\_obj\_for\_encoding](indexerModels.ApplicationLocalState.md#from_obj_for_encoding)
35 |
36 | ## Constructors
37 |
38 | ### constructor
39 |
40 | • **new ApplicationLocalState**(`«destructured»`)
41 |
42 | Creates a new `ApplicationLocalState` object.
43 |
44 | #### Parameters
45 |
46 | | Name | Type |
47 | | :------ | :------ |
48 | | `«destructured»` | `Object` |
49 | | › `closedOutAtRound?` | `number` \| `bigint` |
50 | | › `deleted?` | `boolean` |
51 | | › `id` | `number` \| `bigint` |
52 | | › `keyValue?` | [`TealKeyValue`](indexerModels.TealKeyValue.md)[] |
53 | | › `optedInAtRound?` | `number` \| `bigint` |
54 | | › `schema` | [`ApplicationStateSchema`](indexerModels.ApplicationStateSchema.md) |
55 |
56 | #### Overrides
57 |
58 | BaseModel.constructor
59 |
60 | #### Defined in
61 |
62 | client/v2/indexer/models/types.ts:908
63 |
64 | ## Properties
65 |
66 | ### attribute\_map
67 |
68 | • **attribute\_map**: `Record`\<`string`, `string`\>
69 |
70 | #### Inherited from
71 |
72 | BaseModel.attribute\_map
73 |
74 | #### Defined in
75 |
76 | client/v2/basemodel.ts:56
77 |
78 | ___
79 |
80 | ### closedOutAtRound
81 |
82 | • `Optional` **closedOutAtRound**: `number` \| `bigint`
83 |
84 | Round when account closed out of the application.
85 |
86 | #### Defined in
87 |
88 | client/v2/indexer/models/types.ts:880
89 |
90 | ___
91 |
92 | ### deleted
93 |
94 | • `Optional` **deleted**: `boolean`
95 |
96 | Whether or not the application local state is currently deleted from its
97 | account.
98 |
99 | #### Defined in
100 |
101 | client/v2/indexer/models/types.ts:886
102 |
103 | ___
104 |
105 | ### id
106 |
107 | • **id**: `number` \| `bigint`
108 |
109 | The application which this local state is for.
110 |
111 | #### Defined in
112 |
113 | client/v2/indexer/models/types.ts:870
114 |
115 | ___
116 |
117 | ### keyValue
118 |
119 | • `Optional` **keyValue**: [`TealKeyValue`](indexerModels.TealKeyValue.md)[]
120 |
121 | storage.
122 |
123 | #### Defined in
124 |
125 | client/v2/indexer/models/types.ts:891
126 |
127 | ___
128 |
129 | ### optedInAtRound
130 |
131 | • `Optional` **optedInAtRound**: `number` \| `bigint`
132 |
133 | Round when the account opted into the application.
134 |
135 | #### Defined in
136 |
137 | client/v2/indexer/models/types.ts:896
138 |
139 | ___
140 |
141 | ### schema
142 |
143 | • **schema**: [`ApplicationStateSchema`](indexerModels.ApplicationStateSchema.md)
144 |
145 | schema.
146 |
147 | #### Defined in
148 |
149 | client/v2/indexer/models/types.ts:875
150 |
151 | ## Methods
152 |
153 | ### get\_obj\_for\_encoding
154 |
155 | ▸ **get_obj_for_encoding**(`binary?`): `Record`\<`string`, `any`\>
156 |
157 | Get an object ready for encoding to either JSON or msgpack.
158 |
159 | #### Parameters
160 |
161 | | Name | Type | Default value | Description |
162 | | :------ | :------ | :------ | :------ |
163 | | `binary` | `boolean` | `false` | Use true to indicate that the encoding can handle raw binary objects (Uint8Arrays). Use false to indicate that raw binary objects should be converted to base64 strings. True should be used for objects that will be encoded with msgpack, and false should be used for objects that will be encoded with JSON. |
164 |
165 | #### Returns
166 |
167 | `Record`\<`string`, `any`\>
168 |
169 | #### Inherited from
170 |
171 | BaseModel.get\_obj\_for\_encoding
172 |
173 | #### Defined in
174 |
175 | client/v2/basemodel.ts:65
176 |
177 | ___
178 |
179 | ### from\_obj\_for\_encoding
180 |
181 | ▸ `Static` **from_obj_for_encoding**(`data`): [`ApplicationLocalState`](indexerModels.ApplicationLocalState.md)
182 |
183 | #### Parameters
184 |
185 | | Name | Type |
186 | | :------ | :------ |
187 | | `data` | `Record`\<`string`, `any`\> |
188 |
189 | #### Returns
190 |
191 | [`ApplicationLocalState`](indexerModels.ApplicationLocalState.md)
192 |
193 | #### Defined in
194 |
195 | client/v2/indexer/models/types.ts:942
196 |
```
--------------------------------------------------------------------------------
/packages/server/src/tools/transactionManager/appTransactions/closeOutTxn.ts:
--------------------------------------------------------------------------------
```typescript
1 | import { Transaction, makeApplicationCloseOutTxnFromObject, OnApplicationComplete } from 'algosdk';
2 | import { McpError, ErrorCode } from '@modelcontextprotocol/sdk/types.js';
3 | import { AppCloseOutTxnParams } from './types.js';
4 |
5 | /**
6 | * Creates an application close-out transaction
7 | * @param params The parameters for closing out from the application
8 | * @returns The created transaction
9 | * @throws {McpError} If the transaction creation fails
10 | */
11 | export function makeApplicationCloseOutTxn(params: AppCloseOutTxnParams): Transaction {
12 | try {
13 | // Create a new object with the required structure
14 | const txnParams = {
15 | from: params.from,
16 | appIndex: params.appIndex,
17 | suggestedParams: params.suggestedParams,
18 | note: params.note,
19 | lease: params.lease,
20 | rekeyTo: params.rekeyTo,
21 | appArgs: params.appArgs,
22 | accounts: params.accounts,
23 | foreignApps: params.foreignApps,
24 | foreignAssets: params.foreignAssets,
25 | boxes: params.boxes
26 | };
27 |
28 | // Pass the onComplete parameter separately
29 | return makeApplicationCloseOutTxnFromObject({
30 | ...txnParams,
31 | onComplete: OnApplicationComplete.CloseOutOC
32 | } as any); // Use type assertion since the types are not perfectly aligned
33 | } catch (error) {
34 | console.error('[MCP Error] Failed to create application close-out transaction:', error);
35 | throw new McpError(
36 | ErrorCode.InternalError,
37 | `Failed to create application close-out transaction: ${error instanceof Error ? error.message : 'Unknown error'}`
38 | );
39 | }
40 | }
41 |
42 | /**
43 | * Handles the application close-out tool request
44 | * @param args The tool arguments
45 | * @param suggestedParams The suggested transaction parameters
46 | * @returns The transaction parameters
47 | * @throws {McpError} If the parameters are invalid
48 | */
49 | export function handleCloseOutTxn(args: Record<string, unknown>, suggestedParams: any): Record<string, any> {
50 | try {
51 | if (!args.from || !args.appIndex) {
52 | console.error('[MCP Error] Invalid application close-out parameters');
53 | throw new McpError(ErrorCode.InvalidParams, 'Invalid application close-out parameters');
54 | }
55 |
56 | // Create transaction with proper parameter handling
57 | const txnParams: Record<string, any> = {
58 | from: String(args.from),
59 | appIndex: Number(args.appIndex),
60 | fee: suggestedParams.fee,
61 | firstRound: suggestedParams.firstRound,
62 | lastRound: suggestedParams.lastRound,
63 | genesisID: suggestedParams.genesisID,
64 | genesisHash: suggestedParams.genesisHash,
65 | type: 'appl',
66 | onComplete: OnApplicationComplete.CloseOutOC
67 | };
68 |
69 | // Handle optional fields
70 | if (typeof args.note === 'string') {
71 | const noteBytes = new TextEncoder().encode(args.note);
72 | txnParams.note = Buffer.from(noteBytes).toString('base64');
73 | }
74 | if (typeof args.lease === 'string') {
75 | const leaseBytes = new TextEncoder().encode(args.lease);
76 | txnParams.lease = Buffer.from(leaseBytes).toString('base64');
77 | }
78 | if (typeof args.rekeyTo === 'string') {
79 | txnParams.rekeyTo = String(args.rekeyTo);
80 | }
81 | if (Array.isArray(args.appArgs)) {
82 | txnParams.appArgs = args.appArgs.map(arg => {
83 | const bytes = new TextEncoder().encode(String(arg));
84 | return Buffer.from(bytes).toString('base64');
85 | });
86 | }
87 | if (Array.isArray(args.accounts)) {
88 | txnParams.accounts = args.accounts.filter((acc): acc is string => typeof acc === 'string');
89 | }
90 | if (Array.isArray(args.foreignApps)) {
91 | txnParams.foreignApps = args.foreignApps.filter((app): app is number => typeof app === 'number');
92 | }
93 | if (Array.isArray(args.foreignAssets)) {
94 | txnParams.foreignAssets = args.foreignAssets.filter((asset): asset is number => typeof asset === 'number');
95 | }
96 |
97 | return txnParams;
98 | } catch (error) {
99 | if (error instanceof McpError) {
100 | throw error;
101 | }
102 | console.error('[MCP Error] Failed to handle application close-out:', error);
103 | throw new McpError(
104 | ErrorCode.InternalError,
105 | `Failed to handle application close-out: ${error instanceof Error ? error.message : 'Unknown error'}`
106 | );
107 | }
108 | }
109 |
```
--------------------------------------------------------------------------------
/packages/server/src/tools/transactionManager/appTransactions/clearTxn.ts:
--------------------------------------------------------------------------------
```typescript
1 | import { Transaction, makeApplicationClearStateTxnFromObject, OnApplicationComplete } from 'algosdk';
2 | import { McpError, ErrorCode } from '@modelcontextprotocol/sdk/types.js';
3 | import { AppClearStateTxnParams } from './types.js';
4 |
5 | /**
6 | * Creates an application clear state transaction
7 | * @param params The parameters for clearing application state
8 | * @returns The created transaction
9 | * @throws {McpError} If the transaction creation fails
10 | */
11 | export function makeApplicationClearStateTxn(params: AppClearStateTxnParams): Transaction {
12 | try {
13 | // Create a new object with the required structure
14 | const txnParams = {
15 | from: params.from,
16 | appIndex: params.appIndex,
17 | suggestedParams: params.suggestedParams,
18 | note: params.note,
19 | lease: params.lease,
20 | rekeyTo: params.rekeyTo,
21 | appArgs: params.appArgs,
22 | accounts: params.accounts,
23 | foreignApps: params.foreignApps,
24 | foreignAssets: params.foreignAssets,
25 | boxes: params.boxes
26 | };
27 |
28 | // Pass the onComplete parameter separately
29 | return makeApplicationClearStateTxnFromObject({
30 | ...txnParams,
31 | onComplete: OnApplicationComplete.ClearStateOC
32 | } as any); // Use type assertion since the types are not perfectly aligned
33 | } catch (error) {
34 | console.error('[MCP Error] Failed to create application clear state transaction:', error);
35 | throw new McpError(
36 | ErrorCode.InternalError,
37 | `Failed to create application clear state transaction: ${error instanceof Error ? error.message : 'Unknown error'}`
38 | );
39 | }
40 | }
41 |
42 | /**
43 | * Handles the application clear state tool request
44 | * @param args The tool arguments
45 | * @param suggestedParams The suggested transaction parameters
46 | * @returns The transaction parameters
47 | * @throws {McpError} If the parameters are invalid
48 | */
49 | export function handleClearTxn(args: Record<string, unknown>, suggestedParams: any): Record<string, any> {
50 | try {
51 | if (!args.from || !args.appIndex) {
52 | console.error('[MCP Error] Invalid application clear state parameters');
53 | throw new McpError(ErrorCode.InvalidParams, 'Invalid application clear state parameters');
54 | }
55 |
56 | // Create transaction with proper parameter handling
57 | const txnParams: Record<string, any> = {
58 | from: String(args.from),
59 | appIndex: Number(args.appIndex),
60 | fee: suggestedParams.fee,
61 | firstRound: suggestedParams.firstRound,
62 | lastRound: suggestedParams.lastRound,
63 | genesisID: suggestedParams.genesisID,
64 | genesisHash: suggestedParams.genesisHash,
65 | type: 'appl',
66 | onComplete: OnApplicationComplete.ClearStateOC
67 | };
68 |
69 | // Handle optional fields
70 | if (typeof args.note === 'string') {
71 | const noteBytes = new TextEncoder().encode(args.note);
72 | txnParams.note = Buffer.from(noteBytes).toString('base64');
73 | }
74 | if (typeof args.lease === 'string') {
75 | const leaseBytes = new TextEncoder().encode(args.lease);
76 | txnParams.lease = Buffer.from(leaseBytes).toString('base64');
77 | }
78 | if (typeof args.rekeyTo === 'string') {
79 | txnParams.rekeyTo = String(args.rekeyTo);
80 | }
81 | if (Array.isArray(args.appArgs)) {
82 | txnParams.appArgs = args.appArgs.map(arg => {
83 | const bytes = new TextEncoder().encode(String(arg));
84 | return Buffer.from(bytes).toString('base64');
85 | });
86 | }
87 | if (Array.isArray(args.accounts)) {
88 | txnParams.accounts = args.accounts.filter((acc): acc is string => typeof acc === 'string');
89 | }
90 | if (Array.isArray(args.foreignApps)) {
91 | txnParams.foreignApps = args.foreignApps.filter((app): app is number => typeof app === 'number');
92 | }
93 | if (Array.isArray(args.foreignAssets)) {
94 | txnParams.foreignAssets = args.foreignAssets.filter((asset): asset is number => typeof asset === 'number');
95 | }
96 |
97 | return txnParams;
98 | } catch (error) {
99 | if (error instanceof McpError) {
100 | throw error;
101 | }
102 | console.error('[MCP Error] Failed to handle application clear state:', error);
103 | throw new McpError(
104 | ErrorCode.InternalError,
105 | `Failed to handle application clear state: ${error instanceof Error ? error.message : 'Unknown error'}`
106 | );
107 | }
108 | }
109 |
```
--------------------------------------------------------------------------------
/packages/server/src/resources/knowledge/taxonomy/ARCs:specs:arc-0026.md:
--------------------------------------------------------------------------------
```markdown
1 | ---
2 | arc: 26
3 | title: URI scheme
4 | description: A specification for encoding Transactions in a URI format.
5 | author: Fabrice Benhamouda (@fabrice102), Ben Guidarelli (@barnjamin)
6 | status: Final
7 | type: Standards Track
8 | category: Interface
9 | sub-category: General
10 | created: 2022-04-21
11 | extended-by: 78, 79
12 | ---
13 |
14 | ## Abstract
15 |
16 | This URI specification represents a standardized way for applications and websites to send requests and information through deeplinks, QR codes, etc. It is heavily based on Bitcoin’s <a href="https://github.com/bitcoin/bips/blob/master/bip-0021.mediawiki">BIP-0021</a> and should be seen as derivative of it. The decision to base it on BIP-0021 was made to make it easy and compatible as possible for any other application.
17 |
18 | ## Specification
19 |
20 | ### General format
21 |
22 | Algorand URIs follow the general format for URIs as set forth in <a href="https://www.rfc-editor.org/rfc/rfc3986">RFC 3986</a>. The path component consists of an Algorand address, and the query component provides additional payment options.
23 |
24 | Elements of the query component may contain characters outside the valid range. These must first be encoded according to UTF-8, and then each octet of the corresponding UTF-8 sequence must be percent-encoded as described in RFC 3986.
25 |
26 | ### ABNF Grammar
27 |
28 | ```
29 | algorandurn = "algorand://" algorandaddress [ "?" algorandparams ]
30 | algorandaddress = *base32
31 | algorandparams = algorandparam [ "&" algorandparams ]
32 | algorandparam = [ amountparam / labelparam / noteparam / assetparam / otherparam ]
33 | amountparam = "amount=" *digit
34 | labelparam = "label=" *qchar
35 | assetparam = "asset=" *digit
36 | noteparam = (xnote | note)
37 | xnote = "xnote=" *qchar
38 | note = "note=" *qchar
39 | otherparam = qchar *qchar [ "=" *qchar ]
40 | ```
41 |
42 | Here, "qchar" corresponds to valid characters of an RFC 3986 URI query component, excluding the "=" and "&" characters, which this specification takes as separators.
43 |
44 | The scheme component ("algorand:") is case-insensitive, and implementations must accept any combination of uppercase and lowercase letters. The rest of the URI is case-sensitive, including the query parameter keys.
45 |
46 | !!! Caveat
47 | When it comes to generation of an address' QR, many exchanges and wallets encodes the address w/o the scheme component (“algorand:”). This is not a URI so it is OK.
48 |
49 | ### Query Keys
50 |
51 | - label: Label for that address (e.g. name of receiver)
52 |
53 | - address: Algorand address
54 |
55 | - xnote: A URL-encoded notes field value that must not be modifiable by the user when displayed to users.
56 |
57 | - note: A URL-encoded default notes field value that the the user interface may optionally make editable by the user.
58 |
59 | - amount: microAlgos or smallest unit of asset
60 |
61 | - asset: The asset id this request refers to (if Algos, simply omit this parameter)
62 |
63 | - (others): optional, for future extensions
64 |
65 | ### Transfer amount/size
66 |
67 | !!! Note
68 | This is DIFFERENT than Bitcoin’s BIP-0021
69 |
70 | If an amount is provided, it MUST be specified in basic unit of the asset. For example, if it’s Algos (Algorand native unit), the amount should be specified in microAlgos. All amounts MUST NOT contain commas nor a period (.) Strictly non negative integers.
71 |
72 | e.g. for 100 Algos, the amount needs to be 100000000, for 54.1354 Algos the amount needs to be 54135400.
73 |
74 | Algorand Clients should display the amount in whole Algos. Where needed, microAlgos can be used as well. In any case, the units shall be clear for the user.
75 |
76 | ### Appendix
77 |
78 | This section contains several examples
79 |
80 | address -
81 |
82 | ```
83 | algorand://TMTAD6N22HCS2LKH7677L2KFLT3PAQWY6M4JFQFXQS32ECBFC23F57RYX4
84 | ```
85 |
86 | address with label -
87 |
88 | ```
89 | algorand://TMTAD6N22HCS2LKH7677L2KFLT3PAQWY6M4JFQFXQS32ECBFC23F57RYX4?label=Silvio
90 | ```
91 |
92 | Request 150.5 Algos from an address
93 |
94 | ```
95 | algorand://TMTAD6N22HCS2LKH7677L2KFLT3PAQWY6M4JFQFXQS32ECBFC23F57RYX4?amount=150500000
96 | ```
97 |
98 | Request 150 units of Asset ID 45 from an address
99 |
100 | ```
101 | algorand://TMTAD6N22HCS2LKH7677L2KFLT3PAQWY6M4JFQFXQS32ECBFC23F57RYX4?amount=150&asset=45
102 | ```
103 |
104 | ## Rationale
105 |
106 | ## Security Considerations
107 |
108 | None.
109 |
110 | ## Copyright
111 |
112 | Copyright and related rights waived via <a href="https://creativecommons.org/publicdomain/zero/1.0/">CCO</a>.
113 |
```
--------------------------------------------------------------------------------
/packages/server/src/resources/knowledge/taxonomy/ARCs:ARC-template.md:
--------------------------------------------------------------------------------
```markdown
1 | ---
2 | arc: <to be assigned>
3 | title: <The ARC title is a few words, not a complete sentence>
4 | description: <Description is one full (short) sentence>
5 | author: <a comma separated list of the author's or authors' name + GitHub username (in parenthesis), or name and email (in angle brackets). Example, FirstName LastName (@GitHubUsername), FirstName LastName <[email protected]>, FirstName (@GitHubUsername) and GitHubUsername (@GitHubUsername)>
6 | discussions-to: <URL>
7 | status: Draft
8 | type: <Standards Track, Meta, or Informational>
9 | category (*only required for Standards Track): <Interface, or ARC>
10 | subcategory: <General, Asa, Application, Explorer or Wallet>
11 | created: <date created on, in ISO 8601 (yyyy-mm-dd) format>
12 | requires (*optional): <ARC number(s)>
13 | ---
14 |
15 | This is the suggested template for new ARCs.
16 |
17 | Note that an ARC number will be assigned by an editor. When opening a pull request to submit your ARC, please use an abbreviated title in the filename, `arc-draft_title_abbrev.md`.
18 |
19 | The title should be 44 characters or less. It should not repeat the ARC number in title, irrespective of the category.
20 |
21 | ## Abstract
22 | Abstract is a multi-sentence (short paragraph) technical summary. This should be a very terse and human-readable version of the specification section. Someone should be able to read only the abstract to get the gist of what this specification does.
23 |
24 | ## Motivation
25 | The motivation section should describe the "why" of this ARC. What problem does it solve? Why should someone want to implement this standard? What benefit does it provide to the Algorand ecosystem? What use cases does this ARC address?
26 |
27 | ## Specification
28 | The key words "**MUST**", "**MUST NOT**", "**REQUIRED**", "**SHALL**", "**SHALL NOT**", "**SHOULD**", "**SHOULD NOT**", "**RECOMMENDED**", "**MAY**", and "**OPTIONAL**" in this document are to be interpreted as described in <a href="https://www.ietf.org/rfc/rfc2119.txt">RFC-2119</a>.
29 |
30 | The technical specification should describe the syntax and semantics of any new feature. The specification should be detailed enough to allow competing, interoperable implementations for any of the current Algorand platforms (go-algorand, ...).
31 |
32 | ## Rationale
33 | The rationale fleshes out the specification by describing what motivated the design and why particular design decisions were made. It should describe alternate designs that were considered and related work, e.g. how the feature is supported in other languages.
34 |
35 | ## Backwards Compatibility
36 | All ARCs that introduce backwards incompatibilities must include a section describing these incompatibilities and their severity. The ARC must explain how the author proposes to deal with these incompatibilities. ARC submissions without a sufficient backwards compatibility treatise may be rejected outright.
37 |
38 | ## Test Cases
39 | Test cases for an implementation are mandatory for ARCs that are affecting consensus changes. If the test suite is too large to reasonably be included inline, then consider adding it as one or more files in `../assets/arc-####/`.
40 |
41 | ## Reference Implementation
42 | An optional section that contains a reference/example implementation that people can use to assist in understanding or implementing this specification. If the implementation is too large to reasonably be included inline, then consider adding it as one or more files in `../assets/arc-####/`.
43 |
44 | ## Security Considerations
45 | All ARCs must contain a section that discusses the security implications/considerations relevant to the proposed change. Include information that might be important for security discussions, surfaces risks and can be used throughout the life cycle of the proposal. E.g. include security-relevant design decisions, concerns, important discussions, implementation-specific guidance and pitfalls, an outline of threats and risks and how they are being addressed. ARC submissions missing the "Security Considerations" section will be rejected. An ARC cannot proceed to status "Final" without a Security Considerations discussion deemed sufficient by the reviewers.
46 |
47 | ## Copyright
48 | Copyright and related rights waived via <a href="https://creativecommons.org/publicdomain/zero/1.0/">CCO</a>.
49 |
```
--------------------------------------------------------------------------------
/packages/server/src/tools/transactionManager/appTransactions/updateTxn.ts:
--------------------------------------------------------------------------------
```typescript
1 | import { Transaction, makeApplicationUpdateTxnFromObject, OnApplicationComplete } from 'algosdk';
2 | import { McpError, ErrorCode } from '@modelcontextprotocol/sdk/types.js';
3 | import { AppUpdateTxnParams } from './types.js';
4 |
5 | /**
6 | * Creates an application update transaction
7 | * @param params The parameters for updating the application
8 | * @returns The created transaction
9 | * @throws {McpError} If the transaction creation fails
10 | */
11 | export function makeApplicationUpdateTxn(params: AppUpdateTxnParams): Transaction {
12 | try {
13 | // Create a new object with the required structure
14 | const txnParams = {
15 | from: params.from,
16 | appIndex: params.appIndex,
17 | approvalProgram: params.approvalProgram,
18 | clearProgram: params.clearProgram,
19 | suggestedParams: params.suggestedParams,
20 | note: params.note,
21 | lease: params.lease,
22 | rekeyTo: params.rekeyTo,
23 | appArgs: params.appArgs,
24 | accounts: params.accounts,
25 | foreignApps: params.foreignApps,
26 | foreignAssets: params.foreignAssets,
27 | boxes: params.boxes,
28 | onComplete: 4
29 | };
30 |
31 | return makeApplicationUpdateTxnFromObject(txnParams);
32 | } catch (error) {
33 | console.error('[MCP Error] Failed to create application update transaction:', error);
34 | throw new McpError(
35 | ErrorCode.InternalError,
36 | `Failed to create application update transaction: ${error instanceof Error ? error.message : 'Unknown error'}`
37 | );
38 | }
39 | }
40 |
41 | /**
42 | * Handles the application update tool request
43 | * @param args The tool arguments
44 | * @param suggestedParams The suggested transaction parameters
45 | * @returns The transaction parameters
46 | * @throws {McpError} If the parameters are invalid
47 | */
48 | export function handleUpdateTxn(args: Record<string, unknown>, suggestedParams: any): Record<string, any> {
49 | try {
50 | if (!args.from || !args.appIndex || !args.approvalProgram || !args.clearProgram) {
51 | console.error('[MCP Error] Invalid application update parameters');
52 | throw new McpError(ErrorCode.InvalidParams, 'Invalid application update parameters');
53 | }
54 |
55 | // Create transaction with proper parameter handling
56 | const txnParams: Record<string, any> = {
57 | from: String(args.from),
58 | appIndex: Number(args.appIndex),
59 | fee: suggestedParams.fee,
60 | firstRound: suggestedParams.firstRound,
61 | lastRound: suggestedParams.lastRound,
62 | genesisID: suggestedParams.genesisID,
63 | genesisHash: suggestedParams.genesisHash,
64 | type: 'appl',
65 | onComplete: 4,
66 | // Programs are already base64 encoded
67 | approvalProgram: args.approvalProgram as string,
68 | clearProgram: args.clearProgram as string
69 | };
70 |
71 | // Handle optional fields
72 | if (typeof args.note === 'string') {
73 | const noteBytes = new TextEncoder().encode(args.note);
74 | txnParams.note = Buffer.from(noteBytes).toString('base64');
75 | }
76 | if (typeof args.lease === 'string') {
77 | const leaseBytes = new TextEncoder().encode(args.lease);
78 | txnParams.lease = Buffer.from(leaseBytes).toString('base64');
79 | }
80 | if (typeof args.rekeyTo === 'string') {
81 | txnParams.rekeyTo = String(args.rekeyTo);
82 | }
83 | if (Array.isArray(args.appArgs)) {
84 | txnParams.appArgs = args.appArgs.map(arg => {
85 | const bytes = new TextEncoder().encode(String(arg));
86 | return Buffer.from(bytes).toString('base64');
87 | });
88 | }
89 | if (Array.isArray(args.accounts)) {
90 | txnParams.accounts = args.accounts.filter((acc): acc is string => typeof acc === 'string');
91 | }
92 | if (Array.isArray(args.foreignApps)) {
93 | txnParams.foreignApps = args.foreignApps.filter((app): app is number => typeof app === 'number');
94 | }
95 | if (Array.isArray(args.foreignAssets)) {
96 | txnParams.foreignAssets = args.foreignAssets.filter((asset): asset is number => typeof asset === 'number');
97 | }
98 |
99 | return txnParams;
100 | } catch (error) {
101 | if (error instanceof McpError) {
102 | throw error;
103 | }
104 | console.error('[MCP Error] Failed to handle application update:', error);
105 | throw new McpError(
106 | ErrorCode.InternalError,
107 | `Failed to handle application update: ${error instanceof Error ? error.message : 'Unknown error'}`
108 | );
109 | }
110 | }
111 |
```