#
tokens: 49017/50000 3/942 files (page 53/93)
lines: on (toggle) GitHub
raw markdown copy reset
This is page 53 of 93. Use http://codebase.md/goplausible/algorand-mcp?lines=true&page={x} to view the full context.

# Directory Structure

```
├── .gitignore
├── CONTRIBUTING.md
├── LICENSE
├── llms-install.md
├── llms.txt
├── package.json
├── packages
│   ├── client
│   │   ├── .env.example
│   │   ├── package.json
│   │   ├── README.md
│   │   ├── src
│   │   │   ├── env.ts
│   │   │   ├── index.ts
│   │   │   └── LocalWallet.ts
│   │   └── tsconfig.json
│   └── server
│       ├── .env.example
│       ├── API specs
│       │   ├── algod_api.json
│       │   ├── indexer_api.json
│       │   ├── mcp.json
│       │   ├── nfd_api.json
│       │   ├── ultrade_api.json
│       │   ├── vestige_api.json
│       │   └── vestige_free_api.json
│       ├── Dockerfile
│       ├── jest.config.js
│       ├── package.json
│       ├── README.md
│       ├── smithery.yaml
│       ├── src
│       │   ├── algorand-client.ts
│       │   ├── env.ts
│       │   ├── index.ts
│       │   ├── resources
│       │   │   ├── index.ts
│       │   │   ├── knowledge
│       │   │   │   ├── ARCs.txt
│       │   │   │   ├── developers-algokit-architecture-decisions.txt
│       │   │   │   ├── developers-algokit-cli.txt
│       │   │   │   ├── developers-algokit-utils-python.txt
│       │   │   │   ├── developers-algokit-utils-typescript.txt
│       │   │   │   ├── developers-clis.txt
│       │   │   │   ├── developers-details.txt
│       │   │   │   ├── developers-liquid-auth.txt
│       │   │   │   ├── developers-nodes.txt
│       │   │   │   ├── developers-puya.txt
│       │   │   │   ├── developers-python.txt
│       │   │   │   ├── developers-sdks-js.txt
│       │   │   │   ├── developers-sdks-python.txt
│       │   │   │   ├── developers-tealscript.txt
│       │   │   │   ├── developers.txt
│       │   │   │   ├── index.ts
│       │   │   │   ├── taxonomy
│       │   │   │   │   ├── algokit-cli:README.md
│       │   │   │   │   ├── algokit:cli:algokit.md
│       │   │   │   │   ├── algokit:cli:architecture-decisions:2022-11-14_sandbox-approach.md
│       │   │   │   │   ├── algokit:cli:architecture-decisions:2022-11-22_beaker-testing-strategy.md
│       │   │   │   │   ├── algokit:cli:architecture-decisions:2023-01-11_beaker_productionisation_review.md
│       │   │   │   │   ├── algokit:cli:architecture-decisions:2023-01-11_brew_install.md
│       │   │   │   │   ├── algokit:cli:architecture-decisions:2023-01-12_smart-contract-deployment.md
│       │   │   │   │   ├── algokit:cli:architecture-decisions:2023-06-06_frontend-templates.md
│       │   │   │   │   ├── algokit:cli:architecture-decisions:2023-07-19_advanced_generate_command.md
│       │   │   │   │   ├── algokit:cli:architecture-decisions:2024-01-13_native_binaries.md
│       │   │   │   │   ├── algokit:cli:architecture-decisions:2024-01-23_init-wizard-v2.md
│       │   │   │   │   ├── algokit:cli:architecture-decisions:2024-01-31_binary_distribution.md
│       │   │   │   │   ├── algokit:cli:architecture-decisions:2024-03-06_local_dev_ui_packaging.md
│       │   │   │   │   ├── algokit:cli:articles:output_stability.md
│       │   │   │   │   ├── algokit:cli:cli:index.md
│       │   │   │   │   ├── algokit:cli:features:compile.md
│       │   │   │   │   ├── algokit:cli:features:completions.md
│       │   │   │   │   ├── algokit:cli:features:config.md
│       │   │   │   │   ├── algokit:cli:features:dispenser.md
│       │   │   │   │   ├── algokit:cli:features:doctor.md
│       │   │   │   │   ├── algokit:cli:features:explore.md
│       │   │   │   │   ├── algokit:cli:features:generate.md
│       │   │   │   │   ├── algokit:cli:features:goal.md
│       │   │   │   │   ├── algokit:cli:features:init.md
│       │   │   │   │   ├── algokit:cli:features:localnet.md
│       │   │   │   │   ├── algokit:cli:features:project:bootstrap.md
│       │   │   │   │   ├── algokit:cli:features:project:deploy.md
│       │   │   │   │   ├── algokit:cli:features:project:link.md
│       │   │   │   │   ├── algokit:cli:features:project:list.md
│       │   │   │   │   ├── algokit:cli:features:project:run.md
│       │   │   │   │   ├── algokit:cli:features:project.md
│       │   │   │   │   ├── algokit:cli:features:tasks:analyze.md
│       │   │   │   │   ├── algokit:cli:features:tasks:ipfs.md
│       │   │   │   │   ├── algokit:cli:features:tasks:mint.md
│       │   │   │   │   ├── algokit:cli:features:tasks:nfd.md
│       │   │   │   │   ├── algokit:cli:features:tasks:opt.md
│       │   │   │   │   ├── algokit:cli:features:tasks:send.md
│       │   │   │   │   ├── algokit:cli:features:tasks:sign.md
│       │   │   │   │   ├── algokit:cli:features:tasks:transfer.md
│       │   │   │   │   ├── algokit:cli:features:tasks:vanity_address.md
│       │   │   │   │   ├── algokit:cli:features:tasks:wallet.md
│       │   │   │   │   ├── algokit:cli:features:tasks.md
│       │   │   │   │   ├── algokit:cli:tutorials:algokit-template.md
│       │   │   │   │   ├── algokit:cli:tutorials:intro.md
│       │   │   │   │   ├── algokit:cli:tutorials:smart-contracts.md
│       │   │   │   │   ├── algokit:docs:testnet_api.md
│       │   │   │   │   ├── algokit:lora:README.md
│       │   │   │   │   ├── algokit:README.md
│       │   │   │   │   ├── algokit:utils:python:markdown:apidocs:algokit_utils:algokit_utils.md
│       │   │   │   │   ├── algokit:utils:python:markdown:capabilities:account.md
│       │   │   │   │   ├── algokit:utils:python:markdown:capabilities:app-client.md
│       │   │   │   │   ├── algokit:utils:python:markdown:capabilities:app-deploy.md
│       │   │   │   │   ├── algokit:utils:python:markdown:capabilities:client.md
│       │   │   │   │   ├── algokit:utils:python:markdown:capabilities:debugger.md
│       │   │   │   │   ├── algokit:utils:python:markdown:capabilities:dispenser-client.md
│       │   │   │   │   ├── algokit:utils:python:markdown:capabilities:transfer.md
│       │   │   │   │   ├── algokit:utils:python:markdown:index.md
│       │   │   │   │   ├── algokit:utils:python:README.md
│       │   │   │   │   ├── algokit:utils:python:source:capabilities:account.md
│       │   │   │   │   ├── algokit:utils:python:source:capabilities:app-client.md
│       │   │   │   │   ├── algokit:utils:python:source:capabilities:app-deploy.md
│       │   │   │   │   ├── algokit:utils:python:source:capabilities:client.md
│       │   │   │   │   ├── algokit:utils:python:source:capabilities:debugger.md
│       │   │   │   │   ├── algokit:utils:python:source:capabilities:dispenser-client.md
│       │   │   │   │   ├── algokit:utils:python:source:capabilities:transfer.md
│       │   │   │   │   ├── algokit:utils:python:source:index.md
│       │   │   │   │   ├── algokit:utils:typescript:capabilities:account.md
│       │   │   │   │   ├── algokit:utils:typescript:capabilities:algorand-client.md
│       │   │   │   │   ├── algokit:utils:typescript:capabilities:amount.md
│       │   │   │   │   ├── algokit:utils:typescript:capabilities:app-client.md
│       │   │   │   │   ├── algokit:utils:typescript:capabilities:app-deploy.md
│       │   │   │   │   ├── algokit:utils:typescript:capabilities:app.md
│       │   │   │   │   ├── algokit:utils:typescript:capabilities:asset.md
│       │   │   │   │   ├── algokit:utils:typescript:capabilities:client.md
│       │   │   │   │   ├── algokit:utils:typescript:capabilities:debugging.md
│       │   │   │   │   ├── algokit:utils:typescript:capabilities:dispenser-client.md
│       │   │   │   │   ├── algokit:utils:typescript:capabilities:event-emitter.md
│       │   │   │   │   ├── algokit:utils:typescript:capabilities:indexer.md
│       │   │   │   │   ├── algokit:utils:typescript:capabilities:testing.md
│       │   │   │   │   ├── algokit:utils:typescript:capabilities:transaction-composer.md
│       │   │   │   │   ├── algokit:utils:typescript:capabilities:transaction.md
│       │   │   │   │   ├── algokit:utils:typescript:capabilities:transfer.md
│       │   │   │   │   ├── algokit:utils:typescript:capabilities:typed-app-clients.md
│       │   │   │   │   ├── algokit:utils:typescript:code:classes:testing.TestLogger.md
│       │   │   │   │   ├── algokit:utils:typescript:code:classes:testing.TransactionLogger.md
│       │   │   │   │   ├── algokit:utils:typescript:code:classes:types_account_manager.AccountManager.md
│       │   │   │   │   ├── algokit:utils:typescript:code:classes:types_account.MultisigAccount.md
│       │   │   │   │   ├── algokit:utils:typescript:code:classes:types_account.SigningAccount.md
│       │   │   │   │   ├── algokit:utils:typescript:code:classes:types_algo_http_client_with_retry.AlgoHttpClientWithRetry.md
│       │   │   │   │   ├── algokit:utils:typescript:code:classes:types_algorand_client_transaction_creator.AlgorandClientTransactionCreator.md
│       │   │   │   │   ├── algokit:utils:typescript:code:classes:types_algorand_client_transaction_sender.AlgorandClientTransactionSender.md
│       │   │   │   │   ├── algokit:utils:typescript:code:classes:types_algorand_client.AlgorandClient.md
│       │   │   │   │   ├── algokit:utils:typescript:code:classes:types_amount.AlgoAmount.md
│       │   │   │   │   ├── algokit:utils:typescript:code:classes:types_app_arc56.Arc56Method.md
│       │   │   │   │   ├── algokit:utils:typescript:code:classes:types_app_client.AppClient.md
│       │   │   │   │   ├── algokit:utils:typescript:code:classes:types_app_client.ApplicationClient.md
│       │   │   │   │   ├── algokit:utils:typescript:code:classes:types_app_deployer.AppDeployer.md
│       │   │   │   │   ├── algokit:utils:typescript:code:classes:types_app_factory.AppFactory.md
│       │   │   │   │   ├── algokit:utils:typescript:code:classes:types_app_manager.AppManager.md
│       │   │   │   │   ├── algokit:utils:typescript:code:classes:types_asset_manager.AssetManager.md
│       │   │   │   │   ├── algokit:utils:typescript:code:classes:types_async_event_emitter.AsyncEventEmitter.md
│       │   │   │   │   ├── algokit:utils:typescript:code:classes:types_client_manager.ClientManager.md
│       │   │   │   │   ├── algokit:utils:typescript:code:classes:types_composer.TransactionComposer.md
│       │   │   │   │   ├── algokit:utils:typescript:code:classes:types_config.UpdatableConfig.md
│       │   │   │   │   ├── algokit:utils:typescript:code:classes:types_dispenser_client.TestNetDispenserApiClient.md
│       │   │   │   │   ├── algokit:utils:typescript:code:classes:types_kmd_account_manager.KmdAccountManager.md
│       │   │   │   │   ├── algokit:utils:typescript:code:classes:types_logic_error.LogicError.md
│       │   │   │   │   ├── algokit:utils:typescript:code:enums:types_app.OnSchemaBreak.md
│       │   │   │   │   ├── algokit:utils:typescript:code:enums:types_app.OnUpdate.md
│       │   │   │   │   ├── algokit:utils:typescript:code:enums:types_indexer.AccountStatus.md
│       │   │   │   │   ├── algokit:utils:typescript:code:enums:types_indexer.ApplicationOnComplete.md
│       │   │   │   │   ├── algokit:utils:typescript:code:enums:types_indexer.SignatureType.md
│       │   │   │   │   ├── algokit:utils:typescript:code:enums:types_lifecycle_events.EventType.md
│       │   │   │   │   ├── algokit:utils:typescript:code:interfaces:types_account_manager.EnsureFundedResult.md
│       │   │   │   │   ├── algokit:utils:typescript:code:interfaces:types_account.AccountConfig.md
│       │   │   │   │   ├── algokit:utils:typescript:code:interfaces:types_account.TransactionSignerAccount.md
│       │   │   │   │   ├── algokit:utils:typescript:code:interfaces:types_algorand_client_interface.AlgorandClientInterface.md
│       │   │   │   │   ├── algokit:utils:typescript:code:interfaces:types_app_arc56.Arc56Contract.md
│       │   │   │   │   ├── algokit:utils:typescript:code:interfaces:types_app_arc56.Event.md
│       │   │   │   │   ├── algokit:utils:typescript:code:interfaces:types_app_arc56.Method.md
│       │   │   │   │   ├── algokit:utils:typescript:code:interfaces:types_app_arc56.ProgramSourceInfo.md
│       │   │   │   │   ├── algokit:utils:typescript:code:interfaces:types_app_arc56.StorageKey.md
│       │   │   │   │   ├── algokit:utils:typescript:code:interfaces:types_app_arc56.StorageMap.md
│       │   │   │   │   ├── algokit:utils:typescript:code:interfaces:types_app_arc56.StructField.md
│       │   │   │   │   ├── algokit:utils:typescript:code:interfaces:types_app_client.AppClientCallABIArgs.md
│       │   │   │   │   ├── algokit:utils:typescript:code:interfaces:types_app_client.AppClientCallCoreParams.md
│       │   │   │   │   ├── algokit:utils:typescript:code:interfaces:types_app_client.AppClientCompilationParams.md
│       │   │   │   │   ├── algokit:utils:typescript:code:interfaces:types_app_client.AppClientCompilationResult.md
│       │   │   │   │   ├── algokit:utils:typescript:code:interfaces:types_app_client.AppClientDeployCallInterfaceParams.md
│       │   │   │   │   ├── algokit:utils:typescript:code:interfaces:types_app_client.AppClientDeployCoreParams.md
│       │   │   │   │   ├── algokit:utils:typescript:code:interfaces:types_app_client.AppClientDeployParams.md
│       │   │   │   │   ├── algokit:utils:typescript:code:interfaces:types_app_client.AppClientParams.md
│       │   │   │   │   ├── algokit:utils:typescript:code:interfaces:types_app_client.AppSourceMaps.md
│       │   │   │   │   ├── algokit:utils:typescript:code:interfaces:types_app_client.FundAppAccountParams.md
│       │   │   │   │   ├── algokit:utils:typescript:code:interfaces:types_app_client.ResolveAppById.md
│       │   │   │   │   ├── algokit:utils:typescript:code:interfaces:types_app_client.ResolveAppByIdBase.md
│       │   │   │   │   ├── algokit:utils:typescript:code:interfaces:types_app_client.SourceMapExport.md
│       │   │   │   │   ├── algokit:utils:typescript:code:interfaces:types_app_deployer.AppLookup.md
│       │   │   │   │   ├── algokit:utils:typescript:code:interfaces:types_app_deployer.AppMetadata.md
│       │   │   │   │   ├── algokit:utils:typescript:code:interfaces:types_app_factory.AppFactoryParams.md
│       │   │   │   │   ├── algokit:utils:typescript:code:interfaces:types_app_manager.AppInformation.md
│       │   │   │   │   ├── algokit:utils:typescript:code:interfaces:types_app_manager.BoxReference.md
│       │   │   │   │   ├── algokit:utils:typescript:code:interfaces:types_app_manager.BoxValueRequestParams.md
│       │   │   │   │   ├── algokit:utils:typescript:code:interfaces:types_app_manager.BoxValuesRequestParams.md
│       │   │   │   │   ├── algokit:utils:typescript:code:interfaces:types_app_spec.AppSources.md
│       │   │   │   │   ├── algokit:utils:typescript:code:interfaces:types_app_spec.AppSpec.md
│       │   │   │   │   ├── algokit:utils:typescript:code:interfaces:types_app_spec.CallConfig.md
│       │   │   │   │   ├── algokit:utils:typescript:code:interfaces:types_app_spec.DeclaredSchemaValueSpec.md
│       │   │   │   │   ├── algokit:utils:typescript:code:interfaces:types_app_spec.Hint.md
│       │   │   │   │   ├── algokit:utils:typescript:code:interfaces:types_app_spec.ReservedSchemaValueSpec.md
│       │   │   │   │   ├── algokit:utils:typescript:code:interfaces:types_app_spec.Schema.md
│       │   │   │   │   ├── algokit:utils:typescript:code:interfaces:types_app_spec.SchemaSpec.md
│       │   │   │   │   ├── algokit:utils:typescript:code:interfaces:types_app_spec.StateSchemaSpec.md
│       │   │   │   │   ├── algokit:utils:typescript:code:interfaces:types_app_spec.Struct.md
│       │   │   │   │   ├── algokit:utils:typescript:code:interfaces:types_app.AppCallParams.md
│       │   │   │   │   ├── algokit:utils:typescript:code:interfaces:types_app.AppCallTransactionResultOfType.md
│       │   │   │   │   ├── algokit:utils:typescript:code:interfaces:types_app.AppCompilationResult.md
│       │   │   │   │   ├── algokit:utils:typescript:code:interfaces:types_app.AppDeploymentParams.md
│       │   │   │   │   ├── algokit:utils:typescript:code:interfaces:types_app.AppDeployMetadata.md
│       │   │   │   │   ├── algokit:utils:typescript:code:interfaces:types_app.AppLookup.md
│       │   │   │   │   ├── algokit:utils:typescript:code:interfaces:types_app.AppMetadata.md
│       │   │   │   │   ├── algokit:utils:typescript:code:interfaces:types_app.AppReference.md
│       │   │   │   │   ├── algokit:utils:typescript:code:interfaces:types_app.AppState.md
│       │   │   │   │   ├── algokit:utils:typescript:code:interfaces:types_app.AppStorageSchema.md
│       │   │   │   │   ├── algokit:utils:typescript:code:interfaces:types_app.BoxName.md
│       │   │   │   │   ├── algokit:utils:typescript:code:interfaces:types_app.BoxReference.md
│       │   │   │   │   ├── algokit:utils:typescript:code:interfaces:types_app.BoxValueRequestParams.md
│       │   │   │   │   ├── algokit:utils:typescript:code:interfaces:types_app.BoxValuesRequestParams.md
│       │   │   │   │   ├── algokit:utils:typescript:code:interfaces:types_app.CompiledTeal.md
│       │   │   │   │   ├── algokit:utils:typescript:code:interfaces:types_app.CoreAppCallArgs.md
│       │   │   │   │   ├── algokit:utils:typescript:code:interfaces:types_app.CreateAppParams.md
│       │   │   │   │   ├── algokit:utils:typescript:code:interfaces:types_app.RawAppCallArgs.md
│       │   │   │   │   ├── algokit:utils:typescript:code:interfaces:types_app.TealTemplateParams.md
│       │   │   │   │   ├── algokit:utils:typescript:code:interfaces:types_app.UpdateAppParams.md
│       │   │   │   │   ├── algokit:utils:typescript:code:interfaces:types_asset_manager.AssetInformation.md
│       │   │   │   │   ├── algokit:utils:typescript:code:interfaces:types_asset_manager.BulkAssetOptInOutResult.md
│       │   │   │   │   ├── algokit:utils:typescript:code:interfaces:types_asset.AssetBulkOptInOutParams.md
│       │   │   │   │   ├── algokit:utils:typescript:code:interfaces:types_asset.AssetOptInParams.md
│       │   │   │   │   ├── algokit:utils:typescript:code:interfaces:types_asset.AssetOptOutParams.md
│       │   │   │   │   ├── algokit:utils:typescript:code:interfaces:types_asset.CreateAssetParams.md
│       │   │   │   │   ├── algokit:utils:typescript:code:interfaces:types_client_manager.AlgoSdkClients.md
│       │   │   │   │   ├── algokit:utils:typescript:code:interfaces:types_client_manager.TypedAppClient.md
│       │   │   │   │   ├── algokit:utils:typescript:code:interfaces:types_client_manager.TypedAppFactory.md
│       │   │   │   │   ├── algokit:utils:typescript:code:interfaces:types_composer.BuiltTransactions.md
│       │   │   │   │   ├── algokit:utils:typescript:code:interfaces:types_config.Config.md
│       │   │   │   │   ├── algokit:utils:typescript:code:interfaces:types_debugging.AVMTracesEventData.md
│       │   │   │   │   ├── algokit:utils:typescript:code:interfaces:types_debugging.TealSourceDebugEventData.md
│       │   │   │   │   ├── algokit:utils:typescript:code:interfaces:types_debugging.TealSourcesDebugEventData.md
│       │   │   │   │   ├── algokit:utils:typescript:code:interfaces:types_dispenser_client.DispenserFundResponse.md
│       │   │   │   │   ├── algokit:utils:typescript:code:interfaces:types_dispenser_client.DispenserLimitResponse.md
│       │   │   │   │   ├── algokit:utils:typescript:code:interfaces:types_dispenser_client.TestNetDispenserApiClientParams.md
│       │   │   │   │   ├── algokit:utils:typescript:code:interfaces:types_indexer.LookupAssetHoldingsOptions.md
│       │   │   │   │   ├── algokit:utils:typescript:code:interfaces:types_logic_error.LogicErrorDetails.md
│       │   │   │   │   ├── algokit:utils:typescript:code:interfaces:types_network_client.AlgoClientConfig.md
│       │   │   │   │   ├── algokit:utils:typescript:code:interfaces:types_network_client.AlgoConfig.md
│       │   │   │   │   ├── algokit:utils:typescript:code:interfaces:types_network_client.NetworkDetails.md
│       │   │   │   │   ├── algokit:utils:typescript:code:interfaces:types_testing.AlgoKitLogCaptureFixture.md
│       │   │   │   │   ├── algokit:utils:typescript:code:interfaces:types_testing.AlgorandFixture.md
│       │   │   │   │   ├── algokit:utils:typescript:code:interfaces:types_testing.AlgorandFixtureConfig.md
│       │   │   │   │   ├── algokit:utils:typescript:code:interfaces:types_testing.AlgorandTestAutomationContext.md
│       │   │   │   │   ├── algokit:utils:typescript:code:interfaces:types_testing.GetTestAccountParams.md
│       │   │   │   │   ├── algokit:utils:typescript:code:interfaces:types_testing.LogSnapshotConfig.md
│       │   │   │   │   ├── algokit:utils:typescript:code:interfaces:types_transaction.AtomicTransactionComposerToSend.md
│       │   │   │   │   ├── algokit:utils:typescript:code:interfaces:types_transaction.ConfirmedTransactionResult.md
│       │   │   │   │   ├── algokit:utils:typescript:code:interfaces:types_transaction.ConfirmedTransactionResults.md
│       │   │   │   │   ├── algokit:utils:typescript:code:interfaces:types_transaction.SendAtomicTransactionComposerResults.md
│       │   │   │   │   ├── algokit:utils:typescript:code:interfaces:types_transaction.SendParams.md
│       │   │   │   │   ├── algokit:utils:typescript:code:interfaces:types_transaction.SendTransactionParams.md
│       │   │   │   │   ├── algokit:utils:typescript:code:interfaces:types_transaction.SendTransactionResult.md
│       │   │   │   │   ├── algokit:utils:typescript:code:interfaces:types_transaction.SendTransactionResults.md
│       │   │   │   │   ├── algokit:utils:typescript:code:interfaces:types_transaction.TransactionGroupToSend.md
│       │   │   │   │   ├── algokit:utils:typescript:code:interfaces:types_transaction.TransactionToSign.md
│       │   │   │   │   ├── algokit:utils:typescript:code:interfaces:types_transfer.AlgoRekeyParams.md
│       │   │   │   │   ├── algokit:utils:typescript:code:interfaces:types_transfer.AlgoTransferParams.md
│       │   │   │   │   ├── algokit:utils:typescript:code:interfaces:types_transfer.EnsureFundedParams.md
│       │   │   │   │   ├── algokit:utils:typescript:code:interfaces:types_transfer.EnsureFundedReturnType.md
│       │   │   │   │   ├── algokit:utils:typescript:code:interfaces:types_transfer.TransferAssetParams.md
│       │   │   │   │   ├── algokit:utils:typescript:code:modules:index.indexer.md
│       │   │   │   │   ├── algokit:utils:typescript:code:modules:index.md
│       │   │   │   │   ├── algokit:utils:typescript:code:modules:testing.md
│       │   │   │   │   ├── algokit:utils:typescript:code:modules:types_account_manager_spec.md
│       │   │   │   │   ├── algokit:utils:typescript:code:modules:types_account_manager.md
│       │   │   │   │   ├── algokit:utils:typescript:code:modules:types_account.md
│       │   │   │   │   ├── algokit:utils:typescript:code:modules:types_algo_http_client_with_retry.md
│       │   │   │   │   ├── algokit:utils:typescript:code:modules:types_algorand_client_asset_spec.md
│       │   │   │   │   ├── algokit:utils:typescript:code:modules:types_algorand_client_interface.md
│       │   │   │   │   ├── algokit:utils:typescript:code:modules:types_algorand_client_spec.md
│       │   │   │   │   ├── algokit:utils:typescript:code:modules:types_algorand_client_transaction_creator.md
│       │   │   │   │   ├── algokit:utils:typescript:code:modules:types_algorand_client_transaction_sender.md
│       │   │   │   │   ├── algokit:utils:typescript:code:modules:types_algorand_client_transfer_spec.md
│       │   │   │   │   ├── algokit:utils:typescript:code:modules:types_algorand_client.md
│       │   │   │   │   ├── algokit:utils:typescript:code:modules:types_amount_spec.md
│       │   │   │   │   ├── algokit:utils:typescript:code:modules:types_amount.md
│       │   │   │   │   ├── algokit:utils:typescript:code:modules:types_app_arc56.md
│       │   │   │   │   ├── algokit:utils:typescript:code:modules:types_app_client_spec.md
│       │   │   │   │   ├── algokit:utils:typescript:code:modules:types_app_client.md
│       │   │   │   │   ├── algokit:utils:typescript:code:modules:types_app_deployer.md
│       │   │   │   │   ├── algokit:utils:typescript:code:modules:types_app_factory_and_client_spec.md
│       │   │   │   │   ├── algokit:utils:typescript:code:modules:types_app_factory.md
│       │   │   │   │   ├── algokit:utils:typescript:code:modules:types_app_manager.md
│       │   │   │   │   ├── algokit:utils:typescript:code:modules:types_app_spec.md
│       │   │   │   │   ├── algokit:utils:typescript:code:modules:types_app.md
│       │   │   │   │   ├── algokit:utils:typescript:code:modules:types_asset_manager.md
│       │   │   │   │   ├── algokit:utils:typescript:code:modules:types_asset.md
│       │   │   │   │   ├── algokit:utils:typescript:code:modules:types_async_event_emitter_spec.md
│       │   │   │   │   ├── algokit:utils:typescript:code:modules:types_async_event_emitter.md
│       │   │   │   │   ├── algokit:utils:typescript:code:modules:types_client_manager_spec.md
│       │   │   │   │   ├── algokit:utils:typescript:code:modules:types_client_manager.md
│       │   │   │   │   ├── algokit:utils:typescript:code:modules:types_composer.md
│       │   │   │   │   ├── algokit:utils:typescript:code:modules:types_config.md
│       │   │   │   │   ├── algokit:utils:typescript:code:modules:types_debugging.md
│       │   │   │   │   ├── algokit:utils:typescript:code:modules:types_dispenser_client_spec.md
│       │   │   │   │   ├── algokit:utils:typescript:code:modules:types_dispenser_client.md
│       │   │   │   │   ├── algokit:utils:typescript:code:modules:types_expand.md
│       │   │   │   │   ├── algokit:utils:typescript:code:modules:types_indexer.md
│       │   │   │   │   ├── algokit:utils:typescript:code:modules:types_kmd_account_manager.md
│       │   │   │   │   ├── algokit:utils:typescript:code:modules:types_lifecycle_events.md
│       │   │   │   │   ├── algokit:utils:typescript:code:modules:types_logging.md
│       │   │   │   │   ├── algokit:utils:typescript:code:modules:types_logic_error.md
│       │   │   │   │   ├── algokit:utils:typescript:code:modules:types_network_client.md
│       │   │   │   │   ├── algokit:utils:typescript:code:modules:types_testing.md
│       │   │   │   │   ├── algokit:utils:typescript:code:modules:types_transaction.md
│       │   │   │   │   ├── algokit:utils:typescript:code:modules:types_transfer.md
│       │   │   │   │   ├── algokit:utils:typescript:code:README.md
│       │   │   │   │   ├── algokit:utils:typescript:README.md
│       │   │   │   │   ├── algokit:utils:typescript:v7-migration.md
│       │   │   │   │   ├── algokit:utils:typescript:v8-migration.md
│       │   │   │   │   ├── ARCs:ARC-template.md
│       │   │   │   │   ├── ARCs:assets:arc-0012:README.md
│       │   │   │   │   ├── ARCs:assets:arc-0034:TemplateForm.md
│       │   │   │   │   ├── ARCs:assets:arc-0062:README.md
│       │   │   │   │   ├── ARCs:pages:nfts.md
│       │   │   │   │   ├── ARCs:pages:wallets.md
│       │   │   │   │   ├── ARCs:README.md
│       │   │   │   │   ├── ARCs:specs:arc-0000.md
│       │   │   │   │   ├── ARCs:specs:arc-0001.md
│       │   │   │   │   ├── ARCs:specs:arc-0002.md
│       │   │   │   │   ├── ARCs:specs:arc-0003.md
│       │   │   │   │   ├── ARCs:specs:arc-0004.md
│       │   │   │   │   ├── ARCs:specs:arc-0005.md
│       │   │   │   │   ├── ARCs:specs:arc-0006.md
│       │   │   │   │   ├── ARCs:specs:arc-0007.md
│       │   │   │   │   ├── ARCs:specs:arc-0008.md
│       │   │   │   │   ├── ARCs:specs:arc-0009.md
│       │   │   │   │   ├── ARCs:specs:arc-0010.md
│       │   │   │   │   ├── ARCs:specs:arc-0011.md
│       │   │   │   │   ├── ARCs:specs:arc-0012.md
│       │   │   │   │   ├── ARCs:specs:arc-0015.md
│       │   │   │   │   ├── ARCs:specs:arc-0016.md
│       │   │   │   │   ├── ARCs:specs:arc-0018.md
│       │   │   │   │   ├── ARCs:specs:arc-0019.md
│       │   │   │   │   ├── ARCs:specs:arc-0020.md
│       │   │   │   │   ├── ARCs:specs:arc-0021.md
│       │   │   │   │   ├── ARCs:specs:arc-0022.md
│       │   │   │   │   ├── ARCs:specs:arc-0023.md
│       │   │   │   │   ├── ARCs:specs:arc-0025.md
│       │   │   │   │   ├── ARCs:specs:arc-0026.md
│       │   │   │   │   ├── ARCs:specs:arc-0028.md
│       │   │   │   │   ├── ARCs:specs:arc-0032.md
│       │   │   │   │   ├── ARCs:specs:arc-0033.md
│       │   │   │   │   ├── ARCs:specs:arc-0034.md
│       │   │   │   │   ├── ARCs:specs:arc-0035.md
│       │   │   │   │   ├── ARCs:specs:arc-0036.md
│       │   │   │   │   ├── ARCs:specs:arc-0042.md
│       │   │   │   │   ├── ARCs:specs:arc-0047.md
│       │   │   │   │   ├── ARCs:specs:arc-0048.md
│       │   │   │   │   ├── ARCs:specs:arc-0049.md
│       │   │   │   │   ├── ARCs:specs:arc-0054.md
│       │   │   │   │   ├── ARCs:specs:arc-0055.md
│       │   │   │   │   ├── ARCs:specs:arc-0056.md
│       │   │   │   │   ├── ARCs:specs:arc-0059.md
│       │   │   │   │   ├── ARCs:specs:arc-0062.md
│       │   │   │   │   ├── ARCs:specs:arc-0065.md
│       │   │   │   │   ├── ARCs:specs:arc-0069.md
│       │   │   │   │   ├── ARCs:specs:arc-0072.md
│       │   │   │   │   ├── ARCs:specs:arc-0073.md
│       │   │   │   │   ├── ARCs:specs:arc-0074.md
│       │   │   │   │   ├── ARCs:specs:arc-0076.md
│       │   │   │   │   ├── ARCs:specs:arc-0078.md
│       │   │   │   │   ├── ARCs:specs:arc-0079.md
│       │   │   │   │   ├── ARCs:specs:arc-0200.md
│       │   │   │   │   ├── clis_index.md
│       │   │   │   │   ├── developer:docs:about.md
│       │   │   │   │   ├── developer:docs:clis:algokey:algokey.md
│       │   │   │   │   ├── developer:docs:clis:algokey:generate.md
│       │   │   │   │   ├── developer:docs:clis:algokey:import.md
│       │   │   │   │   ├── developer:docs:clis:algokey:multisig:append-auth-addr.md
│       │   │   │   │   ├── developer:docs:clis:algokey:multisig:multisig.md
│       │   │   │   │   ├── developer:docs:clis:algokey:part:info.md
│       │   │   │   │   ├── developer:docs:clis:algokey:part:part.md
│       │   │   │   │   ├── developer:docs:clis:algokey:part:reparent.md
│       │   │   │   │   ├── developer:docs:clis:algokey:sign.md
│       │   │   │   │   ├── developer:docs:clis:conduit:conduit.md
│       │   │   │   │   ├── developer:docs:clis:conduit:init.md
│       │   │   │   │   ├── developer:docs:clis:conduit:list:exporters.md
│       │   │   │   │   ├── developer:docs:clis:conduit:list:importers.md
│       │   │   │   │   ├── developer:docs:clis:conduit:list:list.md
│       │   │   │   │   ├── developer:docs:clis:conduit:list:processors.md
│       │   │   │   │   ├── developer:docs:clis:diagcfg:diagcfg.md
│       │   │   │   │   ├── developer:docs:clis:diagcfg:metric:disable.md
│       │   │   │   │   ├── developer:docs:clis:diagcfg:metric:enable.md
│       │   │   │   │   ├── developer:docs:clis:diagcfg:metric:metric.md
│       │   │   │   │   ├── developer:docs:clis:diagcfg:metric:status.md
│       │   │   │   │   ├── developer:docs:clis:diagcfg:telemetry:disable.md
│       │   │   │   │   ├── developer:docs:clis:diagcfg:telemetry:enable.md
│       │   │   │   │   ├── developer:docs:clis:diagcfg:telemetry:endpoint.md
│       │   │   │   │   ├── developer:docs:clis:diagcfg:telemetry:name.md
│       │   │   │   │   ├── developer:docs:clis:diagcfg:telemetry:status.md
│       │   │   │   │   ├── developer:docs:clis:diagcfg:telemetry:telemetry.md
│       │   │   │   │   ├── developer:docs:clis:goal:node:restart.md
│       │   │   │   │   ├── developer:docs:clis:goal:node:start.md
│       │   │   │   │   ├── developer:docs:clis:goal:node:status.md
│       │   │   │   │   ├── developer:docs:clis:goal:node:stop.md
│       │   │   │   │   ├── developer:docs:clis:goal:node:wait.md
│       │   │   │   │   ├── developer:docs:clis:goal:protocols.md
│       │   │   │   │   ├── developer:docs:clis:goal:report.md
│       │   │   │   │   ├── developer:docs:clis:goal:version.md
│       │   │   │   │   ├── developer:docs:clis:goal:wallet:list.md
│       │   │   │   │   ├── developer:docs:clis:goal:wallet:new.md
│       │   │   │   │   ├── developer:docs:clis:goal:wallet:wallet.md
│       │   │   │   │   ├── developer:docs:clis:indexer:api-config.md
│       │   │   │   │   ├── developer:docs:clis:indexer:daemon.md
│       │   │   │   │   ├── developer:docs:clis:indexer:indexer.md
│       │   │   │   │   ├── developer:docs:clis:indexer:util:util.md
│       │   │   │   │   ├── developer:docs:clis:indexer:util:validator.md
│       │   │   │   │   ├── developer:docs:clis:kmd.md
│       │   │   │   │   ├── developer:docs:clis:tealdbg:debug.md
│       │   │   │   │   ├── developer:docs:clis:tealdbg:remote.md
│       │   │   │   │   ├── developer:docs:clis:tealdbg:tealdbg.md
│       │   │   │   │   ├── developer:docs:details:accounts:create.md
│       │   │   │   │   ├── developer:docs:details:accounts:index.md
│       │   │   │   │   ├── developer:docs:details:accounts:rekey.md
│       │   │   │   │   ├── developer:docs:details:algorand_consensus.md
│       │   │   │   │   ├── developer:docs:details:algorand-networks:betanet.md
│       │   │   │   │   ├── developer:docs:details:algorand-networks:index.md
│       │   │   │   │   ├── developer:docs:details:algorand-networks:mainnet.md
│       │   │   │   │   ├── developer:docs:details:algorand-networks:testnet.md
│       │   │   │   │   ├── developer:docs:details:asa.md
│       │   │   │   │   ├── developer:docs:details:atc.md
│       │   │   │   │   ├── developer:docs:details:atomic_transfers.md
│       │   │   │   │   ├── developer:docs:details:conduit.md
│       │   │   │   │   ├── developer:docs:details:crust.md
│       │   │   │   │   ├── developer:docs:details:dapps:avm:index.md
│       │   │   │   │   ├── developer:docs:details:dapps:avm:teal:guidelines.md
│       │   │   │   │   ├── developer:docs:details:dapps:avm:teal:index.md
│       │   │   │   │   ├── developer:docs:details:dapps:avm:teal:jsonspec.md
│       │   │   │   │   ├── developer:docs:details:dapps:avm:teal:opcodes:index.md
│       │   │   │   │   ├── developer:docs:details:dapps:avm:teal:opcodes:v1.md
│       │   │   │   │   ├── developer:docs:details:dapps:avm:teal:opcodes:v10.md
│       │   │   │   │   ├── developer:docs:details:dapps:avm:teal:opcodes:v2.md
│       │   │   │   │   ├── developer:docs:details:dapps:avm:teal:opcodes:v3.md
│       │   │   │   │   ├── developer:docs:details:dapps:avm:teal:opcodes:v4.md
│       │   │   │   │   ├── developer:docs:details:dapps:avm:teal:opcodes:v5.md
│       │   │   │   │   ├── developer:docs:details:dapps:avm:teal:opcodes:v6.md
│       │   │   │   │   ├── developer:docs:details:dapps:avm:teal:opcodes:v7.md
│       │   │   │   │   ├── developer:docs:details:dapps:avm:teal:opcodes:v8.md
│       │   │   │   │   ├── developer:docs:details:dapps:avm:teal:opcodes:v9.md
│       │   │   │   │   ├── developer:docs:details:dapps:avm:teal:specification.md
│       │   │   │   │   ├── developer:docs:details:dapps:smart-contracts:ABI:index.md
│       │   │   │   │   ├── developer:docs:details:dapps:smart-contracts:apps:create.md
│       │   │   │   │   ├── developer:docs:details:dapps:smart-contracts:apps:index.md
│       │   │   │   │   ├── developer:docs:details:dapps:smart-contracts:apps:innertx.md
│       │   │   │   │   ├── developer:docs:details:dapps:smart-contracts:apps:state.md
│       │   │   │   │   ├── developer:docs:details:dapps:smart-contracts:apps:txs.md
│       │   │   │   │   ├── developer:docs:details:dapps:smart-contracts:debugging.md
│       │   │   │   │   ├── developer:docs:details:dapps:smart-contracts:frontend:apps.md
│       │   │   │   │   ├── developer:docs:details:dapps:smart-contracts:frontend:smartsigs.md
│       │   │   │   │   ├── developer:docs:details:dapps:smart-contracts:guidelines.md
│       │   │   │   │   ├── developer:docs:details:dapps:smart-contracts:index.md
│       │   │   │   │   ├── developer:docs:details:dapps:smart-contracts:smartsigs:index.md
│       │   │   │   │   ├── developer:docs:details:dapps:smart-contracts:smartsigs:modes.md
│       │   │   │   │   ├── developer:docs:details:dapps:smart-contracts:smartsigs:walkthrough.md
│       │   │   │   │   ├── developer:docs:details:dapps:writing-contracts:beaker.md
│       │   │   │   │   ├── developer:docs:details:dapps:writing-contracts:pyteal.md
│       │   │   │   │   ├── developer:docs:details:dapps:writing-contracts:python.md
│       │   │   │   │   ├── developer:docs:details:encoding.md
│       │   │   │   │   ├── developer:docs:details:ethereum_to_algorand.md
│       │   │   │   │   ├── developer:docs:details:index.md
│       │   │   │   │   ├── developer:docs:details:indexer.md
│       │   │   │   │   ├── developer:docs:details:parameter_tables.md
│       │   │   │   │   ├── developer:docs:details:stateproofs:index.md
│       │   │   │   │   ├── developer:docs:details:stateproofs:light_client.md
│       │   │   │   │   ├── developer:docs:details:technical_faq.md
│       │   │   │   │   ├── developer:docs:details:transactions:index.md
│       │   │   │   │   ├── developer:docs:details:transactions:offline_transactions.md
│       │   │   │   │   ├── developer:docs:details:transactions:payment_prompts.md
│       │   │   │   │   ├── developer:docs:details:transactions:signatures.md
│       │   │   │   │   ├── developer:docs:details:transactions:transactions.md
│       │   │   │   │   ├── developer:docs:details:useful_resources.md
│       │   │   │   │   ├── developer:docs:get-started:algokit.md
│       │   │   │   │   ├── developer:docs:get-started:basics:what_is_blockchain.md
│       │   │   │   │   ├── developer:docs:get-started:basics:whats_a_dapp.md
│       │   │   │   │   ├── developer:docs:get-started:basics:where_to_start.md
│       │   │   │   │   ├── developer:docs:get-started:basics:why_algorand.md
│       │   │   │   │   ├── developer:docs:get-started:tokenization:ft.md
│       │   │   │   │   ├── developer:docs:get-started:tokenization:nft.md
│       │   │   │   │   ├── developer:docs:index.md
│       │   │   │   │   ├── developer:docs:rest-apis:algod.md
│       │   │   │   │   ├── developer:docs:rest-apis:indexer.md
│       │   │   │   │   ├── developer:docs:rest-apis:kmd.md
│       │   │   │   │   ├── developer:docs:rest-apis:restendpoints.md
│       │   │   │   │   ├── developer:docs:run-a-node:operations:catchup.md
│       │   │   │   │   ├── developer:docs:run-a-node:operations:switch_networks.md
│       │   │   │   │   ├── developer:docs:run-a-node:participate:generate_keys.md
│       │   │   │   │   ├── developer:docs:run-a-node:participate:index.md
│       │   │   │   │   ├── developer:docs:run-a-node:participate:offline.md
│       │   │   │   │   ├── developer:docs:run-a-node:participate:online.md
│       │   │   │   │   ├── developer:docs:run-a-node:participate:renew.md
│       │   │   │   │   ├── developer:docs:run-a-node:reference:artifacts.md
│       │   │   │   │   ├── developer:docs:run-a-node:reference:config.md
│       │   │   │   │   ├── developer:docs:run-a-node:reference:relay.md
│       │   │   │   │   ├── developer:docs:run-a-node:reference:telemetry-config.md
│       │   │   │   │   ├── developer:docs:run-a-node:setup:indexer.md
│       │   │   │   │   ├── developer:docs:run-a-node:setup:install.md
│       │   │   │   │   ├── developer:docs:run-a-node:setup:node-troubleshooting.md
│       │   │   │   │   ├── developer:docs:run-a-node:setup:types.md
│       │   │   │   │   ├── developer:docs:sdks:go:index.md
│       │   │   │   │   ├── developer:docs:sdks:index.md
│       │   │   │   │   ├── developer:docs:sdks:java:index.md
│       │   │   │   │   ├── developer:docs:sdks:javascript:index.md
│       │   │   │   │   ├── developer:docs:sdks:python:index.md
│       │   │   │   │   ├── developer:python:code:example:accounts.md
│       │   │   │   │   ├── developer:python:code:example:arc4_types.md
│       │   │   │   │   ├── developer:python:code:example:assets.md
│       │   │   │   │   ├── developer:python:code:example:box_storage.md
│       │   │   │   │   ├── developer:python:code:example:control_flow.md
│       │   │   │   │   ├── developer:python:code:example:crypto:merkle_tree.md
│       │   │   │   │   ├── developer:python:code:example:defi:amm.md
│       │   │   │   │   ├── developer:python:code:example:defi:auction.md
│       │   │   │   │   ├── developer:python:code:example:defi:htlc_logicsig.md
│       │   │   │   │   ├── developer:python:code:example:defi:marketplace.md
│       │   │   │   │   ├── developer:python:code:example:events:arc28_events.md
│       │   │   │   │   ├── developer:python:code:example:global_storage.md
│       │   │   │   │   ├── developer:python:code:example:governance:simple_voting.md
│       │   │   │   │   ├── developer:python:code:example:hello_world.md
│       │   │   │   │   ├── developer:python:code:example:inner_transactions.md
│       │   │   │   │   ├── developer:python:code:example:local_storage.md
│       │   │   │   │   ├── developer:python:code:example:nft:proof_of_attendance.md
│       │   │   │   │   ├── developer:python:code:example:privacy:zk_whitelist.md
│       │   │   │   │   ├── developer:python:code:example:scratch_storage.md
│       │   │   │   │   ├── developer:python:code:example:self_payment.md
│       │   │   │   │   ├── developer:python:code:example:struct_in_box.md
│       │   │   │   │   ├── developer:python:code:example:subsidize_app_call.md
│       │   │   │   │   ├── developer:python:code:example:transactions.md
│       │   │   │   │   ├── developer:python:code:example:utility:calculator.md
│       │   │   │   │   ├── devportal-code-examples:projects:python-contract-examples:README.md
│       │   │   │   │   ├── devportal-code-examples:README.md
│       │   │   │   │   ├── docs:.walletconnect:index.md
│       │   │   │   │   ├── docs:.walletconnect:walletconnect-schema.md
│       │   │   │   │   ├── docs:README.md
│       │   │   │   │   ├── docs:scripts:example_tracker:example_list.md
│       │   │   │   │   ├── docs:scripts:README.md
│       │   │   │   │   ├── index.md
│       │   │   │   │   ├── liquid_auth_index.md
│       │   │   │   │   ├── liquid-auth:ARCHITECTURE.md
│       │   │   │   │   ├── liquid-auth:decisions:1-Service-Authentication.md
│       │   │   │   │   ├── liquid-auth:decisions:2-Bidirectional-Communication.md
│       │   │   │   │   ├── liquid-auth:decisions:3-Peer-to-Peer-Signaling.md
│       │   │   │   │   ├── liquid-auth:decisions:4-Fido-Extension.md
│       │   │   │   │   ├── liquid-auth:decisions:README.md
│       │   │   │   │   ├── liquid-auth:docs:architecture.md
│       │   │   │   │   ├── liquid-auth:docs:clients:android:provider-service:authenticate.md
│       │   │   │   │   ├── liquid-auth:docs:clients:android:provider-service:register.md
│       │   │   │   │   ├── liquid-auth:docs:clients:browser:authentication.md
│       │   │   │   │   ├── liquid-auth:docs:clients:browser:example.md
│       │   │   │   │   ├── liquid-auth:docs:introduction.md
│       │   │   │   │   ├── liquid-auth:docs:README.md
│       │   │   │   │   ├── liquid-auth:docs:server:environment-variables.md
│       │   │   │   │   ├── liquid-auth:docs:server:integrations.md
│       │   │   │   │   ├── liquid-auth:docs:server:introduction.md
│       │   │   │   │   ├── liquid-auth:docs:server:running-locally.md
│       │   │   │   │   ├── liquid-auth:README.md
│       │   │   │   │   ├── liquid-auth:SEQUENCE.md
│       │   │   │   │   ├── liquid-auth:services:liquid-auth-api-js:src:assertion:assertion.controller.post.request.md
│       │   │   │   │   ├── liquid-auth:services:liquid-auth-api-js:src:assertion:assertion.controller.post.response.md
│       │   │   │   │   ├── liquid-auth:services:liquid-auth-api-js:src:attestation:attestation.controller.post.request.md
│       │   │   │   │   ├── liquid-auth:services:liquid-auth-api-js:src:auth:auth.controller.get.user.md
│       │   │   │   │   ├── liquid-auth:sites:express-dapp:README.md
│       │   │   │   │   ├── liquid-auth:VISION.md
│       │   │   │   │   ├── puya_index.md
│       │   │   │   │   ├── puya:docs:algopy_testing:index.md
│       │   │   │   │   ├── puya:docs:api-algopy.arc4.md
│       │   │   │   │   ├── puya:docs:api-algopy.gtxn.md
│       │   │   │   │   ├── puya:docs:api-algopy.itxn.md
│       │   │   │   │   ├── puya:docs:api-algopy.md
│       │   │   │   │   ├── puya:docs:api-algopy.op.md
│       │   │   │   │   ├── puya:docs:api.md
│       │   │   │   │   ├── puya:docs:compiler.md
│       │   │   │   │   ├── puya:docs:index.md
│       │   │   │   │   ├── puya:docs:language-guide.md
│       │   │   │   │   ├── puya:docs:lg-arc28.md
│       │   │   │   │   ├── puya:docs:lg-arc4.md
│       │   │   │   │   ├── puya:docs:lg-builtins.md
│       │   │   │   │   ├── puya:docs:lg-calling-apps.md
│       │   │   │   │   ├── puya:docs:lg-compile.md
│       │   │   │   │   ├── puya:docs:lg-control.md
│       │   │   │   │   ├── puya:docs:lg-errors.md
│       │   │   │   │   ├── puya:docs:lg-logs.md
│       │   │   │   │   ├── puya:docs:lg-modules.md
│       │   │   │   │   ├── puya:docs:lg-opcode-budget.md
│       │   │   │   │   ├── puya:docs:lg-ops.md
│       │   │   │   │   ├── puya:docs:lg-storage.md
│       │   │   │   │   ├── puya:docs:lg-structure.md
│       │   │   │   │   ├── puya:docs:lg-transactions.md
│       │   │   │   │   ├── puya:docs:lg-types.md
│       │   │   │   │   ├── puya:docs:lg-unsupported-python-features.md
│       │   │   │   │   ├── puya:docs:principles.md
│       │   │   │   │   ├── puya:examples:auction:README.md
│       │   │   │   │   ├── puya:python:testing:docs:algopy.md
│       │   │   │   │   ├── puya:python:testing:docs:api.md
│       │   │   │   │   ├── puya:python:testing:docs:coverage.md
│       │   │   │   │   ├── puya:python:testing:docs:examples.md
│       │   │   │   │   ├── puya:python:testing:docs:faq.md
│       │   │   │   │   ├── puya:python:testing:docs:index.md
│       │   │   │   │   ├── puya:python:testing:docs:testing-guide:arc4-types.md
│       │   │   │   │   ├── puya:python:testing:docs:testing-guide:avm-types.md
│       │   │   │   │   ├── puya:python:testing:docs:testing-guide:concepts.md
│       │   │   │   │   ├── puya:python:testing:docs:testing-guide:contract-testing.md
│       │   │   │   │   ├── puya:python:testing:docs:testing-guide:index.md
│       │   │   │   │   ├── puya:python:testing:docs:testing-guide:opcodes.md
│       │   │   │   │   ├── puya:python:testing:docs:testing-guide:signature-testing.md
│       │   │   │   │   ├── puya:python:testing:docs:testing-guide:state-management.md
│       │   │   │   │   ├── puya:python:testing:docs:testing-guide:subroutines.md
│       │   │   │   │   ├── puya:python:testing:docs:testing-guide:transactions.md
│       │   │   │   │   ├── puya:python:testing:examples:README.md
│       │   │   │   │   ├── puya:python:testing:README.md
│       │   │   │   │   ├── puya:README.md
│       │   │   │   │   ├── puya:src:puya:ARCHITECTURE.md
│       │   │   │   │   ├── puya:src:puyapy:_typeshed:README.md
│       │   │   │   │   ├── puya:src:puyapy:_vendor:mypy:typeshed:stdlib:_typeshed:README.md
│       │   │   │   │   ├── puya:src:puyapy:awst_build:README.md
│       │   │   │   │   ├── puya:stubs:README.md
│       │   │   │   │   ├── puya:tests:test_expected_output:README.md
│       │   │   │   │   ├── puya:typescript:docs:architecture-decisions:2024-05-21_primitive-bytes-and-strings.md
│       │   │   │   │   ├── puya:typescript:docs:architecture-decisions:2024-05-21_primitive-integer-types.md
│       │   │   │   │   ├── puya:typescript:docs:README.md
│       │   │   │   │   ├── puya:typescript:packages:algo-ts:readme.md
│       │   │   │   │   ├── puya:typescript:README.md
│       │   │   │   │   ├── SDKs:javascript:classes:ABIAddressType.md
│       │   │   │   │   ├── SDKs:javascript:classes:ABIArrayDynamicType.md
│       │   │   │   │   ├── SDKs:javascript:classes:ABIArrayStaticType.md
│       │   │   │   │   ├── SDKs:javascript:classes:ABIBoolType.md
│       │   │   │   │   ├── SDKs:javascript:classes:ABIByteType.md
│       │   │   │   │   ├── SDKs:javascript:classes:ABIContract.md
│       │   │   │   │   ├── SDKs:javascript:classes:ABIInterface.md
│       │   │   │   │   ├── SDKs:javascript:classes:ABIMethod.md
│       │   │   │   │   ├── SDKs:javascript:classes:ABIStringType.md
│       │   │   │   │   ├── SDKs:javascript:classes:ABITupleType.md
│       │   │   │   │   ├── SDKs:javascript:classes:ABIType.md
│       │   │   │   │   ├── SDKs:javascript:classes:ABIUfixedType.md
│       │   │   │   │   ├── SDKs:javascript:classes:ABIUintType.md
│       │   │   │   │   ├── SDKs:javascript:classes:Algodv2.md
│       │   │   │   │   ├── SDKs:javascript:classes:AtomicTransactionComposer.md
│       │   │   │   │   ├── SDKs:javascript:classes:DryrunResult.md
│       │   │   │   │   ├── SDKs:javascript:classes:Indexer.md
│       │   │   │   │   ├── SDKs:javascript:classes:indexerModels.Account.md
│       │   │   │   │   ├── SDKs:javascript:classes:indexerModels.AccountParticipation.md
│       │   │   │   │   ├── SDKs:javascript:classes:indexerModels.AccountResponse.md
│       │   │   │   │   ├── SDKs:javascript:classes:indexerModels.AccountsResponse.md
│       │   │   │   │   ├── SDKs:javascript:classes:indexerModels.AccountStateDelta.md
│       │   │   │   │   ├── SDKs:javascript:classes:indexerModels.Application.md
│       │   │   │   │   ├── SDKs:javascript:classes:indexerModels.ApplicationLocalState.md
│       │   │   │   │   ├── SDKs:javascript:classes:indexerModels.ApplicationLocalStatesResponse.md
│       │   │   │   │   ├── SDKs:javascript:classes:indexerModels.ApplicationLogData.md
│       │   │   │   │   ├── SDKs:javascript:classes:indexerModels.ApplicationLogsResponse.md
│       │   │   │   │   ├── SDKs:javascript:classes:indexerModels.ApplicationParams.md
│       │   │   │   │   ├── SDKs:javascript:classes:indexerModels.ApplicationResponse.md
│       │   │   │   │   ├── SDKs:javascript:classes:indexerModels.ApplicationsResponse.md
│       │   │   │   │   ├── SDKs:javascript:classes:indexerModels.ApplicationStateSchema.md
│       │   │   │   │   ├── SDKs:javascript:classes:indexerModels.Asset.md
│       │   │   │   │   ├── SDKs:javascript:classes:indexerModels.AssetBalancesResponse.md
│       │   │   │   │   ├── SDKs:javascript:classes:indexerModels.AssetHolding.md
│       │   │   │   │   ├── SDKs:javascript:classes:indexerModels.AssetHoldingsResponse.md
│       │   │   │   │   ├── SDKs:javascript:classes:indexerModels.AssetParams.md
│       │   │   │   │   ├── SDKs:javascript:classes:indexerModels.AssetResponse.md
│       │   │   │   │   ├── SDKs:javascript:classes:indexerModels.AssetsResponse.md
│       │   │   │   │   ├── SDKs:javascript:classes:indexerModels.Block.md
│       │   │   │   │   ├── SDKs:javascript:classes:indexerModels.BlockRewards.md
│       │   │   │   │   ├── SDKs:javascript:classes:indexerModels.BlockUpgradeState.md
│       │   │   │   │   ├── SDKs:javascript:classes:indexerModels.BlockUpgradeVote.md
│       │   │   │   │   ├── SDKs:javascript:classes:indexerModels.Box.md
│       │   │   │   │   ├── SDKs:javascript:classes:indexerModels.BoxDescriptor.md
│       │   │   │   │   ├── SDKs:javascript:classes:indexerModels.BoxesResponse.md
│       │   │   │   │   ├── SDKs:javascript:classes:indexerModels.ErrorResponse.md
│       │   │   │   │   ├── SDKs:javascript:classes:indexerModels.EvalDelta.md
│       │   │   │   │   ├── SDKs:javascript:classes:indexerModels.EvalDeltaKeyValue.md
│       │   │   │   │   ├── SDKs:javascript:classes:indexerModels.HashFactory.md
│       │   │   │   │   ├── SDKs:javascript:classes:indexerModels.HealthCheck.md
│       │   │   │   │   ├── SDKs:javascript:classes:indexerModels.IndexerStateProofMessage.md
│       │   │   │   │   ├── SDKs:javascript:classes:indexerModels.MerkleArrayProof.md
│       │   │   │   │   ├── SDKs:javascript:classes:indexerModels.MiniAssetHolding.md
│       │   │   │   │   ├── SDKs:javascript:classes:indexerModels.ParticipationUpdates.md
│       │   │   │   │   ├── SDKs:javascript:classes:indexerModels.StateProofFields.md
│       │   │   │   │   ├── SDKs:javascript:classes:indexerModels.StateProofParticipant.md
│       │   │   │   │   ├── SDKs:javascript:classes:indexerModels.StateProofReveal.md
│       │   │   │   │   ├── SDKs:javascript:classes:indexerModels.StateProofSignature.md
│       │   │   │   │   ├── SDKs:javascript:classes:indexerModels.StateProofSigSlot.md
│       │   │   │   │   ├── SDKs:javascript:classes:indexerModels.StateProofTracking.md
│       │   │   │   │   ├── SDKs:javascript:classes:indexerModels.StateProofVerifier.md
│       │   │   │   │   ├── SDKs:javascript:classes:indexerModels.StateSchema.md
│       │   │   │   │   ├── SDKs:javascript:classes:indexerModels.TealKeyValue.md
│       │   │   │   │   ├── SDKs:javascript:classes:indexerModels.TealValue.md
│       │   │   │   │   ├── SDKs:javascript:classes:indexerModels.Transaction.md
│       │   │   │   │   ├── SDKs:javascript:classes:indexerModels.TransactionApplication.md
│       │   │   │   │   ├── SDKs:javascript:classes:indexerModels.TransactionAssetConfig.md
│       │   │   │   │   ├── SDKs:javascript:classes:indexerModels.TransactionAssetFreeze.md
│       │   │   │   │   ├── SDKs:javascript:classes:indexerModels.TransactionAssetTransfer.md
│       │   │   │   │   ├── SDKs:javascript:classes:indexerModels.TransactionKeyreg.md
│       │   │   │   │   ├── SDKs:javascript:classes:indexerModels.TransactionPayment.md
│       │   │   │   │   ├── SDKs:javascript:classes:indexerModels.TransactionResponse.md
│       │   │   │   │   ├── SDKs:javascript:classes:indexerModels.TransactionSignature.md
│       │   │   │   │   ├── SDKs:javascript:classes:indexerModels.TransactionSignatureLogicsig.md
│       │   │   │   │   ├── SDKs:javascript:classes:indexerModels.TransactionSignatureMultisig.md
│       │   │   │   │   ├── SDKs:javascript:classes:indexerModels.TransactionSignatureMultisigSubsignature.md
│       │   │   │   │   ├── SDKs:javascript:classes:indexerModels.TransactionsResponse.md
│       │   │   │   │   ├── SDKs:javascript:classes:indexerModels.TransactionStateProof.md
│       │   │   │   │   ├── SDKs:javascript:classes:Kmd.md
│       │   │   │   │   ├── SDKs:javascript:classes:LogicSig.md
│       │   │   │   │   ├── SDKs:javascript:classes:LogicSigAccount.md
│       │   │   │   │   ├── SDKs:javascript:classes:modelsv2.Account.md
│       │   │   │   │   ├── SDKs:javascript:classes:modelsv2.AccountApplicationResponse.md
│       │   │   │   │   ├── SDKs:javascript:classes:modelsv2.AccountAssetHolding.md
│       │   │   │   │   ├── SDKs:javascript:classes:modelsv2.AccountAssetResponse.md
│       │   │   │   │   ├── SDKs:javascript:classes:modelsv2.AccountAssetsInformationResponse.md
│       │   │   │   │   ├── SDKs:javascript:classes:modelsv2.AccountParticipation.md
│       │   │   │   │   ├── SDKs:javascript:classes:modelsv2.AccountStateDelta.md
│       │   │   │   │   ├── SDKs:javascript:classes:modelsv2.AppCallLogs.md
│       │   │   │   │   ├── SDKs:javascript:classes:modelsv2.Application.md
│       │   │   │   │   ├── SDKs:javascript:classes:modelsv2.ApplicationInitialStates.md
│       │   │   │   │   ├── SDKs:javascript:classes:modelsv2.ApplicationKVStorage.md
│       │   │   │   │   ├── SDKs:javascript:classes:modelsv2.ApplicationLocalReference.md
│       │   │   │   │   ├── SDKs:javascript:classes:modelsv2.ApplicationLocalState.md
│       │   │   │   │   ├── SDKs:javascript:classes:modelsv2.ApplicationParams.md
│       │   │   │   │   ├── SDKs:javascript:classes:modelsv2.ApplicationStateOperation.md
│       │   │   │   │   ├── SDKs:javascript:classes:modelsv2.ApplicationStateSchema.md
│       │   │   │   │   ├── SDKs:javascript:classes:modelsv2.Asset.md
│       │   │   │   │   ├── SDKs:javascript:classes:modelsv2.AssetHolding.md
│       │   │   │   │   ├── SDKs:javascript:classes:modelsv2.AssetHoldingReference.md
│       │   │   │   │   ├── SDKs:javascript:classes:modelsv2.AssetParams.md
│       │   │   │   │   ├── SDKs:javascript:classes:modelsv2.AvmKeyValue.md
│       │   │   │   │   ├── SDKs:javascript:classes:modelsv2.AvmValue.md
│       │   │   │   │   ├── SDKs:javascript:classes:modelsv2.BlockHashResponse.md
│       │   │   │   │   ├── SDKs:javascript:classes:modelsv2.BlockLogsResponse.md
│       │   │   │   │   ├── SDKs:javascript:classes:modelsv2.BlockResponse.md
│       │   │   │   │   ├── SDKs:javascript:classes:modelsv2.BlockTxidsResponse.md
│       │   │   │   │   ├── SDKs:javascript:classes:modelsv2.Box.md
│       │   │   │   │   ├── SDKs:javascript:classes:modelsv2.BoxDescriptor.md
│       │   │   │   │   ├── SDKs:javascript:classes:modelsv2.BoxesResponse.md
│       │   │   │   │   ├── SDKs:javascript:classes:modelsv2.BoxReference.md
│       │   │   │   │   ├── SDKs:javascript:classes:modelsv2.BuildVersion.md
│       │   │   │   │   ├── SDKs:javascript:classes:modelsv2.CompileResponse.md
│       │   │   │   │   ├── SDKs:javascript:classes:modelsv2.DisassembleResponse.md
│       │   │   │   │   ├── SDKs:javascript:classes:modelsv2.DryrunRequest.md
│       │   │   │   │   ├── SDKs:javascript:classes:modelsv2.DryrunResponse.md
│       │   │   │   │   ├── SDKs:javascript:classes:modelsv2.DryrunSource.md
│       │   │   │   │   ├── SDKs:javascript:classes:modelsv2.DryrunState.md
│       │   │   │   │   ├── SDKs:javascript:classes:modelsv2.DryrunTxnResult.md
│       │   │   │   │   ├── SDKs:javascript:classes:modelsv2.ErrorResponse.md
│       │   │   │   │   ├── SDKs:javascript:classes:modelsv2.EvalDelta.md
│       │   │   │   │   ├── SDKs:javascript:classes:modelsv2.EvalDeltaKeyValue.md
│       │   │   │   │   ├── SDKs:javascript:classes:modelsv2.GetBlockTimeStampOffsetResponse.md
│       │   │   │   │   ├── SDKs:javascript:classes:modelsv2.GetSyncRoundResponse.md
│       │   │   │   │   ├── SDKs:javascript:classes:modelsv2.KvDelta.md
│       │   │   │   │   ├── SDKs:javascript:classes:modelsv2.LedgerStateDeltaForTransactionGroup.md
│       │   │   │   │   ├── SDKs:javascript:classes:modelsv2.LightBlockHeaderProof.md
│       │   │   │   │   ├── SDKs:javascript:classes:modelsv2.NodeStatusResponse.md
│       │   │   │   │   ├── SDKs:javascript:classes:modelsv2.PendingTransactionResponse.md
│       │   │   │   │   ├── SDKs:javascript:classes:modelsv2.PendingTransactionsResponse.md
│       │   │   │   │   ├── SDKs:javascript:classes:modelsv2.PostTransactionsResponse.md
│       │   │   │   │   ├── SDKs:javascript:classes:modelsv2.ScratchChange.md
│       │   │   │   │   ├── SDKs:javascript:classes:modelsv2.SimulateInitialStates.md
│       │   │   │   │   ├── SDKs:javascript:classes:modelsv2.SimulateRequest.md
│       │   │   │   │   ├── SDKs:javascript:classes:modelsv2.SimulateRequestTransactionGroup.md
│       │   │   │   │   ├── SDKs:javascript:classes:modelsv2.SimulateResponse.md
│       │   │   │   │   ├── SDKs:javascript:classes:modelsv2.SimulateTraceConfig.md
│       │   │   │   │   ├── SDKs:javascript:classes:modelsv2.SimulateTransactionGroupResult.md
│       │   │   │   │   ├── SDKs:javascript:classes:modelsv2.SimulateTransactionResult.md
│       │   │   │   │   ├── SDKs:javascript:classes:modelsv2.SimulateUnnamedResourcesAccessed.md
│       │   │   │   │   ├── SDKs:javascript:classes:modelsv2.SimulationEvalOverrides.md
│       │   │   │   │   ├── SDKs:javascript:classes:modelsv2.SimulationOpcodeTraceUnit.md
│       │   │   │   │   ├── SDKs:javascript:classes:modelsv2.SimulationTransactionExecTrace.md
│       │   │   │   │   ├── SDKs:javascript:classes:modelsv2.StateProof.md
│       │   │   │   │   ├── SDKs:javascript:classes:modelsv2.StateProofMessage.md
│       │   │   │   │   ├── SDKs:javascript:classes:modelsv2.SupplyResponse.md
│       │   │   │   │   ├── SDKs:javascript:classes:modelsv2.TealKeyValue.md
│       │   │   │   │   ├── SDKs:javascript:classes:modelsv2.TealValue.md
│       │   │   │   │   ├── SDKs:javascript:classes:modelsv2.TransactionGroupLedgerStateDeltasForRoundResponse.md
│       │   │   │   │   ├── SDKs:javascript:classes:modelsv2.TransactionParametersResponse.md
│       │   │   │   │   ├── SDKs:javascript:classes:modelsv2.TransactionProofResponse.md
│       │   │   │   │   ├── SDKs:javascript:classes:modelsv2.Version.md
│       │   │   │   │   ├── SDKs:javascript:classes:SourceMap.md
│       │   │   │   │   ├── SDKs:javascript:classes:Transaction.md
│       │   │   │   │   ├── SDKs:javascript:enums:ABIReferenceType.md
│       │   │   │   │   ├── SDKs:javascript:enums:ABITransactionType.md
│       │   │   │   │   ├── SDKs:javascript:enums:AtomicTransactionComposerStatus.md
│       │   │   │   │   ├── SDKs:javascript:enums:IntDecoding.md
│       │   │   │   │   ├── SDKs:javascript:enums:OnApplicationComplete.md
│       │   │   │   │   ├── SDKs:javascript:enums:TransactionType.md
│       │   │   │   │   ├── SDKs:javascript:examples:README.md
│       │   │   │   │   ├── SDKs:javascript:FAQ.md
│       │   │   │   │   ├── SDKs:javascript:interfaces:ABIContractNetworkInfo.md
│       │   │   │   │   ├── SDKs:javascript:interfaces:ABIContractNetworks.md
│       │   │   │   │   ├── SDKs:javascript:interfaces:ABIContractParams.md
│       │   │   │   │   ├── SDKs:javascript:interfaces:ABIInterfaceParams.md
│       │   │   │   │   ├── SDKs:javascript:interfaces:ABIMethodArgParams.md
│       │   │   │   │   ├── SDKs:javascript:interfaces:ABIMethodParams.md
│       │   │   │   │   ├── SDKs:javascript:interfaces:ABIMethodReturnParams.md
│       │   │   │   │   ├── SDKs:javascript:interfaces:ABIResult.md
│       │   │   │   │   ├── SDKs:javascript:interfaces:Account.md
│       │   │   │   │   ├── SDKs:javascript:interfaces:Address.md
│       │   │   │   │   ├── SDKs:javascript:interfaces:AlgodTokenHeader.md
│       │   │   │   │   ├── SDKs:javascript:interfaces:BaseHTTPClient.md
│       │   │   │   │   ├── SDKs:javascript:interfaces:BaseHTTPClientError.md
│       │   │   │   │   ├── SDKs:javascript:interfaces:BaseHTTPClientResponse.md
│       │   │   │   │   ├── SDKs:javascript:interfaces:BoxReference.md
│       │   │   │   │   ├── SDKs:javascript:interfaces:CustomTokenHeader.md
│       │   │   │   │   ├── SDKs:javascript:interfaces:EncodedAssetParams.md
│       │   │   │   │   ├── SDKs:javascript:interfaces:EncodedBoxReference.md
│       │   │   │   │   ├── SDKs:javascript:interfaces:EncodedGlobalStateSchema.md
│       │   │   │   │   ├── SDKs:javascript:interfaces:EncodedLocalStateSchema.md
│       │   │   │   │   ├── SDKs:javascript:interfaces:EncodedLogicSig.md
│       │   │   │   │   ├── SDKs:javascript:interfaces:EncodedLogicSigAccount.md
│       │   │   │   │   ├── SDKs:javascript:interfaces:EncodedMultisig.md
│       │   │   │   │   ├── SDKs:javascript:interfaces:EncodedSignedTransaction.md
│       │   │   │   │   ├── SDKs:javascript:interfaces:EncodedSubsig.md
│       │   │   │   │   ├── SDKs:javascript:interfaces:EncodedTransaction.md
│       │   │   │   │   ├── SDKs:javascript:interfaces:IndexerTokenHeader.md
│       │   │   │   │   ├── SDKs:javascript:interfaces:KMDTokenHeader.md
│       │   │   │   │   ├── SDKs:javascript:interfaces:MultisigMetadata.md
│       │   │   │   │   ├── SDKs:javascript:interfaces:SignedTransaction.md
│       │   │   │   │   ├── SDKs:javascript:interfaces:SuggestedParams.md
│       │   │   │   │   ├── SDKs:javascript:interfaces:TransactionParams.md
│       │   │   │   │   ├── SDKs:javascript:interfaces:TransactionWithSigner.md
│       │   │   │   │   ├── SDKs:javascript:modules:indexerModels.md
│       │   │   │   │   ├── SDKs:javascript:modules:modelsv2.md
│       │   │   │   │   ├── SDKs:javascript:modules.md
│       │   │   │   │   ├── SDKs:javascript:README.md
│       │   │   │   │   ├── SDKs:python:algosdk:v2client:harness:README.md
│       │   │   │   │   ├── SDKs:python:examples:README.md
│       │   │   │   │   ├── SDKs:python:README.md
│       │   │   │   │   ├── tealscript:examples_amm_README.md
│       │   │   │   │   ├── tealscript:examples_auction_README.md
│       │   │   │   │   ├── tealscript:examples_big_box_README.md
│       │   │   │   │   ├── tealscript:examples_itxns_README.md
│       │   │   │   │   ├── tealscript:examples_lsig_with_app_README.md
│       │   │   │   │   ├── tealscript:examples_reti_README.md
│       │   │   │   │   ├── tealscript:FEATURES.md
│       │   │   │   │   ├── tealscript:guides_atomic_txn.md
│       │   │   │   │   ├── tealscript:guides_features.md
│       │   │   │   │   ├── tealscript:guides_getting_started.md
│       │   │   │   │   ├── tealscript:guides_inner_transactions.md
│       │   │   │   │   ├── tealscript:guides_lifecycle.md
│       │   │   │   │   ├── tealscript:guides_math.md
│       │   │   │   │   ├── tealscript:guides_methods.md
│       │   │   │   │   ├── tealscript:guides_multiple_contracts.md
│       │   │   │   │   ├── tealscript:guides_pyteal.md
│       │   │   │   │   ├── tealscript:guides_storage.md
│       │   │   │   │   ├── tealscript:guides_Supported Types_arrays.md
│       │   │   │   │   ├── tealscript:guides_Supported Types_numbers.md
│       │   │   │   │   ├── TEALScript:README.md
│       │   │   │   │   ├── tealscript:tests_test_package_README.md
│       │   │   │   │   ├── tealscript:tutorials_Hello World_0001-intro.md
│       │   │   │   │   ├── tealscript:tutorials_Hello World_0002-init.md
│       │   │   │   │   ├── tealscript:tutorials_Hello World_0003-contract.md
│       │   │   │   │   ├── tealscript:tutorials_Hello World_0004-artifacts.md
│       │   │   │   │   ├── tealscript:tutorials_Hello World_0005-hello.md
│       │   │   │   │   └── tealscript:tutorials_Hello World_0006-test.md
│       │   │   │   └── taxonomy-categories
│       │   │   │       ├── algokit-utils.json
│       │   │   │       ├── algokit.json
│       │   │   │       ├── arcs.json
│       │   │   │       ├── clis.json
│       │   │   │       ├── details.json
│       │   │   │       ├── developers.json
│       │   │   │       ├── liquid-auth.json
│       │   │   │       ├── nodes.json
│       │   │   │       ├── puya.json
│       │   │   │       ├── python.json
│       │   │   │       ├── sdks.json
│       │   │   │       └── tealscript.json
│       │   │   └── wallet
│       │   │       └── index.ts
│       │   ├── tools
│       │   │   ├── accountManager.ts
│       │   │   ├── algodManager.ts
│       │   │   ├── apiManager
│       │   │   │   ├── algod
│       │   │   │   │   ├── account.ts
│       │   │   │   │   ├── application.ts
│       │   │   │   │   ├── asset.ts
│       │   │   │   │   ├── index.ts
│       │   │   │   │   └── transaction.ts
│       │   │   │   ├── example
│       │   │   │   │   ├── get-balance.ts
│       │   │   │   │   └── index.ts
│       │   │   │   ├── index.ts
│       │   │   │   ├── indexer
│       │   │   │   │   ├── account.ts
│       │   │   │   │   ├── application.ts
│       │   │   │   │   ├── asset.ts
│       │   │   │   │   ├── index.ts
│       │   │   │   │   └── transaction.ts
│       │   │   │   ├── nfd
│       │   │   │   │   └── index.ts
│       │   │   │   ├── tinyman
│       │   │   │   │   ├── analytics.ts
│       │   │   │   │   ├── bootstrap.ts
│       │   │   │   │   ├── index.ts
│       │   │   │   │   ├── liquidity.ts
│       │   │   │   │   ├── opt_in.ts
│       │   │   │   │   ├── pool.ts
│       │   │   │   │   ├── remove_liquidity.ts
│       │   │   │   │   └── swap.ts
│       │   │   │   ├── ultrade
│       │   │   │   │   ├── index.ts
│       │   │   │   │   ├── market.ts
│       │   │   │   │   ├── system.ts
│       │   │   │   │   └── wallet.ts
│       │   │   │   └── vestige
│       │   │   │       ├── assets.ts
│       │   │   │       ├── balances.ts
│       │   │   │       ├── index.ts
│       │   │   │       ├── networks.ts
│       │   │   │       ├── notes.ts
│       │   │   │       ├── pools.ts
│       │   │   │       ├── protocols.ts
│       │   │   │       ├── swaps.ts
│       │   │   │       └── vaults.ts
│       │   │   ├── arc26Manager.ts
│       │   │   ├── index.ts
│       │   │   ├── knowledgeManager.ts
│       │   │   ├── transactionManager
│       │   │   │   ├── accountTransactions.ts
│       │   │   │   ├── appTransactions
│       │   │   │   │   ├── callTxn.ts
│       │   │   │   │   ├── clearTxn.ts
│       │   │   │   │   ├── closeOutTxn.ts
│       │   │   │   │   ├── createTxn.ts
│       │   │   │   │   ├── deleteTxn.ts
│       │   │   │   │   ├── index.ts
│       │   │   │   │   ├── optInTxn.ts
│       │   │   │   │   ├── test
│       │   │   │   │   │   ├── counter_approval.teal
│       │   │   │   │   │   ├── counter_clear.teal
│       │   │   │   │   │   ├── storage_test_approval_v2.teal
│       │   │   │   │   │   ├── storage_test_approval.teal
│       │   │   │   │   │   └── storage_test_clear.teal
│       │   │   │   │   ├── types.ts
│       │   │   │   │   └── updateTxn.ts
│       │   │   │   ├── assetTransactions.ts
│       │   │   │   ├── generalTransaction.ts
│       │   │   │   └── index.ts
│       │   │   └── utilityManager.ts
│       │   ├── types.ts
│       │   └── utils
│       │       └── responseProcessor.ts
│       ├── tests
│       │   ├── resources
│       │   │   ├── algod
│       │   │   │   ├── account.test.ts
│       │   │   │   ├── application.test.ts
│       │   │   │   ├── asset.test.ts
│       │   │   │   └── transaction.test.ts
│       │   │   └── indexer
│       │   │       ├── account.test.ts
│       │   │       ├── application.test.ts
│       │   │       ├── asset.test.ts
│       │   │       └── transaction.test.ts
│       │   └── tools
│       │       ├── accountManager.test.ts
│       │       ├── algodManager.test.ts
│       │       ├── apiManager
│       │       │   └── example
│       │       │       └── get-balance.test.ts
│       │       ├── transactionManager
│       │       │   ├── accountTransactionManager.test.ts
│       │       │   ├── appTransactionManager.test.ts
│       │       │   ├── assetTransactionManager.test.ts
│       │       │   ├── generalTransactionManager.test.ts
│       │       │   └── transactionManager.test.ts
│       │       └── utilityManager.test.ts
│       └── tsconfig.json
├── README.md
├── rename_files.sh
└── tsconfig.json
```

