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 | ```