This is page 19 of 74. Use http://codebase.md/goplausible/algorand-mcp?lines=false&page={x} to view the full context. # Directory Structure ``` ├── .gitignore ├── CONTRIBUTING.md ├── LICENSE ├── llms-install.md ├── llms.txt ├── package.json ├── packages │ ├── client │ │ ├── .env.example │ │ ├── package.json │ │ ├── README.md │ │ ├── src │ │ │ ├── env.ts │ │ │ ├── index.ts │ │ │ └── LocalWallet.ts │ │ └── tsconfig.json │ └── server │ ├── .env.example │ ├── API specs │ │ ├── algod_api.json │ │ ├── indexer_api.json │ │ ├── mcp.json │ │ ├── nfd_api.json │ │ ├── ultrade_api.json │ │ ├── vestige_api.json │ │ └── vestige_free_api.json │ ├── Dockerfile │ ├── jest.config.js │ ├── package.json │ ├── README.md │ ├── smithery.yaml │ ├── src │ │ ├── algorand-client.ts │ │ ├── env.ts │ │ ├── index.ts │ │ ├── resources │ │ │ ├── index.ts │ │ │ ├── knowledge │ │ │ │ ├── ARCs.txt │ │ │ │ ├── developers-algokit-architecture-decisions.txt │ │ │ │ ├── developers-algokit-cli.txt │ │ │ │ ├── developers-algokit-utils-python.txt │ │ │ │ ├── developers-algokit-utils-typescript.txt │ │ │ │ ├── developers-clis.txt │ │ │ │ ├── developers-details.txt │ │ │ │ ├── developers-liquid-auth.txt │ │ │ │ ├── developers-nodes.txt │ │ │ │ ├── developers-puya.txt │ │ │ │ ├── developers-python.txt │ │ │ │ ├── developers-sdks-js.txt │ │ │ │ ├── developers-sdks-python.txt │ │ │ │ ├── developers-tealscript.txt │ │ │ │ ├── developers.txt │ │ │ │ ├── index.ts │ │ │ │ ├── taxonomy │ │ │ │ │ ├── algokit-cli:README.md │ │ │ │ │ ├── algokit:cli:algokit.md │ │ │ │ │ ├── algokit:cli:architecture-decisions:2022-11-14_sandbox-approach.md │ │ │ │ │ ├── algokit:cli:architecture-decisions:2022-11-22_beaker-testing-strategy.md │ │ │ │ │ ├── algokit:cli:architecture-decisions:2023-01-11_beaker_productionisation_review.md │ │ │ │ │ ├── algokit:cli:architecture-decisions:2023-01-11_brew_install.md │ │ │ │ │ ├── algokit:cli:architecture-decisions:2023-01-12_smart-contract-deployment.md │ │ │ │ │ ├── algokit:cli:architecture-decisions:2023-06-06_frontend-templates.md │ │ │ │ │ ├── algokit:cli:architecture-decisions:2023-07-19_advanced_generate_command.md │ │ │ │ │ ├── algokit:cli:architecture-decisions:2024-01-13_native_binaries.md │ │ │ │ │ ├── algokit:cli:architecture-decisions:2024-01-23_init-wizard-v2.md │ │ │ │ │ ├── algokit:cli:architecture-decisions:2024-01-31_binary_distribution.md │ │ │ │ │ ├── algokit:cli:architecture-decisions:2024-03-06_local_dev_ui_packaging.md │ │ │ │ │ ├── algokit:cli:articles:output_stability.md │ │ │ │ │ ├── algokit:cli:cli:index.md │ │ │ │ │ ├── algokit:cli:features:compile.md │ │ │ │ │ ├── algokit:cli:features:completions.md │ │ │ │ │ ├── algokit:cli:features:config.md │ │ │ │ │ ├── algokit:cli:features:dispenser.md │ │ │ │ │ ├── algokit:cli:features:doctor.md │ │ │ │ │ ├── algokit:cli:features:explore.md │ │ │ │ │ ├── algokit:cli:features:generate.md │ │ │ │ │ ├── algokit:cli:features:goal.md │ │ │ │ │ ├── algokit:cli:features:init.md │ │ │ │ │ ├── algokit:cli:features:localnet.md │ │ │ │ │ ├── algokit:cli:features:project:bootstrap.md │ │ │ │ │ ├── algokit:cli:features:project:deploy.md │ │ │ │ │ ├── algokit:cli:features:project:link.md │ │ │ │ │ ├── algokit:cli:features:project:list.md │ │ │ │ │ ├── algokit:cli:features:project:run.md │ │ │ │ │ ├── algokit:cli:features:project.md │ │ │ │ │ ├── algokit:cli:features:tasks:analyze.md │ │ │ │ │ ├── algokit:cli:features:tasks:ipfs.md │ │ │ │ │ ├── algokit:cli:features:tasks:mint.md │ │ │ │ │ ├── algokit:cli:features:tasks:nfd.md │ │ │ │ │ ├── algokit:cli:features:tasks:opt.md │ │ │ │ │ ├── algokit:cli:features:tasks:send.md │ │ │ │ │ ├── algokit:cli:features:tasks:sign.md │ │ │ │ │ ├── algokit:cli:features:tasks:transfer.md │ │ │ │ │ ├── algokit:cli:features:tasks:vanity_address.md │ │ │ │ │ ├── algokit:cli:features:tasks:wallet.md │ │ │ │ │ ├── algokit:cli:features:tasks.md │ │ │ │ │ ├── algokit:cli:tutorials:algokit-template.md │ │ │ │ │ ├── algokit:cli:tutorials:intro.md │ │ │ │ │ ├── algokit:cli:tutorials:smart-contracts.md │ │ │ │ │ ├── algokit:docs:testnet_api.md │ │ │ │ │ ├── algokit:lora:README.md │ │ │ │ │ ├── algokit:README.md │ │ │ │ │ ├── algokit:utils:python:markdown:apidocs:algokit_utils:algokit_utils.md │ │ │ │ │ ├── algokit:utils:python:markdown:capabilities:account.md │ │ │ │ │ ├── algokit:utils:python:markdown:capabilities:app-client.md │ │ │ │ │ ├── algokit:utils:python:markdown:capabilities:app-deploy.md │ │ │ │ │ ├── algokit:utils:python:markdown:capabilities:client.md │ │ │ │ │ ├── algokit:utils:python:markdown:capabilities:debugger.md │ │ │ │ │ ├── algokit:utils:python:markdown:capabilities:dispenser-client.md │ │ │ │ │ ├── algokit:utils:python:markdown:capabilities:transfer.md │ │ │ │ │ ├── algokit:utils:python:markdown:index.md │ │ │ │ │ ├── algokit:utils:python:README.md │ │ │ │ │ ├── algokit:utils:python:source:capabilities:account.md │ │ │ │ │ ├── algokit:utils:python:source:capabilities:app-client.md │ │ │ │ │ ├── algokit:utils:python:source:capabilities:app-deploy.md │ │ │ │ │ ├── algokit:utils:python:source:capabilities:client.md │ │ │ │ │ ├── algokit:utils:python:source:capabilities:debugger.md │ │ │ │ │ ├── algokit:utils:python:source:capabilities:dispenser-client.md │ │ │ │ │ ├── algokit:utils:python:source:capabilities:transfer.md │ │ │ │ │ ├── algokit:utils:python:source:index.md │ │ │ │ │ ├── algokit:utils:typescript:capabilities:account.md │ │ │ │ │ ├── algokit:utils:typescript:capabilities:algorand-client.md │ │ │ │ │ ├── algokit:utils:typescript:capabilities:amount.md │ │ │ │ │ ├── algokit:utils:typescript:capabilities:app-client.md │ │ │ │ │ ├── algokit:utils:typescript:capabilities:app-deploy.md │ │ │ │ │ ├── algokit:utils:typescript:capabilities:app.md │ │ │ │ │ ├── algokit:utils:typescript:capabilities:asset.md │ │ │ │ │ ├── algokit:utils:typescript:capabilities:client.md │ │ │ │ │ ├── algokit:utils:typescript:capabilities:debugging.md │ │ │ │ │ ├── algokit:utils:typescript:capabilities:dispenser-client.md │ │ │ │ │ ├── algokit:utils:typescript:capabilities:event-emitter.md │ │ │ │ │ ├── algokit:utils:typescript:capabilities:indexer.md │ │ │ │ │ ├── algokit:utils:typescript:capabilities:testing.md │ │ │ │ │ ├── algokit:utils:typescript:capabilities:transaction-composer.md │ │ │ │ │ ├── algokit:utils:typescript:capabilities:transaction.md │ │ │ │ │ ├── algokit:utils:typescript:capabilities:transfer.md │ │ │ │ │ ├── algokit:utils:typescript:capabilities:typed-app-clients.md │ │ │ │ │ ├── algokit:utils:typescript:code:classes:testing.TestLogger.md │ │ │ │ │ ├── algokit:utils:typescript:code:classes:testing.TransactionLogger.md │ │ │ │ │ ├── algokit:utils:typescript:code:classes:types_account_manager.AccountManager.md │ │ │ │ │ ├── algokit:utils:typescript:code:classes:types_account.MultisigAccount.md │ │ │ │ │ ├── algokit:utils:typescript:code:classes:types_account.SigningAccount.md │ │ │ │ │ ├── algokit:utils:typescript:code:classes:types_algo_http_client_with_retry.AlgoHttpClientWithRetry.md │ │ │ │ │ ├── algokit:utils:typescript:code:classes:types_algorand_client_transaction_creator.AlgorandClientTransactionCreator.md │ │ │ │ │ ├── algokit:utils:typescript:code:classes:types_algorand_client_transaction_sender.AlgorandClientTransactionSender.md │ │ │ │ │ ├── algokit:utils:typescript:code:classes:types_algorand_client.AlgorandClient.md │ │ │ │ │ ├── algokit:utils:typescript:code:classes:types_amount.AlgoAmount.md │ │ │ │ │ ├── algokit:utils:typescript:code:classes:types_app_arc56.Arc56Method.md │ │ │ │ │ ├── algokit:utils:typescript:code:classes:types_app_client.AppClient.md │ │ │ │ │ ├── algokit:utils:typescript:code:classes:types_app_client.ApplicationClient.md │ │ │ │ │ ├── algokit:utils:typescript:code:classes:types_app_deployer.AppDeployer.md │ │ │ │ │ ├── algokit:utils:typescript:code:classes:types_app_factory.AppFactory.md │ │ │ │ │ ├── algokit:utils:typescript:code:classes:types_app_manager.AppManager.md │ │ │ │ │ ├── algokit:utils:typescript:code:classes:types_asset_manager.AssetManager.md │ │ │ │ │ ├── algokit:utils:typescript:code:classes:types_async_event_emitter.AsyncEventEmitter.md │ │ │ │ │ ├── algokit:utils:typescript:code:classes:types_client_manager.ClientManager.md │ │ │ │ │ ├── algokit:utils:typescript:code:classes:types_composer.TransactionComposer.md │ │ │ │ │ ├── algokit:utils:typescript:code:classes:types_config.UpdatableConfig.md │ │ │ │ │ ├── algokit:utils:typescript:code:classes:types_dispenser_client.TestNetDispenserApiClient.md │ │ │ │ │ ├── algokit:utils:typescript:code:classes:types_kmd_account_manager.KmdAccountManager.md │ │ │ │ │ ├── algokit:utils:typescript:code:classes:types_logic_error.LogicError.md │ │ │ │ │ ├── algokit:utils:typescript:code:enums:types_app.OnSchemaBreak.md │ │ │ │ │ ├── algokit:utils:typescript:code:enums:types_app.OnUpdate.md │ │ │ │ │ ├── algokit:utils:typescript:code:enums:types_indexer.AccountStatus.md │ │ │ │ │ ├── algokit:utils:typescript:code:enums:types_indexer.ApplicationOnComplete.md │ │ │ │ │ ├── algokit:utils:typescript:code:enums:types_indexer.SignatureType.md │ │ │ │ │ ├── algokit:utils:typescript:code:enums:types_lifecycle_events.EventType.md │ │ │ │ │ ├── algokit:utils:typescript:code:interfaces:types_account_manager.EnsureFundedResult.md │ │ │ │ │ ├── algokit:utils:typescript:code:interfaces:types_account.AccountConfig.md │ │ │ │ │ ├── algokit:utils:typescript:code:interfaces:types_account.TransactionSignerAccount.md │ │ │ │ │ ├── algokit:utils:typescript:code:interfaces:types_algorand_client_interface.AlgorandClientInterface.md │ │ │ │ │ ├── algokit:utils:typescript:code:interfaces:types_app_arc56.Arc56Contract.md │ │ │ │ │ ├── algokit:utils:typescript:code:interfaces:types_app_arc56.Event.md │ │ │ │ │ ├── algokit:utils:typescript:code:interfaces:types_app_arc56.Method.md │ │ │ │ │ ├── algokit:utils:typescript:code:interfaces:types_app_arc56.ProgramSourceInfo.md │ │ │ │ │ ├── algokit:utils:typescript:code:interfaces:types_app_arc56.StorageKey.md │ │ │ │ │ ├── algokit:utils:typescript:code:interfaces:types_app_arc56.StorageMap.md │ │ │ │ │ ├── algokit:utils:typescript:code:interfaces:types_app_arc56.StructField.md │ │ │ │ │ ├── algokit:utils:typescript:code:interfaces:types_app_client.AppClientCallABIArgs.md │ │ │ │ │ ├── algokit:utils:typescript:code:interfaces:types_app_client.AppClientCallCoreParams.md │ │ │ │ │ ├── algokit:utils:typescript:code:interfaces:types_app_client.AppClientCompilationParams.md │ │ │ │ │ ├── algokit:utils:typescript:code:interfaces:types_app_client.AppClientCompilationResult.md │ │ │ │ │ ├── algokit:utils:typescript:code:interfaces:types_app_client.AppClientDeployCallInterfaceParams.md │ │ │ │ │ ├── algokit:utils:typescript:code:interfaces:types_app_client.AppClientDeployCoreParams.md │ │ │ │ │ ├── algokit:utils:typescript:code:interfaces:types_app_client.AppClientDeployParams.md │ │ │ │ │ ├── algokit:utils:typescript:code:interfaces:types_app_client.AppClientParams.md │ │ │ │ │ ├── algokit:utils:typescript:code:interfaces:types_app_client.AppSourceMaps.md │ │ │ │ │ ├── algokit:utils:typescript:code:interfaces:types_app_client.FundAppAccountParams.md │ │ │ │ │ ├── algokit:utils:typescript:code:interfaces:types_app_client.ResolveAppById.md │ │ │ │ │ ├── algokit:utils:typescript:code:interfaces:types_app_client.ResolveAppByIdBase.md │ │ │ │ │ ├── algokit:utils:typescript:code:interfaces:types_app_client.SourceMapExport.md │ │ │ │ │ ├── algokit:utils:typescript:code:interfaces:types_app_deployer.AppLookup.md │ │ │ │ │ ├── algokit:utils:typescript:code:interfaces:types_app_deployer.AppMetadata.md │ │ │ │ │ ├── algokit:utils:typescript:code:interfaces:types_app_factory.AppFactoryParams.md │ │ │ │ │ ├── algokit:utils:typescript:code:interfaces:types_app_manager.AppInformation.md │ │ │ │ │ ├── algokit:utils:typescript:code:interfaces:types_app_manager.BoxReference.md │ │ │ │ │ ├── algokit:utils:typescript:code:interfaces:types_app_manager.BoxValueRequestParams.md │ │ │ │ │ ├── algokit:utils:typescript:code:interfaces:types_app_manager.BoxValuesRequestParams.md │ │ │ │ │ ├── algokit:utils:typescript:code:interfaces:types_app_spec.AppSources.md │ │ │ │ │ ├── algokit:utils:typescript:code:interfaces:types_app_spec.AppSpec.md │ │ │ │ │ ├── algokit:utils:typescript:code:interfaces:types_app_spec.CallConfig.md │ │ │ │ │ ├── algokit:utils:typescript:code:interfaces:types_app_spec.DeclaredSchemaValueSpec.md │ │ │ │ │ ├── algokit:utils:typescript:code:interfaces:types_app_spec.Hint.md │ │ │ │ │ ├── algokit:utils:typescript:code:interfaces:types_app_spec.ReservedSchemaValueSpec.md │ │ │ │ │ ├── algokit:utils:typescript:code:interfaces:types_app_spec.Schema.md │ │ │ │ │ ├── algokit:utils:typescript:code:interfaces:types_app_spec.SchemaSpec.md │ │ │ │ │ ├── algokit:utils:typescript:code:interfaces:types_app_spec.StateSchemaSpec.md │ │ │ │ │ ├── algokit:utils:typescript:code:interfaces:types_app_spec.Struct.md │ │ │ │ │ ├── algokit:utils:typescript:code:interfaces:types_app.AppCallParams.md │ │ │ │ │ ├── algokit:utils:typescript:code:interfaces:types_app.AppCallTransactionResultOfType.md │ │ │ │ │ ├── algokit:utils:typescript:code:interfaces:types_app.AppCompilationResult.md │ │ │ │ │ ├── algokit:utils:typescript:code:interfaces:types_app.AppDeploymentParams.md │ │ │ │ │ ├── algokit:utils:typescript:code:interfaces:types_app.AppDeployMetadata.md │ │ │ │ │ ├── algokit:utils:typescript:code:interfaces:types_app.AppLookup.md │ │ │ │ │ ├── algokit:utils:typescript:code:interfaces:types_app.AppMetadata.md │ │ │ │ │ ├── algokit:utils:typescript:code:interfaces:types_app.AppReference.md │ │ │ │ │ ├── algokit:utils:typescript:code:interfaces:types_app.AppState.md │ │ │ │ │ ├── algokit:utils:typescript:code:interfaces:types_app.AppStorageSchema.md │ │ │ │ │ ├── algokit:utils:typescript:code:interfaces:types_app.BoxName.md │ │ │ │ │ ├── algokit:utils:typescript:code:interfaces:types_app.BoxReference.md │ │ │ │ │ ├── algokit:utils:typescript:code:interfaces:types_app.BoxValueRequestParams.md │ │ │ │ │ ├── algokit:utils:typescript:code:interfaces:types_app.BoxValuesRequestParams.md │ │ │ │ │ ├── algokit:utils:typescript:code:interfaces:types_app.CompiledTeal.md │ │ │ │ │ ├── algokit:utils:typescript:code:interfaces:types_app.CoreAppCallArgs.md │ │ │ │ │ ├── algokit:utils:typescript:code:interfaces:types_app.CreateAppParams.md │ │ │ │ │ ├── algokit:utils:typescript:code:interfaces:types_app.RawAppCallArgs.md │ │ │ │ │ ├── algokit:utils:typescript:code:interfaces:types_app.TealTemplateParams.md │ │ │ │ │ ├── algokit:utils:typescript:code:interfaces:types_app.UpdateAppParams.md │ │ │ │ │ ├── algokit:utils:typescript:code:interfaces:types_asset_manager.AssetInformation.md │ │ │ │ │ ├── algokit:utils:typescript:code:interfaces:types_asset_manager.BulkAssetOptInOutResult.md │ │ │ │ │ ├── algokit:utils:typescript:code:interfaces:types_asset.AssetBulkOptInOutParams.md │ │ │ │ │ ├── algokit:utils:typescript:code:interfaces:types_asset.AssetOptInParams.md │ │ │ │ │ ├── algokit:utils:typescript:code:interfaces:types_asset.AssetOptOutParams.md │ │ │ │ │ ├── algokit:utils:typescript:code:interfaces:types_asset.CreateAssetParams.md │ │ │ │ │ ├── algokit:utils:typescript:code:interfaces:types_client_manager.AlgoSdkClients.md │ │ │ │ │ ├── algokit:utils:typescript:code:interfaces:types_client_manager.TypedAppClient.md │ │ │ │ │ ├── algokit:utils:typescript:code:interfaces:types_client_manager.TypedAppFactory.md │ │ │ │ │ ├── algokit:utils:typescript:code:interfaces:types_composer.BuiltTransactions.md │ │ │ │ │ ├── algokit:utils:typescript:code:interfaces:types_config.Config.md │ │ │ │ │ ├── algokit:utils:typescript:code:interfaces:types_debugging.AVMTracesEventData.md │ │ │ │ │ ├── algokit:utils:typescript:code:interfaces:types_debugging.TealSourceDebugEventData.md │ │ │ │ │ ├── algokit:utils:typescript:code:interfaces:types_debugging.TealSourcesDebugEventData.md │ │ │ │ │ ├── algokit:utils:typescript:code:interfaces:types_dispenser_client.DispenserFundResponse.md │ │ │ │ │ ├── algokit:utils:typescript:code:interfaces:types_dispenser_client.DispenserLimitResponse.md │ │ │ │ │ ├── algokit:utils:typescript:code:interfaces:types_dispenser_client.TestNetDispenserApiClientParams.md │ │ │ │ │ ├── algokit:utils:typescript:code:interfaces:types_indexer.LookupAssetHoldingsOptions.md │ │ │ │ │ ├── algokit:utils:typescript:code:interfaces:types_logic_error.LogicErrorDetails.md │ │ │ │ │ ├── algokit:utils:typescript:code:interfaces:types_network_client.AlgoClientConfig.md │ │ │ │ │ ├── algokit:utils:typescript:code:interfaces:types_network_client.AlgoConfig.md │ │ │ │ │ ├── algokit:utils:typescript:code:interfaces:types_network_client.NetworkDetails.md │ │ │ │ │ ├── algokit:utils:typescript:code:interfaces:types_testing.AlgoKitLogCaptureFixture.md │ │ │ │ │ ├── algokit:utils:typescript:code:interfaces:types_testing.AlgorandFixture.md │ │ │ │ │ ├── algokit:utils:typescript:code:interfaces:types_testing.AlgorandFixtureConfig.md │ │ │ │ │ ├── algokit:utils:typescript:code:interfaces:types_testing.AlgorandTestAutomationContext.md │ │ │ │ │ ├── algokit:utils:typescript:code:interfaces:types_testing.GetTestAccountParams.md │ │ │ │ │ ├── algokit:utils:typescript:code:interfaces:types_testing.LogSnapshotConfig.md │ │ │ │ │ ├── algokit:utils:typescript:code:interfaces:types_transaction.AtomicTransactionComposerToSend.md │ │ │ │ │ ├── algokit:utils:typescript:code:interfaces:types_transaction.ConfirmedTransactionResult.md │ │ │ │ │ ├── algokit:utils:typescript:code:interfaces:types_transaction.ConfirmedTransactionResults.md │ │ │ │ │ ├── algokit:utils:typescript:code:interfaces:types_transaction.SendAtomicTransactionComposerResults.md │ │ │ │ │ ├── algokit:utils:typescript:code:interfaces:types_transaction.SendParams.md │ │ │ │ │ ├── algokit:utils:typescript:code:interfaces:types_transaction.SendTransactionParams.md │ │ │ │ │ ├── algokit:utils:typescript:code:interfaces:types_transaction.SendTransactionResult.md │ │ │ │ │ ├── algokit:utils:typescript:code:interfaces:types_transaction.SendTransactionResults.md │ │ │ │ │ ├── algokit:utils:typescript:code:interfaces:types_transaction.TransactionGroupToSend.md │ │ │ │ │ ├── algokit:utils:typescript:code:interfaces:types_transaction.TransactionToSign.md │ │ │ │ │ ├── algokit:utils:typescript:code:interfaces:types_transfer.AlgoRekeyParams.md │ │ │ │ │ ├── algokit:utils:typescript:code:interfaces:types_transfer.AlgoTransferParams.md │ │ │ │ │ ├── algokit:utils:typescript:code:interfaces:types_transfer.EnsureFundedParams.md │ │ │ │ │ ├── algokit:utils:typescript:code:interfaces:types_transfer.EnsureFundedReturnType.md │ │ │ │ │ ├── algokit:utils:typescript:code:interfaces:types_transfer.TransferAssetParams.md │ │ │ │ │ ├── algokit:utils:typescript:code:modules:index.indexer.md │ │ │ │ │ ├── algokit:utils:typescript:code:modules:index.md │ │ │ │ │ ├── algokit:utils:typescript:code:modules:testing.md │ │ │ │ │ ├── algokit:utils:typescript:code:modules:types_account_manager_spec.md │ │ │ │ │ ├── algokit:utils:typescript:code:modules:types_account_manager.md │ │ │ │ │ ├── algokit:utils:typescript:code:modules:types_account.md │ │ │ │ │ ├── algokit:utils:typescript:code:modules:types_algo_http_client_with_retry.md │ │ │ │ │ ├── algokit:utils:typescript:code:modules:types_algorand_client_asset_spec.md │ │ │ │ │ ├── algokit:utils:typescript:code:modules:types_algorand_client_interface.md │ │ │ │ │ ├── algokit:utils:typescript:code:modules:types_algorand_client_spec.md │ │ │ │ │ ├── algokit:utils:typescript:code:modules:types_algorand_client_transaction_creator.md │ │ │ │ │ ├── algokit:utils:typescript:code:modules:types_algorand_client_transaction_sender.md │ │ │ │ │ ├── algokit:utils:typescript:code:modules:types_algorand_client_transfer_spec.md │ │ │ │ │ ├── algokit:utils:typescript:code:modules:types_algorand_client.md │ │ │ │ │ ├── algokit:utils:typescript:code:modules:types_amount_spec.md │ │ │ │ │ ├── algokit:utils:typescript:code:modules:types_amount.md │ │ │ │ │ ├── algokit:utils:typescript:code:modules:types_app_arc56.md │ │ │ │ │ ├── algokit:utils:typescript:code:modules:types_app_client_spec.md │ │ │ │ │ ├── algokit:utils:typescript:code:modules:types_app_client.md │ │ │ │ │ ├── algokit:utils:typescript:code:modules:types_app_deployer.md │ │ │ │ │ ├── algokit:utils:typescript:code:modules:types_app_factory_and_client_spec.md │ │ │ │ │ ├── algokit:utils:typescript:code:modules:types_app_factory.md │ │ │ │ │ ├── algokit:utils:typescript:code:modules:types_app_manager.md │ │ │ │ │ ├── algokit:utils:typescript:code:modules:types_app_spec.md │ │ │ │ │ ├── algokit:utils:typescript:code:modules:types_app.md │ │ │ │ │ ├── algokit:utils:typescript:code:modules:types_asset_manager.md │ │ │ │ │ ├── algokit:utils:typescript:code:modules:types_asset.md │ │ │ │ │ ├── algokit:utils:typescript:code:modules:types_async_event_emitter_spec.md │ │ │ │ │ ├── algokit:utils:typescript:code:modules:types_async_event_emitter.md │ │ │ │ │ ├── algokit:utils:typescript:code:modules:types_client_manager_spec.md │ │ │ │ │ ├── algokit:utils:typescript:code:modules:types_client_manager.md │ │ │ │ │ ├── algokit:utils:typescript:code:modules:types_composer.md │ │ │ │ │ ├── algokit:utils:typescript:code:modules:types_config.md │ │ │ │ │ ├── algokit:utils:typescript:code:modules:types_debugging.md │ │ │ │ │ ├── algokit:utils:typescript:code:modules:types_dispenser_client_spec.md │ │ │ │ │ ├── algokit:utils:typescript:code:modules:types_dispenser_client.md │ │ │ │ │ ├── algokit:utils:typescript:code:modules:types_expand.md │ │ │ │ │ ├── algokit:utils:typescript:code:modules:types_indexer.md │ │ │ │ │ ├── algokit:utils:typescript:code:modules:types_kmd_account_manager.md │ │ │ │ │ ├── algokit:utils:typescript:code:modules:types_lifecycle_events.md │ │ │ │ │ ├── algokit:utils:typescript:code:modules:types_logging.md │ │ │ │ │ ├── algokit:utils:typescript:code:modules:types_logic_error.md │ │ │ │ │ ├── algokit:utils:typescript:code:modules:types_network_client.md │ │ │ │ │ ├── algokit:utils:typescript:code:modules:types_testing.md │ │ │ │ │ ├── algokit:utils:typescript:code:modules:types_transaction.md │ │ │ │ │ ├── algokit:utils:typescript:code:modules:types_transfer.md │ │ │ │ │ ├── algokit:utils:typescript:code:README.md │ │ │ │ │ ├── algokit:utils:typescript:README.md │ │ │ │ │ ├── algokit:utils:typescript:v7-migration.md │ │ │ │ │ ├── algokit:utils:typescript:v8-migration.md │ │ │ │ │ ├── ARCs:ARC-template.md │ │ │ │ │ ├── ARCs:assets:arc-0012:README.md │ │ │ │ │ ├── ARCs:assets:arc-0034:TemplateForm.md │ │ │ │ │ ├── ARCs:assets:arc-0062:README.md │ │ │ │ │ ├── ARCs:pages:nfts.md │ │ │ │ │ ├── ARCs:pages:wallets.md │ │ │ │ │ ├── ARCs:README.md │ │ │ │ │ ├── ARCs:specs:arc-0000.md │ │ │ │ │ ├── ARCs:specs:arc-0001.md │ │ │ │ │ ├── ARCs:specs:arc-0002.md │ │ │ │ │ ├── ARCs:specs:arc-0003.md │ │ │ │ │ ├── ARCs:specs:arc-0004.md │ │ │ │ │ ├── ARCs:specs:arc-0005.md │ │ │ │ │ ├── ARCs:specs:arc-0006.md │ │ │ │ │ ├── ARCs:specs:arc-0007.md │ │ │ │ │ ├── ARCs:specs:arc-0008.md │ │ │ │ │ ├── ARCs:specs:arc-0009.md │ │ │ │ │ ├── ARCs:specs:arc-0010.md │ │ │ │ │ ├── ARCs:specs:arc-0011.md │ │ │ │ │ ├── ARCs:specs:arc-0012.md │ │ │ │ │ ├── ARCs:specs:arc-0015.md │ │ │ │ │ ├── ARCs:specs:arc-0016.md │ │ │ │ │ ├── ARCs:specs:arc-0018.md │ │ │ │ │ ├── ARCs:specs:arc-0019.md │ │ │ │ │ ├── ARCs:specs:arc-0020.md │ │ │ │ │ ├── ARCs:specs:arc-0021.md │ │ │ │ │ ├── ARCs:specs:arc-0022.md │ │ │ │ │ ├── ARCs:specs:arc-0023.md │ │ │ │ │ ├── ARCs:specs:arc-0025.md │ │ │ │ │ ├── ARCs:specs:arc-0026.md │ │ │ │ │ ├── ARCs:specs:arc-0028.md │ │ │ │ │ ├── ARCs:specs:arc-0032.md │ │ │ │ │ ├── ARCs:specs:arc-0033.md │ │ │ │ │ ├── ARCs:specs:arc-0034.md │ │ │ │ │ ├── ARCs:specs:arc-0035.md │ │ │ │ │ ├── ARCs:specs:arc-0036.md │ │ │ │ │ ├── ARCs:specs:arc-0042.md │ │ │ │ │ ├── ARCs:specs:arc-0047.md │ │ │ │ │ ├── ARCs:specs:arc-0048.md │ │ │ │ │ ├── ARCs:specs:arc-0049.md │ │ │ │ │ ├── ARCs:specs:arc-0054.md │ │ │ │ │ ├── ARCs:specs:arc-0055.md │ │ │ │ │ ├── ARCs:specs:arc-0056.md │ │ │ │ │ ├── ARCs:specs:arc-0059.md │ │ │ │ │ ├── ARCs:specs:arc-0062.md │ │ │ │ │ ├── ARCs:specs:arc-0065.md │ │ │ │ │ ├── ARCs:specs:arc-0069.md │ │ │ │ │ ├── ARCs:specs:arc-0072.md │ │ │ │ │ ├── ARCs:specs:arc-0073.md │ │ │ │ │ ├── ARCs:specs:arc-0074.md │ │ │ │ │ ├── ARCs:specs:arc-0076.md │ │ │ │ │ ├── ARCs:specs:arc-0078.md │ │ │ │ │ ├── ARCs:specs:arc-0079.md │ │ │ │ │ ├── ARCs:specs:arc-0200.md │ │ │ │ │ ├── clis_index.md │ │ │ │ │ ├── developer:docs:about.md │ │ │ │ │ ├── developer:docs:clis:algokey:algokey.md │ │ │ │ │ ├── developer:docs:clis:algokey:generate.md │ │ │ │ │ ├── developer:docs:clis:algokey:import.md │ │ │ │ │ ├── developer:docs:clis:algokey:multisig:append-auth-addr.md │ │ │ │ │ ├── developer:docs:clis:algokey:multisig:multisig.md │ │ │ │ │ ├── developer:docs:clis:algokey:part:info.md │ │ │ │ │ ├── developer:docs:clis:algokey:part:part.md │ │ │ │ │ ├── developer:docs:clis:algokey:part:reparent.md │ │ │ │ │ ├── developer:docs:clis:algokey:sign.md │ │ │ │ │ ├── developer:docs:clis:conduit:conduit.md │ │ │ │ │ ├── developer:docs:clis:conduit:init.md │ │ │ │ │ ├── developer:docs:clis:conduit:list:exporters.md │ │ │ │ │ ├── developer:docs:clis:conduit:list:importers.md │ │ │ │ │ ├── developer:docs:clis:conduit:list:list.md │ │ │ │ │ ├── developer:docs:clis:conduit:list:processors.md │ │ │ │ │ ├── developer:docs:clis:diagcfg:diagcfg.md │ │ │ │ │ ├── developer:docs:clis:diagcfg:metric:disable.md │ │ │ │ │ ├── developer:docs:clis:diagcfg:metric:enable.md │ │ │ │ │ ├── developer:docs:clis:diagcfg:metric:metric.md │ │ │ │ │ ├── developer:docs:clis:diagcfg:metric:status.md │ │ │ │ │ ├── developer:docs:clis:diagcfg:telemetry:disable.md │ │ │ │ │ ├── developer:docs:clis:diagcfg:telemetry:enable.md │ │ │ │ │ ├── developer:docs:clis:diagcfg:telemetry:endpoint.md │ │ │ │ │ ├── developer:docs:clis:diagcfg:telemetry:name.md │ │ │ │ │ ├── developer:docs:clis:diagcfg:telemetry:status.md │ │ │ │ │ ├── developer:docs:clis:diagcfg:telemetry:telemetry.md │ │ │ │ │ ├── developer:docs:clis:goal:node:restart.md │ │ │ │ │ ├── developer:docs:clis:goal:node:start.md │ │ │ │ │ ├── developer:docs:clis:goal:node:status.md │ │ │ │ │ ├── developer:docs:clis:goal:node:stop.md │ │ │ │ │ ├── developer:docs:clis:goal:node:wait.md │ │ │ │ │ ├── developer:docs:clis:goal:protocols.md │ │ │ │ │ ├── developer:docs:clis:goal:report.md │ │ │ │ │ ├── developer:docs:clis:goal:version.md │ │ │ │ │ ├── developer:docs:clis:goal:wallet:list.md │ │ │ │ │ ├── developer:docs:clis:goal:wallet:new.md │ │ │ │ │ ├── developer:docs:clis:goal:wallet:wallet.md │ │ │ │ │ ├── developer:docs:clis:indexer:api-config.md │ │ │ │ │ ├── developer:docs:clis:indexer:daemon.md │ │ │ │ │ ├── developer:docs:clis:indexer:indexer.md │ │ │ │ │ ├── developer:docs:clis:indexer:util:util.md │ │ │ │ │ ├── developer:docs:clis:indexer:util:validator.md │ │ │ │ │ ├── developer:docs:clis:kmd.md │ │ │ │ │ ├── developer:docs:clis:tealdbg:debug.md │ │ │ │ │ ├── developer:docs:clis:tealdbg:remote.md │ │ │ │ │ ├── developer:docs:clis:tealdbg:tealdbg.md │ │ │ │ │ ├── developer:docs:details:accounts:create.md │ │ │ │ │ ├── developer:docs:details:accounts:index.md │ │ │ │ │ ├── developer:docs:details:accounts:rekey.md │ │ │ │ │ ├── developer:docs:details:algorand_consensus.md │ │ │ │ │ ├── developer:docs:details:algorand-networks:betanet.md │ │ │ │ │ ├── developer:docs:details:algorand-networks:index.md │ │ │ │ │ ├── developer:docs:details:algorand-networks:mainnet.md │ │ │ │ │ ├── developer:docs:details:algorand-networks:testnet.md │ │ │ │ │ ├── developer:docs:details:asa.md │ │ │ │ │ ├── developer:docs:details:atc.md │ │ │ │ │ ├── developer:docs:details:atomic_transfers.md │ │ │ │ │ ├── developer:docs:details:conduit.md │ │ │ │ │ ├── developer:docs:details:crust.md │ │ │ │ │ ├── developer:docs:details:dapps:avm:index.md │ │ │ │ │ ├── developer:docs:details:dapps:avm:teal:guidelines.md │ │ │ │ │ ├── developer:docs:details:dapps:avm:teal:index.md │ │ │ │ │ ├── developer:docs:details:dapps:avm:teal:jsonspec.md │ │ │ │ │ ├── developer:docs:details:dapps:avm:teal:opcodes:index.md │ │ │ │ │ ├── developer:docs:details:dapps:avm:teal:opcodes:v1.md │ │ │ │ │ ├── developer:docs:details:dapps:avm:teal:opcodes:v10.md │ │ │ │ │ ├── developer:docs:details:dapps:avm:teal:opcodes:v2.md │ │ │ │ │ ├── developer:docs:details:dapps:avm:teal:opcodes:v3.md │ │ │ │ │ ├── developer:docs:details:dapps:avm:teal:opcodes:v4.md │ │ │ │ │ ├── developer:docs:details:dapps:avm:teal:opcodes:v5.md │ │ │ │ │ ├── developer:docs:details:dapps:avm:teal:opcodes:v6.md │ │ │ │ │ ├── developer:docs:details:dapps:avm:teal:opcodes:v7.md │ │ │ │ │ ├── developer:docs:details:dapps:avm:teal:opcodes:v8.md │ │ │ │ │ ├── developer:docs:details:dapps:avm:teal:opcodes:v9.md │ │ │ │ │ ├── developer:docs:details:dapps:avm:teal:specification.md │ │ │ │ │ ├── developer:docs:details:dapps:smart-contracts:ABI:index.md │ │ │ │ │ ├── developer:docs:details:dapps:smart-contracts:apps:create.md │ │ │ │ │ ├── developer:docs:details:dapps:smart-contracts:apps:index.md │ │ │ │ │ ├── developer:docs:details:dapps:smart-contracts:apps:innertx.md │ │ │ │ │ ├── developer:docs:details:dapps:smart-contracts:apps:state.md │ │ │ │ │ ├── developer:docs:details:dapps:smart-contracts:apps:txs.md │ │ │ │ │ ├── developer:docs:details:dapps:smart-contracts:debugging.md │ │ │ │ │ ├── developer:docs:details:dapps:smart-contracts:frontend:apps.md │ │ │ │ │ ├── developer:docs:details:dapps:smart-contracts:frontend:smartsigs.md │ │ │ │ │ ├── developer:docs:details:dapps:smart-contracts:guidelines.md │ │ │ │ │ ├── developer:docs:details:dapps:smart-contracts:index.md │ │ │ │ │ ├── developer:docs:details:dapps:smart-contracts:smartsigs:index.md │ │ │ │ │ ├── developer:docs:details:dapps:smart-contracts:smartsigs:modes.md │ │ │ │ │ ├── developer:docs:details:dapps:smart-contracts:smartsigs:walkthrough.md │ │ │ │ │ ├── developer:docs:details:dapps:writing-contracts:beaker.md │ │ │ │ │ ├── developer:docs:details:dapps:writing-contracts:pyteal.md │ │ │ │ │ ├── developer:docs:details:dapps:writing-contracts:python.md │ │ │ │ │ ├── developer:docs:details:encoding.md │ │ │ │ │ ├── developer:docs:details:ethereum_to_algorand.md │ │ │ │ │ ├── developer:docs:details:index.md │ │ │ │ │ ├── developer:docs:details:indexer.md │ │ │ │ │ ├── developer:docs:details:parameter_tables.md │ │ │ │ │ ├── developer:docs:details:stateproofs:index.md │ │ │ │ │ ├── developer:docs:details:stateproofs:light_client.md │ │ │ │ │ ├── developer:docs:details:technical_faq.md │ │ │ │ │ ├── developer:docs:details:transactions:index.md │ │ │ │ │ ├── developer:docs:details:transactions:offline_transactions.md │ │ │ │ │ ├── developer:docs:details:transactions:payment_prompts.md │ │ │ │ │ ├── developer:docs:details:transactions:signatures.md │ │ │ │ │ ├── developer:docs:details:transactions:transactions.md │ │ │ │ │ ├── developer:docs:details:useful_resources.md │ │ │ │ │ ├── developer:docs:get-started:algokit.md │ │ │ │ │ ├── developer:docs:get-started:basics:what_is_blockchain.md │ │ │ │ │ ├── developer:docs:get-started:basics:whats_a_dapp.md │ │ │ │ │ ├── developer:docs:get-started:basics:where_to_start.md │ │ │ │ │ ├── developer:docs:get-started:basics:why_algorand.md │ │ │ │ │ ├── developer:docs:get-started:tokenization:ft.md │ │ │ │ │ ├── developer:docs:get-started:tokenization:nft.md │ │ │ │ │ ├── developer:docs:index.md │ │ │ │ │ ├── developer:docs:rest-apis:algod.md │ │ │ │ │ ├── developer:docs:rest-apis:indexer.md │ │ │ │ │ ├── developer:docs:rest-apis:kmd.md │ │ │ │ │ ├── developer:docs:rest-apis:restendpoints.md │ │ │ │ │ ├── developer:docs:run-a-node:operations:catchup.md │ │ │ │ │ ├── developer:docs:run-a-node:operations:switch_networks.md │ │ │ │ │ ├── developer:docs:run-a-node:participate:generate_keys.md │ │ │ │ │ ├── developer:docs:run-a-node:participate:index.md │ │ │ │ │ ├── developer:docs:run-a-node:participate:offline.md │ │ │ │ │ ├── developer:docs:run-a-node:participate:online.md │ │ │ │ │ ├── developer:docs:run-a-node:participate:renew.md │ │ │ │ │ ├── developer:docs:run-a-node:reference:artifacts.md │ │ │ │ │ ├── developer:docs:run-a-node:reference:config.md │ │ │ │ │ ├── developer:docs:run-a-node:reference:relay.md │ │ │ │ │ ├── developer:docs:run-a-node:reference:telemetry-config.md │ │ │ │ │ ├── developer:docs:run-a-node:setup:indexer.md │ │ │ │ │ ├── developer:docs:run-a-node:setup:install.md │ │ │ │ │ ├── developer:docs:run-a-node:setup:node-troubleshooting.md │ │ │ │ │ ├── developer:docs:run-a-node:setup:types.md │ │ │ │ │ ├── developer:docs:sdks:go:index.md │ │ │ │ │ ├── developer:docs:sdks:index.md │ │ │ │ │ ├── developer:docs:sdks:java:index.md │ │ │ │ │ ├── developer:docs:sdks:javascript:index.md │ │ │ │ │ ├── developer:docs:sdks:python:index.md │ │ │ │ │ ├── developer:python:code:example:accounts.md │ │ │ │ │ ├── developer:python:code:example:arc4_types.md │ │ │ │ │ ├── developer:python:code:example:assets.md │ │ │ │ │ ├── developer:python:code:example:box_storage.md │ │ │ │ │ ├── developer:python:code:example:control_flow.md │ │ │ │ │ ├── developer:python:code:example:crypto:merkle_tree.md │ │ │ │ │ ├── developer:python:code:example:defi:amm.md │ │ │ │ │ ├── developer:python:code:example:defi:auction.md │ │ │ │ │ ├── developer:python:code:example:defi:htlc_logicsig.md │ │ │ │ │ ├── developer:python:code:example:defi:marketplace.md │ │ │ │ │ ├── developer:python:code:example:events:arc28_events.md │ │ │ │ │ ├── developer:python:code:example:global_storage.md │ │ │ │ │ ├── developer:python:code:example:governance:simple_voting.md │ │ │ │ │ ├── developer:python:code:example:hello_world.md │ │ │ │ │ ├── developer:python:code:example:inner_transactions.md │ │ │ │ │ ├── developer:python:code:example:local_storage.md │ │ │ │ │ ├── developer:python:code:example:nft:proof_of_attendance.md │ │ │ │ │ ├── developer:python:code:example:privacy:zk_whitelist.md │ │ │ │ │ ├── developer:python:code:example:scratch_storage.md │ │ │ │ │ ├── developer:python:code:example:self_payment.md │ │ │ │ │ ├── developer:python:code:example:struct_in_box.md │ │ │ │ │ ├── developer:python:code:example:subsidize_app_call.md │ │ │ │ │ ├── developer:python:code:example:transactions.md │ │ │ │ │ ├── developer:python:code:example:utility:calculator.md │ │ │ │ │ ├── devportal-code-examples:projects:python-contract-examples:README.md │ │ │ │ │ ├── devportal-code-examples:README.md │ │ │ │ │ ├── docs:.walletconnect:index.md │ │ │ │ │ ├── docs:.walletconnect:walletconnect-schema.md │ │ │ │ │ ├── docs:README.md │ │ │ │ │ ├── docs:scripts:example_tracker:example_list.md │ │ │ │ │ ├── docs:scripts:README.md │ │ │ │ │ ├── index.md │ │ │ │ │ ├── liquid_auth_index.md │ │ │ │ │ ├── liquid-auth:ARCHITECTURE.md │ │ │ │ │ ├── liquid-auth:decisions:1-Service-Authentication.md │ │ │ │ │ ├── liquid-auth:decisions:2-Bidirectional-Communication.md │ │ │ │ │ ├── liquid-auth:decisions:3-Peer-to-Peer-Signaling.md │ │ │ │ │ ├── liquid-auth:decisions:4-Fido-Extension.md │ │ │ │ │ ├── liquid-auth:decisions:README.md │ │ │ │ │ ├── liquid-auth:docs:architecture.md │ │ │ │ │ ├── liquid-auth:docs:clients:android:provider-service:authenticate.md │ │ │ │ │ ├── liquid-auth:docs:clients:android:provider-service:register.md │ │ │ │ │ ├── liquid-auth:docs:clients:browser:authentication.md │ │ │ │ │ ├── liquid-auth:docs:clients:browser:example.md │ │ │ │ │ ├── liquid-auth:docs:introduction.md │ │ │ │ │ ├── liquid-auth:docs:README.md │ │ │ │ │ ├── liquid-auth:docs:server:environment-variables.md │ │ │ │ │ ├── liquid-auth:docs:server:integrations.md │ │ │ │ │ ├── liquid-auth:docs:server:introduction.md │ │ │ │ │ ├── liquid-auth:docs:server:running-locally.md │ │ │ │ │ ├── liquid-auth:README.md │ │ │ │ │ ├── liquid-auth:SEQUENCE.md │ │ │ │ │ ├── liquid-auth:services:liquid-auth-api-js:src:assertion:assertion.controller.post.request.md │ │ │ │ │ ├── liquid-auth:services:liquid-auth-api-js:src:assertion:assertion.controller.post.response.md │ │ │ │ │ ├── liquid-auth:services:liquid-auth-api-js:src:attestation:attestation.controller.post.request.md │ │ │ │ │ ├── liquid-auth:services:liquid-auth-api-js:src:auth:auth.controller.get.user.md │ │ │ │ │ ├── liquid-auth:sites:express-dapp:README.md │ │ │ │ │ ├── liquid-auth:VISION.md │ │ │ │ │ ├── puya_index.md │ │ │ │ │ ├── puya:docs:algopy_testing:index.md │ │ │ │ │ ├── puya:docs:api-algopy.arc4.md │ │ │ │ │ ├── puya:docs:api-algopy.gtxn.md │ │ │ │ │ ├── puya:docs:api-algopy.itxn.md │ │ │ │ │ ├── puya:docs:api-algopy.md │ │ │ │ │ ├── puya:docs:api-algopy.op.md │ │ │ │ │ ├── puya:docs:api.md │ │ │ │ │ ├── puya:docs:compiler.md │ │ │ │ │ ├── puya:docs:index.md │ │ │ │ │ ├── puya:docs:language-guide.md │ │ │ │ │ ├── puya:docs:lg-arc28.md │ │ │ │ │ ├── puya:docs:lg-arc4.md │ │ │ │ │ ├── puya:docs:lg-builtins.md │ │ │ │ │ ├── puya:docs:lg-calling-apps.md │ │ │ │ │ ├── puya:docs:lg-compile.md │ │ │ │ │ ├── puya:docs:lg-control.md │ │ │ │ │ ├── puya:docs:lg-errors.md │ │ │ │ │ ├── puya:docs:lg-logs.md │ │ │ │ │ ├── puya:docs:lg-modules.md │ │ │ │ │ ├── puya:docs:lg-opcode-budget.md │ │ │ │ │ ├── puya:docs:lg-ops.md │ │ │ │ │ ├── puya:docs:lg-storage.md │ │ │ │ │ ├── puya:docs:lg-structure.md │ │ │ │ │ ├── puya:docs:lg-transactions.md │ │ │ │ │ ├── puya:docs:lg-types.md │ │ │ │ │ ├── puya:docs:lg-unsupported-python-features.md │ │ │ │ │ ├── puya:docs:principles.md │ │ │ │ │ ├── puya:examples:auction:README.md │ │ │ │ │ ├── puya:python:testing:docs:algopy.md │ │ │ │ │ ├── puya:python:testing:docs:api.md │ │ │ │ │ ├── puya:python:testing:docs:coverage.md │ │ │ │ │ ├── puya:python:testing:docs:examples.md │ │ │ │ │ ├── puya:python:testing:docs:faq.md │ │ │ │ │ ├── puya:python:testing:docs:index.md │ │ │ │ │ ├── puya:python:testing:docs:testing-guide:arc4-types.md │ │ │ │ │ ├── puya:python:testing:docs:testing-guide:avm-types.md │ │ │ │ │ ├── puya:python:testing:docs:testing-guide:concepts.md │ │ │ │ │ ├── puya:python:testing:docs:testing-guide:contract-testing.md │ │ │ │ │ ├── puya:python:testing:docs:testing-guide:index.md │ │ │ │ │ ├── puya:python:testing:docs:testing-guide:opcodes.md │ │ │ │ │ ├── puya:python:testing:docs:testing-guide:signature-testing.md │ │ │ │ │ ├── puya:python:testing:docs:testing-guide:state-management.md │ │ │ │ │ ├── puya:python:testing:docs:testing-guide:subroutines.md │ │ │ │ │ ├── puya:python:testing:docs:testing-guide:transactions.md │ │ │ │ │ ├── puya:python:testing:examples:README.md │ │ │ │ │ ├── puya:python:testing:README.md │ │ │ │ │ ├── puya:README.md │ │ │ │ │ ├── puya:src:puya:ARCHITECTURE.md │ │ │ │ │ ├── puya:src:puyapy:_typeshed:README.md │ │ │ │ │ ├── puya:src:puyapy:_vendor:mypy:typeshed:stdlib:_typeshed:README.md │ │ │ │ │ ├── puya:src:puyapy:awst_build:README.md │ │ │ │ │ ├── puya:stubs:README.md │ │ │ │ │ ├── puya:tests:test_expected_output:README.md │ │ │ │ │ ├── puya:typescript:docs:architecture-decisions:2024-05-21_primitive-bytes-and-strings.md │ │ │ │ │ ├── puya:typescript:docs:architecture-decisions:2024-05-21_primitive-integer-types.md │ │ │ │ │ ├── puya:typescript:docs:README.md │ │ │ │ │ ├── puya:typescript:packages:algo-ts:readme.md │ │ │ │ │ ├── puya:typescript:README.md │ │ │ │ │ ├── SDKs:javascript:classes:ABIAddressType.md │ │ │ │ │ ├── SDKs:javascript:classes:ABIArrayDynamicType.md │ │ │ │ │ ├── SDKs:javascript:classes:ABIArrayStaticType.md │ │ │ │ │ ├── SDKs:javascript:classes:ABIBoolType.md │ │ │ │ │ ├── SDKs:javascript:classes:ABIByteType.md │ │ │ │ │ ├── SDKs:javascript:classes:ABIContract.md │ │ │ │ │ ├── SDKs:javascript:classes:ABIInterface.md │ │ │ │ │ ├── SDKs:javascript:classes:ABIMethod.md │ │ │ │ │ ├── SDKs:javascript:classes:ABIStringType.md │ │ │ │ │ ├── SDKs:javascript:classes:ABITupleType.md │ │ │ │ │ ├── SDKs:javascript:classes:ABIType.md │ │ │ │ │ ├── SDKs:javascript:classes:ABIUfixedType.md │ │ │ │ │ ├── SDKs:javascript:classes:ABIUintType.md │ │ │ │ │ ├── SDKs:javascript:classes:Algodv2.md │ │ │ │ │ ├── SDKs:javascript:classes:AtomicTransactionComposer.md │ │ │ │ │ ├── SDKs:javascript:classes:DryrunResult.md │ │ │ │ │ ├── SDKs:javascript:classes:Indexer.md │ │ │ │ │ ├── SDKs:javascript:classes:indexerModels.Account.md │ │ │ │ │ ├── SDKs:javascript:classes:indexerModels.AccountParticipation.md │ │ │ │ │ ├── SDKs:javascript:classes:indexerModels.AccountResponse.md │ │ │ │ │ ├── SDKs:javascript:classes:indexerModels.AccountsResponse.md │ │ │ │ │ ├── SDKs:javascript:classes:indexerModels.AccountStateDelta.md │ │ │ │ │ ├── SDKs:javascript:classes:indexerModels.Application.md │ │ │ │ │ ├── SDKs:javascript:classes:indexerModels.ApplicationLocalState.md │ │ │ │ │ ├── SDKs:javascript:classes:indexerModels.ApplicationLocalStatesResponse.md │ │ │ │ │ ├── SDKs:javascript:classes:indexerModels.ApplicationLogData.md │ │ │ │ │ ├── SDKs:javascript:classes:indexerModels.ApplicationLogsResponse.md │ │ │ │ │ ├── SDKs:javascript:classes:indexerModels.ApplicationParams.md │ │ │ │ │ ├── SDKs:javascript:classes:indexerModels.ApplicationResponse.md │ │ │ │ │ ├── SDKs:javascript:classes:indexerModels.ApplicationsResponse.md │ │ │ │ │ ├── SDKs:javascript:classes:indexerModels.ApplicationStateSchema.md │ │ │ │ │ ├── SDKs:javascript:classes:indexerModels.Asset.md │ │ │ │ │ ├── SDKs:javascript:classes:indexerModels.AssetBalancesResponse.md │ │ │ │ │ ├── SDKs:javascript:classes:indexerModels.AssetHolding.md │ │ │ │ │ ├── SDKs:javascript:classes:indexerModels.AssetHoldingsResponse.md │ │ │ │ │ ├── SDKs:javascript:classes:indexerModels.AssetParams.md │ │ │ │ │ ├── SDKs:javascript:classes:indexerModels.AssetResponse.md │ │ │ │ │ ├── SDKs:javascript:classes:indexerModels.AssetsResponse.md │ │ │ │ │ ├── SDKs:javascript:classes:indexerModels.Block.md │ │ │ │ │ ├── SDKs:javascript:classes:indexerModels.BlockRewards.md │ │ │ │ │ ├── SDKs:javascript:classes:indexerModels.BlockUpgradeState.md │ │ │ │ │ ├── SDKs:javascript:classes:indexerModels.BlockUpgradeVote.md │ │ │ │ │ ├── SDKs:javascript:classes:indexerModels.Box.md │ │ │ │ │ ├── SDKs:javascript:classes:indexerModels.BoxDescriptor.md │ │ │ │ │ ├── SDKs:javascript:classes:indexerModels.BoxesResponse.md │ │ │ │ │ ├── SDKs:javascript:classes:indexerModels.ErrorResponse.md │ │ │ │ │ ├── SDKs:javascript:classes:indexerModels.EvalDelta.md │ │ │ │ │ ├── SDKs:javascript:classes:indexerModels.EvalDeltaKeyValue.md │ │ │ │ │ ├── SDKs:javascript:classes:indexerModels.HashFactory.md │ │ │ │ │ ├── SDKs:javascript:classes:indexerModels.HealthCheck.md │ │ │ │ │ ├── SDKs:javascript:classes:indexerModels.IndexerStateProofMessage.md │ │ │ │ │ ├── SDKs:javascript:classes:indexerModels.MerkleArrayProof.md │ │ │ │ │ ├── SDKs:javascript:classes:indexerModels.MiniAssetHolding.md │ │ │ │ │ ├── SDKs:javascript:classes:indexerModels.ParticipationUpdates.md │ │ │ │ │ ├── SDKs:javascript:classes:indexerModels.StateProofFields.md │ │ │ │ │ ├── SDKs:javascript:classes:indexerModels.StateProofParticipant.md │ │ │ │ │ ├── SDKs:javascript:classes:indexerModels.StateProofReveal.md │ │ │ │ │ ├── SDKs:javascript:classes:indexerModels.StateProofSignature.md │ │ │ │ │ ├── SDKs:javascript:classes:indexerModels.StateProofSigSlot.md │ │ │ │ │ ├── SDKs:javascript:classes:indexerModels.StateProofTracking.md │ │ │ │ │ ├── SDKs:javascript:classes:indexerModels.StateProofVerifier.md │ │ │ │ │ ├── SDKs:javascript:classes:indexerModels.StateSchema.md │ │ │ │ │ ├── SDKs:javascript:classes:indexerModels.TealKeyValue.md │ │ │ │ │ ├── SDKs:javascript:classes:indexerModels.TealValue.md │ │ │ │ │ ├── SDKs:javascript:classes:indexerModels.Transaction.md │ │ │ │ │ ├── SDKs:javascript:classes:indexerModels.TransactionApplication.md │ │ │ │ │ ├── SDKs:javascript:classes:indexerModels.TransactionAssetConfig.md │ │ │ │ │ ├── SDKs:javascript:classes:indexerModels.TransactionAssetFreeze.md │ │ │ │ │ ├── SDKs:javascript:classes:indexerModels.TransactionAssetTransfer.md │ │ │ │ │ ├── SDKs:javascript:classes:indexerModels.TransactionKeyreg.md │ │ │ │ │ ├── SDKs:javascript:classes:indexerModels.TransactionPayment.md │ │ │ │ │ ├── SDKs:javascript:classes:indexerModels.TransactionResponse.md │ │ │ │ │ ├── SDKs:javascript:classes:indexerModels.TransactionSignature.md │ │ │ │ │ ├── SDKs:javascript:classes:indexerModels.TransactionSignatureLogicsig.md │ │ │ │ │ ├── SDKs:javascript:classes:indexerModels.TransactionSignatureMultisig.md │ │ │ │ │ ├── SDKs:javascript:classes:indexerModels.TransactionSignatureMultisigSubsignature.md │ │ │ │ │ ├── SDKs:javascript:classes:indexerModels.TransactionsResponse.md │ │ │ │ │ ├── SDKs:javascript:classes:indexerModels.TransactionStateProof.md │ │ │ │ │ ├── SDKs:javascript:classes:Kmd.md │ │ │ │ │ ├── SDKs:javascript:classes:LogicSig.md │ │ │ │ │ ├── SDKs:javascript:classes:LogicSigAccount.md │ │ │ │ │ ├── SDKs:javascript:classes:modelsv2.Account.md │ │ │ │ │ ├── SDKs:javascript:classes:modelsv2.AccountApplicationResponse.md │ │ │ │ │ ├── SDKs:javascript:classes:modelsv2.AccountAssetHolding.md │ │ │ │ │ ├── SDKs:javascript:classes:modelsv2.AccountAssetResponse.md │ │ │ │ │ ├── SDKs:javascript:classes:modelsv2.AccountAssetsInformationResponse.md │ │ │ │ │ ├── SDKs:javascript:classes:modelsv2.AccountParticipation.md │ │ │ │ │ ├── SDKs:javascript:classes:modelsv2.AccountStateDelta.md │ │ │ │ │ ├── SDKs:javascript:classes:modelsv2.AppCallLogs.md │ │ │ │ │ ├── SDKs:javascript:classes:modelsv2.Application.md │ │ │ │ │ ├── SDKs:javascript:classes:modelsv2.ApplicationInitialStates.md │ │ │ │ │ ├── SDKs:javascript:classes:modelsv2.ApplicationKVStorage.md │ │ │ │ │ ├── SDKs:javascript:classes:modelsv2.ApplicationLocalReference.md │ │ │ │ │ ├── SDKs:javascript:classes:modelsv2.ApplicationLocalState.md │ │ │ │ │ ├── SDKs:javascript:classes:modelsv2.ApplicationParams.md │ │ │ │ │ ├── SDKs:javascript:classes:modelsv2.ApplicationStateOperation.md │ │ │ │ │ ├── SDKs:javascript:classes:modelsv2.ApplicationStateSchema.md │ │ │ │ │ ├── SDKs:javascript:classes:modelsv2.Asset.md │ │ │ │ │ ├── SDKs:javascript:classes:modelsv2.AssetHolding.md │ │ │ │ │ ├── SDKs:javascript:classes:modelsv2.AssetHoldingReference.md │ │ │ │ │ ├── SDKs:javascript:classes:modelsv2.AssetParams.md │ │ │ │ │ ├── SDKs:javascript:classes:modelsv2.AvmKeyValue.md │ │ │ │ │ ├── SDKs:javascript:classes:modelsv2.AvmValue.md │ │ │ │ │ ├── SDKs:javascript:classes:modelsv2.BlockHashResponse.md │ │ │ │ │ ├── SDKs:javascript:classes:modelsv2.BlockLogsResponse.md │ │ │ │ │ ├── SDKs:javascript:classes:modelsv2.BlockResponse.md │ │ │ │ │ ├── SDKs:javascript:classes:modelsv2.BlockTxidsResponse.md │ │ │ │ │ ├── SDKs:javascript:classes:modelsv2.Box.md │ │ │ │ │ ├── SDKs:javascript:classes:modelsv2.BoxDescriptor.md │ │ │ │ │ ├── SDKs:javascript:classes:modelsv2.BoxesResponse.md │ │ │ │ │ ├── SDKs:javascript:classes:modelsv2.BoxReference.md │ │ │ │ │ ├── SDKs:javascript:classes:modelsv2.BuildVersion.md │ │ │ │ │ ├── SDKs:javascript:classes:modelsv2.CompileResponse.md │ │ │ │ │ ├── SDKs:javascript:classes:modelsv2.DisassembleResponse.md │ │ │ │ │ ├── SDKs:javascript:classes:modelsv2.DryrunRequest.md │ │ │ │ │ ├── SDKs:javascript:classes:modelsv2.DryrunResponse.md │ │ │ │ │ ├── SDKs:javascript:classes:modelsv2.DryrunSource.md │ │ │ │ │ ├── SDKs:javascript:classes:modelsv2.DryrunState.md │ │ │ │ │ ├── SDKs:javascript:classes:modelsv2.DryrunTxnResult.md │ │ │ │ │ ├── SDKs:javascript:classes:modelsv2.ErrorResponse.md │ │ │ │ │ ├── SDKs:javascript:classes:modelsv2.EvalDelta.md │ │ │ │ │ ├── SDKs:javascript:classes:modelsv2.EvalDeltaKeyValue.md │ │ │ │ │ ├── SDKs:javascript:classes:modelsv2.GetBlockTimeStampOffsetResponse.md │ │ │ │ │ ├── SDKs:javascript:classes:modelsv2.GetSyncRoundResponse.md │ │ │ │ │ ├── SDKs:javascript:classes:modelsv2.KvDelta.md │ │ │ │ │ ├── SDKs:javascript:classes:modelsv2.LedgerStateDeltaForTransactionGroup.md │ │ │ │ │ ├── SDKs:javascript:classes:modelsv2.LightBlockHeaderProof.md │ │ │ │ │ ├── SDKs:javascript:classes:modelsv2.NodeStatusResponse.md │ │ │ │ │ ├── SDKs:javascript:classes:modelsv2.PendingTransactionResponse.md │ │ │ │ │ ├── SDKs:javascript:classes:modelsv2.PendingTransactionsResponse.md │ │ │ │ │ ├── SDKs:javascript:classes:modelsv2.PostTransactionsResponse.md │ │ │ │ │ ├── SDKs:javascript:classes:modelsv2.ScratchChange.md │ │ │ │ │ ├── SDKs:javascript:classes:modelsv2.SimulateInitialStates.md │ │ │ │ │ ├── SDKs:javascript:classes:modelsv2.SimulateRequest.md │ │ │ │ │ ├── SDKs:javascript:classes:modelsv2.SimulateRequestTransactionGroup.md │ │ │ │ │ ├── SDKs:javascript:classes:modelsv2.SimulateResponse.md │ │ │ │ │ ├── SDKs:javascript:classes:modelsv2.SimulateTraceConfig.md │ │ │ │ │ ├── SDKs:javascript:classes:modelsv2.SimulateTransactionGroupResult.md │ │ │ │ │ ├── SDKs:javascript:classes:modelsv2.SimulateTransactionResult.md │ │ │ │ │ ├── SDKs:javascript:classes:modelsv2.SimulateUnnamedResourcesAccessed.md │ │ │ │ │ ├── SDKs:javascript:classes:modelsv2.SimulationEvalOverrides.md │ │ │ │ │ ├── SDKs:javascript:classes:modelsv2.SimulationOpcodeTraceUnit.md │ │ │ │ │ ├── SDKs:javascript:classes:modelsv2.SimulationTransactionExecTrace.md │ │ │ │ │ ├── SDKs:javascript:classes:modelsv2.StateProof.md │ │ │ │ │ ├── SDKs:javascript:classes:modelsv2.StateProofMessage.md │ │ │ │ │ ├── SDKs:javascript:classes:modelsv2.SupplyResponse.md │ │ │ │ │ ├── SDKs:javascript:classes:modelsv2.TealKeyValue.md │ │ │ │ │ ├── SDKs:javascript:classes:modelsv2.TealValue.md │ │ │ │ │ ├── SDKs:javascript:classes:modelsv2.TransactionGroupLedgerStateDeltasForRoundResponse.md │ │ │ │ │ ├── SDKs:javascript:classes:modelsv2.TransactionParametersResponse.md │ │ │ │ │ ├── SDKs:javascript:classes:modelsv2.TransactionProofResponse.md │ │ │ │ │ ├── SDKs:javascript:classes:modelsv2.Version.md │ │ │ │ │ ├── SDKs:javascript:classes:SourceMap.md │ │ │ │ │ ├── SDKs:javascript:classes:Transaction.md │ │ │ │ │ ├── SDKs:javascript:enums:ABIReferenceType.md │ │ │ │ │ ├── SDKs:javascript:enums:ABITransactionType.md │ │ │ │ │ ├── SDKs:javascript:enums:AtomicTransactionComposerStatus.md │ │ │ │ │ ├── SDKs:javascript:enums:IntDecoding.md │ │ │ │ │ ├── SDKs:javascript:enums:OnApplicationComplete.md │ │ │ │ │ ├── SDKs:javascript:enums:TransactionType.md │ │ │ │ │ ├── SDKs:javascript:examples:README.md │ │ │ │ │ ├── SDKs:javascript:FAQ.md │ │ │ │ │ ├── SDKs:javascript:interfaces:ABIContractNetworkInfo.md │ │ │ │ │ ├── SDKs:javascript:interfaces:ABIContractNetworks.md │ │ │ │ │ ├── SDKs:javascript:interfaces:ABIContractParams.md │ │ │ │ │ ├── SDKs:javascript:interfaces:ABIInterfaceParams.md │ │ │ │ │ ├── SDKs:javascript:interfaces:ABIMethodArgParams.md │ │ │ │ │ ├── SDKs:javascript:interfaces:ABIMethodParams.md │ │ │ │ │ ├── SDKs:javascript:interfaces:ABIMethodReturnParams.md │ │ │ │ │ ├── SDKs:javascript:interfaces:ABIResult.md │ │ │ │ │ ├── SDKs:javascript:interfaces:Account.md │ │ │ │ │ ├── SDKs:javascript:interfaces:Address.md │ │ │ │ │ ├── SDKs:javascript:interfaces:AlgodTokenHeader.md │ │ │ │ │ ├── SDKs:javascript:interfaces:BaseHTTPClient.md │ │ │ │ │ ├── SDKs:javascript:interfaces:BaseHTTPClientError.md │ │ │ │ │ ├── SDKs:javascript:interfaces:BaseHTTPClientResponse.md │ │ │ │ │ ├── SDKs:javascript:interfaces:BoxReference.md │ │ │ │ │ ├── SDKs:javascript:interfaces:CustomTokenHeader.md │ │ │ │ │ ├── SDKs:javascript:interfaces:EncodedAssetParams.md │ │ │ │ │ ├── SDKs:javascript:interfaces:EncodedBoxReference.md │ │ │ │ │ ├── SDKs:javascript:interfaces:EncodedGlobalStateSchema.md │ │ │ │ │ ├── SDKs:javascript:interfaces:EncodedLocalStateSchema.md │ │ │ │ │ ├── SDKs:javascript:interfaces:EncodedLogicSig.md │ │ │ │ │ ├── SDKs:javascript:interfaces:EncodedLogicSigAccount.md │ │ │ │ │ ├── SDKs:javascript:interfaces:EncodedMultisig.md │ │ │ │ │ ├── SDKs:javascript:interfaces:EncodedSignedTransaction.md │ │ │ │ │ ├── SDKs:javascript:interfaces:EncodedSubsig.md │ │ │ │ │ ├── SDKs:javascript:interfaces:EncodedTransaction.md │ │ │ │ │ ├── SDKs:javascript:interfaces:IndexerTokenHeader.md │ │ │ │ │ ├── SDKs:javascript:interfaces:KMDTokenHeader.md │ │ │ │ │ ├── SDKs:javascript:interfaces:MultisigMetadata.md │ │ │ │ │ ├── SDKs:javascript:interfaces:SignedTransaction.md │ │ │ │ │ ├── SDKs:javascript:interfaces:SuggestedParams.md │ │ │ │ │ ├── SDKs:javascript:interfaces:TransactionParams.md │ │ │ │ │ ├── SDKs:javascript:interfaces:TransactionWithSigner.md │ │ │ │ │ ├── SDKs:javascript:modules:indexerModels.md │ │ │ │ │ ├── SDKs:javascript:modules:modelsv2.md │ │ │ │ │ ├── SDKs:javascript:modules.md │ │ │ │ │ ├── SDKs:javascript:README.md │ │ │ │ │ ├── SDKs:python:algosdk:v2client:harness:README.md │ │ │ │ │ ├── SDKs:python:examples:README.md │ │ │ │ │ ├── SDKs:python:README.md │ │ │ │ │ ├── tealscript:examples_amm_README.md │ │ │ │ │ ├── tealscript:examples_auction_README.md │ │ │ │ │ ├── tealscript:examples_big_box_README.md │ │ │ │ │ ├── tealscript:examples_itxns_README.md │ │ │ │ │ ├── tealscript:examples_lsig_with_app_README.md │ │ │ │ │ ├── tealscript:examples_reti_README.md │ │ │ │ │ ├── tealscript:FEATURES.md │ │ │ │ │ ├── tealscript:guides_atomic_txn.md │ │ │ │ │ ├── tealscript:guides_features.md │ │ │ │ │ ├── tealscript:guides_getting_started.md │ │ │ │ │ ├── tealscript:guides_inner_transactions.md │ │ │ │ │ ├── tealscript:guides_lifecycle.md │ │ │ │ │ ├── tealscript:guides_math.md │ │ │ │ │ ├── tealscript:guides_methods.md │ │ │ │ │ ├── tealscript:guides_multiple_contracts.md │ │ │ │ │ ├── tealscript:guides_pyteal.md │ │ │ │ │ ├── tealscript:guides_storage.md │ │ │ │ │ ├── tealscript:guides_Supported Types_arrays.md │ │ │ │ │ ├── tealscript:guides_Supported Types_numbers.md │ │ │ │ │ ├── TEALScript:README.md │ │ │ │ │ ├── tealscript:tests_test_package_README.md │ │ │ │ │ ├── tealscript:tutorials_Hello World_0001-intro.md │ │ │ │ │ ├── tealscript:tutorials_Hello World_0002-init.md │ │ │ │ │ ├── tealscript:tutorials_Hello World_0003-contract.md │ │ │ │ │ ├── tealscript:tutorials_Hello World_0004-artifacts.md │ │ │ │ │ ├── tealscript:tutorials_Hello World_0005-hello.md │ │ │ │ │ └── tealscript:tutorials_Hello World_0006-test.md │ │ │ │ └── taxonomy-categories │ │ │ │ ├── algokit-utils.json │ │ │ │ ├── algokit.json │ │ │ │ ├── arcs.json │ │ │ │ ├── clis.json │ │ │ │ ├── details.json │ │ │ │ ├── developers.json │ │ │ │ ├── liquid-auth.json │ │ │ │ ├── nodes.json │ │ │ │ ├── puya.json │ │ │ │ ├── python.json │ │ │ │ ├── sdks.json │ │ │ │ └── tealscript.json │ │ │ └── wallet │ │ │ └── index.ts │ │ ├── tools │ │ │ ├── accountManager.ts │ │ │ ├── algodManager.ts │ │ │ ├── apiManager │ │ │ │ ├── algod │ │ │ │ │ ├── account.ts │ │ │ │ │ ├── application.ts │ │ │ │ │ ├── asset.ts │ │ │ │ │ ├── index.ts │ │ │ │ │ └── transaction.ts │ │ │ │ ├── example │ │ │ │ │ ├── get-balance.ts │ │ │ │ │ └── index.ts │ │ │ │ ├── index.ts │ │ │ │ ├── indexer │ │ │ │ │ ├── account.ts │ │ │ │ │ ├── application.ts │ │ │ │ │ ├── asset.ts │ │ │ │ │ ├── index.ts │ │ │ │ │ └── transaction.ts │ │ │ │ ├── nfd │ │ │ │ │ └── index.ts │ │ │ │ ├── tinyman │ │ │ │ │ ├── analytics.ts │ │ │ │ │ ├── bootstrap.ts │ │ │ │ │ ├── index.ts │ │ │ │ │ ├── liquidity.ts │ │ │ │ │ ├── opt_in.ts │ │ │ │ │ ├── pool.ts │ │ │ │ │ ├── remove_liquidity.ts │ │ │ │ │ └── swap.ts │ │ │ │ ├── ultrade │ │ │ │ │ ├── index.ts │ │ │ │ │ ├── market.ts │ │ │ │ │ ├── system.ts │ │ │ │ │ └── wallet.ts │ │ │ │ └── vestige │ │ │ │ ├── assets.ts │ │ │ │ ├── balances.ts │ │ │ │ ├── index.ts │ │ │ │ ├── networks.ts │ │ │ │ ├── notes.ts │ │ │ │ ├── pools.ts │ │ │ │ ├── protocols.ts │ │ │ │ ├── swaps.ts │ │ │ │ └── vaults.ts │ │ │ ├── arc26Manager.ts │ │ │ ├── index.ts │ │ │ ├── knowledgeManager.ts │ │ │ ├── transactionManager │ │ │ │ ├── accountTransactions.ts │ │ │ │ ├── appTransactions │ │ │ │ │ ├── callTxn.ts │ │ │ │ │ ├── clearTxn.ts │ │ │ │ │ ├── closeOutTxn.ts │ │ │ │ │ ├── createTxn.ts │ │ │ │ │ ├── deleteTxn.ts │ │ │ │ │ ├── index.ts │ │ │ │ │ ├── optInTxn.ts │ │ │ │ │ ├── test │ │ │ │ │ │ ├── counter_approval.teal │ │ │ │ │ │ ├── counter_clear.teal │ │ │ │ │ │ ├── storage_test_approval_v2.teal │ │ │ │ │ │ ├── storage_test_approval.teal │ │ │ │ │ │ └── storage_test_clear.teal │ │ │ │ │ ├── types.ts │ │ │ │ │ └── updateTxn.ts │ │ │ │ ├── assetTransactions.ts │ │ │ │ ├── generalTransaction.ts │ │ │ │ └── index.ts │ │ │ └── utilityManager.ts │ │ ├── types.ts │ │ └── utils │ │ └── responseProcessor.ts │ ├── tests │ │ ├── resources │ │ │ ├── algod │ │ │ │ ├── account.test.ts │ │ │ │ ├── application.test.ts │ │ │ │ ├── asset.test.ts │ │ │ │ └── transaction.test.ts │ │ │ └── indexer │ │ │ ├── account.test.ts │ │ │ ├── application.test.ts │ │ │ ├── asset.test.ts │ │ │ └── transaction.test.ts │ │ └── tools │ │ ├── accountManager.test.ts │ │ ├── algodManager.test.ts │ │ ├── apiManager │ │ │ └── example │ │ │ └── get-balance.test.ts │ │ ├── transactionManager │ │ │ ├── accountTransactionManager.test.ts │ │ │ ├── appTransactionManager.test.ts │ │ │ ├── assetTransactionManager.test.ts │ │ │ ├── generalTransactionManager.test.ts │ │ │ └── transactionManager.test.ts │ │ └── utilityManager.test.ts │ └── tsconfig.json ├── README.md ├── rename_files.sh └── tsconfig.json ``` # Files -------------------------------------------------------------------------------- /packages/server/src/resources/knowledge/taxonomy/algokit:utils:typescript:code:interfaces:types_transfer.AlgoRekeyParams.md: -------------------------------------------------------------------------------- ```markdown [@algorandfoundation/algokit-utils](../README.md) / [types/transfer](../modules/types_transfer.md) / AlgoRekeyParams # Interface: AlgoRekeyParams [types/transfer](../modules/types_transfer.md).AlgoRekeyParams **`Deprecated`** Parameters for `rekeyAccount` call. ## Hierarchy - [`SendTransactionParams`](types_transaction.SendTransactionParams.md) ↳ **`AlgoRekeyParams`** ## Table of contents ### Properties - [atc](types_transfer.AlgoRekeyParams.md#atc) - [fee](types_transfer.AlgoRekeyParams.md#fee) - [from](types_transfer.AlgoRekeyParams.md#from) - [lease](types_transfer.AlgoRekeyParams.md#lease) - [maxFee](types_transfer.AlgoRekeyParams.md#maxfee) - [maxRoundsToWaitForConfirmation](types_transfer.AlgoRekeyParams.md#maxroundstowaitforconfirmation) - [note](types_transfer.AlgoRekeyParams.md#note) - [populateAppCallResources](types_transfer.AlgoRekeyParams.md#populateappcallresources) - [rekeyTo](types_transfer.AlgoRekeyParams.md#rekeyto) - [skipSending](types_transfer.AlgoRekeyParams.md#skipsending) - [skipWaiting](types_transfer.AlgoRekeyParams.md#skipwaiting) - [suppressLog](types_transfer.AlgoRekeyParams.md#suppresslog) - [transactionParams](types_transfer.AlgoRekeyParams.md#transactionparams) ## Properties ### atc • `Optional` **atc**: `AtomicTransactionComposer` An optional `AtomicTransactionComposer` to add the transaction to, if specified then `skipSending: undefined` has the same effect as `skipSending: true` #### Inherited from [SendTransactionParams](types_transaction.SendTransactionParams.md).[atc](types_transaction.SendTransactionParams.md#atc) #### Defined in [src/types/transaction.ts:36](https://github.com/algorandfoundation/algokit-utils-ts/blob/main/src/types/transaction.ts#L36) ___ ### fee • `Optional` **fee**: [`AlgoAmount`](../classes/types_amount.AlgoAmount.md) The flat fee you want to pay, useful for covering extra fees in a transaction group or app call #### Inherited from [SendTransactionParams](types_transaction.SendTransactionParams.md).[fee](types_transaction.SendTransactionParams.md#fee) #### Defined in [src/types/transaction.ts:40](https://github.com/algorandfoundation/algokit-utils-ts/blob/main/src/types/transaction.ts#L40) ___ ### from • **from**: [`SendTransactionFrom`](../modules/types_transaction.md#sendtransactionfrom) The account that will be rekeyed #### Defined in [src/types/transfer.ts:26](https://github.com/algorandfoundation/algokit-utils-ts/blob/main/src/types/transfer.ts#L26) ___ ### lease • `Optional` **lease**: `string` \| `Uint8Array` An (optional) [transaction lease](https://developer.algorand.org/articles/leased-transactions-securing-advanced-smart-contract-design/) to apply #### Defined in [src/types/transfer.ts:34](https://github.com/algorandfoundation/algokit-utils-ts/blob/main/src/types/transfer.ts#L34) ___ ### maxFee • `Optional` **maxFee**: [`AlgoAmount`](../classes/types_amount.AlgoAmount.md) The maximum fee that you are happy to pay (default: unbounded) - if this is set it's possible the transaction could get rejected during network congestion #### Inherited from [SendTransactionParams](types_transaction.SendTransactionParams.md).[maxFee](types_transaction.SendTransactionParams.md#maxfee) #### Defined in [src/types/transaction.ts:42](https://github.com/algorandfoundation/algokit-utils-ts/blob/main/src/types/transaction.ts#L42) ___ ### maxRoundsToWaitForConfirmation • `Optional` **maxRoundsToWaitForConfirmation**: `number` The maximum number of rounds to wait for confirmation, only applies if `skipWaiting` is `undefined` or `false`, default: wait up to 5 rounds #### Inherited from [SendTransactionParams](types_transaction.SendTransactionParams.md).[maxRoundsToWaitForConfirmation](types_transaction.SendTransactionParams.md#maxroundstowaitforconfirmation) #### Defined in [src/types/transaction.ts:44](https://github.com/algorandfoundation/algokit-utils-ts/blob/main/src/types/transaction.ts#L44) ___ ### note • `Optional` **note**: [`TransactionNote`](../modules/types_transaction.md#transactionnote) The (optional) transaction note #### Defined in [src/types/transfer.ts:32](https://github.com/algorandfoundation/algokit-utils-ts/blob/main/src/types/transfer.ts#L32) ___ ### populateAppCallResources • `Optional` **populateAppCallResources**: `boolean` Whether to use simulate to automatically populate app call resources in the txn objects. Defaults to true when there are app calls in the group. #### Inherited from [SendTransactionParams](types_transaction.SendTransactionParams.md).[populateAppCallResources](types_transaction.SendTransactionParams.md#populateappcallresources) #### Defined in [src/types/transaction.ts:46](https://github.com/algorandfoundation/algokit-utils-ts/blob/main/src/types/transaction.ts#L46) ___ ### rekeyTo • **rekeyTo**: `string` \| [`SendTransactionFrom`](../modules/types_transaction.md#sendtransactionfrom) The account / account address that will have the private key that is authorised to transact on behalf of the from account from now on #### Defined in [src/types/transfer.ts:28](https://github.com/algorandfoundation/algokit-utils-ts/blob/main/src/types/transfer.ts#L28) ___ ### skipSending • `Optional` **skipSending**: `boolean` Whether to skip signing and sending the transaction to the chain (default: transaction signed and sent to chain, unless `atc` specified) and instead just return the raw transaction, e.g. so you can add it to a group of transactions #### Inherited from [SendTransactionParams](types_transaction.SendTransactionParams.md).[skipSending](types_transaction.SendTransactionParams.md#skipsending) #### Defined in [src/types/transaction.ts:32](https://github.com/algorandfoundation/algokit-utils-ts/blob/main/src/types/transaction.ts#L32) ___ ### skipWaiting • `Optional` **skipWaiting**: `boolean` Whether to skip waiting for the submitted transaction (only relevant if `skipSending` is `false` or unset) #### Inherited from [SendTransactionParams](types_transaction.SendTransactionParams.md).[skipWaiting](types_transaction.SendTransactionParams.md#skipwaiting) #### Defined in [src/types/transaction.ts:34](https://github.com/algorandfoundation/algokit-utils-ts/blob/main/src/types/transaction.ts#L34) ___ ### suppressLog • `Optional` **suppressLog**: `boolean` Whether to suppress log messages from transaction send, default: do not suppress #### Inherited from [SendTransactionParams](types_transaction.SendTransactionParams.md).[suppressLog](types_transaction.SendTransactionParams.md#suppresslog) #### Defined in [src/types/transaction.ts:38](https://github.com/algorandfoundation/algokit-utils-ts/blob/main/src/types/transaction.ts#L38) ___ ### transactionParams • `Optional` **transactionParams**: `SuggestedParams` Optional transaction parameters #### Defined in [src/types/transfer.ts:30](https://github.com/algorandfoundation/algokit-utils-ts/blob/main/src/types/transfer.ts#L30) ``` -------------------------------------------------------------------------------- /packages/server/tests/tools/transactionManager/generalTransactionManager.test.ts: -------------------------------------------------------------------------------- ```typescript import { McpError, ErrorCode } from '@modelcontextprotocol/sdk/types.js'; import { GeneralTransactionManager, generalTransactionTools } from '../../../src/tools/transactionManager/generalTransaction.js'; import algosdk from 'algosdk'; import type { Transaction } from 'algosdk'; // Mock algosdk jest.mock('algosdk'); // Create mock functions const mockTransaction = jest.fn().mockImplementation((txn: any) => ({ ...txn, get_obj_for_encoding: () => txn, })); const mockAssignGroupID = jest.fn().mockImplementation((txns: any[]) => txns.map(txn => ({ ...txn, group: 'group1', })) ); // Override mock implementations (algosdk as any).Transaction = mockTransaction; (algosdk as any).assignGroupID = mockAssignGroupID; describe('GeneralTransactionManager', () => { beforeEach(() => { jest.clearAllMocks(); }); describe('Tool Schemas', () => { it('should have valid tool schemas', () => { expect(generalTransactionTools).toHaveLength(1); expect(generalTransactionTools.map((t: { name: string }) => t.name)).toEqual([ 'assign_group_id', ]); }); }); describe('Group ID Assignment', () => { const mockTxn1 = { type: 'pay', from: 'sender1' }; const mockTxn2 = { type: 'pay', from: 'sender2' }; const mockGroupedTxns = [ { ...mockTxn1, group: 'group1' }, { ...mockTxn2, group: 'group1' }, ]; beforeEach(() => { // Reset mock implementations mockTransaction.mockImplementation((txn: any) => ({ ...txn, get_obj_for_encoding: () => txn, })); mockAssignGroupID.mockImplementation((txns: any[]) => txns.map(txn => ({ ...txn, group: 'group1', })) ); }); it('should assign group ID to transactions', async () => { const args = { transactions: [mockTxn1, mockTxn2], }; const result = await GeneralTransactionManager.handleTool('assign_group_id', args); expect(result).toEqual({ content: [{ type: 'text', text: JSON.stringify(mockGroupedTxns, null, 2), }], }); expect(mockTransaction).toHaveBeenCalledTimes(2); expect(mockTransaction).toHaveBeenCalledWith(mockTxn1); expect(mockTransaction).toHaveBeenCalledWith(mockTxn2); expect(mockAssignGroupID).toHaveBeenCalledWith( expect.arrayContaining([ expect.objectContaining(mockTxn1), expect.objectContaining(mockTxn2), ]) ); }); it('should handle single transaction', async () => { const args = { transactions: [mockTxn1], }; const result = await GeneralTransactionManager.handleTool('assign_group_id', args); expect(mockTransaction).toHaveBeenCalledTimes(1); expect(mockTransaction).toHaveBeenCalledWith(mockTxn1); expect(mockAssignGroupID).toHaveBeenCalledWith( expect.arrayContaining([ expect.objectContaining(mockTxn1), ]) ); }); }); describe('Error Handling', () => { it('should throw error for unknown tool', async () => { await expect(GeneralTransactionManager.handleTool('unknown_tool', {})) .rejects .toThrow(new McpError(ErrorCode.MethodNotFound, 'Unknown general transaction tool: unknown_tool')); }); it('should throw error for missing transactions array', async () => { await expect(GeneralTransactionManager.handleTool('assign_group_id', {})) .rejects .toThrow(new McpError(ErrorCode.InvalidParams, 'Transactions array is required')); }); it('should throw error for invalid transactions array', async () => { await expect(GeneralTransactionManager.handleTool('assign_group_id', { transactions: 'not-an-array' })) .rejects .toThrow(new McpError(ErrorCode.InvalidParams, 'Transactions array is required')); }); it('should throw error for invalid transaction object', async () => { await expect(GeneralTransactionManager.handleTool('assign_group_id', { transactions: [null] })) .rejects .toThrow(new McpError(ErrorCode.InvalidParams, 'Each transaction must be a valid transaction object')); }); it('should handle transaction creation errors', async () => { const error = new Error('Invalid transaction format'); mockTransaction.mockImplementation(() => { throw error; }); await expect(GeneralTransactionManager.handleTool('assign_group_id', { transactions: [{ type: 'invalid' }] })) .rejects .toThrow(new McpError(ErrorCode.InvalidParams, 'Failed to assign group ID: Invalid transaction format')); }); it('should handle group ID assignment errors', async () => { // Reset Transaction mock to succeed mockTransaction.mockImplementation((txn: any) => ({ ...txn, get_obj_for_encoding: () => txn, })); // Make assignGroupID throw const error = new Error('Group ID assignment failed'); mockAssignGroupID.mockImplementation(() => { throw error; }); await expect(GeneralTransactionManager.handleTool('assign_group_id', { transactions: [ { type: 'pay', from: 'sender1' }, { type: 'pay', from: 'sender2' } ] })) .rejects .toThrow(new McpError(ErrorCode.InvalidParams, 'Failed to assign group ID: Group ID assignment failed')); }); }); describe('Transaction Object Conversion', () => { beforeEach(() => { // Reset mock implementations mockTransaction.mockImplementation((txn: any) => ({ ...txn, get_obj_for_encoding: () => txn, })); mockAssignGroupID.mockImplementation((txns: any[]) => txns.map(txn => ({ ...txn, group: 'group1', })) ); }); it('should convert transaction objects to Transaction instances', async () => { const mockTxn = { type: 'pay', from: 'sender', to: 'receiver', amount: 1000, }; await GeneralTransactionManager.handleTool('assign_group_id', { transactions: [mockTxn, { ...mockTxn, from: 'sender2' }] }); expect(mockTransaction).toHaveBeenCalledWith(mockTxn); }); it('should preserve transaction properties after conversion', async () => { const mockTxn = { type: 'pay', from: 'sender', to: 'receiver', amount: 1000, note: new Uint8Array([1, 2, 3]), lease: new Uint8Array([4, 5, 6]), }; const result = await GeneralTransactionManager.handleTool('assign_group_id', { transactions: [mockTxn, { ...mockTxn, from: 'sender2' }] }); const resultTxn = JSON.parse(result.content[0].text)[0]; expect(resultTxn).toEqual(expect.objectContaining({ type: 'pay', from: 'sender', to: 'receiver', amount: 1000, })); }); }); }); ``` -------------------------------------------------------------------------------- /packages/server/src/resources/knowledge/taxonomy/ARCs:specs:arc-0054.md: -------------------------------------------------------------------------------- ```markdown --- arc: 54 title: ASA Burning App description: Standardized Application for Burning ASAs author: Joe Polny (@joe-p), Brian Whippo (@silentrhetoric) discussions-to: https://github.com/algorandfoundation/ARCs/issues/245 status: Final type: Standards Track category: ARC sub-category: Application created: 2023-09-15 --- ## Abstract This ARC provides TEAL which would deploy a application that can be used for burning Algorand Standard Assets. The goal is to have the apps deployed on the public networks using this TEAL to provide a standardized burn address and app ID. ## Motivation Currently there is no official way to burn ASAs. While one can currently deploy their own app or rekey an account holding the asset to some other address, having a standardized address for burned assets enables explorers and dapps to easily calculate and display burnt supply for any ASA burned here. ### Definitions Related to Token Supply & Burning It is important to note that assets with clawback enabled are effectively impossible to "burn" and could at any point be clawed back from any account or contract. The definitions below attempt to clarify some terminology around tokens and what can be considered burned. | Token Type | Clawback | No Clawback | | ---------- | -------- | ----------- | | Total Supply | Total | Total | | Circulating Supply | Total - Qty in Reserve Address - Qty in burn address | Total - Qty in Reserve Address - Qty in burn address | | Available Supply | Total | Total - Qty in burn address | | Burned Supply | N/A (Impossible to burn) | Qty in burn address | ## Specification ### `ARC-4` JSON Description ```json { "name": "ARC54", "desc": "Standardized application for burning ASAs", "methods": [ { "name": "arc54_optIntoASA", "args": [ { "name": "asa", "type": "asset", "desc": "The asset to which the contract will opt in" } ], "desc": "A method to opt the contract into an ASA", "returns": { "type": "void", "desc": "" } }, { "name": "createApplication", "desc": "", "returns": { "type": "void", "desc": "" }, "args": [] } ] } ``` ## Rationale This simple application is only able to opt in to ASAs but not send them. As such, once an ASA has been sent to the app address it is effectively burnt. If the burned ASA does not have clawback enabled, it will remain permanently in this account and can be considered out of circulation. The app will accept ASAs which have clawback enabled, but any such assets can never be considered permanently burned. Users may use the burning app as a convenient receptable to remove ASAs from their account rather than returning them to the creator account. The app will, of course, only be able to opt into a new ASA if it has sufficient Algo balance to cover the increase minimum balance requirement (MBR). Callers should fund the contract account as needed to cover the opt-in requests. It is possible for the contract to be funded by donated Algo so that subsequent callers need not pay the MBR requirement to request new ASA opt-ins. ## Reference Implementation ### TEAL Approval Program ``` #pragma version 9 // This TEAL was generated by TEALScript v0.62.2 // https://github.com/algorandfoundation/TEALScript // This contract is compliant with and/or implements the following ARCs: [ ARC4 ] // The following ten lines of TEAL handle initial program flow // This pattern is used to make it easy for anyone to parse the start of the program and determine if a specific action is allowed // Here, action refers to the OnComplete in combination with whether the app is being created or called // Every possible action for this contract is represented in the switch statement // If the action is not implemented in the contract, its respective branch will be "NOT_IMPLEMENTED" which just contains "err" txn ApplicationID int 0 > int 6 * txn OnCompletion + switch create_NoOp NOT_IMPLEMENTED NOT_IMPLEMENTED NOT_IMPLEMENTED NOT_IMPLEMENTED NOT_IMPLEMENTED call_NoOp NOT_IMPLEMENTED: err // arc54_optIntoASA(asset)void // // /* // Sends an inner transaction to opt the contract account into an ASA. // The fee for the inner transaction must be covered by the caller. // // @param asa The ASA to opt in to abi_route_arc54_optIntoASA: // asa: asset txna ApplicationArgs 1 btoi txnas Assets // execute arc54_optIntoASA(asset)void callsub arc54_optIntoASA int 1 return arc54_optIntoASA: proto 1 0 // contracts/arc54.algo.ts:13 // sendAssetTransfer({ // assetReceiver: globals.currentApplicationAddress, // xferAsset: asa, // assetAmount: 0, // fee: 0, // }) itxn_begin int axfer itxn_field TypeEnum // contracts/arc54.algo.ts:14 // assetReceiver: globals.currentApplicationAddress global CurrentApplicationAddress itxn_field AssetReceiver // contracts/arc54.algo.ts:15 // xferAsset: asa frame_dig -1 // asa: asset itxn_field XferAsset // contracts/arc54.algo.ts:16 // assetAmount: 0 int 0 itxn_field AssetAmount // contracts/arc54.algo.ts:17 // fee: 0 int 0 itxn_field Fee // Submit inner transaction itxn_submit retsub abi_route_createApplication: int 1 return create_NoOp: method "createApplication()void" txna ApplicationArgs 0 match abi_route_createApplication err call_NoOp: method "arc54_optIntoASA(asset)void" txna ApplicationArgs 0 match abi_route_arc54_optIntoASA err ``` ### TealScript Source Code ``` import { Contract } from '@algorandfoundation/tealscript'; // eslint-disable-next-line no-unused-vars class ARC54 extends Contract { /* * Sends an inner transaction to opt the contract account into an ASA. * The fee for the inner transaction must be covered by the caller. * * @param asa The ASA to opt in to */ arc54_optIntoASA(asa: Asset): void { sendAssetTransfer({ assetReceiver: globals.currentApplicationAddress, xferAsset: asa, assetAmount: 0, fee: 0, }); } } ``` ### Deployments An application per the above reference implementation has been deployed to each of Algorand's networks at these app IDs: | Network | App ID | Address | | --- | --- | --- | | MainNet | 1257620981 | BNFIREKGRXEHCFOEQLTX3PU5SUCMRKDU7WHNBGZA4SXPW42OAHZBP7BPHY | | TestNet | 497806551 | 3TKF2GMZJ5VZ4BQVQGC72BJ63WFN4QBPU2EUD4NQYHFLC3NE5D7GXHXYOQ | | BetaNet | 2019020358 | XRXCALSRDVUY2OQXWDYCRMHPCF346WKIV5JPAHXQ4MZADSROJGDIHZP7AI | ## Security Considerations It should be noted that once an asset is sent to the contract there will be no way to recover the asset unless it has clawback enabled. Due to the simplicity of a TEAL, an audit is not needed. The contract has no code paths which can send tokens, thus there is no concern of an exploit that undoes burning of ASAs without clawback. ## Copyright Copyright and related rights waived via <a href="https://creativecommons.org/publicdomain/zero/1.0/">CCO</a>. ``` -------------------------------------------------------------------------------- /packages/server/src/resources/knowledge/taxonomy/developer:python:code:example:arc4_types.md: -------------------------------------------------------------------------------- ```markdown # ARC4 Types in Algorand Smart Contracts This guide covers the various ARC4 data types available in Algorand smart contracts using Python, including integers, arrays, bytes, addresses, structs, and tuples. ## Integer Types ### Basic Integer Types ```python from algopy import ARC4Contract, UInt64, arc4 class Arc4Types(ARC4Contract): @abimethod() def add_arc4_uint64(self, a: arc4.UInt64, b: arc4.UInt64) -> arc4.UInt64: # Use .native for arithmetic operations c = a.native + b.native return arc4.UInt64(c) ``` ### Different Integer Sizes ```python @abimethod() def add_arc4_uint_n( self, a: arc4.UInt8, b: arc4.UInt16, c: arc4.UInt32, d: arc4.UInt64 ) -> arc4.UInt64: # Different integer sizes have different byte lengths assert a.bytes.length == 1 # UInt8 = 1 byte assert b.bytes.length == 2 # UInt16 = 2 bytes assert c.bytes.length == 4 # UInt32 = 4 bytes assert d.bytes.length == 8 # UInt64 = 8 bytes total = a.native + b.native + c.native + d.native return arc4.UInt64(total) ``` ### Big Integers ```python @abimethod() def add_arc4_biguint_n( self, a: arc4.UInt128, b: arc4.UInt256, c: arc4.UInt512 ) -> arc4.UInt512: # Support for larger integers up to 512 bits assert a.bytes.length == 16 # 128 bits assert b.bytes.length == 32 # 256 bits assert c.bytes.length == 64 # 512 bits total = a.native + b.native + c.native return arc4.UInt512(total) ``` ## Bytes and Address Types ### Bytes ```python @abimethod() def arc4_byte(self, a: arc4.Byte) -> arc4.Byte: # arc4.Byte is an 8-bit integer return arc4.Byte(a.native + 1) ``` ### Addresses ```python @abimethod() def arc4_address_properties(self, address: arc4.Address) -> UInt64: # Access address properties underlying_bytes = address.bytes account = address.native # Get account type bal = account.balance total_asset = account.total_assets return bal @abimethod() def arc4_address_return(self, address: arc4.Address) -> arc4.Address: # Convert Account type to Address account = address.native converted_address = arc4.Address(account) return converted_address ``` ## Arrays ### Static Arrays ```python import typing as t # Define a static array type alias AliasedStaticArray: t.TypeAlias = arc4.StaticArray[arc4.UInt8, t.Literal[1]] class Arc4StaticArray(ARC4Contract): @abimethod() def arc4_static_array(self) -> None: # Create static array directly static_uint32_array = arc4.StaticArray( arc4.UInt32(1), arc4.UInt32(10), arc4.UInt32(255), arc4.UInt32(128) ) # Iterate over array total = UInt64(0) for uint32_item in static_uint32_array: total += uint32_item.native # Use type alias aliased_static = AliasedStaticArray(arc4.UInt8(101)) aliased_static[0] = arc4.UInt8(202) ``` ### Dynamic Arrays ```python # Define dynamic array type alias goodbye: t.TypeAlias = arc4.DynamicArray[arc4.String] class Arc4DynamicArray(ARC4Contract): @abimethod() def hello(self, name: arc4.String) -> String: # Create dynamic array dynamic_string_array = arc4.DynamicArray[arc4.String](arc4.String("Hello ")) # Extend array extension = arc4.DynamicArray[arc4.String](name, arc4.String("!")) dynamic_string_array.extend(extension) # Copy and modify copied_array = dynamic_string_array.copy() copied_array.pop() copied_array.append(arc4.String("world!")) # Iterate over array greeting = String() for x in dynamic_string_array: greeting += x.native return greeting ``` ### Dynamic Bytes ```python @abimethod() def arc4_dynamic_bytes(self) -> arc4.DynamicBytes: # Create dynamic bytes dynamic_bytes = arc4.DynamicBytes(b"\xff\xff\xff") # Access native bytes native_dynamic_bytes = dynamic_bytes.native # Modify bytes dynamic_bytes[0] = arc4.Byte(0) dynamic_bytes.extend(arc4.DynamicBytes(b"\xaa\xbb\xcc")) dynamic_bytes.pop() dynamic_bytes.append(arc4.Byte(255)) return dynamic_bytes ``` ## Structs and Tuples ### Structs ```python class Todo(arc4.Struct): task: arc4.String completed: arc4.Bool Todos: t.TypeAlias = arc4.DynamicArray[Todo] class Arc4Struct(ARC4Contract): def __init__(self) -> None: self.todos = Todos() @abimethod() def add_todo(self, task: arc4.String) -> Todos: # Create and add struct instance todo = Todo(task=task, completed=arc4.Bool(False)) if not self.todos: self.todos = Todos(todo.copy()) else: self.todos.append(todo.copy()) return self.todos @abimethod() def complete_todo(self, task: arc4.String) -> None: # Modify struct field for index in urange(self.todos.length): if self.todos[index].task == task: self.todos[index].completed = arc4.Bool(True) break ``` ### Tuples ```python # Define tuple type contact_info_tuple = arc4.Tuple[arc4.String, arc4.String, arc4.UInt64] class Arc4Tuple(ARC4Contract): def __init__(self) -> None: self.contact_info = GlobalState( contact_info_tuple(( arc4.String(""), arc4.String(""), arc4.UInt64(0) )) ) @abimethod() def add_contact_info(self, contact: contact_info_tuple) -> UInt64: # Unpack tuple values name, email, phone = contact.native self.contact_info.value = contact return phone.native @abimethod() def return_contact(self) -> arc4.Tuple[arc4.String, arc4.String, arc4.UInt64]: # Return tuple return self.contact_info.value ``` ## Best Practices 1. **Integer Operations**: - Use `.native` for arithmetic operations - Choose appropriate integer size - Handle overflow conditions - Convert back to ARC4 types for returns 2. **Array Management**: - Use static arrays for fixed-size collections - Use dynamic arrays for variable-size collections - Make copies when needed - Handle array bounds properly 3. **Struct Usage**: - Define clear struct layouts - Use appropriate field types - Copy structs when storing - Validate struct data 4. **Type Safety**: - Use type aliases for clarity - Verify type conversions - Handle type constraints - Document type requirements 5. **Memory Management**: - Consider size limitations - Use appropriate data structures - Clean up unused data - Optimize storage usage 6. **Performance**: - Choose efficient types - Minimize type conversions - Use appropriate data structures - Consider operation costs This guide demonstrates the various ARC4 data types available in Algorand smart contracts using Python. Understanding these types is crucial for developing efficient and type-safe smart contracts. ``` -------------------------------------------------------------------------------- /packages/server/src/resources/knowledge/taxonomy/algokit:utils:typescript:code:interfaces:types_app.AppCallParams.md: -------------------------------------------------------------------------------- ```markdown [@algorandfoundation/algokit-utils](../README.md) / [types/app](../modules/types_app.md) / AppCallParams # Interface: AppCallParams [types/app](../modules/types_app.md).AppCallParams Parameters representing a call to an app. ## Hierarchy - [`SendTransactionParams`](types_transaction.SendTransactionParams.md) ↳ **`AppCallParams`** ## Table of contents ### Properties - [appId](types_app.AppCallParams.md#appid) - [args](types_app.AppCallParams.md#args) - [atc](types_app.AppCallParams.md#atc) - [callType](types_app.AppCallParams.md#calltype) - [fee](types_app.AppCallParams.md#fee) - [from](types_app.AppCallParams.md#from) - [maxFee](types_app.AppCallParams.md#maxfee) - [maxRoundsToWaitForConfirmation](types_app.AppCallParams.md#maxroundstowaitforconfirmation) - [note](types_app.AppCallParams.md#note) - [populateAppCallResources](types_app.AppCallParams.md#populateappcallresources) - [skipSending](types_app.AppCallParams.md#skipsending) - [skipWaiting](types_app.AppCallParams.md#skipwaiting) - [suppressLog](types_app.AppCallParams.md#suppresslog) - [transactionParams](types_app.AppCallParams.md#transactionparams) ## Properties ### appId • **appId**: `number` \| `bigint` The id of the app to call #### Defined in [src/types/app.ts:185](https://github.com/algorandfoundation/algokit-utils-ts/blob/main/src/types/app.ts#L185) ___ ### args • `Optional` **args**: [`AppCallArgs`](../modules/types_app.md#appcallargs) The arguments passed in to the app call #### Defined in [src/types/app.ts:195](https://github.com/algorandfoundation/algokit-utils-ts/blob/main/src/types/app.ts#L195) ___ ### atc • `Optional` **atc**: `AtomicTransactionComposer` An optional `AtomicTransactionComposer` to add the transaction to, if specified then `skipSending: undefined` has the same effect as `skipSending: true` #### Inherited from [SendTransactionParams](types_transaction.SendTransactionParams.md).[atc](types_transaction.SendTransactionParams.md#atc) #### Defined in [src/types/transaction.ts:36](https://github.com/algorandfoundation/algokit-utils-ts/blob/main/src/types/transaction.ts#L36) ___ ### callType • **callType**: ``"no_op"`` \| ``"opt_in"`` \| ``"close_out"`` \| ``"clear_state"`` \| ``"delete_application"`` \| `NoOpOC` \| `OptInOC` \| `CloseOutOC` \| `ClearStateOC` \| `DeleteApplicationOC` The type of call, everything except create (see `createApp`) and update (see `updateApp`) #### Defined in [src/types/app.ts:187](https://github.com/algorandfoundation/algokit-utils-ts/blob/main/src/types/app.ts#L187) ___ ### fee • `Optional` **fee**: [`AlgoAmount`](../classes/types_amount.AlgoAmount.md) The flat fee you want to pay, useful for covering extra fees in a transaction group or app call #### Inherited from [SendTransactionParams](types_transaction.SendTransactionParams.md).[fee](types_transaction.SendTransactionParams.md#fee) #### Defined in [src/types/transaction.ts:40](https://github.com/algorandfoundation/algokit-utils-ts/blob/main/src/types/transaction.ts#L40) ___ ### from • **from**: [`SendTransactionFrom`](../modules/types_transaction.md#sendtransactionfrom) The account to make the call from #### Defined in [src/types/app.ts:189](https://github.com/algorandfoundation/algokit-utils-ts/blob/main/src/types/app.ts#L189) ___ ### maxFee • `Optional` **maxFee**: [`AlgoAmount`](../classes/types_amount.AlgoAmount.md) The maximum fee that you are happy to pay (default: unbounded) - if this is set it's possible the transaction could get rejected during network congestion #### Inherited from [SendTransactionParams](types_transaction.SendTransactionParams.md).[maxFee](types_transaction.SendTransactionParams.md#maxfee) #### Defined in [src/types/transaction.ts:42](https://github.com/algorandfoundation/algokit-utils-ts/blob/main/src/types/transaction.ts#L42) ___ ### maxRoundsToWaitForConfirmation • `Optional` **maxRoundsToWaitForConfirmation**: `number` The maximum number of rounds to wait for confirmation, only applies if `skipWaiting` is `undefined` or `false`, default: wait up to 5 rounds #### Inherited from [SendTransactionParams](types_transaction.SendTransactionParams.md).[maxRoundsToWaitForConfirmation](types_transaction.SendTransactionParams.md#maxroundstowaitforconfirmation) #### Defined in [src/types/transaction.ts:44](https://github.com/algorandfoundation/algokit-utils-ts/blob/main/src/types/transaction.ts#L44) ___ ### note • `Optional` **note**: [`TransactionNote`](../modules/types_transaction.md#transactionnote) The (optional) transaction note #### Defined in [src/types/app.ts:193](https://github.com/algorandfoundation/algokit-utils-ts/blob/main/src/types/app.ts#L193) ___ ### populateAppCallResources • `Optional` **populateAppCallResources**: `boolean` Whether to use simulate to automatically populate app call resources in the txn objects. Defaults to true when there are app calls in the group. #### Inherited from [SendTransactionParams](types_transaction.SendTransactionParams.md).[populateAppCallResources](types_transaction.SendTransactionParams.md#populateappcallresources) #### Defined in [src/types/transaction.ts:46](https://github.com/algorandfoundation/algokit-utils-ts/blob/main/src/types/transaction.ts#L46) ___ ### skipSending • `Optional` **skipSending**: `boolean` Whether to skip signing and sending the transaction to the chain (default: transaction signed and sent to chain, unless `atc` specified) and instead just return the raw transaction, e.g. so you can add it to a group of transactions #### Inherited from [SendTransactionParams](types_transaction.SendTransactionParams.md).[skipSending](types_transaction.SendTransactionParams.md#skipsending) #### Defined in [src/types/transaction.ts:32](https://github.com/algorandfoundation/algokit-utils-ts/blob/main/src/types/transaction.ts#L32) ___ ### skipWaiting • `Optional` **skipWaiting**: `boolean` Whether to skip waiting for the submitted transaction (only relevant if `skipSending` is `false` or unset) #### Inherited from [SendTransactionParams](types_transaction.SendTransactionParams.md).[skipWaiting](types_transaction.SendTransactionParams.md#skipwaiting) #### Defined in [src/types/transaction.ts:34](https://github.com/algorandfoundation/algokit-utils-ts/blob/main/src/types/transaction.ts#L34) ___ ### suppressLog • `Optional` **suppressLog**: `boolean` Whether to suppress log messages from transaction send, default: do not suppress #### Inherited from [SendTransactionParams](types_transaction.SendTransactionParams.md).[suppressLog](types_transaction.SendTransactionParams.md#suppresslog) #### Defined in [src/types/transaction.ts:38](https://github.com/algorandfoundation/algokit-utils-ts/blob/main/src/types/transaction.ts#L38) ___ ### transactionParams • `Optional` **transactionParams**: `SuggestedParams` Optional transaction parameters #### Defined in [src/types/app.ts:191](https://github.com/algorandfoundation/algokit-utils-ts/blob/main/src/types/app.ts#L191) ``` -------------------------------------------------------------------------------- /packages/server/src/resources/knowledge/taxonomy/algokit:utils:typescript:code:classes:types_kmd_account_manager.KmdAccountManager.md: -------------------------------------------------------------------------------- ```markdown [@algorandfoundation/algokit-utils](../README.md) / [types/kmd-account-manager](../modules/types_kmd_account_manager.md) / KmdAccountManager # Class: KmdAccountManager [types/kmd-account-manager](../modules/types_kmd_account_manager.md).KmdAccountManager Provides abstractions over a [KMD](https://github.com/algorand/go-algorand/blob/master/daemon/kmd/README.md) instance that makes it easier to get and manage accounts using KMD. ## Table of contents ### Constructors - [constructor](types_kmd_account_manager.KmdAccountManager.md#constructor) ### Properties - [\_clientManager](types_kmd_account_manager.KmdAccountManager.md#_clientmanager) - [\_kmd](types_kmd_account_manager.KmdAccountManager.md#_kmd) ### Methods - [getLocalNetDispenserAccount](types_kmd_account_manager.KmdAccountManager.md#getlocalnetdispenseraccount) - [getOrCreateWalletAccount](types_kmd_account_manager.KmdAccountManager.md#getorcreatewalletaccount) - [getWalletAccount](types_kmd_account_manager.KmdAccountManager.md#getwalletaccount) - [kmd](types_kmd_account_manager.KmdAccountManager.md#kmd) ## Constructors ### constructor • **new KmdAccountManager**(`clientManager`): [`KmdAccountManager`](types_kmd_account_manager.KmdAccountManager.md) Create a new KMD manager. #### Parameters | Name | Type | Description | | :------ | :------ | :------ | | `clientManager` | [`ClientManager`](types_client_manager.ClientManager.md) | A ClientManager client to use for algod and kmd clients | #### Returns [`KmdAccountManager`](types_kmd_account_manager.KmdAccountManager.md) #### Defined in [src/types/kmd-account-manager.ts:18](https://github.com/algorandfoundation/algokit-utils-ts/blob/main/src/types/kmd-account-manager.ts#L18) ## Properties ### \_clientManager • `Private` **\_clientManager**: `Omit`\<[`ClientManager`](types_client_manager.ClientManager.md), ``"kmd"``\> #### Defined in [src/types/kmd-account-manager.ts:11](https://github.com/algorandfoundation/algokit-utils-ts/blob/main/src/types/kmd-account-manager.ts#L11) ___ ### \_kmd • `Private` `Optional` **\_kmd**: ``null`` \| `KmdClient` #### Defined in [src/types/kmd-account-manager.ts:12](https://github.com/algorandfoundation/algokit-utils-ts/blob/main/src/types/kmd-account-manager.ts#L12) ## Methods ### getLocalNetDispenserAccount ▸ **getLocalNetDispenserAccount**(): `Promise`\<[`TransactionSignerAccount`](../interfaces/types_account.TransactionSignerAccount.md) & \{ `account`: [`SigningAccount`](types_account.SigningAccount.md) }\> Returns an Algorand account with private key loaded for the default LocalNet dispenser account (that can be used to fund other accounts). #### Returns `Promise`\<[`TransactionSignerAccount`](../interfaces/types_account.TransactionSignerAccount.md) & \{ `account`: [`SigningAccount`](types_account.SigningAccount.md) }\> The default LocalNet dispenser account **`Example`** ```typescript const dispenser = await kmdAccountManager.getLocalNetDispenserAccount() ``` #### Defined in [src/types/kmd-account-manager.ts:186](https://github.com/algorandfoundation/algokit-utils-ts/blob/main/src/types/kmd-account-manager.ts#L186) ___ ### getOrCreateWalletAccount ▸ **getOrCreateWalletAccount**(`name`, `fundWith?`): `Promise`\<[`TransactionSignerAccount`](../interfaces/types_account.TransactionSignerAccount.md) & \{ `account`: [`SigningAccount`](types_account.SigningAccount.md) }\> Gets an account with private key loaded from a KMD wallet of the given name, or alternatively creates one with funds in it via a KMD wallet of the given name. This is useful to get idempotent accounts from LocalNet without having to specify the private key (which will change when resetting the LocalNet). This significantly speeds up local dev time and improves experience since you can write code that *just works* first go without manual config in a fresh LocalNet. If this is used via `mnemonicAccountFromEnvironment`, then you can even use the same code that runs on production without changes for local development! #### Parameters | Name | Type | Description | | :------ | :------ | :------ | | `name` | `string` | The name of the wallet to retrieve / create | | `fundWith?` | [`AlgoAmount`](types_amount.AlgoAmount.md) | The number of Algo to fund the account with when it gets created, if not specified then 1000 ALGO will be funded from the dispenser account | #### Returns `Promise`\<[`TransactionSignerAccount`](../interfaces/types_account.TransactionSignerAccount.md) & \{ `account`: [`SigningAccount`](types_account.SigningAccount.md) }\> An Algorand account with private key loaded - either one that already existed in the given KMD wallet, or a new one that is funded for you **`Example`** ```typescript // Idempotently get (if exists) or crate (if it doesn't exist yet) an account by name using KMD // if creating it then fund it with 2 ALGO from the default dispenser account const newAccount = await kmdAccountManager.getOrCreateWalletAccount('account1', (2).algo()) // This will return the same account as above since the name matches const existingAccount = await kmdAccountManager.getOrCreateWalletAccount('account1') ``` #### Defined in [src/types/kmd-account-manager.ts:135](https://github.com/algorandfoundation/algokit-utils-ts/blob/main/src/types/kmd-account-manager.ts#L135) ___ ### getWalletAccount ▸ **getWalletAccount**(`walletName`, `predicate?`, `sender?`): `Promise`\<`undefined` \| [`TransactionSignerAccount`](../interfaces/types_account.TransactionSignerAccount.md) & \{ `account`: [`SigningAccount`](types_account.SigningAccount.md) }\> Returns an Algorand signing account with private key loaded from the given KMD wallet (identified by name). #### Parameters | Name | Type | Description | | :------ | :------ | :------ | | `walletName` | `string` | The name of the wallet to retrieve an account from | | `predicate?` | (`account`: `Record`\<`string`, `any`\>) => `boolean` | An optional filter to use to find the account (otherwise it will return a random account from the wallet) | | `sender?` | `string` \| `Address` | The optional sender address to use this signer for (aka a rekeyed account) | #### Returns `Promise`\<`undefined` \| [`TransactionSignerAccount`](../interfaces/types_account.TransactionSignerAccount.md) & \{ `account`: [`SigningAccount`](types_account.SigningAccount.md) }\> The signing account (with private key loaded) or undefined if no matching wallet or account was found **`Example`** ```typescript const defaultDispenserAccount = await kmdAccountManager.getWalletAccount( 'unencrypted-default-wallet', a => a.status !== 'Offline' && a.amount > 1_000_000_000 ) ``` #### Defined in [src/types/kmd-account-manager.ts:62](https://github.com/algorandfoundation/algokit-utils-ts/blob/main/src/types/kmd-account-manager.ts#L62) ___ ### kmd ▸ **kmd**(): `Promise`\<`KmdClient`\> #### Returns `Promise`\<`KmdClient`\> #### Defined in [src/types/kmd-account-manager.ts:27](https://github.com/algorandfoundation/algokit-utils-ts/blob/main/src/types/kmd-account-manager.ts#L27) ``` -------------------------------------------------------------------------------- /packages/server/tests/tools/accountManager.test.ts: -------------------------------------------------------------------------------- ```typescript import { McpError, ErrorCode } from '@modelcontextprotocol/sdk/types.js'; import { AccountManager } from '../../src/tools/accountManager.js'; import algosdk from 'algosdk'; import { algodClient } from '../../src/algorand-client.js'; // Mock algosdk jest.mock('algosdk', () => ({ generateAccount: jest.fn(), secretKeyToMnemonic: jest.fn(), mnemonicToMasterDerivationKey: jest.fn(), masterDerivationKeyToMnemonic: jest.fn(), mnemonicToSecretKey: jest.fn(), seedFromMnemonic: jest.fn(), mnemonicFromSeed: jest.fn(), makePaymentTxnWithSuggestedParamsFromObject: jest.fn(), })); // Mock algodClient jest.mock('../../src/algorand-client.js', () => ({ algodClient: { getTransactionParams: jest.fn().mockReturnValue({ do: jest.fn().mockResolvedValue({ firstRound: 1000, lastRound: 2000, genesisHash: 'hash', genesisID: 'testnet-v1.0', }), }), }, })); describe('AccountManager', () => { beforeEach(() => { jest.clearAllMocks(); }); describe('Tool Schemas', () => { it('should have valid tool schemas', () => { expect(AccountManager.accountTools).toHaveLength(8); expect(AccountManager.accountTools.map((t: { name: string }) => t.name)).toEqual([ 'create_account', 'rekey_account', 'mnemonic_to_mdk', 'mdk_to_mnemonic', 'secret_key_to_mnemonic', 'mnemonic_to_secret_key', 'seed_from_mnemonic', 'mnemonic_from_seed', ]); }); }); describe('createAccount', () => { it('should create a new account', () => { const mockAccount = { addr: 'test-address', sk: new Uint8Array([1, 2, 3]), }; const mockMnemonic = 'test mnemonic'; (algosdk.generateAccount as jest.Mock).mockReturnValue(mockAccount); (algosdk.secretKeyToMnemonic as jest.Mock).mockReturnValue(mockMnemonic); const result = AccountManager.createAccount(); expect(result).toEqual({ address: mockAccount.addr, mnemonic: mockMnemonic, }); expect(algosdk.generateAccount).toHaveBeenCalled(); expect(algosdk.secretKeyToMnemonic).toHaveBeenCalledWith(mockAccount.sk); }); }); describe('createRekeyTransaction', () => { it('should create a rekey transaction', async () => { const fromAddress = 'from-address'; const toAddress = 'to-address'; const mockTxn = { type: 'pay' }; (algosdk.makePaymentTxnWithSuggestedParamsFromObject as jest.Mock).mockReturnValue(mockTxn); const result = await AccountManager.createRekeyTransaction(fromAddress, toAddress); expect(result).toBe(mockTxn); expect(algosdk.makePaymentTxnWithSuggestedParamsFromObject).toHaveBeenCalledWith( expect.objectContaining({ from: fromAddress, to: fromAddress, amount: 0, rekeyTo: toAddress, }) ); }); }); describe('handleTool', () => { it('should handle create_account', async () => { const mockAccount = { address: 'test-address', mnemonic: 'test mnemonic', }; jest.spyOn(AccountManager, 'createAccount').mockReturnValue(mockAccount); const result = await AccountManager.handleTool('create_account', {}); expect(result).toEqual({ content: [{ type: 'text', text: JSON.stringify(mockAccount, null, 2), }], }); }); it('should handle rekey_account', async () => { const mockTxn = { type: 'pay' }; jest.spyOn(AccountManager, 'createRekeyTransaction').mockResolvedValue(mockTxn as any); const result = await AccountManager.handleTool('rekey_account', { sourceAddress: 'from-address', targetAddress: 'to-address', }); expect(result).toEqual({ content: [{ type: 'text', text: JSON.stringify(mockTxn, null, 2), }], }); }); it('should handle mnemonic_to_mdk', async () => { const mockMdk = new Uint8Array([1, 2, 3]); (algosdk.mnemonicToMasterDerivationKey as jest.Mock).mockReturnValue(mockMdk); const result = await AccountManager.handleTool('mnemonic_to_mdk', { mnemonic: 'test mnemonic', }); expect(result).toEqual({ content: [{ type: 'text', text: JSON.stringify({ mdk: Buffer.from(mockMdk).toString('hex') }, null, 2), }], }); }); it('should handle mdk_to_mnemonic', async () => { const mockMnemonic = 'test mnemonic'; (algosdk.masterDerivationKeyToMnemonic as jest.Mock).mockReturnValue(mockMnemonic); const result = await AccountManager.handleTool('mdk_to_mnemonic', { mdk: '010203', }); expect(result).toEqual({ content: [{ type: 'text', text: JSON.stringify({ mnemonic: mockMnemonic }, null, 2), }], }); }); it('should throw error for unknown tool', async () => { await expect(AccountManager.handleTool('unknown_tool', {})) .rejects .toThrow(new McpError(ErrorCode.MethodNotFound, 'Unknown tool: unknown_tool')); }); it('should throw error for invalid parameters', async () => { await expect(AccountManager.handleTool('rekey_account', {})) .rejects .toThrow(new McpError(ErrorCode.InvalidParams, 'Invalid rekey account parameters')); }); }); describe('Mnemonic Conversions', () => { it('should convert mnemonic to secret key', () => { const mockResult = { sk: new Uint8Array([1, 2, 3]), addr: 'test-address', }; (algosdk.mnemonicToSecretKey as jest.Mock).mockReturnValue(mockResult); const result = AccountManager.mnemonicToSecretKey('test mnemonic'); expect(result).toBe(mockResult); expect(algosdk.mnemonicToSecretKey).toHaveBeenCalledWith('test mnemonic'); }); it('should convert secret key to mnemonic', () => { const mockMnemonic = 'test mnemonic'; (algosdk.secretKeyToMnemonic as jest.Mock).mockReturnValue(mockMnemonic); const secretKey = new Uint8Array([1, 2, 3]); const result = AccountManager.secretKeyToMnemonic(secretKey); expect(result).toBe(mockMnemonic); expect(algosdk.secretKeyToMnemonic).toHaveBeenCalledWith(secretKey); }); it('should generate seed from mnemonic', () => { const mockSeed = new Uint8Array([1, 2, 3]); (algosdk.seedFromMnemonic as jest.Mock).mockReturnValue(mockSeed); const result = AccountManager.seedFromMnemonic('test mnemonic'); expect(result).toBe(mockSeed); expect(algosdk.seedFromMnemonic).toHaveBeenCalledWith('test mnemonic'); }); it('should generate mnemonic from seed', () => { const mockMnemonic = 'test mnemonic'; (algosdk.mnemonicFromSeed as jest.Mock).mockReturnValue(mockMnemonic); const seed = new Uint8Array([1, 2, 3]); const result = AccountManager.mnemonicFromSeed(seed); expect(result).toBe(mockMnemonic); expect(algosdk.mnemonicFromSeed).toHaveBeenCalledWith(seed); }); }); }); ``` -------------------------------------------------------------------------------- /packages/server/src/resources/knowledge/taxonomy/algokit:utils:typescript:code:classes:types_async_event_emitter.AsyncEventEmitter.md: -------------------------------------------------------------------------------- ```markdown [@algorandfoundation/algokit-utils](../README.md) / [types/async-event-emitter](../modules/types_async_event_emitter.md) / AsyncEventEmitter # Class: AsyncEventEmitter [types/async-event-emitter](../modules/types_async_event_emitter.md).AsyncEventEmitter ## Table of contents ### Constructors - [constructor](types_async_event_emitter.AsyncEventEmitter.md#constructor) ### Properties - [listenerMap](types_async_event_emitter.AsyncEventEmitter.md#listenermap) - [listenerWrapperMap](types_async_event_emitter.AsyncEventEmitter.md#listenerwrappermap) - [off](types_async_event_emitter.AsyncEventEmitter.md#off) ### Methods - [emitAsync](types_async_event_emitter.AsyncEventEmitter.md#emitasync) - [on](types_async_event_emitter.AsyncEventEmitter.md#on) - [once](types_async_event_emitter.AsyncEventEmitter.md#once) - [removeListener](types_async_event_emitter.AsyncEventEmitter.md#removelistener) ## Constructors ### constructor • **new AsyncEventEmitter**(): [`AsyncEventEmitter`](types_async_event_emitter.AsyncEventEmitter.md) #### Returns [`AsyncEventEmitter`](types_async_event_emitter.AsyncEventEmitter.md) ## Properties ### listenerMap • `Private` **listenerMap**: `Record`\<`string` \| `symbol`, [`AsyncEventListener`](../modules/types_async_event_emitter.md#asynceventlistener)\<`unknown`\>[]\> = `{}` #### Defined in [src/types/async-event-emitter.ts:7](https://github.com/algorandfoundation/algokit-utils-ts/blob/main/src/types/async-event-emitter.ts#L7) ___ ### listenerWrapperMap • `Private` **listenerWrapperMap**: `WeakMap`\<[`AsyncEventListener`](../modules/types_async_event_emitter.md#asynceventlistener)\<`unknown`\>, [`AsyncEventListener`](../modules/types_async_event_emitter.md#asynceventlistener)\<`unknown`\>\> #### Defined in [src/types/async-event-emitter.ts:6](https://github.com/algorandfoundation/algokit-utils-ts/blob/main/src/types/async-event-emitter.ts#L6) ___ ### off • **off**: (`eventName`: `string` \| `symbol`, `listener`: [`AsyncEventListener`](../modules/types_async_event_emitter.md#asynceventlistener)\<`unknown`\>) => [`AsyncEventEmitter`](types_async_event_emitter.AsyncEventEmitter.md) #### Type declaration ▸ (`eventName`, `listener`): [`AsyncEventEmitter`](types_async_event_emitter.AsyncEventEmitter.md) ##### Parameters | Name | Type | | :------ | :------ | | `eventName` | `string` \| `symbol` | | `listener` | [`AsyncEventListener`](../modules/types_async_event_emitter.md#asynceventlistener)\<`unknown`\> | ##### Returns [`AsyncEventEmitter`](types_async_event_emitter.AsyncEventEmitter.md) #### Defined in [src/types/async-event-emitter.ts:55](https://github.com/algorandfoundation/algokit-utils-ts/blob/main/src/types/async-event-emitter.ts#L55) ## Methods ### emitAsync ▸ **emitAsync**\<`K`\>(`eventName`, `event`): `Promise`\<`void`\> #### Type parameters | Name | Type | | :------ | :------ | | `K` | extends [`EventType`](../enums/types_lifecycle_events.EventType.md) | #### Parameters | Name | Type | | :------ | :------ | | `eventName` | `K` | | `event` | [`EventDataMap`](../modules/types_lifecycle_events.md#eventdatamap)[`K`] | #### Returns `Promise`\<`void`\> #### Defined in [src/types/async-event-emitter.ts:9](https://github.com/algorandfoundation/algokit-utils-ts/blob/main/src/types/async-event-emitter.ts#L9) ▸ **emitAsync**(`eventName`, `event`): `Promise`\<`void`\> #### Parameters | Name | Type | | :------ | :------ | | `eventName` | `string` \| `symbol` | | `event` | `unknown` | #### Returns `Promise`\<`void`\> #### Defined in [src/types/async-event-emitter.ts:10](https://github.com/algorandfoundation/algokit-utils-ts/blob/main/src/types/async-event-emitter.ts#L10) ___ ### on ▸ **on**\<`K`\>(`eventName`, `listener`): [`AsyncEventEmitter`](types_async_event_emitter.AsyncEventEmitter.md) #### Type parameters | Name | Type | | :------ | :------ | | `K` | extends [`EventType`](../enums/types_lifecycle_events.EventType.md) | #### Parameters | Name | Type | | :------ | :------ | | `eventName` | `K` | | `listener` | [`AsyncEventListener`](../modules/types_async_event_emitter.md#asynceventlistener)\<[`EventDataMap`](../modules/types_lifecycle_events.md#eventdatamap)[`K`]\> | #### Returns [`AsyncEventEmitter`](types_async_event_emitter.AsyncEventEmitter.md) #### Defined in [src/types/async-event-emitter.ts:17](https://github.com/algorandfoundation/algokit-utils-ts/blob/main/src/types/async-event-emitter.ts#L17) ▸ **on**\<`T`\>(`eventName`, `listener`): [`AsyncEventEmitter`](types_async_event_emitter.AsyncEventEmitter.md) #### Type parameters | Name | Type | | :------ | :------ | | `T` | `unknown` | #### Parameters | Name | Type | | :------ | :------ | | `eventName` | `string` \| `symbol` | | `listener` | [`AsyncEventListener`](../modules/types_async_event_emitter.md#asynceventlistener)\<`T`\> | #### Returns [`AsyncEventEmitter`](types_async_event_emitter.AsyncEventEmitter.md) #### Defined in [src/types/async-event-emitter.ts:18](https://github.com/algorandfoundation/algokit-utils-ts/blob/main/src/types/async-event-emitter.ts#L18) ___ ### once ▸ **once**\<`K`\>(`eventName`, `listener`): [`AsyncEventEmitter`](types_async_event_emitter.AsyncEventEmitter.md) #### Type parameters | Name | Type | | :------ | :------ | | `K` | extends [`EventType`](../enums/types_lifecycle_events.EventType.md) | #### Parameters | Name | Type | | :------ | :------ | | `eventName` | `K` | | `listener` | [`AsyncEventListener`](../modules/types_async_event_emitter.md#asynceventlistener)\<[`EventDataMap`](../modules/types_lifecycle_events.md#eventdatamap)[`K`]\> | #### Returns [`AsyncEventEmitter`](types_async_event_emitter.AsyncEventEmitter.md) #### Defined in [src/types/async-event-emitter.ts:25](https://github.com/algorandfoundation/algokit-utils-ts/blob/main/src/types/async-event-emitter.ts#L25) ▸ **once**\<`T`\>(`eventName`, `listener`): [`AsyncEventEmitter`](types_async_event_emitter.AsyncEventEmitter.md) #### Type parameters | Name | Type | | :------ | :------ | | `T` | `unknown` | #### Parameters | Name | Type | | :------ | :------ | | `eventName` | `string` \| `symbol` | | `listener` | [`AsyncEventListener`](../modules/types_async_event_emitter.md#asynceventlistener)\<`T`\> | #### Returns [`AsyncEventEmitter`](types_async_event_emitter.AsyncEventEmitter.md) #### Defined in [src/types/async-event-emitter.ts:26](https://github.com/algorandfoundation/algokit-utils-ts/blob/main/src/types/async-event-emitter.ts#L26) ___ ### removeListener ▸ **removeListener**(`eventName`, `listener`): [`AsyncEventEmitter`](types_async_event_emitter.AsyncEventEmitter.md) #### Parameters | Name | Type | | :------ | :------ | | `eventName` | `string` \| `symbol` | | `listener` | [`AsyncEventListener`](../modules/types_async_event_emitter.md#asynceventlistener)\<`unknown`\> | #### Returns [`AsyncEventEmitter`](types_async_event_emitter.AsyncEventEmitter.md) #### Defined in [src/types/async-event-emitter.ts:39](https://github.com/algorandfoundation/algokit-utils-ts/blob/main/src/types/async-event-emitter.ts#L39) ``` -------------------------------------------------------------------------------- /packages/server/src/resources/knowledge/taxonomy/algokit:cli:architecture-decisions:2022-11-22_beaker-testing-strategy.md: -------------------------------------------------------------------------------- ```markdown # Beaker testing strategy - **Status**: Draft - **Owner:** Rob Moore - **Deciders**: Anne Kenyon (Algorand Inc.), Alessandro Cappellato (Algorand Foundation), Michael Diamant (Algorand Inc.), Benjamin Guidarelli (Algorand Foundation) - **Date created**: 2022-11-22 - **Date decided:** TBD - **Date updated**: 2022-11-28 ## Context AlgoKit will be providing a smart contract development experience built on top of [PyTEAL](https://pyteal.readthedocs.io/en/stable/) and [Beaker](https://developer.algorand.org/articles/hello-beaker/). Beaker is currently in a pre-production state and needs to be productionised to provide confidence for use in generating production-ready smart contracts by AlgoKit users. One of the key things to resolve to productionisation of Beaker is to improve the automated test coverage. Beaker itself is currently split into the PyTEAL generation related code and the deployment and invocation related code (including interacting with Sandbox). This decision is solely focussed on the PyTEAL generation components of Beaker. The current automated test coverage of this part of the codebase is ~50% and is largely based on compiling and/or executing smart contracts against Algorand Sandbox. While it's generally not best practice to try and case a specific code coverage percentage, a coverage of ~80%+ is likely indicative of good coverage in a dynamic language such as Python. The Sandbox tests provide a great deal of confidence, but are also slow to execute, which can potentially impair Beaker development and maintenance experience, especially as the coverage % is grown and/or features are added over time. Beaker, like PyTEAL, can be considered to be a transpiler on top of TEAL. When generating smart contracts, the individual TEAL opcodes are significant, since security audits will often consider the impact at that level, and it can have impacts on (limited!) resource usage of the smart contract. As such, "output stability" is potentially an important characteristic to test for. ## Requirements - We have a high degree of confidence that writing smart contracts in Beaker leads to expected results for production smart contracts - We have reasonable regression coverage so features are unlikely to break as new features and refactorings are added over time - We have a level of confidence in the "output stability" of the TEAL code generated from a Beaker smart contract ## Principles - **Fast development feedback loops** - The feedback loop during normal development should be as fast as possible to improve the development experience of developing Beaker itself - **Low overhead** - The overhead of writing and maintaining tests is as low as possible; tests should be quick to read and write - **Implementation decoupled** - Tests aren't testing the implementation details of Beaker, but rather the user-facing experience and output of it; this reduces the likelihood of needing to rewrite tests when performing refactoring of the codebase ## Options ### Option 1: TEAL Approval tests Writing [approval tests](https://approvaltests.com/) of the TEAL output generated from a given Beaker smart contract. **Pros** - Ensures TEAL output stability and focussing on asserting the output of Beaker rather than testing whether Algorand Protocol is working - Runs in-memory/in-process so will execute in low 10s of milliseconds making it easy to provide high coverage with low developer feedback loop overhead - Tests are easy to write - the assertion is a single line of code (no tedious assertions) - The tests go from Beaker contract -> TEAL approval so don't bake implementation detail and thus allow full Beaker refactoring with regression confidence without needing to modify the tests - Excellent regression coverage characteristics - fast test run and quick to write allows for high coverage and anchoring assertions to TEAL output is a very clear regression marker **Cons** - The tests rely on the approver to understand the TEAL opcodes that are emitted and verify they match the intent of the Beaker contract - anecdotally this can be difficult at times even for experienced (Py)TEAL developers - Doesn't assert the correctness of the TEAL output, just that it matches the previously manually approved output ### Option 2: Sandbox compile tests Writing Beaker smart contracts and checking that the TEAL output successfully compiles against algod. **Pros** - Ensures that the TEAL output compiles, giving some surety about the intactness of it and focussing on asserting the output of Beaker rather than testing whether Algorand Protocol is working - Faster than executing the contract - Tests are easy to write - the assertion is a single line of code (no tedious assertions) **Cons** - Order of magnitude slower than asserting TEAL output (out of process communication) - Doesn't assert the correctness of the TEAL output, just that it compiles ### Option 3: Sandbox execution tests Execute the smart contracts and assert the output is as expected. This can be done using dry run and/or actual transactions. **Pros** - Asserts that the TEAL output _executes_ correctly giving the highest confidence - Doesn't require the test writer to understand the TEAL output - Tests don't bake implementation detail and do assert on output so give a reasonable degree of refactoring confidence without modifying tests **Cons** - Tests are more complex to write - Tests take an order of magnitude longer to run than just compilation (two orders of magnitude to run than checking TEAL output) - Harder to get high regression coverage since it's slower to write and run the tests making it impractical to get full coverage - Doesn't ensure output stability - Is testing that the Algorand Protocol itself works (TEAL `x` when executed does `y`) so the testing scope is broader than just Beaker itself ## Preferred option Option 1 (combined with Option 2 to ensure the approved TEAL actually compiles, potentially only run on CI by default to ensure fast local dev loop) for the bulk of testing to provide a rapid feedback loop for developers as well as ensuring output stability and great regression coverage. ## Selected option Combination of option 1, 2 and 3: - While Option 1 + 2 provides high confidence with fast feedback loop, it relies on the approver being able to determine the TEAL output does what they think it does, which isn't always the case - Option 3 will be used judiciously to provide that extra level of confidence that the fundamentals of the Beaker output are correct for each main feature; this will involve key scenarios being tested with execution based tests, the goal isn't to get combinatorial coverage, which would be slow and time-consuming, but to give a higher degree of confidence - The decision of when to use Option 3 as well as Option 1+2 will be made on a per-feature basis and reviewed via pull request, over time a set of principles may be able to be revised that outline a clear delineation - Use of PyTest markers to separate execution so by default the dev feedback loop is still fast, but the full suite is always run against pull requests and merges to main ``` -------------------------------------------------------------------------------- /packages/server/src/resources/knowledge/taxonomy/SDKs:javascript:classes:indexerModels.TransactionApplication.md: -------------------------------------------------------------------------------- ```markdown [algosdk](../README.md) / [Exports](../modules.md) / [indexerModels](../modules/indexerModels.md) / TransactionApplication # Class: TransactionApplication [indexerModels](../modules/indexerModels.md).TransactionApplication Fields for application transactions. Definition: data/transactions/application.go : ApplicationCallTxnFields ## Hierarchy - `default` ↳ **`TransactionApplication`** ## Table of contents ### Constructors - [constructor](indexerModels.TransactionApplication.md#constructor) ### Properties - [accounts](indexerModels.TransactionApplication.md#accounts) - [applicationArgs](indexerModels.TransactionApplication.md#applicationargs) - [applicationId](indexerModels.TransactionApplication.md#applicationid) - [approvalProgram](indexerModels.TransactionApplication.md#approvalprogram) - [attribute\_map](indexerModels.TransactionApplication.md#attribute_map) - [clearStateProgram](indexerModels.TransactionApplication.md#clearstateprogram) - [extraProgramPages](indexerModels.TransactionApplication.md#extraprogrampages) - [foreignApps](indexerModels.TransactionApplication.md#foreignapps) - [foreignAssets](indexerModels.TransactionApplication.md#foreignassets) - [globalStateSchema](indexerModels.TransactionApplication.md#globalstateschema) - [localStateSchema](indexerModels.TransactionApplication.md#localstateschema) - [onCompletion](indexerModels.TransactionApplication.md#oncompletion) ### Methods - [get\_obj\_for\_encoding](indexerModels.TransactionApplication.md#get_obj_for_encoding) - [from\_obj\_for\_encoding](indexerModels.TransactionApplication.md#from_obj_for_encoding) ## Constructors ### constructor • **new TransactionApplication**(`«destructured»`) Creates a new `TransactionApplication` object. #### Parameters | Name | Type | | :------ | :------ | | `«destructured»` | `Object` | | › `accounts?` | `string`[] | | › `applicationArgs?` | `Uint8Array`[] | | › `applicationId` | `number` \| `bigint` | | › `approvalProgram?` | `string` \| `Uint8Array` | | › `clearStateProgram?` | `string` \| `Uint8Array` | | › `extraProgramPages?` | `number` \| `bigint` | | › `foreignApps?` | (`number` \| `bigint`)[] | | › `foreignAssets?` | (`number` \| `bigint`)[] | | › `globalStateSchema?` | [`StateSchema`](indexerModels.StateSchema.md) | | › `localStateSchema?` | [`StateSchema`](indexerModels.StateSchema.md) | | › `onCompletion?` | `string` | #### Overrides BaseModel.constructor #### Defined in client/v2/indexer/models/types.ts:4763 ## Properties ### accounts • `Optional` **accounts**: `string`[] (apat) List of accounts in addition to the sender that may be accessed from the application's approval-program and clear-state-program. #### Defined in client/v2/indexer/models/types.ts:4653 ___ ### applicationArgs • `Optional` **applicationArgs**: `Uint8Array`[] (apaa) transaction specific arguments accessed from the application's approval-program and clear-state-program. #### Defined in client/v2/indexer/models/types.ts:4659 ___ ### applicationId • **applicationId**: `number` \| `bigint` (apid) ID of the application being configured or empty if creating. #### Defined in client/v2/indexer/models/types.ts:4647 ___ ### approvalProgram • `Optional` **approvalProgram**: `Uint8Array` (apap) Logic executed for every application transaction, except when on-completion is set to "clear". It can read and write global state for the application, as well as account-specific local state. Approval programs may reject the transaction. #### Defined in client/v2/indexer/models/types.ts:4667 ___ ### attribute\_map • **attribute\_map**: `Record`\<`string`, `string`\> #### Inherited from BaseModel.attribute\_map #### Defined in client/v2/basemodel.ts:56 ___ ### clearStateProgram • `Optional` **clearStateProgram**: `Uint8Array` (apsu) Logic executed for application transactions with on-completion set to "clear". It can read and write global state for the application, as well as account-specific local state. Clear state programs cannot reject the transaction. #### Defined in client/v2/indexer/models/types.ts:4675 ___ ### extraProgramPages • `Optional` **extraProgramPages**: `number` \| `bigint` (epp) specifies the additional app program len requested in pages. #### Defined in client/v2/indexer/models/types.ts:4680 ___ ### foreignApps • `Optional` **foreignApps**: (`number` \| `bigint`)[] (apfa) Lists the applications in addition to the application-id whose global states may be accessed by this application's approval-program and clear-state-program. The access is read-only. #### Defined in client/v2/indexer/models/types.ts:4687 ___ ### foreignAssets • `Optional` **foreignAssets**: (`number` \| `bigint`)[] (apas) lists the assets whose parameters may be accessed by this application's ApprovalProgram and ClearStateProgram. The access is read-only. #### Defined in client/v2/indexer/models/types.ts:4693 ___ ### globalStateSchema • `Optional` **globalStateSchema**: [`StateSchema`](indexerModels.StateSchema.md) Represents a (apls) local-state or (apgs) global-state schema. These schemas determine how much storage may be used in a local-state or global-state for an application. The more space used, the larger minimum balance must be maintained in the account holding the data. #### Defined in client/v2/indexer/models/types.ts:4701 ___ ### localStateSchema • `Optional` **localStateSchema**: [`StateSchema`](indexerModels.StateSchema.md) Represents a (apls) local-state or (apgs) global-state schema. These schemas determine how much storage may be used in a local-state or global-state for an application. The more space used, the larger minimum balance must be maintained in the account holding the data. #### Defined in client/v2/indexer/models/types.ts:4709 ___ ### onCompletion • `Optional` **onCompletion**: `string` (apan) defines the what additional actions occur with the transaction. Valid types: * noop * optin * closeout * clear * update * update * delete #### Defined in client/v2/indexer/models/types.ts:4722 ## Methods ### get\_obj\_for\_encoding ▸ **get_obj_for_encoding**(`binary?`): `Record`\<`string`, `any`\> Get an object ready for encoding to either JSON or msgpack. #### Parameters | Name | Type | Default value | Description | | :------ | :------ | :------ | :------ | | `binary` | `boolean` | `false` | Use true to indicate that the encoding can handle raw binary objects (Uint8Arrays). Use false to indicate that raw binary objects should be converted to base64 strings. True should be used for objects that will be encoded with msgpack, and false should be used for objects that will be encoded with JSON. | #### Returns `Record`\<`string`, `any`\> #### Inherited from BaseModel.get\_obj\_for\_encoding #### Defined in client/v2/basemodel.ts:65 ___ ### from\_obj\_for\_encoding ▸ `Static` **from_obj_for_encoding**(`data`): [`TransactionApplication`](indexerModels.TransactionApplication.md) #### Parameters | Name | Type | | :------ | :------ | | `data` | `Record`\<`string`, `any`\> | #### Returns [`TransactionApplication`](indexerModels.TransactionApplication.md) #### Defined in client/v2/indexer/models/types.ts:4823 ``` -------------------------------------------------------------------------------- /packages/server/src/resources/knowledge/taxonomy/algokit:utils:typescript:code:interfaces:types_transfer.AlgoTransferParams.md: -------------------------------------------------------------------------------- ```markdown [@algorandfoundation/algokit-utils](../README.md) / [types/transfer](../modules/types_transfer.md) / AlgoTransferParams # Interface: AlgoTransferParams [types/transfer](../modules/types_transfer.md).AlgoTransferParams **`Deprecated`** Parameters for `transferAlgos` call. ## Hierarchy - [`SendTransactionParams`](types_transaction.SendTransactionParams.md) ↳ **`AlgoTransferParams`** ## Table of contents ### Properties - [amount](types_transfer.AlgoTransferParams.md#amount) - [atc](types_transfer.AlgoTransferParams.md#atc) - [fee](types_transfer.AlgoTransferParams.md#fee) - [from](types_transfer.AlgoTransferParams.md#from) - [lease](types_transfer.AlgoTransferParams.md#lease) - [maxFee](types_transfer.AlgoTransferParams.md#maxfee) - [maxRoundsToWaitForConfirmation](types_transfer.AlgoTransferParams.md#maxroundstowaitforconfirmation) - [note](types_transfer.AlgoTransferParams.md#note) - [populateAppCallResources](types_transfer.AlgoTransferParams.md#populateappcallresources) - [skipSending](types_transfer.AlgoTransferParams.md#skipsending) - [skipWaiting](types_transfer.AlgoTransferParams.md#skipwaiting) - [suppressLog](types_transfer.AlgoTransferParams.md#suppresslog) - [to](types_transfer.AlgoTransferParams.md#to) - [transactionParams](types_transfer.AlgoTransferParams.md#transactionparams) ## Properties ### amount • **amount**: [`AlgoAmount`](../classes/types_amount.AlgoAmount.md) The amount to send #### Defined in [src/types/transfer.ts:14](https://github.com/algorandfoundation/algokit-utils-ts/blob/main/src/types/transfer.ts#L14) ___ ### atc • `Optional` **atc**: `AtomicTransactionComposer` An optional `AtomicTransactionComposer` to add the transaction to, if specified then `skipSending: undefined` has the same effect as `skipSending: true` #### Inherited from [SendTransactionParams](types_transaction.SendTransactionParams.md).[atc](types_transaction.SendTransactionParams.md#atc) #### Defined in [src/types/transaction.ts:36](https://github.com/algorandfoundation/algokit-utils-ts/blob/main/src/types/transaction.ts#L36) ___ ### fee • `Optional` **fee**: [`AlgoAmount`](../classes/types_amount.AlgoAmount.md) The flat fee you want to pay, useful for covering extra fees in a transaction group or app call #### Inherited from [SendTransactionParams](types_transaction.SendTransactionParams.md).[fee](types_transaction.SendTransactionParams.md#fee) #### Defined in [src/types/transaction.ts:40](https://github.com/algorandfoundation/algokit-utils-ts/blob/main/src/types/transaction.ts#L40) ___ ### from • **from**: [`SendTransactionFrom`](../modules/types_transaction.md#sendtransactionfrom) The account that will send the Algo #### Defined in [src/types/transfer.ts:10](https://github.com/algorandfoundation/algokit-utils-ts/blob/main/src/types/transfer.ts#L10) ___ ### lease • `Optional` **lease**: `string` \| `Uint8Array` An (optional) [transaction lease](https://developer.algorand.org/articles/leased-transactions-securing-advanced-smart-contract-design/) to apply #### Defined in [src/types/transfer.ts:20](https://github.com/algorandfoundation/algokit-utils-ts/blob/main/src/types/transfer.ts#L20) ___ ### maxFee • `Optional` **maxFee**: [`AlgoAmount`](../classes/types_amount.AlgoAmount.md) The maximum fee that you are happy to pay (default: unbounded) - if this is set it's possible the transaction could get rejected during network congestion #### Inherited from [SendTransactionParams](types_transaction.SendTransactionParams.md).[maxFee](types_transaction.SendTransactionParams.md#maxfee) #### Defined in [src/types/transaction.ts:42](https://github.com/algorandfoundation/algokit-utils-ts/blob/main/src/types/transaction.ts#L42) ___ ### maxRoundsToWaitForConfirmation • `Optional` **maxRoundsToWaitForConfirmation**: `number` The maximum number of rounds to wait for confirmation, only applies if `skipWaiting` is `undefined` or `false`, default: wait up to 5 rounds #### Inherited from [SendTransactionParams](types_transaction.SendTransactionParams.md).[maxRoundsToWaitForConfirmation](types_transaction.SendTransactionParams.md#maxroundstowaitforconfirmation) #### Defined in [src/types/transaction.ts:44](https://github.com/algorandfoundation/algokit-utils-ts/blob/main/src/types/transaction.ts#L44) ___ ### note • `Optional` **note**: [`TransactionNote`](../modules/types_transaction.md#transactionnote) The (optional) transaction note #### Defined in [src/types/transfer.ts:18](https://github.com/algorandfoundation/algokit-utils-ts/blob/main/src/types/transfer.ts#L18) ___ ### populateAppCallResources • `Optional` **populateAppCallResources**: `boolean` Whether to use simulate to automatically populate app call resources in the txn objects. Defaults to true when there are app calls in the group. #### Inherited from [SendTransactionParams](types_transaction.SendTransactionParams.md).[populateAppCallResources](types_transaction.SendTransactionParams.md#populateappcallresources) #### Defined in [src/types/transaction.ts:46](https://github.com/algorandfoundation/algokit-utils-ts/blob/main/src/types/transaction.ts#L46) ___ ### skipSending • `Optional` **skipSending**: `boolean` Whether to skip signing and sending the transaction to the chain (default: transaction signed and sent to chain, unless `atc` specified) and instead just return the raw transaction, e.g. so you can add it to a group of transactions #### Inherited from [SendTransactionParams](types_transaction.SendTransactionParams.md).[skipSending](types_transaction.SendTransactionParams.md#skipsending) #### Defined in [src/types/transaction.ts:32](https://github.com/algorandfoundation/algokit-utils-ts/blob/main/src/types/transaction.ts#L32) ___ ### skipWaiting • `Optional` **skipWaiting**: `boolean` Whether to skip waiting for the submitted transaction (only relevant if `skipSending` is `false` or unset) #### Inherited from [SendTransactionParams](types_transaction.SendTransactionParams.md).[skipWaiting](types_transaction.SendTransactionParams.md#skipwaiting) #### Defined in [src/types/transaction.ts:34](https://github.com/algorandfoundation/algokit-utils-ts/blob/main/src/types/transaction.ts#L34) ___ ### suppressLog • `Optional` **suppressLog**: `boolean` Whether to suppress log messages from transaction send, default: do not suppress #### Inherited from [SendTransactionParams](types_transaction.SendTransactionParams.md).[suppressLog](types_transaction.SendTransactionParams.md#suppresslog) #### Defined in [src/types/transaction.ts:38](https://github.com/algorandfoundation/algokit-utils-ts/blob/main/src/types/transaction.ts#L38) ___ ### to • **to**: `string` \| [`SendTransactionFrom`](../modules/types_transaction.md#sendtransactionfrom) The account / account address that will receive the Algo #### Defined in [src/types/transfer.ts:12](https://github.com/algorandfoundation/algokit-utils-ts/blob/main/src/types/transfer.ts#L12) ___ ### transactionParams • `Optional` **transactionParams**: `SuggestedParams` Optional transaction parameters #### Defined in [src/types/transfer.ts:16](https://github.com/algorandfoundation/algokit-utils-ts/blob/main/src/types/transfer.ts#L16) ``` -------------------------------------------------------------------------------- /packages/server/src/resources/knowledge/taxonomy/SDKs:javascript:classes:modelsv2.PendingTransactionResponse.md: -------------------------------------------------------------------------------- ```markdown [algosdk](../README.md) / [Exports](../modules.md) / [modelsv2](../modules/modelsv2.md) / PendingTransactionResponse # Class: PendingTransactionResponse [modelsv2](../modules/modelsv2.md).PendingTransactionResponse Details about a pending transaction. If the transaction was recently confirmed, includes confirmation details like the round and reward details. ## Hierarchy - `default` ↳ **`PendingTransactionResponse`** ## Table of contents ### Constructors - [constructor](modelsv2.PendingTransactionResponse.md#constructor) ### Properties - [applicationIndex](modelsv2.PendingTransactionResponse.md#applicationindex) - [assetClosingAmount](modelsv2.PendingTransactionResponse.md#assetclosingamount) - [assetIndex](modelsv2.PendingTransactionResponse.md#assetindex) - [attribute\_map](modelsv2.PendingTransactionResponse.md#attribute_map) - [closeRewards](modelsv2.PendingTransactionResponse.md#closerewards) - [closingAmount](modelsv2.PendingTransactionResponse.md#closingamount) - [confirmedRound](modelsv2.PendingTransactionResponse.md#confirmedround) - [globalStateDelta](modelsv2.PendingTransactionResponse.md#globalstatedelta) - [innerTxns](modelsv2.PendingTransactionResponse.md#innertxns) - [localStateDelta](modelsv2.PendingTransactionResponse.md#localstatedelta) - [logs](modelsv2.PendingTransactionResponse.md#logs) - [poolError](modelsv2.PendingTransactionResponse.md#poolerror) - [receiverRewards](modelsv2.PendingTransactionResponse.md#receiverrewards) - [senderRewards](modelsv2.PendingTransactionResponse.md#senderrewards) - [txn](modelsv2.PendingTransactionResponse.md#txn) ### Methods - [get\_obj\_for\_encoding](modelsv2.PendingTransactionResponse.md#get_obj_for_encoding) - [from\_obj\_for\_encoding](modelsv2.PendingTransactionResponse.md#from_obj_for_encoding) ## Constructors ### constructor • **new PendingTransactionResponse**(`«destructured»`) Creates a new `PendingTransactionResponse` object. #### Parameters | Name | Type | | :------ | :------ | | `«destructured»` | `Object` | | › `applicationIndex?` | `number` \| `bigint` | | › `assetClosingAmount?` | `number` \| `bigint` | | › `assetIndex?` | `number` \| `bigint` | | › `closeRewards?` | `number` \| `bigint` | | › `closingAmount?` | `number` \| `bigint` | | › `confirmedRound?` | `number` \| `bigint` | | › `globalStateDelta?` | [`EvalDeltaKeyValue`](modelsv2.EvalDeltaKeyValue.md)[] | | › `innerTxns?` | [`PendingTransactionResponse`](modelsv2.PendingTransactionResponse.md)[] | | › `localStateDelta?` | [`AccountStateDelta`](modelsv2.AccountStateDelta.md)[] | | › `logs?` | `Uint8Array`[] | | › `poolError` | `string` | | › `receiverRewards?` | `number` \| `bigint` | | › `senderRewards?` | `number` \| `bigint` | | › `txn` | [`EncodedSignedTransaction`](../interfaces/EncodedSignedTransaction.md) | #### Overrides BaseModel.constructor #### Defined in client/v2/algod/models/types.ts:3948 ## Properties ### applicationIndex • `Optional` **applicationIndex**: `number` \| `bigint` The application index if the transaction was found and it created an application. #### Defined in client/v2/algod/models/types.ts:3867 ___ ### assetClosingAmount • `Optional` **assetClosingAmount**: `number` \| `bigint` The number of the asset's unit that were transferred to the close-to address. #### Defined in client/v2/algod/models/types.ts:3872 ___ ### assetIndex • `Optional` **assetIndex**: `number` \| `bigint` The asset index if the transaction was found and it created an asset. #### Defined in client/v2/algod/models/types.ts:3877 ___ ### attribute\_map • **attribute\_map**: `Record`\<`string`, `string`\> #### Inherited from BaseModel.attribute\_map #### Defined in client/v2/basemodel.ts:56 ___ ### closeRewards • `Optional` **closeRewards**: `number` \| `bigint` Rewards in microalgos applied to the close remainder to account. #### Defined in client/v2/algod/models/types.ts:3882 ___ ### closingAmount • `Optional` **closingAmount**: `number` \| `bigint` Closing amount for the transaction. #### Defined in client/v2/algod/models/types.ts:3887 ___ ### confirmedRound • `Optional` **confirmedRound**: `number` \| `bigint` The round where this transaction was confirmed, if present. #### Defined in client/v2/algod/models/types.ts:3892 ___ ### globalStateDelta • `Optional` **globalStateDelta**: [`EvalDeltaKeyValue`](modelsv2.EvalDeltaKeyValue.md)[] Global state key/value changes for the application being executed by this transaction. #### Defined in client/v2/algod/models/types.ts:3898 ___ ### innerTxns • `Optional` **innerTxns**: [`PendingTransactionResponse`](modelsv2.PendingTransactionResponse.md)[] Inner transactions produced by application execution. #### Defined in client/v2/algod/models/types.ts:3903 ___ ### localStateDelta • `Optional` **localStateDelta**: [`AccountStateDelta`](modelsv2.AccountStateDelta.md)[] Local state key/value changes for the application being executed by this transaction. #### Defined in client/v2/algod/models/types.ts:3909 ___ ### logs • `Optional` **logs**: `Uint8Array`[] Logs for the application being executed by this transaction. #### Defined in client/v2/algod/models/types.ts:3914 ___ ### poolError • **poolError**: `string` Indicates that the transaction was kicked out of this node's transaction pool (and specifies why that happened). An empty string indicates the transaction wasn't kicked out of this node's txpool due to an error. #### Defined in client/v2/algod/models/types.ts:3856 ___ ### receiverRewards • `Optional` **receiverRewards**: `number` \| `bigint` Rewards in microalgos applied to the receiver account. #### Defined in client/v2/algod/models/types.ts:3919 ___ ### senderRewards • `Optional` **senderRewards**: `number` \| `bigint` Rewards in microalgos applied to the sender account. #### Defined in client/v2/algod/models/types.ts:3924 ___ ### txn • **txn**: [`EncodedSignedTransaction`](../interfaces/EncodedSignedTransaction.md) The raw signed transaction. #### Defined in client/v2/algod/models/types.ts:3861 ## Methods ### get\_obj\_for\_encoding ▸ **get_obj_for_encoding**(`binary?`): `Record`\<`string`, `any`\> Get an object ready for encoding to either JSON or msgpack. #### Parameters | Name | Type | Default value | Description | | :------ | :------ | :------ | :------ | | `binary` | `boolean` | `false` | Use true to indicate that the encoding can handle raw binary objects (Uint8Arrays). Use false to indicate that raw binary objects should be converted to base64 strings. True should be used for objects that will be encoded with msgpack, and false should be used for objects that will be encoded with JSON. | #### Returns `Record`\<`string`, `any`\> #### Inherited from BaseModel.get\_obj\_for\_encoding #### Defined in client/v2/basemodel.ts:65 ___ ### from\_obj\_for\_encoding ▸ `Static` **from_obj_for_encoding**(`data`): [`PendingTransactionResponse`](modelsv2.PendingTransactionResponse.md) #### Parameters | Name | Type | | :------ | :------ | | `data` | `Record`\<`string`, `any`\> | #### Returns [`PendingTransactionResponse`](modelsv2.PendingTransactionResponse.md) #### Defined in client/v2/algod/models/types.ts:4014 ``` -------------------------------------------------------------------------------- /packages/server/src/resources/wallet/index.ts: -------------------------------------------------------------------------------- ```typescript import { env } from '../../env.js'; import { McpError, ErrorCode } from '@modelcontextprotocol/sdk/types.js'; import algosdk from 'algosdk'; // Get account from mnemonic const getAccountFromMnemonic = () => { if (!env.algorand_agent_wallet) { throw new McpError( ErrorCode.InvalidRequest, 'No active wallet mnemonic configured' ); } return algosdk.mnemonicToSecretKey(env.algorand_agent_wallet); }; // Resource definitions const resourceDefinitions = [ { uri: 'algorand://wallet/secretkey', name: 'Wallet Secret Key', description: 'Secret key of the wallet in hex format', schema: { type: 'object', properties: { secretKey: { type: 'string' } } } }, { uri: 'algorand://wallet/publickey', name: 'Wallet Public Key', description: 'Public key of the wallet in hex format', schema: { type: 'object', properties: { publicKey: { type: 'string' } } } }, { uri: 'algorand://wallet/mnemonic', name: 'Wallet Mnemonic', description: 'Mnemonic phrase of the wallet', schema: { type: 'object', properties: { mnemonic: { type: 'string' } } } }, { uri: 'algorand://wallet/address', name: 'Wallet Address', description: 'Algorand address of the wallet', schema: { type: 'object', properties: { address: { type: 'string' } } } }, { uri: 'algorand://wallet/account', name: 'Wallet Account', description: 'Algorand account balance and asset holdings', schema: { type: 'object', properties: { accounts: { type: 'array', items: { type: 'object', properties: { address: { type: 'string' }, amount: { type: 'number' }, assets: { type: 'array' } } } } } } }, { uri: 'algorand://wallet/assets', name: 'Wallet Account Assets', description: 'Asset holdings for Wallet account', schema: { type: 'object', properties: { assets: { type: 'array', items: { type: 'object', properties: { id: { type: 'number' }, amount: { type: 'number' }, frozen: { type: 'boolean' } } } } } } } ]; // Resource module implementation export const walletResources = { canHandle: (uri: string): boolean => { return uri.startsWith('algorand://wallet/'); }, handle: async (uri: string) => { if (!env.algorand_agent_wallet) { throw new McpError( ErrorCode.InvalidRequest, 'Wallet resources are not available - no active wallet configured' ); } switch (uri) { case 'algorand://wallet/account': try { const account = getAccountFromMnemonic(); // Get account info from algod const algodClient = new algosdk.Algodv2( env.algorand_token, env.algorand_algod, env.algorand_algod_port ); const accountInfo = await algodClient.accountInformation(account.addr).do(); return { contents: [{ uri, mimeType: 'application/json', text: JSON.stringify({ accounts: [{ address: account.addr, amount: accountInfo.amount, assets: accountInfo.assets || [] }] }, null, 2) }] }; } catch (error) { throw new McpError( ErrorCode.InternalError, `Failed to get account info: ${error instanceof Error ? error.message : String(error)}` ); } case 'algorand://wallet/assets': try { const account = getAccountFromMnemonic(); // Get account info from algod const algodClient = new algosdk.Algodv2( env.algorand_token, env.algorand_algod, env.algorand_algod_port ); const accountInfo = await algodClient.accountInformation(account.addr).do(); return { contents: [{ uri, mimeType: 'application/json', text: JSON.stringify({ assets: accountInfo.assets || [] }, null, 2) }] }; } catch (error) { throw new McpError( ErrorCode.InternalError, `Failed to get asset info: ${error instanceof Error ? error.message : String(error)}` ); } case 'algorand://wallet/secretkey': try { const account = getAccountFromMnemonic(); return { contents: [{ uri, mimeType: 'application/json', text: JSON.stringify({ secretKey: Buffer.from(account.sk).toString('hex') }, null, 2) }] }; } catch (error) { throw new McpError( ErrorCode.InternalError, `Failed to get secret key: ${error instanceof Error ? error.message : String(error)}` ); } case 'algorand://wallet/publickey': try { const account = getAccountFromMnemonic(); return { contents: [{ uri, mimeType: 'application/json', text: JSON.stringify({ publicKey: Buffer.from(account.sk.slice(32)).toString('hex') }, null, 2) }] }; } catch (error) { throw new McpError( ErrorCode.InternalError, `Failed to get public key: ${error instanceof Error ? error.message : String(error)}` ); } case 'algorand://wallet/mnemonic': try { return { contents: [{ uri, mimeType: 'application/json', text: JSON.stringify({ mnemonic: env.algorand_agent_wallet }, null, 2) }] }; } catch (error) { throw new McpError( ErrorCode.InternalError, `Failed to get mnemonic: ${error instanceof Error ? error.message : String(error)}` ); } case 'algorand://wallet/address': try { const account = getAccountFromMnemonic(); return { contents: [{ uri, mimeType: 'application/json', text: JSON.stringify({ address: account.addr }, null, 2) }] }; } catch (error) { throw new McpError( ErrorCode.InternalError, `Failed to get address: ${error instanceof Error ? error.message : String(error)}` ); } default: throw new McpError( ErrorCode.InvalidRequest, `Unknown wallet resource: ${uri}` ); } }, getResourceDefinitions: () => { if (!env.algorand_agent_wallet) { return []; } return resourceDefinitions; } }; ``` -------------------------------------------------------------------------------- /packages/server/src/index.ts: -------------------------------------------------------------------------------- ```typescript import { Server } from '@modelcontextprotocol/sdk/server/index.js'; import { StdioServerTransport } from '@modelcontextprotocol/sdk/server/stdio.js'; import { CallToolRequestSchema, ErrorCode, ListResourcesRequestSchema, ListToolsRequestSchema, McpError, ReadResourceRequestSchema, PingRequestSchema, } from '@modelcontextprotocol/sdk/types.js'; import { AccountManager, UtilityManager, TransactionManager, AlgodManager, transactionTools, apiManager, handleApiManager, arc26Manager, KnowledgeManager } from './tools/index.js'; import { ResourceManager } from './resources/index.js'; class AlgorandMcpServer { private server: Server; private name: string; constructor(name = 'algorand-mcp-server', version = '2.7.5') { this.name = name; this.server = new Server( { name, version, heartbeatInterval: 15000, // 15 seconds heartbeat interval requestTimeout: 60000, // 60 seconds request timeout }, { capabilities: { resources: { schemas: ResourceManager.schemas }, tools: { schemas: { // Account Management Tools ...AccountManager.accountTools.reduce((acc, tool) => ({ ...acc, [tool.name]: tool.inputSchema }), {}), // Utility Tools ...UtilityManager.utilityTools.reduce((acc, tool) => ({ ...acc, [tool.name]: tool.inputSchema }), {}), // Algod Tools ...AlgodManager.algodTools.reduce((acc, tool) => ({ ...acc, [tool.name]: tool.inputSchema }), {}), // Transaction Tools ...transactionTools.reduce((acc, tool) => ({ ...acc, [tool.name]: tool.inputSchema }), {}), // API Tools ...apiManager.reduce((acc, tool) => ({ ...acc, [tool.name]: tool.inputSchema }), {}), // ARC-26 Tools ...arc26Manager.arc26Tools.reduce((acc, tool) => ({ ...acc, [tool.name]: tool.inputSchema }), {}), // Knowledge Tools ...KnowledgeManager.knowledgeTools.reduce((acc, tool) => ({ ...acc, [tool.name]: tool.inputSchema }), {}) } }, }, } ); this.setupResourceHandlers(); this.setupToolHandlers(); this.setupPingHandler(); // Error handling this.server.onerror = (error) => console.error('[MCP Error]', error); process.on('SIGINT', async () => { await this.server.close(); process.exit(0); }); } private setupResourceHandlers() { // Implement resources/list method this.server.setRequestHandler(ListResourcesRequestSchema, async () => { return { resources: ResourceManager.resources.map(resource => ({ uri: resource.uri, name: resource.name, description: resource.description, mimeType: 'application/json', schema: ResourceManager.schemas[resource.uri] })) }; }); // Handle resource reads this.server.setRequestHandler(ReadResourceRequestSchema, async (request) => { if (!request.params?.uri) { throw new McpError(ErrorCode.InvalidRequest, 'URI parameter is required'); } return await ResourceManager.handleResource(request.params.uri); }); } private setupPingHandler() { // Handle ping requests this.server.setRequestHandler(PingRequestSchema, async (request) => { try { console.error('[MCP Debug] Received ping request:', request); const response = {}; console.error('[MCP Debug] Sending ping response:', response); return response; } catch (error) { console.error('[MCP Error] Ping handler error:', error); throw new McpError( ErrorCode.InternalError, `Ping failed: ${error instanceof Error ? error.message : 'Unknown error'}` ); } }); } private setupToolHandlers() { // List available tools this.server.setRequestHandler(ListToolsRequestSchema, async () => ({ tools: [ // Account Management Tools ...AccountManager.accountTools, // Utility Tools ...UtilityManager.utilityTools, // Algod Tools ...AlgodManager.algodTools, // Transaction Tools ...transactionTools, // API Tools ...apiManager, // ARC-26 Tools ...arc26Manager.arc26Tools, // Knowledge Tools ...KnowledgeManager.knowledgeTools, ], })); // Handle tool calls this.server.setRequestHandler(CallToolRequestSchema, async (request) => { const { name, arguments: args = {} } = request.params; // Handle account tools if ( name.startsWith('create_account') || name.startsWith('rekey_account') || name.startsWith('mnemonic_') || name.startsWith('mdk_') || name.startsWith('seed_') || name.startsWith('secret_key_') ) { return AccountManager.handleTool(name, args); } // Handle utility tools if ( name === 'ping' || name.startsWith('validate_address') || name.startsWith('encode_address') || name.startsWith('decode_address') || name.startsWith('get_application_address') || name.startsWith('bytes_to_bigint') || name.startsWith('bigint_to_bytes') || name.startsWith('encode_uint64') || name.startsWith('decode_uint64') || name.startsWith('verify_bytes') || name.startsWith('sign_bytes') || name.startsWith('encode_obj') || name.startsWith('decode_obj') ) { return UtilityManager.handleTool(name, args); } // Handle algod tools if ( name.startsWith('compile_') || name.startsWith('disassemble_') || name.startsWith('send_raw_') || name.startsWith('simulate_') ) { return AlgodManager.handleTool(name, args); } // Handle transaction tools if ( name.startsWith('make_') || name === 'assign_group_id' || name === 'sign_transaction' ) { return TransactionManager.handleTool(name, args); } // Handle API tools if (name.startsWith('api_')) { return handleApiManager(name, args); } // Handle ARC-26 tools if (name === 'generate_algorand_uri') { return arc26Manager.handleTool(name, args); } // Handle knowledge tools if (name.startsWith('get_knowledge_')) { return KnowledgeManager.handleTool(name, args); } throw new McpError(ErrorCode.MethodNotFound, `Unknown tool: ${name}`); }); } async run() { const transport = new StdioServerTransport(); await this.server.connect(transport); console.error(`${this.name} running on stdio`); } } const server = new AlgorandMcpServer(); server.run().catch(console.error); ``` -------------------------------------------------------------------------------- /packages/server/src/tools/apiManager/algod/transaction.ts: -------------------------------------------------------------------------------- ```typescript import { ErrorCode, McpError } from '@modelcontextprotocol/sdk/types.js'; import { algodClient } from '../../../algorand-client.js'; import type { PendingTransactionResponse, NodeStatusResponse, PendingTransactionsResponse } from 'algosdk/dist/types/client/v2/algod/models/types'; import type { SuggestedParamsWithMinFee } from 'algosdk/dist/types/types/transactions/base'; export const transactionTools = [ { name: 'api_algod_get_pending_transaction', description: 'Get pending transaction information', inputSchema: { type: 'object', properties: { txId: { type: 'string', description: 'Transaction ID' } }, required: ['txId'] } }, { name: 'api_algod_get_pending_transactions_by_address', description: 'Get pending transactions for an address', inputSchema: { type: 'object', properties: { address: { type: 'string', description: 'Account address' } }, required: ['address'] } }, { name: 'api_algod_get_pending_transactions', description: 'Get all pending transactions', inputSchema: { type: 'object', properties: { maxTxns: { type: 'integer', description: 'Maximum number of transactions to return' } } } }, { name: 'api_algod_get_transaction_params', description: 'Get suggested transaction parameters', inputSchema: { type: 'object', properties: {} } }, { name: 'api_algod_get_node_status', description: 'Get current node status', inputSchema: { type: 'object', properties: {} } }, { name: 'api_algod_get_node_status_after_block', description: 'Get node status after a specific round', inputSchema: { type: 'object', properties: { round: { type: 'integer', description: 'Round number' } }, required: ['round'] } } ]; export async function getPendingTransaction(txId: string): Promise<PendingTransactionResponse> { try { console.log(`Fetching pending transaction info for ID ${txId}`); const response = await algodClient.pendingTransactionInformation(txId).do() as PendingTransactionResponse; console.log('Pending transaction response:', JSON.stringify(response, null, 2)); return response; } catch (error) { console.error('Pending transaction fetch error:', error); if (error instanceof McpError) { throw error; } throw new McpError( ErrorCode.InternalError, `Failed to get pending transaction: ${error instanceof Error ? error.message : String(error)}` ); } } export async function getPendingTransactionsByAddress(address: string): Promise<PendingTransactionsResponse> { try { console.log(`Fetching pending transactions for address ${address}`); const response = await algodClient.pendingTransactionByAddress(address).do() as PendingTransactionsResponse; console.log('Pending transactions response:', JSON.stringify(response, null, 2)); return response; } catch (error) { console.error('Pending transactions fetch error:', error); if (error instanceof McpError) { throw error; } throw new McpError( ErrorCode.InternalError, `Failed to get pending transactions by address: ${error instanceof Error ? error.message : String(error)}` ); } } export async function getPendingTransactions(maxTxns?: number): Promise<PendingTransactionsResponse> { try { console.log('Fetching all pending transactions'); let search = algodClient.pendingTransactionsInformation(); if (maxTxns !== undefined) { search = search.max(maxTxns); } const response = await search.do() as PendingTransactionsResponse; console.log('Pending transactions response:', JSON.stringify(response, null, 2)); return response; } catch (error) { console.error('Pending transactions fetch error:', error); if (error instanceof McpError) { throw error; } throw new McpError( ErrorCode.InternalError, `Failed to get pending transactions: ${error instanceof Error ? error.message : String(error)}` ); } } export async function getTransactionParams(): Promise<SuggestedParamsWithMinFee> { try { console.log('Fetching transaction parameters'); const response = await algodClient.getTransactionParams().do(); console.log('Transaction parameters response:', JSON.stringify(response, null, 2)); return response; } catch (error) { console.error('Transaction parameters fetch error:', error); if (error instanceof McpError) { throw error; } throw new McpError( ErrorCode.InternalError, `Failed to get transaction params: ${error instanceof Error ? error.message : String(error)}` ); } } export async function getNodeStatus(): Promise<NodeStatusResponse> { try { console.log('Fetching node status'); const response = await algodClient.status().do() as NodeStatusResponse; console.log('Node status response:', JSON.stringify(response, null, 2)); return response; } catch (error) { console.error('Node status fetch error:', error); if (error instanceof McpError) { throw error; } throw new McpError( ErrorCode.InternalError, `Failed to get status: ${error instanceof Error ? error.message : String(error)}` ); } } export async function getNodeStatusAfterBlock(round: number): Promise<NodeStatusResponse> { try { console.log(`Fetching node status after round ${round}`); const response = await algodClient.statusAfterBlock(round).do() as NodeStatusResponse; console.log('Node status response:', JSON.stringify(response, null, 2)); return response; } catch (error) { console.error('Node status fetch error:', error); if (error instanceof McpError) { throw error; } throw new McpError( ErrorCode.InternalError, `Failed to get status after block: ${error instanceof Error ? error.message : String(error)}` ); } } export async function handleTransactionTools(name: string, args: any): Promise<any> { switch (name) { case 'api_algod_get_pending_transaction': { const { txId } = args; const info = await getPendingTransaction(txId); return info; } case 'api_algod_get_pending_transactions_by_address': { const { address } = args; const info = await getPendingTransactionsByAddress(address); return info; } case 'api_algod_get_pending_transactions': { const { maxTxns } = args; const info = await getPendingTransactions(maxTxns); return info; } case 'api_algod_get_transaction_params': { const params = await getTransactionParams(); return params; } case 'api_algod_get_node_status': { const nodeStatus = await getNodeStatus(); return nodeStatus; } case 'api_algod_get_node_status_after_block': { const { round } = args; const nodeStatus = await getNodeStatusAfterBlock(round); return nodeStatus; } default: throw new McpError( ErrorCode.MethodNotFound, `Unknown tool: ${name}` ); } } ```