# Files

--------------------------------------------------------------------------------
/packages/server/src/resources/knowledge/taxonomy/ARCs:specs:arc-0003.md:
--------------------------------------------------------------------------------

```markdown
  1 | ---
  2 | arc: 3
  3 | title: Conventions Fungible/Non-Fungible Tokens
  4 | description: Parameters Conventions for Algorand Standard Assets (ASAs) for fungible tokens and non-fungible tokens (NFTs).
  5 | author: Fabrice Benhamouda (@fabrice102)
  6 | discussions-to: https://github.com/algorandfoundation/ARCs/issues/3
  7 | status: Final
  8 | type: Standards Track
  9 | category: ARC
 10 | sub-category: Asa
 11 | created: 2021-08-07
 12 | ---
 13 | 
 14 | # Algorand Standard Asset Parameters Conventions for Fungible and Non-Fungible Tokens
 15 | 
 16 | ## Abstract
 17 | 
 18 | The goal of these conventions is to make it simpler for block explorers, wallets, exchanges, marketplaces, and more generally, client software to display the properties of a given ASA.
 19 | 
 20 | 
 21 | ## Specification
 22 | 
 23 | The key words "**MUST**", "**MUST NOT**", "**REQUIRED**", "**SHALL**", "**SHALL NOT**", "**SHOULD**", "**SHOULD NOT**", "**RECOMMENDED**", "**MAY**", and "**OPTIONAL**" in this document are to be interpreted as described in <a href="https://www.ietf.org/rfc/rfc2119.txt">RFC-2119</a>.
 24 | 
 25 | > Comments like this are non-normative.
 26 | 
 27 | An [ARC-3](./arc-0003.md) ASA has an associated JSON Metadata file, formatted as specified below, that is stored off-chain.
 28 | 
 29 | ### ASA Parameters Conventions
 30 | 
 31 | The ASA parameters should follow the following conventions:
 32 | 
 33 | * *Unit Name* (`un`): no restriction but **SHOULD** be related to the name in the JSON Metadata file
 34 | * *Asset Name* (`an`): **MUST** be:
 35 |     * (**NOT RECOMMENDED**) either exactly `arc3` (without any space)
 36 |     * (**NOT RECOMMENDED**) or `<name>@arc3`, where `<name>` **SHOULD** be closely related to the name in the JSON Metadata file:
 37 |         * If the resulting asset name can fit the *Asset Name* field, then `<name>` **SHOULD** be equal to the name in the JSON Metadata file.
 38 |         * If the resulting asset name cannot fit the *Asset Name* field, then `<name>` **SHOULD** be a reasonable shorten version of the name in the JSON Metadata file.
 39 |     * (**RECOMMENDED**) or `<name>` where `<name>` is defined as above. In this case, the Asset URL **MUST** end with `#arc3`.
 40 | * *Asset URL* (`au`): a URI pointing to a JSON Metadata file.
 41 |     * This URI as well as any URI in the JSON Metadata file:
 42 |         * **SHOULD** be persistent and allow to download the JSON Metadata file forever.
 43 |         * **MAY** contain the string `{id}`. If `{id}` exists in the URI, clients **MUST** replace this with the asset ID in decimal form. The rules below applies after such a replacement.
 44 |         * **MUST** follow <a href="https://www.ietf.org/rfc/rfc3986.txt">RFC-3986</a> and **MUST NOT** contain any whitespace character
 45 |         * **SHOULD** use one of the following URI schemes (for compatibility and security): *https* and *ipfs*:
 46 |             * When the file is stored on IPFS, the `ipfs://...` URI **SHOULD** be used. IPFS Gateway URI (such as `https://ipfs.io/ipfs/...`) **SHOULD NOT** be used.
 47 |         * **SHOULD NOT** use the following URI scheme: *http* (due to security concerns).
 48 |         * **MUST** be such that the returned resource includes the CORS header
 49 |             ```
 50 |             Access-Control-Allow-Origin: *
 51 |             ```
 52 |             if the URI scheme is *https*
 53 |             > This requirement is to ensure that client JavaScript can load all resources pointed by *https* URIs inside an ARC-3 ASA.
 54 |         * **MAY** be a relative URI when inside the JSON Metadata file. In that case, the relative URI is relative to the Asset URL. The Asset URL **SHALL NOT** be relative. Relative URI **MUST** not contain the character `:`. Clients **MUST** consider a URI as relative if and only if it does not contain the character `:`.
 55 |     * If the Asset Name is neither `arc3` nor of the form `<name>@arc3`, then the Asset URL **MUST** end with `#arc3`.
 56 |     * If the Asset URL ends with `#arc3`, clients **MUST** remove `#arc3` when linking to the URL. When displaying the URL, they **MAY** display `#arc3` in a different style (e.g., a lighter color).
 57 |     * If the Asset URL ends with `#arc3`, the full URL with `#arc3` **SHOULD** be valid and point to the same resource as the URL without `#arc3`.
 58 |         > This recommendation is to ensure backward compatibility with wallets that do not support ARC-3.
 59 | * *Asset Metadata Hash* (`am`):
 60 |     * If the JSON Metadata file specifies extra metadata `e` (property `extra_metadata`), then `am` is defined as:
 61 | 
 62 |         ```plain
 63 |         am = SHA-512/256("arc0003/am" || SHA-512/256("arc0003/amj" || content of JSON Metadata file) || e)
 64 |         ```
 65 | 
 66 |         where `||` denotes concatenation and SHA-512/256 is defined in <a href="https://doi.org/10.6028/NIST.FIPS.180-4">NIST FIPS 180-4</a>.
 67 |         The above definition of `am` **MUST** be used when the property `extra_metadata` is specified, even if its value `e` is the empty string.
 68 |         Python code to compute the hash and a full example are provided below (see "Sample with Extra Metadata").
 69 |         > Extra metadata can be used to store data about the asset that needs to be accessed from a smart contract. The smart contract would not be able to directly read the metadata. But, if provided with the hash of the JSON Metadata file and with the extra metadata `e`, the smart contract can check that `e` is indeed valid.
 70 |     * If the JSON Metadata file does not specify the property `extra_metadata`, then `am` is defined as the SHA-256 digest of the JSON Metadata file as a 32-byte string (as defined in <a href="https://doi.org/10.6028/NIST.FIPS.180-4">NIST FIPS 180-4</a>)
 71 | 
 72 | There are no requirements regarding the manager account of the ASA, or its the reserve account, freeze account, or clawback account.
 73 | 
 74 | > Clients recognize ARC-3 ASAs by looking at the Asset Name and Asset URL. If the Asset Name is `arc3` or ends with `@arc3`, or if the Asset URL ends with `#arc3`, the ASA is to be considered an ARC-3 ASA.
 75 | 
 76 | #### Pure and Fractional NFTs
 77 | 
 78 | An ASA is said to be a *pure non-fungible token* (*pure NFT*) if and only if it has the following properties:
 79 | 
 80 | * *Total Number of Units* (`t`) **MUST** be 1.
 81 | * *Number of Digits after the Decimal Point* (`dc`) **MUST** be 0.
 82 | 
 83 | An ASA is said to be a *fractional non-fungible token* (*fractional NFT*) if and only if it has the following properties:
 84 | 
 85 | * *Total Number of Units* (`t`) **MUST** be a power of 10 larger than 1: 10, 100, 1000, ...
 86 | * *Number of Digits after the Decimal Point* (`dc`) **MUST** be equal to the logarithm in base 10 of total number of units.
 87 | 
 88 | > In other words, the total supply of the ASA is exactly 1.
 89 | 
 90 | ### JSON Metadata File Schema
 91 | 
 92 | > The JSON Medata File schema follow the Ethereum Improvement Proposal <a href="https://eips.ethereum.org/EIPS/eip-1155"> ERC-1155 Metadata URI JSON Schema</a> with the following main differences:
 93 | > * Support for integrity fields for any file pointed by any URI field as well as for localized JSON Metadata files.
 94 | > * Support for mimetype fields for any file pointed by any URI field.
 95 | > * Support for extra metadata that is hashed as part of the Asset Metadata Hash (`am`) of the ASA.
 96 | > * Adding the fields `external_url`, `background_color`, `animation_url` used by <a href="https://docs.opensea.io/docs/metadata-standards">OpenSea metadata format</a>.
 97 | 
 98 | Similarly to ERC-1155, the URI does support ID substitution. If the URI contains `{id}`, clients **MUST** substitute it by the asset ID in *decimal*.
 99 | 
