This is page 30 of 93. Use http://codebase.md/goplausible/algorand-mcp?lines=true&page={x} to view the full context.
# Directory Structure
```
├── .gitignore
├── CONTRIBUTING.md
├── LICENSE
├── llms-install.md
├── llms.txt
├── package.json
├── packages
│ ├── client
│ │ ├── .env.example
│ │ ├── package.json
│ │ ├── README.md
│ │ ├── src
│ │ │ ├── env.ts
│ │ │ ├── index.ts
│ │ │ └── LocalWallet.ts
│ │ └── tsconfig.json
│ └── server
│ ├── .env.example
│ ├── API specs
│ │ ├── algod_api.json
│ │ ├── indexer_api.json
│ │ ├── mcp.json
│ │ ├── nfd_api.json
│ │ ├── ultrade_api.json
│ │ ├── vestige_api.json
│ │ └── vestige_free_api.json
│ ├── Dockerfile
│ ├── jest.config.js
│ ├── package.json
│ ├── README.md
│ ├── smithery.yaml
│ ├── src
│ │ ├── algorand-client.ts
│ │ ├── env.ts
│ │ ├── index.ts
│ │ ├── resources
│ │ │ ├── index.ts
│ │ │ ├── knowledge
│ │ │ │ ├── ARCs.txt
│ │ │ │ ├── developers-algokit-architecture-decisions.txt
│ │ │ │ ├── developers-algokit-cli.txt
│ │ │ │ ├── developers-algokit-utils-python.txt
│ │ │ │ ├── developers-algokit-utils-typescript.txt
│ │ │ │ ├── developers-clis.txt
│ │ │ │ ├── developers-details.txt
│ │ │ │ ├── developers-liquid-auth.txt
│ │ │ │ ├── developers-nodes.txt
│ │ │ │ ├── developers-puya.txt
│ │ │ │ ├── developers-python.txt
│ │ │ │ ├── developers-sdks-js.txt
│ │ │ │ ├── developers-sdks-python.txt
│ │ │ │ ├── developers-tealscript.txt
│ │ │ │ ├── developers.txt
│ │ │ │ ├── index.ts
│ │ │ │ ├── taxonomy
│ │ │ │ │ ├── algokit-cli:README.md
│ │ │ │ │ ├── algokit:cli:algokit.md
│ │ │ │ │ ├── algokit:cli:architecture-decisions:2022-11-14_sandbox-approach.md
│ │ │ │ │ ├── algokit:cli:architecture-decisions:2022-11-22_beaker-testing-strategy.md
│ │ │ │ │ ├── algokit:cli:architecture-decisions:2023-01-11_beaker_productionisation_review.md
│ │ │ │ │ ├── algokit:cli:architecture-decisions:2023-01-11_brew_install.md
│ │ │ │ │ ├── algokit:cli:architecture-decisions:2023-01-12_smart-contract-deployment.md
│ │ │ │ │ ├── algokit:cli:architecture-decisions:2023-06-06_frontend-templates.md
│ │ │ │ │ ├── algokit:cli:architecture-decisions:2023-07-19_advanced_generate_command.md
│ │ │ │ │ ├── algokit:cli:architecture-decisions:2024-01-13_native_binaries.md
│ │ │ │ │ ├── algokit:cli:architecture-decisions:2024-01-23_init-wizard-v2.md
│ │ │ │ │ ├── algokit:cli:architecture-decisions:2024-01-31_binary_distribution.md
│ │ │ │ │ ├── algokit:cli:architecture-decisions:2024-03-06_local_dev_ui_packaging.md
│ │ │ │ │ ├── algokit:cli:articles:output_stability.md
│ │ │ │ │ ├── algokit:cli:cli:index.md
│ │ │ │ │ ├── algokit:cli:features:compile.md
│ │ │ │ │ ├── algokit:cli:features:completions.md
│ │ │ │ │ ├── algokit:cli:features:config.md
│ │ │ │ │ ├── algokit:cli:features:dispenser.md
│ │ │ │ │ ├── algokit:cli:features:doctor.md
│ │ │ │ │ ├── algokit:cli:features:explore.md
│ │ │ │ │ ├── algokit:cli:features:generate.md
│ │ │ │ │ ├── algokit:cli:features:goal.md
│ │ │ │ │ ├── algokit:cli:features:init.md
│ │ │ │ │ ├── algokit:cli:features:localnet.md
│ │ │ │ │ ├── algokit:cli:features:project:bootstrap.md
│ │ │ │ │ ├── algokit:cli:features:project:deploy.md
│ │ │ │ │ ├── algokit:cli:features:project:link.md
│ │ │ │ │ ├── algokit:cli:features:project:list.md
│ │ │ │ │ ├── algokit:cli:features:project:run.md
│ │ │ │ │ ├── algokit:cli:features:project.md
│ │ │ │ │ ├── algokit:cli:features:tasks:analyze.md
│ │ │ │ │ ├── algokit:cli:features:tasks:ipfs.md
│ │ │ │ │ ├── algokit:cli:features:tasks:mint.md
│ │ │ │ │ ├── algokit:cli:features:tasks:nfd.md
│ │ │ │ │ ├── algokit:cli:features:tasks:opt.md
│ │ │ │ │ ├── algokit:cli:features:tasks:send.md
│ │ │ │ │ ├── algokit:cli:features:tasks:sign.md
│ │ │ │ │ ├── algokit:cli:features:tasks:transfer.md
│ │ │ │ │ ├── algokit:cli:features:tasks:vanity_address.md
│ │ │ │ │ ├── algokit:cli:features:tasks:wallet.md
│ │ │ │ │ ├── algokit:cli:features:tasks.md
│ │ │ │ │ ├── algokit:cli:tutorials:algokit-template.md
│ │ │ │ │ ├── algokit:cli:tutorials:intro.md
│ │ │ │ │ ├── algokit:cli:tutorials:smart-contracts.md
│ │ │ │ │ ├── algokit:docs:testnet_api.md
│ │ │ │ │ ├── algokit:lora:README.md
│ │ │ │ │ ├── algokit:README.md
│ │ │ │ │ ├── algokit:utils:python:markdown:apidocs:algokit_utils:algokit_utils.md
│ │ │ │ │ ├── algokit:utils:python:markdown:capabilities:account.md
│ │ │ │ │ ├── algokit:utils:python:markdown:capabilities:app-client.md
│ │ │ │ │ ├── algokit:utils:python:markdown:capabilities:app-deploy.md
│ │ │ │ │ ├── algokit:utils:python:markdown:capabilities:client.md
│ │ │ │ │ ├── algokit:utils:python:markdown:capabilities:debugger.md
│ │ │ │ │ ├── algokit:utils:python:markdown:capabilities:dispenser-client.md
│ │ │ │ │ ├── algokit:utils:python:markdown:capabilities:transfer.md
│ │ │ │ │ ├── algokit:utils:python:markdown:index.md
│ │ │ │ │ ├── algokit:utils:python:README.md
│ │ │ │ │ ├── algokit:utils:python:source:capabilities:account.md
│ │ │ │ │ ├── algokit:utils:python:source:capabilities:app-client.md
│ │ │ │ │ ├── algokit:utils:python:source:capabilities:app-deploy.md
│ │ │ │ │ ├── algokit:utils:python:source:capabilities:client.md
│ │ │ │ │ ├── algokit:utils:python:source:capabilities:debugger.md
│ │ │ │ │ ├── algokit:utils:python:source:capabilities:dispenser-client.md
│ │ │ │ │ ├── algokit:utils:python:source:capabilities:transfer.md
│ │ │ │ │ ├── algokit:utils:python:source:index.md
│ │ │ │ │ ├── algokit:utils:typescript:capabilities:account.md
│ │ │ │ │ ├── algokit:utils:typescript:capabilities:algorand-client.md
│ │ │ │ │ ├── algokit:utils:typescript:capabilities:amount.md
│ │ │ │ │ ├── algokit:utils:typescript:capabilities:app-client.md
│ │ │ │ │ ├── algokit:utils:typescript:capabilities:app-deploy.md
│ │ │ │ │ ├── algokit:utils:typescript:capabilities:app.md
│ │ │ │ │ ├── algokit:utils:typescript:capabilities:asset.md
│ │ │ │ │ ├── algokit:utils:typescript:capabilities:client.md
│ │ │ │ │ ├── algokit:utils:typescript:capabilities:debugging.md
│ │ │ │ │ ├── algokit:utils:typescript:capabilities:dispenser-client.md
│ │ │ │ │ ├── algokit:utils:typescript:capabilities:event-emitter.md
│ │ │ │ │ ├── algokit:utils:typescript:capabilities:indexer.md
│ │ │ │ │ ├── algokit:utils:typescript:capabilities:testing.md
│ │ │ │ │ ├── algokit:utils:typescript:capabilities:transaction-composer.md
│ │ │ │ │ ├── algokit:utils:typescript:capabilities:transaction.md
│ │ │ │ │ ├── algokit:utils:typescript:capabilities:transfer.md
│ │ │ │ │ ├── algokit:utils:typescript:capabilities:typed-app-clients.md
│ │ │ │ │ ├── algokit:utils:typescript:code:classes:testing.TestLogger.md
│ │ │ │ │ ├── algokit:utils:typescript:code:classes:testing.TransactionLogger.md
│ │ │ │ │ ├── algokit:utils:typescript:code:classes:types_account_manager.AccountManager.md
│ │ │ │ │ ├── algokit:utils:typescript:code:classes:types_account.MultisigAccount.md
│ │ │ │ │ ├── algokit:utils:typescript:code:classes:types_account.SigningAccount.md
│ │ │ │ │ ├── algokit:utils:typescript:code:classes:types_algo_http_client_with_retry.AlgoHttpClientWithRetry.md
│ │ │ │ │ ├── algokit:utils:typescript:code:classes:types_algorand_client_transaction_creator.AlgorandClientTransactionCreator.md
│ │ │ │ │ ├── algokit:utils:typescript:code:classes:types_algorand_client_transaction_sender.AlgorandClientTransactionSender.md
│ │ │ │ │ ├── algokit:utils:typescript:code:classes:types_algorand_client.AlgorandClient.md
│ │ │ │ │ ├── algokit:utils:typescript:code:classes:types_amount.AlgoAmount.md
│ │ │ │ │ ├── algokit:utils:typescript:code:classes:types_app_arc56.Arc56Method.md
│ │ │ │ │ ├── algokit:utils:typescript:code:classes:types_app_client.AppClient.md
│ │ │ │ │ ├── algokit:utils:typescript:code:classes:types_app_client.ApplicationClient.md
│ │ │ │ │ ├── algokit:utils:typescript:code:classes:types_app_deployer.AppDeployer.md
│ │ │ │ │ ├── algokit:utils:typescript:code:classes:types_app_factory.AppFactory.md
│ │ │ │ │ ├── algokit:utils:typescript:code:classes:types_app_manager.AppManager.md
│ │ │ │ │ ├── algokit:utils:typescript:code:classes:types_asset_manager.AssetManager.md
│ │ │ │ │ ├── algokit:utils:typescript:code:classes:types_async_event_emitter.AsyncEventEmitter.md
│ │ │ │ │ ├── algokit:utils:typescript:code:classes:types_client_manager.ClientManager.md
│ │ │ │ │ ├── algokit:utils:typescript:code:classes:types_composer.TransactionComposer.md
│ │ │ │ │ ├── algokit:utils:typescript:code:classes:types_config.UpdatableConfig.md
│ │ │ │ │ ├── algokit:utils:typescript:code:classes:types_dispenser_client.TestNetDispenserApiClient.md
│ │ │ │ │ ├── algokit:utils:typescript:code:classes:types_kmd_account_manager.KmdAccountManager.md
│ │ │ │ │ ├── algokit:utils:typescript:code:classes:types_logic_error.LogicError.md
│ │ │ │ │ ├── algokit:utils:typescript:code:enums:types_app.OnSchemaBreak.md
│ │ │ │ │ ├── algokit:utils:typescript:code:enums:types_app.OnUpdate.md
│ │ │ │ │ ├── algokit:utils:typescript:code:enums:types_indexer.AccountStatus.md
│ │ │ │ │ ├── algokit:utils:typescript:code:enums:types_indexer.ApplicationOnComplete.md
│ │ │ │ │ ├── algokit:utils:typescript:code:enums:types_indexer.SignatureType.md
│ │ │ │ │ ├── algokit:utils:typescript:code:enums:types_lifecycle_events.EventType.md
│ │ │ │ │ ├── algokit:utils:typescript:code:interfaces:types_account_manager.EnsureFundedResult.md
│ │ │ │ │ ├── algokit:utils:typescript:code:interfaces:types_account.AccountConfig.md
│ │ │ │ │ ├── algokit:utils:typescript:code:interfaces:types_account.TransactionSignerAccount.md
│ │ │ │ │ ├── algokit:utils:typescript:code:interfaces:types_algorand_client_interface.AlgorandClientInterface.md
│ │ │ │ │ ├── algokit:utils:typescript:code:interfaces:types_app_arc56.Arc56Contract.md
│ │ │ │ │ ├── algokit:utils:typescript:code:interfaces:types_app_arc56.Event.md
│ │ │ │ │ ├── algokit:utils:typescript:code:interfaces:types_app_arc56.Method.md
│ │ │ │ │ ├── algokit:utils:typescript:code:interfaces:types_app_arc56.ProgramSourceInfo.md
│ │ │ │ │ ├── algokit:utils:typescript:code:interfaces:types_app_arc56.StorageKey.md
│ │ │ │ │ ├── algokit:utils:typescript:code:interfaces:types_app_arc56.StorageMap.md
│ │ │ │ │ ├── algokit:utils:typescript:code:interfaces:types_app_arc56.StructField.md
│ │ │ │ │ ├── algokit:utils:typescript:code:interfaces:types_app_client.AppClientCallABIArgs.md
│ │ │ │ │ ├── algokit:utils:typescript:code:interfaces:types_app_client.AppClientCallCoreParams.md
│ │ │ │ │ ├── algokit:utils:typescript:code:interfaces:types_app_client.AppClientCompilationParams.md
│ │ │ │ │ ├── algokit:utils:typescript:code:interfaces:types_app_client.AppClientCompilationResult.md
│ │ │ │ │ ├── algokit:utils:typescript:code:interfaces:types_app_client.AppClientDeployCallInterfaceParams.md
│ │ │ │ │ ├── algokit:utils:typescript:code:interfaces:types_app_client.AppClientDeployCoreParams.md
│ │ │ │ │ ├── algokit:utils:typescript:code:interfaces:types_app_client.AppClientDeployParams.md
│ │ │ │ │ ├── algokit:utils:typescript:code:interfaces:types_app_client.AppClientParams.md
│ │ │ │ │ ├── algokit:utils:typescript:code:interfaces:types_app_client.AppSourceMaps.md
│ │ │ │ │ ├── algokit:utils:typescript:code:interfaces:types_app_client.FundAppAccountParams.md
│ │ │ │ │ ├── algokit:utils:typescript:code:interfaces:types_app_client.ResolveAppById.md
│ │ │ │ │ ├── algokit:utils:typescript:code:interfaces:types_app_client.ResolveAppByIdBase.md
│ │ │ │ │ ├── algokit:utils:typescript:code:interfaces:types_app_client.SourceMapExport.md
│ │ │ │ │ ├── algokit:utils:typescript:code:interfaces:types_app_deployer.AppLookup.md
│ │ │ │ │ ├── algokit:utils:typescript:code:interfaces:types_app_deployer.AppMetadata.md
│ │ │ │ │ ├── algokit:utils:typescript:code:interfaces:types_app_factory.AppFactoryParams.md
│ │ │ │ │ ├── algokit:utils:typescript:code:interfaces:types_app_manager.AppInformation.md
│ │ │ │ │ ├── algokit:utils:typescript:code:interfaces:types_app_manager.BoxReference.md
│ │ │ │ │ ├── algokit:utils:typescript:code:interfaces:types_app_manager.BoxValueRequestParams.md
│ │ │ │ │ ├── algokit:utils:typescript:code:interfaces:types_app_manager.BoxValuesRequestParams.md
│ │ │ │ │ ├── algokit:utils:typescript:code:interfaces:types_app_spec.AppSources.md
│ │ │ │ │ ├── algokit:utils:typescript:code:interfaces:types_app_spec.AppSpec.md
│ │ │ │ │ ├── algokit:utils:typescript:code:interfaces:types_app_spec.CallConfig.md
│ │ │ │ │ ├── algokit:utils:typescript:code:interfaces:types_app_spec.DeclaredSchemaValueSpec.md
│ │ │ │ │ ├── algokit:utils:typescript:code:interfaces:types_app_spec.Hint.md
│ │ │ │ │ ├── algokit:utils:typescript:code:interfaces:types_app_spec.ReservedSchemaValueSpec.md
│ │ │ │ │ ├── algokit:utils:typescript:code:interfaces:types_app_spec.Schema.md
│ │ │ │ │ ├── algokit:utils:typescript:code:interfaces:types_app_spec.SchemaSpec.md
│ │ │ │ │ ├── algokit:utils:typescript:code:interfaces:types_app_spec.StateSchemaSpec.md
│ │ │ │ │ ├── algokit:utils:typescript:code:interfaces:types_app_spec.Struct.md
│ │ │ │ │ ├── algokit:utils:typescript:code:interfaces:types_app.AppCallParams.md
│ │ │ │ │ ├── algokit:utils:typescript:code:interfaces:types_app.AppCallTransactionResultOfType.md
│ │ │ │ │ ├── algokit:utils:typescript:code:interfaces:types_app.AppCompilationResult.md
│ │ │ │ │ ├── algokit:utils:typescript:code:interfaces:types_app.AppDeploymentParams.md
│ │ │ │ │ ├── algokit:utils:typescript:code:interfaces:types_app.AppDeployMetadata.md
│ │ │ │ │ ├── algokit:utils:typescript:code:interfaces:types_app.AppLookup.md
│ │ │ │ │ ├── algokit:utils:typescript:code:interfaces:types_app.AppMetadata.md
│ │ │ │ │ ├── algokit:utils:typescript:code:interfaces:types_app.AppReference.md
│ │ │ │ │ ├── algokit:utils:typescript:code:interfaces:types_app.AppState.md
│ │ │ │ │ ├── algokit:utils:typescript:code:interfaces:types_app.AppStorageSchema.md
│ │ │ │ │ ├── algokit:utils:typescript:code:interfaces:types_app.BoxName.md
│ │ │ │ │ ├── algokit:utils:typescript:code:interfaces:types_app.BoxReference.md
│ │ │ │ │ ├── algokit:utils:typescript:code:interfaces:types_app.BoxValueRequestParams.md
│ │ │ │ │ ├── algokit:utils:typescript:code:interfaces:types_app.BoxValuesRequestParams.md
│ │ │ │ │ ├── algokit:utils:typescript:code:interfaces:types_app.CompiledTeal.md
│ │ │ │ │ ├── algokit:utils:typescript:code:interfaces:types_app.CoreAppCallArgs.md
│ │ │ │ │ ├── algokit:utils:typescript:code:interfaces:types_app.CreateAppParams.md
│ │ │ │ │ ├── algokit:utils:typescript:code:interfaces:types_app.RawAppCallArgs.md
│ │ │ │ │ ├── algokit:utils:typescript:code:interfaces:types_app.TealTemplateParams.md
│ │ │ │ │ ├── algokit:utils:typescript:code:interfaces:types_app.UpdateAppParams.md
│ │ │ │ │ ├── algokit:utils:typescript:code:interfaces:types_asset_manager.AssetInformation.md
│ │ │ │ │ ├── algokit:utils:typescript:code:interfaces:types_asset_manager.BulkAssetOptInOutResult.md
│ │ │ │ │ ├── algokit:utils:typescript:code:interfaces:types_asset.AssetBulkOptInOutParams.md
│ │ │ │ │ ├── algokit:utils:typescript:code:interfaces:types_asset.AssetOptInParams.md
│ │ │ │ │ ├── algokit:utils:typescript:code:interfaces:types_asset.AssetOptOutParams.md
│ │ │ │ │ ├── algokit:utils:typescript:code:interfaces:types_asset.CreateAssetParams.md
│ │ │ │ │ ├── algokit:utils:typescript:code:interfaces:types_client_manager.AlgoSdkClients.md
│ │ │ │ │ ├── algokit:utils:typescript:code:interfaces:types_client_manager.TypedAppClient.md
│ │ │ │ │ ├── algokit:utils:typescript:code:interfaces:types_client_manager.TypedAppFactory.md
│ │ │ │ │ ├── algokit:utils:typescript:code:interfaces:types_composer.BuiltTransactions.md
│ │ │ │ │ ├── algokit:utils:typescript:code:interfaces:types_config.Config.md
│ │ │ │ │ ├── algokit:utils:typescript:code:interfaces:types_debugging.AVMTracesEventData.md
│ │ │ │ │ ├── algokit:utils:typescript:code:interfaces:types_debugging.TealSourceDebugEventData.md
│ │ │ │ │ ├── algokit:utils:typescript:code:interfaces:types_debugging.TealSourcesDebugEventData.md
│ │ │ │ │ ├── algokit:utils:typescript:code:interfaces:types_dispenser_client.DispenserFundResponse.md
│ │ │ │ │ ├── algokit:utils:typescript:code:interfaces:types_dispenser_client.DispenserLimitResponse.md
│ │ │ │ │ ├── algokit:utils:typescript:code:interfaces:types_dispenser_client.TestNetDispenserApiClientParams.md
│ │ │ │ │ ├── algokit:utils:typescript:code:interfaces:types_indexer.LookupAssetHoldingsOptions.md
│ │ │ │ │ ├── algokit:utils:typescript:code:interfaces:types_logic_error.LogicErrorDetails.md
│ │ │ │ │ ├── algokit:utils:typescript:code:interfaces:types_network_client.AlgoClientConfig.md
│ │ │ │ │ ├── algokit:utils:typescript:code:interfaces:types_network_client.AlgoConfig.md
│ │ │ │ │ ├── algokit:utils:typescript:code:interfaces:types_network_client.NetworkDetails.md
│ │ │ │ │ ├── algokit:utils:typescript:code:interfaces:types_testing.AlgoKitLogCaptureFixture.md
│ │ │ │ │ ├── algokit:utils:typescript:code:interfaces:types_testing.AlgorandFixture.md
│ │ │ │ │ ├── algokit:utils:typescript:code:interfaces:types_testing.AlgorandFixtureConfig.md
│ │ │ │ │ ├── algokit:utils:typescript:code:interfaces:types_testing.AlgorandTestAutomationContext.md
│ │ │ │ │ ├── algokit:utils:typescript:code:interfaces:types_testing.GetTestAccountParams.md
│ │ │ │ │ ├── algokit:utils:typescript:code:interfaces:types_testing.LogSnapshotConfig.md
│ │ │ │ │ ├── algokit:utils:typescript:code:interfaces:types_transaction.AtomicTransactionComposerToSend.md
│ │ │ │ │ ├── algokit:utils:typescript:code:interfaces:types_transaction.ConfirmedTransactionResult.md
│ │ │ │ │ ├── algokit:utils:typescript:code:interfaces:types_transaction.ConfirmedTransactionResults.md
│ │ │ │ │ ├── algokit:utils:typescript:code:interfaces:types_transaction.SendAtomicTransactionComposerResults.md
│ │ │ │ │ ├── algokit:utils:typescript:code:interfaces:types_transaction.SendParams.md
│ │ │ │ │ ├── algokit:utils:typescript:code:interfaces:types_transaction.SendTransactionParams.md
│ │ │ │ │ ├── algokit:utils:typescript:code:interfaces:types_transaction.SendTransactionResult.md
│ │ │ │ │ ├── algokit:utils:typescript:code:interfaces:types_transaction.SendTransactionResults.md
│ │ │ │ │ ├── algokit:utils:typescript:code:interfaces:types_transaction.TransactionGroupToSend.md
│ │ │ │ │ ├── algokit:utils:typescript:code:interfaces:types_transaction.TransactionToSign.md
│ │ │ │ │ ├── algokit:utils:typescript:code:interfaces:types_transfer.AlgoRekeyParams.md
│ │ │ │ │ ├── algokit:utils:typescript:code:interfaces:types_transfer.AlgoTransferParams.md
│ │ │ │ │ ├── algokit:utils:typescript:code:interfaces:types_transfer.EnsureFundedParams.md
│ │ │ │ │ ├── algokit:utils:typescript:code:interfaces:types_transfer.EnsureFundedReturnType.md
│ │ │ │ │ ├── algokit:utils:typescript:code:interfaces:types_transfer.TransferAssetParams.md
│ │ │ │ │ ├── algokit:utils:typescript:code:modules:index.indexer.md
│ │ │ │ │ ├── algokit:utils:typescript:code:modules:index.md
│ │ │ │ │ ├── algokit:utils:typescript:code:modules:testing.md
│ │ │ │ │ ├── algokit:utils:typescript:code:modules:types_account_manager_spec.md
│ │ │ │ │ ├── algokit:utils:typescript:code:modules:types_account_manager.md
│ │ │ │ │ ├── algokit:utils:typescript:code:modules:types_account.md
│ │ │ │ │ ├── algokit:utils:typescript:code:modules:types_algo_http_client_with_retry.md
│ │ │ │ │ ├── algokit:utils:typescript:code:modules:types_algorand_client_asset_spec.md
│ │ │ │ │ ├── algokit:utils:typescript:code:modules:types_algorand_client_interface.md
│ │ │ │ │ ├── algokit:utils:typescript:code:modules:types_algorand_client_spec.md
│ │ │ │ │ ├── algokit:utils:typescript:code:modules:types_algorand_client_transaction_creator.md
│ │ │ │ │ ├── algokit:utils:typescript:code:modules:types_algorand_client_transaction_sender.md
│ │ │ │ │ ├── algokit:utils:typescript:code:modules:types_algorand_client_transfer_spec.md
│ │ │ │ │ ├── algokit:utils:typescript:code:modules:types_algorand_client.md
│ │ │ │ │ ├── algokit:utils:typescript:code:modules:types_amount_spec.md
│ │ │ │ │ ├── algokit:utils:typescript:code:modules:types_amount.md
│ │ │ │ │ ├── algokit:utils:typescript:code:modules:types_app_arc56.md
│ │ │ │ │ ├── algokit:utils:typescript:code:modules:types_app_client_spec.md
│ │ │ │ │ ├── algokit:utils:typescript:code:modules:types_app_client.md
│ │ │ │ │ ├── algokit:utils:typescript:code:modules:types_app_deployer.md
│ │ │ │ │ ├── algokit:utils:typescript:code:modules:types_app_factory_and_client_spec.md
│ │ │ │ │ ├── algokit:utils:typescript:code:modules:types_app_factory.md
│ │ │ │ │ ├── algokit:utils:typescript:code:modules:types_app_manager.md
│ │ │ │ │ ├── algokit:utils:typescript:code:modules:types_app_spec.md
│ │ │ │ │ ├── algokit:utils:typescript:code:modules:types_app.md
│ │ │ │ │ ├── algokit:utils:typescript:code:modules:types_asset_manager.md
│ │ │ │ │ ├── algokit:utils:typescript:code:modules:types_asset.md
│ │ │ │ │ ├── algokit:utils:typescript:code:modules:types_async_event_emitter_spec.md
│ │ │ │ │ ├── algokit:utils:typescript:code:modules:types_async_event_emitter.md
│ │ │ │ │ ├── algokit:utils:typescript:code:modules:types_client_manager_spec.md
│ │ │ │ │ ├── algokit:utils:typescript:code:modules:types_client_manager.md
│ │ │ │ │ ├── algokit:utils:typescript:code:modules:types_composer.md
│ │ │ │ │ ├── algokit:utils:typescript:code:modules:types_config.md
│ │ │ │ │ ├── algokit:utils:typescript:code:modules:types_debugging.md
│ │ │ │ │ ├── algokit:utils:typescript:code:modules:types_dispenser_client_spec.md
│ │ │ │ │ ├── algokit:utils:typescript:code:modules:types_dispenser_client.md
│ │ │ │ │ ├── algokit:utils:typescript:code:modules:types_expand.md
│ │ │ │ │ ├── algokit:utils:typescript:code:modules:types_indexer.md
│ │ │ │ │ ├── algokit:utils:typescript:code:modules:types_kmd_account_manager.md
│ │ │ │ │ ├── algokit:utils:typescript:code:modules:types_lifecycle_events.md
│ │ │ │ │ ├── algokit:utils:typescript:code:modules:types_logging.md
│ │ │ │ │ ├── algokit:utils:typescript:code:modules:types_logic_error.md
│ │ │ │ │ ├── algokit:utils:typescript:code:modules:types_network_client.md
│ │ │ │ │ ├── algokit:utils:typescript:code:modules:types_testing.md
│ │ │ │ │ ├── algokit:utils:typescript:code:modules:types_transaction.md
│ │ │ │ │ ├── algokit:utils:typescript:code:modules:types_transfer.md
│ │ │ │ │ ├── algokit:utils:typescript:code:README.md
│ │ │ │ │ ├── algokit:utils:typescript:README.md
│ │ │ │ │ ├── algokit:utils:typescript:v7-migration.md
│ │ │ │ │ ├── algokit:utils:typescript:v8-migration.md
│ │ │ │ │ ├── ARCs:ARC-template.md
│ │ │ │ │ ├── ARCs:assets:arc-0012:README.md
│ │ │ │ │ ├── ARCs:assets:arc-0034:TemplateForm.md
│ │ │ │ │ ├── ARCs:assets:arc-0062:README.md
│ │ │ │ │ ├── ARCs:pages:nfts.md
│ │ │ │ │ ├── ARCs:pages:wallets.md
│ │ │ │ │ ├── ARCs:README.md
│ │ │ │ │ ├── ARCs:specs:arc-0000.md
│ │ │ │ │ ├── ARCs:specs:arc-0001.md
│ │ │ │ │ ├── ARCs:specs:arc-0002.md
│ │ │ │ │ ├── ARCs:specs:arc-0003.md
│ │ │ │ │ ├── ARCs:specs:arc-0004.md
│ │ │ │ │ ├── ARCs:specs:arc-0005.md
│ │ │ │ │ ├── ARCs:specs:arc-0006.md
│ │ │ │ │ ├── ARCs:specs:arc-0007.md
│ │ │ │ │ ├── ARCs:specs:arc-0008.md
│ │ │ │ │ ├── ARCs:specs:arc-0009.md
│ │ │ │ │ ├── ARCs:specs:arc-0010.md
│ │ │ │ │ ├── ARCs:specs:arc-0011.md
│ │ │ │ │ ├── ARCs:specs:arc-0012.md
│ │ │ │ │ ├── ARCs:specs:arc-0015.md
│ │ │ │ │ ├── ARCs:specs:arc-0016.md
│ │ │ │ │ ├── ARCs:specs:arc-0018.md
│ │ │ │ │ ├── ARCs:specs:arc-0019.md
│ │ │ │ │ ├── ARCs:specs:arc-0020.md
│ │ │ │ │ ├── ARCs:specs:arc-0021.md
│ │ │ │ │ ├── ARCs:specs:arc-0022.md
│ │ │ │ │ ├── ARCs:specs:arc-0023.md
│ │ │ │ │ ├── ARCs:specs:arc-0025.md
│ │ │ │ │ ├── ARCs:specs:arc-0026.md
│ │ │ │ │ ├── ARCs:specs:arc-0028.md
│ │ │ │ │ ├── ARCs:specs:arc-0032.md
│ │ │ │ │ ├── ARCs:specs:arc-0033.md
│ │ │ │ │ ├── ARCs:specs:arc-0034.md
│ │ │ │ │ ├── ARCs:specs:arc-0035.md
│ │ │ │ │ ├── ARCs:specs:arc-0036.md
│ │ │ │ │ ├── ARCs:specs:arc-0042.md
│ │ │ │ │ ├── ARCs:specs:arc-0047.md
│ │ │ │ │ ├── ARCs:specs:arc-0048.md
│ │ │ │ │ ├── ARCs:specs:arc-0049.md
│ │ │ │ │ ├── ARCs:specs:arc-0054.md
│ │ │ │ │ ├── ARCs:specs:arc-0055.md
│ │ │ │ │ ├── ARCs:specs:arc-0056.md
│ │ │ │ │ ├── ARCs:specs:arc-0059.md
│ │ │ │ │ ├── ARCs:specs:arc-0062.md
│ │ │ │ │ ├── ARCs:specs:arc-0065.md
│ │ │ │ │ ├── ARCs:specs:arc-0069.md
│ │ │ │ │ ├── ARCs:specs:arc-0072.md
│ │ │ │ │ ├── ARCs:specs:arc-0073.md
│ │ │ │ │ ├── ARCs:specs:arc-0074.md
│ │ │ │ │ ├── ARCs:specs:arc-0076.md
│ │ │ │ │ ├── ARCs:specs:arc-0078.md
│ │ │ │ │ ├── ARCs:specs:arc-0079.md
│ │ │ │ │ ├── ARCs:specs:arc-0200.md
│ │ │ │ │ ├── clis_index.md
│ │ │ │ │ ├── developer:docs:about.md
│ │ │ │ │ ├── developer:docs:clis:algokey:algokey.md
│ │ │ │ │ ├── developer:docs:clis:algokey:generate.md
│ │ │ │ │ ├── developer:docs:clis:algokey:import.md
│ │ │ │ │ ├── developer:docs:clis:algokey:multisig:append-auth-addr.md
│ │ │ │ │ ├── developer:docs:clis:algokey:multisig:multisig.md
│ │ │ │ │ ├── developer:docs:clis:algokey:part:info.md
│ │ │ │ │ ├── developer:docs:clis:algokey:part:part.md
│ │ │ │ │ ├── developer:docs:clis:algokey:part:reparent.md
│ │ │ │ │ ├── developer:docs:clis:algokey:sign.md
│ │ │ │ │ ├── developer:docs:clis:conduit:conduit.md
│ │ │ │ │ ├── developer:docs:clis:conduit:init.md
│ │ │ │ │ ├── developer:docs:clis:conduit:list:exporters.md
│ │ │ │ │ ├── developer:docs:clis:conduit:list:importers.md
│ │ │ │ │ ├── developer:docs:clis:conduit:list:list.md
│ │ │ │ │ ├── developer:docs:clis:conduit:list:processors.md
│ │ │ │ │ ├── developer:docs:clis:diagcfg:diagcfg.md
│ │ │ │ │ ├── developer:docs:clis:diagcfg:metric:disable.md
│ │ │ │ │ ├── developer:docs:clis:diagcfg:metric:enable.md
│ │ │ │ │ ├── developer:docs:clis:diagcfg:metric:metric.md
│ │ │ │ │ ├── developer:docs:clis:diagcfg:metric:status.md
│ │ │ │ │ ├── developer:docs:clis:diagcfg:telemetry:disable.md
│ │ │ │ │ ├── developer:docs:clis:diagcfg:telemetry:enable.md
│ │ │ │ │ ├── developer:docs:clis:diagcfg:telemetry:endpoint.md
│ │ │ │ │ ├── developer:docs:clis:diagcfg:telemetry:name.md
│ │ │ │ │ ├── developer:docs:clis:diagcfg:telemetry:status.md
│ │ │ │ │ ├── developer:docs:clis:diagcfg:telemetry:telemetry.md
│ │ │ │ │ ├── developer:docs:clis:goal:node:restart.md
│ │ │ │ │ ├── developer:docs:clis:goal:node:start.md
│ │ │ │ │ ├── developer:docs:clis:goal:node:status.md
│ │ │ │ │ ├── developer:docs:clis:goal:node:stop.md
│ │ │ │ │ ├── developer:docs:clis:goal:node:wait.md
│ │ │ │ │ ├── developer:docs:clis:goal:protocols.md
│ │ │ │ │ ├── developer:docs:clis:goal:report.md
│ │ │ │ │ ├── developer:docs:clis:goal:version.md
│ │ │ │ │ ├── developer:docs:clis:goal:wallet:list.md
│ │ │ │ │ ├── developer:docs:clis:goal:wallet:new.md
│ │ │ │ │ ├── developer:docs:clis:goal:wallet:wallet.md
│ │ │ │ │ ├── developer:docs:clis:indexer:api-config.md
│ │ │ │ │ ├── developer:docs:clis:indexer:daemon.md
│ │ │ │ │ ├── developer:docs:clis:indexer:indexer.md
│ │ │ │ │ ├── developer:docs:clis:indexer:util:util.md
│ │ │ │ │ ├── developer:docs:clis:indexer:util:validator.md
│ │ │ │ │ ├── developer:docs:clis:kmd.md
│ │ │ │ │ ├── developer:docs:clis:tealdbg:debug.md
│ │ │ │ │ ├── developer:docs:clis:tealdbg:remote.md
│ │ │ │ │ ├── developer:docs:clis:tealdbg:tealdbg.md
│ │ │ │ │ ├── developer:docs:details:accounts:create.md
│ │ │ │ │ ├── developer:docs:details:accounts:index.md
│ │ │ │ │ ├── developer:docs:details:accounts:rekey.md
│ │ │ │ │ ├── developer:docs:details:algorand_consensus.md
│ │ │ │ │ ├── developer:docs:details:algorand-networks:betanet.md
│ │ │ │ │ ├── developer:docs:details:algorand-networks:index.md
│ │ │ │ │ ├── developer:docs:details:algorand-networks:mainnet.md
│ │ │ │ │ ├── developer:docs:details:algorand-networks:testnet.md
│ │ │ │ │ ├── developer:docs:details:asa.md
│ │ │ │ │ ├── developer:docs:details:atc.md
│ │ │ │ │ ├── developer:docs:details:atomic_transfers.md
│ │ │ │ │ ├── developer:docs:details:conduit.md
│ │ │ │ │ ├── developer:docs:details:crust.md
│ │ │ │ │ ├── developer:docs:details:dapps:avm:index.md
│ │ │ │ │ ├── developer:docs:details:dapps:avm:teal:guidelines.md
│ │ │ │ │ ├── developer:docs:details:dapps:avm:teal:index.md
│ │ │ │ │ ├── developer:docs:details:dapps:avm:teal:jsonspec.md
│ │ │ │ │ ├── developer:docs:details:dapps:avm:teal:opcodes:index.md
│ │ │ │ │ ├── developer:docs:details:dapps:avm:teal:opcodes:v1.md
│ │ │ │ │ ├── developer:docs:details:dapps:avm:teal:opcodes:v10.md
│ │ │ │ │ ├── developer:docs:details:dapps:avm:teal:opcodes:v2.md
│ │ │ │ │ ├── developer:docs:details:dapps:avm:teal:opcodes:v3.md
│ │ │ │ │ ├── developer:docs:details:dapps:avm:teal:opcodes:v4.md
│ │ │ │ │ ├── developer:docs:details:dapps:avm:teal:opcodes:v5.md
│ │ │ │ │ ├── developer:docs:details:dapps:avm:teal:opcodes:v6.md
│ │ │ │ │ ├── developer:docs:details:dapps:avm:teal:opcodes:v7.md
│ │ │ │ │ ├── developer:docs:details:dapps:avm:teal:opcodes:v8.md
│ │ │ │ │ ├── developer:docs:details:dapps:avm:teal:opcodes:v9.md
│ │ │ │ │ ├── developer:docs:details:dapps:avm:teal:specification.md
│ │ │ │ │ ├── developer:docs:details:dapps:smart-contracts:ABI:index.md
│ │ │ │ │ ├── developer:docs:details:dapps:smart-contracts:apps:create.md
│ │ │ │ │ ├── developer:docs:details:dapps:smart-contracts:apps:index.md
│ │ │ │ │ ├── developer:docs:details:dapps:smart-contracts:apps:innertx.md
│ │ │ │ │ ├── developer:docs:details:dapps:smart-contracts:apps:state.md
│ │ │ │ │ ├── developer:docs:details:dapps:smart-contracts:apps:txs.md
│ │ │ │ │ ├── developer:docs:details:dapps:smart-contracts:debugging.md
│ │ │ │ │ ├── developer:docs:details:dapps:smart-contracts:frontend:apps.md
│ │ │ │ │ ├── developer:docs:details:dapps:smart-contracts:frontend:smartsigs.md
│ │ │ │ │ ├── developer:docs:details:dapps:smart-contracts:guidelines.md
│ │ │ │ │ ├── developer:docs:details:dapps:smart-contracts:index.md
│ │ │ │ │ ├── developer:docs:details:dapps:smart-contracts:smartsigs:index.md
│ │ │ │ │ ├── developer:docs:details:dapps:smart-contracts:smartsigs:modes.md
│ │ │ │ │ ├── developer:docs:details:dapps:smart-contracts:smartsigs:walkthrough.md
│ │ │ │ │ ├── developer:docs:details:dapps:writing-contracts:beaker.md
│ │ │ │ │ ├── developer:docs:details:dapps:writing-contracts:pyteal.md
│ │ │ │ │ ├── developer:docs:details:dapps:writing-contracts:python.md
│ │ │ │ │ ├── developer:docs:details:encoding.md
│ │ │ │ │ ├── developer:docs:details:ethereum_to_algorand.md
│ │ │ │ │ ├── developer:docs:details:index.md
│ │ │ │ │ ├── developer:docs:details:indexer.md
│ │ │ │ │ ├── developer:docs:details:parameter_tables.md
│ │ │ │ │ ├── developer:docs:details:stateproofs:index.md
│ │ │ │ │ ├── developer:docs:details:stateproofs:light_client.md
│ │ │ │ │ ├── developer:docs:details:technical_faq.md
│ │ │ │ │ ├── developer:docs:details:transactions:index.md
│ │ │ │ │ ├── developer:docs:details:transactions:offline_transactions.md
│ │ │ │ │ ├── developer:docs:details:transactions:payment_prompts.md
│ │ │ │ │ ├── developer:docs:details:transactions:signatures.md
│ │ │ │ │ ├── developer:docs:details:transactions:transactions.md
│ │ │ │ │ ├── developer:docs:details:useful_resources.md
│ │ │ │ │ ├── developer:docs:get-started:algokit.md
│ │ │ │ │ ├── developer:docs:get-started:basics:what_is_blockchain.md
│ │ │ │ │ ├── developer:docs:get-started:basics:whats_a_dapp.md
│ │ │ │ │ ├── developer:docs:get-started:basics:where_to_start.md
│ │ │ │ │ ├── developer:docs:get-started:basics:why_algorand.md
│ │ │ │ │ ├── developer:docs:get-started:tokenization:ft.md
│ │ │ │ │ ├── developer:docs:get-started:tokenization:nft.md
│ │ │ │ │ ├── developer:docs:index.md
│ │ │ │ │ ├── developer:docs:rest-apis:algod.md
│ │ │ │ │ ├── developer:docs:rest-apis:indexer.md
│ │ │ │ │ ├── developer:docs:rest-apis:kmd.md
│ │ │ │ │ ├── developer:docs:rest-apis:restendpoints.md
│ │ │ │ │ ├── developer:docs:run-a-node:operations:catchup.md
│ │ │ │ │ ├── developer:docs:run-a-node:operations:switch_networks.md
│ │ │ │ │ ├── developer:docs:run-a-node:participate:generate_keys.md
│ │ │ │ │ ├── developer:docs:run-a-node:participate:index.md
│ │ │ │ │ ├── developer:docs:run-a-node:participate:offline.md
│ │ │ │ │ ├── developer:docs:run-a-node:participate:online.md
│ │ │ │ │ ├── developer:docs:run-a-node:participate:renew.md
│ │ │ │ │ ├── developer:docs:run-a-node:reference:artifacts.md
│ │ │ │ │ ├── developer:docs:run-a-node:reference:config.md
│ │ │ │ │ ├── developer:docs:run-a-node:reference:relay.md
│ │ │ │ │ ├── developer:docs:run-a-node:reference:telemetry-config.md
│ │ │ │ │ ├── developer:docs:run-a-node:setup:indexer.md
│ │ │ │ │ ├── developer:docs:run-a-node:setup:install.md
│ │ │ │ │ ├── developer:docs:run-a-node:setup:node-troubleshooting.md
│ │ │ │ │ ├── developer:docs:run-a-node:setup:types.md
│ │ │ │ │ ├── developer:docs:sdks:go:index.md
│ │ │ │ │ ├── developer:docs:sdks:index.md
│ │ │ │ │ ├── developer:docs:sdks:java:index.md
│ │ │ │ │ ├── developer:docs:sdks:javascript:index.md
│ │ │ │ │ ├── developer:docs:sdks:python:index.md
│ │ │ │ │ ├── developer:python:code:example:accounts.md
│ │ │ │ │ ├── developer:python:code:example:arc4_types.md
│ │ │ │ │ ├── developer:python:code:example:assets.md
│ │ │ │ │ ├── developer:python:code:example:box_storage.md
│ │ │ │ │ ├── developer:python:code:example:control_flow.md
│ │ │ │ │ ├── developer:python:code:example:crypto:merkle_tree.md
│ │ │ │ │ ├── developer:python:code:example:defi:amm.md
│ │ │ │ │ ├── developer:python:code:example:defi:auction.md
│ │ │ │ │ ├── developer:python:code:example:defi:htlc_logicsig.md
│ │ │ │ │ ├── developer:python:code:example:defi:marketplace.md
│ │ │ │ │ ├── developer:python:code:example:events:arc28_events.md
│ │ │ │ │ ├── developer:python:code:example:global_storage.md
│ │ │ │ │ ├── developer:python:code:example:governance:simple_voting.md
│ │ │ │ │ ├── developer:python:code:example:hello_world.md
│ │ │ │ │ ├── developer:python:code:example:inner_transactions.md
│ │ │ │ │ ├── developer:python:code:example:local_storage.md
│ │ │ │ │ ├── developer:python:code:example:nft:proof_of_attendance.md
│ │ │ │ │ ├── developer:python:code:example:privacy:zk_whitelist.md
│ │ │ │ │ ├── developer:python:code:example:scratch_storage.md
│ │ │ │ │ ├── developer:python:code:example:self_payment.md
│ │ │ │ │ ├── developer:python:code:example:struct_in_box.md
│ │ │ │ │ ├── developer:python:code:example:subsidize_app_call.md
│ │ │ │ │ ├── developer:python:code:example:transactions.md
│ │ │ │ │ ├── developer:python:code:example:utility:calculator.md
│ │ │ │ │ ├── devportal-code-examples:projects:python-contract-examples:README.md
│ │ │ │ │ ├── devportal-code-examples:README.md
│ │ │ │ │ ├── docs:.walletconnect:index.md
│ │ │ │ │ ├── docs:.walletconnect:walletconnect-schema.md
│ │ │ │ │ ├── docs:README.md
│ │ │ │ │ ├── docs:scripts:example_tracker:example_list.md
│ │ │ │ │ ├── docs:scripts:README.md
│ │ │ │ │ ├── index.md
│ │ │ │ │ ├── liquid_auth_index.md
│ │ │ │ │ ├── liquid-auth:ARCHITECTURE.md
│ │ │ │ │ ├── liquid-auth:decisions:1-Service-Authentication.md
│ │ │ │ │ ├── liquid-auth:decisions:2-Bidirectional-Communication.md
│ │ │ │ │ ├── liquid-auth:decisions:3-Peer-to-Peer-Signaling.md
│ │ │ │ │ ├── liquid-auth:decisions:4-Fido-Extension.md
│ │ │ │ │ ├── liquid-auth:decisions:README.md
│ │ │ │ │ ├── liquid-auth:docs:architecture.md
│ │ │ │ │ ├── liquid-auth:docs:clients:android:provider-service:authenticate.md
│ │ │ │ │ ├── liquid-auth:docs:clients:android:provider-service:register.md
│ │ │ │ │ ├── liquid-auth:docs:clients:browser:authentication.md
│ │ │ │ │ ├── liquid-auth:docs:clients:browser:example.md
│ │ │ │ │ ├── liquid-auth:docs:introduction.md
│ │ │ │ │ ├── liquid-auth:docs:README.md
│ │ │ │ │ ├── liquid-auth:docs:server:environment-variables.md
│ │ │ │ │ ├── liquid-auth:docs:server:integrations.md
│ │ │ │ │ ├── liquid-auth:docs:server:introduction.md
│ │ │ │ │ ├── liquid-auth:docs:server:running-locally.md
│ │ │ │ │ ├── liquid-auth:README.md
│ │ │ │ │ ├── liquid-auth:SEQUENCE.md
│ │ │ │ │ ├── liquid-auth:services:liquid-auth-api-js:src:assertion:assertion.controller.post.request.md
│ │ │ │ │ ├── liquid-auth:services:liquid-auth-api-js:src:assertion:assertion.controller.post.response.md
│ │ │ │ │ ├── liquid-auth:services:liquid-auth-api-js:src:attestation:attestation.controller.post.request.md
│ │ │ │ │ ├── liquid-auth:services:liquid-auth-api-js:src:auth:auth.controller.get.user.md
│ │ │ │ │ ├── liquid-auth:sites:express-dapp:README.md
│ │ │ │ │ ├── liquid-auth:VISION.md
│ │ │ │ │ ├── puya_index.md
│ │ │ │ │ ├── puya:docs:algopy_testing:index.md
│ │ │ │ │ ├── puya:docs:api-algopy.arc4.md
│ │ │ │ │ ├── puya:docs:api-algopy.gtxn.md
│ │ │ │ │ ├── puya:docs:api-algopy.itxn.md
│ │ │ │ │ ├── puya:docs:api-algopy.md
│ │ │ │ │ ├── puya:docs:api-algopy.op.md
│ │ │ │ │ ├── puya:docs:api.md
│ │ │ │ │ ├── puya:docs:compiler.md
│ │ │ │ │ ├── puya:docs:index.md
│ │ │ │ │ ├── puya:docs:language-guide.md
│ │ │ │ │ ├── puya:docs:lg-arc28.md
│ │ │ │ │ ├── puya:docs:lg-arc4.md
│ │ │ │ │ ├── puya:docs:lg-builtins.md
│ │ │ │ │ ├── puya:docs:lg-calling-apps.md
│ │ │ │ │ ├── puya:docs:lg-compile.md
│ │ │ │ │ ├── puya:docs:lg-control.md
│ │ │ │ │ ├── puya:docs:lg-errors.md
│ │ │ │ │ ├── puya:docs:lg-logs.md
│ │ │ │ │ ├── puya:docs:lg-modules.md
│ │ │ │ │ ├── puya:docs:lg-opcode-budget.md
│ │ │ │ │ ├── puya:docs:lg-ops.md
│ │ │ │ │ ├── puya:docs:lg-storage.md
│ │ │ │ │ ├── puya:docs:lg-structure.md
│ │ │ │ │ ├── puya:docs:lg-transactions.md
│ │ │ │ │ ├── puya:docs:lg-types.md
│ │ │ │ │ ├── puya:docs:lg-unsupported-python-features.md
│ │ │ │ │ ├── puya:docs:principles.md
│ │ │ │ │ ├── puya:examples:auction:README.md
│ │ │ │ │ ├── puya:python:testing:docs:algopy.md
│ │ │ │ │ ├── puya:python:testing:docs:api.md
│ │ │ │ │ ├── puya:python:testing:docs:coverage.md
│ │ │ │ │ ├── puya:python:testing:docs:examples.md
│ │ │ │ │ ├── puya:python:testing:docs:faq.md
│ │ │ │ │ ├── puya:python:testing:docs:index.md
│ │ │ │ │ ├── puya:python:testing:docs:testing-guide:arc4-types.md
│ │ │ │ │ ├── puya:python:testing:docs:testing-guide:avm-types.md
│ │ │ │ │ ├── puya:python:testing:docs:testing-guide:concepts.md
│ │ │ │ │ ├── puya:python:testing:docs:testing-guide:contract-testing.md
│ │ │ │ │ ├── puya:python:testing:docs:testing-guide:index.md
│ │ │ │ │ ├── puya:python:testing:docs:testing-guide:opcodes.md
│ │ │ │ │ ├── puya:python:testing:docs:testing-guide:signature-testing.md
│ │ │ │ │ ├── puya:python:testing:docs:testing-guide:state-management.md
│ │ │ │ │ ├── puya:python:testing:docs:testing-guide:subroutines.md
│ │ │ │ │ ├── puya:python:testing:docs:testing-guide:transactions.md
│ │ │ │ │ ├── puya:python:testing:examples:README.md
│ │ │ │ │ ├── puya:python:testing:README.md
│ │ │ │ │ ├── puya:README.md
│ │ │ │ │ ├── puya:src:puya:ARCHITECTURE.md
│ │ │ │ │ ├── puya:src:puyapy:_typeshed:README.md
│ │ │ │ │ ├── puya:src:puyapy:_vendor:mypy:typeshed:stdlib:_typeshed:README.md
│ │ │ │ │ ├── puya:src:puyapy:awst_build:README.md
│ │ │ │ │ ├── puya:stubs:README.md
│ │ │ │ │ ├── puya:tests:test_expected_output:README.md
│ │ │ │ │ ├── puya:typescript:docs:architecture-decisions:2024-05-21_primitive-bytes-and-strings.md
│ │ │ │ │ ├── puya:typescript:docs:architecture-decisions:2024-05-21_primitive-integer-types.md
│ │ │ │ │ ├── puya:typescript:docs:README.md
│ │ │ │ │ ├── puya:typescript:packages:algo-ts:readme.md
│ │ │ │ │ ├── puya:typescript:README.md
│ │ │ │ │ ├── SDKs:javascript:classes:ABIAddressType.md
│ │ │ │ │ ├── SDKs:javascript:classes:ABIArrayDynamicType.md
│ │ │ │ │ ├── SDKs:javascript:classes:ABIArrayStaticType.md
│ │ │ │ │ ├── SDKs:javascript:classes:ABIBoolType.md
│ │ │ │ │ ├── SDKs:javascript:classes:ABIByteType.md
│ │ │ │ │ ├── SDKs:javascript:classes:ABIContract.md
│ │ │ │ │ ├── SDKs:javascript:classes:ABIInterface.md
│ │ │ │ │ ├── SDKs:javascript:classes:ABIMethod.md
│ │ │ │ │ ├── SDKs:javascript:classes:ABIStringType.md
│ │ │ │ │ ├── SDKs:javascript:classes:ABITupleType.md
│ │ │ │ │ ├── SDKs:javascript:classes:ABIType.md
│ │ │ │ │ ├── SDKs:javascript:classes:ABIUfixedType.md
│ │ │ │ │ ├── SDKs:javascript:classes:ABIUintType.md
│ │ │ │ │ ├── SDKs:javascript:classes:Algodv2.md
│ │ │ │ │ ├── SDKs:javascript:classes:AtomicTransactionComposer.md
│ │ │ │ │ ├── SDKs:javascript:classes:DryrunResult.md
│ │ │ │ │ ├── SDKs:javascript:classes:Indexer.md
│ │ │ │ │ ├── SDKs:javascript:classes:indexerModels.Account.md
│ │ │ │ │ ├── SDKs:javascript:classes:indexerModels.AccountParticipation.md
│ │ │ │ │ ├── SDKs:javascript:classes:indexerModels.AccountResponse.md
│ │ │ │ │ ├── SDKs:javascript:classes:indexerModels.AccountsResponse.md
│ │ │ │ │ ├── SDKs:javascript:classes:indexerModels.AccountStateDelta.md
│ │ │ │ │ ├── SDKs:javascript:classes:indexerModels.Application.md
│ │ │ │ │ ├── SDKs:javascript:classes:indexerModels.ApplicationLocalState.md
│ │ │ │ │ ├── SDKs:javascript:classes:indexerModels.ApplicationLocalStatesResponse.md
│ │ │ │ │ ├── SDKs:javascript:classes:indexerModels.ApplicationLogData.md
│ │ │ │ │ ├── SDKs:javascript:classes:indexerModels.ApplicationLogsResponse.md
│ │ │ │ │ ├── SDKs:javascript:classes:indexerModels.ApplicationParams.md
│ │ │ │ │ ├── SDKs:javascript:classes:indexerModels.ApplicationResponse.md
│ │ │ │ │ ├── SDKs:javascript:classes:indexerModels.ApplicationsResponse.md
│ │ │ │ │ ├── SDKs:javascript:classes:indexerModels.ApplicationStateSchema.md
│ │ │ │ │ ├── SDKs:javascript:classes:indexerModels.Asset.md
│ │ │ │ │ ├── SDKs:javascript:classes:indexerModels.AssetBalancesResponse.md
│ │ │ │ │ ├── SDKs:javascript:classes:indexerModels.AssetHolding.md
│ │ │ │ │ ├── SDKs:javascript:classes:indexerModels.AssetHoldingsResponse.md
│ │ │ │ │ ├── SDKs:javascript:classes:indexerModels.AssetParams.md
│ │ │ │ │ ├── SDKs:javascript:classes:indexerModels.AssetResponse.md
│ │ │ │ │ ├── SDKs:javascript:classes:indexerModels.AssetsResponse.md
│ │ │ │ │ ├── SDKs:javascript:classes:indexerModels.Block.md
│ │ │ │ │ ├── SDKs:javascript:classes:indexerModels.BlockRewards.md
│ │ │ │ │ ├── SDKs:javascript:classes:indexerModels.BlockUpgradeState.md
│ │ │ │ │ ├── SDKs:javascript:classes:indexerModels.BlockUpgradeVote.md
│ │ │ │ │ ├── SDKs:javascript:classes:indexerModels.Box.md
│ │ │ │ │ ├── SDKs:javascript:classes:indexerModels.BoxDescriptor.md
│ │ │ │ │ ├── SDKs:javascript:classes:indexerModels.BoxesResponse.md
│ │ │ │ │ ├── SDKs:javascript:classes:indexerModels.ErrorResponse.md
│ │ │ │ │ ├── SDKs:javascript:classes:indexerModels.EvalDelta.md
│ │ │ │ │ ├── SDKs:javascript:classes:indexerModels.EvalDeltaKeyValue.md
│ │ │ │ │ ├── SDKs:javascript:classes:indexerModels.HashFactory.md
│ │ │ │ │ ├── SDKs:javascript:classes:indexerModels.HealthCheck.md
│ │ │ │ │ ├── SDKs:javascript:classes:indexerModels.IndexerStateProofMessage.md
│ │ │ │ │ ├── SDKs:javascript:classes:indexerModels.MerkleArrayProof.md
│ │ │ │ │ ├── SDKs:javascript:classes:indexerModels.MiniAssetHolding.md
│ │ │ │ │ ├── SDKs:javascript:classes:indexerModels.ParticipationUpdates.md
│ │ │ │ │ ├── SDKs:javascript:classes:indexerModels.StateProofFields.md
│ │ │ │ │ ├── SDKs:javascript:classes:indexerModels.StateProofParticipant.md
│ │ │ │ │ ├── SDKs:javascript:classes:indexerModels.StateProofReveal.md
│ │ │ │ │ ├── SDKs:javascript:classes:indexerModels.StateProofSignature.md
│ │ │ │ │ ├── SDKs:javascript:classes:indexerModels.StateProofSigSlot.md
│ │ │ │ │ ├── SDKs:javascript:classes:indexerModels.StateProofTracking.md
│ │ │ │ │ ├── SDKs:javascript:classes:indexerModels.StateProofVerifier.md
│ │ │ │ │ ├── SDKs:javascript:classes:indexerModels.StateSchema.md
│ │ │ │ │ ├── SDKs:javascript:classes:indexerModels.TealKeyValue.md
│ │ │ │ │ ├── SDKs:javascript:classes:indexerModels.TealValue.md
│ │ │ │ │ ├── SDKs:javascript:classes:indexerModels.Transaction.md
│ │ │ │ │ ├── SDKs:javascript:classes:indexerModels.TransactionApplication.md
│ │ │ │ │ ├── SDKs:javascript:classes:indexerModels.TransactionAssetConfig.md
│ │ │ │ │ ├── SDKs:javascript:classes:indexerModels.TransactionAssetFreeze.md
│ │ │ │ │ ├── SDKs:javascript:classes:indexerModels.TransactionAssetTransfer.md
│ │ │ │ │ ├── SDKs:javascript:classes:indexerModels.TransactionKeyreg.md
│ │ │ │ │ ├── SDKs:javascript:classes:indexerModels.TransactionPayment.md
│ │ │ │ │ ├── SDKs:javascript:classes:indexerModels.TransactionResponse.md
│ │ │ │ │ ├── SDKs:javascript:classes:indexerModels.TransactionSignature.md
│ │ │ │ │ ├── SDKs:javascript:classes:indexerModels.TransactionSignatureLogicsig.md
│ │ │ │ │ ├── SDKs:javascript:classes:indexerModels.TransactionSignatureMultisig.md
│ │ │ │ │ ├── SDKs:javascript:classes:indexerModels.TransactionSignatureMultisigSubsignature.md
│ │ │ │ │ ├── SDKs:javascript:classes:indexerModels.TransactionsResponse.md
│ │ │ │ │ ├── SDKs:javascript:classes:indexerModels.TransactionStateProof.md
│ │ │ │ │ ├── SDKs:javascript:classes:Kmd.md
│ │ │ │ │ ├── SDKs:javascript:classes:LogicSig.md
│ │ │ │ │ ├── SDKs:javascript:classes:LogicSigAccount.md
│ │ │ │ │ ├── SDKs:javascript:classes:modelsv2.Account.md
│ │ │ │ │ ├── SDKs:javascript:classes:modelsv2.AccountApplicationResponse.md
│ │ │ │ │ ├── SDKs:javascript:classes:modelsv2.AccountAssetHolding.md
│ │ │ │ │ ├── SDKs:javascript:classes:modelsv2.AccountAssetResponse.md
│ │ │ │ │ ├── SDKs:javascript:classes:modelsv2.AccountAssetsInformationResponse.md
│ │ │ │ │ ├── SDKs:javascript:classes:modelsv2.AccountParticipation.md
│ │ │ │ │ ├── SDKs:javascript:classes:modelsv2.AccountStateDelta.md
│ │ │ │ │ ├── SDKs:javascript:classes:modelsv2.AppCallLogs.md
│ │ │ │ │ ├── SDKs:javascript:classes:modelsv2.Application.md
│ │ │ │ │ ├── SDKs:javascript:classes:modelsv2.ApplicationInitialStates.md
│ │ │ │ │ ├── SDKs:javascript:classes:modelsv2.ApplicationKVStorage.md
│ │ │ │ │ ├── SDKs:javascript:classes:modelsv2.ApplicationLocalReference.md
│ │ │ │ │ ├── SDKs:javascript:classes:modelsv2.ApplicationLocalState.md
│ │ │ │ │ ├── SDKs:javascript:classes:modelsv2.ApplicationParams.md
│ │ │ │ │ ├── SDKs:javascript:classes:modelsv2.ApplicationStateOperation.md
│ │ │ │ │ ├── SDKs:javascript:classes:modelsv2.ApplicationStateSchema.md
│ │ │ │ │ ├── SDKs:javascript:classes:modelsv2.Asset.md
│ │ │ │ │ ├── SDKs:javascript:classes:modelsv2.AssetHolding.md
│ │ │ │ │ ├── SDKs:javascript:classes:modelsv2.AssetHoldingReference.md
│ │ │ │ │ ├── SDKs:javascript:classes:modelsv2.AssetParams.md
│ │ │ │ │ ├── SDKs:javascript:classes:modelsv2.AvmKeyValue.md
│ │ │ │ │ ├── SDKs:javascript:classes:modelsv2.AvmValue.md
│ │ │ │ │ ├── SDKs:javascript:classes:modelsv2.BlockHashResponse.md
│ │ │ │ │ ├── SDKs:javascript:classes:modelsv2.BlockLogsResponse.md
│ │ │ │ │ ├── SDKs:javascript:classes:modelsv2.BlockResponse.md
│ │ │ │ │ ├── SDKs:javascript:classes:modelsv2.BlockTxidsResponse.md
│ │ │ │ │ ├── SDKs:javascript:classes:modelsv2.Box.md
│ │ │ │ │ ├── SDKs:javascript:classes:modelsv2.BoxDescriptor.md
│ │ │ │ │ ├── SDKs:javascript:classes:modelsv2.BoxesResponse.md
│ │ │ │ │ ├── SDKs:javascript:classes:modelsv2.BoxReference.md
│ │ │ │ │ ├── SDKs:javascript:classes:modelsv2.BuildVersion.md
│ │ │ │ │ ├── SDKs:javascript:classes:modelsv2.CompileResponse.md
│ │ │ │ │ ├── SDKs:javascript:classes:modelsv2.DisassembleResponse.md
│ │ │ │ │ ├── SDKs:javascript:classes:modelsv2.DryrunRequest.md
│ │ │ │ │ ├── SDKs:javascript:classes:modelsv2.DryrunResponse.md
│ │ │ │ │ ├── SDKs:javascript:classes:modelsv2.DryrunSource.md
│ │ │ │ │ ├── SDKs:javascript:classes:modelsv2.DryrunState.md
│ │ │ │ │ ├── SDKs:javascript:classes:modelsv2.DryrunTxnResult.md
│ │ │ │ │ ├── SDKs:javascript:classes:modelsv2.ErrorResponse.md
│ │ │ │ │ ├── SDKs:javascript:classes:modelsv2.EvalDelta.md
│ │ │ │ │ ├── SDKs:javascript:classes:modelsv2.EvalDeltaKeyValue.md
│ │ │ │ │ ├── SDKs:javascript:classes:modelsv2.GetBlockTimeStampOffsetResponse.md
│ │ │ │ │ ├── SDKs:javascript:classes:modelsv2.GetSyncRoundResponse.md
│ │ │ │ │ ├── SDKs:javascript:classes:modelsv2.KvDelta.md
│ │ │ │ │ ├── SDKs:javascript:classes:modelsv2.LedgerStateDeltaForTransactionGroup.md
│ │ │ │ │ ├── SDKs:javascript:classes:modelsv2.LightBlockHeaderProof.md
│ │ │ │ │ ├── SDKs:javascript:classes:modelsv2.NodeStatusResponse.md
│ │ │ │ │ ├── SDKs:javascript:classes:modelsv2.PendingTransactionResponse.md
│ │ │ │ │ ├── SDKs:javascript:classes:modelsv2.PendingTransactionsResponse.md
│ │ │ │ │ ├── SDKs:javascript:classes:modelsv2.PostTransactionsResponse.md
│ │ │ │ │ ├── SDKs:javascript:classes:modelsv2.ScratchChange.md
│ │ │ │ │ ├── SDKs:javascript:classes:modelsv2.SimulateInitialStates.md
│ │ │ │ │ ├── SDKs:javascript:classes:modelsv2.SimulateRequest.md
│ │ │ │ │ ├── SDKs:javascript:classes:modelsv2.SimulateRequestTransactionGroup.md
│ │ │ │ │ ├── SDKs:javascript:classes:modelsv2.SimulateResponse.md
│ │ │ │ │ ├── SDKs:javascript:classes:modelsv2.SimulateTraceConfig.md
│ │ │ │ │ ├── SDKs:javascript:classes:modelsv2.SimulateTransactionGroupResult.md
│ │ │ │ │ ├── SDKs:javascript:classes:modelsv2.SimulateTransactionResult.md
│ │ │ │ │ ├── SDKs:javascript:classes:modelsv2.SimulateUnnamedResourcesAccessed.md
│ │ │ │ │ ├── SDKs:javascript:classes:modelsv2.SimulationEvalOverrides.md
│ │ │ │ │ ├── SDKs:javascript:classes:modelsv2.SimulationOpcodeTraceUnit.md
│ │ │ │ │ ├── SDKs:javascript:classes:modelsv2.SimulationTransactionExecTrace.md
│ │ │ │ │ ├── SDKs:javascript:classes:modelsv2.StateProof.md
│ │ │ │ │ ├── SDKs:javascript:classes:modelsv2.StateProofMessage.md
│ │ │ │ │ ├── SDKs:javascript:classes:modelsv2.SupplyResponse.md
│ │ │ │ │ ├── SDKs:javascript:classes:modelsv2.TealKeyValue.md
│ │ │ │ │ ├── SDKs:javascript:classes:modelsv2.TealValue.md
│ │ │ │ │ ├── SDKs:javascript:classes:modelsv2.TransactionGroupLedgerStateDeltasForRoundResponse.md
│ │ │ │ │ ├── SDKs:javascript:classes:modelsv2.TransactionParametersResponse.md
│ │ │ │ │ ├── SDKs:javascript:classes:modelsv2.TransactionProofResponse.md
│ │ │ │ │ ├── SDKs:javascript:classes:modelsv2.Version.md
│ │ │ │ │ ├── SDKs:javascript:classes:SourceMap.md
│ │ │ │ │ ├── SDKs:javascript:classes:Transaction.md
│ │ │ │ │ ├── SDKs:javascript:enums:ABIReferenceType.md
│ │ │ │ │ ├── SDKs:javascript:enums:ABITransactionType.md
│ │ │ │ │ ├── SDKs:javascript:enums:AtomicTransactionComposerStatus.md
│ │ │ │ │ ├── SDKs:javascript:enums:IntDecoding.md
│ │ │ │ │ ├── SDKs:javascript:enums:OnApplicationComplete.md
│ │ │ │ │ ├── SDKs:javascript:enums:TransactionType.md
│ │ │ │ │ ├── SDKs:javascript:examples:README.md
│ │ │ │ │ ├── SDKs:javascript:FAQ.md
│ │ │ │ │ ├── SDKs:javascript:interfaces:ABIContractNetworkInfo.md
│ │ │ │ │ ├── SDKs:javascript:interfaces:ABIContractNetworks.md
│ │ │ │ │ ├── SDKs:javascript:interfaces:ABIContractParams.md
│ │ │ │ │ ├── SDKs:javascript:interfaces:ABIInterfaceParams.md
│ │ │ │ │ ├── SDKs:javascript:interfaces:ABIMethodArgParams.md
│ │ │ │ │ ├── SDKs:javascript:interfaces:ABIMethodParams.md
│ │ │ │ │ ├── SDKs:javascript:interfaces:ABIMethodReturnParams.md
│ │ │ │ │ ├── SDKs:javascript:interfaces:ABIResult.md
│ │ │ │ │ ├── SDKs:javascript:interfaces:Account.md
│ │ │ │ │ ├── SDKs:javascript:interfaces:Address.md
│ │ │ │ │ ├── SDKs:javascript:interfaces:AlgodTokenHeader.md
│ │ │ │ │ ├── SDKs:javascript:interfaces:BaseHTTPClient.md
│ │ │ │ │ ├── SDKs:javascript:interfaces:BaseHTTPClientError.md
│ │ │ │ │ ├── SDKs:javascript:interfaces:BaseHTTPClientResponse.md
│ │ │ │ │ ├── SDKs:javascript:interfaces:BoxReference.md
│ │ │ │ │ ├── SDKs:javascript:interfaces:CustomTokenHeader.md
│ │ │ │ │ ├── SDKs:javascript:interfaces:EncodedAssetParams.md
│ │ │ │ │ ├── SDKs:javascript:interfaces:EncodedBoxReference.md
│ │ │ │ │ ├── SDKs:javascript:interfaces:EncodedGlobalStateSchema.md
│ │ │ │ │ ├── SDKs:javascript:interfaces:EncodedLocalStateSchema.md
│ │ │ │ │ ├── SDKs:javascript:interfaces:EncodedLogicSig.md
│ │ │ │ │ ├── SDKs:javascript:interfaces:EncodedLogicSigAccount.md
│ │ │ │ │ ├── SDKs:javascript:interfaces:EncodedMultisig.md
│ │ │ │ │ ├── SDKs:javascript:interfaces:EncodedSignedTransaction.md
│ │ │ │ │ ├── SDKs:javascript:interfaces:EncodedSubsig.md
│ │ │ │ │ ├── SDKs:javascript:interfaces:EncodedTransaction.md
│ │ │ │ │ ├── SDKs:javascript:interfaces:IndexerTokenHeader.md
│ │ │ │ │ ├── SDKs:javascript:interfaces:KMDTokenHeader.md
│ │ │ │ │ ├── SDKs:javascript:interfaces:MultisigMetadata.md
│ │ │ │ │ ├── SDKs:javascript:interfaces:SignedTransaction.md
│ │ │ │ │ ├── SDKs:javascript:interfaces:SuggestedParams.md
│ │ │ │ │ ├── SDKs:javascript:interfaces:TransactionParams.md
│ │ │ │ │ ├── SDKs:javascript:interfaces:TransactionWithSigner.md
│ │ │ │ │ ├── SDKs:javascript:modules:indexerModels.md
│ │ │ │ │ ├── SDKs:javascript:modules:modelsv2.md
│ │ │ │ │ ├── SDKs:javascript:modules.md
│ │ │ │ │ ├── SDKs:javascript:README.md
│ │ │ │ │ ├── SDKs:python:algosdk:v2client:harness:README.md
│ │ │ │ │ ├── SDKs:python:examples:README.md
│ │ │ │ │ ├── SDKs:python:README.md
│ │ │ │ │ ├── tealscript:examples_amm_README.md
│ │ │ │ │ ├── tealscript:examples_auction_README.md
│ │ │ │ │ ├── tealscript:examples_big_box_README.md
│ │ │ │ │ ├── tealscript:examples_itxns_README.md
│ │ │ │ │ ├── tealscript:examples_lsig_with_app_README.md
│ │ │ │ │ ├── tealscript:examples_reti_README.md
│ │ │ │ │ ├── tealscript:FEATURES.md
│ │ │ │ │ ├── tealscript:guides_atomic_txn.md
│ │ │ │ │ ├── tealscript:guides_features.md
│ │ │ │ │ ├── tealscript:guides_getting_started.md
│ │ │ │ │ ├── tealscript:guides_inner_transactions.md
│ │ │ │ │ ├── tealscript:guides_lifecycle.md
│ │ │ │ │ ├── tealscript:guides_math.md
│ │ │ │ │ ├── tealscript:guides_methods.md
│ │ │ │ │ ├── tealscript:guides_multiple_contracts.md
│ │ │ │ │ ├── tealscript:guides_pyteal.md
│ │ │ │ │ ├── tealscript:guides_storage.md
│ │ │ │ │ ├── tealscript:guides_Supported Types_arrays.md
│ │ │ │ │ ├── tealscript:guides_Supported Types_numbers.md
│ │ │ │ │ ├── TEALScript:README.md
│ │ │ │ │ ├── tealscript:tests_test_package_README.md
│ │ │ │ │ ├── tealscript:tutorials_Hello World_0001-intro.md
│ │ │ │ │ ├── tealscript:tutorials_Hello World_0002-init.md
│ │ │ │ │ ├── tealscript:tutorials_Hello World_0003-contract.md
│ │ │ │ │ ├── tealscript:tutorials_Hello World_0004-artifacts.md
│ │ │ │ │ ├── tealscript:tutorials_Hello World_0005-hello.md
│ │ │ │ │ └── tealscript:tutorials_Hello World_0006-test.md
│ │ │ │ └── taxonomy-categories
│ │ │ │ ├── algokit-utils.json
│ │ │ │ ├── algokit.json
│ │ │ │ ├── arcs.json
│ │ │ │ ├── clis.json
│ │ │ │ ├── details.json
│ │ │ │ ├── developers.json
│ │ │ │ ├── liquid-auth.json
│ │ │ │ ├── nodes.json
│ │ │ │ ├── puya.json
│ │ │ │ ├── python.json
│ │ │ │ ├── sdks.json
│ │ │ │ └── tealscript.json
│ │ │ └── wallet
│ │ │ └── index.ts
│ │ ├── tools
│ │ │ ├── accountManager.ts
│ │ │ ├── algodManager.ts
│ │ │ ├── apiManager
│ │ │ │ ├── algod
│ │ │ │ │ ├── account.ts
│ │ │ │ │ ├── application.ts
│ │ │ │ │ ├── asset.ts
│ │ │ │ │ ├── index.ts
│ │ │ │ │ └── transaction.ts
│ │ │ │ ├── example
│ │ │ │ │ ├── get-balance.ts
│ │ │ │ │ └── index.ts
│ │ │ │ ├── index.ts
│ │ │ │ ├── indexer
│ │ │ │ │ ├── account.ts
│ │ │ │ │ ├── application.ts
│ │ │ │ │ ├── asset.ts
│ │ │ │ │ ├── index.ts
│ │ │ │ │ └── transaction.ts
│ │ │ │ ├── nfd
│ │ │ │ │ └── index.ts
│ │ │ │ ├── tinyman
│ │ │ │ │ ├── analytics.ts
│ │ │ │ │ ├── bootstrap.ts
│ │ │ │ │ ├── index.ts
│ │ │ │ │ ├── liquidity.ts
│ │ │ │ │ ├── opt_in.ts
│ │ │ │ │ ├── pool.ts
│ │ │ │ │ ├── remove_liquidity.ts
│ │ │ │ │ └── swap.ts
│ │ │ │ ├── ultrade
│ │ │ │ │ ├── index.ts
│ │ │ │ │ ├── market.ts
│ │ │ │ │ ├── system.ts
│ │ │ │ │ └── wallet.ts
│ │ │ │ └── vestige
│ │ │ │ ├── assets.ts
│ │ │ │ ├── balances.ts
│ │ │ │ ├── index.ts
│ │ │ │ ├── networks.ts
│ │ │ │ ├── notes.ts
│ │ │ │ ├── pools.ts
│ │ │ │ ├── protocols.ts
│ │ │ │ ├── swaps.ts
│ │ │ │ └── vaults.ts
│ │ │ ├── arc26Manager.ts
│ │ │ ├── index.ts
│ │ │ ├── knowledgeManager.ts
│ │ │ ├── transactionManager
│ │ │ │ ├── accountTransactions.ts
│ │ │ │ ├── appTransactions
│ │ │ │ │ ├── callTxn.ts
│ │ │ │ │ ├── clearTxn.ts
│ │ │ │ │ ├── closeOutTxn.ts
│ │ │ │ │ ├── createTxn.ts
│ │ │ │ │ ├── deleteTxn.ts
│ │ │ │ │ ├── index.ts
│ │ │ │ │ ├── optInTxn.ts
│ │ │ │ │ ├── test
│ │ │ │ │ │ ├── counter_approval.teal
│ │ │ │ │ │ ├── counter_clear.teal
│ │ │ │ │ │ ├── storage_test_approval_v2.teal
│ │ │ │ │ │ ├── storage_test_approval.teal
│ │ │ │ │ │ └── storage_test_clear.teal
│ │ │ │ │ ├── types.ts
│ │ │ │ │ └── updateTxn.ts
│ │ │ │ ├── assetTransactions.ts
│ │ │ │ ├── generalTransaction.ts
│ │ │ │ └── index.ts
│ │ │ └── utilityManager.ts
│ │ ├── types.ts
│ │ └── utils
│ │ └── responseProcessor.ts
│ ├── tests
│ │ ├── resources
│ │ │ ├── algod
│ │ │ │ ├── account.test.ts
│ │ │ │ ├── application.test.ts
│ │ │ │ ├── asset.test.ts
│ │ │ │ └── transaction.test.ts
│ │ │ └── indexer
│ │ │ ├── account.test.ts
│ │ │ ├── application.test.ts
│ │ │ ├── asset.test.ts
│ │ │ └── transaction.test.ts
│ │ └── tools
│ │ ├── accountManager.test.ts
│ │ ├── algodManager.test.ts
│ │ ├── apiManager
│ │ │ └── example
│ │ │ └── get-balance.test.ts
│ │ ├── transactionManager
│ │ │ ├── accountTransactionManager.test.ts
│ │ │ ├── appTransactionManager.test.ts
│ │ │ ├── assetTransactionManager.test.ts
│ │ │ ├── generalTransactionManager.test.ts
│ │ │ └── transactionManager.test.ts
│ │ └── utilityManager.test.ts
│ └── tsconfig.json
├── README.md
├── rename_files.sh
└── tsconfig.json
```
# Files
--------------------------------------------------------------------------------
/packages/server/tests/tools/algodManager.test.ts:
--------------------------------------------------------------------------------
```typescript
1 | import { McpError, ErrorCode } from '@modelcontextprotocol/sdk/types.js';
2 | import { AlgodManager } from '../../src/tools/algodManager.js';
3 | import { algodClient } from '../../src/algorand-client.js';
4 | import algosdk, { modelsv2 } from 'algosdk';
5 |
6 | // Rest of the file remains the same...
7 | // Mock algosdk
8 | jest.mock('algosdk', () => ({
9 | modelsv2: {
10 | SimulateRequest: jest.fn(),
11 | SimulateRequestTransactionGroup: jest.fn()
12 | }
13 | }));
14 |
15 | // Mock algodClient
16 | jest.mock('../../src/algorand-client.js', () => ({
17 | algodClient: {
18 | compile: jest.fn(),
19 | disassemble: jest.fn(),
20 | sendRawTransaction: jest.fn(),
21 | simulateRawTransactions: jest.fn(),
22 | simulateTransactions: jest.fn(),
23 | }
24 | }));
25 |
26 | describe('AlgodManager', () => {
27 | beforeEach(() => {
28 | jest.clearAllMocks();
29 | // Setup default mock implementations
30 | (algodClient.compile as jest.Mock).mockReturnValue({ do: jest.fn() });
31 | (algodClient.disassemble as jest.Mock).mockReturnValue({ do: jest.fn() });
32 | (algodClient.sendRawTransaction as jest.Mock).mockReturnValue({ do: jest.fn() });
33 | (algodClient.simulateRawTransactions as jest.Mock).mockReturnValue({ do: jest.fn() });
34 | (algodClient.simulateTransactions as jest.Mock).mockReturnValue({ do: jest.fn() });
35 | });
36 |
37 | describe('Tool Schemas', () => {
38 | it('should have valid tool schemas', () => {
39 | expect(AlgodManager.algodTools).toHaveLength(5);
40 | expect(AlgodManager.algodTools.map((t: { name: string }) => t.name)).toEqual([
41 | 'compile_teal',
42 | 'disassemble_teal',
43 | 'send_raw_transaction',
44 | 'simulate_raw_transactions',
45 | 'simulate_transactions',
46 | ]);
47 | });
48 | });
49 |
50 | describe('TEAL Operations', () => {
51 | const mockCompileResponse = {
52 | hash: 'HASH',
53 | result: 'BASE64_BYTECODE'
54 | };
55 |
56 | const mockDisassembleResponse = {
57 | result: 'TEAL_SOURCE'
58 | };
59 |
60 | it('should compile TEAL source code', async () => {
61 | (algodClient.compile as jest.Mock)().do.mockResolvedValue(mockCompileResponse);
62 |
63 | const result = await AlgodManager.compile('int 1');
64 |
65 | expect(result).toEqual(mockCompileResponse);
66 | expect(algodClient.compile).toHaveBeenCalledWith('int 1');
67 | });
68 |
69 | it('should disassemble TEAL bytecode', async () => {
70 | (algodClient.disassemble as jest.Mock)().do.mockResolvedValue(mockDisassembleResponse);
71 |
72 | const result = await AlgodManager.disassemble('bytecode');
73 |
74 | expect(result).toEqual(mockDisassembleResponse);
75 | expect(algodClient.disassemble).toHaveBeenCalledWith('bytecode');
76 | });
77 |
78 | it('should handle compilation errors', async () => {
79 | const error = new Error('Compilation failed');
80 | (algodClient.compile as jest.Mock)().do.mockRejectedValue(error);
81 |
82 | await expect(AlgodManager.compile('invalid code'))
83 | .rejects
84 | .toThrow('Failed to compile TEAL: Compilation failed');
85 | });
86 |
87 | it('should handle disassembly errors', async () => {
88 | const error = new Error('Disassembly failed');
89 | (algodClient.disassemble as jest.Mock)().do.mockRejectedValue(error);
90 |
91 | await expect(AlgodManager.disassemble('invalid bytecode'))
92 | .rejects
93 | .toThrow('Failed to disassemble TEAL: Disassembly failed');
94 | });
95 | });
96 |
97 | describe('Transaction Operations', () => {
98 | const mockTxnResponse = {
99 | txId: 'TRANSACTION_ID'
100 | };
101 |
102 | const mockSimulateResponse = {
103 | lastRound: 1000,
104 | txnGroups: []
105 | };
106 |
107 | it('should send raw transactions', async () => {
108 | (algodClient.sendRawTransaction as jest.Mock)().do.mockResolvedValue(mockTxnResponse);
109 |
110 | const txn = Buffer.from('transaction');
111 | const result = await AlgodManager.sendRawTransaction(txn);
112 |
113 | expect(result).toEqual(mockTxnResponse);
114 | expect(algodClient.sendRawTransaction).toHaveBeenCalledWith(txn);
115 | });
116 |
117 | it('should simulate raw transactions', async () => {
118 | (algodClient.simulateRawTransactions as jest.Mock)().do.mockResolvedValue(mockSimulateResponse);
119 |
120 | const txn = Buffer.from('transaction');
121 | const result = await AlgodManager.simulateRawTransactions(txn);
122 |
123 | expect(result).toEqual(mockSimulateResponse);
124 | expect(algodClient.simulateRawTransactions).toHaveBeenCalledWith(txn);
125 | });
126 |
127 | it('should simulate transactions with configuration', async () => {
128 | (algodClient.simulateTransactions as jest.Mock)().do.mockResolvedValue(mockSimulateResponse);
129 |
130 | const request = {
131 | txnGroups: [{ txns: [] }],
132 | allowEmptySignatures: true,
133 | allowMoreLogging: true
134 | };
135 |
136 | const result = await AlgodManager.simulateTransactions(request);
137 |
138 | expect(result).toEqual(mockSimulateResponse);
139 | expect(modelsv2.SimulateRequest).toHaveBeenCalledWith(expect.objectContaining({
140 | allowEmptySignatures: true,
141 | allowMoreLogging: true
142 | }));
143 | });
144 | });
145 |
146 | describe('handleTool', () => {
147 | it('should handle compile_teal', async () => {
148 | const mockResponse = { hash: 'HASH', result: 'BYTECODE' };
149 | (algodClient.compile as jest.Mock)().do.mockResolvedValue(mockResponse);
150 |
151 | const result = await AlgodManager.handleTool('compile_teal', {
152 | source: 'int 1',
153 | });
154 |
155 | expect(result).toEqual({
156 | content: [{
157 | type: 'text',
158 | text: JSON.stringify(mockResponse, null, 2),
159 | }],
160 | });
161 | });
162 |
163 | it('should handle disassemble_teal', async () => {
164 | const mockResponse = { result: 'int 1' };
165 | (algodClient.disassemble as jest.Mock)().do.mockResolvedValue(mockResponse);
166 |
167 | const result = await AlgodManager.handleTool('disassemble_teal', {
168 | bytecode: 'BASE64_BYTECODE',
169 | });
170 |
171 | expect(result).toEqual({
172 | content: [{
173 | type: 'text',
174 | text: JSON.stringify(mockResponse, null, 2),
175 | }],
176 | });
177 | });
178 |
179 | it('should handle send_raw_transaction', async () => {
180 | const mockResponse = { txId: 'TX_ID' };
181 | (algodClient.sendRawTransaction as jest.Mock)().do.mockResolvedValue(mockResponse);
182 |
183 | const result = await AlgodManager.handleTool('send_raw_transaction', {
184 | signedTxns: ['BASE64_TXN'],
185 | });
186 |
187 | expect(result).toEqual({
188 | content: [{
189 | type: 'text',
190 | text: JSON.stringify(mockResponse, null, 2),
191 | }],
192 | });
193 | });
194 |
195 | describe('Error Handling', () => {
196 | it('should throw error for unknown tool', async () => {
197 | await expect(AlgodManager.handleTool('unknown_tool', {}))
198 | .rejects
199 | .toThrow(new McpError(ErrorCode.MethodNotFound, 'Unknown tool: unknown_tool'));
200 | });
201 |
202 | it('should throw error for missing TEAL source', async () => {
203 | await expect(AlgodManager.handleTool('compile_teal', {}))
204 | .rejects
205 | .toThrow(new McpError(ErrorCode.InvalidParams, 'TEAL source code is required'));
206 | });
207 |
208 | it('should throw error for missing bytecode', async () => {
209 | await expect(AlgodManager.handleTool('disassemble_teal', {}))
210 | .rejects
211 | .toThrow(new McpError(ErrorCode.InvalidParams, 'TEAL bytecode is required'));
212 | });
213 |
214 | it('should throw error for missing signed transactions', async () => {
215 | await expect(AlgodManager.handleTool('send_raw_transaction', {}))
216 | .rejects
217 | .toThrow(new McpError(ErrorCode.InvalidParams, 'Signed transactions array is required'));
218 | });
219 |
220 | it('should throw error for missing transactions in simulate_raw_transactions', async () => {
221 | await expect(AlgodManager.handleTool('simulate_raw_transactions', {}))
222 | .rejects
223 | .toThrow(new McpError(ErrorCode.InvalidParams, 'Transactions array is required'));
224 | });
225 |
226 | it('should throw error for missing transaction groups in simulate_transactions', async () => {
227 | await expect(AlgodManager.handleTool('simulate_transactions', {}))
228 | .rejects
229 | .toThrow(new McpError(ErrorCode.InvalidParams, 'Transaction groups array is required'));
230 | });
231 |
232 | it('should throw error for invalid transaction format', async () => {
233 | await expect(AlgodManager.handleTool('send_raw_transaction', {
234 | signedTxns: [123] // Not a string
235 | }))
236 | .rejects
237 | .toThrow(new McpError(ErrorCode.InvalidParams, 'Each transaction must be a base64 string'));
238 | });
239 | });
240 | });
241 | });
242 |
```
--------------------------------------------------------------------------------
/packages/server/src/resources/knowledge/taxonomy/algokit:utils:typescript:code:interfaces:types_app_client.AppClientDeployParams.md:
--------------------------------------------------------------------------------
```markdown
1 | [@algorandfoundation/algokit-utils](../README.md) / [types/app-client](../modules/types_app_client.md) / AppClientDeployParams
2 |
3 | # Interface: AppClientDeployParams
4 |
5 | [types/app-client](../modules/types_app_client.md).AppClientDeployParams
6 |
7 | Parameters to pass into ApplicationClient.deploy
8 |
9 | ## Hierarchy
10 |
11 | - [`AppClientDeployCoreParams`](types_app_client.AppClientDeployCoreParams.md)
12 |
13 | - [`AppClientDeployCallInterfaceParams`](types_app_client.AppClientDeployCallInterfaceParams.md)
14 |
15 | ↳ **`AppClientDeployParams`**
16 |
17 | ## Table of contents
18 |
19 | ### Properties
20 |
21 | - [allowDelete](types_app_client.AppClientDeployParams.md#allowdelete)
22 | - [allowUpdate](types_app_client.AppClientDeployParams.md#allowupdate)
23 | - [createArgs](types_app_client.AppClientDeployParams.md#createargs)
24 | - [createOnCompleteAction](types_app_client.AppClientDeployParams.md#createoncompleteaction)
25 | - [deleteArgs](types_app_client.AppClientDeployParams.md#deleteargs)
26 | - [deployTimeParams](types_app_client.AppClientDeployParams.md#deploytimeparams)
27 | - [onSchemaBreak](types_app_client.AppClientDeployParams.md#onschemabreak)
28 | - [onUpdate](types_app_client.AppClientDeployParams.md#onupdate)
29 | - [schema](types_app_client.AppClientDeployParams.md#schema)
30 | - [sendParams](types_app_client.AppClientDeployParams.md#sendparams)
31 | - [sender](types_app_client.AppClientDeployParams.md#sender)
32 | - [updateArgs](types_app_client.AppClientDeployParams.md#updateargs)
33 | - [version](types_app_client.AppClientDeployParams.md#version)
34 |
35 | ## Properties
36 |
37 | ### allowDelete
38 |
39 | • `Optional` **allowDelete**: `boolean`
40 |
41 | Whether or not to allow deletes in the contract using the deploy-time deletability control if present in your contract.
42 | If this is not specified then it will automatically be determined based on the AppSpec definition
43 |
44 | #### Inherited from
45 |
46 | [AppClientDeployCoreParams](types_app_client.AppClientDeployCoreParams.md).[allowDelete](types_app_client.AppClientDeployCoreParams.md#allowdelete)
47 |
48 | #### Defined in
49 |
50 | [src/types/app-client.ts:170](https://github.com/algorandfoundation/algokit-utils-ts/blob/main/src/types/app-client.ts#L170)
51 |
52 | ___
53 |
54 | ### allowUpdate
55 |
56 | • `Optional` **allowUpdate**: `boolean`
57 |
58 | Whether or not to allow updates in the contract using the deploy-time updatability control if present in your contract.
59 | If this is not specified then it will automatically be determined based on the AppSpec definition
60 |
61 | #### Inherited from
62 |
63 | [AppClientDeployCoreParams](types_app_client.AppClientDeployCoreParams.md).[allowUpdate](types_app_client.AppClientDeployCoreParams.md#allowupdate)
64 |
65 | #### Defined in
66 |
67 | [src/types/app-client.ts:166](https://github.com/algorandfoundation/algokit-utils-ts/blob/main/src/types/app-client.ts#L166)
68 |
69 | ___
70 |
71 | ### createArgs
72 |
73 | • `Optional` **createArgs**: [`AppClientCallArgs`](../modules/types_app_client.md#appclientcallargs)
74 |
75 | Any args to pass to any create transaction that is issued as part of deployment
76 |
77 | #### Inherited from
78 |
79 | [AppClientDeployCallInterfaceParams](types_app_client.AppClientDeployCallInterfaceParams.md).[createArgs](types_app_client.AppClientDeployCallInterfaceParams.md#createargs)
80 |
81 | #### Defined in
82 |
83 | [src/types/app-client.ts:182](https://github.com/algorandfoundation/algokit-utils-ts/blob/main/src/types/app-client.ts#L182)
84 |
85 | ___
86 |
87 | ### createOnCompleteAction
88 |
89 | • `Optional` **createOnCompleteAction**: ``"no_op"`` \| ``"opt_in"`` \| ``"close_out"`` \| ``"update_application"`` \| ``"delete_application"`` \| `NoOpOC` \| `OptInOC` \| `CloseOutOC` \| `UpdateApplicationOC` \| `DeleteApplicationOC`
90 |
91 | Override the on-completion action for the create call; defaults to NoOp
92 |
93 | #### Inherited from
94 |
95 | [AppClientDeployCallInterfaceParams](types_app_client.AppClientDeployCallInterfaceParams.md).[createOnCompleteAction](types_app_client.AppClientDeployCallInterfaceParams.md#createoncompleteaction)
96 |
97 | #### Defined in
98 |
99 | [src/types/app-client.ts:184](https://github.com/algorandfoundation/algokit-utils-ts/blob/main/src/types/app-client.ts#L184)
100 |
101 | ___
102 |
103 | ### deleteArgs
104 |
105 | • `Optional` **deleteArgs**: [`AppClientCallArgs`](../modules/types_app_client.md#appclientcallargs)
106 |
107 | Any args to pass to any delete transaction that is issued as part of deployment
108 |
109 | #### Inherited from
110 |
111 | [AppClientDeployCallInterfaceParams](types_app_client.AppClientDeployCallInterfaceParams.md).[deleteArgs](types_app_client.AppClientDeployCallInterfaceParams.md#deleteargs)
112 |
113 | #### Defined in
114 |
115 | [src/types/app-client.ts:188](https://github.com/algorandfoundation/algokit-utils-ts/blob/main/src/types/app-client.ts#L188)
116 |
117 | ___
118 |
119 | ### deployTimeParams
120 |
121 | • `Optional` **deployTimeParams**: [`TealTemplateParams`](types_app.TealTemplateParams.md)
122 |
123 | Any deploy-time parameters to replace in the TEAL code
124 |
125 | #### Inherited from
126 |
127 | [AppClientDeployCallInterfaceParams](types_app_client.AppClientDeployCallInterfaceParams.md).[deployTimeParams](types_app_client.AppClientDeployCallInterfaceParams.md#deploytimeparams)
128 |
129 | #### Defined in
130 |
131 | [src/types/app-client.ts:180](https://github.com/algorandfoundation/algokit-utils-ts/blob/main/src/types/app-client.ts#L180)
132 |
133 | ___
134 |
135 | ### onSchemaBreak
136 |
137 | • `Optional` **onSchemaBreak**: [`OnSchemaBreak`](../enums/types_app.OnSchemaBreak.md) \| ``"replace"`` \| ``"fail"`` \| ``"append"``
138 |
139 | What action to perform if a schema break is detected
140 |
141 | #### Inherited from
142 |
143 | [AppClientDeployCoreParams](types_app_client.AppClientDeployCoreParams.md).[onSchemaBreak](types_app_client.AppClientDeployCoreParams.md#onschemabreak)
144 |
145 | #### Defined in
146 |
147 | [src/types/app-client.ts:172](https://github.com/algorandfoundation/algokit-utils-ts/blob/main/src/types/app-client.ts#L172)
148 |
149 | ___
150 |
151 | ### onUpdate
152 |
153 | • `Optional` **onUpdate**: ``"replace"`` \| ``"fail"`` \| ``"append"`` \| [`OnUpdate`](../enums/types_app.OnUpdate.md) \| ``"update"``
154 |
155 | What action to perform if a TEAL update is detected
156 |
157 | #### Inherited from
158 |
159 | [AppClientDeployCoreParams](types_app_client.AppClientDeployCoreParams.md).[onUpdate](types_app_client.AppClientDeployCoreParams.md#onupdate)
160 |
161 | #### Defined in
162 |
163 | [src/types/app-client.ts:174](https://github.com/algorandfoundation/algokit-utils-ts/blob/main/src/types/app-client.ts#L174)
164 |
165 | ___
166 |
167 | ### schema
168 |
169 | • `Optional` **schema**: `Partial`\<[`AppStorageSchema`](types_app.AppStorageSchema.md)\>
170 |
171 | Any overrides for the storage schema to request for the created app; by default the schema indicated by the app spec is used.
172 |
173 | #### Defined in
174 |
175 | [src/types/app-client.ts:194](https://github.com/algorandfoundation/algokit-utils-ts/blob/main/src/types/app-client.ts#L194)
176 |
177 | ___
178 |
179 | ### sendParams
180 |
181 | • `Optional` **sendParams**: `Omit`\<[`SendTransactionParams`](types_transaction.SendTransactionParams.md), ``"skipSending"`` \| ``"skipWaiting"``\>
182 |
183 | Parameters to control transaction sending
184 |
185 | #### Inherited from
186 |
187 | [AppClientDeployCoreParams](types_app_client.AppClientDeployCoreParams.md).[sendParams](types_app_client.AppClientDeployCoreParams.md#sendparams)
188 |
189 | #### Defined in
190 |
191 | [src/types/app-client.ts:162](https://github.com/algorandfoundation/algokit-utils-ts/blob/main/src/types/app-client.ts#L162)
192 |
193 | ___
194 |
195 | ### sender
196 |
197 | • `Optional` **sender**: [`SendTransactionFrom`](../modules/types_transaction.md#sendtransactionfrom)
198 |
199 | The optional sender to send the transaction from, will use the application client's default sender by default if specified
200 |
201 | #### Inherited from
202 |
203 | [AppClientDeployCoreParams](types_app_client.AppClientDeployCoreParams.md).[sender](types_app_client.AppClientDeployCoreParams.md#sender)
204 |
205 | #### Defined in
206 |
207 | [src/types/app-client.ts:160](https://github.com/algorandfoundation/algokit-utils-ts/blob/main/src/types/app-client.ts#L160)
208 |
209 | ___
210 |
211 | ### updateArgs
212 |
213 | • `Optional` **updateArgs**: [`AppClientCallArgs`](../modules/types_app_client.md#appclientcallargs)
214 |
215 | Any args to pass to any update transaction that is issued as part of deployment
216 |
217 | #### Inherited from
218 |
219 | [AppClientDeployCallInterfaceParams](types_app_client.AppClientDeployCallInterfaceParams.md).[updateArgs](types_app_client.AppClientDeployCallInterfaceParams.md#updateargs)
220 |
221 | #### Defined in
222 |
223 | [src/types/app-client.ts:186](https://github.com/algorandfoundation/algokit-utils-ts/blob/main/src/types/app-client.ts#L186)
224 |
225 | ___
226 |
227 | ### version
228 |
229 | • `Optional` **version**: `string`
230 |
231 | The version of the contract, uses "1.0" by default
232 |
233 | #### Inherited from
234 |
235 | [AppClientDeployCoreParams](types_app_client.AppClientDeployCoreParams.md).[version](types_app_client.AppClientDeployCoreParams.md#version)
236 |
237 | #### Defined in
238 |
239 | [src/types/app-client.ts:158](https://github.com/algorandfoundation/algokit-utils-ts/blob/main/src/types/app-client.ts#L158)
240 |
```
--------------------------------------------------------------------------------
/packages/server/src/resources/knowledge/taxonomy/algokit:utils:typescript:capabilities:transfer.md:
--------------------------------------------------------------------------------
```markdown
1 | # Algo transfers (payments)
2 |
3 | Algo transfers, or [payments](https://developer.algorand.org/docs/get-details/transactions/#payment-transaction), is a higher-order use case capability provided by AlgoKit Utils that builds on top of the core capabilities, particularly [Algo amount handling](./amount.md) and [Transaction management](./transaction.md). It allows you to easily initiate Algo transfers between accounts, including dispenser management and idempotent account funding.
4 |
5 | To see some usage examples check out the [automated tests](../../src/types/algorand-client.transfer.spec.ts).
6 |
7 | ## `payment`
8 |
9 | The key function to facilitate Algo transfers is `algorand.send.payment(params)` (immediately send a single payment transaction), `algorand.createTransaction.payment(params)` (construct a payment transaction), or `algorand.newGroup().addPayment(params)` (add payment to a group of transactions) per [`AlgorandClient`](./algorand-client.md) [transaction semantics](./algorand-client.md#creating-and-issuing-transactions).
10 |
11 | The base type for specifying a payment transaction is [`PaymentParams`](../code/modules/types_composer.md#paymentparams), which has the following parameters in addition to the [common transaction parameters](./algorand-client.md#transaction-parameters):
12 |
13 | - `receiver: string` - The address of the account that will receive the Algo
14 | - `amount: AlgoAmount` - The amount of Algo to send
15 | - `closeRemainderTo?: string` - If given, close the sender account and send the remaining balance to this address (**warning:** use this carefully as it can result in loss of funds if used incorrectly)
16 |
17 | ```typescript
18 | // Minimal example
19 | const result = await algorand.send.payment({
20 | sender: 'SENDERADDRESS',
21 | receiver: 'RECEIVERADDRESS',
22 | amount: (4).algo(),
23 | })
24 |
25 | // Advanced example
26 | const result2 = await algorand.send.payment({
27 | sender: 'SENDERADDRESS',
28 | receiver: 'RECEIVERADDRESS',
29 | amount: (4).algo(),
30 | closeRemainderTo: 'CLOSEREMAINDERTOADDRESS',
31 | lease: 'lease',
32 | note: 'note',
33 | // Use this with caution, it's generally better to use algorand.account.rekeyAccount
34 | rekeyTo: 'REKEYTOADDRESS',
35 | // You wouldn't normally set this field
36 | firstValidRound: 1000n,
37 | validityWindow: 10,
38 | extraFee: (1000).microAlgo(),
39 | staticFee: (1000).microAlgo(),
40 | // Max fee doesn't make sense with extraFee AND staticFee
41 | // already specified, but here for completeness
42 | maxFee: (3000).microAlgo(),
43 | // Signer only needed if you want to provide one,
44 | // generally you'd register it with AlgorandClient
45 | // against the sender and not need to pass it in
46 | signer: transactionSigner,
47 | maxRoundsToWaitForConfirmation: 5,
48 | suppressLog: true,
49 | })
50 | ```
51 |
52 | ## `ensureFunded`
53 |
54 | The `ensureFunded` function automatically funds an account to maintain a minimum amount of [disposable Algo](https://developer.algorand.org/docs/get-details/accounts/#minimum-balance). This is particularly useful for automation and deployment scripts that get run multiple times and consume Algo when run.
55 |
56 | There are 3 variants of this function:
57 |
58 | - [`algorand.account.ensureFunded(accountToFund, dispenserAccount, minSpendingBalance, options?)`](../code/classes/types_account_manager.AccountManager.md#ensurefunded) - Funds a given account using a dispenser account as a funding source such that the given account has a certain amount of Algo free to spend (accounting for Algo locked in minimum balance requirement).
59 | - [`algorand.account.ensureFundedFromEnvironment(accountToFund, minSpendingBalance, options?)`](../code/classes/types_account_manager.AccountManager.md#ensurefundedfromenvironment) - Funds a given account using a dispenser account retrieved from the environment, per the [`dispenserFromEnvironment`](#dispenser) method, as a funding source such that the given account has a certain amount of Algo free to spend (accounting for Algo locked in minimum balance requirement).
60 | - **Note:** requires a Node.js environment to execute.
61 | - The dispenser account is retrieved from the account mnemonic stored in `process.env.DISPENSER_MNEMONIC` and optionally `process.env.DISPENSER_SENDER`
62 | if it's a rekeyed account, or against default LocalNet if no environment variables present.
63 | - [`algorand.account.ensureFundedFromTestNetDispenserApi(accountToFund, dispenserClient, minSpendingBalance, options)`](../code/classes/types_account_manager.AccountManager.md#ensurefundedfromtestnetdispenserapi) - Funds a given account using the [TestNet Dispenser API](https://github.com/algorandfoundation/algokit/blob/main/docs/testnet_api.md) as a funding source such that the account has a certain amount of Algo free to spend (accounting for Algo locked in minimum balance requirement).
64 |
65 | The general structure of these calls is similar, they all take:
66 |
67 | - `accountToFund: string | TransactionSignerAccount` - Address or signing account of the account to fund
68 | - The source (dispenser):
69 | - In `ensureFunded`: `dispenserAccount: string | TransactionSignerAccount` - the address or signing account of the account to use as a dispenser
70 | - In `ensureFundedFromEnvironment`: Not specified, loaded automatically from the ephemeral environment
71 | - In `ensureFundedFromTestNetDispenserApi`: `dispenserClient: TestNetDispenserApiClient` - a client instance of the [TestNet dispenser API](./dispenser-client.md)
72 | - `minSpendingBalance: AlgoAmount` - The minimum balance of Algo that the account should have available to spend (i.e., on top of the minimum balance requirement)
73 | - An `options` object, which has:
74 | - [Common transaction parameters](./algorand-client.md#transaction-parameters) (not for TestNet Dispenser API)
75 | - [Execution parameters](./algorand-client.md#sending-a-single-transaction) (not for TestNet Dispenser API)
76 | - `minFundingIncrement?: AlgoAmount` - When issuing a funding amount, the minimum amount to transfer; this avoids many small transfers if this function gets called often on an active account
77 |
78 | ### Examples
79 |
80 | ```typescript
81 | // From account
82 |
83 | // Basic example
84 | await algorand.account.ensureFunded('ACCOUNTADDRESS', 'DISPENSERADDRESS', (1).algo())
85 | // With configuration
86 | await algorand.account.ensureFunded('ACCOUNTADDRESS', 'DISPENSERADDRESS', (1).algo(), {
87 | minFundingIncrement: (2).algo(),
88 | fee: (1000).microAlgo(),
89 | suppressLog: true,
90 | })
91 |
92 | // From environment
93 |
94 | // Basic example
95 | await algorand.account.ensureFundedFromEnvironment('ACCOUNTADDRESS', (1).algo())
96 | // With configuration
97 | await algorand.account.ensureFundedFromEnvironment('ACCOUNTADDRESS', (1).algo(), {
98 | minFundingIncrement: (2).algo(),
99 | fee: (1000).microAlgo(),
100 | suppressLog: true,
101 | })
102 |
103 | // TestNet Dispenser API
104 |
105 | // Basic example
106 | await algorand.account.ensureFundedUsingDispenserAPI('ACCOUNTADDRESS', algorand.client.getTestNetDispenserFromEnvironment(), (1).algo())
107 | // With configuration
108 | await algorand.account.ensureFundedUsingDispenserAPI('ACCOUNTADDRESS', algorand.client.getTestNetDispenserFromEnvironment(), (1).algo(), {
109 | minFundingIncrement: (2).algo(),
110 | })
111 | ```
112 |
113 | All 3 variants return an [`EnsureFundedReturnType`](../code/modules/types_account_manager.md#) (and the first two also return a [single transaction result](./algorand-client.md#sending-a-single-transaction)) if a funding transaction was needed, or `undefined` if no transaction was required:
114 |
115 | - `amountFunded: AlgoAmount` - The number of Algo that was paid
116 | - `transactionId: string` - The ID of the transaction that funded the account
117 |
118 | If you are using the TestNet Dispenser API then the `transactionId` is useful if you want to use the [refund functionality](./dispenser-client.md#registering-a-refund).
119 |
120 | ## Dispenser
121 |
122 | If you want to programmatically send funds to an account so it can transact then you will often need a "dispenser" account that has a store of Algo that can be sent and a private key available for that dispenser account.
123 |
124 | There's a number of ways to get a dispensing account in AlgoKit Utils:
125 |
126 | - Get a dispenser via [account manager](./account.md#dispenser) - either automatically from [LocalNet](https://github.com/algorandfoundation/algokit-cli/blob/main/docs/features/localnet.md) or from the environment
127 | - By programmatically creating one of the many account types via [account manager](./account.md#accounts)
128 | - By programmatically interacting with [KMD](./account.md#kmd-account-management) if running against LocalNet
129 | - By using the [AlgoKit TestNet Dispenser API client](./dispenser-client.md) which can be used to fund accounts on TestNet via a dedicated API service
130 |
```
--------------------------------------------------------------------------------
/packages/server/src/resources/knowledge/taxonomy/developer:docs:sdks:python:index.md:
--------------------------------------------------------------------------------
```markdown
1 | title: Python SDK: Your first transaction
2 |
3 | This section is a quick start guide for interacting with the Algorand network using Python. This guide will help to install [Algorand sandbox](https://github.com/algorand/sandbox){target=blank}, which provides a node for testing and development. This guide will also help to install the Python SDK, create an account and submit your first transaction on Algorand.
4 |
5 | # Install Sandbox
6 |
7 | !!! info
8 | This step is only required if you are not using AlgoKit. If you are using AlgoKit, you can spin up a sandbox using the LocalNet, see [AlgoKit getting started guide](/docs/get-started/algokit/#start-a-localnet) for more information.
9 |
10 | !!! Prerequisites
11 | - Docker Compose ([install guide](https://docs.docker.com/compose/install/){target=_blank})
12 | - Git ([install guide](https://git-scm.com/book/en/v2/Getting-Started-Installing-Git){target=_blank})
13 |
14 | Algorand provides a docker instance for setting up a node, which can be used to get started developing quickly. To install and use this instance, follow these instructions.
15 |
16 | ```bash
17 | git clone https://github.com/algorand/sandbox.git
18 | cd sandbox
19 | ./sandbox up dev
20 | ```
21 |
22 | This will install and start private network. To read more about Algorand networks see [Algorand Networks](../../get-details/algorand-networks/index.md){target=_blank}.
23 |
24 | [More Information about the sandbox](https://developer.algorand.org/articles/introducing-sandbox-20/) and [how to use](https://developer.algorand.org/tutorials/exploring-the-algorand-sandbox/) it.
25 |
26 |
27 | # Install Python SDK
28 | Algorand provides an SDK for Python which is available as a pip package. To install the Python SDK, open a terminal and run the following command:
29 |
30 | ``` bash
31 | pip3 install py-algorand-sdk
32 | ```
33 |
34 | The [GitHub repository](https://github.com/algorand/py-algorand-sdk){target=_blank} contains additional documentation and examples.
35 |
36 | See the Python SDK [reference documentation](https://py-algorand-sdk.readthedocs.io/en/latest/){target=_blank} for more information on methods.
37 |
38 | The SDK is installed and can now interact with the Sandbox created earlier.
39 |
40 | # Create an Account
41 | In order to interact with the Algorand blockchain, you must have a funded account. To quickly create a test account use the following code.
42 |
43 |
44 | <!-- ===PYSDK_ACCOUNT_GENERATE=== -->
45 | ```python
46 | private_key, address = account.generate_account()
47 | print(f"address: {address}")
48 | print(f"private key: {private_key}")
49 | print(f"mnemonic: {mnemonic.from_private_key(private_key)}")
50 | ```
51 | [Snippet Source](https://github.com/algorand/py-algorand-sdk/blob/examples/examples/account.py#L5-L9)
52 | <!-- ===PYSDK_ACCOUNT_GENERATE=== -->
53 |
54 | [`More Information`](../../get-details/accounts/create.md#standalone){target=_blank}
55 |
56 | !!! Warning
57 | Never share mnemonic and private key. Production environments require stringent private key management. For more information on key management in community Wallets, click [here](https://developer.algorand.org/docs/community/#wallets){target=_blank}. For the [Algorand open source wallet](https://developer.algorand.org/articles/algorand-wallet-now-open-source/){target=_blank}, click [here](https://github.com/algorand/algorand-wallet){target=_blank}.
58 |
59 | # Fund the Account
60 | Before sending transactions to the Algorand network, the account must be funded to cover the minimal transaction fees that exist on Algorand. In this example, we'll be using prefunded accounts available in the Sandbox. To fund an account on Testnet account use the [Algorand faucet](https://dispenser.testnet.aws.algodev.network/){target=_blank}.
61 |
62 | !!! Info
63 | All Algorand accounts require a minimum balance to be registered in the ledger. To read more about Algorand minimum balance, see [Account Overview](../../get-details/accounts/index.md#minimum-balance){target=_blank}.
64 |
65 | # Connect Your Client
66 | An Algod client must be instantiated prior to making calls to the API endpoints. You must provide values for `<algod-address>` and `<algod-token>`. The CLI tools implement the client natively. By default, the `algod_token` for each [sandbox](https://github.com/algorand/sandbox) is set to its `aaa...` value and the `algod_address` corresponds to `http://localhost:4001`.
67 |
68 |
69 | <!-- ===PYSDK_ALGOD_CREATE_CLIENT=== -->
70 | ```python
71 | # Create a new algod client, configured to connect to our local sandbox
72 | algod_address = "http://localhost:4001"
73 | algod_token = "a" * 64
74 | algod_client = algod.AlgodClient(algod_token, algod_address)
75 |
76 | # Or, if necessary, pass alternate headers
77 |
78 | # Create a new client with an alternate api key header
79 | special_algod_client = algod.AlgodClient(
80 | "", algod_address, headers={"X-API-Key": algod_token}
81 | )
82 | ```
83 | [Snippet Source](https://github.com/algorand/py-algorand-sdk/blob/examples/examples/overview.py#L10-L21)
84 | <!-- ===PYSDK_ALGOD_CREATE_CLIENT=== -->
85 |
86 | !!! Info
87 | The example code connects to the sandbox Algod client. If you want to connect to a public API client, change the host, port, and token parameters to match the API service. See some service available [here](https://developer.algorand.org/ecosystem-projects/?tags=api-services)
88 |
89 | !!! Info
90 | If you are connecting to the Testnet, a dispenser is available [here](https://dispenser.testnet.aws.algodev.network/){target=_blank}
91 |
92 |
93 | # Check Your Balance
94 | Before moving on to the next step, make sure your account has been funded.
95 |
96 | <!-- ===PYSDK_ALGOD_FETCH_ACCOUNT_INFO=== -->
97 | ```python
98 | account_info: Dict[str, Any] = algod_client.account_info(address)
99 | print(f"Account balance: {account_info.get('amount')} microAlgos")
100 | ```
101 | [Snippet Source](https://github.com/algorand/py-algorand-sdk/blob/examples/examples/overview.py#L33-L35)
102 | <!-- ===PYSDK_ALGOD_FETCH_ACCOUNT_INFO=== -->
103 |
104 | # Build First Transaction
105 | Transactions are used to interact with the Algorand network. To create a payment transaction use the following code.
106 |
107 | <!-- ===PYSDK_TRANSACTION_PAYMENT_CREATE=== -->
108 | ```python
109 | # grab suggested params from algod using client
110 | # includes things like suggested fee and first/last valid rounds
111 | params = algod_client.suggested_params()
112 | unsigned_txn = transaction.PaymentTxn(
113 | sender=address,
114 | sp=params,
115 | receiver=address2,
116 | amt=1000000,
117 | note=b"Hello World",
118 | )
119 | ```
120 | [Snippet Source](https://github.com/algorand/py-algorand-sdk/blob/examples/examples/overview.py#L39-L49)
121 | <!-- ===PYSDK_TRANSACTION_PAYMENT_CREATE=== -->
122 |
123 | !!! Info
124 | Algorand supports many transaction types. To see what types are supported see [Transactions](../../get-details/transactions/index.md#transaction-types){target=_blank}.
125 |
126 | # Sign First Transaction
127 | Before the transaction is considered valid, it must be signed by a private key. Use the following code to sign the transaction.
128 |
129 | <!-- ===PYSDK_TRANSACTION_PAYMENT_SIGN=== -->
130 | ```python
131 | # sign the transaction
132 | signed_txn = unsigned_txn.sign(private_key)
133 | ```
134 | [Snippet Source](https://github.com/algorand/py-algorand-sdk/blob/examples/examples/overview.py#L52-L54)
135 | <!-- ===PYSDK_TRANSACTION_PAYMENT_SIGN=== -->
136 |
137 | !!! Info
138 | Algorand provides many ways to sign transactions. To see other ways see [Authorization](../../get-details/transactions/signatures.md#single-signatures){target=_blank}.
139 |
140 | # Submit the Transaction
141 | The signed transaction can now be submitted to the network. `wait_for_confirmation` SDK Method is called after the transaction is submitted to wait until the transaction is broadcast to the Algorand blockchain and is confirmed.
142 |
143 | <!-- ===PYSDK_TRANSACTION_PAYMENT_SUBMIT=== -->
144 | ```python
145 | # submit the transaction and get back a transaction id
146 | txid = algod_client.send_transaction(signed_txn)
147 | print("Successfully submitted transaction with txID: {}".format(txid))
148 |
149 | # wait for confirmation
150 | txn_result = transaction.wait_for_confirmation(algod_client, txid, 4)
151 |
152 | print(f"Transaction information: {json.dumps(txn_result, indent=4)}")
153 | print(f"Decoded note: {b64decode(txn_result['txn']['txn']['note'])}")
154 | ```
155 | [Snippet Source](https://github.com/algorand/py-algorand-sdk/blob/examples/examples/overview.py#L57-L66)
156 | <!-- ===PYSDK_TRANSACTION_PAYMENT_SUBMIT=== -->
157 |
158 | # View the Transaction
159 |
160 | To view the transaction we submitted to the sandbox Algod, open [Lora](https://lora.algokit.io/localnet){target=_blank} and choose `LocalNet` configuration option, then search for the transaction ID.
161 |
162 | To view a transaction submitted to public network like testnet, open [Lora](https://lora.algokit.io/testnet){target=_blank} or [Pera Explorer](https://testnet.explorer.perawallet.app/){target=blank} and paste the transaction ID into the search bar.
163 |
```
--------------------------------------------------------------------------------
/packages/server/src/resources/knowledge/taxonomy-categories/algokit-utils.json:
--------------------------------------------------------------------------------
```json
1 | {
2 | "name": "AlgoKit Utils",
3 | "description": "Utility libraries for Algorand development",
4 | "path": "algokit:utils",
5 | "subcategories": {
6 | "python": {
7 | "name": "Python Utils",
8 | "description": "Python utility libraries for Algorand development",
9 | "path": "algokit:utils:python",
10 | "documents": [
11 | {"name": "README", "path": "algokit:utils:python:README.md"}
12 | ],
13 | "subcategories": {
14 | "markdown": {
15 | "name": "Documentation",
16 | "description": "Python utils documentation",
17 | "path": "algokit:utils:python:markdown",
18 | "documents": [
19 | {"name": "Index", "path": "algokit:utils:python:markdown:index.md"}
20 | ],
21 | "subcategories": {
22 | "capabilities": {
23 | "name": "Capabilities",
24 | "description": "Core functionality documentation",
25 | "path": "algokit:utils:python:markdown:capabilities",
26 | "documents": [
27 | {"name": "Account", "path": "algokit:utils:python:markdown:capabilities:account.md"},
28 | {"name": "App Client", "path": "algokit:utils:python:markdown:capabilities:app-client.md"},
29 | {"name": "App Deploy", "path": "algokit:utils:python:markdown:capabilities:app-deploy.md"},
30 | {"name": "Client", "path": "algokit:utils:python:markdown:capabilities:client.md"},
31 | {"name": "Debugger", "path": "algokit:utils:python:markdown:capabilities:debugger.md"},
32 | {"name": "Dispenser Client", "path": "algokit:utils:python:markdown:capabilities:dispenser-client.md"},
33 | {"name": "Transfer", "path": "algokit:utils:python:markdown:capabilities:transfer.md"}
34 | ]
35 | }
36 | }
37 | },
38 | "source": {
39 | "name": "Source Documentation",
40 | "description": "Source code documentation",
41 | "path": "algokit:utils:python:source",
42 | "documents": [
43 | {"name": "Index", "path": "algokit:utils:python:source:index.md"}
44 | ],
45 | "subcategories": {
46 | "capabilities": {
47 | "name": "Capabilities",
48 | "description": "Source code documentation for core functionality",
49 | "path": "algokit:utils:python:source:capabilities",
50 | "documents": [
51 | {"name": "Account", "path": "algokit:utils:python:source:capabilities:account.md"},
52 | {"name": "App Client", "path": "algokit:utils:python:source:capabilities:app-client.md"},
53 | {"name": "App Deploy", "path": "algokit:utils:python:source:capabilities:app-deploy.md"},
54 | {"name": "Client", "path": "algokit:utils:python:source:capabilities:client.md"},
55 | {"name": "Debugger", "path": "algokit:utils:python:source:capabilities:debugger.md"},
56 | {"name": "Dispenser Client", "path": "algokit:utils:python:source:capabilities:dispenser-client.md"},
57 | {"name": "Transfer", "path": "algokit:utils:python:source:capabilities:transfer.md"}
58 | ]
59 | }
60 | }
61 | }
62 | }
63 | },
64 | "typescript": {
65 | "name": "TypeScript Utils",
66 | "description": "TypeScript utility libraries for Algorand development",
67 | "path": "algokit:utils:typescript",
68 | "documents": [
69 | {"name": "README", "path": "algokit:utils:typescript:README.md"},
70 | {"name": "V7 Migration", "path": "algokit:utils:typescript:v7-migration.md"},
71 | {"name": "V8 Migration", "path": "algokit:utils:typescript:v8-migration.md"}
72 | ],
73 | "subcategories": {
74 | "capabilities": {
75 | "name": "Capabilities",
76 | "description": "Core functionality documentation",
77 | "path": "algokit:utils:typescript:capabilities",
78 | "documents": [
79 | {"name": "Account", "path": "algokit:utils:typescript:capabilities:account.md"},
80 | {"name": "Algorand Client", "path": "algokit:utils:typescript:capabilities:algorand-client.md"},
81 | {"name": "Amount", "path": "algokit:utils:typescript:capabilities:amount.md"},
82 | {"name": "App Client", "path": "algokit:utils:typescript:capabilities:app-client.md"},
83 | {"name": "App Deploy", "path": "algokit:utils:typescript:capabilities:app-deploy.md"},
84 | {"name": "App", "path": "algokit:utils:typescript:capabilities:app.md"},
85 | {"name": "Asset", "path": "algokit:utils:typescript:capabilities:asset.md"},
86 | {"name": "Client", "path": "algokit:utils:typescript:capabilities:client.md"},
87 | {"name": "Debugging", "path": "algokit:utils:typescript:capabilities:debugging.md"},
88 | {"name": "Dispenser Client", "path": "algokit:utils:typescript:capabilities:dispenser-client.md"},
89 | {"name": "Event Emitter", "path": "algokit:utils:typescript:capabilities:event-emitter.md"},
90 | {"name": "Indexer", "path": "algokit:utils:typescript:capabilities:indexer.md"},
91 | {"name": "Testing", "path": "algokit:utils:typescript:capabilities:testing.md"},
92 | {"name": "Transaction Composer", "path": "algokit:utils:typescript:capabilities:transaction-composer.md"},
93 | {"name": "Transaction", "path": "algokit:utils:typescript:capabilities:transaction.md"},
94 | {"name": "Transfer", "path": "algokit:utils:typescript:capabilities:transfer.md"},
95 | {"name": "Typed App Clients", "path": "algokit:utils:typescript:capabilities:typed-app-clients.md"}
96 | ]
97 | },
98 | "code": {
99 | "name": "API Reference",
100 | "description": "Detailed API documentation",
101 | "path": "algokit:utils:typescript:code",
102 | "documents": [
103 | {"name": "README", "path": "algokit:utils:typescript:code:README.md"}
104 | ],
105 | "subcategories": {
106 | "classes": {
107 | "name": "Classes",
108 | "description": "Class documentation",
109 | "path": "algokit:utils:typescript:code:classes",
110 | "documents": [
111 | {"name": "AccountManager", "path": "algokit:utils:typescript:code:classes:types_account_manager.AccountManager.md"},
112 | {"name": "AlgoAmount", "path": "algokit:utils:typescript:code:classes:types_amount.AlgoAmount.md"},
113 | {"name": "AlgorandClient", "path": "algokit:utils:typescript:code:classes:types_algorand_client.AlgorandClient.md"},
114 | {"name": "ApplicationClient", "path": "algokit:utils:typescript:code:classes:types_app_client.ApplicationClient.md"},
115 | {"name": "AsyncEventEmitter", "path": "algokit:utils:typescript:code:classes:types_async_event_emitter.AsyncEventEmitter.md"},
116 | {"name": "LogicError", "path": "algokit:utils:typescript:code:classes:types_logic_error.LogicError.md"},
117 | {"name": "TestLogger", "path": "algokit:utils:typescript:code:classes:testing.TestLogger.md"},
118 | {"name": "TransactionLogger", "path": "algokit:utils:typescript:code:classes:testing.TransactionLogger.md"}
119 | ]
120 | },
121 | "interfaces": {
122 | "name": "Interfaces",
123 | "description": "Interface documentation",
124 | "path": "algokit:utils:typescript:code:interfaces",
125 | "documents": [
126 | {"name": "AlgorandFixture", "path": "algokit:utils:typescript:code:interfaces:types_testing.AlgorandFixture.md"},
127 | {"name": "AppClientParams", "path": "algokit:utils:typescript:code:interfaces:types_app_client.AppClientParams.md"},
128 | {"name": "AppDeploymentParams", "path": "algokit:utils:typescript:code:interfaces:types_app.AppDeploymentParams.md"},
129 | {"name": "Config", "path": "algokit:utils:typescript:code:interfaces:types_config.Config.md"},
130 | {"name": "TransactionParams", "path": "algokit:utils:typescript:code:interfaces:types_transaction.SendTransactionParams.md"}
131 | ]
132 | },
133 | "enums": {
134 | "name": "Enums",
135 | "description": "Enum documentation",
136 | "path": "algokit:utils:typescript:code:enums",
137 | "documents": [
138 | {"name": "EventType", "path": "algokit:utils:typescript:code:enums:types_lifecycle_events.EventType.md"},
139 | {"name": "OnSchemaBreak", "path": "algokit:utils:typescript:code:enums:types_app.OnSchemaBreak.md"},
140 | {"name": "OnUpdate", "path": "algokit:utils:typescript:code:enums:types_app.OnUpdate.md"}
141 | ]
142 | }
143 | }
144 | }
145 | }
146 | }
147 | }
148 | }
149 |
```
--------------------------------------------------------------------------------
/packages/server/src/tools/apiManager/indexer/account.ts:
--------------------------------------------------------------------------------
```typescript
1 | import { ErrorCode, McpError } from '@modelcontextprotocol/sdk/types.js';
2 | import { indexerClient } from '../../../algorand-client.js';
3 | import { ResponseProcessor } from '../../../utils/responseProcessor.js';
4 | import type {
5 | AccountResponse,
6 | AccountsResponse,
7 | ApplicationLocalStatesResponse,
8 | AssetHoldingsResponse,
9 | ApplicationsResponse,
10 | TransactionsResponse
11 | } from 'algosdk/dist/types/client/v2/indexer/models/types';
12 |
13 | export const accountTools = [
14 | {
15 | name: 'api_indexer_lookup_account_by_id',
16 | description: 'Get account information from indexer',
17 | inputSchema: {
18 | type: 'object',
19 | properties: {
20 | address: {
21 | type: 'string',
22 | description: 'Account address'
23 | }
24 | },
25 | required: ['address']
26 | }
27 | },
28 | {
29 | name: 'api_indexer_lookup_account_assets',
30 | description: 'Get account assets',
31 | inputSchema: {
32 | type: 'object',
33 | properties: {
34 | address: {
35 | type: 'string',
36 | description: 'Account address'
37 | },
38 | limit: {
39 | type: 'integer',
40 | description: 'Maximum number of assets to return'
41 | },
42 | assetId: {
43 | type: 'integer',
44 | description: 'Filter by asset ID'
45 | },
46 | nextToken: {
47 | type: 'string',
48 | description: 'Token for retrieving the next page of results'
49 | }
50 | },
51 | required: ['address']
52 | }
53 | },
54 | {
55 | name: 'api_indexer_lookup_account_app_local_states',
56 | description: 'Get account application local states',
57 | inputSchema: {
58 | type: 'object',
59 | properties: {
60 | address: {
61 | type: 'string',
62 | description: 'Account address'
63 | }
64 | },
65 | required: ['address']
66 | }
67 | },
68 | {
69 | name: 'api_indexer_lookup_account_created_applications',
70 | description: 'Get applications created by this account',
71 | inputSchema: {
72 | type: 'object',
73 | properties: {
74 | address: {
75 | type: 'string',
76 | description: 'Account address'
77 | }
78 | },
79 | required: ['address']
80 | }
81 | },
82 | {
83 | name: 'api_indexer_search_for_accounts',
84 | description: 'Search for accounts with various criteria',
85 | inputSchema: {
86 | type: 'object',
87 | properties: {
88 | limit: {
89 | type: 'integer',
90 | description: 'Maximum number of accounts to return'
91 | },
92 | assetId: {
93 | type: 'integer',
94 | description: 'Filter by asset ID'
95 | },
96 | applicationId: {
97 | type: 'integer',
98 | description: 'Filter by application ID'
99 | },
100 | currencyGreaterThan: {
101 | type: 'integer',
102 | description: 'Filter by minimum balance'
103 | },
104 | currencyLessThan: {
105 | type: 'integer',
106 | description: 'Filter by maximum balance'
107 | },
108 | nextToken: {
109 | type: 'string',
110 | description: 'Token for retrieving the next page of results'
111 | }
112 | }
113 | }
114 | }
115 | ];
116 |
117 | export async function lookupAccountByID(address: string): Promise<AccountResponse> {
118 | try {
119 | console.log(`Looking up account info for address ${address}`);
120 | const response = await indexerClient.lookupAccountByID(address).do() as AccountResponse;
121 | console.log('Account response:', JSON.stringify(response, null, 2));
122 | return response;
123 | } catch (error) {
124 | console.error('Account lookup error:', error);
125 | if (error instanceof McpError) {
126 | throw error;
127 | }
128 | throw new McpError(
129 | ErrorCode.InternalError,
130 | `Failed to get account info: ${error instanceof Error ? error.message : String(error)}`
131 | );
132 | }
133 | }
134 |
135 | export async function lookupAccountAssets(address: string, params?: {
136 | limit?: number;
137 | assetId?: number;
138 | nextToken?: string;
139 | }): Promise<AssetHoldingsResponse> {
140 | try {
141 | console.log(`Looking up assets for address ${address}`);
142 | let search = indexerClient.lookupAccountAssets(address);
143 |
144 | if (params?.limit) {
145 | search = search.limit(params.limit);
146 | }
147 | if (params?.assetId) {
148 | search = search.assetId(params.assetId);
149 | }
150 | if (params?.nextToken) {
151 | search = search.nextToken(params.nextToken);
152 | }
153 |
154 | const response = await search.do() as AssetHoldingsResponse;
155 | console.log('Assets response:', JSON.stringify(response, null, 2));
156 | return response;
157 | } catch (error) {
158 | console.error('Assets lookup error:', error);
159 | if (error instanceof McpError) {
160 | throw error;
161 | }
162 | throw new McpError(
163 | ErrorCode.InternalError,
164 | `Failed to get account assets: ${error instanceof Error ? error.message : String(error)}`
165 | );
166 | }
167 | }
168 |
169 | export async function lookupAccountAppLocalStates(address: string): Promise<ApplicationLocalStatesResponse> {
170 | try {
171 | console.log(`Looking up app local states for address ${address}`);
172 | const response = await indexerClient.lookupAccountAppLocalStates(address).do() as ApplicationLocalStatesResponse;
173 | console.log('App local states response:', JSON.stringify(response, null, 2));
174 | return response;
175 | } catch (error) {
176 | console.error('App local states lookup error:', error);
177 | if (error instanceof McpError) {
178 | throw error;
179 | }
180 | throw new McpError(
181 | ErrorCode.InternalError,
182 | `Failed to get account application local states: ${error instanceof Error ? error.message : String(error)}`
183 | );
184 | }
185 | }
186 |
187 | export async function lookupAccountCreatedApplications(address: string): Promise<ApplicationsResponse> {
188 | try {
189 | console.log(`Looking up created applications for address ${address}`);
190 | const response = await indexerClient.lookupAccountCreatedApplications(address).do() as ApplicationsResponse;
191 | console.log('Created applications response:', JSON.stringify(response, null, 2));
192 | return response;
193 | } catch (error) {
194 | console.error('Created applications lookup error:', error);
195 | if (error instanceof McpError) {
196 | throw error;
197 | }
198 | throw new McpError(
199 | ErrorCode.InternalError,
200 | `Failed to get account created applications: ${error instanceof Error ? error.message : String(error)}`
201 | );
202 | }
203 | }
204 |
205 | export async function searchAccounts(params?: {
206 | limit?: number;
207 | assetId?: number;
208 | applicationId?: number;
209 | currencyGreaterThan?: number;
210 | currencyLessThan?: number;
211 | nextToken?: string;
212 | }): Promise<AccountsResponse> {
213 | try {
214 | console.log('Searching accounts with params:', params);
215 | let search = indexerClient.searchAccounts();
216 |
217 | if (params?.limit) {
218 | search = search.limit(params.limit);
219 | }
220 | if (params?.assetId) {
221 | search = search.assetID(params.assetId);
222 | }
223 | if (params?.applicationId) {
224 | search = search.applicationID(params.applicationId);
225 | }
226 | if (params?.currencyGreaterThan) {
227 | search = search.currencyGreaterThan(params.currencyGreaterThan);
228 | }
229 | if (params?.currencyLessThan) {
230 | search = search.currencyLessThan(params.currencyLessThan);
231 | }
232 | if (params?.nextToken) {
233 | search = search.nextToken(params.nextToken);
234 | }
235 |
236 | const response = await search.do() as AccountsResponse;
237 | console.log('Search accounts response:', JSON.stringify(response, null, 2));
238 | return response;
239 | } catch (error) {
240 | console.error('Search accounts error:', error);
241 | if (error instanceof McpError) {
242 | throw error;
243 | }
244 | throw new McpError(
245 | ErrorCode.InternalError,
246 | `Failed to search accounts: ${error instanceof Error ? error.message : String(error)}`
247 | );
248 | }
249 | }
250 |
251 | export const handleAccountTools = ResponseProcessor.wrapResourceHandler(async function handleAccountTools(args: any): Promise<any> {
252 | const name = args.name;
253 |
254 | switch (name) {
255 | case 'api_indexer_lookup_account_by_id': {
256 | const { address } = args;
257 | const info = await lookupAccountByID(address);
258 | return info;
259 | }
260 | case 'api_indexer_lookup_account_app_local_states': {
261 | const { address } = args;
262 | const info = await lookupAccountAppLocalStates(address);
263 | return info;
264 | }
265 | case 'api_indexer_lookup_account_created_applications': {
266 | const { address } = args;
267 | const info = await lookupAccountCreatedApplications(address);
268 | return info.applications;
269 | }
270 | case 'api_indexer_search_for_accounts': {
271 | const info = await searchAccounts(args);
272 | return info.accounts;
273 | }
274 | case 'api_indexer_lookup_account_assets': {
275 | const { address, ...params } = args;
276 | const info = await lookupAccountAssets(address, params);
277 | return info.assets;
278 | }
279 | default:
280 | throw new McpError(
281 | ErrorCode.MethodNotFound,
282 | `Unknown tool: ${name}`
283 | );
284 | }
285 | });
286 |
```
--------------------------------------------------------------------------------
/packages/server/src/resources/knowledge/taxonomy/developer:docs:run-a-node:reference:artifacts.md:
--------------------------------------------------------------------------------
```markdown
1 | title: Node artifacts
2 |
3 | These files run as part of the Algorand node or are CLI utilities that will help to diagnose or interact with a currently running node. The primary files are described below.
4 |
5 | # goal
6 | Goal is the command line utility used to interact with the Algorand node. It communicates with algod and the kmd process to do things like: create an account, list the ledger, examine the status of the network, or create a transaction. Goal documentation is available in the [Goal](../../../clis/goal/goal) guide.
7 |
8 | # algod
9 | Algod is the main Algorand process for handling the blockchain. Messages between nodes are processed, the protocol steps are executed, and the blocks are written to disk. The algod process also exposes a REST API server that developers can use to communicate with the node and the network. Algod uses the data directory for storage and configuration information.
10 |
11 | # algoh
12 | Algoh is an optional hosting process for algod, whose use is encouraged to help catch fatal runtime errors and proactively report with logs. Algoh also monitors for stalls and proactively reports them with diagnostics data in case the problem is local to the instance. We’ll be adding optional layer-2 telemetry to some nodes running algoh, but it will be disabled for most nodes (and will be configurable).
13 |
14 | # kmd
15 | Kmd is the key management daemon. This process handles interacting with clients’ private keys for Algorand accounts. The process is responsible for generating and importing spending keys, signing transactions, and interacting with key storage mechanisms like hardware wallets. This process can also be executed on a separate machine, isolating the spending keys from the network. This process also uses a data directory for wallet configurations. In the default configuration, this will be in the data directory for algod but will contain its own folder labeled `kmd-version`. The kmd process also hosts a REST endpoint for integration.
16 |
17 | # algokey
18 | algokey is a command line utility for generating, exporting and importing keys. The tool can be used to sign single and multi-signature transactions as well. See [algokey](../../../clis/algokey/algokey) documentation for more details.
19 |
20 | # carpenter
21 | Carpenter is a debug tool that helps to visualize the protocol and how it is proceeding. The tool reads the node log file and formats the output. Generally, every entry displayed in the tool starts with the round number, with the period and step. Each line displayed in the tool will have a message that is relative to the step and will display when a proposal or a vote is accepted or rejected. When accepted votes are displayed, the number of votes is also included in parentheses. When the threshold for the vote is reached a message will be displayed letting the user know the next step in the protocol is about to start. Messages are color-coded by round and user.
22 |
23 | When running carpenter, just specify the latest.log file from the data directory.
24 |
25 | ```
26 | ./carpenter -file data/latest.log
27 | ```
28 |
29 | Or use the standard data directory specifier syntax:
30 |
31 | ```
32 | ./carpenter -d data
33 | ```
34 |
35 | If you have the `ALGORAND_DATA` environment variable set, you can just run:
36 |
37 | ```
38 | ./carpenter -D
39 | ```
40 |
41 | # update.sh, updater, and updatekey.json
42 | These are the primary files used for installing and updating the node software. They can be executed manually or put them in a CRON job and have it execute more regularly. The process for doing this is explained in the installation guide.
43 |
44 | # Node Data files
45 | As part of the installation process, a data directory is created. The node stores its local copy of the blockchain in this directory. Log files and configuration files are also stored here. Each of the configuration files is described below.
46 |
47 | # config.json.example
48 | This file is just an example configuration file that lets you configure a node with specific parameters. If this file is renamed to config.json, the settings in this file will take effect on the node when it is started. Each of the settings is defined in the Node configuration settings guide.
49 |
50 | # phonebook.json
51 | As discussed in [Algorand Node Types](../../setup/types) there are two types of nodes; relay and non-relay. Any node can function as either but it is not good practice for nodes that are relays to run the kmd process or manage accounts. Relay nodes have higher requirements and open more ports than standard non-relay nodes. Non-relay nodes only connect to relay nodes. They never connect to other non-relay nodes. The relay nodes are published in Algorand SRV records. You can create a relay node that is not in a SRV record. You can specify one or more of these non-published relays to be placed in a pool of available relay nodes for a node starting up. The node will randomly pick from this pool of nodes to open connections to communicate with the network. Before specifying how to change the relay pool, note that setting some options will replace the default SRV records from the pool. This means that if you intend to connect to the Algorand MainNet or TestNet network, the relays in your pool must connect to a published Algorand SRV relay.
52 |
53 | One method for replacing the pool entirely is to use the goal node start -p command. The -p parameter expects a list of relays that will be added to a pool. Note that this does away with the default pool. Here is an example of using the -p option to connect to TestNet.
54 |
55 | ```
56 | ./goal node start -d data -p "r1.algorand.network:4161;r2.algorand.network:4161"
57 | ```
58 |
59 | In this example, the two specified relays are the only ones used.
60 |
61 | Another option is to create a file named phonebook.json in your binary directory and add a list of relays similar to the following:
62 |
63 | ```
64 | { "Include": [
65 | "r1.algorand.network:4161",
66 | "r2.algorand.network:4161" ] }
67 | ```
68 |
69 | In this case, the entries are added to the default pool. If you want these entries to override the default pool set the `DNSBootstrapID` in config.json to "". Setting a configuration value for a node is described in the Node Configuration Settings guide.
70 |
71 | # node.archive.log and node.log
72 | The node.log file is the log file of the current node. This file contains a set of JSON entries for various steps processed by the node. The carpenter utility can be used to view these entries in a much more digestible format. Once the node log file has reached its maximum size, it is copied to node.archive.log and a new version of node.log is created.
73 |
74 | # algod-err.log, algod-out.log
75 | When started through goal, algod redirects the error and output streams to algod-err.log and algod-out.log respectively.
76 |
77 | algod.net, algod.pid and algod.token, algod-listen.net
78 | The algod.net, algo.pid and algod.token files are created in the node’s data folder when the node starts. The algod.net file contains the IP and port the node is serving REST API calls on. The algod.pid file contains the process id of the algod daemon of the running node. The algod.token file contains the API token that must be used to communicate with the node’s REST APIs. This is passed to the REST API using the `X-Algo-API-Token` header. algod-listen.net contains the IP and port that the node is listening on for incoming connections if any.
79 |
80 | # host.log
81 | Contains logging output from algoh.
82 |
83 | # wallet-genesis.id and genesis.json
84 | These files are associated with the genesis block and the associated wallet ids at creation of the network. The wallet-genesis.id file contains the unique id for the genesis block that was most recently installed. This is also the name of the directory in which the blockchain’s SQLite file is stored.
85 |
86 | The genesis.json file specifies the initial state of the blockchain - its ‘genesis block’. This is a JSON formatted file with the schema for the blockchain. It contains the network name and id, the protocol version and list of allocated addresses to start the chain with. Each address contains a list of things like their status and the amount of Algos they own.
87 |
88 | # Nested Directories
89 | The data directory will contain a couple of sub-directories depending on what has been done with that instance. One directory, named after the specific Algorand network and genesis version, will contain the SQLite files associated with the blockchain ledger and any wallets. There may be additional directories if the node has been updated. The backup directory contains a backup of the data directory. This allows the node to revert to the previous version in case of a failure during an update. A kmd directory may also exist with a SQLite instance for that process. It will also contain REST endpoint and API token files, similar to the algod files.
90 |
```
--------------------------------------------------------------------------------
/packages/server/src/resources/knowledge/taxonomy/SDKs:javascript:classes:indexerModels.Block.md:
--------------------------------------------------------------------------------
```markdown
1 | [algosdk](../README.md) / [Exports](../modules.md) / [indexerModels](../modules/indexerModels.md) / Block
2 |
3 | # Class: Block
4 |
5 | [indexerModels](../modules/indexerModels.md).Block
6 |
7 | Block information.
8 | Definition:
9 | data/bookkeeping/block.go : Block
10 |
11 | ## Hierarchy
12 |
13 | - `default`
14 |
15 | ↳ **`Block`**
16 |
17 | ## Table of contents
18 |
19 | ### Constructors
20 |
21 | - [constructor](indexerModels.Block.md#constructor)
22 |
23 | ### Properties
24 |
25 | - [attribute\_map](indexerModels.Block.md#attribute_map)
26 | - [bonus](indexerModels.Block.md#bonus)
27 | - [feesCollected](indexerModels.Block.md#feescollected)
28 | - [genesisHash](indexerModels.Block.md#genesishash)
29 | - [genesisId](indexerModels.Block.md#genesisid)
30 | - [participationUpdates](indexerModels.Block.md#participationupdates)
31 | - [previousBlockHash](indexerModels.Block.md#previousblockhash)
32 | - [proposer](indexerModels.Block.md#proposer)
33 | - [proposerPayout](indexerModels.Block.md#proposerpayout)
34 | - [rewards](indexerModels.Block.md#rewards)
35 | - [round](indexerModels.Block.md#round)
36 | - [seed](indexerModels.Block.md#seed)
37 | - [stateProofTracking](indexerModels.Block.md#stateprooftracking)
38 | - [timestamp](indexerModels.Block.md#timestamp)
39 | - [transactions](indexerModels.Block.md#transactions)
40 | - [transactionsRoot](indexerModels.Block.md#transactionsroot)
41 | - [transactionsRootSha256](indexerModels.Block.md#transactionsrootsha256)
42 | - [txnCounter](indexerModels.Block.md#txncounter)
43 | - [upgradeState](indexerModels.Block.md#upgradestate)
44 | - [upgradeVote](indexerModels.Block.md#upgradevote)
45 |
46 | ### Methods
47 |
48 | - [get\_obj\_for\_encoding](indexerModels.Block.md#get_obj_for_encoding)
49 | - [from\_obj\_for\_encoding](indexerModels.Block.md#from_obj_for_encoding)
50 |
51 | ## Constructors
52 |
53 | ### constructor
54 |
55 | • **new Block**(`«destructured»`)
56 |
57 | Creates a new `Block` object.
58 |
59 | #### Parameters
60 |
61 | | Name | Type |
62 | | :------ | :------ |
63 | | `«destructured»` | `Object` |
64 | | › `bonus?` | `number` \| `bigint` |
65 | | › `feesCollected?` | `number` \| `bigint` |
66 | | › `genesisHash` | `string` \| `Uint8Array` |
67 | | › `genesisId` | `string` |
68 | | › `participationUpdates?` | [`ParticipationUpdates`](indexerModels.ParticipationUpdates.md) |
69 | | › `previousBlockHash` | `string` \| `Uint8Array` |
70 | | › `proposer?` | `string` |
71 | | › `proposerPayout?` | `number` \| `bigint` |
72 | | › `rewards?` | [`BlockRewards`](indexerModels.BlockRewards.md) |
73 | | › `round` | `number` \| `bigint` |
74 | | › `seed` | `string` \| `Uint8Array` |
75 | | › `stateProofTracking?` | [`StateProofTracking`](indexerModels.StateProofTracking.md)[] |
76 | | › `timestamp` | `number` \| `bigint` |
77 | | › `transactions?` | [`Transaction`](indexerModels.Transaction.md)[] |
78 | | › `transactionsRoot` | `string` \| `Uint8Array` |
79 | | › `transactionsRootSha256` | `string` \| `Uint8Array` |
80 | | › `txnCounter?` | `number` \| `bigint` |
81 | | › `upgradeState?` | [`BlockUpgradeState`](indexerModels.BlockUpgradeState.md) |
82 | | › `upgradeVote?` | [`BlockUpgradeVote`](indexerModels.BlockUpgradeVote.md) |
83 |
84 | #### Overrides
85 |
86 | BaseModel.constructor
87 |
88 | #### Defined in
89 |
90 | client/v2/indexer/models/types.ts:2292
91 |
92 | ## Properties
93 |
94 | ### attribute\_map
95 |
96 | • **attribute\_map**: `Record`\<`string`, `string`\>
97 |
98 | #### Inherited from
99 |
100 | BaseModel.attribute\_map
101 |
102 | #### Defined in
103 |
104 | client/v2/basemodel.ts:56
105 |
106 | ___
107 |
108 | ### bonus
109 |
110 | • `Optional` **bonus**: `number` \| `bigint`
111 |
112 | the potential bonus payout for this block.
113 |
114 | #### Defined in
115 |
116 | client/v2/indexer/models/types.ts:2202
117 |
118 | ___
119 |
120 | ### feesCollected
121 |
122 | • `Optional` **feesCollected**: `number` \| `bigint`
123 |
124 | the sum of all fees paid by transactions in this block.
125 |
126 | #### Defined in
127 |
128 | client/v2/indexer/models/types.ts:2207
129 |
130 | ___
131 |
132 | ### genesisHash
133 |
134 | • **genesisHash**: `Uint8Array`
135 |
136 | (gh) hash to which this block belongs.
137 |
138 | #### Defined in
139 |
140 | client/v2/indexer/models/types.ts:2154
141 |
142 | ___
143 |
144 | ### genesisId
145 |
146 | • **genesisId**: `string`
147 |
148 | (gen) ID to which this block belongs.
149 |
150 | #### Defined in
151 |
152 | client/v2/indexer/models/types.ts:2159
153 |
154 | ___
155 |
156 | ### participationUpdates
157 |
158 | • `Optional` **participationUpdates**: [`ParticipationUpdates`](indexerModels.ParticipationUpdates.md)
159 |
160 | Participation account data that needs to be checked/acted on by the network.
161 |
162 | #### Defined in
163 |
164 | client/v2/indexer/models/types.ts:2212
165 |
166 | ___
167 |
168 | ### previousBlockHash
169 |
170 | • **previousBlockHash**: `Uint8Array`
171 |
172 | (prev) Previous block hash.
173 |
174 | #### Defined in
175 |
176 | client/v2/indexer/models/types.ts:2164
177 |
178 | ___
179 |
180 | ### proposer
181 |
182 | • `Optional` **proposer**: `string`
183 |
184 | the proposer of this block.
185 |
186 | #### Defined in
187 |
188 | client/v2/indexer/models/types.ts:2217
189 |
190 | ___
191 |
192 | ### proposerPayout
193 |
194 | • `Optional` **proposerPayout**: `number` \| `bigint`
195 |
196 | the actual amount transferred to the proposer from the fee sink.
197 |
198 | #### Defined in
199 |
200 | client/v2/indexer/models/types.ts:2222
201 |
202 | ___
203 |
204 | ### rewards
205 |
206 | • `Optional` **rewards**: [`BlockRewards`](indexerModels.BlockRewards.md)
207 |
208 | Fields relating to rewards,
209 |
210 | #### Defined in
211 |
212 | client/v2/indexer/models/types.ts:2227
213 |
214 | ___
215 |
216 | ### round
217 |
218 | • **round**: `number` \| `bigint`
219 |
220 | (rnd) Current round on which this block was appended to the chain.
221 |
222 | #### Defined in
223 |
224 | client/v2/indexer/models/types.ts:2169
225 |
226 | ___
227 |
228 | ### seed
229 |
230 | • **seed**: `Uint8Array`
231 |
232 | (seed) Sortition seed.
233 |
234 | #### Defined in
235 |
236 | client/v2/indexer/models/types.ts:2174
237 |
238 | ___
239 |
240 | ### stateProofTracking
241 |
242 | • `Optional` **stateProofTracking**: [`StateProofTracking`](indexerModels.StateProofTracking.md)[]
243 |
244 | Tracks the status of state proofs.
245 |
246 | #### Defined in
247 |
248 | client/v2/indexer/models/types.ts:2232
249 |
250 | ___
251 |
252 | ### timestamp
253 |
254 | • **timestamp**: `number` \| `bigint`
255 |
256 | (ts) Block creation timestamp in seconds since eposh
257 |
258 | #### Defined in
259 |
260 | client/v2/indexer/models/types.ts:2179
261 |
262 | ___
263 |
264 | ### transactions
265 |
266 | • `Optional` **transactions**: [`Transaction`](indexerModels.Transaction.md)[]
267 |
268 | (txns) list of transactions corresponding to a given round.
269 |
270 | #### Defined in
271 |
272 | client/v2/indexer/models/types.ts:2237
273 |
274 | ___
275 |
276 | ### transactionsRoot
277 |
278 | • **transactionsRoot**: `Uint8Array`
279 |
280 | (txn) TransactionsRoot authenticates the set of transactions appearing in the
281 | block. More specifically, it's the root of a merkle tree whose leaves are the
282 | block's Txids, in lexicographic order. For the empty block, it's 0. Note that
283 | the TxnRoot does not authenticate the signatures on the transactions, only the
284 | transactions themselves. Two blocks with the same transactions but in a
285 | different order and with different signatures will have the same TxnRoot.
286 |
287 | #### Defined in
288 |
289 | client/v2/indexer/models/types.ts:2189
290 |
291 | ___
292 |
293 | ### transactionsRootSha256
294 |
295 | • **transactionsRootSha256**: `Uint8Array`
296 |
297 | (txn256) TransactionsRootSHA256 is an auxiliary TransactionRoot, built using a
298 | vector commitment instead of a merkle tree, and SHA256 hash function instead of
299 | the default SHA512_256. This commitment can be used on environments where only
300 | the SHA256 function exists.
301 |
302 | #### Defined in
303 |
304 | client/v2/indexer/models/types.ts:2197
305 |
306 | ___
307 |
308 | ### txnCounter
309 |
310 | • `Optional` **txnCounter**: `number` \| `bigint`
311 |
312 | (tc) TxnCounter counts the number of transactions committed in the ledger, from
313 | the time at which support for this feature was introduced.
314 | Specifically, TxnCounter is the number of the next transaction that will be
315 | committed after this block. It is 0 when no transactions have ever been
316 | committed (since TxnCounter started being supported).
317 |
318 | #### Defined in
319 |
320 | client/v2/indexer/models/types.ts:2246
321 |
322 | ___
323 |
324 | ### upgradeState
325 |
326 | • `Optional` **upgradeState**: [`BlockUpgradeState`](indexerModels.BlockUpgradeState.md)
327 |
328 | Fields relating to a protocol upgrade.
329 |
330 | #### Defined in
331 |
332 | client/v2/indexer/models/types.ts:2251
333 |
334 | ___
335 |
336 | ### upgradeVote
337 |
338 | • `Optional` **upgradeVote**: [`BlockUpgradeVote`](indexerModels.BlockUpgradeVote.md)
339 |
340 | Fields relating to voting for a protocol upgrade.
341 |
342 | #### Defined in
343 |
344 | client/v2/indexer/models/types.ts:2256
345 |
346 | ## Methods
347 |
348 | ### get\_obj\_for\_encoding
349 |
350 | ▸ **get_obj_for_encoding**(`binary?`): `Record`\<`string`, `any`\>
351 |
352 | Get an object ready for encoding to either JSON or msgpack.
353 |
354 | #### Parameters
355 |
356 | | Name | Type | Default value | Description |
357 | | :------ | :------ | :------ | :------ |
358 | | `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. |
359 |
360 | #### Returns
361 |
362 | `Record`\<`string`, `any`\>
363 |
364 | #### Inherited from
365 |
366 | BaseModel.get\_obj\_for\_encoding
367 |
368 | #### Defined in
369 |
370 | client/v2/basemodel.ts:65
371 |
372 | ___
373 |
374 | ### from\_obj\_for\_encoding
375 |
376 | ▸ `Static` **from_obj_for_encoding**(`data`): [`Block`](indexerModels.Block.md)
377 |
378 | #### Parameters
379 |
380 | | Name | Type |
381 | | :------ | :------ |
382 | | `data` | `Record`\<`string`, `any`\> |
383 |
384 | #### Returns
385 |
386 | [`Block`](indexerModels.Block.md)
387 |
388 | #### Defined in
389 |
390 | client/v2/indexer/models/types.ts:2393
391 |
```
--------------------------------------------------------------------------------
/packages/server/src/resources/knowledge/taxonomy/algokit:cli:features:generate.md:
--------------------------------------------------------------------------------
```markdown
1 | # AlgoKit Generate
2 |
3 | The `algokit generate` [command](../cli/index.md#generate) is used to generate components used in an AlgoKit project. It also allows for custom generate commands which are loaded from the .algokit.toml file in your project directory.
4 |
5 | ## 1. Typed clients
6 |
7 | The `algokit generate client` [command](../cli/index.md#client) can be used to generate a typed client from an [ARC-0032](https://arc.algorand.foundation/ARCs/arc-0032) or [ARC-0056](https://github.com/algorandfoundation/ARCs/pull/258) application specification with both Python and TypeScript available as target languages.
8 |
9 | ### Prerequisites
10 |
11 | To generate Python clients an installation of pip and pipx is required.
12 | To generate TypeScript clients an installation of Node.js and npx is also required.
13 |
14 | Each generated client will also have a dependency on `algokit-utils` libraries for the target language.
15 |
16 | ### Input file / directory
17 |
18 | You can either specify a path to an ARC-0032 JSON file, an ARC-0056 JSON file or to a directory that is recursively scanned for `application.json`, `*.arc32.json`, `*.arc56.json` file(s).
19 |
20 | ### Output tokens
21 |
22 | The output path is interpreted as relative to the current working directory, however an absolute path may also be specified e.g.
23 | `algokit generate client application.json --output /absolute/path/to/client.py`
24 |
25 | There are two tokens available for use with the `-o`, `--output` [option](../cli/index.md#-o---output-):
26 |
27 | - `{contract_name}`: This will resolve to a name based on the ARC-0032/ARC-0056 contract name, formatted appropriately for the target language.
28 | - `{app_spec_dir}`: This will resolve to the parent directory of the `application.json`, `*.arc32.json`, `*.arc56.json` file which can be useful to output a client relative to its source file.
29 |
30 | ### Version Pinning
31 |
32 | If you want to ensure typed client output stability across different environments and additionally protect yourself from any potential breaking changes introduced in the client generator packages, you can specify a version you'd like to pin to.
33 |
34 | To make use of this feature, pass `-v`, `--version`, for example `algokit generate client --version 1.2.3 path/to/application.json`.
35 |
36 | Alternatively, you can achieve output stability by installing the underlying [Python](https://github.com/algorandfoundation/algokit-client-generator-py) or [TypeScript](https://github.com/algorandfoundation/algokit-client-generator-ts) client generator package either locally in your project (via `poetry` or `npm` respectively) or globally on your system (via `pipx` or `npm` respectively). AlgoKit will search for a matching installed version before dynamically resolving.
37 |
38 | ### Usage
39 |
40 | Usage examples of using a generated client are below, typed clients allow your favourite IDE to provide better intellisense to provide better discoverability
41 | of available operations and parameters.
42 |
43 | #### Python
44 |
45 | ```python
46 | # A similar working example can be seen in the algokit python template, when using Python deployment
47 | from smart_contracts.artifacts.HelloWorldApp.client import (
48 | HelloWorldAppClient,
49 | )
50 |
51 | app_client = HelloWorldAppClient(
52 | algod_client,
53 | creator=deployer,
54 | indexer_client=indexer_client,
55 | )
56 | deploy_response = app_client.deploy(
57 | on_schema_break=OnSchemaBreak.ReplaceApp,
58 | on_update=OnUpdate.UpdateApp,
59 | allow_delete=True,
60 | allow_update=True,
61 | )
62 |
63 | response = app_client.hello(name="World")
64 | ```
65 |
66 | #### TypeScript
67 |
68 | ```typescript
69 | // A similar working example can be seen in the algokit python template with typescript deployer, when using TypeScript deployment
70 | import { HelloWorldAppClient } from "./artifacts/HelloWorldApp/client";
71 |
72 | const appClient = new HelloWorldAppClient(
73 | {
74 | resolveBy: "creatorAndName",
75 | findExistingUsing: indexer,
76 | sender: deployer,
77 | creatorAddress: deployer.addr,
78 | },
79 | algod
80 | );
81 | const app = await appClient.deploy({
82 | allowDelete: isLocal,
83 | allowUpdate: isLocal,
84 | onSchemaBreak: isLocal ? "replace" : "fail",
85 | onUpdate: isLocal ? "update" : "fail",
86 | });
87 | const response = await appClient.hello({ name: "world" });
88 | ```
89 |
90 | ### Examples
91 |
92 | To output a single application.json to a python typed client:
93 | `algokit generate client path/to/application.json --output client.py`
94 |
95 | To process multiple application.json in a directory structure and output to a typescript client for each in the current directory:
96 | `algokit generate client smart_contracts/artifacts --output {contract_name}.ts`
97 |
98 | To process multiple application.json in a directory structure and output to a python client alongside each application.json:
99 | `algokit generate client smart_contracts/artifacts --output {app_spec_path}/client.py`
100 |
101 | ## 2. Using Custom Generate Commands
102 |
103 | Custom generate commands are defined in the `.algokit.toml` file within the project directory, typically supplied by community template builders or official AlgoKit templates. These commands are specified under the `generate` key and serve to execute a generator at a designated path with provided answer key/value pairs.
104 |
105 | ### Understanding `Generators`
106 |
107 | A `generator` is essentially a compact, self-sufficient `copier` template. This template can optionally be defined within the primary `algokit templates` to offer supplementary functionality after a project is initialized from the template. For instance, the official [`algokit-python-template`](https://github.com/algorandfoundation/algokit-python-template/tree/main/template_content) provides a generator within the `.algokit/generators` directory. This generator can be employed for executing extra tasks on AlgoKit projects that have been initiated from this template, such as adding new smart contracts to an existing project. For a comprehensive explanation, please refer to the [`architecture decision record`](../architecture-decisions/2023-07-19_advanced_generate_command.md).
108 |
109 | ### Requirements
110 |
111 | To utilize custom generate commands, you must have `copier` installed. This installation is included by default in the AlgoKit CLI. Therefore, no additional installation is necessary if you have already installed the `algokit cli`.
112 |
113 | ### How to Use
114 |
115 | A custom command can be defined in the `.algokit.toml` as shown:
116 |
117 | ```toml
118 | [generate.my_generator]
119 | path = "path/to/my_generator"
120 | description = "A brief description of the function of my_generator"
121 | ```
122 |
123 | Following this, you can execute the command as follows:
124 |
125 | `algokit generate my_generator --answer key value --path path/to/my_generator`
126 |
127 | If no `path` is given, the command will use the path specified in the `.algokit.toml`. If no `answer` is provided, the command will initiate an interactive `copier` prompt to request answers (similar to `algokit init`).
128 |
129 | The custom command employs the `copier` library to duplicate the files from the generator's path to the current working directory, substituting any values from the `answers` dictionary.
130 |
131 | ### Examples
132 |
133 | As an example, let's use the `smart-contract` generator from the `algokit-python-template` to add new contract to an existing project based on that template. The `smart-contract` generator is defined as follows:
134 |
135 | ```toml
136 | [algokit]
137 | min_version = "v1.3.1"
138 |
139 | ... # other keys
140 |
141 | [generate.smart_contract]
142 | description = "Adds a new smart contract to the existing project"
143 | path = ".algokit/generators/create_contract"
144 | ```
145 |
146 | To execute this generator, ensure that you are operating from the same directory as the `.algokit.toml` file, and then run:
147 |
148 | ```bash
149 | $ algokit generate
150 |
151 | # The output will be as follows:
152 | # Note how algokit dynamically injects a new `smart-contract` command based
153 | # on the `.algokit.toml` file
154 |
155 | Usage: algokit generate [OPTIONS] COMMAND [ARGS]...
156 |
157 | Generate code for an Algorand project.
158 |
159 | Options:
160 | -h, --help Show this message and exit.
161 |
162 | Commands:
163 | client Create a typed ApplicationClient from an ARC-32 application.json
164 | smart-contract Adds a new smart contract to the existing project
165 | ```
166 |
167 | To execute the `smart-contract` generator, run:
168 |
169 | ```bash
170 | $ algokit generate smart-contract
171 |
172 | # or
173 |
174 | $ algokit generate smart-contract -a contract_name "MyCoolContract"
175 | ```
176 |
177 | #### Third Party Generators
178 |
179 | It is important to understand that by default, AlgoKit will always prompt you before executing a generator to ensure it's from a trusted source. If you are confident about the source of the generator, you can use the `--force` or `-f` option to execute the generator without this confirmation prompt. Be cautious while using this option and ensure the generator is from a trusted source. At the moment, a trusted source for a generator is defined as _a generator that is included in the official AlgoKit templates (e.g. `smart-contract` generator in `algokit-python-template`)_
180 |
```
--------------------------------------------------------------------------------
/packages/server/src/resources/knowledge/taxonomy/algokit:cli:features:init.md:
--------------------------------------------------------------------------------
```markdown
1 | # AlgoKit Init
2 |
3 | The `algokit init` [command](../cli/index.md#init) is used to quickly initialize new projects using official Algorand Templates or community provided templates. It supports a fully guided command line wizard experience, as well as fully scriptable / non-interactive functionality via command options.
4 |
5 | ## Quick start
6 |
7 | For a quick start template with all of the defaults you can run: `algokit init` which will interactively guide you through picking the right stack to build your AlgoKit project. Afterwards, you should immediately be able to hit F5 to compile the hello world smart contract to the `smart_contracts/artifacts` folder (with breakpoint debugging - try setting a breakpoint in `smart_contracts/helloworld.py`) and open the `smart_contracts/helloworld.py` file and get linting, automatic formatting and syntax highlighting.
8 |
9 | ## Prerequisites
10 |
11 | Git is a prerequisite for the init command as it is used to clone templates and initialize git repos. Please consult the [README](../../README.md#prerequisites) for installation instructions.
12 |
13 | ## Functionality
14 |
15 | As outlined in [quick start](#quick-start), the simplest use of the command is to just run `algokit init` and you will then be guided through selecting a template and configuring options for that template. e.g.
16 |
17 | ```
18 | $ ~ algokit init
19 | ? Which of these options best describes the project you want to start? `Smart Contract` | `Dapp Frontend` | `Smart Contract & Dapp Frontend` | `Custom`
20 | ? Name of project / directory to create the project in: my-cool-app
21 | ```
22 |
23 | Once above 2 questions are answered, the `cli` will start instantiating the project and will start asking questions specific to the template you are instantiating. By default official templates such as `python`, `fullstack`, `react`, `python` include a notion of a `preset`. If you want to skip all questions and let the tool preset the answers tailored for a starter project you can pick `Starter`, for a more advanced project that includes unit tests, CI automation and other advanced features, pick `Production`. Lastly, if you prefer to modify the experience and tailor the template to your needs, pick the `Custom` preset.
24 |
25 | If you want to accept the default for each option simply hit [enter] or alternatively to speed things up you can run `algokit init --defaults` and they will be auto-accepted.
26 |
27 | ### Workspaces vs Standalone Projects
28 |
29 | 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.
30 |
31 | 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.
32 |
33 | 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.
34 |
35 | For more details on workspaces and standalone projects, refer to the [AlgoKit Project documentation](./project.md#workspaces-vs-standalone-projects).
36 |
37 | ## Bootstrapping
38 |
39 | You will also be prompted if you wish to run the [bootstrap](../cli/index.md#bootstrap) command, this is useful if you plan to immediately begin developing in the new project. If you passed in `--defaults` or `--bootstrap` then it will automatically run bootstrapping unless you passed in `--no-bootstrap`.
40 |
41 | ```
42 |
43 | ? Do you want to run `algokit bootstrap` to bootstrap dependencies for this new project so it can be run immediately? Yes
44 | Installing Python dependencies and setting up Python virtual environment via Poetry
45 | poetry: Creating virtualenv my-smart-contract in /Users/algokit/algokit-init/my-smart-contract/.venv
46 | poetry: Updating dependencies
47 | poetry: Resolving dependencies...
48 | poetry:
49 | poetry: Writing lock file
50 | poetry:
51 | poetry: Package operations: 53 installs, 0 updates, 0 removals
52 | poetry:
53 | poetry: • Installing pycparser (2.21)
54 |
55 | ---- other output omitted for brevity ----
56 |
57 | poetry: • Installing ruff (0.0.171)
58 | Copying /Users/algokit/algokit-init/my-smart-contract/smart_contracts/.env.template to /Users/algokit/algokit-init/my-smart-contract/smart_contracts/.env and prompting for empty values
59 | ? Would you like to initialise a git repository and perform an initial commit? Yes
60 | 🎉 Performed initial git commit successfully! 🎉
61 | 🙌 Project initialized at `my-smart-contract`! For template specific next steps, consult the documentation of your selected template 🧐
62 | Your selected template comes from:
63 | ➡️ https://github.com/algorandfoundation/algokit-python-template
64 | As a suggestion, if you wanted to open the project in VS Code you could execute:
65 |
66 | > cd my-smart-contract && code .
67 |
68 | ```
69 |
70 | After bootstrapping you are also given the opportunity to initialize a git repo, upon successful completion of the init command the project is ready to be used. If you pass in `--git` it will automatically initialise the git repository and if you pass in `--no-git` it won't.
71 |
72 | > Please note, when using `--no-workspaces`, algokit init will assume a max lookup depth of 1 for a fresh template based project. Otherwise it will assume a max depth of 2, since default algokit workspace structure is at most 2 levels deep.
73 |
74 | ## Options
75 |
76 | There are a number of options that can be used to provide answers to the template prompts. Some of the options requiring further explanation are detailed below, but consult the CLI reference for all available [options](../cli/index.md#init).
77 |
78 | ## Community Templates
79 |
80 | As well as the official Algorand templates shown when running the init command, community templates can also be provided by providing a URL via the prompt or the `--template-url` option.
81 |
82 | e.g. `algokit init --template-url https://github.com/algorandfoundation/algokit-python-template` (that being the url of the official python template, the same as `algokit init -t python`).
83 |
84 | The `--template-url` option can be combined with `--template-url-ref` to specify a specific commit, branch or tag
85 |
86 | e.g. `algokit init --template-url https://github.com/algorandfoundation/algokit-python-template --template-url-ref 0232bb68a2f5628e910ee52f62bf13ded93fe672`
87 |
88 | If the URL is not an official template there is a potential security risk and so to continue you must either acknowledge this prompt, or if you are in a non-interactive environment you can pass the `--UNSAFE-SECURITY-accept-template-url` option (but we generally don't recommend this option so users can review the warning message first) e.g.
89 |
90 | ```
91 |
92 | Community templates have not been reviewed, and can execute arbitrary code.
93 | Please inspect the template repository, and pay particular attention to the values of \_tasks, \_migrations and \_jinja_extensions in copier.yml
94 | ? Continue anyway? Yes
95 |
96 | ```
97 |
98 | If you want to create a community template, you can use the [AlgoKit guidelines on template building](https://github.com/algorandfoundation/algokit-cli/blob/main/docs/tutorials/algokit-template.md#creating-algokit-templates) and [Copier documentation](https://copier.readthedocs.io/en/stable/) as a starting point.
99 |
100 | ## Template Answers
101 |
102 | Answers to specific template prompts can be provided with the `--answer {key} {value}` option, which can be used multiple times for each prompt. Quotes can be used for values with spaces e.g. `--answer author_name "Algorand Foundation"`.
103 |
104 | To find out the key for a specific answer you can either look at `.algokit/.copier-answers.yml` in the root folder of a project created via `algokit init` or in the `copier.yaml` file of a template repo e.g. for the [python template](https://github.com/algorandfoundation/algokit-python-template/blob/main/copier.yaml).
105 |
106 | ## Non-interactive project initialization
107 |
108 | By combining a number of options, it is possible to initialize a new project without any interaction. For example, to create a project named `my-smart-contract` using the `python` template with no git, no bootstrapping, the author name of `Algorand Foundation`, and defaults for all other values, you could execute the following:
109 |
110 | ```
111 |
112 | $ ~ algokit init -n my-smart-contract -t python --no-git --no-bootstrap --answer author_name "Algorand Foundation" --defaults
113 | 🙌 Project initialized at `my-smart-contract`! For template specific next steps, consult the documentation of your selected template 🧐
114 | Your selected template comes from:
115 | ➡️ https://github.com/algorandfoundation/algokit-python-template
116 | As a suggestion, if you wanted to open the project in VS Code you could execute:
117 |
118 | > cd my-smart-contract && code .
119 |
120 | ```
121 |
122 | For more details about the `AlgoKit init` command, please refer to the [AlgoKit CLI reference documentation](../cli/index.md#init).
123 |
```