This is page 24 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-0002.md:
--------------------------------------------------------------------------------
```markdown
1 | ---
2 | arc: 2
3 | title: Algorand Transaction Note Field Conventions
4 | description: Conventions for encoding data in the note field at application-level
5 | author: Fabrice Benhamouda (@fabrice102), Stéphane Barroso (@SudoWeezy), Cosimo Bassi (@cusma)
6 | discussions-to: https://github.com/algorandfoundation/ARCs/issues/2
7 | status: Final
8 | type: Standards Track
9 | category: ARC
10 | sub-category: Explorer
11 | created: 2021-07-06
12 | ---
13 |
14 | # Algorand Transaction Note Field Conventions
15 |
16 | ## Abstract
17 |
18 | The goal of these conventions is to make it simpler for block explorers and indexers to parse the data in the note fields and filter transactions of certain dApps.
19 |
20 | ## Specification
21 |
22 | Note fields should be formatted as follows:
23 |
24 | for dApps
25 | ```
26 | <dapp-name>:<data-format><data>
27 | ```
28 |
29 | for ARCs
30 | ```
31 | arc<arc-number>:<data-format><data>
32 | ```
33 |
34 | where:
35 | * `<dapp-name>` is the name of the dApp:
36 | * Regexp to satisfy: `[a-zA-Z0-9][a-zA-Z0-9_/@.-]{4-31}`
37 | In other words, a name should:
38 | * only contain alphanumerical characters or `_`, `/`, `-`, `@`, `.`
39 | * start with an alphanumerical character
40 | * be at least 5 characters long
41 | * be at most 32 characters long
42 | * Names starting with `a/` and `af/` are reserved for the Algorand protocol and the Algorand Foundation uses.
43 |
44 | * `<arc-number>` is the number of the ARC:
45 | * Regexp to satisfy: `\b(0|[1-9]\d*)\b`
46 | In other words, an arc-number should:
47 | * Only contain a digit number, without any padding
48 |
49 | * `<data-format>` is one of the following:
50 | * `m`: <a href="https://msgpack.org">MsgPack</a>
51 | * `j`: <a href="https://json.org">JSON</a>
52 | * `b`: arbitrary bytes
53 | * `u`: utf-8 string
54 | * `<data>` is the actual data in the format specified by `<data-format>`
55 |
56 | **WARNING**: Any user can create transactions with arbitrary data and may impersonate other dApps. In particular, the fact that a note field start with `<dapp-name>` does not guarantee that it indeed comes from this dApp. The value `<dapp-name>` cannot be relied upon to ensure provenance and validity of the `<data>`.
57 |
58 | **WARNING**: Any user can create transactions with arbitrary data, including ARC numbers, which may not correspond to the intended standard. An ARC number included in a note field does not ensure compliance with the corresponding standard. The value of the ARC number cannot be relied upon to ensure the provenance and validity of the <data>.
59 |
60 | ### Versioning
61 |
62 | This document suggests the following convention for the names of dApp with multiple versions: `mydapp/v1`, `mydapp/v2`, ... However, dApps are free to use any other convention and may include the version inside the `<data>` part instead of the `<dapp-name>` part.
63 |
64 | ## Rationale
65 |
66 | The goal of these conventions is to facilitate displaying notes by block explorers and filtering of transactions by notes. However, the note field **cannot be trusted**, as any user can create transactions with arbitrary note fields. An external mechanism needs to be used to ensure the validity and provenance of the data. For example:
67 |
68 | * Some dApps may only send transactions from a small set of accounts controlled by the dApps. In that case, the sender of the transaction should be checked.
69 | * Some dApps may fund escrow accounts created from some template TEAL script. In that case, the note field may contain the template parameters and the escrow account address should be checked to correspond to the resulting TEAL script.
70 | * Some dApps may include a signature in the `<data>` part of the note field. The `<data>` may be an MsgPack encoding of a structure of the form:
71 | ```json
72 | {
73 | "d": ... // actual data
74 | "sig": ... // signature of the actual data (encoded using MsgPack)
75 | }
76 | ```
77 | In that case, the signature should be checked.
78 |
79 | The conventions were designed to support multiple use cases of the notes. Some dApps may just record data on the blockchain without using any smart contracts. Such dApps typically would use JSON or MsgPack encoding.
80 |
81 | On the other hands, dApps that need reading note fields from smart contracts most likely would require easier-to-parse formats of data, which would most likely consist in application-specific byte strings.
82 |
83 | Since `<dapp-name>:` is a prefix of the note, transactions for a given dApp can easily be filtered by the <a href="https://github.com/algorand/indexer">indexer</a> ().
84 |
85 | The restrictions on dApp names were chosen to allow most usual names while avoiding any encoding or displaying issues. The maximum length (32) matches the maximum length of ASA on Algorand, while the minimum length (5) has been chosen to limit collisions.
86 |
87 | ## Reference Implementation
88 |
89 | > This section is non-normative.
90 |
91 | Consider [ARC-20](./arc-0020.md), that provides information about Smart ASA's Application.
92 |
93 | Here a potential note indicating that the Application ID is 123:
94 |
95 | * JSON without version:
96 | ```
97 | arc20:j{"application-id":123}
98 | ```
99 |
100 | Consider a dApp named `algoCityTemp` that stores temperatures from cities on the blockchain.
101 |
102 | Here are some potential notes indicating that Singapore's temperature is 35 degree Celsius:
103 | * JSON without version:
104 | ```
105 | algoCityTemp:j{"city":"Singapore","temp":35}
106 | ```
107 | * JSON with version in the name:
108 | ```
109 | algoCityTemp/v1:j{"city":"Singapore","temp":35}
110 | ```
111 | * JSON with version in the name with index lookup:
112 | ```
113 | algoCityTemp/v1/35:j{"city":"Singapore","temp":35}
114 | ```
115 | * JSON with version in the data:
116 | ```
117 | algoCityTemp:j{"city":"Singapore","temp":35,"ver":1}
118 | ```
119 | * UTF-8 string without version:
120 | ```
121 | algoCityTemp:uSingapore|35
122 | ```
123 | * Bytes where the temperature is encoded as a signed 1-byte integer in the first position:
124 | ```
125 | algoCityTemp:b#Singapore
126 | ```
127 | (`#` is the ASCII character for 35.)
128 | * MsgPack corresponding to the JSON example with version in the name. The string is encoded in base64 as it contains characters that cannot be printed in this document. But the note should contain the actual bytes and not the base64 encoding of them:
129 | ```
130 | YWxnb0NpdHlUZW1wL3YxOoKkY2l0ealTaW5nYXBvcmWkdGVtcBg=
131 | ```
132 |
133 | ## Security Considerations
134 | > Not Applicable
135 |
136 | ## Copyright
137 |
138 | Copyright and related rights waived via <a href="https://creativecommons.org/publicdomain/zero/1.0/">CCO</a>.
139 |
```
--------------------------------------------------------------------------------
/packages/server/src/resources/knowledge/taxonomy/developer:docs:run-a-node:setup:types.md:
--------------------------------------------------------------------------------
```markdown
1 | title: Algorand node types
2 |
3 | The Algorand network is comprised of two distinct types of nodes, **relay nodes**, and **non-relay nodes**. Relay nodes are primarily used for communication routing to a set of connected non-relay nodes. Relay nodes communicate with other relay nodes and route blocks to all connected non-relay nodes. Non-relay nodes only connect to relay nodes and can also participate in consensus. Non-relay nodes may connect to several relay nodes but never connect to another non-relay node.
4 |
5 | In addition to the two node types, nodes can be configured to be [**archival**](#archival-mode). Archival nodes store the entire ledger, as opposed to the last 1000 blocks for non-archival blocks. Relay nodes are necessarily archival. Non-relay archival nodes are often used to feed an [**indexer**](../indexer/) that allows more advanced queries on the history of the blockchain.
6 |
7 | Finally, a node may either participate in consensus or not. Participation nodes do not need to be archival. In addition, to reduce attack surfaces and outage risks, it is strongly recommended that participation nodes are only used for the purpose in participating in consensus. In particular, participation nodes should not be relays.
8 |
9 | All node types use the same install procedure. To setup a node for a specific type, requires a few configuration parameter changes or operations as described below. The default install will set the node up as a non-relay non-archival non-participation mode.
10 |
11 | The table below is a summary of possible configurations:
12 |
13 | | Relay? | Archival? | Participation? | |
14 | |-|-|-|-|
15 | | relay | archival | participation | ❌ insecure / strongly discouraged |
16 | | relay | archival | non-participation | ✅ normal configuration for a **relay** |
17 | | relay | non-archival | * | ❌ impossible |
18 | | non-relay | archival | participation | ❓ discouraged, as participation nodes do not need to be archival and should only be used for participation, and not used for any other purpose |
19 | | non-relay | archival | non-participation | ✅ normal configuration for an **archival node**, often connected to an [**indexer**](../indexer/) |
20 | | non-relay | non-archival | participation | ✅ normal configuration for a **participation node** |
21 | | non-relay | non-archival | non-particiption | ✅ normal configuration for a node used to submit transactions to the blockchain and access current state (current balances, smart contract state, ...) but no historical state |
22 |
23 |
24 | # Which mode do I need?
25 |
26 | Here are some common use cases:
27 |
28 | * I want to participate in consensus and help secure the Algorand network.
29 | * ➥ non-relay non-archival participation node.
30 | * Note: I need to have some Algos for that purpose and I need to monitor my node 24/7 to ensure it is working properly.
31 | * I want to send transactions and read current state of smart contracts/applications:
32 | * ➥ non-relay non-archival non-participation node.
33 | * Example: a dApp website that does not use any historical information (past transaction/operation), a website displaying balances of a list of important accounts.
34 | * I want full access to historical data (blocks, transactions) with advanced querying:
35 | * ➥ non-relay archival non-participation node, together with an [**indexer**](../indexer/).
36 | * I want to get state proofs for any block:
37 | * ➥ non-relay archival non-participation node.
38 |
39 | # Participation Node
40 | How to install a node is described [here](../install/). Classifying a node as a participation node is not a configuration parameter but a dynamic operation where the node is hosting participation keys for one or more online accounts. This process is described in [Participate in Consensus](../participate/index.md). Technically both non-relay and relay nodes can participate in consensus, but Algorand recommends *only* non-relay nodes participate in consensus.
41 |
42 | !!! info
43 | Non-relay nodes do not have to participate in consensus. They still have access to the ledger and can be used with applications that need to connect to the network to submit transactions and read block data.
44 |
45 |
46 | # Archival Mode
47 |
48 | By default non-relay nodes only store a limited number of blocks (approximately up to the last 1000 blocks) locally. Older blocks are dropped from the local copy of the ledger. This reduces the disk space requirement of the node. These nodes can still participate in consensus and applications can connect to these nodes for transaction submission and reading block data. The primary drawback for this type of operation is that older block data will not be available.
49 |
50 | The archival property must be set to true to run in archival mode, which will then set the node to store the entire ledger.
51 |
52 | !!! warning
53 | Setting a node to run in archival mode on MainNet/TestNet/BetaNet will significantly increase the disk space requirements for the node. For example, in September 2023, a MainNet non-archival node uses around 20GB of storage, while an archival node requires approximately 2TB of storage.
54 |
55 |
56 | !!! info
57 | Relay nodes are always set to Archival mode. Non-relay nodes have the option to run in either configuration.
58 |
59 | # Relay Node
60 |
61 | A relay node uses the same software install as a non-relay node and only requires setting a few additional configuration parameters.
62 |
63 | A node is a valid relay node if two things are true:
64 |
65 | 1. The node is configured to accept incoming connections on a publicly-accessible port (4160 by convention on MainNet, and 4161 on TestNet, except if behind a proxy in which case port 80 is used.).
66 | 2. The node's public IP address (or a valid DNS name) and assigned port are registered in Algorand's SRV records for a specific network (MainNet/TestNet).
67 |
68 | Relay nodes are where other nodes connect. Therefore, a relay node must be able to support a large number of connections and handle the processing load associated with all the data flowing to and from these connections. Thus, relay nodes require significantly more power than non-relay nodes. Relay nodes are always configured in archival mode.
69 |
70 | Relay nodes also require very high egress bandwidth. In October 2022, MainNet relay nodes egress bandwidth is between 10TB to 30TB per month.
71 |
72 | See [Configuring Node as a Relay](../../reference/relay) for more information on setting up a relay.
73 |
74 |
75 |
76 |
77 |
78 |
```
--------------------------------------------------------------------------------
/packages/server/src/resources/knowledge/taxonomy/developer:docs:run-a-node:participate:generate_keys.md:
--------------------------------------------------------------------------------
```markdown
1 | title: Generate a participation key
2 |
3 | Algorand provides a set of keys for voting and proposing blocks separate from account spending keys. These are called **participation keys** (sometimes referred to as **partkeys**). At a high-level, participation keys are a specialized set of keys located on a single node. Once this participation key set is associated with an account, the account has the ability to participate in consensus.
4 |
5 | _[Read more about how Participation Keys function in the Algorand Consensus Protocol](../../../get-details/algorand_consensus#participation-keys)._
6 |
7 | !!! info "Important"
8 | - The account’s private spending key does not need to be on the node to generate a participation key. Technically, anyone can generate a participation key for a particular account, but only the private spending key of the account can authorize the transaction that would register the account to go online with a particular participation key. This distinction allows you to keep private keys in cold storage.
9 | - For security, the individual keys for each round are deleted from the key file as each round is completed. It is critical for the safety of the Algorand blockchain to avoid storing backups of participation key files that have been registered for an account.
10 | - The limit to the range you can specify for a partkey validity period is 2^24 - 1 (16,777,215). For security, it is recommended that the range does not exceed 3,000,000 rounds.
11 |
12 | # Generate the participation key with `goal`
13 |
14 | To generate a participation key, use the [`goal account addpartkey`](../../../clis/goal/account/addpartkey) command on the node where the participation key will reside. This command takes the address of the participating account, a range of rounds, and an optional key dilution parameter. It then generates a [VRF key pair](../../../get-details/algorand_consensus#verifiable-random-function) and, using optimizations, generates a set of single-round voting keys for each round of the range specified. The VRF private key is what is passed into the VRF to determine if you are selected to propose or vote on a block in any given round.
15 |
16 | === "goal"
17 | ```zsh
18 | $ goal account addpartkey -a <address-of-participating-account> --roundFirstValid=<partkey-first-round> --roundLastValid=<partkey-last-round>
19 | Participation key generation successful
20 | ```
21 |
22 | This creates a participation key on the node. You can use the `-o` flag to specify a different location in the case where you will eventually transfer your key to a different node to construct the keyreg transaction.
23 |
24 | !!! tip
25 | To optimize storage, the Key Dilution parameter defaults to the square root of the participation period length but this can be overridden with the flag `--keyDilution`. The Key Dilution determines how many ephemeral keys will be stored on an algorand node, as they are generated in batches. For example, if your participation period is set to 3,000,000 rounds, a batch of 1,732 ephemeral keys will be generated upfront, with additional batches getting generated after each set is used.
26 |
27 | # Add participation key
28 |
29 | If you chose to save the participation key and now want to add it to the server, you can use the following command to add the partkey file to the node.
30 |
31 | ```bash
32 | $ goal account installpartkey --partkey ALICE...VWXYZ.0.30000.partkey --delete-input
33 | ```
34 |
35 | # Check that the key exists
36 |
37 | The [`goal account listpartkeys`](../../../clis/goal/account/listpartkeys) command will check for any participation keys that live on the node and display pertinent information about them.
38 |
39 | === "goal"
40 | ```zsh
41 | $ goal account listpartkeys
42 | Registered Account ParticipationID Last Used First round Last round
43 | yes TUQ4...NLQQ GOWHR456... 27 0 3000000
44 | ```
45 |
46 |
47 | The output above is an example of `goal account listpartkeys` run from a particular node. It displays all partkeys and whether or not each key has been **registered**, the **filename** of the participation key, the **first** and **last** rounds of validity for the partkey, the **parent address** (i.e. the address of the participating account) and the **first key**. The first key refers to the key batch and the index in that batch (`<key-batch>.<index>`) of the latest key that has not been deleted. This is useful in verifying that your node is participating (i.e. the batch should continue to increment as keys are deleted). It can also help ensure that you don't store extra copies of registered participation keys that have past round keys intact.
48 |
49 |
50 | !!! warning
51 | It is okay to have multiple participation keys on a single node. However, if you generate multiple participation keys for the same account with overlapping rounds make sure you are aware of which one is the active one. It is recommended that you only keep one key per account - the active one - _except_ during partkey renewal when you switch from the old key to the new key. Renewing participation keys is discussed in detail in the [Renew Participation Keys](./renew.md) section.
52 |
53 | # View participation key info
54 |
55 | Use [`goal account partkeyinfo`](../../../clis/goal/account/partkeyinfo) to dump all the information about each participation key that lives on the node. This information is used to generate the online key registration transaction [described in the next section](./online.md).
56 |
57 | === "goal"
58 | ```zsh
59 | $ goal account partkeyinfo
60 | Dumping participation key info from /opt/data...
61 |
62 | Participation ID: GOWHR456IK3LPU5KIJ66CRDLZM55MYV2OGNW7QTZYF5RNZEVS33A
63 | Parent address: TUQ4HOIR3G5Z3BZUN2W2XTWVJ3AUUME4OKLINJFAGKBO4Y76L4UT5WNLQQ
64 | Last vote round: 11
65 | Last block proposal round: 12
66 | Effective first round: 1
67 | Effective last round: 3000000
68 | First round: 0
69 | Last round: 3000000
70 | Key dilution: 10000
71 | Selection key: l6MsaTt7AiCAdG+69LG/wjaprsI1vImZuGN6gQ1jS88=
72 | Voting key: Rleu99r3UqlwuuhaxCTrTQUuq1C9qk5uJd2WQQEG+6U=
73 | ```
74 |
75 |
76 | Above is the example output from a particular node. Use these values to create the [key registration transaction](../../../get-details/transactions#register-account-online) that will place the account online.
77 |
```
--------------------------------------------------------------------------------
/packages/server/src/resources/knowledge/taxonomy/ARCs:specs:arc-0035.md:
--------------------------------------------------------------------------------
```markdown
1 | ---
2 | arc: 35
3 | title: Algorand Offline Wallet Backup Protocol
4 | description: Wallet-agnostic backup protocol for multiple accounts
5 | author: Yigit Guler (@yigitguler)
6 | discussions-to: https://github.com/algorandfoundation/ARCs/issues/156
7 | status: Final
8 | type: Standards Track
9 | category: Interface
10 | sub-category: Wallet
11 | created: 2023-01-03
12 | ---
13 | # Algorand Secure Offline Wallet Backup Protocol
14 |
15 |
16 | ## Abstract
17 | This document outlines the high-level requirements for a wallet-agnostic backup protocol that can be used across all wallets on the Algorand ecosystem.
18 |
19 | ## Specification
20 | 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>.
21 |
22 | ### Requirements
23 | At a high-level, offline wallet backup protocol has the following requirements:
24 |
25 | * Wallet applications should allow backing up and storing multiple accounts at the same time.
26 | Account information should be encrypted with a user-defined secret key, utilizing NaCl SecretBox method (audited and endorsed by Algorand).
27 |
28 | * Encrypted final string should be easily copyable to be stored digitally.
29 | When importing, wallet applications should be able to detect already imported accounts and gracefully ignore them.
30 |
31 | ### Format
32 |
33 | Before encryption, account information should be converted to the following JSON format:
34 |
35 | ```
36 | {
37 | "device_id": "UNIQUE IDENTIFIER FOR DEVICE (OPTIONAL)",
38 | "provider_name": "PROVIDER NAME (OPTIONAL, i.e. Pera Wallet)",
39 | "accounts": [
40 | {
41 | "address": "ACCOUNT PUBLIC ADDRESS (REQUIRED)",
42 | "name": "USER DEFINED ACCOUNT NAME (OPTIONAL)",
43 | "account_type": "TYPE OF ACCOUNT: single, multisig, watch, contact, ledger (REQUIRED)",
44 | "private_key": "PRIVATE KEY AS BASE64 ENCODING OF 64 BYTE ALGORAND PRIVATE KEY as encoded by algosdk (NOT PASSPHRASE, REQUIRED for user-owned accounts, can be omitted in case of watch, contact, multisig, ledger accounts)",
45 | "metadata": "ANY ADDITIONAL CONTENT (OPTIONAL)",
46 | "multisig": "Multisig information (only required if the account_type is multisig)",
47 | "ledger": {
48 | "device_id": "device id",
49 | "index": <index of the account on device, integer>,
50 | "connection_type": "bluetooth|usb"
51 | },
52 | },
53 | ...
54 | ]
55 | }
56 | ```
57 |
58 | *Clients must accept additional fields in the JSON document.*
59 |
60 | Here is an example with a single account:
61 |
62 | ```
63 | {
64 | "device_id": "2498232091970170817",
65 | "provider_name": "Pera Wallet",
66 | "accounts": [
67 | {
68 | "address": "ELWRE6HZ7KIUT46EQ6PBISGD3ND6QSCBVWICYR2QR2Y7LOBRZRCAIKLWDE",
69 | "name": "My NFT Account",
70 | "account_type": "single",
71 | "private_key": "w0HG2VH7tAYz9PD4SYX0flC4CKh1OONCB6U5bP7cXGci7RJ4+fqRSfPEh54USMPbR+hIQa2QLEdQjrH1uDHMRA=="
72 | }
73 | ],
74 | }
75 | ```
76 |
77 | Here is an example with a single multi-sig account:
78 |
79 | ```
80 | {
81 | "device_id": "2498232091970170817",
82 | "provider_name": "Pera Wallet",
83 | "accounts": [
84 | {
85 | "address": "ELWRE6HZ7KIUT46EQ6PBISGD3ND6QSCBVWICYR2QR2Y7LOBRZRCAIKLWDE",
86 | "name": "Our Multisig Account",
87 | "account_type": "multisig",
88 | "multisig": {
89 | version: 1,
90 | threshold: 2,
91 | addrs: [
92 | account1.addr,
93 | account2.addr,
94 | account3.addr,
95 | ],
96 | },
97 | }
98 | ],
99 | }
100 | ```
101 |
102 | ### Encryption
103 |
104 | Once the input JSON is ready, as specified above, it needs to be encrypted. Even if it is assumed that the user is going to store this information in a secure location, copy-pasting it without encryption is not secure since multiple applications can access the clipboard.
105 |
106 | The information needs to be encrypted using a very long passphrase. 12 words mnemonic will be used as the key. 12-word mnemonic is secure and it will not create confusion with the 25-word mnemonics that are used to encrypt accounts.
107 |
108 | The wallet applications should not allow users to copy the 12-word mnemonic nor allow taking screenshots. The users should note it visually.
109 |
110 | The encryption should be made as follows:
111 |
112 | 1. The wallet generates a random 16-byte string S (using a cryptographically secure random number generator)
113 | 2. The wallet derives a 32-byte key: `key = HMAC-SHA256(key="Algorand export 1.0", input=S)`
114 | On libsodium, use https://libsodium.gitbook.io/doc/advanced/hmac-sha2#hmac-sha-256,
115 | `crypto_auth_hmacsha256_init` / `crypto_auth_hmacsha256_update` / `crypto_auth_hmacsha256_final`
116 | 3. The wallet encrypts the input JSON using `crypto_secretbox_easy` from libsodium (https://libsodium.gitbook.io/doc/secret-key_cryptography/secretbox)
117 | 4. The wallet outputs the following output JSON:
118 |
119 | ```
120 | {
121 | "version": "1.0",
122 | "suite": "HMAC-SHA256:sodium_secretbox_easy",
123 | "ciphertext": <base64 of the ciphertext>
124 | }
125 | ```
126 |
127 | This JSON document (will be referred as ciphertext envelope JSON) needs to be encoded with base64 again in order to make it easier to copy-paste & store.
128 |
129 | 5. S is encoded as a 12-word mnemonic (according to BIP-39) and displayed to the user.
130 |
131 | The user will be responsible for keeping the 12-word mnemonic and the base64 output of the ciphertext envelope JSON in safe locations. Note that step 5 is the default approach, however, the wallets can support other methods other than mnemonics as well, as long as they are secure.
132 |
133 |
134 | ### Importing
135 | When importing, wallet applications should ask the user for the base64 output of the envelope JSON and the 12-word mnemonic. After getting these values, it should attempt to decrypt the encrypted string using the 12-word mnemonic. On successful decryption, accounts that can be imported can be processed.
136 |
137 | ## Rationale
138 | There are many benefits to having an openly documented format:
139 |
140 | * Better interoperability across wallets, allowing users to use multiple wallets easily by importing all of their accounts using a single format.
141 |
142 | * Easy and secure backup of all wallet data at a user-defined location, including secure storage in digital environments.
143 |
144 | * Ability to transfer data from device to device securely, such as when moving data from one mobile device to another.
145 |
146 |
147 | ## Security Considerations
148 | Tbd
149 |
150 | ## Copyright
151 | Copyright and related rights waived via <a href="https://creativecommons.org/publicdomain/zero/1.0/">CCO</a>.
152 |
```
--------------------------------------------------------------------------------
/packages/server/src/resources/knowledge/developers-clis.txt:
--------------------------------------------------------------------------------
```
1 | developer:docs:clis:kmd.md
2 | developer:docs:clis:conduit:conduit.md
3 | developer:docs:clis:conduit:init.md
4 | developer:docs:clis:conduit:list:exporters.md
5 | developer:docs:clis:conduit:list:processors.md
6 | developer:docs:clis:conduit:list:list.md
7 | developer:docs:clis:conduit:list:importers.md
8 | developer:docs:clis:tealdbg:debug.md
9 | developer:docs:clis:tealdbg:tealdbg.md
10 | developer:docs:clis:tealdbg:remote.md
11 | developer:docs:clis:diagcfg:diagcfg.md
12 | developer:docs:clis:diagcfg:telemetry:endpoint.md
13 | developer:docs:clis:diagcfg:telemetry:disable.md
14 | developer:docs:clis:diagcfg:telemetry:status.md
15 | developer:docs:clis:diagcfg:telemetry:name.md
16 | developer:docs:clis:diagcfg:telemetry:enable.md
17 | developer:docs:clis:diagcfg:telemetry:telemetry.md
18 | developer:docs:clis:diagcfg:metric:metric.md
19 | developer:docs:clis:diagcfg:metric:disable.md
20 | developer:docs:clis:diagcfg:metric:status.md
21 | developer:docs:clis:diagcfg:metric:enable.md
22 | developer:docs:clis:algokey:multisig:append-auth-addr.md
23 | developer:docs:clis:algokey:multisig:multisig.md
24 | developer:docs:clis:algokey:sign.md
25 | developer:docs:clis:algokey:generate.md
26 | developer:docs:clis:algokey:algokey.md
27 | developer:docs:clis:algokey:import.md
28 | developer:docs:clis:algokey:part:reparent.md
29 | developer:docs:clis:algokey:part:part.md
30 | developer:docs:clis:algokey:part:info.md
31 | developer:docs:clis:algokey:part:generate.md
32 | developer:docs:clis:algokey:part:keyreg.md
33 | developer:docs:clis:algokey:export.md
34 | developer:docs:clis:indexer:indexer.md
35 | developer:docs:clis:indexer:api-config.md
36 | developer:docs:clis:indexer:util:validator.md
37 | developer:docs:clis:indexer:util:util.md
38 | developer:docs:clis:indexer:daemon.md
39 | developer:docs:clis:goal:license.md
40 | developer:docs:clis:goal:ledger:supply.md
41 | developer:docs:clis:goal:ledger:block.md
42 | developer:docs:clis:goal:ledger:ledger.md
43 | developer:docs:clis:goal:app:method.md
44 | developer:docs:clis:goal:app:app.md
45 | developer:docs:clis:goal:app:closeout.md
46 | developer:docs:clis:goal:app:box:info.md
47 | developer:docs:clis:goal:app:box:list.md
48 | developer:docs:clis:goal:app:box:box.md
49 | developer:docs:clis:goal:app:read.md
50 | developer:docs:clis:goal:app:info.md
51 | developer:docs:clis:goal:app:call.md
52 | developer:docs:clis:goal:app:clear.md
53 | developer:docs:clis:goal:app:create.md
54 | developer:docs:clis:goal:app:delete.md
55 | developer:docs:clis:goal:app:update.md
56 | developer:docs:clis:goal:app:optin.md
57 | developer:docs:clis:goal:app:interact:interact.md
58 | developer:docs:clis:goal:app:interact:query.md
59 | developer:docs:clis:goal:app:interact:execute.md
60 | developer:docs:clis:goal:asset:freeze.md
61 | developer:docs:clis:goal:asset:info.md
62 | developer:docs:clis:goal:asset:config.md
63 | developer:docs:clis:goal:asset:asset.md
64 | developer:docs:clis:goal:asset:destroy.md
65 | developer:docs:clis:goal:asset:create.md
66 | developer:docs:clis:goal:asset:optin.md
67 | developer:docs:clis:goal:asset:send.md
68 | developer:docs:clis:goal:report.md
69 | developer:docs:clis:goal:network:network.md
70 | developer:docs:clis:goal:network:pregen.md
71 | developer:docs:clis:goal:network:restart.md
72 | developer:docs:clis:goal:network:status.md
73 | developer:docs:clis:goal:network:create.md
74 | developer:docs:clis:goal:network:delete.md
75 | developer:docs:clis:goal:network:start.md
76 | developer:docs:clis:goal:network:stop.md
77 | developer:docs:clis:goal:goal.md
78 | developer:docs:clis:goal:completion:completion.md
79 | developer:docs:clis:goal:completion:zsh.md
80 | developer:docs:clis:goal:completion:bash.md
81 | developer:docs:clis:goal:kmd:kmd.md
82 | developer:docs:clis:goal:kmd:start.md
83 | developer:docs:clis:goal:kmd:stop.md
84 | developer:docs:clis:goal:version.md
85 | developer:docs:clis:goal:wallet:new.md
86 | developer:docs:clis:goal:wallet:wallet.md
87 | developer:docs:clis:goal:wallet:list.md
88 | developer:docs:clis:goal:node:generatetoken.md
89 | developer:docs:clis:goal:node:pendingtxns.md
90 | developer:docs:clis:goal:node:restart.md
91 | developer:docs:clis:goal:node:clone.md
92 | developer:docs:clis:goal:node:status.md
93 | developer:docs:clis:goal:node:generate-p2pid.md
94 | developer:docs:clis:goal:node:node.md
95 | developer:docs:clis:goal:node:lastround.md
96 | developer:docs:clis:goal:node:create.md
97 | developer:docs:clis:goal:node:catchup.md
98 | developer:docs:clis:goal:node:start.md
99 | developer:docs:clis:goal:node:wait.md
100 | developer:docs:clis:goal:node:stop.md
101 | developer:docs:clis:goal:account:assetdetails.md
102 | developer:docs:clis:goal:account:rewards.md
103 | developer:docs:clis:goal:account:new.md
104 | developer:docs:clis:goal:account:dump.md
105 | developer:docs:clis:goal:account:addpartkey.md
106 | developer:docs:clis:goal:account:importrootkey.md
107 | developer:docs:clis:goal:account:listpartkeys.md
108 | developer:docs:clis:goal:account:balance.md
109 | developer:docs:clis:goal:account:account.md
110 | developer:docs:clis:goal:account:multisig:new.md
111 | developer:docs:clis:goal:account:multisig:info.md
112 | developer:docs:clis:goal:account:multisig:delete.md
113 | developer:docs:clis:goal:account:multisig:multisig.md
114 | developer:docs:clis:goal:account:renewpartkey.md
115 | developer:docs:clis:goal:account:info.md
116 | developer:docs:clis:goal:account:installpartkey.md
117 | developer:docs:clis:goal:account:list.md
118 | developer:docs:clis:goal:account:renewallpartkeys.md
119 | developer:docs:clis:goal:account:marknonparticipating.md
120 | developer:docs:clis:goal:account:rename.md
121 | developer:docs:clis:goal:account:partkeyinfo.md
122 | developer:docs:clis:goal:account:import.md
123 | developer:docs:clis:goal:account:delete.md
124 | developer:docs:clis:goal:account:changeonlinestatus.md
125 | developer:docs:clis:goal:account:export.md
126 | developer:docs:clis:goal:account:deletepartkey.md
127 | developer:docs:clis:goal:clerk:compile.md
128 | developer:docs:clis:goal:clerk:group.md
129 | developer:docs:clis:goal:clerk:inspect.md
130 | developer:docs:clis:goal:clerk:split.md
131 | developer:docs:clis:goal:clerk:rawsend.md
132 | developer:docs:clis:goal:clerk:dryrun.md
133 | developer:docs:clis:goal:clerk:multisig:sign.md
134 | developer:docs:clis:goal:clerk:multisig:merge.md
135 | developer:docs:clis:goal:clerk:multisig:signprogram.md
136 | developer:docs:clis:goal:clerk:multisig:multisig.md
137 | developer:docs:clis:goal:clerk:tealsign.md
138 | developer:docs:clis:goal:clerk:dryrun-remote.md
139 | developer:docs:clis:goal:clerk:sign.md
140 | developer:docs:clis:goal:clerk:clerk.md
141 | developer:docs:clis:goal:clerk:send.md
142 | developer:docs:clis:goal:clerk:simulate.md
143 | developer:docs:clis:goal:logging:disable.md
144 | developer:docs:clis:goal:logging:enable.md
145 | developer:docs:clis:goal:logging:logging.md
146 | developer:docs:clis:goal:logging:send.md
147 | developer:docs:clis:goal:protocols.md
```
--------------------------------------------------------------------------------
/packages/server/src/resources/knowledge/taxonomy/developer:docs:details:crust.md:
--------------------------------------------------------------------------------
```markdown
1 | title: IPFS Pinning With Crust
2 |
3 | ## IPFS
4 | Algorand offers [various ways to store data in contracts](../dapps/smart-contracts/apps/state/), but there are still many use cases where storing the data off-chain makes more sense. This is paticularly true when the data is large and not used directly on-chain (for example, NFT metadata and images). A common solution for off-chain data storage is the InterPlanetary File System (IPFS) protocol. In short, IPFS is a peer-to-peer file sharing protocol. For more information on IPFS, see https://docs.ipfs.tech/concepts/faq/.
5 |
6 | In order to share files via IPFS, one must pin a file on the network. Pinning a file means assigning it a unique Content Identifier (CID) and making it availible to download. It is common for developers to use a pinning service like Pinata, web3.storage, or nft.storage. While these services do indeed pin the file on IPFS, they are still using centralized servers to do so. This means those using these services are dependend on them to keep running them and are locked into their pricing model.
7 |
8 |
9 | ## Crust
10 |
11 | To avoid using centralized services for IPFS pinning, Algorand developers can use the Crust network. Crust is a decentralized pinning service where users can pay the network to pin a file and that file will be pinned on many servers around the world. The pricing model is set by the node runners, rather than a single entity. For more information on Crust, see https://crust.network/faq/.
12 |
13 | ## Crust and Algorand
14 |
15 | Crust is easier than ever to use for Algorand developers because you can pay for storage via ABI method calls to the Crust contracts deployed on testnet and mainnet.
16 |
17 | ### Deployments
18 | Testnet storage contract application ID: [507867511](https://testnet.explorer.perawallet.app/application/507867511/)
19 |
20 | Mainnet storage contract application ID: [1275319623](https://explorer.perawallet.app/application/1275319623/)
21 |
22 |
23 | ### Usage
24 |
25 | The easiest way to use the Crust storage contract is to use the ARC32 `application.json` that was generated by the beaker contract. The JSON and full source can be found at https://github.com/crustio/algorand-storage-contract.
26 |
27 | The general process is:
28 |
29 | 1. Build web3 authentication header
30 | 2. Upload files to IPFS
31 | 3. Get storage price
32 | 4. Place storage order
33 |
34 | #### Building Header
35 |
36 | ```ts
37 | /**
38 | * Generate a web3 auth header from an Algorand account
39 | */
40 | function getAuthHeader(account: algosdk.Account) {
41 | const sk32 = account.sk.slice(0, 32)
42 | const signingKey = nacl.sign.keyPair.fromSeed(sk32)
43 |
44 | const signature = nacl.sign(Buffer.from(account.addr), signingKey.secretKey)
45 | const sigHex = Buffer.from(signature).toString('hex').slice(0, 128)
46 | const authStr = `sub-${account.addr}:0x${sigHex}`
47 |
48 | return Buffer.from(authStr).toString('base64')
49 | }
50 | ```
51 |
52 | #### Upload to IPFS
53 |
54 | ```ts
55 | /**
56 | * upload a file to IPFS and get its CID and size
57 | *
58 | * @param account Account to use to generate the auth header
59 | */
60 | async function uploadToIPFS(account: algosdk.Account) {
61 | // Note: Not all gateways require this header
62 | const headers = {
63 | "Authorization": `Basic ${getAuthHeader(account)}`
64 | }
65 |
66 | // list of API hosts
67 | // https://github.com/crustio/crust-apps/blob/master/packages/apps-config/src/ipfs-gateway-endpoints/index.ts
68 | const apiEndpoint = 'https://gw-seattle.crustcloud.io:443/api/v0/add'
69 |
70 | // If you're in browser, you should be able to just use a file directly
71 | const formData = new FormData();
72 | formData.append('README.md', fs.createReadStream('./README.md'));
73 |
74 |
75 | const res = await axios.post(apiEndpoint, formData, {
76 | headers: {
77 | ...headers,
78 | // formData.getHeaders() is only required if you're using nodejs
79 | ...formData.getHeaders()
80 | }
81 | });
82 |
83 | const json: { Hash: string, Size: number } = await res.data
84 |
85 | return { cid: json.Hash, size: Number(json.Size) }
86 | }
87 | ```
88 |
89 | #### Get Storage Price
90 |
91 | ```ts
92 | /**
93 | * Gets the required price to store a file of a given size
94 | *
95 | * @param algod Algod client to use to simulate the ABI method call
96 | * @param appClient App client to use to compose the ABI method call
97 | * @param size Size of the file
98 | * @param isPermanent Whether the file should be added to the renewal pool
99 | * @returns Price, in uALGO, to store the file
100 | */
101 | async function getPrice(algod: algosdk.Algodv2, appClient: StorageOrderClient, size: number, isPermanent: boolean = false) {
102 | const result = await (await appClient.compose().getPrice({ size, is_permanent: isPermanent }).atc()).simulate(algod)
103 |
104 | return result.methodResults[0].returnValue?.valueOf() as number
105 | }
106 | ```
107 |
108 | #### Place Order
109 |
110 | ```ts
111 | /**
112 | * Uses simulate to get a random order node from the storage contract
113 | *
114 | * @param algod Algod client to use to simulate the ABI method call
115 | * @param appClient The app client to use to compose the ABI method call
116 | * @returns Address of the order node
117 | */
118 | async function getOrderNode(algod: algosdk.Algodv2, appClient: StorageOrderClient) {
119 | return (await (await appClient.compose().getRandomOrderNode({}, { boxes: [new Uint8Array(Buffer.from('nodes'))] }).atc()).simulate(algod)).methodResults[0].returnValue?.valueOf() as string
120 | }
121 |
122 | /**
123 | * Places a storage order for a CID
124 | *
125 | * @param algod Algod client used to get transaction params
126 | * @param appClient App client used to call the storage app
127 | * @param account Account used to send the transactions
128 | * @param cid CID of the file
129 | * @param size Size of the file
130 | * @param price Price, in uALGO, to store the file
131 | * @param isPermanent Whether the file should be added to the renewal pool
132 | */
133 | async function placeOrder(
134 | algod: algosdk.Algodv2,
135 | appClient: StorageOrderClient,
136 | account: algosdk.Account,
137 | cid: string,
138 | size: number,
139 | price: number,
140 | isPermanent: boolean
141 | ) {
142 | const merchant = await getOrderNode(algod, appClient)
143 | const seed = algosdk.makePaymentTxnWithSuggestedParamsFromObject({
144 | from: account.addr,
145 | to: (await appClient.appClient.getAppReference()).appAddress,
146 | amount: price,
147 | suggestedParams: await algod.getTransactionParams().do(),
148 | });
149 |
150 | appClient.placeOrder({ seed, cid, size, is_permanent: isPermanent, merchant })
151 | }
152 | ```
153 |
154 | #### Full Examples
155 |
156 | To see the full scripts that use the above functions go to https://github.com/algorand-devrel/crust-examples
157 |
```
--------------------------------------------------------------------------------
/packages/server/src/resources/knowledge/taxonomy/puya:docs:lg-calling-apps.md:
--------------------------------------------------------------------------------
```markdown
1 | # Calling other applications
2 |
3 | The preferred way to call other smart contracts is using [`algopy.arc4.abi_call`](#algopyarc4abi_call), [`algopy.arc4.arc4_create`](#algopyarc4arc4_create) or
4 | [`algopy.arc4.arc4_update`](#algopyarc4arc4_update). These methods support type checking and encoding of arguments, decoding of results, group transactions,
5 | and in the case of `arc4_create` and `arc4_update` automatic inclusion of approval and clear state programs.
6 |
7 | ## `algopy.arc4.abi_call`
8 |
9 | [`algopy.arc4.abi_call`](#algopy.arc4.abi_call) can be used to call other ARC4 contracts, the first argument should refer to
10 | an ARC4 method either by referencing an Algorand Python [`algopy.arc4.ARC4Contract`](#algopy.arc4.ARC4Contract) method,
11 | an [`algopy.arc4.ARC4Client`](#algopy.arc4.ARC4Client) method generated from an ARC-32 app spec, or a string representing
12 | the ARC4 method signature or name.
13 | The following arguments should then be the arguments required for the call, these arguments will be type checked and converted where appropriate.
14 | Any other related transaction parameters such as `app_id`, `fee` etc. can also be provided as keyword arguments.
15 |
16 | If the ARC4 method returns an ARC4 result then the result will be a tuple of the ARC4 result and the inner transaction.
17 | If the ARC4 method does not return a result, or if the result type is not fully qualified then just the inner transaction is returned.
18 |
19 | ```python
20 | from algopy import Application, ARC4Contract, String, arc4, subroutine
21 |
22 | class HelloWorld(ARC4Contract):
23 |
24 | @arc4.abimethod()
25 | def greet(self, name: String) -> String:
26 | return "Hello " + name
27 |
28 | @subroutine
29 | def call_existing_application(app: Application) -> None:
30 | greeting, greet_txn = arc4.abi_call(HelloWorld.greet, "there", app_id=app)
31 |
32 | assert greeting == "Hello there"
33 | assert greet_txn.app_id == 1234
34 | ```
35 |
36 |
37 | ### Alternative ways to use `arc4.abi_call`
38 |
39 | #### ARC4Client method
40 |
41 | A ARC4Client client represents the ARC4 abimethods of a smart contract and can be used to call abimethods in a type safe way
42 |
43 | ARC4Client's can be produced by using `puyapy --output-client=True` when compiling a smart contract
44 | (this would be useful if you wanted to publish a client for consumption by other smart contracts)
45 | An ARC4Client can also be be generated from an ARC-32 application.json using `puyapy-clientgen`
46 | e.g. `puyapy-clientgen examples/hello_world_arc4/out/HelloWorldContract.arc32.json`, this would be
47 | the recommended approach for calling another smart contract that is not written in Algorand Python or does not provide the source
48 |
49 | ```python
50 | from algopy import arc4, subroutine
51 |
52 | class HelloWorldClient(arc4.ARC4Client):
53 |
54 | def hello(self, name: arc4.String) -> arc4.String: ...
55 |
56 | @subroutine
57 | def call_another_contract() -> None:
58 | # can reference another algopy contract method
59 | result, txn = arc4.abi_call(HelloWorldClient.hello, arc4.String("World"), app=...)
60 | assert result == "Hello, World"
61 | ```
62 |
63 | #### Method signature or name
64 |
65 | An ARC4 method selector can be used e.g. `"hello(string)string` along with a type index to specify the return type.
66 | Additionally just a name can be provided and the method signature will be inferred e.g.
67 |
68 | ```python
69 | from algopy import arc4, subroutine
70 |
71 |
72 | @subroutine
73 | def call_another_contract() -> None:
74 | # can reference a method selector
75 | result, txn = arc4.abi_call[arc4.String]("hello(string)string", arc4.String("Algo"), app=...)
76 | assert result == "Hello, Algo"
77 |
78 | # can reference a method name, the method selector is inferred from arguments and return type
79 | result, txn = arc4.abi_call[arc4.String]("hello", "There", app=...)
80 | assert result == "Hello, There"
81 | ```
82 |
83 |
84 | ## `algopy.arc4.arc4_create`
85 |
86 | [`algopy.arc4.arc4_create`](#algopy.arc4.arc4_create) can be used to create ARC4 applications, and will automatically populate required fields for app creation (such as approval program, clear state program, and global/local state allocation).
87 |
88 | Like [`algopy.arc4.abi_call`](lg-transactions.md#arc4-application-calls) it handles ARC4 arguments and provides ARC4 return values.
89 |
90 | If the compiled programs and state allocation fields need to be customized (for example due to [template variables](#within-other-contracts)),
91 | this can be done by passing a [`algopy.CompiledContract`](#algopy.CompiledContract) via the `compiled` keyword argument.
92 |
93 | ```python
94 | from algopy import ARC4Contract, String, arc4, subroutine
95 |
96 | class HelloWorld(ARC4Contract):
97 |
98 | @arc4.abimethod()
99 | def greet(self, name: String) -> String:
100 | return "Hello " + name
101 |
102 | @subroutine
103 | def create_new_application() -> None:
104 | hello_world_app = arc4.arc4_create(HelloWorld).created_app
105 |
106 | greeting, _txn = arc4.abi_call(HelloWorld.greet, "there", app_id=hello_world_app)
107 |
108 | assert greeting == "Hello there"
109 | ```
110 |
111 | ## `algopy.arc4.arc4_update`
112 |
113 | [`algopy.arc4.arc4_update`](#algopy.arc4.arc4_update) is used to update an existing ARC4 application and will automatically populate the required approval and clear state program fields.
114 |
115 | Like [`algopy.arc4.abi_call`](lg-transactions.md#arc4-application-calls) it handles ARC4 arguments and provides ARC4 return values.
116 |
117 | If the compiled programs need to be customized (for example due to (for example due to [template variables](#within-other-contracts)),
118 | this can be done by passing a [`algopy.CompiledContract`](#algopy.CompiledContract) via the `compiled` keyword argument.
119 |
120 | ```python
121 | from algopy import Application, ARC4Contract, String, arc4, subroutine
122 |
123 | class NewApp(ARC4Contract):
124 |
125 | @arc4.abimethod()
126 | def greet(self, name: String) -> String:
127 | return "Hello " + name
128 |
129 | @subroutine
130 | def update_existing_application(existing_app: Application) -> None:
131 | hello_world_app = arc4.arc4_update(NewApp, app_id=existing_app)
132 |
133 | greeting, _txn = arc4.abi_call(NewApp.greet, "there", app_id=hello_world_app)
134 |
135 | assert greeting == "Hello there"
136 | ```
137 |
138 | ## Using `itxn.ApplicationCall`
139 |
140 | If the application being called is not an ARC4 contract, or an application specification is not available,
141 | then [`algopy.itxn.ApplicationCall`](#algopy.itxn.ApplicationCall) can be used. This approach is generally more verbose
142 | than the above approaches, so should only be used if required. See [here](./lg-transactions.md#create-an-arc4-application-and-then-call-it) for an example
143 |
```
--------------------------------------------------------------------------------
/packages/server/src/resources/knowledge/taxonomy/ARCs:specs:arc-0007.md:
--------------------------------------------------------------------------------
```markdown
1 | ---
2 | arc: 7
3 | title: Algorand Wallet Post Transactions API
4 | description: API function to Post Signed Transactions to the network.
5 | author: DanBurton (@DanBurton)
6 | discussions-to: https://github.com/algorandfoundation/ARCs/issues/52
7 | status: Deprecated
8 | type: Standards Track
9 | category: Interface
10 | created: 2021-08-09
11 | ---
12 |
13 | # Algorand Wallet Post Transactions API
14 |
15 | ## Abstract
16 |
17 | A function, `postTxns`, which accepts an array of `SignedTransaction`s, and posts them to the network.
18 |
19 | ## Specification
20 |
21 | 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>.
22 |
23 | > Comments like this are non-normative.
24 |
25 | This ARC uses interchangeably the terms "throw an error" and "reject a promise with an error".
26 |
27 | ### Interface `PostTxnsFunction`
28 |
29 | ```ts
30 | export type TxnID = string;
31 | export type SignedTxnStr = string;
32 |
33 | export type PostTxnsFunction = (
34 | stxns: SignedTxnStr[],
35 | ) => Promise<PostTxnsResult>;
36 |
37 | export interface PostTxnsResult {
38 | txnIDs: TxnID[];
39 | }
40 |
41 | export interface PostTxnsError extends Error {
42 | code: number;
43 | data?: any;
44 | successTxnIDs: (TxnID | null)[];
45 | }
46 | ```
47 |
48 | A `PostTxnsFunction` with input argument `stxns:string[]` and promised return value `ret:PostTxnsResult`:
49 | * expects `stxns` to be in the correct string format as specified by `SignedTxnStr` (defined below).
50 | * **MUST**, if successful, return an object `ret` such that `ret.txID` is in the correct string format as specified by `TxID`.
51 |
52 | > The use of `txID` instead of `txnID` is to follow the standard name for the transaction ID.
53 |
54 | ### String specification: `SignedTxnStr`
55 |
56 | Defined as in [ARC-0001](./arc-0001.md#interface-signedtxnstr):
57 |
58 | > [`SignedTxnStr` is] the base64 encoding of the canonical msgpack encoding of the `SignedTxn` corresponding object, as defined in the <a href="https://github.com/algorandfoundation/specs">Algorand specs</a>.
59 |
60 | ### String specification: `TxnID`
61 |
62 | A `TxnID` is a 52-character base32 string (without padding) corresponding to a 32-byte string.
63 | For example: `H2KKVITXKWL2VBZBWNHSYNU3DBLYBXQAVPFPXBCJ6ZZDVXQPSRTQ`.
64 |
65 | ### Error standard
66 |
67 | `PostTxnsError` follows the same rules as `SignTxnsError` from [ARC-0001](./arc-0001.md#error-interface-signtxnserror) and uses the same status codes as well as the following status codes:
68 |
69 |
70 | | Status Code | Name | Description |
71 | | ----------- | ---- | ----------- |
72 | | 4400 | Failure Sending Some Transactions | Some transactions were not sent properly. |
73 |
74 | ### Semantic requirements
75 |
76 | Regarding a call to `postTxns(stxns)` with promised return value `ret`:
77 |
78 | * `postTxns` **MAY** assume that `stxns` is an array of valid `SignedTxnStr` strings that represent correctly signed transactions such that:
79 | * Either all transaction belong to the same group of transactions and are in the correct order. In other words, either `stxns` is an array of a single transaction with a zero group ID (`txn.Group`), or `stxns` is an array of one or more transactions with the *same* non-zero group ID. The function **MUST** reject if the transactions do not match their group ID. (The caller must provide the transactions in the order defined by the group ID.)
80 | >An early draft of this ARC required that the size of a group of transactions must be greater than 1 but, since the Algorand protocol supports groups of size 1, this requirement had been changed so dApps don't have to have special cases for single transactions and can always send a group to the wallet.
81 | * Or `stxns` is a concatenation of arrays satisfying the above.
82 | * `postTxns` **MUST** attempt to post all transactions together. With the `algod` v2 API, this implies splitting the transactions into groups and making an API call per transaction group. `postTxns` **SHOULD NOT** wait after each transaction group but post all of them without pause in-between.
83 | * `postTxns` **MAY** ask the user whether they approve posting those transactions.
84 | > A dApp can always post transactions itself without the help of `postTxns` when a public network is used.
85 | > However, when a private network is used, a dApp may need `postTxns`, and in this case, asking the user's approval can make sense.
86 | > Another such use case is when the user uses a specific trusted node that has some legal restrictions.
87 | * `postTxns` **MUST** wait for confirmation that the transactions are finalized.
88 | > TODO: Decide whether to add an optional flag to not wait for that.
89 | * If successful, `postTxns` **MUST** resolve the returned promise with the list of transaction IDs `txnIDs` of the posted transactions `stxn`.
90 | * If unsuccessful, `postTxns` **MUST** reject the promise with an error `err` of type `PostTxnsError` such that:
91 | * `err.code=4400` if there was a failure sending the transactions or a code as specified in [ARC-0001](./arc-0001.md#error-standards) if the user or function disallowed posting the transactions.
92 | * `err.message` **SHOULD** describe what went wrong in as much detail as possible.
93 | * `err.successTxnIDs` **MUST** be an array such that `err.successTxnID[i]` is the transaction ID of `stxns[i]` if `stxns[i]` was successfully committed to the blockchain, and `null` otherwise.
94 |
95 | ### Security considerations
96 |
97 | In case the wallet uses an API service that is secret or provided by the user, the wallet **MUST** ensure that the URL of the service and the potential tokens/headers are not leaked to the dApp.
98 |
99 | > Leakage may happen by accidentally including too much information in responses or errors returned by the various methods. For example, if the Node.JS superagent library is used without filtering errors and responses, errors and responses may include the request object, which includes the potentially secret API service URL / secret token headers.
100 |
101 | ## Rationale
102 |
103 | This API allows DApps to use a user's preferred connection in order to submit transactions to the network.
104 |
105 | The user may wish to use a specific trusted node, or a particular paid service with their own secret token. This API protects the user's secrets by not exposing connection details to the DApp.
106 |
107 | ## Security Considerations
108 |
109 | None.
110 |
111 | ## Copyright
112 |
113 | Copyright and related rights waived via <a href="https://creativecommons.org/publicdomain/zero/1.0/">CCO</a>.
114 |
```
--------------------------------------------------------------------------------
/packages/server/src/resources/knowledge/taxonomy/algokit:cli:architecture-decisions:2023-01-11_brew_install.md:
--------------------------------------------------------------------------------
```markdown
1 | # HomeBrew install strategy
2 |
3 | - **Status**: Approved
4 | - **Owner:** Daniel McGregor
5 | - **Deciders**: Daniel McGregor, Rob Moore, John Woods, Alessandro Cappellato
6 | - **Date created**: 2023-01-11
7 | - **Date decided:** 2023-01-11
8 |
9 | ## Context
10 |
11 | HomeBrew (brew) is a MacOS package manager, and is commonly used on MacOS systems to install applications and tools like AlgoKit. Brew offers two main installation methods.
12 |
13 | * Formula - A source based install, this is typically recommended for open source and command line based applications. Formula can also be "bottled" to provide pre built packages for quick installs on supported MacOS platforms.
14 | * Cask - A binary based install, this is typically recommended for closed source or GUI based applications.
15 |
16 | Additionally there are also two options for how the brew install scripts could be distributed.
17 |
18 | * Homebrew repository - This is the official repository for homebrew installs, and provides bottle support for all moderns MacOS platforms (MacOS 11+, Intel and ARM)
19 | * Algorand hosted repository - A homebrew repository managed by Algorand Foundation.
20 |
21 | Creating a HomeBrew Formula initially seemed like the best option for AlgoKit as it meets the [criteria](https://docs.brew.sh/Acceptable-Formulae) for a Formula. However there is a much higher maintenance cost with this approach as everything is built from source. We encountered an issue where one of our newly added python dependencies (pyclip) did not build from source [correctly](https://github.com/algorandfoundation/homebrew-tap/actions/runs/3884956190/jobs/6628201057#step:8:2871).
22 |
23 | The alternative install method of a cask was then considered, and while AlgoKit does not meet the [criteria](https://docs.brew.sh/Acceptable-Casks) for a cask, it does remove the need for a source build on each MacOS platform and the additional maintenance overhead of the Formula approach.
24 |
25 | ## Requirements
26 |
27 | - **Low maintenance**: The ongoing maintenance for supporting brew installs of AlgoKit should be low and not require manual effort for each release.
28 | - **Fast and easy install experience**: The install experience for end users of AlgoKit should be easy and not require multiple complicated steps, additionally it should install in seconds, not minutes.
29 |
30 | ## Options
31 |
32 | ### Option 1: Formula on Official Homebrew Repo
33 |
34 | This would be the preferred option except for the two notable issues. Firstly there is a high risk of ongoing maintenance overhead due to the need to support source building all the dependencies. Ideally this would not be an issue, but we have already hit a problem with a dependency (pyclip) early on in AlgoKit's development. Secondly inclusion into the official repo is subject to Homebrew's criteria, which AlgoKit won't reach until it is more mature.
35 |
36 | **Pros**
37 | * Most discoverable option for end users `brew install algokit`.
38 | * Homebrew supports automatically bottling on all modern MacOS platforms (MacOS 11+ both Intel and ARM variants) meaning fast installs for users.
39 |
40 | **Cons**
41 | * Inclusion is subject to Homebrew's approval process, which algokit won't meet for now at least.
42 | * Higher maintenance cost given the source build is more fragile and is likely to break and require investigation, plus build and install approach differs significantly from Chocolatey and pipx
43 | * Longer build time on release
44 | * Not possible to fully automate release, it relies on a Brew maintainer approving the pull request, so there's extra operational overhead to keep track of the release pull requests
45 |
46 | ### Option 2: Formula on Algorand Repo
47 |
48 | This option is similar to Option 1, but allows Algorand to self publish the installer without meeting Homebrews formula criteria. However one issue is that Platform support is more limited, GitHub provides action runners for intel variants for MacOS 11 + 12, but [MacOS 13](https://github.com/github/roadmap/issues/620) and [ARM](https://github.com/github/roadmap/issues/528) support are not yet available. Additional platforms could be supported by using a combination of self-hosted runners and/or third party solutions. This means pre-built bottles aren't easy to build for ARM or MacOS 13 and installation on those environments will take 5+ minutes.
49 |
50 | **Pros**
51 | * Algorand Foundation has control over this process and it can be fully automated
52 | * It's what we have already implemented and working today
53 | * Easier to move to the official Brew core repository once AlgoKit is stable and demonstrably popular (thus meeting the constraints Brew place)
54 |
55 | **Cons**
56 | * Supporting all modern MacOS platforms may require use of a 3rd party service and more effort, in the meantime the installation experience on ARM and MacOS 13 is slow (5+ min install)
57 | * Less discoverable install for end users `brew install algorandfoundation/algokit` (relies on them following documentation)
58 | * Higher maintenance cost given the source build is more fragile and is likely to break and require investigation, plus build and install approach differs significantly from Chocolatey and pipx
59 | * Longer build time on release
60 |
61 | ### Option 3: Cask on Algorand Repo
62 |
63 | This option uses a cask which does not have the maintenance overhead of a formula, and can be hosted in an Algorand Foundation repo to get around the fact AlgoKit does not meet the normal cask criteria.
64 |
65 | **Pros**
66 | * Algorand Foundation has control over this process and it can be fully automated
67 | * Lower maintenance cost as we do not need to support source builds of dependencies and it's consistent with how algokit cli is installed via Chocolatey and pipx
68 | * Fast install for all MacOS platforms
69 | * Fast build time on release
70 |
71 | **Cons**
72 | * Less discoverable install for end users `brew install algorandfoundation/algokit`
73 | * AlgoKit does not meet the stated criteria for a cask and as such it would unlikely to be approved as a cask in the official Homebrew Repo if that was a desired future state
74 | * More effort to implement a new way of installing via brew
75 |
76 | ### Option 4: Cask on Official Homebrew Repo
77 |
78 | This is not a viable option as AlgoKit does not meet the criteria for an official cask.
79 |
80 | ## Preferred option
81 |
82 | Option 1 because it would be the best end user experience.
83 |
84 | ## Selected option
85 |
86 | Option 3 because Option 1 isn't possible right now and it's also a higher overhead to maintain. The install experience for end users is similar with option 3 (just with a bit more typing).
87 |
```
--------------------------------------------------------------------------------
/packages/server/src/resources/knowledge/taxonomy/developer:python:code:example:local_storage.md:
--------------------------------------------------------------------------------
```markdown
1 | # Local Storage in Algorand Smart Contracts
2 |
3 | Local storage in Algorand smart contracts allows you to store per-account state data. This guide demonstrates how to work with local storage using Python.
4 |
5 | ## Initializing Local Storage
6 |
7 | ```python
8 | from algopy import (
9 | Account,
10 | Application,
11 | ARC4Contract,
12 | Asset,
13 | Bytes,
14 | LocalState,
15 | UInt64,
16 | arc4,
17 | )
18 |
19 | class LocalStorage(ARC4Contract):
20 | def __init__(self) -> None:
21 | # Initialize different types of local storage
22 | self.local_int = LocalState(UInt64) # Integer storage
23 | self.local_bytes = LocalState(Bytes) # Bytes storage
24 | self.local_bool = LocalState(bool) # Boolean storage
25 | self.local_asset = LocalState(Asset) # Asset reference
26 | self.local_application = LocalState(Application) # Application reference
27 | self.local_account = LocalState(Account) # Account reference
28 | ```
29 |
30 | ## Reading Local State
31 |
32 | ### Basic Access
33 |
34 | ```python
35 | @arc4.abimethod
36 | def get_item_local_data(self, for_account: Account) -> UInt64:
37 | # Direct access using indexing
38 | return self.local_int[for_account]
39 |
40 | @arc4.abimethod
41 | def get_local_data_with_default_int(self, for_account: Account) -> UInt64:
42 | # Access with default value
43 | return self.local_int.get(for_account, default=UInt64(0))
44 |
45 | @arc4.abimethod
46 | def maybe_local_data(self, for_account: Account) -> tuple[UInt64, bool]:
47 | # Get value and existence flag
48 | result, exists = self.local_int.maybe(for_account)
49 | if not exists:
50 | result = UInt64(0)
51 | return result, exists
52 | ```
53 |
54 | ### Reading Different Types
55 |
56 | ```python
57 | @arc4.abimethod
58 | def get_item_local_data_example(self, for_account: Account) -> bool:
59 | # Reading integers
60 | assert self.local_int[for_account] == UInt64(10)
61 |
62 | # Reading bytes
63 | assert self.local_bytes[for_account] == b"Hello"
64 |
65 | # Reading booleans
66 | assert bool(self.local_bool[for_account])
67 |
68 | # Reading special types
69 | assert self.local_asset[for_account] == Asset(UInt64(10))
70 | assert self.local_application[for_account] == Application(UInt64(10))
71 | assert self.local_account[for_account] == Account(Bytes(b"Hello"))
72 | return True
73 | ```
74 |
75 | ### Reading with Default Values
76 |
77 | ```python
78 | @arc4.abimethod
79 | def get_local_data_with_default(self, for_account: Account) -> bool:
80 | # Integer with default
81 | assert self.local_int.get(for_account, default=UInt64(0)) == UInt64(10)
82 |
83 | # Bytes with default
84 | assert self.local_bytes.get(
85 | for_account,
86 | default=Bytes(b"Default Value")
87 | ) == Bytes(b"Hello")
88 |
89 | # Boolean with default
90 | assert bool(self.local_bool.get(for_account, default=False))
91 |
92 | # Asset with default
93 | assert self.local_asset.get(
94 | for_account,
95 | default=Asset(UInt64(0))
96 | ) == Asset(UInt64(10))
97 |
98 | return True
99 | ```
100 |
101 | ## Writing Local State
102 |
103 | ### Basic Writing
104 |
105 | ```python
106 | @arc4.abimethod
107 | def set_local_int(self, for_account: Account, value: UInt64) -> None:
108 | # Set integer value for account
109 | self.local_int[for_account] = value
110 | ```
111 |
112 | ### Writing Different Types
113 |
114 | ```python
115 | @arc4.abimethod
116 | def set_local_data_example(
117 | self,
118 | for_account: Account,
119 | value_asset: Asset,
120 | value_account: Account,
121 | value_appln: Application,
122 | value_byte: Bytes,
123 | *,
124 | value_bool: bool,
125 | ) -> bool:
126 | # Set bytes
127 | self.local_bytes[for_account] = value_byte
128 |
129 | # Set boolean
130 | self.local_bool[for_account] = value_bool
131 |
132 | # Set asset reference
133 | self.local_asset[for_account] = value_asset
134 |
135 | # Set application reference
136 | self.local_application[for_account] = value_appln
137 |
138 | # Set account reference
139 | self.local_account[for_account] = value_account
140 |
141 | # Verify values
142 | assert self.local_bytes[for_account] == value_byte
143 | assert self.local_bool[for_account] == value_bool
144 | assert self.local_asset[for_account] == value_asset
145 | return True
146 | ```
147 |
148 | ## Checking State Existence
149 |
150 | ```python
151 | @arc4.abimethod
152 | def contains_local_data(self, for_account: Account) -> bool:
153 | # Check if account has local state
154 | assert for_account in self.local_int
155 | return True
156 |
157 | @arc4.abimethod
158 | def contains_local_data_example(self, for_account: Account) -> bool:
159 | # Check existence for all types
160 | assert for_account in self.local_int
161 | assert for_account in self.local_bytes
162 | assert for_account in self.local_bool
163 | assert for_account in self.local_asset
164 | assert for_account in self.local_application
165 | assert for_account in self.local_account
166 | return True
167 | ```
168 |
169 | ## Deleting Local State
170 |
171 | ```python
172 | @arc4.abimethod
173 | def delete_local_data(self, for_account: Account) -> None:
174 | # Delete single value
175 | del self.local_account[for_account]
176 |
177 | @arc4.abimethod
178 | def delete_local_data_example(self, for_account: Account) -> bool:
179 | # Delete all types of local state
180 | del self.local_int[for_account]
181 | del self.local_bytes[for_account]
182 | del self.local_bool[for_account]
183 | del self.local_asset[for_account]
184 | del self.local_application[for_account]
185 | del self.local_account[for_account]
186 | return True
187 | ```
188 |
189 | ## Best Practices
190 |
191 | 1. **Initialization**:
192 | - Use appropriate types for your data
193 | - Initialize all required state variables
194 | - Document state variable purposes
195 | - Consider storage limits
196 |
197 | 2. **Reading State**:
198 | - Use `get()` with default values for safe access
199 | - Use `maybe()` when existence check is needed
200 | - Handle non-existent values gracefully
201 | - Verify type consistency
202 |
203 | 3. **Writing State**:
204 | - Validate data before writing
205 | - Use appropriate type conversions
206 | - Consider storage costs
207 | - Update related state consistently
208 |
209 | 4. **State Existence**:
210 | - Check state existence before access
211 | - Handle missing state gracefully
212 | - Use appropriate default values
213 | - Consider opt-in requirements
214 |
215 | 5. **Type Safety**:
216 | - Use proper type annotations
217 | - Verify type compatibility
218 | - Handle type conversions explicitly
219 | - Test with various data types
220 |
221 | 6. **Performance**:
222 | - Minimize state operations
223 | - Use appropriate data structures
224 | - Consider storage costs
225 | - Optimize state access patterns
226 |
227 | This guide demonstrates the various aspects of working with local state in Algorand smart contracts using Python. Understanding these concepts is crucial for developing applications that need to maintain per-account state.
228 |
```
--------------------------------------------------------------------------------
/packages/server/src/resources/knowledge/taxonomy/algokit:utils:typescript:capabilities:typed-app-clients.md:
--------------------------------------------------------------------------------
```markdown
1 | # Typed application clients
2 |
3 | Typed application clients are automatically generated, typed TypeScript deployment and invocation clients for smart contracts that have a defined [ARC-56](https://github.com/algorandfoundation/ARCs/pull/258) or [ARC-32](https://github.com/algorandfoundation/ARCs/blob/main/ARCs/arc-0032.md) application specification so that the development experience is easier with less upskill ramp-up and less deployment errors. These clients give you a type-safe, intellisense-driven experience for invoking the smart contract.
4 |
5 | Typed application clients are the recommended way of interacting with smart contracts. If you don't have/want a typed client, but have an ARC-56/ARC-32 app spec then you can use the [non-typed application clients](./app-client.md) and if you want to call a smart contract you don't have an app spec file for you can use the underlying [app management](./app.md) and [app deployment](./app-deploy.md) functionality to manually construct transactions.
6 |
7 | ## Generating an app spec
8 |
9 | You can generate an app spec file:
10 |
11 | - Using [Algorand Python](https://algorandfoundation.github.io/puya/#quick-start)
12 | - Using [TEALScript](https://tealscript.netlify.app/tutorials/hello-world/0004-artifacts/)
13 | - By hand by following the specification [ARC-56](https://github.com/algorandfoundation/ARCs/pull/258)/[ARC-32](https://github.com/algorandfoundation/ARCs/blob/main/ARCs/arc-0032.md)
14 | - Using [Beaker](https://algorand-devrel.github.io/beaker/html/usage.html) (PyTEAL) _(DEPRECATED)_
15 |
16 | ## Generating a typed client
17 |
18 | To generate a typed client from an app spec file you can use [AlgoKit CLI](https://github.com/algorandfoundation/algokit-cli/blob/main/docs/features/generate.md#1-typed-clients):
19 |
20 | ```
21 | > algokit generate client application.json --output /absolute/path/to/client.ts
22 | ```
23 |
24 | Note: AlgoKit Utils >= 7.0.0 is compatible with the older 3.0.0 generated typed clients, however if you want to utilise the new features or leverage ARC-56 support, you will need to generate using >= 4.0.0. See [AlgoKit CLI generator version pinning](https://github.com/algorandfoundation/algokit-cli/blob/main/docs/features/generate.md#version-pinning) for more information on how to lock to a specific version.
25 |
26 | ## Getting a typed client instance
27 |
28 | To get an instance of a typed client you can use an [`AlgorandClient`](./algorand-client.md) instance or a typed app [`Factory`](#creating-a-typed-factory-instance) instance.
29 |
30 | The approach to obtaining a client instance depends on how many app clients you require for a given app spec and if the app has already been deployed, which is summarised below:
31 |
32 | ### App is deployed
33 |
34 | <table>
35 | <thead>
36 | <tr>
37 | <th colspan="2">Resolve App by ID</th>
38 | <th colspan="2">Resolve App by Creator and Name</th>
39 | </tr>
40 | <tr>
41 | <th>Single App Client Instance</th>
42 | <th>Multiple App Client Instances</th>
43 | <th>Single App Client Instance</th>
44 | <th>Multiple App Client Instances</th>
45 | </tr>
46 | </thead>
47 | <tbody>
48 | <tr>
49 | <td>
50 |
51 | ```typescript
52 | const appClient = algorand.client.getTypedAppClientById(MyContractClient, {
53 | appId: 1234n,
54 | // ...
55 | })
56 | //or
57 | const appClient = new MyContractClient({
58 | algorand,
59 | appId: 1234n,
60 | // ...
61 | })
62 | ```
63 |
64 | </td>
65 | <td>
66 |
67 | ```typescript
68 | const appClient1 = factory.getAppClientById({
69 | appId: 1234n,
70 | // ...
71 | })
72 | const appClient2 = factory.getAppClientById({
73 | appId: 4321n,
74 | // ...
75 | })
76 | ```
77 |
78 | </td>
79 | <td>
80 |
81 | ```typescript
82 | const appClient = await algorand.client.getTypedAppClientByCreatorAndName(MyContractClient, {
83 | creatorAddress: 'CREATORADDRESS',
84 | appName: 'contract-name',
85 | // ...
86 | })
87 | //or
88 | const appClient = await MyContractClient.fromCreatorAndName({
89 | algorand,
90 | creatorAddress: 'CREATORADDRESS',
91 | appName: 'contract-name',
92 | // ...
93 | })
94 | ```
95 |
96 | </td>
97 | <td>
98 |
99 | ```typescript
100 | const appClient1 = await factory.getAppClientByCreatorAndName({
101 | creatorAddress: 'CREATORADDRESS',
102 | appName: 'contract-name',
103 | // ...
104 | })
105 | const appClient2 = await factory.getAppClientByCreatorAndName({
106 | creatorAddress: 'CREATORADDRESS',
107 | appName: 'contract-name-2',
108 | // ...
109 | })
110 | ```
111 |
112 | </td>
113 | </tr>
114 | </tbody>
115 | </table>
116 |
117 | To understand the difference between resolving by ID vs by creator and name see the underlying [app client documentation](./app-client.md#appclient).
118 |
119 | ### App is not deployed
120 |
121 | <table>
122 | <thead>
123 | <tr>
124 | <th>Deploy a New App</th>
125 | <th>Deploy or Resolve App Idempotently by Creator and Name</th>
126 | </tr>
127 | </thead>
128 | <tbody>
129 | <tr>
130 | <td>
131 |
132 | ```typescript
133 | const { appClient } = await factory.send.create.bare({
134 | args: [],
135 | // ...
136 | })
137 | // or
138 | const { appClient } = await factory.send.create.METHODNAME({
139 | args: [],
140 | // ...
141 | })
142 | ```
143 |
144 | </td>
145 | <td>
146 |
147 | ```typescript
148 | const { appClient } = await factory.deploy({
149 | appName: 'contract-name',
150 | // ...
151 | })
152 | ```
153 |
154 | </td>
155 | </tr>
156 | </tbody>
157 | </table>
158 |
159 | ### Creating a typed factory instance
160 |
161 | If your scenario calls for an app factory, you can create one using the below:
162 |
163 | ```typescript
164 | const factory = algorand.client.getTypedAppFactory(MyContractFactory)
165 | //or
166 | const factory = new MyContractFactory({
167 | algorand,
168 | })
169 | ```
170 |
171 | ## Client usage
172 |
173 | See the [official usage docs](https://github.com/algorandfoundation/algokit-client-generator-ts/blob/main/docs/usage.md) for full details.
174 |
175 | For a simple example that deploys a contract and calls a `"hello"` method, see below:
176 |
177 | ```typescript
178 | // A similar working example can be seen in the AlgoKit init production smart contract templates, when using TypeScript deployment
179 | // In this case the generated factory is called `HelloWorldAppFactory` and is in `./artifacts/HelloWorldApp/client.ts`
180 | import { HelloWorldAppClient } from './artifacts/HelloWorldApp/client'
181 | import { AlgorandClient } from '@algorandfoundation/algokit-utils'
182 |
183 | // These require environment variables to be present, or it will retrieve from default LocalNet
184 | const algorand = AlgorandClient.fromEnvironment()
185 | const deployer = algorand.account.fromEnvironment('DEPLOYER', (1).algo())
186 |
187 | // Create the typed app factory
188 | const factory = algorand.client.getTypedAppFactory(HelloWorldAppFactory, {
189 | creatorAddress: deployer,
190 | defaultSender: deployer,
191 | })
192 |
193 | // Create the app and get a typed app client for the created app (note: this creates a new instance of the app every time,
194 | // you can use .deploy() to deploy idempotently if the app wasn't previously
195 | // deployed or needs to be updated if that's allowed)
196 | const { appClient } = await factory.create()
197 |
198 | // Make a call to an ABI method and print the result
199 | const response = await appClient.hello({ name: 'world' })
200 | console.log(response)
201 | ```
202 |
```
--------------------------------------------------------------------------------
/packages/server/src/resources/knowledge/taxonomy/ARCs:specs:arc-0074.md:
--------------------------------------------------------------------------------
```markdown
1 | ---
2 | arc: 74
3 | title: NFT Indexer API
4 | description: REST API for reading data about Application's NFTs.
5 | author: William G Hatch (@willghatch)
6 | discussions-to: https://github.com/algorandfoundation/ARCs/issues/170
7 | status: Final
8 | type: Standards Track
9 | category: Interface
10 | sub-category: Application
11 | created: 2023-02-17
12 | requires: 72
13 | ---
14 |
15 |
16 | ## Abstract
17 | This specifies a REST interface that can be implemented by indexing services to provide data about NFTs conforming to the [ARC-72](arc-0072.md) standard.
18 |
19 | ## Motivation
20 | While most data is available on-chain, reading and analyzing on-chain logs to get a complete and current picture about NFT ownership and history is slow and impractical for many uses.
21 | This REST interface standard allows analysis of NFT contracts to be done in a centralized manner to provide fast, up-to-date responses to queries, while allowing users to pick from any indexing provider.
22 |
23 |
24 | ## Specification
25 |
26 | This specification defines two REST endpoints: `/nft-index/v1/tokens` and `/nft-index/v1/transfers`.
27 | Both endpoints respond only to `GET` requests, take no path parameters, and consume no input.
28 | But both accept a variety of query parameters.
29 |
30 | ### `GET /nft-indexer/v1/tokens`
31 |
32 | Produces `application/json`.
33 |
34 | Optional Query Parameters:
35 |
36 | | Name | Schema | Description |
37 | | --- | --- | --- |
38 | | round | integer | Include results for the specified round. For performance reasons, this parameter may be disabled on some configurations. |
39 | | next | string | Token for the next page of results. Use the `next-token` provided by the previous page of results. |
40 | | limit | integer | Maximum number of results to return. There could be additional pages even if the limit is not reached. |
41 | | contractId | integer | Limit results to NFTs implemented by the given contract ID. |
42 | | tokenId | integer | Limit results to NFTs with the given token ID. |
43 | | owner | address | Limit results to NFTs owned by the given owner. |
44 | | mint-min-round | integer | Limit results to NFTs minted on or after the given round. |
45 | | mint-max-round | integer | Limit results to NFTs minted on or before the given round. |
46 |
47 | When successful, returns a response with code 200 and an object with the schema:
48 |
49 | | Name | Required? | Schema | Description |
50 | | --- | --- | --- | --- |
51 | | tokens | required | <Token> array | Array of Token objects that fit the query parameters, as defined below. |
52 | | current-round | required | integer | Round at which the results were computed. |
53 | | next-token | optional | string | Used for pagination, when making another request provide this token as the `next` parameter. |
54 |
55 | The `Token` object has the following schema:
56 |
57 | | Name | Required? | Schema | Description |
58 | | --- | --- | --- | --- |
59 | | owner | required | address | The current owner of the NFT. |
60 | | contractId | required | integer | The ID of the ARC-72 contract that defines the NFT. |
61 | | tokenId | required | integer | The tokenID of the NFT, which along with the contractId addresses a unique ARC-72 token. |
62 | | mint-round | optional | integer | The round at which the NFT was minted (IE the round at which it was transferred from the zero address to the first owner). |
63 | | metadataURI | optional | string | The URI given for the token by the `metadataURI` API of the contract, if applicable. |
64 | | metadata | optional | object | The result of resolving the `metadataURI`, if applicable and available. |
65 |
66 | When unsuccessful, returns a response with code 400 or 500 and an object with the schema:
67 |
68 | | Name | Required? | Schema |
69 | | --- | --- | --- |
70 | | data | optional | object |
71 | | message | required | string |
72 |
73 | ### `GET /nft-indexer/v1/transfers`
74 |
75 | Produces `application/json`.
76 |
77 | Optional Query Parameters:
78 |
79 | | Name | Schema | Description |
80 | | --- | --- | --- |
81 | | round | integer | Include results for the specified round. For performance reasons, this parameter may be disabled on some configurations. |
82 | | next | string | Token for the next page of results. Use the `next-token` provided by the previous page of results. |
83 | | limit | integer | Maximum number of results to return. There could be additional pages even if the limit is not reached. |
84 | | contractId | integer | Limit results to NFTs implemented by the given contract ID. |
85 | | tokenId | integer | Limit results to NFTs with the given token ID. |
86 | | user | address | Limit results to transfers where the user is either the sender or receiver. |
87 | | from | address | Limit results to transfers with the given address as the sender. |
88 | | to | address | Limit results to transfers with the given address as the receiver. |
89 | | min-round | integer | Limit results to transfers that were executed on or after the given round. |
90 | | max-round | integer | Limit results to transfers that were executed on or before the given round. |
91 |
92 | When successful, returns a response with code 200 and an object with the schema:
93 |
94 | | Name | Required? | Schema | Description |
95 | | --- | --- | --- | --- |
96 | | transfers | required | <Transfer> array | Array of Transfer objects that fit the query parameters, as defined below. |
97 | | current-round | required | integer | Round at which the results were computed. |
98 | | next-token | optional | string | Used for pagination, when making another request provide this token as the `next` parameter. |
99 |
100 | The `Transfer` object has the following schema:
101 |
102 | | Name | Required? | Schema | Description |
103 | | --- | --- | --- | --- |
104 | | contractId | required | integer | The ID of the ARC-72 contract that defines the NFT. |
105 | | tokenId | required | integer | The tokenID of the NFT, which along with the contractId addresses a unique ARC-72 token. |
106 | | from | required | address | The sender of the transaction. |
107 | | to | required | address | The receiver of the transaction. |
108 | | round | required | integer | The round of the transfer. |
109 |
110 | When unsuccessful, returns a response with code 400 or 500 and an object with the schema:
111 |
112 | | Name | Required? | Schema |
113 | | --- | --- | --- |
114 | | data | optional | object |
115 | | message | required | string |
116 |
117 | ## Rationale
118 | This standard was designed to feel similar to the Algorand indexer API, and uses the same query parameters and results where applicable.
119 |
120 | ## Backwards Compatibility
121 | This standard presents a versioned REST interface, allowing future extensions to change the interface in incompatible ways while allowing for the old service to run in tandem.
122 |
123 |
124 | ## Security Considerations
125 | All data available through this indexer API is publicly available.
126 |
127 | ## Copyright
128 | Copyright and related rights waived via <a href="https://creativecommons.org/publicdomain/zero/1.0/">CCO</a>.
129 |
```
--------------------------------------------------------------------------------
/packages/server/src/resources/knowledge/taxonomy/algokit:utils:python:markdown:index.md:
--------------------------------------------------------------------------------
```markdown
1 | # AlgoKit Python Utilities
2 |
3 | A set of core Algorand utilities written in Python and released via PyPi that make it easier to build solutions on Algorand.
4 | This project is part of [AlgoKit](https://github.com/algorandfoundation/algokit-cli).
5 |
6 | The goal of this library is to provide intuitive, productive utility functions that make it easier, quicker and safer to build applications on Algorand.
7 | Largely these functions wrap the underlying Algorand SDK, but provide a higher level interface with sensible defaults and capabilities for common tasks.
8 |
9 | #### NOTE
10 | If you prefer TypeScript there’s an equivalent [TypeScript utility library](https://github.com/algorandfoundation/algokit-utils-ts).
11 |
12 | [Core principles]() | [Installation]() | [Usage]() | [Capabilities]() | [Reference docs]()
13 |
14 | # Contents
15 |
16 | * [Account management](capabilities/account.md)
17 | * [`Account`](capabilities/account.md#account)
18 | * [Client management](capabilities/client.md)
19 | * [Network configuration](capabilities/client.md#network-configuration)
20 | * [Clients](capabilities/client.md#clients)
21 | * [App client](capabilities/app-client.md)
22 | * [Design](capabilities/app-client.md#design)
23 | * [Creating an application client](capabilities/app-client.md#creating-an-application-client)
24 | * [Calling methods on the app](capabilities/app-client.md#calling-methods-on-the-app)
25 | * [Composing calls](capabilities/app-client.md#composing-calls)
26 | * [Reading state](capabilities/app-client.md#reading-state)
27 | * [Handling logic errors and diagnosing errors](capabilities/app-client.md#handling-logic-errors-and-diagnosing-errors)
28 | * [App deployment](capabilities/app-deploy.md)
29 | * [Design](capabilities/app-deploy.md#design)
30 | * [Finding apps by creator](capabilities/app-deploy.md#finding-apps-by-creator)
31 | * [Deploying an application](capabilities/app-deploy.md#deploying-an-application)
32 | * [Algo transfers](capabilities/transfer.md)
33 | * [Transferring Algos](capabilities/transfer.md#transferring-algos)
34 | * [Ensuring minimum Algos](capabilities/transfer.md#ensuring-minimum-algos)
35 | * [Transfering Assets](capabilities/transfer.md#transfering-assets)
36 | * [Dispenser](capabilities/transfer.md#dispenser)
37 | * [TestNet Dispenser Client](capabilities/dispenser-client.md)
38 | * [Creating a Dispenser Client](capabilities/dispenser-client.md#creating-a-dispenser-client)
39 | * [Funding an Account](capabilities/dispenser-client.md#funding-an-account)
40 | * [Registering a Refund](capabilities/dispenser-client.md#registering-a-refund)
41 | * [Getting Current Limit](capabilities/dispenser-client.md#getting-current-limit)
42 | * [Error Handling](capabilities/dispenser-client.md#error-handling)
43 | * [Debugger](capabilities/debugger.md)
44 | * [Configuration](capabilities/debugger.md#configuration)
45 | * [Debugging Utilities](capabilities/debugger.md#debugging-utilities)
46 | * [`algokit_utils`](apidocs/algokit_utils/algokit_utils.md)
47 | * [Data](apidocs/algokit_utils/algokit_utils.md#data)
48 | * [Classes](apidocs/algokit_utils/algokit_utils.md#classes)
49 | * [Functions](apidocs/algokit_utils/algokit_utils.md#functions)
50 |
51 | <a id="core-principles"></a>
52 |
53 | # Core principles
54 |
55 | This library is designed with the following principles:
56 |
57 | - **Modularity** - This library is a thin wrapper of modular building blocks over the Algorand SDK; the primitives from the underlying Algorand SDK are
58 | exposed and used wherever possible so you can opt-in to which parts of this library you want to use without having to use an all or nothing approach.
59 | - **Type-safety** - This library provides strong TypeScript support with effort put into creating types that provide good type safety and intellisense.
60 | - **Productivity** - This library is built to make solution developers highly productive; it has a number of mechanisms to make common code easier and terser to write
61 |
62 | <a id="installation"></a>
63 |
64 | # Installation
65 |
66 | This library can be installed from PyPi using pip or poetry, e.g.:
67 |
68 | ```default
69 | pip install algokit-utils
70 | poetry add algokit-utils
71 | ```
72 |
73 | <a id="usage"></a>
74 |
75 | # Usage
76 |
77 | To use this library simply include the following at the top of your file:
78 |
79 | ```python
80 | import algokit_utils
81 | ```
82 |
83 | Then you can use intellisense to auto-complete the various functions and types that are available by typing `algokit_utils.` in your favourite Integrated Development Environment (IDE),
84 | or you can refer to the [reference documentation](apidocs/algokit_utils/algokit_utils.md).
85 |
86 | ## Types
87 |
88 | The library contains extensive type hinting combined with a tool like MyPy this can help identify issues where incorrect types have been used, or used incorrectly.
89 |
90 | <a id="capabilities"></a>
91 |
92 | # Capabilities
93 |
94 | The library helps you with the following capabilities:
95 |
96 | - Core capabilities
97 | - [**Client management**](capabilities/client.md) - Creation of algod, indexer and kmd clients against various networks resolved from environment or specified configuration
98 | - [**Account management**](capabilities/account.md) - Creation and use of accounts including mnemonic, multisig, transaction signer, idempotent KMD accounts and environment variable injected
99 | - Higher-order use cases
100 | - [**ARC-0032 Application Spec client**](capabilities/app-client.md) - Builds on top of the App management and App deployment capabilities to provide a high productivity application client that works with ARC-0032 application spec defined smart contracts (e.g. via Beaker)
101 | - [**App deployment**](capabilities/app-deploy.md) - Idempotent (safely retryable) deployment of an app, including deploy-time immutability and permanence control and TEAL template substitution
102 | - [**Algo transfers**](capabilities/transfer.md) - Ability to easily initiate algo transfers between accounts, including dispenser management and idempotent account funding
103 | - [**Debugger**](capabilities/debugger.md) - Provides a set of debugging tools that can be used to simulate and trace transactions on the Algorand blockchain. These tools and methods are optimized for developers who are building applications on Algorand and need to test and debug their smart contracts via [AVM Debugger extension](https://github.com/algorandfoundation/algokit-avm-vscode-debugger).
104 |
105 | <a id="reference-documentation"></a>
106 |
107 | # Reference documentation
108 |
109 | We have [auto-generated reference documentation for the code](apidocs/algokit_utils/algokit_utils.md).
110 |
111 | # Roadmap
112 |
113 | This library will naturally evolve with any logical developer experience improvements needed to facilitate the [AlgoKit](https://github.com/algorandfoundation/algokit-cli) roadmap as it evolves.
114 |
115 | Likely future capability additions include:
116 |
117 | - Typed application client
118 | - Asset management
119 | - Expanded indexer API wrapper support
120 |
121 | # Indices and tables
122 |
123 | - [Index](genindex.md)
124 |
```