100 | > Contrary to ERC-1155, the ID is represented in decimal (instead of hexadecimal) to match what current APIs and block explorers use on the Algorand blockchain.
101 | 
102 | The JSON Metadata schema is as follows:
103 | 
104 | ```json
105 | {
106 |     "title": "Token Metadata",
107 |     "type": "object",
108 |     "properties": {
109 |         "name": {
110 |             "type": "string",
111 |             "description": "Identifies the asset to which this token represents"
112 |         },
113 |         "decimals": {
114 |             "type": "integer",
115 |             "description": "The number of decimal places that the token amount should display - e.g. 18, means to divide the token amount by 1000000000000000000 to get its user representation."
116 |         },
117 |         "description": {
118 |             "type": "string",
119 |             "description": "Describes the asset to which this token represents"
120 |         },
121 |         "image": {
122 |             "type": "string",
123 |             "description": "A URI pointing to a file with MIME type image/* representing the asset to which this token represents. Consider making any images at a width between 320 and 1080 pixels and aspect ratio between 1.91:1 and 4:5 inclusive."
124 |         },
125 |         "image_integrity": {
126 |             "type": "string",
127 |             "description": "The SHA-256 digest of the file pointed by the URI image. The field value is a single SHA-256 integrity metadata as defined in the W3C subresource integrity specification (https://w3c.github.io/webappsec-subresource-integrity)."
128 |         },
129 |         "image_mimetype": {
130 |             "type": "string",
131 |             "description": "The MIME type of the file pointed by the URI image. MUST be of the form 'image/*'."
132 |         },
133 |         "background_color": {
134 |             "type": "string",
135 |             "description": "Background color do display the asset. MUST be a six-character hexadecimal without a pre-pended #."
136 |         },
137 |         "external_url": {
138 |             "type": "string",
139 |             "description": "A URI pointing to an external website presenting the asset."
140 |         },
141 |         "external_url_integrity": {
142 |             "type": "string",
143 |             "description": "The SHA-256 digest of the file pointed by the URI external_url. The field value is a single SHA-256 integrity metadata as defined in the W3C subresource integrity specification (https://w3c.github.io/webappsec-subresource-integrity)."
144 |         },
145 |         "external_url_mimetype": {
146 |             "type": "string",
147 |             "description": "The MIME type of the file pointed by the URI external_url. It is expected to be 'text/html' in almost all cases."
148 |         },
149 |         "animation_url": {
150 |             "type": "string",
151 |             "description": "A URI pointing to a multi-media file representing the asset."
152 |         },
153 |         "animation_url_integrity": {
154 |             "type": "string",
155 |             "description": "The SHA-256 digest of the file pointed by the URI external_url. The field value is a single SHA-256 integrity metadata as defined in the W3C subresource integrity specification (https://w3c.github.io/webappsec-subresource-integrity)."
156 |         },
157 |         "animation_url_mimetype": {
158 |             "type": "string",
159 |             "description": "The MIME type of the file pointed by the URI animation_url. If the MIME type is not specified, clients MAY guess the MIME type from the file extension or MAY decide not to display the asset at all. It is STRONGLY RECOMMENDED to include the MIME type."
160 |         },
161 |         "properties": {
162 |             "type": "object",
163 |             "description": "Arbitrary properties (also called attributes). Values may be strings, numbers, object or arrays."
164 |         },
165 |         "extra_metadata": {
166 |             "type": "string",
167 |             "description": "Extra metadata in base64. If the field is specified (even if it is an empty string) the asset metadata (am) of the ASA is computed differently than if it is not specified."
168 |         },
169 |         "localization": {
170 |             "type": "object",
171 |             "required": ["uri", "default", "locales"],
172 |             "properties": {
173 |                 "uri": {
174 |                     "type": "string",
175 |                     "description": "The URI pattern to fetch localized data from. This URI should contain the substring `{locale}` which will be replaced with the appropriate locale value before sending the request."
176 |                 },
177 |                 "default": {
178 |                     "type": "string",
179 |                     "description": "The locale of the default data within the base JSON"
180 |                 },
181 |                 "locales": {
182 |                     "type": "array",
183 |                     "description": "The list of locales for which data is available. These locales should conform to those defined in the Unicode Common Locale Data Repository (http://cldr.unicode.org/)."
184 |                 },
185 |                 "integrity": {
186 |                     "type": "object",
187 |                     "patternProperties": {
188 |                         ".*": { "type": "string" }
189 |                     },
190 |                     "description": "The SHA-256 digests of the localized JSON files (except the default one). The field name is the locale. The field value is a single SHA-256 integrity metadata as defined in the W3C subresource integrity specification (https://w3c.github.io/webappsec-subresource-integrity)."
191 |                 }
192 |             }
193 |         }
194 |     }
195 | }
196 | ```
197 | 
198 | All the fields are **OPTIONAL**. But if provided, they **MUST** match the description in the JSON schema.
199 | 
200 | The field `decimals` is **OPTIONAL**. If provided, it **MUST** match the ASA parameter `dt`.
201 | 
202 | URI fields (`image`, `external_url`, `animation_url`, and `localization.uri`) in the JSON Metadata file are defined similarly as the Asset URL parameter `au`.
203 | However, contrary to the Asset URL, they **MAY** be relative (to the Asset URL).
204 | See Asset URL above.
205 | 
206 | 
207 | #### Integrity Fields
208 | 
209 | Compared to ERC-1155, the JSON Metadata schema allows to indicate digests of the files pointed by any URI field.
210 | This is to ensure the integrity of all the files referenced by the ASA.
211 | Concretly, every URI field `xxx` is allowed to have an optional associated field  `xxx_integrity` that specifies the digest of the file pointed by the URI.
212 | 
213 | The digests are represented as a single SHA-256 integrity metadata as defined in the <a href="https://w3c.github.io/webappsec-subresource-integrity">W3C subresource integrity specification</a>.
214 | Details on how to generate those digests can be found on the <a href="https://developer.mozilla.org/en-US/docs/Web/Security/Subresource_Integrity">MDN Web Docs</a> (where `sha384` or `384` are to be replaced by `sha256` and `256` respectively as only SHA-256 is supported by this ARC).
215 | 
216 | It is **RECOMMENDED** to specify all the `xxx_integrity` fields of all the `xxx` URI fields, except for `external_url_integrity` when it points to a potentially mutable website.
217 | 
218 | Any field with a name ending with `_integrity` **MUST** match a corresponding field containing a URI to a file with a matching digest.
219 | For example, if the field `hello_integrity` is specified, the field `hello` **MUST** exist and **MUST** be a URI pointing to a file with a digest equal to the digest specified by `hello_integrity`.
220 | 
221 | #### MIME Type Files
222 | 
223 | Compared to ERC-1155, the JSON Metadata schema allows to indicate the MIME type of the files pointed by any URI field.
224 | This is to allow clients to display appropriately the resource without having to first query it to find out the MIME type.
225 | Concretly, every URI field `xxx` is allowed to have an optional associated field  `xxx_integrity` that specifies the digest of the file pointed by the URI.
226 | 
227 | It is **STRONGLY RECOMMENDED** to specify all the `xxx_mimetype` fields of all the `xxx` URI fields, except for `external_url_mimetype` when it points to a website. If the MIME type is not specified, clients **MAY** guess the MIME type from the file extension or **MAY** decide not to display the asset at all.
228 | 
229 | Clients **MUST NOT** rely on the `xxx_mimetype` fields from a security perspective and **MUST NOT** break or fail if the fields are incorrect (beyond not displaying the asset image or animation correctly). In particular, clients **MUST** take all necessary security measures to protect users against remote code execution or cross-site scripting attacks, even when the MIME type looks innocuous (like `image/png`).
230 | 
231 | > The above restriction is to protect clients and users against malformed or malicious ARC-3.
232 | 
233 | Any field with a name ending with `_mimetype` **MUST** match a corresponding field containing a URI to a file with a matching digest.
234 | For example, if the field `hello_mimetype` is specified, the field `hello` **MUST** exist and **MUST** be a URI pointing to a file with a digest equal to the digest specified by `hello_mimetype`.
235 | 
236 | #### Localization
237 | 
238 | If the JSON Metadata file contains a `localization` attribute, its content **MAY** be used to provide localized values for fields that need it. The `localization` attribute should be a sub-object with three **REQUIRED** attributes: `uri`, `default`, `locales`, and one **RECOMMENDED** attribute: `integrity`. If the string `{locale}` exists in any URI, it **MUST** be replaced with the chosen locale by all client software.
239 | 
240 | > Compared to ERC-1155, the `localization` attribute contains an additional optional `integrity` field that specify the digests of the localized JSON files.
241 | 
242 | It is **RECOMMENDED** that `integrity` contains the digests of all the locales but the default one.
243 | 
244 | 
245 | #### Examples
246 | 
247 | ##### Basic Example
248 | 
249 | An example of an ARC-3 JSON Metadata file for a song follows. The properties array proposes some **SUGGESTED** formatting for token-specific display properties and metadata.
250 | 
251 | ```json
252 | {
253 |     "name": "My Song",
254 |     "description": "My first and best song!",
255 |     "image": "https://s3.amazonaws.com/your-bucket/song/cover/mysong.png",
256 |     "image_integrity": "sha256-47DEQpj8HBSa+/TImW+5JCeuQeRkm5NMpJWZG3hSuFU=",
257 |     "image_mimetype": "image/png",
258 |     "external_url": "https://mysongs.com/song/mysong",
259 |     "animation_url": "https://s3.amazonaws.com/your-bucket/song/preview/mysong.ogg",
260 |     "animation_url_integrity": "sha256-LwArA6xMdnFF3bvQjwODpeTG/RVn61weQSuoRyynA1I=",
261 |     "animation_url_mimetype": "audio/ogg",
262 |     "properties": {
263 |         "simple_property": "example value",
264 |         "rich_property": {
265 |             "name": "Name",
266 |             "value": "123",
267 |             "display_value": "123 Example Value",
268 |             "class": "emphasis",
269 |             "css": {
270 |                 "color": "#ffffff",
271 |                 "font-weight": "bold",
272 |                 "text-decoration": "underline"
273 |             }
274 |         },
275 |         "array_property": {
276 |             "name": "Name",
277 |             "value": [1,2,3,4],
278 |             "class": "emphasis"
279 |         }
280 |     }
281 | }
282 | ```
283 | 
284 | In the example, the `image` field **MAY** be the album cover, while the `animation_url` **MAY** be the full song or may just be a small preview.
285 | In the latter case, the full song **MAY** be specified by three additional properties inside the `properties` field:
286 | ```json
287 | {
288 |     ...
289 |     "properties": {
290 |         ...
291 |         "file_url": "https://s3.amazonaws.com/your-bucket/song/full/mysong.ogg",
292 |         "file_url_integrity": "sha256-7IGatqxLhUYkruDsEva52Ku43up6774yAmf0k98MXnU=",
293 |         "file_url_mimetype": "audio/ogg"
294 |     }
295 | }
296 | ```
297 | 
298 | An example of possible ASA parameters would be:
299 | 
300 | * *Asset Unit*: `mysong` for example
301 | * *Asset Name*: `My Song`
302 | * *Asset URL*: `https://example.com/mypict#arc3` or `https://arweave.net/MAVgEMO3qlqe-qHNVs00qgwwbCb6FY2k15vJP3gBLW4#arc3`
303 | * *Metadata Hash*: the 32 bytes of the SHA-256 digest of the above JSON file
304 | * *Total Number of Units*: 100
305 | * *Number of Digits after the Decimal Point*: 2
306 | 
307 | > IPFS urls of the form `ipfs://QmWS1VAdMD353A6SDk9wNyvkT14kyCiZrNDYAad4w1tKqT#arc3` may be used too but may cause issue with clients that do not support ARC-3 and that do not handle fragments in IPFS URLs.
308 | 
309 | Example of alternative versions for *Asset Name* and *Asset URL*:
310 | 
311 | * *Asset Name*: `My Song@arc3` or `arc3`
312 | * *Asset URL*: `ipfs://QmWS1VAdMD353A6SDk9wNyvkT14kyCiZrNDYAad4w1tKqT` or `https://example.com/mypict` or `https://arweave.net/MAVgEMO3qlqe-qHNVs00qgwwbCb6FY2k15vJP3gBLW4`
313 | 
314 | > These alternative versions are less recommended as they make the asset name harder to read for clients that do not support ARC-3.
315 | 
316 | The above parameters define a fractional NFT with 100 shares.
317 | The JSON Metadata file **MAY** contain the field `decimals: 2`:
318 | ```json
319 | {
320 |     ...
321 |     "decimals": 2
322 | }
323 | ```
324 | 
325 | ##### Example with Relative URI and IPFS
326 | 
327 | > When using IPFS, it is convenient to bundle the JSON Metadata file with other files references by the JSON Metadata file.
328 | > In this case, because of circularity, it is necessary to use relative URI
329 | 
330 | An example of an ARC-3 JSON Metadata file using IPFS and relative URI is provided below:
331 | 
332 | ```json
333 | {
334 |     "name": "My Song",
335 |     "description": "My first and best song!",
336 |     "image": "mysong.png",
337 |     "image_integrity": "sha256-47DEQpj8HBSa+/TImW+5JCeuQeRkm5NMpJWZG3hSuFU=",
338 |     "image_mimetype": "image/png",
339 |     "external_url": "https://mysongs.com/song/mysong",
340 |     "animation_url": "mysong.ogg",
341 |     "animation_url_integrity": "sha256-LwArA6xMdnFF3bvQjwODpeTG/RVn61weQSuoRyynA1I=",
342 |     "animation_url_mimetype": "audio/ogg"
343 | }
344 | ```
345 | 
346 | If the Asset URL is `ipfs://QmWS1VAdMD353A6SDk9wNyvkT14kyCiZrNDYAad4w1tKqT/metadata.json`:
347 | * the `image` URI is `ipfs://QmWS1VAdMD353A6SDk9wNyvkT14kyCiZrNDYAad4w1tKqT/mysong.png`.
348 | * the `animation_url` URI is `ipfs://QmWS1VAdMD353A6SDk9wNyvkT14kyCiZrNDYAad4w1tKqT/mysong.ogg`.
349 | 
350 | 
351 | ##### Example with Extra Metadata and `{id}`
352 | 
353 | An example of an ARC-3 JSON Metadata file with extra metadata and `{id}` is provided below.
354 | 
355 | ```json
356 | {
357 |     "name": "My Picture",
358 |     "description": "Lorem ipsum...",
359 |     "image": "https://s3.amazonaws.com/your-bucket/images/{id}.png",
360 |     "image_integrity": "sha256-47DEQpj8HBSa+/TImW+5JCeuQeRkm5NMpJWZG3hSuFU=",
361 |     "image_mimetype": "image/png",
362 |     "external_url": "https://mysongs.com/song/{id}",
363 |     "extra_metadata": "iHcUslDaL/jEM/oTxqEX++4CS8o3+IZp7/V5Rgchqwc="
364 | }
365 | ```
366 | 
367 | The possible ASA parameters are the same as with the basic example, except for the metadata hash that would be the 32-byte string corresponding to the base64 string `xsmZp6lGW9ktTWAt22KautPEqAmiXxow/iIuJlRlHIg=`.
368 | 
369 | > For completeness, we provide below a Python program that computes this metadata hash:
370 | 
371 | ```python
372 | import base64
373 | import hashlib
374 | 
375 | extra_metadata_base64 = "iHcUslDaL/jEM/oTxqEX++4CS8o3+IZp7/V5Rgchqwc="
376 | extra_metadata = base64.b64decode(extra_metadata_base64)
377 | json_metadata = """{
378 |     "name": "My Picture",
379 |     "description": "Lorem ipsum...",
380 |     "image": "https://s3.amazonaws.com/your-bucket/images/{id}.png",
381 |     "image_integrity": "sha256-47DEQpj8HBSa+/TImW+5JCeuQeRkm5NMpJWZG3hSuFU=",
382 |     "image_mimetype": "image/png",
383 |     "external_url": "https://mysongs.com/song/{id}",
384 |     "extra_metadata": "iHcUslDaL/jEM/oTxqEX++4CS8o3+IZp7/V5Rgchqwc="
385 | }"""
386 | 
387 | h = hashlib.new("sha512_256")
388 | h.update(b"arc0003/amj")
389 | h.update(json_metadata.encode("utf-8"))
390 | json_metadata_hash = h.digest()
391 | 
392 | h = hashlib.new("sha512_256")
393 | h.update(b"arc0003/am")
394 | h.update(json_metadata_hash)
395 | h.update(extra_metadata)
396 | am = h.digest()
397 | 
398 | print("Asset metadata in base64: ")
399 | print(base64.b64encode(am).decode("utf-8"))
400 | ```
401 | 
402 | #### Localized Example
403 | 
404 | An example of an ARC-3 JSON Metadata file with localized metadata is presented below.
405 | 
406 | Base metadata file:
407 | ```json
408 | {
409 |     "name": "Advertising Space",
410 |     "description": "Each token represents a unique Ad space in the city.",
411 |     "localization": {
412 |         "uri": "ipfs://QmWS1VAdMD353A6SDk9wNyvkT14kyCiZrNDYAad4w1tKqT/{locale}.json",
413 |         "default": "en",
414 |         "locales": [
415 |             "en",
416 |             "es",
417 |             "fr"
418 |         ],
419 |         "integrity": {
420 |             "es": "sha256-T0UofLOqdamWQDLok4vy/OcetEFzD8dRLig4229138Y=",
421 |             "fr": "sha256-UUM89QQlXRlerdzVfatUzvNrEI/gwsgsN/lGkR13CKw="
422 |         }
423 |     }
424 | }
425 | ```
426 | 
427 | File `es.json`:
428 | ```json
429 | {
430 |     "name": "Espacio Publicitario",
431 |     "description": "Cada token representa un espacio publicitario único en la ciudad."
432 | }
433 | ```
434 | 
435 | File `fr.json`:
436 | ```json
437 | {
438 |     "name": "Espace Publicitaire",
439 |     "description": "Chaque jeton représente un espace publicitaire unique dans la ville."
440 | }
441 | ```
442 | 
443 | Note that if the base metadata file URI (i.e., the Asset URL) is `ipfs://QmWS1VAdMD353A6SDk9wNyvkT14kyCiZrNDYAad4w1tKqT/metadata.json`, then the `uri` field inside the `localization` field may be the relative URI `{locale}.json`.
444 | 
445 | 
446 | ## Rationale
447 | 
448 | These conventions are heavily based on Ethereum Improvement Proposal <a href="https://eips.ethereum.org/EIPS/eip-1155"> ERC-1155 Metadata URI JSON Schema</a> to facilitate interoperobility.
449 | 
450 | The main differences are highlighted below:
451 | 
452 | * Asset Name and Asset Unit can be optionally specified in the ASA parameters. This is to allow wallets that are not aware of ARC-3 or that are not able to retrieve the JSON file to still display meaningful information.
453 | * A digest of the JSON Metadata file is included in the ASA parameters to ensure integrity of this file. This is redundant with the URI when IPFS is used. But this is important to ensure the integrity of the JSON file when IPFS is not used.
454 | * Similarly, the JSON Metadata schema is changed to allow to specify the SHA-256 digests of the localized versions as well as the SHA-256 digests of any file pointed by a URI property.
455 | * MIME type fields are added to help clients know how to display the files pointed by URI.
456 | * When extra metadata are provided, the Asset Metadata Hash parameter is computed using SHA-512/256 with prefix for proper domain separation. SHA-512/256 is the hash function used in Algorand in general (see the list of prefixes in https://github.com/algorand/go-algorand/blob/master/protocol/hash.go). Domain separation is especially important in this case to avoid mixing hash of the JSON Metadata file with extra metadata. However, since SHA-512/256 is less common and since not every tool or library allows to compute SHA-512/256, when no extra metadata is specified, SHA-256 is used instead.
457 | * Support for relative URI is added to allow storing both the JSON Metadata files and the files it refers to in the same IPFS directory.
458 | 
459 | Valid JSON Metadata files for ERC-1155 are valid JSON Metadata files for ARC-3.
460 | However, it is highly recommended that users always include the additional RECOMMENDED fields, such as the integrity fields.
461 | 
462 | The asset name is either `arc3` or suffixed by `@arc3` to allow client software to know when an asset follows the conventions.
463 | 
464 | ## Security Considerations
465 | > Not Applicable
466 | 
467 | ## Copyright
468 | 
469 | Copyright and related rights waived via <a href="https://creativecommons.org/publicdomain/zero/1.0/">CCO</a>.
470 | 
```

--------------------------------------------------------------------------------
/packages/server/src/resources/knowledge/taxonomy/developer:docs:details:dapps:avm:teal:opcodes:v3.md:
--------------------------------------------------------------------------------

```markdown
  1 | title: v3 Opcodes
  2 | 
  3 | Ops have a 'cost' of 1 unless otherwise specified.
  4 | 
  5 | 
  6 | ## err
  7 | 
  8 | - Bytecode: 0x00
  9 | - Stack: ... &rarr; _exits_
 10 | - Fail immediately.
 11 | 
 12 | ## sha256
 13 | 
 14 | - Bytecode: 0x01
 15 | - Stack: ..., A: []byte &rarr; ..., [32]byte
 16 | - SHA256 hash of value A, yields [32]byte
 17 | - **Cost**: 35
 18 | 
 19 | ## keccak256
 20 | 
 21 | - Bytecode: 0x02
 22 | - Stack: ..., A: []byte &rarr; ..., [32]byte
 23 | - Keccak256 hash of value A, yields [32]byte
 24 | - **Cost**: 130
 25 | 
 26 | ## sha512_256
 27 | 
 28 | - Bytecode: 0x03
 29 | - Stack: ..., A: []byte &rarr; ..., [32]byte
 30 | - SHA512_256 hash of value A, yields [32]byte
 31 | - **Cost**: 45
 32 | 
 33 | ## ed25519verify
 34 | 
 35 | - Bytecode: 0x04
 36 | - Stack: ..., A: []byte, B: [64]byte, C: [32]byte &rarr; ..., bool
 37 | - for (data A, signature B, pubkey C) verify the signature of ("ProgData" || program_hash || data) against the pubkey => {0 or 1}
 38 | - **Cost**: 1900
 39 | - Mode: Signature
 40 | 
 41 | The 32 byte public key is the last element on the stack, preceded by the 64 byte signature at the second-to-last element on the stack, preceded by the data which was signed at the third-to-last element on the stack.
 42 | 
 43 | ## +
 44 | 
 45 | - Bytecode: 0x08
 46 | - Stack: ..., A: uint64, B: uint64 &rarr; ..., uint64
 47 | - A plus B. Fail on overflow.
 48 | 
 49 | Overflow is an error condition which halts execution and fails the transaction. Full precision is available from `addw`.
 50 | 
 51 | ## -
 52 | 
 53 | - Bytecode: 0x09
 54 | - Stack: ..., A: uint64, B: uint64 &rarr; ..., uint64
 55 | - A minus B. Fail if B > A.
 56 | 
 57 | ## /
 58 | 
 59 | - Bytecode: 0x0a
 60 | - Stack: ..., A: uint64, B: uint64 &rarr; ..., uint64
 61 | - A divided by B (truncated division). Fail if B == 0.
 62 | 
 63 | `divmodw` is available to divide the two-element values produced by `mulw` and `addw`.
 64 | 
 65 | ## *
 66 | 
 67 | - Bytecode: 0x0b
 68 | - Stack: ..., A: uint64, B: uint64 &rarr; ..., uint64
 69 | - A times B. Fail on overflow.
 70 | 
 71 | Overflow is an error condition which halts execution and fails the transaction. Full precision is available from `mulw`.
 72 | 
 73 | ## <
 74 | 
 75 | - Bytecode: 0x0c
 76 | - Stack: ..., A: uint64, B: uint64 &rarr; ..., bool
 77 | - A less than B => {0 or 1}
 78 | 
 79 | ## >
 80 | 
 81 | - Bytecode: 0x0d
 82 | - Stack: ..., A: uint64, B: uint64 &rarr; ..., bool
 83 | - A greater than B => {0 or 1}
 84 | 
 85 | ## <=
 86 | 
 87 | - Bytecode: 0x0e
 88 | - Stack: ..., A: uint64, B: uint64 &rarr; ..., bool
 89 | - A less than or equal to B => {0 or 1}
 90 | 
 91 | ## >=
 92 | 
 93 | - Bytecode: 0x0f
 94 | - Stack: ..., A: uint64, B: uint64 &rarr; ..., bool
 95 | - A greater than or equal to B => {0 or 1}
 96 | 
 97 | ## &&
 98 | 
 99 | - Bytecode: 0x10
100 | - Stack: ..., A: uint64, B: uint64 &rarr; ..., bool
101 | - A is not zero and B is not zero => {0 or 1}
102 | 
103 | ## ||
104 | 
105 | - Bytecode: 0x11
106 | - Stack: ..., A: uint64, B: uint64 &rarr; ..., bool
107 | - A is not zero or B is not zero => {0 or 1}
108 | 
109 | ## ==
110 | 
111 | - Bytecode: 0x12
112 | - Stack: ..., A, B &rarr; ..., bool
113 | - A is equal to B => {0 or 1}
114 | 
115 | ## !=
116 | 
117 | - Bytecode: 0x13
118 | - Stack: ..., A, B &rarr; ..., bool
119 | - A is not equal to B => {0 or 1}
120 | 
121 | ## !
122 | 
123 | - Bytecode: 0x14
124 | - Stack: ..., A: uint64 &rarr; ..., uint64
125 | - A == 0 yields 1; else 0
126 | 
127 | ## len
128 | 
129 | - Bytecode: 0x15
130 | - Stack: ..., A: []byte &rarr; ..., uint64
131 | - yields length of byte value A
132 | 
133 | ## itob
134 | 
135 | - Bytecode: 0x16
136 | - Stack: ..., A: uint64 &rarr; ..., [8]byte
137 | - converts uint64 A to big-endian byte array, always of length 8
138 | 
139 | ## btoi
140 | 
141 | - Bytecode: 0x17
142 | - Stack: ..., A: []byte &rarr; ..., uint64
143 | - converts big-endian byte array A to uint64. Fails if len(A) > 8. Padded by leading 0s if len(A) < 8.
144 | 
145 | `btoi` fails if the input is longer than 8 bytes.
146 | 
147 | ## %
148 | 
149 | - Bytecode: 0x18
150 | - Stack: ..., A: uint64, B: uint64 &rarr; ..., uint64
151 | - A modulo B. Fail if B == 0.
152 | 
153 | ## |
154 | 
155 | - Bytecode: 0x19
156 | - Stack: ..., A: uint64, B: uint64 &rarr; ..., uint64
157 | - A bitwise-or B
158 | 
159 | ## &
160 | 
161 | - Bytecode: 0x1a
162 | - Stack: ..., A: uint64, B: uint64 &rarr; ..., uint64
163 | - A bitwise-and B
164 | 
165 | ## ^
166 | 
167 | - Bytecode: 0x1b
168 | - Stack: ..., A: uint64, B: uint64 &rarr; ..., uint64
169 | - A bitwise-xor B
170 | 
171 | ## ~
172 | 
173 | - Bytecode: 0x1c
174 | - Stack: ..., A: uint64 &rarr; ..., uint64
175 | - bitwise invert value A
176 | 
177 | ## mulw
178 | 
179 | - Bytecode: 0x1d
180 | - Stack: ..., A: uint64, B: uint64 &rarr; ..., X: uint64, Y: uint64
181 | - A times B as a 128-bit result in two uint64s. X is the high 64 bits, Y is the low
182 | 
183 | ## addw
184 | 
185 | - Bytecode: 0x1e
186 | - Stack: ..., A: uint64, B: uint64 &rarr; ..., X: uint64, Y: uint64
187 | - A plus B as a 128-bit result. X is the carry-bit, Y is the low-order 64 bits.
188 | - Availability: v2
189 | 
190 | ## intcblock
191 | 
192 | - Syntax: `intcblock UINT ...` where UINT ...: a block of int constant values
193 | - Bytecode: 0x20 {varuint count, [varuint ...]}
194 | - Stack: ... &rarr; ...
195 | - prepare block of uint64 constants for use by intc
196 | 
197 | `intcblock` loads following program bytes into an array of integer constants in the evaluator. These integer constants can be referred to by `intc` and `intc_*` which will push the value onto the stack. Subsequent calls to `intcblock` reset and replace the integer constants available to the script.
198 | 
199 | ## intc
200 | 
201 | - Syntax: `intc I` where I: an index in the intcblock
202 | - Bytecode: 0x21 {uint8}
203 | - Stack: ... &rarr; ..., uint64
204 | - Ith constant from intcblock
205 | 
206 | ## intc_0
207 | 
208 | - Bytecode: 0x22
209 | - Stack: ... &rarr; ..., uint64
210 | - constant 0 from intcblock
211 | 
212 | ## intc_1
213 | 
214 | - Bytecode: 0x23
215 | - Stack: ... &rarr; ..., uint64
216 | - constant 1 from intcblock
217 | 
218 | ## intc_2
219 | 
220 | - Bytecode: 0x24
221 | - Stack: ... &rarr; ..., uint64
222 | - constant 2 from intcblock
223 | 
224 | ## intc_3
225 | 
226 | - Bytecode: 0x25
227 | - Stack: ... &rarr; ..., uint64
228 | - constant 3 from intcblock
229 | 
230 | ## bytecblock
231 | 
232 | - Syntax: `bytecblock BYTES ...` where BYTES ...: a block of byte constant values
233 | - Bytecode: 0x26 {varuint count, [varuint length, bytes ...]}
234 | - Stack: ... &rarr; ...
235 | - prepare block of byte-array constants for use by bytec
236 | 
237 | `bytecblock` loads the following program bytes into an array of byte-array constants in the evaluator. These constants can be referred to by `bytec` and `bytec_*` which will push the value onto the stack. Subsequent calls to `bytecblock` reset and replace the bytes constants available to the script.
238 | 
239 | ## bytec
240 | 
241 | - Syntax: `bytec I` where I: an index in the bytecblock
242 | - Bytecode: 0x27 {uint8}
243 | - Stack: ... &rarr; ..., []byte
244 | - Ith constant from bytecblock
245 | 
246 | ## bytec_0
247 | 
248 | - Bytecode: 0x28
249 | - Stack: ... &rarr; ..., []byte
250 | - constant 0 from bytecblock
251 | 
252 | ## bytec_1
253 | 
254 | - Bytecode: 0x29
255 | - Stack: ... &rarr; ..., []byte
256 | - constant 1 from bytecblock
257 | 
258 | ## bytec_2
259 | 
260 | - Bytecode: 0x2a
261 | - Stack: ... &rarr; ..., []byte
262 | - constant 2 from bytecblock
263 | 
264 | ## bytec_3
265 | 
266 | - Bytecode: 0x2b
267 | - Stack: ... &rarr; ..., []byte
268 | - constant 3 from bytecblock
269 | 
270 | ## arg
271 | 
272 | - Syntax: `arg N` where N: an arg index
273 | - Bytecode: 0x2c {uint8}
274 | - Stack: ... &rarr; ..., []byte
275 | - Nth LogicSig argument
276 | - Mode: Signature
277 | 
278 | ## arg_0
279 | 
280 | - Bytecode: 0x2d
281 | - Stack: ... &rarr; ..., []byte
282 | - LogicSig argument 0
283 | - Mode: Signature
284 | 
285 | ## arg_1
286 | 
287 | - Bytecode: 0x2e
288 | - Stack: ... &rarr; ..., []byte
289 | - LogicSig argument 1
290 | - Mode: Signature
291 | 
292 | ## arg_2
293 | 
294 | - Bytecode: 0x2f
295 | - Stack: ... &rarr; ..., []byte
296 | - LogicSig argument 2
297 | - Mode: Signature
298 | 
299 | ## arg_3
300 | 
301 | - Bytecode: 0x30
302 | - Stack: ... &rarr; ..., []byte
303 | - LogicSig argument 3
304 | - Mode: Signature
305 | 
306 | ## txn
307 | 
308 | - Syntax: `txn F` where F: [txn](#field-group-txn)
309 | - Bytecode: 0x31 {uint8}
310 | - Stack: ... &rarr; ..., any
311 | - field F of current transaction
312 | 
313 | ### txn
314 | 
315 | Fields (see [transaction reference](https://developer.algorand.org/docs/reference/transactions/))
316 | 
317 | | Index | Name | Type | In | Notes |
318 | | - | ------ | -- | - | --------- |
319 | | 0 | Sender | address |      | 32 byte address |
320 | | 1 | Fee | uint64 |      | microalgos |
321 | | 2 | FirstValid | uint64 |      | round number |
322 | | 4 | LastValid | uint64 |      | round number |
323 | | 5 | Note | []byte |      | Any data up to 1024 bytes |
324 | | 6 | Lease | [32]byte |      | 32 byte lease value |
325 | | 7 | Receiver | address |      | 32 byte address |
326 | | 8 | Amount | uint64 |      | microalgos |
327 | | 9 | CloseRemainderTo | address |      | 32 byte address |
328 | | 10 | VotePK | [32]byte |      | 32 byte address |
329 | | 11 | SelectionPK | [32]byte |      | 32 byte address |
330 | | 12 | VoteFirst | uint64 |      | The first round that the participation key is valid. |
331 | | 13 | VoteLast | uint64 |      | The last round that the participation key is valid. |
332 | | 14 | VoteKeyDilution | uint64 |      | Dilution for the 2-level participation key |
333 | | 15 | Type | []byte |      | Transaction type as bytes |
334 | | 16 | TypeEnum | uint64 |      | Transaction type as integer |
335 | | 17 | XferAsset | uint64 |      | Asset ID |
336 | | 18 | AssetAmount | uint64 |      | value in Asset's units |
337 | | 19 | AssetSender | address |      | 32 byte address. Source of assets if Sender is the Asset's Clawback address. |
338 | | 20 | AssetReceiver | address |      | 32 byte address |
339 | | 21 | AssetCloseTo | address |      | 32 byte address |
340 | | 22 | GroupIndex | uint64 |      | Position of this transaction within an atomic transaction group. A stand-alone transaction is implicitly element 0 in a group of 1 |
341 | | 23 | TxID | [32]byte |      | The computed ID for this transaction. 32 bytes. |
342 | | 24 | ApplicationID | uint64 | v2  | ApplicationID from ApplicationCall transaction |
343 | | 25 | OnCompletion | uint64 | v2  | ApplicationCall transaction on completion action |
344 | | 27 | NumAppArgs | uint64 | v2  | Number of ApplicationArgs |
345 | | 29 | NumAccounts | uint64 | v2  | Number of Accounts |
346 | | 30 | ApprovalProgram | []byte | v2  | Approval program |
347 | | 31 | ClearStateProgram | []byte | v2  | Clear state program |
348 | | 32 | RekeyTo | address | v2  | 32 byte Sender's new AuthAddr |
349 | | 33 | ConfigAsset | uint64 | v2  | Asset ID in asset config transaction |
350 | | 34 | ConfigAssetTotal | uint64 | v2  | Total number of units of this asset created |
351 | | 35 | ConfigAssetDecimals | uint64 | v2  | Number of digits to display after the decimal place when displaying the asset |
352 | | 36 | ConfigAssetDefaultFrozen | bool | v2  | Whether the asset's slots are frozen by default or not, 0 or 1 |
353 | | 37 | ConfigAssetUnitName | []byte | v2  | Unit name of the asset |
354 | | 38 | ConfigAssetName | []byte | v2  | The asset name |
355 | | 39 | ConfigAssetURL | []byte | v2  | URL |
356 | | 40 | ConfigAssetMetadataHash | [32]byte | v2  | 32 byte commitment to unspecified asset metadata |
357 | | 41 | ConfigAssetManager | address | v2  | 32 byte address |
358 | | 42 | ConfigAssetReserve | address | v2  | 32 byte address |
359 | | 43 | ConfigAssetFreeze | address | v2  | 32 byte address |
360 | | 44 | ConfigAssetClawback | address | v2  | 32 byte address |
361 | | 45 | FreezeAsset | uint64 | v2  | Asset ID being frozen or un-frozen |
362 | | 46 | FreezeAssetAccount | address | v2  | 32 byte address of the account whose asset slot is being frozen or un-frozen |
363 | | 47 | FreezeAssetFrozen | bool | v2  | The new frozen value, 0 or 1 |
364 | | 49 | NumAssets | uint64 | v3  | Number of Assets |
365 | | 51 | NumApplications | uint64 | v3  | Number of Applications |
366 | | 52 | GlobalNumUint | uint64 | v3  | Number of global state integers in ApplicationCall |
367 | | 53 | GlobalNumByteSlice | uint64 | v3  | Number of global state byteslices in ApplicationCall |
368 | | 54 | LocalNumUint | uint64 | v3  | Number of local state integers in ApplicationCall |
369 | | 55 | LocalNumByteSlice | uint64 | v3  | Number of local state byteslices in ApplicationCall |
370 | 
371 | 
372 | ## global
373 | 
374 | - Syntax: `global F` where F: [global](#field-group-global)
375 | - Bytecode: 0x32 {uint8}
376 | - Stack: ... &rarr; ..., any
377 | - global field F
378 | 
379 | ### global
380 | 
381 | Fields
382 | 
383 | | Index | Name | Type | In | Notes |
384 | | - | ------ | -- | - | --------- |
385 | | 0 | MinTxnFee | uint64 |      | microalgos |
386 | | 1 | MinBalance | uint64 |      | microalgos |
387 | | 2 | MaxTxnLife | uint64 |      | rounds |
388 | | 3 | ZeroAddress | address |      | 32 byte address of all zero bytes |
389 | | 4 | GroupSize | uint64 |      | Number of transactions in this atomic transaction group. At least 1 |
390 | | 5 | LogicSigVersion | uint64 | v2  | Maximum supported version |
391 | | 6 | Round | uint64 | v2  | Current round number. Application mode only. |
392 | | 7 | LatestTimestamp | uint64 | v2  | Last confirmed block UNIX timestamp. Fails if negative. Application mode only. |
393 | | 8 | CurrentApplicationID | uint64 | v2  | ID of current application executing. Application mode only. |
394 | | 9 | CreatorAddress | address | v3  | Address of the creator of the current application. Application mode only. |
395 | 
396 | 
397 | ## gtxn
398 | 
399 | - Syntax: `gtxn T F` where T: transaction group index, F: [txn](#field-group-txn)
400 | - Bytecode: 0x33 {uint8}, {uint8}
401 | - Stack: ... &rarr; ..., any
402 | - field F of the Tth transaction in the current group
403 | 
404 | for notes on transaction fields available, see `txn`. If this transaction is _i_ in the group, `gtxn i field` is equivalent to `txn field`.
405 | 
406 | ## load
407 | 
408 | - Syntax: `load I` where I: position in scratch space to load from
409 | - Bytecode: 0x34 {uint8}
410 | - Stack: ... &rarr; ..., any
411 | - Ith scratch space value. All scratch spaces are 0 at program start.
412 | 
413 | ## store
414 | 
415 | - Syntax: `store I` where I: position in scratch space to store to
416 | - Bytecode: 0x35 {uint8}
417 | - Stack: ..., A &rarr; ...
418 | - store A to the Ith scratch space
419 | 
420 | ## txna
421 | 
422 | - Syntax: `txna F I` where F: [txna](#field-group-txna), I: transaction field array index
423 | - Bytecode: 0x36 {uint8}, {uint8}
424 | - Stack: ... &rarr; ..., any
425 | - Ith value of the array field F of the current transaction<br />`txna` can be called using `txn` with 2 immediates.
426 | - Availability: v2
427 | 
428 | ### txna
429 | 
430 | Fields (see [transaction reference](https://developer.algorand.org/docs/reference/transactions/))
431 | 
432 | | Index | Name | Type | In | Notes |
433 | | - | ------ | -- | - | --------- |
434 | | 26 | ApplicationArgs | []byte | v2  | Arguments passed to the application in the ApplicationCall transaction |
435 | | 28 | Accounts | address | v2  | Accounts listed in the ApplicationCall transaction |
436 | | 48 | Assets | uint64 | v3  | Foreign Assets listed in the ApplicationCall transaction |
437 | | 50 | Applications | uint64 | v3  | Foreign Apps listed in the ApplicationCall transaction |
438 | 
439 | 
440 | ## gtxna
441 | 
442 | - Syntax: `gtxna T F I` where T: transaction group index, F: [txna](#field-group-txna), I: transaction field array index
443 | - Bytecode: 0x37 {uint8}, {uint8}, {uint8}
444 | - Stack: ... &rarr; ..., any
445 | - Ith value of the array field F from the Tth transaction in the current group<br />`gtxna` can be called using `gtxn` with 3 immediates.
446 | - Availability: v2
447 | 
448 | ## gtxns
449 | 
450 | - Syntax: `gtxns F` where F: [txn](#field-group-txn)
451 | - Bytecode: 0x38 {uint8}
452 | - Stack: ..., A: uint64 &rarr; ..., any
453 | - field F of the Ath transaction in the current group
454 | - Availability: v3
455 | 
456 | for notes on transaction fields available, see `txn`. If top of stack is _i_, `gtxns field` is equivalent to `gtxn _i_ field`. gtxns exists so that _i_ can be calculated, often based on the index of the current transaction.
457 | 
458 | ## gtxnsa
459 | 
460 | - Syntax: `gtxnsa F I` where F: [txna](#field-group-txna), I: transaction field array index
461 | - Bytecode: 0x39 {uint8}, {uint8}
462 | - Stack: ..., A: uint64 &rarr; ..., any
463 | - Ith value of the array field F from the Ath transaction in the current group<br />`gtxnsa` can be called using `gtxns` with 2 immediates.
464 | - Availability: v3
465 | 
466 | ## bnz
467 | 
468 | - Syntax: `bnz TARGET` where TARGET: branch offset
469 | - Bytecode: 0x40 {int16 (big-endian)}
470 | - Stack: ..., A: uint64 &rarr; ...
471 | - branch to TARGET if value A is not zero
472 | 
473 | The `bnz` instruction opcode 0x40 is followed by two immediate data bytes which are a high byte first and low byte second which together form a 16 bit offset which the instruction may branch to. For a bnz instruction at `pc`, if the last element of the stack is not zero then branch to instruction at `pc + 3 + N`, else proceed to next instruction at `pc + 3`. Branch targets must be aligned instructions. (e.g. Branching to the second byte of a 2 byte op will be rejected.) Starting at v4, the offset is treated as a signed 16 bit integer allowing for backward branches and looping. In prior version (v1 to v3), branch offsets are limited to forward branches only, 0-0x7fff.
474 | 
475 | At v2 it became allowed to branch to the end of the program exactly after the last instruction: bnz to byte N (with 0-indexing) was illegal for a TEAL program with N bytes before v2, and is legal after it. This change eliminates the need for a last instruction of no-op as a branch target at the end. (Branching beyond the end--in other words, to a byte larger than N--is still illegal and will cause the program to fail.)
476 | 
477 | ## bz
478 | 
479 | - Syntax: `bz TARGET` where TARGET: branch offset
480 | - Bytecode: 0x41 {int16 (big-endian)}
481 | - Stack: ..., A: uint64 &rarr; ...
482 | - branch to TARGET if value A is zero
483 | - Availability: v2
484 | 
485 | See `bnz` for details on how branches work. `bz` inverts the behavior of `bnz`.
486 | 
487 | ## b
488 | 
489 | - Syntax: `b TARGET` where TARGET: branch offset
490 | - Bytecode: 0x42 {int16 (big-endian)}
491 | - Stack: ... &rarr; ...
492 | - branch unconditionally to TARGET
493 | - Availability: v2
494 | 
495 | See `bnz` for details on how branches work. `b` always jumps to the offset.
496 | 
497 | ## return
498 | 
499 | - Bytecode: 0x43
500 | - Stack: ..., A: uint64 &rarr; _exits_
501 | - use A as success value; end
502 | - Availability: v2
503 | 
504 | ## assert
505 | 
506 | - Bytecode: 0x44
507 | - Stack: ..., A: uint64 &rarr; ...
508 | - immediately fail unless A is a non-zero number
509 | - Availability: v3
510 | 
511 | ## pop
512 | 
513 | - Bytecode: 0x48
514 | - Stack: ..., A &rarr; ...
515 | - discard A
516 | 
517 | ## dup
518 | 
519 | - Bytecode: 0x49
520 | - Stack: ..., A &rarr; ..., A, A
521 | - duplicate A
522 | 
523 | ## dup2
524 | 
525 | - Bytecode: 0x4a
526 | - Stack: ..., A, B &rarr; ..., A, B, A, B
527 | - duplicate A and B
528 | - Availability: v2
529 | 
530 | ## dig
531 | 
532 | - Syntax: `dig N` where N: depth
533 | - Bytecode: 0x4b {uint8}
534 | - Stack: ..., A, [N items] &rarr; ..., A, [N items], A
535 | - Nth value from the top of the stack. dig 0 is equivalent to dup
536 | - Availability: v3
537 | 
538 | ## swap
539 | 
540 | - Bytecode: 0x4c
541 | - Stack: ..., A, B &rarr; ..., B, A
542 | - swaps A and B on stack
543 | - Availability: v3
544 | 
545 | ## select
546 | 
547 | - Bytecode: 0x4d
548 | - Stack: ..., A, B, C: uint64 &rarr; ..., A or B
549 | - selects one of two values based on top-of-stack: B if C != 0, else A
550 | - Availability: v3
551 | 
552 | ## concat
553 | 
554 | - Bytecode: 0x50
555 | - Stack: ..., A: []byte, B: []byte &rarr; ..., []byte
556 | - join A and B
557 | - Availability: v2
558 | 
559 | `concat` fails if the result would be greater than 4096 bytes.
560 | 
561 | ## substring
562 | 
563 | - Syntax: `substring S E` where S: start position, E: end position
564 | - Bytecode: 0x51 {uint8}, {uint8}
565 | - Stack: ..., A: []byte &rarr; ..., []byte
566 | - A range of bytes from A starting at S up to but not including E. If E < S, or either is larger than the array length, the program fails
567 | - Availability: v2
568 | 
569 | ## substring3
570 | 
571 | - Bytecode: 0x52
572 | - Stack: ..., A: []byte, B: uint64, C: uint64 &rarr; ..., []byte
573 | - A range of bytes from A starting at B up to but not including C. If C < B, or either is larger than the array length, the program fails
574 | - Availability: v2
575 | 
576 | ## getbit
577 | 
578 | - Bytecode: 0x53
579 | - Stack: ..., A, B: uint64 &rarr; ..., uint64
580 | - Bth bit of (byte-array or integer) A. If B is greater than or equal to the bit length of the value (8*byte length), the program fails
581 | - Availability: v3
582 | 
583 | see explanation of bit ordering in setbit
584 | 
585 | ## setbit
586 | 
587 | - Bytecode: 0x54
588 | - Stack: ..., A, B: uint64, C: uint64 &rarr; ..., any
589 | - Copy of (byte-array or integer) A, with the Bth bit set to (0 or 1) C. If B is greater than or equal to the bit length of the value (8*byte length), the program fails
590 | - Availability: v3
591 | 
592 | When A is a uint64, index 0 is the least significant bit. Setting bit 3 to 1 on the integer 0 yields 8, or 2^3. When A is a byte array, index 0 is the leftmost bit of the leftmost byte. Setting bits 0 through 11 to 1 in a 4-byte-array of 0s yields the byte array 0xfff00000. Setting bit 3 to 1 on the 1-byte-array 0x00 yields the byte array 0x10.
593 | 
594 | ## getbyte
595 | 
596 | - Bytecode: 0x55
597 | - Stack: ..., A: []byte, B: uint64 &rarr; ..., uint64
598 | - Bth byte of A, as an integer. If B is greater than or equal to the array length, the program fails
599 | - Availability: v3
600 | 
601 | ## setbyte
602 | 
603 | - Bytecode: 0x56
604 | - Stack: ..., A: []byte, B: uint64, C: uint64 &rarr; ..., []byte
605 | - Copy of A with the Bth byte set to small integer (between 0..255) C. If B is greater than or equal to the array length, the program fails
606 | - Availability: v3
607 | 
608 | ## balance
609 | 
610 | - Bytecode: 0x60
611 | - Stack: ..., A: uint64 &rarr; ..., uint64
612 | - balance for account A, in microalgos. The balance is observed after the effects of previous transactions in the group, and after the fee for the current transaction is deducted. Changes caused by inner transactions are observable immediately following `itxn_submit`
613 | - Availability: v2
614 | - Mode: Application
615 | 
616 | params: Txn.Accounts offset (or, since v4, an _available_ account address), _available_ application id (or, since v4, a Txn.ForeignApps offset). Return: value.
617 | 
618 | ## app_opted_in
619 | 
620 | - Bytecode: 0x61
621 | - Stack: ..., A: uint64, B: uint64 &rarr; ..., bool
622 | - 1 if account A is opted in to application B, else 0
623 | - Availability: v2
624 | - Mode: Application
625 | 
626 | params: Txn.Accounts offset (or, since v4, an _available_ account address), _available_ application id (or, since v4, a Txn.ForeignApps offset). Return: 1 if opted in and 0 otherwise.
627 | 
628 | ## app_local_get
629 | 
630 | - Bytecode: 0x62
631 | - Stack: ..., A: uint64, B: stateKey &rarr; ..., any
632 | - local state of the key B in the current application in account A
633 | - Availability: v2
634 | - Mode: Application
635 | 
636 | params: Txn.Accounts offset (or, since v4, an _available_ account address), state key. Return: value. The value is zero (of type uint64) if the key does not exist.
637 | 
638 | ## app_local_get_ex
639 | 
640 | - Bytecode: 0x63
641 | - Stack: ..., A: uint64, B: uint64, C: stateKey &rarr; ..., X: any, Y: bool
642 | - X is the local state of application B, key C in account A. Y is 1 if key existed, else 0
643 | - Availability: v2
644 | - Mode: Application
645 | 
646 | params: Txn.Accounts offset (or, since v4, an _available_ account address), _available_ application id (or, since v4, a Txn.ForeignApps offset), state key. Return: did_exist flag (top of the stack, 1 if the application and key existed and 0 otherwise), value. The value is zero (of type uint64) if the key does not exist.
647 | 
648 | ## app_global_get
649 | 
650 | - Bytecode: 0x64
651 | - Stack: ..., A: stateKey &rarr; ..., any
652 | - global state of the key A in the current application
653 | - Availability: v2
654 | - Mode: Application
655 | 
656 | params: state key. Return: value. The value is zero (of type uint64) if the key does not exist.
657 | 
658 | ## app_global_get_ex
659 | 
660 | - Bytecode: 0x65
661 | - Stack: ..., A: uint64, B: stateKey &rarr; ..., X: any, Y: bool
662 | - X is the global state of application A, key B. Y is 1 if key existed, else 0
663 | - Availability: v2
664 | - Mode: Application
665 | 
666 | params: Txn.ForeignApps offset (or, since v4, an _available_ application id), state key. Return: did_exist flag (top of the stack, 1 if the application and key existed and 0 otherwise), value. The value is zero (of type uint64) if the key does not exist.
667 | 
668 | ## app_local_put
669 | 
670 | - Bytecode: 0x66
671 | - Stack: ..., A: uint64, B: stateKey, C &rarr; ...
672 | - write C to key B in account A's local state of the current application
673 | - Availability: v2
674 | - Mode: Application
675 | 
676 | params: Txn.Accounts offset (or, since v4, an _available_ account address), state key, value.
677 | 
678 | ## app_global_put
679 | 
680 | - Bytecode: 0x67
681 | - Stack: ..., A: stateKey, B &rarr; ...
682 | - write B to key A in the global state of the current application
683 | - Availability: v2
684 | - Mode: Application
685 | 
686 | ## app_local_del
687 | 
688 | - Bytecode: 0x68
689 | - Stack: ..., A: uint64, B: stateKey &rarr; ...
690 | - delete key B from account A's local state of the current application
691 | - Availability: v2
692 | - Mode: Application
693 | 
694 | params: Txn.Accounts offset (or, since v4, an _available_ account address), state key.
695 | 
696 | Deleting a key which is already absent has no effect on the application local state. (In particular, it does _not_ cause the program to fail.)
697 | 
698 | ## app_global_del
699 | 
700 | - Bytecode: 0x69
701 | - Stack: ..., A: stateKey &rarr; ...
702 | - delete key A from the global state of the current application
703 | - Availability: v2
704 | - Mode: Application
705 | 
706 | params: state key.
707 | 
708 | Deleting a key which is already absent has no effect on the application global state. (In particular, it does _not_ cause the program to fail.)
709 | 
710 | ## asset_holding_get
711 | 
712 | - Syntax: `asset_holding_get F` where F: [asset_holding](#field-group-asset_holding)
713 | - Bytecode: 0x70 {uint8}
714 | - Stack: ..., A: uint64, B: uint64 &rarr; ..., X: any, Y: bool
715 | - X is field F from account A's holding of asset B. Y is 1 if A is opted into B, else 0
716 | - Availability: v2
717 | - Mode: Application
718 | 
719 | ### asset_holding
720 | 
721 | Fields
722 | 
723 | | Index | Name | Type | Notes |
724 | | - | ------ | -- | --------- |
725 | | 0 | AssetBalance | uint64 | Amount of the asset unit held by this account |
726 | | 1 | AssetFrozen | bool | Is the asset frozen or not |
727 | 
728 | 
729 | params: Txn.Accounts offset (or, since v4, an _available_ address), asset id (or, since v4, a Txn.ForeignAssets offset). Return: did_exist flag (1 if the asset existed and 0 otherwise), value.
730 | 
731 | ## asset_params_get
732 | 
733 | - Syntax: `asset_params_get F` where F: [asset_params](#field-group-asset_params)
734 | - Bytecode: 0x71 {uint8}
735 | - Stack: ..., A: uint64 &rarr; ..., X: any, Y: bool
736 | - X is field F from asset A. Y is 1 if A exists, else 0
737 | - Availability: v2
738 | - Mode: Application
739 | 
740 | ### asset_params
741 | 
742 | Fields
743 | 
744 | | Index | Name | Type | Notes |
745 | | - | ------ | -- | --------- |
746 | | 0 | AssetTotal | uint64 | Total number of units of this asset |
747 | | 1 | AssetDecimals | uint64 | See AssetParams.Decimals |
748 | | 2 | AssetDefaultFrozen | bool | Frozen by default or not |
749 | | 3 | AssetUnitName | []byte | Asset unit name |
750 | | 4 | AssetName | []byte | Asset name |
751 | | 5 | AssetURL | []byte | URL with additional info about the asset |
752 | | 6 | AssetMetadataHash | [32]byte | Arbitrary commitment |
753 | | 7 | AssetManager | address | Manager address |
754 | | 8 | AssetReserve | address | Reserve address |
755 | | 9 | AssetFreeze | address | Freeze address |
756 | | 10 | AssetClawback | address | Clawback address |
757 | 
758 | 
759 | params: Txn.ForeignAssets offset (or, since v4, an _available_ asset id. Return: did_exist flag (1 if the asset existed and 0 otherwise), value.
760 | 
761 | ## min_balance
762 | 
763 | - Bytecode: 0x78
764 | - Stack: ..., A: uint64 &rarr; ..., uint64
765 | - minimum required balance for account A, in microalgos. Required balance is affected by ASA, App, and Box usage. When creating or opting into an app, the minimum balance grows before the app code runs, therefore the increase is visible there. When deleting or closing out, the minimum balance decreases after the app executes. Changes caused by inner transactions or box usage are observable immediately following the opcode effecting the change.
766 | - Availability: v3
767 | - Mode: Application
768 | 
769 | params: Txn.Accounts offset (or, since v4, an _available_ account address), _available_ application id (or, since v4, a Txn.ForeignApps offset). Return: value.
770 | 
771 | ## pushbytes
772 | 
773 | - Syntax: `pushbytes BYTES` where BYTES: a byte constant
774 | - Bytecode: 0x80 {varuint length, bytes}
775 | - Stack: ... &rarr; ..., []byte
776 | - immediate BYTES
777 | - Availability: v3
778 | 
779 | pushbytes args are not added to the bytecblock during assembly processes
780 | 
781 | ## pushint
782 | 
783 | - Syntax: `pushint UINT` where UINT: an int constant
784 | - Bytecode: 0x81 {varuint}
785 | - Stack: ... &rarr; ..., uint64
786 | - immediate UINT
787 | - Availability: v3
788 | 
789 | pushint args are not added to the intcblock during assembly processes
790 | 
```

--------------------------------------------------------------------------------
/packages/server/src/resources/knowledge/taxonomy/developer:docs:run-a-node:setup:install.md:
--------------------------------------------------------------------------------

```markdown
  1 | title: Install a node
  2 | # Overview
  3 | 
  4 | This guide explains how to install the Algorand Node software on Linux distributions and Mac OS. When installing on Linux, two installation methods are covered: by package manager and by updater script.
  5 | 
  6 | [The package manager method](#installation-with-a-package-manager) uses fixed directories and automatically updates. It has been validated on Debian, Ubuntu, Fedora, and CentOS.
  7 | 
  8 | [The updater script method](#installation-with-the-updater-script) allows manually setting data directories and requires manual updates. It has been tested on the same Linux distributions from above, as well as on openSUSE Leap, Manjaro, Mageia, Alpine, and Solus.
  9 | 
 10 | !!! warning
 11 |     Do not mix and match installation methods as this can lead to hard-to-debug issues. If the package manager method is available in your environment, we strongly recommend using only this method.
 12 | 
 13 | !!! tip
 14 |     Windows users may choose to build their own native binaries. Rand Labs provides a [repository](https://github.com/randlabs/algorand-windows-node/) with instructions on how to accomplish this, along with an [accompanying tutorial](https://developer.algorand.org/tutorials/compile-and-run-the-algorand-node-natively-windows/).
 15 | 
 16 | !!! tip
 17 |     If you are a developer and want to use a private network, [AlgoKit](/docs/get-started/algokit) is often simpler than installing a node manually. However, it is still recommended to install the Algorand software without running a node, to get access to the developer tools such as `msgpacktool` and `algokey`.
 18 | 
 19 | ### Hardware Requirements
 20 | 
 21 | (Last update to this section: April 3, 2024.)
 22 | 
 23 | Due to the higher TPS on MainNet, to successfully run an Algorand MainNet node, the following hardware is necessary:
 24 | 
 25 | * 8GB of RAM (Some node operators successfully use 4GB, but it requires additional memory management and may still lag behind during extremely high network activity)
 26 | * A not-too-slow SSD: HDD and SD cards are too slow for a MainNet node and will most likely prevent the node to sync
 27 | * at least 100Mbps connection (1Gbps recommended)
 28 | 
 29 | Participation nodes (especially those with high stake) and relays have higher requirements to ensure the performance of the overall blockchain.
 30 | 
 31 | Recommended system specification for **participation** nodes is:
 32 | 
 33 | * 8 vCPU
 34 | * 16 GB RAM
 35 | * 100 GB NVMe SSD or equivalent
 36 | * 1 Gbps connection with low latency
 37 | 
 38 | Recommended system specification for **archival non-relay** nodes is:
 39 | 
 40 | * 8 vCPU
 41 | * 16 GB RAM
 42 | * 3 TB SSD (blocks and catchpoint storage - `ColdDataDir` in the [configuration file](https://developer.algorand.org/docs/run-a-node/reference/config/#algod-configuration-settings))
 43 | * 100 GB NVMe SSD (accounts - `HotDataDir` in the [configuration file](https://developer.algorand.org/docs/run-a-node/reference/config/#algod-configuration-settings))
 44 | * 5 TB/month egress
 45 | * 1 Gbps connection with low latency
 46 | 
 47 | Recommended system specification for **non-archival relay** (aka light relay) nodes is:
 48 | 
 49 | * 16 vCPU
 50 | * 32 GB RAM
 51 | * 256 GB NVMe SSD or equivalent
 52 | * 30 TB/month egress
 53 | * 1 Gbps connection with very low latency
 54 | 
 55 | Recommended system specification for **archival relay** nodes is:
 56 | 
 57 | * 16 vCPU
 58 | * 32 GB RAM
 59 | * 3 TB SSD (blocks and catchpoint storage - `ColdDataDir` in the [configuration file](https://developer.algorand.org/docs/run-a-node/reference/config/#algod-configuration-settings))
 60 | * 100 GB NVMe SSD (accounts - `HotDataDir` in the [configuration file](https://developer.algorand.org/docs/run-a-node/reference/config/#algod-configuration-settings))
 61 | * 30 TB/month egress
 62 | * 1 Gbps connection with very low latency
 63 | 
 64 | While directly-attached NVMe SSD are recommended, in October 2022, the use of AWS EBS gp3 was able to provide sufficient performance. Users choosing this option should constantly monitor performance of the node, and may need to upgrade to faster storage solutions in the future (e.g., in case of important increase of TPS support).
 65 | 
 66 | 
 67 | !!! info
 68 |     Private networks used for development require much lower specs as they are usually achieving much lower TPS. A Raspberry Pi with 2GB of RAM is sufficient for low-TPS private networks.
 69 |     
 70 | 
 71 | ### Docker Images
 72 | 
 73 | Official Docker images are available from [Docker Hub](https://hub.docker.com/r/algorand/algod).
 74 | 
 75 | 
 76 | ### Package manager installation overview
 77 | 
 78 | See [Node Artifacts](../../reference/artifacts) reference for a detailed list of some of files that are installed by this method. An environment variable can be set that points to the data directory and goal will use that variable if no `-d` flag is specified. The binaries will be installed in the `/usr/bin` and the data directory will be set to `/var/lib/algorand`. It is recommended to add to shell config files the following environment variable that points to the data directory:
 79 | 
 80 | ```
 81 | export ALGORAND_DATA=/var/lib/algorand
 82 | ```
 83 | 
 84 | Note that the environment variable set by this command is not permanent, so it is advisable to add the exports to shell config files (e.g., `~/.bashrc` or `~/.zshrc`).
 85 | 
 86 | Use this option when installing in the following operating systems: Debian, Ubuntu, Fedora, CentOS, and other Debian and Red Hat based Linux distributions.
 87 | 
 88 | !!! info
 89 |     `kmd` related files such as the kmd token file will be written to the `${HOME}/.algorand/kmd-version` directory. These files are primarily used with the SDKs and REST endpoints.
 90 | 
 91 | 
 92 | ### Updater script installation overview
 93 | A node installation consists of two folders: the binaries (bin) and the data (data) folders. The bin folder can be created anywhere, but Algorand recommends `~/node`. This location is referenced later in the documentation. Remember to replace this location in the documentation below with the correct location. It is assumed that this folder is dedicated to Algorand binaries and is archived before each update. Note that nothing is currently deleted, the binaries for Algorand are just overwritten.
 94 | 
 95 | When installing for the first time a `data` directory will need to be specified. Algorand recommends using a location under the `node` folder, e.g. `~/node/data`. See [Node Artifacts](../../reference/artifacts) reference for a detailed list of all files that are installed. An environment variable can be set that points to the data directory and goal will use that variable if no `-d` flag is specified.
 96 | 
 97 | Additionally, it is convenient to add `~/node` to `PATH` so `goal` becomes directly executable, instead of having to constantly reference it as `./goal` in the `node` directory.
 98 | 
 99 | ```
100 | export ALGORAND_DATA="$HOME/node/data"
101 | export PATH="$HOME/node:$PATH"
102 | ```
103 | 
104 | Note that the environment variables set by these commands are not permanent, so it is advisable to add the exports to shell config files (e.g., `~/.bashrc` or `~/.zshrc`).
105 | 
106 | Use this option when installing in the following operating systems: macOS, openSUSE Leap, Manjaro, Mageia, Alpine, Solus, etc. 
107 | Also, use this method for the Linux distributions listed in the previous section if you want full control of the installation process (this is not recommended for most users).
108 | 
109 | 
110 | # Installation with a package manager
111 | 
112 | This is the recommended method for most users on a compatible OS.
113 | 
114 | ## Debian based distributions (Debian, Ubuntu, Linux Mint, ...)
115 | Nodes have been verified on Ubuntu 18.04 and 20.04, as well as on Debian 11. Other Debian-based distros should work as well (use apt-get install rather than apt install).
116 | 
117 | + Open a terminal and run the following commands.
118 | 
119 | ```
120 | sudo apt-get update
121 | sudo apt-get install -y gnupg2 curl software-properties-common
122 | curl -o - https://releases.algorand.com/key.pub | sudo tee /etc/apt/trusted.gpg.d/algorand.asc
123 | sudo add-apt-repository "deb [arch=amd64] https://releases.algorand.com/deb/ stable main"
124 | sudo apt-get update
125 | 
126 | # To get both algorand and the devtools:
127 | sudo apt-get install -y algorand-devtools
128 | 
129 | # Or, to only install algorand:
130 | sudo apt-get install -y algorand
131 | 
132 | algod -v
133 | ```
134 | 
135 | These commands will install and configure `algod` as a service and place the algorand binaries in the `/usr/bin` directory. These binaries will be in the path so the `algod` and `goal` commands can be executed from anywhere. Additionally, every node has a data directory, in this case, it will be set to `/var/lib/algorand`.
136 | 
137 | This install defaults to the Algorand MainNet network. See [switching networks](../operations/switch_networks.md) for details on changing to another network.
138 | 
139 | !!! Note
140 |     Most tools are included in the node binary package and do not require a separate install. There are a few additional tools (such as `pingpong`) in a separate tools package (i.e., `tools_stable_linux-amd64_2.1.6.tar.gz`).
141 | 
142 | !!! Note 
143 |     Since the data directory `/var/lib/algorand` is owned by the user `algorand` and the daemon `algod` is run as the user `algorand`, some operations such as the ones related to wallets and accounts keys (`goal account ...` and `goal wallet ...`) need to be run as the user `algorand`. For example, to list participation keys, use 
144 |     ```bash
145 |     sudo -u algorand -E goal account listpartkeys
146 |     ``` 
147 |     (assuming the environment variable `$ALGORAND_DATA` is set to `/var/lib/algorand`) or 
148 |     ```bash
149 |     sudo -u algorand -E goal account listpartkey -d /var/lib/algorand
150 |     ``` 
151 |     (otherwise).
152 |     
153 | !!! Warning
154 |      *Never run `goal` as `root`* (e.g., do *not* run `sudo goal account listpartkeys`). Running `goal` as `root` can compromise the permissions of files in `/var/lib/algorand`.
155 | 
156 | 
157 | ## Red Hat based distributions (Fedora, CentOS, ...)
158 | Installing on Fedora and CentOS are described below.
159 | 
160 | + To install to CentOS 7, open a terminal and run the following commands.
161 | 
162 | ```
163 | curl -O https://releases.algorand.com/rpm/rpm_algorand.pub
164 | sudo rpmkeys --import rpm_algorand.pub
165 | sudo yum install yum-utils
166 | sudo yum-config-manager --add-repo https://releases.algorand.com/rpm/stable/algorand.repo
167 | 
168 | # To get both algorand and the devtools:
169 | sudo yum install algorand-devtools
170 | 
171 | # Or, to only install algorand:
172 | sudo yum install algorand
173 | ```
174 | 
175 | + To install to Fedora or CentOS 8 Stream, open a terminal and run the following commands.
176 | 
177 | ```
178 | curl -O https://releases.algorand.com/rpm/rpm_algorand.pub
179 | sudo rpmkeys --import rpm_algorand.pub
180 | dnf install -y 'dnf-command(config-manager)'
181 | dnf config-manager --add-repo=https://releases.algorand.com/rpm/stable/algorand.repo
182 | dnf install algorand
183 | ```
184 | 
185 | These commands will install and configure `algod` as a service and place the algorand binaries in the `/usr/bin` directory. These binaries will be in the path so the `algod` and `goal` commands can be executed from anywhere. Additionally, every node has a data directory, in this case, it will be set to `/var/lib/algorand`.
186 | 
187 | This install defaults to the Algorand MainNet network. See switching networks<LINK> for details on changing to another network.
188 | 
189 | !!! Note
190 |     Most tools are included in the node binary package and do not require a separate install. There are a few additional tools (such as `pingpong`) in a separate tools package (i.e., `tools_stable_linux-amd64_2.1.6.tar.gz`).
191 | 
192 | 
193 | ## Installing the Devtools
194 | Beginning with the 2.1.5 release, there is now a new package called `algorand-devtools` that contains the developer tools.  The package contains the following binaries, some of which are new (as of 2.1.5) and some of which have been removed from the `algorand` package to decrease its size:
195 | 
196 | - carpenter
197 | - catchupsrv
198 | - msgpacktool
199 | - tealcut
200 | - tealdbg
201 | 
202 | Installing the devtools is simple and no additional entries need to be added for either `apt` or `yum` to be aware of them.  Simply install the tools as usual via the respective package manager. Since the `algorand` package is a dependency of `algorand-devtools` and the two former cannot be older than the latter, one of two possible scenarios will occur upon downloading the devtools:
203 | 
204 | - If `algorand` has not been previously installed, it will automatically download it.
205 | - If `algorand` is installed but older than the devtools, it will automatically upgrade it.
206 | 
207 | See the examples above to understand how to install the deb and rpm packages.
208 | 
209 | 
210 | ## Start Node
211 | Installs by a package manager automatically start the node. Starting and stopping a node should be done using `systemctl` commands:
212 | 
213 | ```
214 | sudo systemctl start algorand
215 | ```
216 | 
217 | ```
218 | sudo systemctl stop algorand
219 | ```
220 | 
221 | The status of the node can be checked by running:
222 | 
223 | ```
224 | goal node status -d /var/lib/algorand
225 | ```
226 | 
227 | 
228 | # Installation with the updater script
229 | 
230 | ## Installing on a Mac
231 | Verified on OSX v12.3.1 (Monterey).
232 | 
233 | + Create a folder to hold the install package and files.
234 | 
235 | ```
236 | mkdir ~/node
237 | cd ~/node
238 | ```
239 | 
240 | Download the updater script.
241 | 
242 | ```
243 | curl https://raw.githubusercontent.com/algorand/go-algorand/rel/stable/cmd/updater/update.sh -O
244 | ```
245 | 
246 | + Ensure that your system knows it's an executable file.
247 | 
248 | ```
249 | chmod 744 update.sh
250 | ```
251 | 
252 | + Run the installer from within your node directory.
253 | 
254 | ```
255 | ./update.sh -i -c stable -p ~/node -d ~/node/data -n
256 | ```
257 | When the installer runs, it will pull down the latest update package from S3 and install it. The `-n` option above tells the installer to not auto-start the node. If the installation succeeds the node will need to be started manually described later in this [guide](#start-node).
258 | 
259 | !!! info
260 |     When installing the `rel/beta` release, specify the beta channel `-c beta`
261 | 
262 | !!! info
263 |     Add the following exports to shell config files. Hereafter, goal will default to using `$ALGORAND_DATA` as the data directory, removing the need to specify `-d ~/node/data` in every command.
264 | 
265 |     ```
266 |     export ALGORAND_DATA="$HOME/node/data"
267 |     export PATH="$HOME/node:$PATH"
268 |     ```
269 | 
270 | !!! Note
271 |     If installing using the updater script then all the binaries are downloaded together, i.e., there is not a separate devtools archive file or package.
272 | 
273 | 
274 | ## Installing on Linux
275 | Nodes have been verified on Ubuntu, CentOS, Fedora, openSUSE Leap, Manjaro, Mageia, Alpine, and Solus. Other modern distros should work as well.
276 | 
277 | + Create a temporary folder to hold the install package and files.
278 | 
279 | ```
280 | mkdir ~/node
281 | cd ~/node
282 | ```
283 | 
284 | Download the updater script.
285 | 
286 | ```
287 | wget https://raw.githubusercontent.com/algorand/go-algorand/rel/stable/cmd/updater/update.sh
288 | ```
289 | 
290 | + Ensure that your system knows it's an executable file.
291 | 
292 | ```
293 | chmod 744 update.sh
294 | ```
295 | 
296 | + Run the installer from within your node directory.
297 | 
298 | ```
299 | ./update.sh -i -c stable -p ~/node -d ~/node/data -n
300 | ```
301 | 
302 | When the installer runs, it will pull down the latest update package from S3 and install it. The `-n` option above tells the installer to not auto-start the node. If the installation succeeds the node will need to be started manually described later in this [guide](#start-node).
303 | 
304 | !!! info
305 |     Add the following exports to shell config files. Hereafter, goal will default to using `$ALGORAND_DATA` as the data directory, removing the need to specify `-d ~/node/data` in every command.
306 | 
307 |     ```
308 |     export ALGORAND_DATA="$HOME/node/data"
309 |     export PATH="$HOME/node:$PATH"
310 |     ```
311 | 
312 | !!! Note
313 |     If installing using the updater script then all the binaries are downloaded together, i.e., there is not a separate devtools archive file or package.
314 | 
315 | 
316 | ## Start Node
317 | Installs by the updater script require that the node be started manually. This can be done with the following command:
318 | 
319 | ```
320 | goal node start
321 | ```
322 | 
323 | This will start the node and it can be verified by running:
324 | 
325 | ```
326 | pgrep algod
327 | ```
328 | 
329 | The node can be manually stopped by running:
330 | 
331 | ```
332 | goal node stop
333 | ```
334 | 
335 | 
336 | ## Installing algod as a systemd service
337 | When installing using the updater script, there are several shell scripts that are bundled into the tarball that will are helpful in running `algod`. One of those is the `systemd-setup.sh` script to create a system service.
338 | 
339 | ```
340 | Usage: ./systemd-setup.sh username group [bindir]
341 | ```
342 | 
343 | Note that this takes an optional binary directory (`bindir`) parameter. This will be discussed more in the following sections.
344 | 
345 | ### Installing system-wide
346 | 
347 | To install `algod` as a system-wide service, run the script with root privileges:
348 | 
349 | ```
350 | sudo ./systemd-setup.sh algorand algorand
351 | ```
352 | 
353 | This will create the service in `/lib/systemd/system/[email protected]` and will have used the template `[email protected]` (downloaded in the same tarball) to create the service. It includes a lot of helpful information at the top of the file and is worth perusing.
354 | 
355 | The location of the binaries is needed by the template to tell `systemd` where to find `algod`. This can be controlled by the `bindir` parameter, which is the third parameter when calling the shell script, and is expected to be an absolute path.
356 | 
357 | Here is a snippet of the template:
358 | 
359 | ```
360 | [Service]
361 | ExecStart=@@BINDIR@@/algod -d %I
362 | User=@@USER@@
363 | Group=@@GROUP@@
364 | ...
365 | ```
366 | 
367 | !!! Note
368 |     If `bindir` is not provided, the script will assume the current working directory.
369 | 
370 | After installing, the script will also make `systemd` aware that the script is present on the system. However, if making changes after installation, be sure to run the following command to register those changes:
371 | 
372 | ```
373 | sudo systemctl daemon-reload
374 | ```
375 | 
376 | All that's left now is to start the service using `systemctl`. If preferred, it can also be enabled to start on system startup.
377 | 
378 | ```
379 | sudo systemctl start algorand@$(systemd-escape $ALGORAND_DATA)
380 | ```
381 | 
382 | 
383 | # Configure Telemetry
384 | Algod is instrumented to provide telemetry which is used for insight into the software's performance and usage. Telemetry is disabled by default and so no data will be shared with Algorand Inc. Enabling telemetry provides data to Algorand to improve the software and help to identify issues. 
385 | 
386 | ## Enable Telemetry
387 | 
388 | Telemetry can be enabled by following the command below *as the user running `algod`* (replacing `<name>` with your desired hostname, e.g. 'SarahsLaptop'):
389 | 
390 | ```bash
391 | diagcfg telemetry name -n <name>
392 | ```
393 | 
394 | If the Debian package is used, the above command needs to be run as the `algorand` user, i.e.:
395 | 
396 | ```bash
397 | sudo -u algorand -H -E diagcfg telemetry name -n <name>
398 | ```
399 | 
400 | (The option `-H` is necessary to ensure `$HOME` is set to the home directory of the `algorand` user.)
401 | 
402 | Telemetry can also be provided without providing a hostname:
403 | 
404 | ```bash
405 | diagcfg telemetry enable
406 | ```
407 | 
408 | If the Debian package is used, the above command needs to be run as the `algorand` user, i.e.:
409 | 
410 | ```bash
411 | sudo -u algorand -H -E diagcfg telemetry enable
412 | ```
413 | 
414 | !!! Note
415 |     After enabling (or disabling) telemetry, the node needs to be restarted.
416 | 
417 | !!! Warning
418 |     Do *not* run `diagcfg` as the `root` user: it would only enable telemetry for nodes run as the `root` user (and nodes should usually not be run as the `root` user). In particular, do *not* run `sudo diagcfg ...`.
419 | 
420 | ## Disable Telemetry
421 | 
422 | Telemetry can be disabled at any time by using (*as the user running `algod`*):
423 | 
424 | ```bash
425 | diagcfg telemetry disable
426 | ```
427 | 
428 | If the Debian package is used, the above command needs to be run as the `algorand` user, i.e.:
429 | 
430 | ```bash
431 | sudo -u algorand -H -E diagcfg telemetry
432 | ```
433 | 
434 | ## Technical Details and Checking Telemetry is Enabled
435 | 
436 | Running the `diagcfg` commands will create and update the logging configuration settings stored in `~/.algorand/logging.config` (and `data/logging.config` if the parameter `-d data` is provided).
437 | 
438 | To check if telemetry is enabled, run (*as the user running `algod`*):
439 | 
440 | ```bash
441 | diagcfg telemetry
442 | ```
443 | 
444 | If the Debian package is used, the above command needs to be run as the `algorand` user, i.e.:
445 | 
446 | ```bash
447 | sudo -u algorand -H -E diagcfg telemetry
448 | ```
449 | 
450 | It is also possible to check whether `algod` is connected to the telemetry server by running:
451 | 
452 | ```bash
453 | sudo netstat -an | grep :9243
454 | ```
455 | 
456 | If a single node/`algod` is running and telemetry is enabled, the output should look like:
457 | 
458 | ```plain
459 | tcp        0      0 xxx.xxx.xxx.xxx:yyyyy        18.214.74.184:9243      ESTABLISHED
460 | ```
461 | 
462 | When telemetry is disabled, the above command prints nothing.
463 | 
464 | For additional detail see the [reference page on telemetry](../../reference/telemetry-config).
465 | 
466 | # Sync Node with Network
467 | When a node first starts, it will need to sync with the network. This process can take a while as the node is loading up the current ledger and catching up to the rest of the network. See the section below a [Fast Catchup](#sync-node-network-using-fast-catchup) option. The status can be checked by running the following goal command:
468 | 
469 | ```
470 | goal node status
471 | ```
472 | 
473 | The goal node status command will return information about the node and what block number it is currently processing. When the node is caught up with the rest of the network, the "Sync Time" will be 0.0 as in the example response below (if on MainNet, some details will be different).
474 | 
475 | ```
476 | Last committed block: 125064
477 | Time since last block: 3.1s
478 | Sync Time: 0.0s
479 | Last consensus protocol: https://github.com/algorandfoundation/specs/tree/5615adc36bad610c7f165fa2967f4ecfa75125f0
480 | Next consensus protocol: https://github.com/algorandfoundation/specs/tree/5615adc36bad610c7f165fa2967f4ecfa75125f0
481 | Round for next consensus protocol: 125065
482 | Next consensus protocol supported: true
483 | Genesis ID: testnet-v1.0
484 | Genesis hash: SGO1GKSzyE7IEPItTxCByw9x8FmnrCDexi9/cOUJOiI=
485 | ```
486 | 
487 | # Sync Node Network using Fast Catchup
488 | 
489 | Fast Catchup is a new feature and will rapidly update a node using catchpoint  snapshots. A new command on goal node is now available for catchup. The entire process should sync a node in minutes rather than hours or days. As an example, the results for a BetaNet fast catchup, at the time of writing this, was a couple minutes to get to the sync point and a few more minutes to sync the remaining blocks since the snapshot. The total blocks synced was around 4.2 million blocks and it finished syncing in under 6 minutes. Actual sync times may vary depending on the number of accounts, number of blocks and the network.  Here are the links to get the most recent catchup point snapshot per network. The results  include a round to catchup to and the provided catchpoint. Paste into the `goal node catchup` command.
490 | 
491 | BetaNet
492 | https://algorand-catchpoints.s3.us-east-2.amazonaws.com/channel/betanet/latest.catchpoint
493 | 
494 | TestNet
495 | https://algorand-catchpoints.s3.us-east-2.amazonaws.com/channel/testnet/latest.catchpoint
496 | 
497 | MainNet
498 | https://algorand-catchpoints.s3.us-east-2.amazonaws.com/channel/mainnet/latest.catchpoint
499 | 
500 | The results will look similar to this:
501 | `4420000#Q7T2RRTDIRTYESIXKAAFJYFQWG4A3WRA3JIUZVCJ3F4AQ2G2HZRA`
502 | 
503 | !!! warning
504 |     Do **NOT** use fast catchup on an *archival* or relay node. If you ever do it, you need to reset your node and start from scratch.
505 | 
506 | !!! warning
507 |     Fast catchup requires trust in the entity providing the catchpoint. An attacker controlling enough relays and proposing a malicious catchpoint can in theory allow a node to sync to an incorrect state of the blockchain. For full decentralization and no trust requirement, either use a catchpoint generated by one of your archival node (you can read the catchpoint using `goal node status`) or catch up from scratch without fast catchup.
508 | 
509 | Steps:
510 | 
511 | 1) Start the node, if not started already, and run a status.
512 | 
513 | `goal node start`
514 | 
515 | `goal node status`
516 | 
517 | Results should look something like this...
518 | 
519 | ```
520 | Last committed block: 308
521 | Time since last block: 0.0s
522 | Sync Time: 6.5s
523 | Last consensus protocol: https://github.com/algorand/spec/tree/a26ed78ed8f834e2b9ccb6eb7d3ee9f629a6e622
524 | Next consensus protocol: https://github.com/algorand/spec/tree/a26ed78ed8f834e2b9ccb6eb7d3ee9f629a6e622
525 | Round for next consensus protocol: 309
526 | Next consensus protocol supported: true
527 | Last Catchpoint:
528 | Genesis ID: betanet-v1.0
529 | Genesis hash: mFgazF+2uRS1tMiL9dsj01hJGySEmPN28B/TjjvpVW0=
530 | ```
531 | 2) Use the sync point captured above and paste into the catchup option
532 | 
533 | `goal node catchup 4420000#Q7T2RRTDIRTYESIXKAAFJYFQWG4A3WRA3JIUZVCJ3F4AQ2G2HZRA`
534 | 
535 | 3) Run another status and results should look something like this showing a Catchpoint status:
536 | `goal node status`
537 | 
538 | Results should show 5 Catchpoint status lines for Catchpoint, total accounts, accounts processed, total blocks , downloaded blocks.
539 | 
540 | ```
541 | Last committed block: 4453
542 | Sync Time: 15.8s
543 | Catchpoint: 4420000#Q7T2RRTDIRTYESIXKAAFJYFQWG4A3WRA3JIUZVCJ3F4AQ2G2HZRA
544 | Catchpoint total accounts: 1146
545 | Catchpoint accounts processed: 1146
546 | Catchpoint total blocks: 1000
547 | Catchpoint downloaded blocks: 81
548 | Genesis ID: betanet-v1.0
549 | Genesis hash: mFgazF+2uRS1tMiL9dsj01hJGySEmPN28B/TjjvpVW0=
550 | ```
551 | 
552 | !!! Note
553 |     Only the first 3 status (`Catchpoint`, `total accounts`, `accounts processed`) will show right after catchup begins. Status on `total blocks` and `downloaded blocks` will only show after catchup processes the total number of accounts, which takes several minutes.
554 | 
555 | 4) A new option can facilitate a status watch, -w which takes a parameter of time, in milliseconds, between two successive status updates. This will eliminate the need to repeatedly issue a status manually. Press ^c to exit the watch.
556 | 
557 | `goal node status -w 1000`
558 | 
559 | 5) Notice that the 5 Catchpoint status lines will disappear when completed, and then only a few more minutes are needed to sync from that point to the current block. **Once there is a Sync Time of 0, the node is synced and if fully usable. **
560 | 
561 | ```
562 | Last committed block: 4431453
563 | Time since last block: 3.9s
564 | Sync Time: 0.0s
565 | Last consensus protocol: https://github.com/algorandfoundation/specs/tree/e5f565421d720c6f75cdd186f7098495caf9101f
566 | Next consensus protocol: https://github.com/algorandfoundation/specs/tree/e5f565421d720c6f75cdd186f7098495caf9101f
567 | Round for next consensus protocol: 4431454
568 | Next consensus protocol supported: true
569 | Last Catchpoint: 4430000#UAQPNY32LP3K5ARGFUQEFTBGELI5ZAQOMBGE7YL5ZFXL2MXWTO2A
570 | Genesis ID: betanet-v1.0
571 | Genesis hash: mFgazF+2uRS1tMiL9dsj01hJGySEmPN28B/TjjvpVW0=
572 | ```
573 | 
574 | ## Troubleshooting for fast catchup
575 | 
576 | If fast catchup fails, check the following:
577 | 
578 | * the node is *not* archival (and is not a relay).
579 | * the software is up-to-date: `goal version -v` should report the latest `Algorand` version in https://github.com/algorand/go-algorand/releases, ignoring the `Algorand BetaNet` releases.
580 | * the catch point matches the network used by the node and reported as `Genesis ID` by `goal node status`.
581 | * the hardware requirements above are satisfied, in particular a not-too-slow SSD is used.
582 | * the computer does not run out of memory.
583 | 
584 | If you used fast catchup on an archival node, you need to stop the node, remove all files in the data folder except the configuration files (`*.json`) and the genesis files (`genesis*`), and restart the node. This operation will also remove all keys stored in the node. Proceed with caution.
585 | 
586 | # Updating Node
587 | The *RPM* or *Debian* packages are updated automatically. For other installs, check for and install the latest updates by running `./update.sh -d ~/node/data` at any time from within your node directory. Note that the `-d` argument has to be specified when updating. It will query S3 for available builds and see if there are newer builds than the currently installed version. To force an update, run `./update.sh -i -c stable -d ~/node/data`.
588 | 
589 | If there is a newer version, it will be downloaded and unpacked. The node will shutdown, the binaries and data files will be archived, and the new binaries will be installed. If any part of the process fails, the node will restore the previous version (bin and data) and restart the node. If it succeeds, the new version is started. The automatic start can be disabled by adding the `-n` option.
590 | 
591 | Setting up a schedule to automatically check for and install updates can be done with CRON.
592 | 
593 | ```
594 | crontab -e
595 | ```
596 | 
597 | Add a line that looks like this (run update.sh every hour, on the half-hour, of every day), where ‘user’ is the name of the account used to install / run the node:
598 | 
599 | ```
600 | 30 * * * * /home/user/node/update.sh -d /home/user/node/data >/home/user/node/update.log 2>&1
601 | ```
602 | 
603 | 
604 | # DNS Configuration for betanet
605 | For the `betanet` network, when installing a new node or relay, make the following modification to the `config.json` file located in the node's data directory.
606 | First, if there is not a config.json, make a copy of the config.json.example file.
607 | ```
608 | cp config.json.example config.json
609 | ```
610 | Then edit the config.json file and replace the line
611 | ```
612 | "DNSBootstrapID": "<network>.algorand.network",
613 | ```
614 | with
615 | ```
616 | "DNSBootstrapID": "<network>.algodev.network",
617 | ```
618 | This modification to the `DNSBootstrapID` is only required for the `betanet` network.
619 | 
```
Page 53/93FirstPrevNextLast