This is page 18 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/ARCs:specs:arc-0074.md: -------------------------------------------------------------------------------- ```markdown --- arc: 74 title: NFT Indexer API description: REST API for reading data about Application's NFTs. author: William G Hatch (@willghatch) discussions-to: https://github.com/algorandfoundation/ARCs/issues/170 status: Final type: Standards Track category: Interface sub-category: Application created: 2023-02-17 requires: 72 --- ## Abstract This specifies a REST interface that can be implemented by indexing services to provide data about NFTs conforming to the [ARC-72](arc-0072.md) standard. ## Motivation While most data is available on-chain, reading and analyzing on-chain logs to get a complete and current picture about NFT ownership and history is slow and impractical for many uses. This REST interface standard allows analysis of NFT contracts to be done in a centralized manner to provide fast, up-to-date responses to queries, while allowing users to pick from any indexing provider. ## Specification This specification defines two REST endpoints: `/nft-index/v1/tokens` and `/nft-index/v1/transfers`. Both endpoints respond only to `GET` requests, take no path parameters, and consume no input. But both accept a variety of query parameters. ### `GET /nft-indexer/v1/tokens` Produces `application/json`. Optional Query Parameters: | Name | Schema | Description | | --- | --- | --- | | round | integer | Include results for the specified round. For performance reasons, this parameter may be disabled on some configurations. | | next | string | Token for the next page of results. Use the `next-token` provided by the previous page of results. | | limit | integer | Maximum number of results to return. There could be additional pages even if the limit is not reached. | | contractId | integer | Limit results to NFTs implemented by the given contract ID. | | tokenId | integer | Limit results to NFTs with the given token ID. | | owner | address | Limit results to NFTs owned by the given owner. | | mint-min-round | integer | Limit results to NFTs minted on or after the given round. | | mint-max-round | integer | Limit results to NFTs minted on or before the given round. | When successful, returns a response with code 200 and an object with the schema: | Name | Required? | Schema | Description | | --- | --- | --- | --- | | tokens | required | <Token> array | Array of Token objects that fit the query parameters, as defined below. | | current-round | required | integer | Round at which the results were computed. | | next-token | optional | string | Used for pagination, when making another request provide this token as the `next` parameter. | The `Token` object has the following schema: | Name | Required? | Schema | Description | | --- | --- | --- | --- | | owner | required | address | The current owner of the NFT. | | contractId | required | integer | The ID of the ARC-72 contract that defines the NFT. | | tokenId | required | integer | The tokenID of the NFT, which along with the contractId addresses a unique ARC-72 token. | | mint-round | optional | integer | The round at which the NFT was minted (IE the round at which it was transferred from the zero address to the first owner). | | metadataURI | optional | string | The URI given for the token by the `metadataURI` API of the contract, if applicable. | | metadata | optional | object | The result of resolving the `metadataURI`, if applicable and available. | When unsuccessful, returns a response with code 400 or 500 and an object with the schema: | Name | Required? | Schema | | --- | --- | --- | | data | optional | object | | message | required | string | ### `GET /nft-indexer/v1/transfers` Produces `application/json`. Optional Query Parameters: | Name | Schema | Description | | --- | --- | --- | | round | integer | Include results for the specified round. For performance reasons, this parameter may be disabled on some configurations. | | next | string | Token for the next page of results. Use the `next-token` provided by the previous page of results. | | limit | integer | Maximum number of results to return. There could be additional pages even if the limit is not reached. | | contractId | integer | Limit results to NFTs implemented by the given contract ID. | | tokenId | integer | Limit results to NFTs with the given token ID. | | user | address | Limit results to transfers where the user is either the sender or receiver. | | from | address | Limit results to transfers with the given address as the sender. | | to | address | Limit results to transfers with the given address as the receiver. | | min-round | integer | Limit results to transfers that were executed on or after the given round. | | max-round | integer | Limit results to transfers that were executed on or before the given round. | When successful, returns a response with code 200 and an object with the schema: | Name | Required? | Schema | Description | | --- | --- | --- | --- | | transfers | required | <Transfer> array | Array of Transfer objects that fit the query parameters, as defined below. | | current-round | required | integer | Round at which the results were computed. | | next-token | optional | string | Used for pagination, when making another request provide this token as the `next` parameter. | The `Transfer` object has the following schema: | Name | Required? | Schema | Description | | --- | --- | --- | --- | | contractId | required | integer | The ID of the ARC-72 contract that defines the NFT. | | tokenId | required | integer | The tokenID of the NFT, which along with the contractId addresses a unique ARC-72 token. | | from | required | address | The sender of the transaction. | | to | required | address | The receiver of the transaction. | | round | required | integer | The round of the transfer. | When unsuccessful, returns a response with code 400 or 500 and an object with the schema: | Name | Required? | Schema | | --- | --- | --- | | data | optional | object | | message | required | string | ## Rationale This standard was designed to feel similar to the Algorand indexer API, and uses the same query parameters and results where applicable. ## Backwards Compatibility This standard presents a versioned REST interface, allowing future extensions to change the interface in incompatible ways while allowing for the old service to run in tandem. ## Security Considerations All data available through this indexer API is publicly available. ## Copyright Copyright and related rights waived via <a href="https://creativecommons.org/publicdomain/zero/1.0/">CCO</a>. ``` -------------------------------------------------------------------------------- /packages/server/src/resources/knowledge/taxonomy/algokit:utils:python:markdown:index.md: -------------------------------------------------------------------------------- ```markdown # AlgoKit Python Utilities A set of core Algorand utilities written in Python and released via PyPi that make it easier to build solutions on Algorand. This project is part of [AlgoKit](https://github.com/algorandfoundation/algokit-cli). The goal of this library is to provide intuitive, productive utility functions that make it easier, quicker and safer to build applications on Algorand. Largely these functions wrap the underlying Algorand SDK, but provide a higher level interface with sensible defaults and capabilities for common tasks. #### NOTE If you prefer TypeScript there’s an equivalent [TypeScript utility library](https://github.com/algorandfoundation/algokit-utils-ts). [Core principles]() | [Installation]() | [Usage]() | [Capabilities]() | [Reference docs]() # Contents * [Account management](capabilities/account.md) * [`Account`](capabilities/account.md#account) * [Client management](capabilities/client.md) * [Network configuration](capabilities/client.md#network-configuration) * [Clients](capabilities/client.md#clients) * [App client](capabilities/app-client.md) * [Design](capabilities/app-client.md#design) * [Creating an application client](capabilities/app-client.md#creating-an-application-client) * [Calling methods on the app](capabilities/app-client.md#calling-methods-on-the-app) * [Composing calls](capabilities/app-client.md#composing-calls) * [Reading state](capabilities/app-client.md#reading-state) * [Handling logic errors and diagnosing errors](capabilities/app-client.md#handling-logic-errors-and-diagnosing-errors) * [App deployment](capabilities/app-deploy.md) * [Design](capabilities/app-deploy.md#design) * [Finding apps by creator](capabilities/app-deploy.md#finding-apps-by-creator) * [Deploying an application](capabilities/app-deploy.md#deploying-an-application) * [Algo transfers](capabilities/transfer.md) * [Transferring Algos](capabilities/transfer.md#transferring-algos) * [Ensuring minimum Algos](capabilities/transfer.md#ensuring-minimum-algos) * [Transfering Assets](capabilities/transfer.md#transfering-assets) * [Dispenser](capabilities/transfer.md#dispenser) * [TestNet Dispenser Client](capabilities/dispenser-client.md) * [Creating a Dispenser Client](capabilities/dispenser-client.md#creating-a-dispenser-client) * [Funding an Account](capabilities/dispenser-client.md#funding-an-account) * [Registering a Refund](capabilities/dispenser-client.md#registering-a-refund) * [Getting Current Limit](capabilities/dispenser-client.md#getting-current-limit) * [Error Handling](capabilities/dispenser-client.md#error-handling) * [Debugger](capabilities/debugger.md) * [Configuration](capabilities/debugger.md#configuration) * [Debugging Utilities](capabilities/debugger.md#debugging-utilities) * [`algokit_utils`](apidocs/algokit_utils/algokit_utils.md) * [Data](apidocs/algokit_utils/algokit_utils.md#data) * [Classes](apidocs/algokit_utils/algokit_utils.md#classes) * [Functions](apidocs/algokit_utils/algokit_utils.md#functions) <a id="core-principles"></a> # Core principles This library is designed with the following principles: - **Modularity** - This library is a thin wrapper of modular building blocks over the Algorand SDK; the primitives from the underlying Algorand SDK are exposed and used wherever possible so you can opt-in to which parts of this library you want to use without having to use an all or nothing approach. - **Type-safety** - This library provides strong TypeScript support with effort put into creating types that provide good type safety and intellisense. - **Productivity** - This library is built to make solution developers highly productive; it has a number of mechanisms to make common code easier and terser to write <a id="installation"></a> # Installation This library can be installed from PyPi using pip or poetry, e.g.: ```default pip install algokit-utils poetry add algokit-utils ``` <a id="usage"></a> # Usage To use this library simply include the following at the top of your file: ```python import algokit_utils ``` Then you can use intellisense to auto-complete the various functions and types that are available by typing `algokit_utils.` in your favourite Integrated Development Environment (IDE), or you can refer to the [reference documentation](apidocs/algokit_utils/algokit_utils.md). ## Types The library contains extensive type hinting combined with a tool like MyPy this can help identify issues where incorrect types have been used, or used incorrectly. <a id="capabilities"></a> # Capabilities The library helps you with the following capabilities: - Core capabilities - [**Client management**](capabilities/client.md) - Creation of algod, indexer and kmd clients against various networks resolved from environment or specified configuration - [**Account management**](capabilities/account.md) - Creation and use of accounts including mnemonic, multisig, transaction signer, idempotent KMD accounts and environment variable injected - Higher-order use cases - [**ARC-0032 Application Spec client**](capabilities/app-client.md) - Builds on top of the App management and App deployment capabilities to provide a high productivity application client that works with ARC-0032 application spec defined smart contracts (e.g. via Beaker) - [**App deployment**](capabilities/app-deploy.md) - Idempotent (safely retryable) deployment of an app, including deploy-time immutability and permanence control and TEAL template substitution - [**Algo transfers**](capabilities/transfer.md) - Ability to easily initiate algo transfers between accounts, including dispenser management and idempotent account funding - [**Debugger**](capabilities/debugger.md) - Provides a set of debugging tools that can be used to simulate and trace transactions on the Algorand blockchain. These tools and methods are optimized for developers who are building applications on Algorand and need to test and debug their smart contracts via [AVM Debugger extension](https://github.com/algorandfoundation/algokit-avm-vscode-debugger). <a id="reference-documentation"></a> # Reference documentation We have [auto-generated reference documentation for the code](apidocs/algokit_utils/algokit_utils.md). # Roadmap This library will naturally evolve with any logical developer experience improvements needed to facilitate the [AlgoKit](https://github.com/algorandfoundation/algokit-cli) roadmap as it evolves. Likely future capability additions include: - Typed application client - Asset management - Expanded indexer API wrapper support # Indices and tables - [Index](genindex.md) ``` -------------------------------------------------------------------------------- /packages/server/tests/tools/transactionManager/transactionManager.test.ts: -------------------------------------------------------------------------------- ```typescript import { McpError, ErrorCode } from '@modelcontextprotocol/sdk/types.js'; import { TransactionManager, transactionTools } from '../../../src/tools/transactionManager/index.js'; import { AccountTransactionManager } from '../../../src/tools/transactionManager/accountTransactions.js'; import { AssetTransactionManager } from '../../../src/tools/transactionManager/assetTransactions.js'; import { AppTransactionManager } from '../../../src/tools/transactionManager/appTransactions.js'; import { GeneralTransactionManager } from '../../../src/tools/transactionManager/generalTransaction.js'; // Mock all transaction managers jest.mock('../../../src/tools/transactionManager/accountTransactions.js', () => ({ AccountTransactionManager: { handleTool: jest.fn(), }, accountTransactionTools: [ { name: 'make_payment_txn' }, { name: 'make_keyreg_txn' } ] })); jest.mock('../../../src/tools/transactionManager/assetTransactions.js', () => ({ AssetTransactionManager: { handleTool: jest.fn(), }, assetTransactionTools: [ { name: 'make_asset_create_txn' }, { name: 'make_asset_config_txn' }, { name: 'make_asset_destroy_txn' }, { name: 'make_asset_freeze_txn' }, { name: 'make_asset_transfer_txn' } ] })); jest.mock('../../../src/tools/transactionManager/appTransactions.js', () => ({ AppTransactionManager: { handleTool: jest.fn(), }, appTransactionTools: [ { name: 'make_app_create_txn' }, { name: 'make_app_update_txn' }, { name: 'make_app_delete_txn' }, { name: 'make_app_optin_txn' }, { name: 'make_app_closeout_txn' }, { name: 'make_app_clear_txn' }, { name: 'make_app_call_txn' } ] })); jest.mock('../../../src/tools/transactionManager/generalTransaction.js', () => ({ GeneralTransactionManager: { handleTool: jest.fn(), }, generalTransactionTools: [ { name: 'assign_group_id' } ] })); describe('TransactionManager', () => { beforeEach(() => { jest.clearAllMocks(); }); describe('Tool Routing', () => { const mockArgs = { test: 'args' }; const mockResponse = { content: [{ type: 'text', text: 'test' }] }; beforeEach(() => { (AccountTransactionManager.handleTool as jest.Mock).mockResolvedValue(mockResponse); (AssetTransactionManager.handleTool as jest.Mock).mockResolvedValue(mockResponse); (AppTransactionManager.handleTool as jest.Mock).mockResolvedValue(mockResponse); (GeneralTransactionManager.handleTool as jest.Mock).mockResolvedValue(mockResponse); }); it('should route payment transaction tools to AccountTransactionManager', async () => { const result = await TransactionManager.handleTool('make_payment_txn', mockArgs); expect(result).toBe(mockResponse); expect(AccountTransactionManager.handleTool).toHaveBeenCalledWith('make_payment_txn', mockArgs); }); it('should route keyreg transaction tools to AccountTransactionManager', async () => { const result = await TransactionManager.handleTool('make_keyreg_txn', mockArgs); expect(result).toBe(mockResponse); expect(AccountTransactionManager.handleTool).toHaveBeenCalledWith('make_keyreg_txn', mockArgs); }); it('should route asset transaction tools to AssetTransactionManager', async () => { const result = await TransactionManager.handleTool('make_asset_create_txn', mockArgs); expect(result).toBe(mockResponse); expect(AssetTransactionManager.handleTool).toHaveBeenCalledWith('make_asset_create_txn', mockArgs); }); it('should route application transaction tools to AppTransactionManager', async () => { const result = await TransactionManager.handleTool('make_app_create_txn', mockArgs); expect(result).toBe(mockResponse); expect(AppTransactionManager.handleTool).toHaveBeenCalledWith('make_app_create_txn', mockArgs); }); it('should route general transaction tools to GeneralTransactionManager', async () => { const result = await TransactionManager.handleTool('assign_group_id', mockArgs); expect(result).toBe(mockResponse); expect(GeneralTransactionManager.handleTool).toHaveBeenCalledWith('assign_group_id', mockArgs); }); it('should throw error for unknown tool', async () => { await expect(TransactionManager.handleTool('unknown_tool', mockArgs)) .rejects .toThrow(new McpError(ErrorCode.MethodNotFound, 'Unknown transaction tool: unknown_tool')); }); }); describe('Tool Registration', () => { it('should combine all transaction tools', () => { const allTools = [ 'make_payment_txn', 'make_keyreg_txn', 'make_asset_create_txn', 'make_asset_config_txn', 'make_asset_destroy_txn', 'make_asset_freeze_txn', 'make_asset_transfer_txn', 'make_app_create_txn', 'make_app_update_txn', 'make_app_delete_txn', 'make_app_optin_txn', 'make_app_closeout_txn', 'make_app_clear_txn', 'make_app_call_txn', 'assign_group_id' ]; expect(transactionTools.map((t: { name: string }) => t.name)).toEqual(allTools); }); }); describe('Error Handling', () => { it('should propagate errors from AccountTransactionManager', async () => { const error = new McpError(ErrorCode.InvalidParams, 'Test error'); (AccountTransactionManager.handleTool as jest.Mock).mockRejectedValue(error); await expect(TransactionManager.handleTool('make_payment_txn', {})) .rejects .toThrow(error); }); it('should propagate errors from AssetTransactionManager', async () => { const error = new McpError(ErrorCode.InvalidParams, 'Test error'); (AssetTransactionManager.handleTool as jest.Mock).mockRejectedValue(error); await expect(TransactionManager.handleTool('make_asset_create_txn', {})) .rejects .toThrow(error); }); it('should propagate errors from AppTransactionManager', async () => { const error = new McpError(ErrorCode.InvalidParams, 'Test error'); (AppTransactionManager.handleTool as jest.Mock).mockRejectedValue(error); await expect(TransactionManager.handleTool('make_app_create_txn', {})) .rejects .toThrow(error); }); it('should propagate errors from GeneralTransactionManager', async () => { const error = new McpError(ErrorCode.InvalidParams, 'Test error'); (GeneralTransactionManager.handleTool as jest.Mock).mockRejectedValue(error); await expect(TransactionManager.handleTool('assign_group_id', {})) .rejects .toThrow(error); }); }); }); ``` -------------------------------------------------------------------------------- /packages/server/src/resources/knowledge/taxonomy/developer:python:code:example:inner_transactions.md: -------------------------------------------------------------------------------- ```markdown # Inner Transactions in Algorand Smart Contracts Inner transactions allow smart contracts to create and submit transactions from within the contract. This guide demonstrates various types of inner transactions in Algorand Python smart contracts. ## Payment Transactions ```python from algopy import ( Account, Application, ARC4Contract, Asset, Global, String, Txn, UInt64, arc4, itxn, ) class InnerTransactions(ARC4Contract): @abimethod() def payment(self) -> UInt64: # Send payment from contract to transaction sender result = itxn.Payment( amount=5000, receiver=Txn.sender, fee=0 # fee is 0 by default, shown here for demonstration ).submit() return result.amount ``` Note: The sender for inner transactions is implicitly `Global.current_application_address()`. ## Asset Operations ### Creating Assets ```python @abimethod def fungible_asset_create(self) -> UInt64: # Create a fungible token itxn_result = itxn.AssetConfig( total=100_000_000_000, decimals=2, unit_name="RP", asset_name="Royalty Points", ).submit() return itxn_result.created_asset.id @abimethod def non_fungible_asset_create(self) -> UInt64: # Create an NFT following ARC3 standard itxn_result = itxn.AssetConfig( total=100, decimals=2, unit_name="ML", asset_name="Mona Lisa", url="https://link_to_ipfs/Mona_Lisa", manager=Global.current_application_address, reserve=Global.current_application_address, freeze=Global.current_application_address, clawback=Global.current_application_address, ).submit() return itxn_result.created_asset.id ``` ### Asset Opt-In and Transfer ```python @abimethod def asset_opt_in(self, asset: Asset) -> None: # Opt-in to an asset itxn.AssetTransfer( asset_receiver=Global.current_application_address, xfer_asset=asset, asset_amount=0, fee=0, ).submit() @abimethod def asset_transfer(self, asset: Asset, receiver: Account, amount: UInt64) -> None: # Transfer assets itxn.AssetTransfer( asset_receiver=receiver, xfer_asset=asset, asset_amount=amount, fee=0, ).submit() ``` ### Asset Management ```python @abimethod def asset_freeze(self, acct_to_be_frozen: Account, asset: Asset) -> None: # Freeze an account's asset holdings itxn.AssetFreeze( freeze_account=acct_to_be_frozen, freeze_asset=asset, frozen=True, fee=0, ).submit() @abimethod def asset_revoke( self, asset: Asset, account_to_be_revoked: Account, amount: UInt64 ) -> None: # Revoke (clawback) assets from an account itxn.AssetTransfer( asset_receiver=Global.current_application_address, xfer_asset=asset, asset_sender=account_to_be_revoked, asset_amount=amount, fee=0, ).submit() @abimethod def asset_config(self, asset: Asset) -> None: # Reconfigure asset parameters itxn.AssetConfig( config_asset=asset, manager=Global.current_application_address, reserve=Global.current_application_address, freeze=Txn.sender, clawback=Txn.sender, fee=0, ).submit() @abimethod def asset_delete(self, asset: Asset) -> None: # Delete an asset itxn.AssetConfig( config_asset=asset, fee=0, ).submit() ``` ## Application Operations ### Grouped Inner Transactions ```python @abimethod def multi_inner_txns(self, app_id: Application) -> tuple[UInt64, arc4.String]: # Create payment transaction payment_params = itxn.Payment(amount=5000, receiver=Txn.sender, fee=0) # Create application call transaction app_call_params = itxn.ApplicationCall( app_id=app_id, app_args=(arc4.arc4_signature("hello(string)string"), arc4.String("World")), fee=0, ) # Submit both transactions atomically pay_txn, app_call_txn = itxn.submit_txns(payment_params, app_call_params) # Process results hello_world_result = arc4.String.from_log(app_call_txn.last_log) return pay_txn.amount, hello_world_result ``` ### Deploying Applications ```python @abimethod def deploy_app(self) -> UInt64: # Compile and deploy a contract compiled_contract = compile_contract(HelloWorld) app_txn = itxn.ApplicationCall( approval_program=compiled_contract.approval_program, clear_state_program=compiled_contract.clear_state_program, fee=0, ).submit() return app_txn.created_app.id @abimethod def arc4_deploy_app(self) -> UInt64: # Deploy using ARC4 app_txn = arc4.arc4_create(HelloWorld) return app_txn.created_app.id ``` ### Application Calls ```python @abimethod def noop_app_call(self, app_id: Application) -> tuple[arc4.String, String]: # Method 1: Manual ABI encoding call_txn = itxn.ApplicationCall( app_id=app_id, app_args=(arc4.arc4_signature("hello(string)string"), arc4.String("World")), ).submit() first_result = arc4.String.from_log(call_txn.last_log) # Method 2: Automatic ARC4 encoding second_result, call_txn = arc4.abi_call( HelloWorld.hello, # method signature "again", # arguments app_id=app_id, ) return first_result, second_result ``` ## Best Practices 1. **Transaction Management**: - Use appropriate fee settings - Handle transaction failures gracefully - Group related transactions when needed - Verify transaction results 2. **Asset Operations**: - Verify asset configuration before operations - Handle opt-in requirements - Manage asset permissions carefully - Validate asset amounts and balances 3. **Application Deployment**: - Use appropriate deployment method - Verify contract compilation - Handle deployment failures - Test deployed applications 4. **Security**: - Validate transaction parameters - Check permissions and authorizations - Handle edge cases and errors - Implement proper access controls 5. **Performance**: - Minimize number of inner transactions - Group transactions when possible - Consider fee implications - Optimize transaction parameters 6. **Error Handling**: - Check transaction success - Handle failed transactions - Provide meaningful error messages - Implement proper rollback mechanisms This guide demonstrates the various capabilities of inner transactions in Algorand smart contracts using Python. Understanding these concepts is crucial for developing complex smart contract interactions. ``` -------------------------------------------------------------------------------- /packages/server/src/resources/knowledge/taxonomy/ARCs:specs:arc-0028.md: -------------------------------------------------------------------------------- ```markdown --- arc: 28 title: Algorand Event Log Spec description: A methodology for structured logging by Algorand dapps. author: Dan Burton (@DanBurton) discussions-to: https://github.com/algorandfoundation/ARCs/issues/144 status: Final type: Standards Track category: ARC sub-category: Application created: 2022-07-18 requires: 4 --- # Algorand Event Log Spec ## Abstract Algorand dapps can use the <a href="https://developer.algorand.org/docs/get-details/dapps/avm/teal/opcodes/#log">`log`</a> primitive to attach information about an application call. This ARC proposes the concept of Events, which are merely a way in which data contained in these logs may be categorized and structured. In short: to emit an Event, a dapp calls `log` with ABI formatting of the log data, and a 4-byte prefix to indicate which Event it is. ## Specification Each kind of Event emitted by a given dapp has a unique 4-byte identifier. This identifier is derived from its name and the structure of its contents, like so: ### Event Signature An Event Signature is a utf8 string, comprised of: the name of the event, followed by an open paren, followed by the comma-separated names of the data types contained in the event (Types supported are the same as in [ARC-4](./arc-0004.md#types)), followed by a close paren. This follows naming conventions similar to ABI signatures, but does not include the return type. ### Deriving the 4-byte prefix from the Event Signature To derive the 4-byte prefix from the Event Signature, perform the `sha512/256` hash algorithm on the signature, and select the first 4 bytes of the result. This is the same process that is used by the [ABI Method Selector ](./arc-0004.md#method-selector) as specified in ARC-4. ### Argument Encoding The arguments to a tuple **MUST** be encoded as if they were a single [ARC-4](./arc-0004.md) tuple (opposed to concatenating the encoded values together). For example, an event signature `foo(string,string)` would contain the 4-byte prefix and a `(string,string)` encoded byteslice. ### ARC-4 Extension #### Event An event is represented as follow: ```typescript interface Event { /** The name of the event */ name: string; /** Optional, user-friendly description for the event */ desc?: string; /** The arguments of the event, in order */ args: Array<{ /** The type of the argument */ type: string; /** Optional, user-friendly name for the argument */ name?: string; /** Optional, user-friendly description for the argument */ desc?: string; }>; } ``` #### Method This ARC extends ARC-4 by adding an array events of type `Event[]` to the `Method` interface. Concretely, this give the following extended Method interface: ```typescript interface Method { /** The name of the method */ name: string; /** Optional, user-friendly description for the method */ desc?: string; /** The arguments of the method, in order */ args: Array<{ /** The type of the argument */ type: string; /** Optional, user-friendly name for the argument */ name?: string; /** Optional, user-friendly description for the argument */ desc?: string; }>; /** All of the events that the method use */ events: Event[]; /** Information about the method's return value */ returns: { /** The type of the return value, or "void" to indicate no return value. */ type: string; /** Optional, user-friendly description for the return value */ desc?: string; }; } ``` #### Contract > Even if events are already inside `Method`, the contract **MUST** provide an array of `Events` to improve readability. ```typescript interface Contract { /** A user-friendly name for the contract */ name: string; /** Optional, user-friendly description for the interface */ desc?: string; /** * Optional object listing the contract instances across different networks */ networks?: { /** * The key is the base64 genesis hash of the network, and the value contains * information about the deployed contract in the network indicated by the * key */ [network: string]: { /** The app ID of the deployed contract in this network */ appID: number; } } /** All of the methods that the contract implements */ methods: Method[]; /** All of the events that the contract contains */ events: Event[]; } ``` ## Rationale Event logging allows a dapp to convey useful information about the things it is doing. Well-designed Event logs allow observers to more easily interpret the history of interactions with the dapp. A structured approach to Event logging could also allow for indexers to more efficiently store and serve queryable data exposed by the dapp about its history. ## Reference Implementation ### Sample interpretation of Event log data An exchange dapp might emit a `Swapped` event with two `uint64` values representing quantities of currency swapped. The event signature would be: `Swapped(uint64,uint64)`. Suppose that dapp emits the following log data (seen here as base64 encoded): `HMvZJQAAAAAAAAAqAAAAAAAAAGQ=`. Suppose also that the dapp developers have declared that it follows this spec for Events, and have published the signature `Swapped(uint64,uint64)`. We can attempt to parse this log data to see if it is one of these events, as follows. (This example is written in JavaScript.) First, we can determine the expected 4-byte prefix by following the spec above: ```js > { sha512_256 } = require('js-sha512') > sig = 'Swapped(uint64,uint64)' 'Swapped(uint64,uint64)' > hash = sha512_256(sig) '1ccbd9254b9f2e1caf190c6530a8d435fc788b69954078ab937db9b5540d9567' > prefix = hash.slice(0,8) // 8 nibbles = 4 bytes '1ccbd925' ``` Next, we can inspect the data to see if it matches the expected format: 4 bytes for the prefix, 8 bytes for the first uint64, and 8 bytes for the next. ```js > b = Buffer.from('HMvZJQAAAAAAAAAqAAAAAAAAAGQ=', 'base64') <Buffer 1c cb d9 25 00 00 00 00 00 00 00 2a 00 00 00 00 00 00 00 64> > b.slice(0,4).toString('hex') '1ccbd925' > b.slice(4, 12) <Buffer 00 00 00 00 00 00 00 2a> > b.slice(12,20) <Buffer 00 00 00 00 00 00 00 64> ``` We see that the 4-byte prefix matches the signature for `Swapped(uint64,uint64)`, and that the rest of the data can be interpreted using the types declared for that signature. We interpret the above Event data to be: `Swapped(0x2a,0x64)`, meaning `Swapped(42,100)`. ## Security Considerations As specify in ARC-4, methods which have a `return` value MUST NOT emit an event after they log their `return` value. ## Copyright Copyright and related rights waived via <a href="https://creativecommons.org/publicdomain/zero/1.0/">CCO</a>. ``` -------------------------------------------------------------------------------- /packages/server/src/resources/knowledge/taxonomy/ARCs:specs:arc-0033.md: -------------------------------------------------------------------------------- ```markdown --- arc: 33 title: xGov Pilot - Becoming an xGov description: Explanation on how to become Expert Governors. author: Stéphane Barroso (@SudoWeezy), Adriana Belotti, Massimo Morini, Michel Treccani, John Woods, Shai Halevi discussions-to: https://github.com/algorandfoundation/ARCs/issues/ status: Deprecated type: Meta created: 2022-11-22 --- ## Abstract This ARC proposes a standard for achieving xGov status in the Algorand governance process. xGov status grants the right to vote on [ARC-34](./arc-0034.md) proposals raised by the community, specifically spending a previously specified amount of Algo in a given Term on particular initiatives. ## Specification The key words "**MUST**", "**MUST NOT**", "**REQUIRED**", "**SHALL**", "**SHALL NOT**", "**SHOULD**", "**SHOULD NOT**", "**RECOMMENDED**", "**MAY**", and "**OPTIONAL**" in this document are to be interpreted as described in <a href="https://www.ietf.org/rfc/rfc2119.txt">RFC-2119</a>. <table> <thead> <tr> <th colspan="2">Algorand xGovernor Summary</th> </tr> </thead> <tbody> <tr> <td>Enrolment</td> <td colspan="2">At the start of each governance period</td> </tr> <tr> <td>How to <br>become eligible</td> <td>Having completed participation in the previous governance period through official or approved decentralized finance governance.</td> </tr> <tr> <td>Requisite</td> <td colspan="2">Commit of governance reward for one year</td> </tr> <tr> <td>Duration</td> <td colspan="2">1 Year</td> </tr> <tr> <td>Voting Power</td> <td colspan="2">1 Algo committed = 1 Vote, as per REWARDS DEPOSIT</td> </tr> <tr> <td>Duty</td> <td colspan="2">Spend all available votes each time a voting period occurs. (In case there is no proposal that aligns with an xGov's preference, a mock proposal can be used as an alternative.)</td> </tr> <tr> <td rowspan="1">Disqualification</td> <td colspan="2">Forfeit rewards pledged</td> </tr> </tbody> </table> ### What is an xGov? xGovs, or Expert Governors, are a **self-selected** group of decentralized decision makers who demonstrate an enduring commitment to the Algorand community, possess a deep understanding of the blockchain’s inner workings and realities of the Algorand community, and whose interests are aligned with the good of the Algorand blockchain. These individuals have the ability to participate in the designation **and** approval of proposals, and play an instrumental role in shaping the future of the Algorand ecosystem. ### Requirement to become an xGov To become an xGov, or Expert Governor, an account: - **MUST** first be deemed eligible by having fully participated in the previous governance period, either through official or approved decentralized finance governance. - At the start of each governance period, eligible participants will have the option to enrol in the xGov program - To gain voting power as an xGov, the eligible **governor rewards for the period of the enrolment** **MUST** be committed to the xGov Term Pool and locked for a period of 12 months. > Only the GP rewards are deposited to the xGov Term Pool. The principal algo committed remains in the gov wallet (or DeFi protocol) and can be used in subsequent Governance Periods. Rewards deposited to the xGov Term Pool will be call **REWARDS DEPOSIT**. ### Voting Power Voting power in the xGov process is determined by the amount of Algo an eligible participant commits. Voting power is 1 Algo = 1 Vote, as per REWARDS DEPOSIT, and it renews at the start of every quarter - provided the xGov remain eligible. This ensures that the weight of each vote is directly proportional to the level of investment and commitment to the Algorand ecosystem. ### Duty of an xGov As an xGov, you **MUST** actively participate in the governance process by using all available votes amongst proposals each time a voting period occurs. If you don't do it, you will be disqualified. > eg. For 100 Algo as per REWARDS DEPOSIT, 100 votes available, they can be spent like this: > - 50 on proposal A > - 20 on proposal B > - 30 on proposal C > - 0 on every other proposal > In case no proposal aligns with an xGov's preference, a mock proposal can be used as an alternative. ### Disqualification As an xGov, it is important to understand the importance of your role in the governance process and the responsibilities that come with it. Failure to do so will result in disqualification. The consequences of disqualification are significant, as the xGov will lose the rewards that were committed when they entered the xGov process. It is important to take your role as an xGov seriously and fulfill your responsibilities to ensure the success of the governance process. > The rewards will remain in the xGov reward pools & will be distributed among remaining xGovs ## Rationale This proposal provides a clear and simple method for participation in xGov process, while also providing incentives for long-term commitment to the network. Separate pools for xGov and Gov allow for a more diverse range of participation, with the xGov pool providing an additional incentive for longer-term commitment. The requirement to spend 100% of your vote on proposals will ensure that participants are actively engaged in the decision-making process. After weeks of engagement with the community, it has been decided: - That the xGov process will not utilize token or NFT. - There will be no minimum or maximum amount of Algo required to participate in the xGov process - In the future, the possibility of node operation being considered as a form of participation eligibility is being explored This approach aims to make the xGov process accessible and inclusive for all members of the community. We encourage the community to continue to provide input on this topic through the submission of questions and ideas in this ARC document. > **Important**: The xGov program is still a work in progress, and changes are expected to happen over the next few years with community input and design consultation. Criteria to ENTER the program will only be applied forward, which means Term Pools already in place will not be affected by new any NEW ENTRY criteria. However, other ELIGIBILITY criteria could be added and be applied to all pools. For example, if the majority of the community deems necessary to have more than 1 voting session per quarter, this type of change could be applied to all Term pools, given ample notice and time for preparation. ## Security Considerations No funds need to leave the user's wallet in order to become an xGov. ## Copyright Copyright and related rights waived via <a href="https://creativecommons.org/publicdomain/zero/1.0/">CCO</a>. ``` -------------------------------------------------------------------------------- /packages/server/src/resources/knowledge/taxonomy/algokit:cli:features:project.md: -------------------------------------------------------------------------------- ```markdown # AlgoKit Project `algokit project` is a collection of commands and command groups useful for managing algokit compliant [project workspaces](./init.md#workspaces). ## Overview The `algokit project` command group is designed to simplify the management of AlgoKit projects. It provides a suite of tools to initialize, deploy, link, list, and run various components within a project workspace. This command group ensures that developers can efficiently handle the lifecycle of their projects, from bootstrapping to deployment and beyond. ### What is a Project? In the context of AlgoKit, a "project" refers to a structured standalone or monorepo workspace that includes all the necessary components for developing, testing, and deploying Algorand applications. This may include smart contracts, frontend applications, and any associated configurations. In the context of the CLI, the `algokit project` commands help manage these components cohesively. The orchestration between workspaces, standalone projects, and custom commands is designed to provide a seamless development experience. Below is a high-level overview of how these components interact within the AlgoKit ecosystem. ```mermaid graph TD; A[`algokit project` command group] --> B["Workspace (.algokit.toml)"]; A --> C["Standalone Project (.algokit.toml)"]; B --> D["Sub-Project 1 (.algokit.toml)"]; B --> E["Sub-Project 2 (.algokit.toml)"]; C --> F["Custom Commands defined in .algokit.toml"]; D --> F; E --> F; ``` - **AlgoKit Project**: The root command that encompasses all project-related functionalities. - **Workspace**: A root folder that is managing multiple related sub-projects. - **Standalone Project**: An isolated project structure for simpler applications. - **Custom Commands**: Commands defined by the user in the `.algokit.toml` and automatically injected into the `algokit project run` command group. ### Workspaces vs Standalone Projects As mentioned, AlgoKit supports two distinct project structures: Workspaces and Standalone Projects. This flexibility allows developers to choose the most suitable approach for their project's needs. ### Workspaces Workspaces are designed for managing multiple related projects under a single root directory. This approach is beneficial for complex applications that consist of multiple sub-projects, such as a smart contract and a corresponding frontend application. Workspaces help in organizing these sub-projects in a structured manner, making it easier to manage dependencies and shared configurations. To initialize a project within a workspace, use the `--workspace` flag. If a workspace does not already exist, AlgoKit will create one for you by default (unless you disable it via `--no-workspace` flag). Once established, new projects can be added to this workspace, allowing for centralized management. To mark your project as `workspace` fill in the following in your `.algokit.toml` file: ```toml [project] type = 'workspace' # type specifying if the project is a workspace or standalone projects_root_path = 'projects' # path to the root folder containing all sub-projects in the workspace ``` #### VSCode optimizations AlgoKit has a set of minor optimizations for VSCode users that are useful to be aware of: - Templates created with the `--workspace` flag automatically include a VSCode code-workspace file. New projects added to an AlgoKit workspace are also integrated into an existing VSCode workspace. - Using the `--ide` flag with `init` triggers automatic prompts to open the project and, if available, the code workspace in VSCode. #### Handling of the `.github` Folder A key aspect of using the `--workspace` flag is how the `.github` folder is managed. This folder, which contains GitHub-specific configurations such as workflows and issue templates, is moved from the project directory to the root of the workspace. This move is necessary because GitHub does not recognize workflows located in subdirectories. Here's a simplified overview of what happens: 1. If a `.github` folder is found in your project, its contents are transferred to the workspace's root `.github` folder. 2. Files with matching names in the destination are not overwritten; they're skipped. 3. The original `.github` folder is removed if it's left empty after the move. 4. A notification is displayed, advising you to review the moved `.github` contents to ensure everything is in order. This process ensures that your GitHub configurations are properly recognized at the workspace level, allowing you to utilize GitHub Actions and other features seamlessly across your projects. ### Standalone Projects Standalone projects are suitable for simpler applications or when working on a single component. This structure is straightforward, with each project residing in its own directory, independent of others. Standalone projects are ideal for developers who prefer simplicity or are focusing on a single aspect of their application and are sure that they will not need to add more sub-projects in the future. To create a standalone project, use the `--no-workspace` flag during initialization. This instructs AlgoKit to bypass the workspace structure and set up the project as an isolated entity. Both workspaces and standalone projects are fully supported by AlgoKit's suite of tools, ensuring developers can choose the structure that best fits their workflow without compromising on functionality. To mark your project as a standalone project fill in the following in your `.algokit.toml` file: ```toml [project] type = {'backend' | 'contract' | 'frontend'} # currently support 3 generic categories for standalone projects name = 'my-project' # unique name for the project inside workspace ``` > We recommend using workspaces for most projects (hence enabled by default), as it provides a more organized and scalable approach to managing multiple sub-projects. However, standalone projects are a great choice for simple applications or when you are certain that you will not need to add more sub-projects in the future, for such cases simply append `--no-workspace` when using `algokit init` command. For more details on init command please refer to [init](./init.md) command docs. ## Features Dive into the features of the `algokit project` command group: - [bootstrap](./project/bootstrap.md) - Bootstrap your project with AlgoKit. - [deploy](./project/deploy.md) - Deploy your smart contracts effortlessly to various networks. - [link](./project/link.md) - Powerful feature designed to streamline the integration between `frontend` and `contract` projects - [list](./project/list.md) - Enumerate all projects within an AlgoKit workspace. - [run](./project/run.md) - Define custom commands and manage their execution via `algokit` cli. ``` -------------------------------------------------------------------------------- /packages/server/src/resources/knowledge/taxonomy/algokit:utils:typescript:code:classes:types_dispenser_client.TestNetDispenserApiClient.md: -------------------------------------------------------------------------------- ```markdown [@algorandfoundation/algokit-utils](../README.md) / [types/dispenser-client](../modules/types_dispenser_client.md) / TestNetDispenserApiClient # Class: TestNetDispenserApiClient [types/dispenser-client](../modules/types_dispenser_client.md).TestNetDispenserApiClient `TestNetDispenserApiClient` is a class that provides methods to interact with the [Algorand TestNet Dispenser API](https://github.com/algorandfoundation/algokit/blob/main/docs/testnet_api.md). It allows you to fund an address with Algo, refund a transaction, and get the funding limit for the Algo asset. The class requires an authentication token and a request timeout to be initialized. The authentication token can be provided either directly as a parameter or through an `ALGOKIT_DISPENSER_ACCESS_TOKEN` environment variable. If neither is provided, an error is thrown. The request timeout can be provided as a parameter. If not provided, a default value is used. **`Method`** fund - Sends a funding request to the dispenser API to fund the specified address with the given amount of Algo. **`Method`** refund - Sends a refund request to the dispenser API for the specified refundTxnId. **`Method`** limit - Sends a request to the dispenser API to get the funding limit for the Algo asset. **`Example`** ```typescript const client = new TestNetDispenserApiClient({ authToken: 'your_auth_token', requestTimeout: 30 }); const fundResponse = await client.fund('your_address', 100); const limitResponse = await client.getLimit(); await client.refund('your_transaction_id'); ``` **`Throws`** If neither the environment variable 'ALGOKIT_DISPENSER_ACCESS_TOKEN' nor the authToken parameter were provided. ## Table of contents ### Constructors - [constructor](types_dispenser_client.TestNetDispenserApiClient.md#constructor) ### Properties - [\_authToken](types_dispenser_client.TestNetDispenserApiClient.md#_authtoken) - [\_requestTimeout](types_dispenser_client.TestNetDispenserApiClient.md#_requesttimeout) ### Accessors - [authToken](types_dispenser_client.TestNetDispenserApiClient.md#authtoken) - [requestTimeout](types_dispenser_client.TestNetDispenserApiClient.md#requesttimeout) ### Methods - [fund](types_dispenser_client.TestNetDispenserApiClient.md#fund) - [getLimit](types_dispenser_client.TestNetDispenserApiClient.md#getlimit) - [processDispenserRequest](types_dispenser_client.TestNetDispenserApiClient.md#processdispenserrequest) - [refund](types_dispenser_client.TestNetDispenserApiClient.md#refund) ## Constructors ### constructor • **new TestNetDispenserApiClient**(`params?`): [`TestNetDispenserApiClient`](types_dispenser_client.TestNetDispenserApiClient.md) #### Parameters | Name | Type | | :------ | :------ | | `params?` | [`TestNetDispenserApiClientParams`](../interfaces/types_dispenser_client.TestNetDispenserApiClientParams.md) | #### Returns [`TestNetDispenserApiClient`](types_dispenser_client.TestNetDispenserApiClient.md) #### Defined in [src/types/dispenser-client.ts:76](https://github.com/algorandfoundation/algokit-utils-ts/blob/main/src/types/dispenser-client.ts#L76) ## Properties ### \_authToken • `Private` **\_authToken**: `string` #### Defined in [src/types/dispenser-client.ts:73](https://github.com/algorandfoundation/algokit-utils-ts/blob/main/src/types/dispenser-client.ts#L73) ___ ### \_requestTimeout • `Private` **\_requestTimeout**: `number` #### Defined in [src/types/dispenser-client.ts:74](https://github.com/algorandfoundation/algokit-utils-ts/blob/main/src/types/dispenser-client.ts#L74) ## Accessors ### authToken • `get` **authToken**(): `string` The authentication token used for API requests. #### Returns `string` #### Defined in [src/types/dispenser-client.ts:92](https://github.com/algorandfoundation/algokit-utils-ts/blob/main/src/types/dispenser-client.ts#L92) ___ ### requestTimeout • `get` **requestTimeout**(): `number` The timeout for API requests, in seconds. #### Returns `number` #### Defined in [src/types/dispenser-client.ts:96](https://github.com/algorandfoundation/algokit-utils-ts/blob/main/src/types/dispenser-client.ts#L96) ## Methods ### fund ▸ **fund**(`address`, `amount`): `Promise`\<[`DispenserFundResponse`](../interfaces/types_dispenser_client.DispenserFundResponse.md)\> Sends a funding request to the dispenser API to fund the specified address with the given amount of Algo. #### Parameters | Name | Type | Description | | :------ | :------ | :------ | | `address` | `string` \| `Address` | The address to fund. | | `amount` | `number` \| `bigint` | The amount of µAlgo to fund. | #### Returns `Promise`\<[`DispenserFundResponse`](../interfaces/types_dispenser_client.DispenserFundResponse.md)\> DispenserFundResponse: An object containing the transaction ID and funded amount. #### Defined in [src/types/dispenser-client.ts:158](https://github.com/algorandfoundation/algokit-utils-ts/blob/main/src/types/dispenser-client.ts#L158) ___ ### getLimit ▸ **getLimit**(): `Promise`\<[`DispenserLimitResponse`](../interfaces/types_dispenser_client.DispenserLimitResponse.md)\> Sends a request to the dispenser API to get the funding limit for the Algo asset. #### Returns `Promise`\<[`DispenserLimitResponse`](../interfaces/types_dispenser_client.DispenserLimitResponse.md)\> DispenserLimitResponse: An object containing the funding limit amount. #### Defined in [src/types/dispenser-client.ts:188](https://github.com/algorandfoundation/algokit-utils-ts/blob/main/src/types/dispenser-client.ts#L188) ___ ### processDispenserRequest ▸ **processDispenserRequest**(`authToken`, `urlSuffix`, `body?`, `method?`): `Promise`\<`Response`\> Processes a dispenser API request. #### Parameters | Name | Type | Default value | Description | | :------ | :------ | :------ | :------ | | `authToken` | `string` | `undefined` | The authentication token. | | `urlSuffix` | `string` | `undefined` | The URL suffix for the API request. | | `body` | ``null`` \| `Record`\<`string`, `string` \| `number`\> | `null` | The request body. | | `method` | `string` | `'POST'` | The HTTP method. | #### Returns `Promise`\<`Response`\> The API response. #### Defined in [src/types/dispenser-client.ts:110](https://github.com/algorandfoundation/algokit-utils-ts/blob/main/src/types/dispenser-client.ts#L110) ___ ### refund ▸ **refund**(`refundTxnId`): `Promise`\<`void`\> Sends a refund request to the dispenser API for the specified refundTxnId. #### Parameters | Name | Type | Description | | :------ | :------ | :------ | | `refundTxnId` | `string` | The transaction ID to refund. | #### Returns `Promise`\<`void`\> #### Defined in [src/types/dispenser-client.ts:179](https://github.com/algorandfoundation/algokit-utils-ts/blob/main/src/types/dispenser-client.ts#L179) ``` -------------------------------------------------------------------------------- /packages/server/src/resources/knowledge/taxonomy/ARCs:specs:arc-0047.md: -------------------------------------------------------------------------------- ```markdown --- arc: 47 title: Logic Signature Templates description: Defining templated logic signatures so wallets can safely sign them. author: Joe Polny (@joe-p) discussions-to: https://github.com/algorandfoundation/ARCs/issues/226 status: Final type: Standards Track category: ARC sub-category: Wallet created: 2023-07-17 --- ## Abstract This standard allows wallets to sign known logic signatures and clearly tell the user what they are signing. ## Motivation Currently, most Algorand wallets do not enable the signing of logic signature programs for the purpose of delegation. The rationale is to prevent users from signing malicious programs, but this limitation also prevents non-malicious delegated logic signatures from being used in the Algorand ecosystem. As such, there needs to be a way to provide a safe way for wallets to sign logic signatures without putting users at risk. ## Specification A logic signature **MUST** be described via the following JSON interface(s): ### Interface ```typescript interface LogicSignatureDescription { name: string, description: string, program: string, variables: { variable: string, name: string, type: string, description: string }[] } ``` | Key | Description | | --- | ----------- | | `name` | The name of the logic signature. **SHOULD** be short and descriptive | | `description` | A description of what the logic signature does | | `program` | base64 encoding of the TEAL program source | `variables` | An array of variables in the program | | `variables.variable` | The name of the variable in the templated program. | | `variables.name` | Human-friendly name for the variable. **SHOULD** be short and descriptive | | `variables.type` | **MUST** be a type defined below in the `type` section | | `variables.description` | A description of how this variable is used in the program | ### Variables A variable in the program **MUST** be start with `TMPL_` #### Types All non-reference ABI types **MUST** be supported by the client. ABI values **MUST** be encoded in base16 (with the leading `0x`) with the following exceptions: | Type | Description | | ---- | ----------- | | `address` | 58-character base32 Algorand public address. Typically to be used as an argument to the `addr` opcode. Front-ends **SHOULD** provide a link to the address on an explorer | `application` | Application ID. Alias for `uint64`. Front-ends **SHOULD** provide a link to the app on an explorer | | `asset` | Asset ID. Alias for `uint64`. Front-ends **SHOULD** provide a link to the asset on an explorer | | `string` | UTF-8 string. Typically used as an argument to `byte`, `method`, or a branching opcode. | `hex` | base16 encoding of binary data. Typically used as an argument to `byte`. **MUST** be prefixed with `0x` | For all other value, front-ends **MUST** decode the ABI value to display the human-readable value to the user. ### Input Validation All ABI values **MUST** be encoded as base16 and prefixed with `0x`, with the exception of `uint64` which should be provided as an integer. String values **MUST NOT** include any unescaped `"` to ensure there is no TEAL injection. All values **MUST** be validated to ensure they are encoded properly. This includes the following checks: * An `address` value must be a valid Algorand address * A `uint64`, `application`, or `asset` value must be a valid unsigned 64-bit integer ### Unique Identification To enable unique identification of a description, clients **MUST** calculate the SHA256 hash of the JSON description canonicalized in accordance with <a href="https://www.rfc-editor.org/rfc/rfc8785">RFC 8785</a>. ### WalletConnect Method For wallets to support this ARC, they need to support the a `algo_templatedLsig` method. The method expects three parameters described by the interface below ```ts interface TemplatedLsigParams { /** The canoncalized ARC47 templated lsig JSON as described in this ARC */ arc47: string /** The values of the templated variables, if there are any */ values?: {[variable: string]: string | number} /** The hash of the expected program. Wallets should compile the lsig with the given values to verify the program hash matches */ hash: string } ``` ## Rationale This provides a way for frontends to clearly display to the user what is being signed when signing a logic signature. Template variables must be immediate arguments. Otherwise a string variable could specify the opcode in the program, which could have unintended and unclear consequences. `TMPL_` prefix is used to align with existing template variable tooling. Hashing canonicalized JSON is useful for ensuring clients, such as wallets, can create a allowlist of templated logic signatures. ## Backwards Compatibility N/A ## Test Cases N/A ## Reference Implementation A reference implementation can be found in the`../assets/arc-0047` folder. [lsig.teal](../assets/arc-0047/lsig.teal) contains the templated TEAL code for a logic signature that allows payments of a specific amount every 25,000 blocks. [dapp.ts](../assets/arc-0047/dapp.ts) contains a TypeScript script showcasing how a dapp would form a wallet connect request for a templated logic signature. [wallet.ts](../assets/arc-0047/wallet.ts) contains a TypeScript script showcasing how a wallet would handle a request for signing a templated logic signature. [validate.ts](../assets/arc-0047/validate.ts) contains a TypeScript script showcasing how one could validate templated TEAL and variable values. ### String Variables #### Invalid: Partial Argument ``` #pragma version 9 byte "Hello, TMPL_NAME" ``` This is not valid because `TMPL_NAME` is not the full immediate argument. #### Invalid: Not An Argument ``` #pragma version 9 TMPL_PUSH_HELLO_NAME ``` This is not valid because `TMPL_PUSH_HELLO_NAME` is not an immediate argument to an opcode. #### Valid ``` #pragma version 9 byte TMPL_HELLO_NAME ``` This is valid as `TMPL_HELLO_NAME` is the entire immediate argument of the `byte` opcode. A possible value could be `Hello, AlgoDev` ### Hex Variables #### Valid ``` #pragma version 9 byte TMPL_DEAD_BEEF ``` This is valid as `TMPL_DEAD_BEEF` is the full immediate argument to the `byte` opcode. A possible value could be `0xdeadbeef`. ## Security Considerations It should be made clear that this standard alone does not define how frontends, particularly wallets, should deem a logic signature to be safe. This is a decision made solely by the front-ends as to which logic signatures they allow to be signed. It is **RECOMMENDED** to only support the signing of audited or otherwise trusted logic signatures. ## Copyright Copyright and related rights waived via <a href="https://creativecommons.org/publicdomain/zero/1.0/">CCO</a>. ``` -------------------------------------------------------------------------------- /packages/server/src/resources/knowledge/taxonomy/SDKs:javascript:classes:modelsv2.AssetParams.md: -------------------------------------------------------------------------------- ```markdown [algosdk](../README.md) / [Exports](../modules.md) / [modelsv2](../modules/modelsv2.md) / AssetParams # Class: AssetParams [modelsv2](../modules/modelsv2.md).AssetParams AssetParams specifies the parameters for an asset. (apar) when part of an AssetConfig transaction. Definition: data/transactions/asset.go : AssetParams ## Hierarchy - `default` ↳ **`AssetParams`** ## Table of contents ### Constructors - [constructor](modelsv2.AssetParams.md#constructor) ### Properties - [attribute\_map](modelsv2.AssetParams.md#attribute_map) - [clawback](modelsv2.AssetParams.md#clawback) - [creator](modelsv2.AssetParams.md#creator) - [decimals](modelsv2.AssetParams.md#decimals) - [defaultFrozen](modelsv2.AssetParams.md#defaultfrozen) - [freeze](modelsv2.AssetParams.md#freeze) - [manager](modelsv2.AssetParams.md#manager) - [metadataHash](modelsv2.AssetParams.md#metadatahash) - [name](modelsv2.AssetParams.md#name) - [nameB64](modelsv2.AssetParams.md#nameb64) - [reserve](modelsv2.AssetParams.md#reserve) - [total](modelsv2.AssetParams.md#total) - [unitName](modelsv2.AssetParams.md#unitname) - [unitNameB64](modelsv2.AssetParams.md#unitnameb64) - [url](modelsv2.AssetParams.md#url) - [urlB64](modelsv2.AssetParams.md#urlb64) ### Methods - [get\_obj\_for\_encoding](modelsv2.AssetParams.md#get_obj_for_encoding) - [from\_obj\_for\_encoding](modelsv2.AssetParams.md#from_obj_for_encoding) ## Constructors ### constructor • **new AssetParams**(`«destructured»`) Creates a new `AssetParams` object. #### Parameters | Name | Type | | :------ | :------ | | `«destructured»` | `Object` | | › `clawback?` | `string` | | › `creator` | `string` | | › `decimals` | `number` \| `bigint` | | › `defaultFrozen?` | `boolean` | | › `freeze?` | `string` | | › `manager?` | `string` | | › `metadataHash?` | `string` \| `Uint8Array` | | › `name?` | `string` | | › `nameB64?` | `string` \| `Uint8Array` | | › `reserve?` | `string` | | › `total` | `number` \| `bigint` | | › `unitName?` | `string` | | › `unitNameB64?` | `string` \| `Uint8Array` | | › `url?` | `string` | | › `urlB64?` | `string` \| `Uint8Array` | #### Overrides BaseModel.constructor #### Defined in client/v2/algod/models/types.ts:1846 ## Properties ### attribute\_map • **attribute\_map**: `Record`\<`string`, `string`\> #### Inherited from BaseModel.attribute\_map #### Defined in client/v2/basemodel.ts:56 ___ ### clawback • `Optional` **clawback**: `string` (c) Address of account used to clawback holdings of this asset. If empty, clawback is not permitted. #### Defined in client/v2/algod/models/types.ts:1755 ___ ### creator • **creator**: `string` The address that created this asset. This is the address where the parameters for this asset can be found, and also the address where unwanted asset units can be sent in the worst case. #### Defined in client/v2/algod/models/types.ts:1736 ___ ### decimals • **decimals**: `number` \| `bigint` (dc) The number of digits to use after the decimal point when displaying this asset. If 0, the asset is not divisible. If 1, the base unit of the asset is in tenths. If 2, the base unit of the asset is in hundredths, and so on. This value must be between 0 and 19 (inclusive). #### Defined in client/v2/algod/models/types.ts:1744 ___ ### defaultFrozen • `Optional` **defaultFrozen**: `boolean` (df) Whether holdings of this asset are frozen by default. #### Defined in client/v2/algod/models/types.ts:1760 ___ ### freeze • `Optional` **freeze**: `string` (f) Address of account used to freeze holdings of this asset. If empty, freezing is not permitted. #### Defined in client/v2/algod/models/types.ts:1766 ___ ### manager • `Optional` **manager**: `string` (m) Address of account used to manage the keys of this asset and to destroy it. #### Defined in client/v2/algod/models/types.ts:1771 ___ ### metadataHash • `Optional` **metadataHash**: `Uint8Array` (am) A commitment to some unspecified asset metadata. The format of this metadata is up to the application. #### Defined in client/v2/algod/models/types.ts:1777 ___ ### name • `Optional` **name**: `string` (an) Name of this asset, as supplied by the creator. Included only when the asset name is composed of printable utf-8 characters. #### Defined in client/v2/algod/models/types.ts:1783 ___ ### nameB64 • `Optional` **nameB64**: `Uint8Array` Base64 encoded name of this asset, as supplied by the creator. #### Defined in client/v2/algod/models/types.ts:1788 ___ ### reserve • `Optional` **reserve**: `string` (r) Address of account holding reserve (non-minted) units of this asset. #### Defined in client/v2/algod/models/types.ts:1793 ___ ### total • **total**: `number` \| `bigint` (t) The total number of units of this asset. #### Defined in client/v2/algod/models/types.ts:1749 ___ ### unitName • `Optional` **unitName**: `string` (un) Name of a unit of this asset, as supplied by the creator. Included only when the name of a unit of this asset is composed of printable utf-8 characters. #### Defined in client/v2/algod/models/types.ts:1799 ___ ### unitNameB64 • `Optional` **unitNameB64**: `Uint8Array` Base64 encoded name of a unit of this asset, as supplied by the creator. #### Defined in client/v2/algod/models/types.ts:1804 ___ ### url • `Optional` **url**: `string` (au) URL where more information about the asset can be retrieved. Included only when the URL is composed of printable utf-8 characters. #### Defined in client/v2/algod/models/types.ts:1810 ___ ### urlB64 • `Optional` **urlB64**: `Uint8Array` Base64 encoded URL where more information about the asset can be retrieved. #### Defined in client/v2/algod/models/types.ts:1815 ## 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`): [`AssetParams`](modelsv2.AssetParams.md) #### Parameters | Name | Type | | :------ | :------ | | `data` | `Record`\<`string`, `any`\> | #### Returns [`AssetParams`](modelsv2.AssetParams.md) #### Defined in client/v2/algod/models/types.ts:1928 ``` -------------------------------------------------------------------------------- /packages/server/src/resources/knowledge/taxonomy/algokit:utils:typescript:code:interfaces:types_asset.AssetOptInParams.md: -------------------------------------------------------------------------------- ```markdown [@algorandfoundation/algokit-utils](../README.md) / [types/asset](../modules/types_asset.md) / AssetOptInParams # Interface: AssetOptInParams [types/asset](../modules/types_asset.md).AssetOptInParams **`Deprecated`** Parameters for `assetOptIn` call. ## Hierarchy - [`SendTransactionParams`](types_transaction.SendTransactionParams.md) ↳ **`AssetOptInParams`** ↳↳ [`AssetOptOutParams`](types_asset.AssetOptOutParams.md) ## Table of contents ### Properties - [account](types_asset.AssetOptInParams.md#account) - [assetId](types_asset.AssetOptInParams.md#assetid) - [atc](types_asset.AssetOptInParams.md#atc) - [fee](types_asset.AssetOptInParams.md#fee) - [lease](types_asset.AssetOptInParams.md#lease) - [maxFee](types_asset.AssetOptInParams.md#maxfee) - [maxRoundsToWaitForConfirmation](types_asset.AssetOptInParams.md#maxroundstowaitforconfirmation) - [note](types_asset.AssetOptInParams.md#note) - [populateAppCallResources](types_asset.AssetOptInParams.md#populateappcallresources) - [skipSending](types_asset.AssetOptInParams.md#skipsending) - [skipWaiting](types_asset.AssetOptInParams.md#skipwaiting) - [suppressLog](types_asset.AssetOptInParams.md#suppresslog) - [transactionParams](types_asset.AssetOptInParams.md#transactionparams) ## Properties ### account • **account**: [`SendTransactionFrom`](../modules/types_transaction.md#sendtransactionfrom) The account to opt in/out for #### Defined in [src/types/asset.ts:72](https://github.com/algorandfoundation/algokit-utils-ts/blob/main/src/types/asset.ts#L72) ___ ### assetId • **assetId**: `number` The ID of the assets to opt in for / out of #### Defined in [src/types/asset.ts:74](https://github.com/algorandfoundation/algokit-utils-ts/blob/main/src/types/asset.ts#L74) ___ ### 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) ___ ### 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/asset.ts:80](https://github.com/algorandfoundation/algokit-utils-ts/blob/main/src/types/asset.ts#L80) ___ ### 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/asset.ts:78](https://github.com/algorandfoundation/algokit-utils-ts/blob/main/src/types/asset.ts#L78) ___ ### 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/asset.ts:76](https://github.com/algorandfoundation/algokit-utils-ts/blob/main/src/types/asset.ts#L76) ``` -------------------------------------------------------------------------------- /packages/server/src/resources/knowledge/taxonomy/algokit:utils:typescript:code:classes:types_asset_manager.AssetManager.md: -------------------------------------------------------------------------------- ```markdown [@algorandfoundation/algokit-utils](../README.md) / [types/asset-manager](../modules/types_asset_manager.md) / AssetManager # Class: AssetManager [types/asset-manager](../modules/types_asset_manager.md).AssetManager Allows management of asset information. ## Table of contents ### Constructors - [constructor](types_asset_manager.AssetManager.md#constructor) ### Properties - [\_algod](types_asset_manager.AssetManager.md#_algod) - [\_newGroup](types_asset_manager.AssetManager.md#_newgroup) ### Methods - [bulkOptIn](types_asset_manager.AssetManager.md#bulkoptin) - [bulkOptOut](types_asset_manager.AssetManager.md#bulkoptout) - [getAccountInformation](types_asset_manager.AssetManager.md#getaccountinformation) - [getById](types_asset_manager.AssetManager.md#getbyid) ## Constructors ### constructor • **new AssetManager**(`algod`, `newGroup`): [`AssetManager`](types_asset_manager.AssetManager.md) Create a new asset manager. #### Parameters | Name | Type | Description | | :------ | :------ | :------ | | `algod` | `AlgodClient` | An algod client | | `newGroup` | () => [`TransactionComposer`](types_composer.TransactionComposer.md) | A function that creates a new `TransactionComposer` transaction group | #### Returns [`AssetManager`](types_asset_manager.AssetManager.md) **`Example`** ```typescript const assetManager = new AssetManager(algod, () => new TransactionComposer({algod, () => signer, () => suggestedParams})) ``` #### Defined in [src/types/asset-manager.ts:151](https://github.com/algorandfoundation/algokit-utils-ts/blob/main/src/types/asset-manager.ts#L151) ## Properties ### \_algod • `Private` **\_algod**: `AlgodClient` #### Defined in [src/types/asset-manager.ts:139](https://github.com/algorandfoundation/algokit-utils-ts/blob/main/src/types/asset-manager.ts#L139) ___ ### \_newGroup • `Private` **\_newGroup**: () => [`TransactionComposer`](types_composer.TransactionComposer.md) #### Type declaration ▸ (): [`TransactionComposer`](types_composer.TransactionComposer.md) ##### Returns [`TransactionComposer`](types_composer.TransactionComposer.md) #### Defined in [src/types/asset-manager.ts:140](https://github.com/algorandfoundation/algokit-utils-ts/blob/main/src/types/asset-manager.ts#L140) ## Methods ### bulkOptIn ▸ **bulkOptIn**(`account`, `assetIds`, `options?`): `Promise`\<[`BulkAssetOptInOutResult`](../interfaces/types_asset_manager.BulkAssetOptInOutResult.md)[]\> Opt an account in to a list of Algorand Standard Assets. Transactions will be sent in batches of 16 as transaction groups. #### Parameters | Name | Type | Description | | :------ | :------ | :------ | | `account` | `string` \| `Address` | The account to opt-in | | `assetIds` | `bigint`[] | The list of asset IDs to opt-in to | | `options?` | `Omit`\<[`CommonTransactionParams`](../modules/types_composer.md#commontransactionparams), ``"sender"``\> & [`SendParams`](../interfaces/types_transaction.SendParams.md) | Any parameters to control the transaction or execution of the transaction | #### Returns `Promise`\<[`BulkAssetOptInOutResult`](../interfaces/types_asset_manager.BulkAssetOptInOutResult.md)[]\> An array of records matching asset ID to transaction ID of the opt in **`Example`** ```typescript // Basic example algorand.asset.bulkOptIn("ACCOUNTADDRESS", [12345n, 67890n]) // With configuration algorand.asset.bulkOptIn("ACCOUNTADDRESS", [12345n, 67890n], { maxFee: (1000).microAlgo(), suppressLog: true }) ``` #### Defined in [src/types/asset-manager.ts:233](https://github.com/algorandfoundation/algokit-utils-ts/blob/main/src/types/asset-manager.ts#L233) ___ ### bulkOptOut ▸ **bulkOptOut**(`account`, `assetIds`, `options?`): `Promise`\<[`BulkAssetOptInOutResult`](../interfaces/types_asset_manager.BulkAssetOptInOutResult.md)[]\> Opt an account out of a list of Algorand Standard Assets. Transactions will be sent in batches of 16 as transaction groups. #### Parameters | Name | Type | Description | | :------ | :------ | :------ | | `account` | `string` \| `Address` | The account to opt-in | | `assetIds` | `bigint`[] | The list of asset IDs to opt-out of | | `options?` | `Omit`\<[`CommonTransactionParams`](../modules/types_composer.md#commontransactionparams), ``"sender"``\> & [`SendParams`](../interfaces/types_transaction.SendParams.md) & \{ `ensureZeroBalance?`: `boolean` } | Any parameters to control the transaction or execution of the transaction | #### Returns `Promise`\<[`BulkAssetOptInOutResult`](../interfaces/types_asset_manager.BulkAssetOptInOutResult.md)[]\> An array of records matching asset ID to transaction ID of the opt in **`Example`** ```typescript // Basic example algorand.asset.bulkOptOut("ACCOUNTADDRESS", [12345n, 67890n]) // With configuration algorand.asset.bulkOptOut("ACCOUNTADDRESS", [12345n, 67890n], { ensureZeroBalance: true, maxFee: (1000).microAlgo(), suppressLog: true }) ``` #### Defined in [src/types/asset-manager.ts:283](https://github.com/algorandfoundation/algokit-utils-ts/blob/main/src/types/asset-manager.ts#L283) ___ ### getAccountInformation ▸ **getAccountInformation**(`sender`, `assetId`): `Promise`\<[`AccountAssetInformation`](../modules/types_account.md#accountassetinformation)\> Returns the given sender account's asset holding for a given asset. #### Parameters | Name | Type | Description | | :------ | :------ | :------ | | `sender` | `string` \| `Address` | The address of the sender/account to look up | | `assetId` | `bigint` | The ID of the asset to return a holding for | #### Returns `Promise`\<[`AccountAssetInformation`](../modules/types_account.md#accountassetinformation)\> The account asset holding information **`Example`** ```typescript const address = "XBYLS2E6YI6XXL5BWCAMOA4GTWHXWENZMX5UHXMRNWWUQ7BXCY5WC5TEPA"; const assetId = 123345n; const accountInfo = await algorand.asset.getAccountInformation(address, assetId); ``` [Response data schema details](https://developer.algorand.org/docs/rest-apis/algod/#get-v2accountsaddressassetsasset-id) #### Defined in [src/types/asset-manager.ts:205](https://github.com/algorandfoundation/algokit-utils-ts/blob/main/src/types/asset-manager.ts#L205) ___ ### getById ▸ **getById**(`assetId`): `Promise`\<[`AssetInformation`](../interfaces/types_asset_manager.AssetInformation.md)\> Returns the current asset information for the asset with the given ID. #### Parameters | Name | Type | Description | | :------ | :------ | :------ | | `assetId` | `bigint` | The ID of the asset | #### Returns `Promise`\<[`AssetInformation`](../interfaces/types_asset_manager.AssetInformation.md)\> The asset information **`Example`** ```typescript const assetInfo = await assetManager.getById(12353n); ``` #### Defined in [src/types/asset-manager.ts:167](https://github.com/algorandfoundation/algokit-utils-ts/blob/main/src/types/asset-manager.ts#L167) ``` -------------------------------------------------------------------------------- /packages/server/src/resources/knowledge/taxonomy/SDKs:javascript:classes:indexerModels.AssetParams.md: -------------------------------------------------------------------------------- ```markdown [algosdk](../README.md) / [Exports](../modules.md) / [indexerModels](../modules/indexerModels.md) / AssetParams # Class: AssetParams [indexerModels](../modules/indexerModels.md).AssetParams AssetParams specifies the parameters for an asset. (apar) when part of an AssetConfig transaction. Definition: data/transactions/asset.go : AssetParams ## Hierarchy - `default` ↳ **`AssetParams`** ## Table of contents ### Constructors - [constructor](indexerModels.AssetParams.md#constructor) ### Properties - [attribute\_map](indexerModels.AssetParams.md#attribute_map) - [clawback](indexerModels.AssetParams.md#clawback) - [creator](indexerModels.AssetParams.md#creator) - [decimals](indexerModels.AssetParams.md#decimals) - [defaultFrozen](indexerModels.AssetParams.md#defaultfrozen) - [freeze](indexerModels.AssetParams.md#freeze) - [manager](indexerModels.AssetParams.md#manager) - [metadataHash](indexerModels.AssetParams.md#metadatahash) - [name](indexerModels.AssetParams.md#name) - [nameB64](indexerModels.AssetParams.md#nameb64) - [reserve](indexerModels.AssetParams.md#reserve) - [total](indexerModels.AssetParams.md#total) - [unitName](indexerModels.AssetParams.md#unitname) - [unitNameB64](indexerModels.AssetParams.md#unitnameb64) - [url](indexerModels.AssetParams.md#url) - [urlB64](indexerModels.AssetParams.md#urlb64) ### Methods - [get\_obj\_for\_encoding](indexerModels.AssetParams.md#get_obj_for_encoding) - [from\_obj\_for\_encoding](indexerModels.AssetParams.md#from_obj_for_encoding) ## Constructors ### constructor • **new AssetParams**(`«destructured»`) Creates a new `AssetParams` object. #### Parameters | Name | Type | | :------ | :------ | | `«destructured»` | `Object` | | › `clawback?` | `string` | | › `creator` | `string` | | › `decimals` | `number` \| `bigint` | | › `defaultFrozen?` | `boolean` | | › `freeze?` | `string` | | › `manager?` | `string` | | › `metadataHash?` | `string` \| `Uint8Array` | | › `name?` | `string` | | › `nameB64?` | `string` \| `Uint8Array` | | › `reserve?` | `string` | | › `total` | `number` \| `bigint` | | › `unitName?` | `string` | | › `unitNameB64?` | `string` \| `Uint8Array` | | › `url?` | `string` | | › `urlB64?` | `string` \| `Uint8Array` | #### Overrides BaseModel.constructor #### Defined in client/v2/indexer/models/types.ts:1916 ## Properties ### attribute\_map • **attribute\_map**: `Record`\<`string`, `string`\> #### Inherited from BaseModel.attribute\_map #### Defined in client/v2/basemodel.ts:56 ___ ### clawback • `Optional` **clawback**: `string` Address of account used to clawback holdings of this asset. If empty, clawback is not permitted. #### Defined in client/v2/indexer/models/types.ts:1825 ___ ### creator • **creator**: `string` The address that created this asset. This is the address where the parameters for this asset can be found, and also the address where unwanted asset units can be sent in the worst case. #### Defined in client/v2/indexer/models/types.ts:1806 ___ ### decimals • **decimals**: `number` \| `bigint` The number of digits to use after the decimal point when displaying this asset. If 0, the asset is not divisible. If 1, the base unit of the asset is in tenths. If 2, the base unit of the asset is in hundredths, and so on. This value must be between 0 and 19 (inclusive). #### Defined in client/v2/indexer/models/types.ts:1814 ___ ### defaultFrozen • `Optional` **defaultFrozen**: `boolean` Whether holdings of this asset are frozen by default. #### Defined in client/v2/indexer/models/types.ts:1830 ___ ### freeze • `Optional` **freeze**: `string` Address of account used to freeze holdings of this asset. If empty, freezing is not permitted. #### Defined in client/v2/indexer/models/types.ts:1836 ___ ### manager • `Optional` **manager**: `string` Address of account used to manage the keys of this asset and to destroy it. #### Defined in client/v2/indexer/models/types.ts:1841 ___ ### metadataHash • `Optional` **metadataHash**: `Uint8Array` A commitment to some unspecified asset metadata. The format of this metadata is up to the application. #### Defined in client/v2/indexer/models/types.ts:1847 ___ ### name • `Optional` **name**: `string` Name of this asset, as supplied by the creator. Included only when the asset name is composed of printable utf-8 characters. #### Defined in client/v2/indexer/models/types.ts:1853 ___ ### nameB64 • `Optional` **nameB64**: `Uint8Array` Base64 encoded name of this asset, as supplied by the creator. #### Defined in client/v2/indexer/models/types.ts:1858 ___ ### reserve • `Optional` **reserve**: `string` Address of account holding reserve (non-minted) units of this asset. #### Defined in client/v2/indexer/models/types.ts:1863 ___ ### total • **total**: `number` \| `bigint` The total number of units of this asset. #### Defined in client/v2/indexer/models/types.ts:1819 ___ ### unitName • `Optional` **unitName**: `string` Name of a unit of this asset, as supplied by the creator. Included only when the name of a unit of this asset is composed of printable utf-8 characters. #### Defined in client/v2/indexer/models/types.ts:1869 ___ ### unitNameB64 • `Optional` **unitNameB64**: `Uint8Array` Base64 encoded name of a unit of this asset, as supplied by the creator. #### Defined in client/v2/indexer/models/types.ts:1874 ___ ### url • `Optional` **url**: `string` URL where more information about the asset can be retrieved. Included only when the URL is composed of printable utf-8 characters. #### Defined in client/v2/indexer/models/types.ts:1880 ___ ### urlB64 • `Optional` **urlB64**: `Uint8Array` Base64 encoded URL where more information about the asset can be retrieved. #### Defined in client/v2/indexer/models/types.ts:1885 ## 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`): [`AssetParams`](indexerModels.AssetParams.md) #### Parameters | Name | Type | | :------ | :------ | | `data` | `Record`\<`string`, `any`\> | #### Returns [`AssetParams`](indexerModels.AssetParams.md) #### Defined in client/v2/indexer/models/types.ts:1998 ``` -------------------------------------------------------------------------------- /packages/server/src/resources/knowledge/taxonomy/algokit:cli:features:project:run.md: -------------------------------------------------------------------------------- ```markdown # AlgoKit Project Run The `algokit project run` command allows defining custom commands to execute at standalone project level or being orchestrated from a workspace containing multiple standalone projects. ## Usage ```sh $ algokit project run [OPTIONS] COMMAND [ARGS] ``` This command executes a custom command defined in the `.algokit.toml` file of the current project or workspace. ### Options - `-l, --list`: List all projects associated with the workspace command. (Optional) - `-p, --project-name`: Execute the command on specified projects. Defaults to all projects in the current directory. (Optional) - `-t, --type`: Limit execution to specific project types if executing from workspace. (Optional) - `-s, --sequential`: Execute workspace commands sequentially, for cases where you do not have a preference on the execution order, but want to disable concurrency. (Optional, defaults to concurrent) - `[ARGS]...`: Additional arguments to pass to the custom command. These will be appended to the end of the command specified in the `.algokit.toml` file. To get detailed help on the above options, execute: ```bash algokit project run {name_of_your_command} --help ``` ### Workspace vs Standalone Projects AlgoKit supports two main types of project structures: Workspaces and Standalone Projects. This flexibility caters to the diverse needs of developers, whether managing multiple related projects or focusing on a single application. - **Workspaces**: Ideal for complex applications comprising multiple sub-projects. Workspaces facilitate organized management of these sub-projects under a single root directory, streamlining dependency management and shared configurations. - **Standalone Projects**: Suited for simpler applications or when working on a single component. This structure offers straightforward project management, with each project residing in its own directory, independent of others. > Please note, instantiating a workspace inside a workspace (aka 'workspace nesting') is not supported and not recommended. When you want to add a new project into existing workspace make sure to run `algokit init` **from the root of the workspace** ### Custom Command Injection AlgoKit enhances project automation by allowing the injection of custom commands into the `.algokit.toml` configuration file. This feature enables developers to tailor the project setup to their specific needs, automating tasks such as deploying to different network environments or integrating with CI/CD pipelines. ## How It Works The orchestration between workspaces, standalone projects, and custom commands is designed to provide a seamless development experience. Below is a high-level overview of how these components interact within the AlgoKit ecosystem. ```mermaid graph TD; A[AlgoKit Project] --> B["Workspace (.algokit.toml)"]; A --> C["Standalone Project (.algokit.toml)"]; B --> D["Sub-Project 1 (.algokit.toml)"]; B --> E["Sub-Project 2 (.algokit.toml)"]; C --> F["Custom Commands defined in .algokit.toml"]; D --> F; E --> F; ``` - **AlgoKit Project**: The root command that encompasses all project-related functionalities. - **Workspace**: A root folder that is managing multiple related sub-projects. - **Standalone Project**: An isolated project structure for simpler applications. - **Custom Commands**: Commands defined by the user in the `.algokit.toml` and automatically injected into the `algokit project run` command group. ### Workspace cli options Below is only visible and available when running from a workspace root. - `-l, --list`: List all projects associated with the workspace command. (Optional) - `-p, --project-name`: Execute the command on specified projects. Defaults to all projects in the current directory. (Optional) - `-t, --type`: Limit execution to specific project types if executing from workspace. (Optional) To get a detailed help on the above commands execute: ```bash algokit project run {name_of_your_command} --help ``` ## Examples Assume you have a default workspace with the following structure: ```bash my_workspace ├── .algokit.toml ├── projects │ ├── project1 │ │ └── .algokit.toml │ └── project2 │ └── .algokit.toml ``` The workspace configuration file is defined as follows: ```toml # ... other non [project.run] related metadata [project] type = 'workspace' projects_root_path = 'projects' # ... other non [project.run] related metadata ``` Standalone configuration files are defined as follows: ```toml # ... other non [project.run] related metadata [project] type = 'contract' name = 'project_a' [project.run] hello = { commands = ['echo hello'], description = 'Prints hello' } # ... other non [project.run] related metadata ``` ```toml # ... other non [project.run] related metadata [project] type = 'frontend' name = 'project_b' [project.run] hello = { commands = ['echo hello'], description = 'Prints hello' } # ... other non [project.run] related metadata ``` Executing `algokit project run hello` from the root of the workspace will concurrently execute `echo hello` in both `project_a` and `project_b` directories. Executing `algokit project run hello` from the root of `project_(a|b)` will execute `echo hello` in the `project_(a|b)` directory. ### Controlling Execution Order Customize the execution order of commands in workspaces for precise control: 1. Define order in `.algokit.toml`: ```yaml [project] type = 'workspace' projects_root_path = 'projects' [project.run] hello = ['project_a', 'project_b'] ``` 2. Execution behavior: - Projects are executed in the specified order - Invalid project names are skipped - Partial project lists: Specified projects run first, others follow > Note: Explicit order always triggers sequential execution. ### Controlling Concurrency You can control whether commands are executed concurrently or sequentially: 1. Use command-line options: ```sh $ algokit project run hello -s # or --sequential $ algokit project run hello -c # or --concurrent ``` 2. Behavior: - Default: Concurrent execution - Sequential: Use `-s` or `--sequential` flag - Concurrent: Use `-c` or `--concurrent` flag or omit the flag (defaults to concurrent) > Note: When an explicit order is specified in `.algokit.toml`, execution is always sequential regardless of these flags. ### Passing Extra Arguments You can pass additional arguments to the custom command. These extra arguments will be appended to the end of the command specified in your `.algokit.toml` file. Example: ```sh $ algokit project run hello -- world ``` In this example, if the `hello` command in `.algokit.toml` is defined as `echo "Hello"`, the actual command executed will be `echo "Hello" world`. ## Further Reading To learn more about the `algokit project run` command, please refer to [run](../../cli/index.md#run) in the AlgoKit CLI reference documentation. ``` -------------------------------------------------------------------------------- /packages/server/src/resources/knowledge/taxonomy/algokit:utils:typescript:code:interfaces:types_app.UpdateAppParams.md: -------------------------------------------------------------------------------- ```markdown [@algorandfoundation/algokit-utils](../README.md) / [types/app](../modules/types_app.md) / UpdateAppParams # Interface: UpdateAppParams [types/app](../modules/types_app.md).UpdateAppParams **`Deprecated`** Use `TransactionComposer` to construct update app transactions instead. Parameters that are passed in when updating an app. ## Hierarchy - `CreateOrUpdateAppParams` ↳ **`UpdateAppParams`** ## Table of contents ### Properties - [appId](types_app.UpdateAppParams.md#appid) - [approvalProgram](types_app.UpdateAppParams.md#approvalprogram) - [args](types_app.UpdateAppParams.md#args) - [atc](types_app.UpdateAppParams.md#atc) - [clearStateProgram](types_app.UpdateAppParams.md#clearstateprogram) - [fee](types_app.UpdateAppParams.md#fee) - [from](types_app.UpdateAppParams.md#from) - [maxFee](types_app.UpdateAppParams.md#maxfee) - [maxRoundsToWaitForConfirmation](types_app.UpdateAppParams.md#maxroundstowaitforconfirmation) - [note](types_app.UpdateAppParams.md#note) - [populateAppCallResources](types_app.UpdateAppParams.md#populateappcallresources) - [skipSending](types_app.UpdateAppParams.md#skipsending) - [skipWaiting](types_app.UpdateAppParams.md#skipwaiting) - [suppressLog](types_app.UpdateAppParams.md#suppresslog) - [transactionParams](types_app.UpdateAppParams.md#transactionparams) ## Properties ### appId • **appId**: `number` \| `bigint` The id of the app to update #### Defined in [src/types/app.ts:163](https://github.com/algorandfoundation/algokit-utils-ts/blob/main/src/types/app.ts#L163) ___ ### approvalProgram • **approvalProgram**: `string` \| `Uint8Array` The approval program as raw teal (string) or compiled teal, base 64 encoded as a byte array (Uint8Array) #### Inherited from CreateOrUpdateAppParams.approvalProgram #### Defined in [src/types/app.ts:135](https://github.com/algorandfoundation/algokit-utils-ts/blob/main/src/types/app.ts#L135) ___ ### args • `Optional` **args**: [`AppCallArgs`](../modules/types_app.md#appcallargs) The arguments passed in to the app call #### Inherited from CreateOrUpdateAppParams.args #### Defined in [src/types/app.ts:143](https://github.com/algorandfoundation/algokit-utils-ts/blob/main/src/types/app.ts#L143) ___ ### 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 CreateOrUpdateAppParams.atc #### Defined in [src/types/transaction.ts:36](https://github.com/algorandfoundation/algokit-utils-ts/blob/main/src/types/transaction.ts#L36) ___ ### clearStateProgram • **clearStateProgram**: `string` \| `Uint8Array` The clear state program as raw teal (string) or compiled teal, base 64 encoded as a byte array (Uint8Array) #### Inherited from CreateOrUpdateAppParams.clearStateProgram #### Defined in [src/types/app.ts:137](https://github.com/algorandfoundation/algokit-utils-ts/blob/main/src/types/app.ts#L137) ___ ### 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 CreateOrUpdateAppParams.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 (with private key loaded) that will send the transaction #### Inherited from CreateOrUpdateAppParams.from #### Defined in [src/types/app.ts:133](https://github.com/algorandfoundation/algokit-utils-ts/blob/main/src/types/app.ts#L133) ___ ### 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 CreateOrUpdateAppParams.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 CreateOrUpdateAppParams.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 #### Inherited from CreateOrUpdateAppParams.note #### Defined in [src/types/app.ts:141](https://github.com/algorandfoundation/algokit-utils-ts/blob/main/src/types/app.ts#L141) ___ ### 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 CreateOrUpdateAppParams.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 CreateOrUpdateAppParams.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 CreateOrUpdateAppParams.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 CreateOrUpdateAppParams.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 #### Inherited from CreateOrUpdateAppParams.transactionParams #### Defined in [src/types/app.ts:139](https://github.com/algorandfoundation/algokit-utils-ts/blob/main/src/types/app.ts#L139) ``` -------------------------------------------------------------------------------- /packages/server/tests/resources/algod/account.test.ts: -------------------------------------------------------------------------------- ```typescript import { McpError, ErrorCode } from '@modelcontextprotocol/sdk/types.js'; import { accountResources, accountResourceSchemas, accountInformation, accountApplicationInformation, accountAssetInformation, handleAccountResource } from '../../../src/resources/algod/account.js'; import { algodClient } from '../../../src/algorand-client.js'; // Mock algosdk client jest.mock('../../../src/algorand-client.js', () => ({ algodClient: { accountInformation: jest.fn(), accountApplicationInformation: jest.fn(), accountAssetInformation: jest.fn() }, API_URIS: { ACCOUNT_DETAILS: 'algorand://account/{address}', APPLICATION_STATE: 'algorand://account/{address}/application/{app-id}', ASSET_HOLDINGS: 'algorand://account/{address}/asset/{asset-id}' } })); describe('Algod Account Resources', () => { beforeEach(() => { jest.clearAllMocks(); }); describe('Resource Definitions', () => { it('should define account resources', () => { expect(accountResources).toHaveLength(3); expect(accountResources.map(r => r.name)).toEqual([ 'Account Details', 'Account Application Info', 'Account Asset Info' ]); }); it('should define resource schemas', () => { expect(Object.keys(accountResourceSchemas)).toHaveLength(3); expect(accountResourceSchemas).toHaveProperty('algorand://account/{address}'); expect(accountResourceSchemas).toHaveProperty('algorand://account/{address}/application/{app-id}'); expect(accountResourceSchemas).toHaveProperty('algorand://account/{address}/asset/{asset-id}'); }); }); describe('Account Information', () => { const mockAddress = 'MOCK_ADDRESS'; const mockResponse = { account: { address: mockAddress, amount: 1000 }, currentRound: 1234 }; beforeEach(() => { (algodClient.accountInformation as jest.Mock).mockReturnValue({ do: jest.fn().mockResolvedValue(mockResponse) }); }); it('should fetch account information', async () => { const result = await accountInformation(mockAddress); expect(result).toEqual(mockResponse); expect(algodClient.accountInformation).toHaveBeenCalledWith(mockAddress); }); it('should handle errors', async () => { const error = new Error('Network error'); (algodClient.accountInformation as jest.Mock).mockReturnValue({ do: jest.fn().mockRejectedValue(error) }); await expect(accountInformation(mockAddress)) .rejects .toThrow('Failed to get account info: Network error'); }); }); describe('Account Application Information', () => { const mockAddress = 'MOCK_ADDRESS'; const mockAppId = 123; const mockResponse = { account: { address: mockAddress, appLocalState: {} }, currentRound: 1234 }; beforeEach(() => { (algodClient.accountApplicationInformation as jest.Mock).mockReturnValue({ do: jest.fn().mockResolvedValue(mockResponse) }); }); it('should fetch application information', async () => { const result = await accountApplicationInformation(mockAddress, mockAppId); expect(result).toEqual(mockResponse); expect(algodClient.accountApplicationInformation).toHaveBeenCalledWith(mockAddress, mockAppId); }); it('should handle errors', async () => { const error = new Error('Network error'); (algodClient.accountApplicationInformation as jest.Mock).mockReturnValue({ do: jest.fn().mockRejectedValue(error) }); await expect(accountApplicationInformation(mockAddress, mockAppId)) .rejects .toThrow('Failed to get account application info: Network error'); }); }); describe('Account Asset Information', () => { const mockAddress = 'MOCK_ADDRESS'; const mockAssetId = 456; const mockResponse = { account: { address: mockAddress, assets: [] }, currentRound: 1234 }; beforeEach(() => { (algodClient.accountAssetInformation as jest.Mock).mockReturnValue({ do: jest.fn().mockResolvedValue(mockResponse) }); }); it('should fetch asset information', async () => { const result = await accountAssetInformation(mockAddress, mockAssetId); expect(result).toEqual(mockResponse); expect(algodClient.accountAssetInformation).toHaveBeenCalledWith(mockAddress, mockAssetId); }); it('should handle errors', async () => { const error = new Error('Network error'); (algodClient.accountAssetInformation as jest.Mock).mockReturnValue({ do: jest.fn().mockRejectedValue(error) }); await expect(accountAssetInformation(mockAddress, mockAssetId)) .rejects .toThrow('Failed to get account asset info: Network error'); }); }); describe('Resource Handler', () => { const mockAddress = 'MOCK_ADDRESS'; const mockResponse = { account: { address: mockAddress }, currentRound: 1234 }; beforeEach(() => { (algodClient.accountInformation as jest.Mock).mockReturnValue({ do: jest.fn().mockResolvedValue(mockResponse) }); (algodClient.accountApplicationInformation as jest.Mock).mockReturnValue({ do: jest.fn().mockResolvedValue(mockResponse) }); (algodClient.accountAssetInformation as jest.Mock).mockReturnValue({ do: jest.fn().mockResolvedValue(mockResponse) }); }); it('should handle account details URI', async () => { const uri = `algorand://account/${mockAddress}`; const result = await handleAccountResource(uri); expect(result).toHaveLength(1); expect(JSON.parse(result[0].text)).toEqual(mockResponse); }); it('should handle application info URI', async () => { const uri = `algorand://account/${mockAddress}/application/123`; const result = await handleAccountResource(uri); expect(result).toHaveLength(1); expect(JSON.parse(result[0].text)).toEqual(mockResponse); }); it('should handle asset info URI', async () => { const uri = `algorand://account/${mockAddress}/asset/456`; const result = await handleAccountResource(uri); expect(result).toHaveLength(1); expect(JSON.parse(result[0].text)).toEqual(mockResponse); }); it('should return empty array for unknown URI', async () => { const uri = 'algorand://unknown'; const result = await handleAccountResource(uri); expect(result).toHaveLength(0); }); it('should handle errors with McpError', async () => { const error = new Error('Network error'); (algodClient.accountInformation as jest.Mock).mockReturnValue({ do: jest.fn().mockRejectedValue(error) }); const uri = `algorand://account/${mockAddress}`; await expect(handleAccountResource(uri)) .rejects .toThrow(new McpError(ErrorCode.InternalError, 'Network error')); }); }); }); ```