This is page 16 of 74. Use http://codebase.md/goplausible/algorand-mcp?lines=false&page={x} to view the full context. # Directory Structure ``` ├── .gitignore ├── CONTRIBUTING.md ├── LICENSE ├── llms-install.md ├── llms.txt ├── package.json ├── packages │ ├── client │ │ ├── .env.example │ │ ├── package.json │ │ ├── README.md │ │ ├── src │ │ │ ├── env.ts │ │ │ ├── index.ts │ │ │ └── LocalWallet.ts │ │ └── tsconfig.json │ └── server │ ├── .env.example │ ├── API specs │ │ ├── algod_api.json │ │ ├── indexer_api.json │ │ ├── mcp.json │ │ ├── nfd_api.json │ │ ├── ultrade_api.json │ │ ├── vestige_api.json │ │ └── vestige_free_api.json │ ├── Dockerfile │ ├── jest.config.js │ ├── package.json │ ├── README.md │ ├── smithery.yaml │ ├── src │ │ ├── algorand-client.ts │ │ ├── env.ts │ │ ├── index.ts │ │ ├── resources │ │ │ ├── index.ts │ │ │ ├── knowledge │ │ │ │ ├── ARCs.txt │ │ │ │ ├── developers-algokit-architecture-decisions.txt │ │ │ │ ├── developers-algokit-cli.txt │ │ │ │ ├── developers-algokit-utils-python.txt │ │ │ │ ├── developers-algokit-utils-typescript.txt │ │ │ │ ├── developers-clis.txt │ │ │ │ ├── developers-details.txt │ │ │ │ ├── developers-liquid-auth.txt │ │ │ │ ├── developers-nodes.txt │ │ │ │ ├── developers-puya.txt │ │ │ │ ├── developers-python.txt │ │ │ │ ├── developers-sdks-js.txt │ │ │ │ ├── developers-sdks-python.txt │ │ │ │ ├── developers-tealscript.txt │ │ │ │ ├── developers.txt │ │ │ │ ├── index.ts │ │ │ │ ├── taxonomy │ │ │ │ │ ├── algokit-cli:README.md │ │ │ │ │ ├── algokit:cli:algokit.md │ │ │ │ │ ├── algokit:cli:architecture-decisions:2022-11-14_sandbox-approach.md │ │ │ │ │ ├── algokit:cli:architecture-decisions:2022-11-22_beaker-testing-strategy.md │ │ │ │ │ ├── algokit:cli:architecture-decisions:2023-01-11_beaker_productionisation_review.md │ │ │ │ │ ├── algokit:cli:architecture-decisions:2023-01-11_brew_install.md │ │ │ │ │ ├── algokit:cli:architecture-decisions:2023-01-12_smart-contract-deployment.md │ │ │ │ │ ├── algokit:cli:architecture-decisions:2023-06-06_frontend-templates.md │ │ │ │ │ ├── algokit:cli:architecture-decisions:2023-07-19_advanced_generate_command.md │ │ │ │ │ ├── algokit:cli:architecture-decisions:2024-01-13_native_binaries.md │ │ │ │ │ ├── algokit:cli:architecture-decisions:2024-01-23_init-wizard-v2.md │ │ │ │ │ ├── algokit:cli:architecture-decisions:2024-01-31_binary_distribution.md │ │ │ │ │ ├── algokit:cli:architecture-decisions:2024-03-06_local_dev_ui_packaging.md │ │ │ │ │ ├── algokit:cli:articles:output_stability.md │ │ │ │ │ ├── algokit:cli:cli:index.md │ │ │ │ │ ├── algokit:cli:features:compile.md │ │ │ │ │ ├── algokit:cli:features:completions.md │ │ │ │ │ ├── algokit:cli:features:config.md │ │ │ │ │ ├── algokit:cli:features:dispenser.md │ │ │ │ │ ├── algokit:cli:features:doctor.md │ │ │ │ │ ├── algokit:cli:features:explore.md │ │ │ │ │ ├── algokit:cli:features:generate.md │ │ │ │ │ ├── algokit:cli:features:goal.md │ │ │ │ │ ├── algokit:cli:features:init.md │ │ │ │ │ ├── algokit:cli:features:localnet.md │ │ │ │ │ ├── algokit:cli:features:project:bootstrap.md │ │ │ │ │ ├── algokit:cli:features:project:deploy.md │ │ │ │ │ ├── algokit:cli:features:project:link.md │ │ │ │ │ ├── algokit:cli:features:project:list.md │ │ │ │ │ ├── algokit:cli:features:project:run.md │ │ │ │ │ ├── algokit:cli:features:project.md │ │ │ │ │ ├── algokit:cli:features:tasks:analyze.md │ │ │ │ │ ├── algokit:cli:features:tasks:ipfs.md │ │ │ │ │ ├── algokit:cli:features:tasks:mint.md │ │ │ │ │ ├── algokit:cli:features:tasks:nfd.md │ │ │ │ │ ├── algokit:cli:features:tasks:opt.md │ │ │ │ │ ├── algokit:cli:features:tasks:send.md │ │ │ │ │ ├── algokit:cli:features:tasks:sign.md │ │ │ │ │ ├── algokit:cli:features:tasks:transfer.md │ │ │ │ │ ├── algokit:cli:features:tasks:vanity_address.md │ │ │ │ │ ├── algokit:cli:features:tasks:wallet.md │ │ │ │ │ ├── algokit:cli:features:tasks.md │ │ │ │ │ ├── algokit:cli:tutorials:algokit-template.md │ │ │ │ │ ├── algokit:cli:tutorials:intro.md │ │ │ │ │ ├── algokit:cli:tutorials:smart-contracts.md │ │ │ │ │ ├── algokit:docs:testnet_api.md │ │ │ │ │ ├── algokit:lora:README.md │ │ │ │ │ ├── algokit:README.md │ │ │ │ │ ├── algokit:utils:python:markdown:apidocs:algokit_utils:algokit_utils.md │ │ │ │ │ ├── algokit:utils:python:markdown:capabilities:account.md │ │ │ │ │ ├── algokit:utils:python:markdown:capabilities:app-client.md │ │ │ │ │ ├── algokit:utils:python:markdown:capabilities:app-deploy.md │ │ │ │ │ ├── algokit:utils:python:markdown:capabilities:client.md │ │ │ │ │ ├── algokit:utils:python:markdown:capabilities:debugger.md │ │ │ │ │ ├── algokit:utils:python:markdown:capabilities:dispenser-client.md │ │ │ │ │ ├── algokit:utils:python:markdown:capabilities:transfer.md │ │ │ │ │ ├── algokit:utils:python:markdown:index.md │ │ │ │ │ ├── algokit:utils:python:README.md │ │ │ │ │ ├── algokit:utils:python:source:capabilities:account.md │ │ │ │ │ ├── algokit:utils:python:source:capabilities:app-client.md │ │ │ │ │ ├── algokit:utils:python:source:capabilities:app-deploy.md │ │ │ │ │ ├── algokit:utils:python:source:capabilities:client.md │ │ │ │ │ ├── algokit:utils:python:source:capabilities:debugger.md │ │ │ │ │ ├── algokit:utils:python:source:capabilities:dispenser-client.md │ │ │ │ │ ├── algokit:utils:python:source:capabilities:transfer.md │ │ │ │ │ ├── algokit:utils:python:source:index.md │ │ │ │ │ ├── algokit:utils:typescript:capabilities:account.md │ │ │ │ │ ├── algokit:utils:typescript:capabilities:algorand-client.md │ │ │ │ │ ├── algokit:utils:typescript:capabilities:amount.md │ │ │ │ │ ├── algokit:utils:typescript:capabilities:app-client.md │ │ │ │ │ ├── algokit:utils:typescript:capabilities:app-deploy.md │ │ │ │ │ ├── algokit:utils:typescript:capabilities:app.md │ │ │ │ │ ├── algokit:utils:typescript:capabilities:asset.md │ │ │ │ │ ├── algokit:utils:typescript:capabilities:client.md │ │ │ │ │ ├── algokit:utils:typescript:capabilities:debugging.md │ │ │ │ │ ├── algokit:utils:typescript:capabilities:dispenser-client.md │ │ │ │ │ ├── algokit:utils:typescript:capabilities:event-emitter.md │ │ │ │ │ ├── algokit:utils:typescript:capabilities:indexer.md │ │ │ │ │ ├── algokit:utils:typescript:capabilities:testing.md │ │ │ │ │ ├── algokit:utils:typescript:capabilities:transaction-composer.md │ │ │ │ │ ├── algokit:utils:typescript:capabilities:transaction.md │ │ │ │ │ ├── algokit:utils:typescript:capabilities:transfer.md │ │ │ │ │ ├── algokit:utils:typescript:capabilities:typed-app-clients.md │ │ │ │ │ ├── algokit:utils:typescript:code:classes:testing.TestLogger.md │ │ │ │ │ ├── algokit:utils:typescript:code:classes:testing.TransactionLogger.md │ │ │ │ │ ├── algokit:utils:typescript:code:classes:types_account_manager.AccountManager.md │ │ │ │ │ ├── algokit:utils:typescript:code:classes:types_account.MultisigAccount.md │ │ │ │ │ ├── algokit:utils:typescript:code:classes:types_account.SigningAccount.md │ │ │ │ │ ├── algokit:utils:typescript:code:classes:types_algo_http_client_with_retry.AlgoHttpClientWithRetry.md │ │ │ │ │ ├── algokit:utils:typescript:code:classes:types_algorand_client_transaction_creator.AlgorandClientTransactionCreator.md │ │ │ │ │ ├── algokit:utils:typescript:code:classes:types_algorand_client_transaction_sender.AlgorandClientTransactionSender.md │ │ │ │ │ ├── algokit:utils:typescript:code:classes:types_algorand_client.AlgorandClient.md │ │ │ │ │ ├── algokit:utils:typescript:code:classes:types_amount.AlgoAmount.md │ │ │ │ │ ├── algokit:utils:typescript:code:classes:types_app_arc56.Arc56Method.md │ │ │ │ │ ├── algokit:utils:typescript:code:classes:types_app_client.AppClient.md │ │ │ │ │ ├── algokit:utils:typescript:code:classes:types_app_client.ApplicationClient.md │ │ │ │ │ ├── algokit:utils:typescript:code:classes:types_app_deployer.AppDeployer.md │ │ │ │ │ ├── algokit:utils:typescript:code:classes:types_app_factory.AppFactory.md │ │ │ │ │ ├── algokit:utils:typescript:code:classes:types_app_manager.AppManager.md │ │ │ │ │ ├── algokit:utils:typescript:code:classes:types_asset_manager.AssetManager.md │ │ │ │ │ ├── algokit:utils:typescript:code:classes:types_async_event_emitter.AsyncEventEmitter.md │ │ │ │ │ ├── algokit:utils:typescript:code:classes:types_client_manager.ClientManager.md │ │ │ │ │ ├── algokit:utils:typescript:code:classes:types_composer.TransactionComposer.md │ │ │ │ │ ├── algokit:utils:typescript:code:classes:types_config.UpdatableConfig.md │ │ │ │ │ ├── algokit:utils:typescript:code:classes:types_dispenser_client.TestNetDispenserApiClient.md │ │ │ │ │ ├── algokit:utils:typescript:code:classes:types_kmd_account_manager.KmdAccountManager.md │ │ │ │ │ ├── algokit:utils:typescript:code:classes:types_logic_error.LogicError.md │ │ │ │ │ ├── algokit:utils:typescript:code:enums:types_app.OnSchemaBreak.md │ │ │ │ │ ├── algokit:utils:typescript:code:enums:types_app.OnUpdate.md │ │ │ │ │ ├── algokit:utils:typescript:code:enums:types_indexer.AccountStatus.md │ │ │ │ │ ├── algokit:utils:typescript:code:enums:types_indexer.ApplicationOnComplete.md │ │ │ │ │ ├── algokit:utils:typescript:code:enums:types_indexer.SignatureType.md │ │ │ │ │ ├── algokit:utils:typescript:code:enums:types_lifecycle_events.EventType.md │ │ │ │ │ ├── algokit:utils:typescript:code:interfaces:types_account_manager.EnsureFundedResult.md │ │ │ │ │ ├── algokit:utils:typescript:code:interfaces:types_account.AccountConfig.md │ │ │ │ │ ├── algokit:utils:typescript:code:interfaces:types_account.TransactionSignerAccount.md │ │ │ │ │ ├── algokit:utils:typescript:code:interfaces:types_algorand_client_interface.AlgorandClientInterface.md │ │ │ │ │ ├── algokit:utils:typescript:code:interfaces:types_app_arc56.Arc56Contract.md │ │ │ │ │ ├── algokit:utils:typescript:code:interfaces:types_app_arc56.Event.md │ │ │ │ │ ├── algokit:utils:typescript:code:interfaces:types_app_arc56.Method.md │ │ │ │ │ ├── algokit:utils:typescript:code:interfaces:types_app_arc56.ProgramSourceInfo.md │ │ │ │ │ ├── algokit:utils:typescript:code:interfaces:types_app_arc56.StorageKey.md │ │ │ │ │ ├── algokit:utils:typescript:code:interfaces:types_app_arc56.StorageMap.md │ │ │ │ │ ├── algokit:utils:typescript:code:interfaces:types_app_arc56.StructField.md │ │ │ │ │ ├── algokit:utils:typescript:code:interfaces:types_app_client.AppClientCallABIArgs.md │ │ │ │ │ ├── algokit:utils:typescript:code:interfaces:types_app_client.AppClientCallCoreParams.md │ │ │ │ │ ├── algokit:utils:typescript:code:interfaces:types_app_client.AppClientCompilationParams.md │ │ │ │ │ ├── algokit:utils:typescript:code:interfaces:types_app_client.AppClientCompilationResult.md │ │ │ │ │ ├── algokit:utils:typescript:code:interfaces:types_app_client.AppClientDeployCallInterfaceParams.md │ │ │ │ │ ├── algokit:utils:typescript:code:interfaces:types_app_client.AppClientDeployCoreParams.md │ │ │ │ │ ├── algokit:utils:typescript:code:interfaces:types_app_client.AppClientDeployParams.md │ │ │ │ │ ├── algokit:utils:typescript:code:interfaces:types_app_client.AppClientParams.md │ │ │ │ │ ├── algokit:utils:typescript:code:interfaces:types_app_client.AppSourceMaps.md │ │ │ │ │ ├── algokit:utils:typescript:code:interfaces:types_app_client.FundAppAccountParams.md │ │ │ │ │ ├── algokit:utils:typescript:code:interfaces:types_app_client.ResolveAppById.md │ │ │ │ │ ├── algokit:utils:typescript:code:interfaces:types_app_client.ResolveAppByIdBase.md │ │ │ │ │ ├── algokit:utils:typescript:code:interfaces:types_app_client.SourceMapExport.md │ │ │ │ │ ├── algokit:utils:typescript:code:interfaces:types_app_deployer.AppLookup.md │ │ │ │ │ ├── algokit:utils:typescript:code:interfaces:types_app_deployer.AppMetadata.md │ │ │ │ │ ├── algokit:utils:typescript:code:interfaces:types_app_factory.AppFactoryParams.md │ │ │ │ │ ├── algokit:utils:typescript:code:interfaces:types_app_manager.AppInformation.md │ │ │ │ │ ├── algokit:utils:typescript:code:interfaces:types_app_manager.BoxReference.md │ │ │ │ │ ├── algokit:utils:typescript:code:interfaces:types_app_manager.BoxValueRequestParams.md │ │ │ │ │ ├── algokit:utils:typescript:code:interfaces:types_app_manager.BoxValuesRequestParams.md │ │ │ │ │ ├── algokit:utils:typescript:code:interfaces:types_app_spec.AppSources.md │ │ │ │ │ ├── algokit:utils:typescript:code:interfaces:types_app_spec.AppSpec.md │ │ │ │ │ ├── algokit:utils:typescript:code:interfaces:types_app_spec.CallConfig.md │ │ │ │ │ ├── algokit:utils:typescript:code:interfaces:types_app_spec.DeclaredSchemaValueSpec.md │ │ │ │ │ ├── algokit:utils:typescript:code:interfaces:types_app_spec.Hint.md │ │ │ │ │ ├── algokit:utils:typescript:code:interfaces:types_app_spec.ReservedSchemaValueSpec.md │ │ │ │ │ ├── algokit:utils:typescript:code:interfaces:types_app_spec.Schema.md │ │ │ │ │ ├── algokit:utils:typescript:code:interfaces:types_app_spec.SchemaSpec.md │ │ │ │ │ ├── algokit:utils:typescript:code:interfaces:types_app_spec.StateSchemaSpec.md │ │ │ │ │ ├── algokit:utils:typescript:code:interfaces:types_app_spec.Struct.md │ │ │ │ │ ├── algokit:utils:typescript:code:interfaces:types_app.AppCallParams.md │ │ │ │ │ ├── algokit:utils:typescript:code:interfaces:types_app.AppCallTransactionResultOfType.md │ │ │ │ │ ├── algokit:utils:typescript:code:interfaces:types_app.AppCompilationResult.md │ │ │ │ │ ├── algokit:utils:typescript:code:interfaces:types_app.AppDeploymentParams.md │ │ │ │ │ ├── algokit:utils:typescript:code:interfaces:types_app.AppDeployMetadata.md │ │ │ │ │ ├── algokit:utils:typescript:code:interfaces:types_app.AppLookup.md │ │ │ │ │ ├── algokit:utils:typescript:code:interfaces:types_app.AppMetadata.md │ │ │ │ │ ├── algokit:utils:typescript:code:interfaces:types_app.AppReference.md │ │ │ │ │ ├── algokit:utils:typescript:code:interfaces:types_app.AppState.md │ │ │ │ │ ├── algokit:utils:typescript:code:interfaces:types_app.AppStorageSchema.md │ │ │ │ │ ├── algokit:utils:typescript:code:interfaces:types_app.BoxName.md │ │ │ │ │ ├── algokit:utils:typescript:code:interfaces:types_app.BoxReference.md │ │ │ │ │ ├── algokit:utils:typescript:code:interfaces:types_app.BoxValueRequestParams.md │ │ │ │ │ ├── algokit:utils:typescript:code:interfaces:types_app.BoxValuesRequestParams.md │ │ │ │ │ ├── algokit:utils:typescript:code:interfaces:types_app.CompiledTeal.md │ │ │ │ │ ├── algokit:utils:typescript:code:interfaces:types_app.CoreAppCallArgs.md │ │ │ │ │ ├── algokit:utils:typescript:code:interfaces:types_app.CreateAppParams.md │ │ │ │ │ ├── algokit:utils:typescript:code:interfaces:types_app.RawAppCallArgs.md │ │ │ │ │ ├── algokit:utils:typescript:code:interfaces:types_app.TealTemplateParams.md │ │ │ │ │ ├── algokit:utils:typescript:code:interfaces:types_app.UpdateAppParams.md │ │ │ │ │ ├── algokit:utils:typescript:code:interfaces:types_asset_manager.AssetInformation.md │ │ │ │ │ ├── algokit:utils:typescript:code:interfaces:types_asset_manager.BulkAssetOptInOutResult.md │ │ │ │ │ ├── algokit:utils:typescript:code:interfaces:types_asset.AssetBulkOptInOutParams.md │ │ │ │ │ ├── algokit:utils:typescript:code:interfaces:types_asset.AssetOptInParams.md │ │ │ │ │ ├── algokit:utils:typescript:code:interfaces:types_asset.AssetOptOutParams.md │ │ │ │ │ ├── algokit:utils:typescript:code:interfaces:types_asset.CreateAssetParams.md │ │ │ │ │ ├── algokit:utils:typescript:code:interfaces:types_client_manager.AlgoSdkClients.md │ │ │ │ │ ├── algokit:utils:typescript:code:interfaces:types_client_manager.TypedAppClient.md │ │ │ │ │ ├── algokit:utils:typescript:code:interfaces:types_client_manager.TypedAppFactory.md │ │ │ │ │ ├── algokit:utils:typescript:code:interfaces:types_composer.BuiltTransactions.md │ │ │ │ │ ├── algokit:utils:typescript:code:interfaces:types_config.Config.md │ │ │ │ │ ├── algokit:utils:typescript:code:interfaces:types_debugging.AVMTracesEventData.md │ │ │ │ │ ├── algokit:utils:typescript:code:interfaces:types_debugging.TealSourceDebugEventData.md │ │ │ │ │ ├── algokit:utils:typescript:code:interfaces:types_debugging.TealSourcesDebugEventData.md │ │ │ │ │ ├── algokit:utils:typescript:code:interfaces:types_dispenser_client.DispenserFundResponse.md │ │ │ │ │ ├── algokit:utils:typescript:code:interfaces:types_dispenser_client.DispenserLimitResponse.md │ │ │ │ │ ├── algokit:utils:typescript:code:interfaces:types_dispenser_client.TestNetDispenserApiClientParams.md │ │ │ │ │ ├── algokit:utils:typescript:code:interfaces:types_indexer.LookupAssetHoldingsOptions.md │ │ │ │ │ ├── algokit:utils:typescript:code:interfaces:types_logic_error.LogicErrorDetails.md │ │ │ │ │ ├── algokit:utils:typescript:code:interfaces:types_network_client.AlgoClientConfig.md │ │ │ │ │ ├── algokit:utils:typescript:code:interfaces:types_network_client.AlgoConfig.md │ │ │ │ │ ├── algokit:utils:typescript:code:interfaces:types_network_client.NetworkDetails.md │ │ │ │ │ ├── algokit:utils:typescript:code:interfaces:types_testing.AlgoKitLogCaptureFixture.md │ │ │ │ │ ├── algokit:utils:typescript:code:interfaces:types_testing.AlgorandFixture.md │ │ │ │ │ ├── algokit:utils:typescript:code:interfaces:types_testing.AlgorandFixtureConfig.md │ │ │ │ │ ├── algokit:utils:typescript:code:interfaces:types_testing.AlgorandTestAutomationContext.md │ │ │ │ │ ├── algokit:utils:typescript:code:interfaces:types_testing.GetTestAccountParams.md │ │ │ │ │ ├── algokit:utils:typescript:code:interfaces:types_testing.LogSnapshotConfig.md │ │ │ │ │ ├── algokit:utils:typescript:code:interfaces:types_transaction.AtomicTransactionComposerToSend.md │ │ │ │ │ ├── algokit:utils:typescript:code:interfaces:types_transaction.ConfirmedTransactionResult.md │ │ │ │ │ ├── algokit:utils:typescript:code:interfaces:types_transaction.ConfirmedTransactionResults.md │ │ │ │ │ ├── algokit:utils:typescript:code:interfaces:types_transaction.SendAtomicTransactionComposerResults.md │ │ │ │ │ ├── algokit:utils:typescript:code:interfaces:types_transaction.SendParams.md │ │ │ │ │ ├── algokit:utils:typescript:code:interfaces:types_transaction.SendTransactionParams.md │ │ │ │ │ ├── algokit:utils:typescript:code:interfaces:types_transaction.SendTransactionResult.md │ │ │ │ │ ├── algokit:utils:typescript:code:interfaces:types_transaction.SendTransactionResults.md │ │ │ │ │ ├── algokit:utils:typescript:code:interfaces:types_transaction.TransactionGroupToSend.md │ │ │ │ │ ├── algokit:utils:typescript:code:interfaces:types_transaction.TransactionToSign.md │ │ │ │ │ ├── algokit:utils:typescript:code:interfaces:types_transfer.AlgoRekeyParams.md │ │ │ │ │ ├── algokit:utils:typescript:code:interfaces:types_transfer.AlgoTransferParams.md │ │ │ │ │ ├── algokit:utils:typescript:code:interfaces:types_transfer.EnsureFundedParams.md │ │ │ │ │ ├── algokit:utils:typescript:code:interfaces:types_transfer.EnsureFundedReturnType.md │ │ │ │ │ ├── algokit:utils:typescript:code:interfaces:types_transfer.TransferAssetParams.md │ │ │ │ │ ├── algokit:utils:typescript:code:modules:index.indexer.md │ │ │ │ │ ├── algokit:utils:typescript:code:modules:index.md │ │ │ │ │ ├── algokit:utils:typescript:code:modules:testing.md │ │ │ │ │ ├── algokit:utils:typescript:code:modules:types_account_manager_spec.md │ │ │ │ │ ├── algokit:utils:typescript:code:modules:types_account_manager.md │ │ │ │ │ ├── algokit:utils:typescript:code:modules:types_account.md │ │ │ │ │ ├── algokit:utils:typescript:code:modules:types_algo_http_client_with_retry.md │ │ │ │ │ ├── algokit:utils:typescript:code:modules:types_algorand_client_asset_spec.md │ │ │ │ │ ├── algokit:utils:typescript:code:modules:types_algorand_client_interface.md │ │ │ │ │ ├── algokit:utils:typescript:code:modules:types_algorand_client_spec.md │ │ │ │ │ ├── algokit:utils:typescript:code:modules:types_algorand_client_transaction_creator.md │ │ │ │ │ ├── algokit:utils:typescript:code:modules:types_algorand_client_transaction_sender.md │ │ │ │ │ ├── algokit:utils:typescript:code:modules:types_algorand_client_transfer_spec.md │ │ │ │ │ ├── algokit:utils:typescript:code:modules:types_algorand_client.md │ │ │ │ │ ├── algokit:utils:typescript:code:modules:types_amount_spec.md │ │ │ │ │ ├── algokit:utils:typescript:code:modules:types_amount.md │ │ │ │ │ ├── algokit:utils:typescript:code:modules:types_app_arc56.md │ │ │ │ │ ├── algokit:utils:typescript:code:modules:types_app_client_spec.md │ │ │ │ │ ├── algokit:utils:typescript:code:modules:types_app_client.md │ │ │ │ │ ├── algokit:utils:typescript:code:modules:types_app_deployer.md │ │ │ │ │ ├── algokit:utils:typescript:code:modules:types_app_factory_and_client_spec.md │ │ │ │ │ ├── algokit:utils:typescript:code:modules:types_app_factory.md │ │ │ │ │ ├── algokit:utils:typescript:code:modules:types_app_manager.md │ │ │ │ │ ├── algokit:utils:typescript:code:modules:types_app_spec.md │ │ │ │ │ ├── algokit:utils:typescript:code:modules:types_app.md │ │ │ │ │ ├── algokit:utils:typescript:code:modules:types_asset_manager.md │ │ │ │ │ ├── algokit:utils:typescript:code:modules:types_asset.md │ │ │ │ │ ├── algokit:utils:typescript:code:modules:types_async_event_emitter_spec.md │ │ │ │ │ ├── algokit:utils:typescript:code:modules:types_async_event_emitter.md │ │ │ │ │ ├── algokit:utils:typescript:code:modules:types_client_manager_spec.md │ │ │ │ │ ├── algokit:utils:typescript:code:modules:types_client_manager.md │ │ │ │ │ ├── algokit:utils:typescript:code:modules:types_composer.md │ │ │ │ │ ├── algokit:utils:typescript:code:modules:types_config.md │ │ │ │ │ ├── algokit:utils:typescript:code:modules:types_debugging.md │ │ │ │ │ ├── algokit:utils:typescript:code:modules:types_dispenser_client_spec.md │ │ │ │ │ ├── algokit:utils:typescript:code:modules:types_dispenser_client.md │ │ │ │ │ ├── algokit:utils:typescript:code:modules:types_expand.md │ │ │ │ │ ├── algokit:utils:typescript:code:modules:types_indexer.md │ │ │ │ │ ├── algokit:utils:typescript:code:modules:types_kmd_account_manager.md │ │ │ │ │ ├── algokit:utils:typescript:code:modules:types_lifecycle_events.md │ │ │ │ │ ├── algokit:utils:typescript:code:modules:types_logging.md │ │ │ │ │ ├── algokit:utils:typescript:code:modules:types_logic_error.md │ │ │ │ │ ├── algokit:utils:typescript:code:modules:types_network_client.md │ │ │ │ │ ├── algokit:utils:typescript:code:modules:types_testing.md │ │ │ │ │ ├── algokit:utils:typescript:code:modules:types_transaction.md │ │ │ │ │ ├── algokit:utils:typescript:code:modules:types_transfer.md │ │ │ │ │ ├── algokit:utils:typescript:code:README.md │ │ │ │ │ ├── algokit:utils:typescript:README.md │ │ │ │ │ ├── algokit:utils:typescript:v7-migration.md │ │ │ │ │ ├── algokit:utils:typescript:v8-migration.md │ │ │ │ │ ├── ARCs:ARC-template.md │ │ │ │ │ ├── ARCs:assets:arc-0012:README.md │ │ │ │ │ ├── ARCs:assets:arc-0034:TemplateForm.md │ │ │ │ │ ├── ARCs:assets:arc-0062:README.md │ │ │ │ │ ├── ARCs:pages:nfts.md │ │ │ │ │ ├── ARCs:pages:wallets.md │ │ │ │ │ ├── ARCs:README.md │ │ │ │ │ ├── ARCs:specs:arc-0000.md │ │ │ │ │ ├── ARCs:specs:arc-0001.md │ │ │ │ │ ├── ARCs:specs:arc-0002.md │ │ │ │ │ ├── ARCs:specs:arc-0003.md │ │ │ │ │ ├── ARCs:specs:arc-0004.md │ │ │ │ │ ├── ARCs:specs:arc-0005.md │ │ │ │ │ ├── ARCs:specs:arc-0006.md │ │ │ │ │ ├── ARCs:specs:arc-0007.md │ │ │ │ │ ├── ARCs:specs:arc-0008.md │ │ │ │ │ ├── ARCs:specs:arc-0009.md │ │ │ │ │ ├── ARCs:specs:arc-0010.md │ │ │ │ │ ├── ARCs:specs:arc-0011.md │ │ │ │ │ ├── ARCs:specs:arc-0012.md │ │ │ │ │ ├── ARCs:specs:arc-0015.md │ │ │ │ │ ├── ARCs:specs:arc-0016.md │ │ │ │ │ ├── ARCs:specs:arc-0018.md │ │ │ │ │ ├── ARCs:specs:arc-0019.md │ │ │ │ │ ├── ARCs:specs:arc-0020.md │ │ │ │ │ ├── ARCs:specs:arc-0021.md │ │ │ │ │ ├── ARCs:specs:arc-0022.md │ │ │ │ │ ├── ARCs:specs:arc-0023.md │ │ │ │ │ ├── ARCs:specs:arc-0025.md │ │ │ │ │ ├── ARCs:specs:arc-0026.md │ │ │ │ │ ├── ARCs:specs:arc-0028.md │ │ │ │ │ ├── ARCs:specs:arc-0032.md │ │ │ │ │ ├── ARCs:specs:arc-0033.md │ │ │ │ │ ├── ARCs:specs:arc-0034.md │ │ │ │ │ ├── ARCs:specs:arc-0035.md │ │ │ │ │ ├── ARCs:specs:arc-0036.md │ │ │ │ │ ├── ARCs:specs:arc-0042.md │ │ │ │ │ ├── ARCs:specs:arc-0047.md │ │ │ │ │ ├── ARCs:specs:arc-0048.md │ │ │ │ │ ├── ARCs:specs:arc-0049.md │ │ │ │ │ ├── ARCs:specs:arc-0054.md │ │ │ │ │ ├── ARCs:specs:arc-0055.md │ │ │ │ │ ├── ARCs:specs:arc-0056.md │ │ │ │ │ ├── ARCs:specs:arc-0059.md │ │ │ │ │ ├── ARCs:specs:arc-0062.md │ │ │ │ │ ├── ARCs:specs:arc-0065.md │ │ │ │ │ ├── ARCs:specs:arc-0069.md │ │ │ │ │ ├── ARCs:specs:arc-0072.md │ │ │ │ │ ├── ARCs:specs:arc-0073.md │ │ │ │ │ ├── ARCs:specs:arc-0074.md │ │ │ │ │ ├── ARCs:specs:arc-0076.md │ │ │ │ │ ├── ARCs:specs:arc-0078.md │ │ │ │ │ ├── ARCs:specs:arc-0079.md │ │ │ │ │ ├── ARCs:specs:arc-0200.md │ │ │ │ │ ├── clis_index.md │ │ │ │ │ ├── developer:docs:about.md │ │ │ │ │ ├── developer:docs:clis:algokey:algokey.md │ │ │ │ │ ├── developer:docs:clis:algokey:generate.md │ │ │ │ │ ├── developer:docs:clis:algokey:import.md │ │ │ │ │ ├── developer:docs:clis:algokey:multisig:append-auth-addr.md │ │ │ │ │ ├── developer:docs:clis:algokey:multisig:multisig.md │ │ │ │ │ ├── developer:docs:clis:algokey:part:info.md │ │ │ │ │ ├── developer:docs:clis:algokey:part:part.md │ │ │ │ │ ├── developer:docs:clis:algokey:part:reparent.md │ │ │ │ │ ├── developer:docs:clis:algokey:sign.md │ │ │ │ │ ├── developer:docs:clis:conduit:conduit.md │ │ │ │ │ ├── developer:docs:clis:conduit:init.md │ │ │ │ │ ├── developer:docs:clis:conduit:list:exporters.md │ │ │ │ │ ├── developer:docs:clis:conduit:list:importers.md │ │ │ │ │ ├── developer:docs:clis:conduit:list:list.md │ │ │ │ │ ├── developer:docs:clis:conduit:list:processors.md │ │ │ │ │ ├── developer:docs:clis:diagcfg:diagcfg.md │ │ │ │ │ ├── developer:docs:clis:diagcfg:metric:disable.md │ │ │ │ │ ├── developer:docs:clis:diagcfg:metric:enable.md │ │ │ │ │ ├── developer:docs:clis:diagcfg:metric:metric.md │ │ │ │ │ ├── developer:docs:clis:diagcfg:metric:status.md │ │ │ │ │ ├── developer:docs:clis:diagcfg:telemetry:disable.md │ │ │ │ │ ├── developer:docs:clis:diagcfg:telemetry:enable.md │ │ │ │ │ ├── developer:docs:clis:diagcfg:telemetry:endpoint.md │ │ │ │ │ ├── developer:docs:clis:diagcfg:telemetry:name.md │ │ │ │ │ ├── developer:docs:clis:diagcfg:telemetry:status.md │ │ │ │ │ ├── developer:docs:clis:diagcfg:telemetry:telemetry.md │ │ │ │ │ ├── developer:docs:clis:goal:node:restart.md │ │ │ │ │ ├── developer:docs:clis:goal:node:start.md │ │ │ │ │ ├── developer:docs:clis:goal:node:status.md │ │ │ │ │ ├── developer:docs:clis:goal:node:stop.md │ │ │ │ │ ├── developer:docs:clis:goal:node:wait.md │ │ │ │ │ ├── developer:docs:clis:goal:protocols.md │ │ │ │ │ ├── developer:docs:clis:goal:report.md │ │ │ │ │ ├── developer:docs:clis:goal:version.md │ │ │ │ │ ├── developer:docs:clis:goal:wallet:list.md │ │ │ │ │ ├── developer:docs:clis:goal:wallet:new.md │ │ │ │ │ ├── developer:docs:clis:goal:wallet:wallet.md │ │ │ │ │ ├── developer:docs:clis:indexer:api-config.md │ │ │ │ │ ├── developer:docs:clis:indexer:daemon.md │ │ │ │ │ ├── developer:docs:clis:indexer:indexer.md │ │ │ │ │ ├── developer:docs:clis:indexer:util:util.md │ │ │ │ │ ├── developer:docs:clis:indexer:util:validator.md │ │ │ │ │ ├── developer:docs:clis:kmd.md │ │ │ │ │ ├── developer:docs:clis:tealdbg:debug.md │ │ │ │ │ ├── developer:docs:clis:tealdbg:remote.md │ │ │ │ │ ├── developer:docs:clis:tealdbg:tealdbg.md │ │ │ │ │ ├── developer:docs:details:accounts:create.md │ │ │ │ │ ├── developer:docs:details:accounts:index.md │ │ │ │ │ ├── developer:docs:details:accounts:rekey.md │ │ │ │ │ ├── developer:docs:details:algorand_consensus.md │ │ │ │ │ ├── developer:docs:details:algorand-networks:betanet.md │ │ │ │ │ ├── developer:docs:details:algorand-networks:index.md │ │ │ │ │ ├── developer:docs:details:algorand-networks:mainnet.md │ │ │ │ │ ├── developer:docs:details:algorand-networks:testnet.md │ │ │ │ │ ├── developer:docs:details:asa.md │ │ │ │ │ ├── developer:docs:details:atc.md │ │ │ │ │ ├── developer:docs:details:atomic_transfers.md │ │ │ │ │ ├── developer:docs:details:conduit.md │ │ │ │ │ ├── developer:docs:details:crust.md │ │ │ │ │ ├── developer:docs:details:dapps:avm:index.md │ │ │ │ │ ├── developer:docs:details:dapps:avm:teal:guidelines.md │ │ │ │ │ ├── developer:docs:details:dapps:avm:teal:index.md │ │ │ │ │ ├── developer:docs:details:dapps:avm:teal:jsonspec.md │ │ │ │ │ ├── developer:docs:details:dapps:avm:teal:opcodes:index.md │ │ │ │ │ ├── developer:docs:details:dapps:avm:teal:opcodes:v1.md │ │ │ │ │ ├── developer:docs:details:dapps:avm:teal:opcodes:v10.md │ │ │ │ │ ├── developer:docs:details:dapps:avm:teal:opcodes:v2.md │ │ │ │ │ ├── developer:docs:details:dapps:avm:teal:opcodes:v3.md │ │ │ │ │ ├── developer:docs:details:dapps:avm:teal:opcodes:v4.md │ │ │ │ │ ├── developer:docs:details:dapps:avm:teal:opcodes:v5.md │ │ │ │ │ ├── developer:docs:details:dapps:avm:teal:opcodes:v6.md │ │ │ │ │ ├── developer:docs:details:dapps:avm:teal:opcodes:v7.md │ │ │ │ │ ├── developer:docs:details:dapps:avm:teal:opcodes:v8.md │ │ │ │ │ ├── developer:docs:details:dapps:avm:teal:opcodes:v9.md │ │ │ │ │ ├── developer:docs:details:dapps:avm:teal:specification.md │ │ │ │ │ ├── developer:docs:details:dapps:smart-contracts:ABI:index.md │ │ │ │ │ ├── developer:docs:details:dapps:smart-contracts:apps:create.md │ │ │ │ │ ├── developer:docs:details:dapps:smart-contracts:apps:index.md │ │ │ │ │ ├── developer:docs:details:dapps:smart-contracts:apps:innertx.md │ │ │ │ │ ├── developer:docs:details:dapps:smart-contracts:apps:state.md │ │ │ │ │ ├── developer:docs:details:dapps:smart-contracts:apps:txs.md │ │ │ │ │ ├── developer:docs:details:dapps:smart-contracts:debugging.md │ │ │ │ │ ├── developer:docs:details:dapps:smart-contracts:frontend:apps.md │ │ │ │ │ ├── developer:docs:details:dapps:smart-contracts:frontend:smartsigs.md │ │ │ │ │ ├── developer:docs:details:dapps:smart-contracts:guidelines.md │ │ │ │ │ ├── developer:docs:details:dapps:smart-contracts:index.md │ │ │ │ │ ├── developer:docs:details:dapps:smart-contracts:smartsigs:index.md │ │ │ │ │ ├── developer:docs:details:dapps:smart-contracts:smartsigs:modes.md │ │ │ │ │ ├── developer:docs:details:dapps:smart-contracts:smartsigs:walkthrough.md │ │ │ │ │ ├── developer:docs:details:dapps:writing-contracts:beaker.md │ │ │ │ │ ├── developer:docs:details:dapps:writing-contracts:pyteal.md │ │ │ │ │ ├── developer:docs:details:dapps:writing-contracts:python.md │ │ │ │ │ ├── developer:docs:details:encoding.md │ │ │ │ │ ├── developer:docs:details:ethereum_to_algorand.md │ │ │ │ │ ├── developer:docs:details:index.md │ │ │ │ │ ├── developer:docs:details:indexer.md │ │ │ │ │ ├── developer:docs:details:parameter_tables.md │ │ │ │ │ ├── developer:docs:details:stateproofs:index.md │ │ │ │ │ ├── developer:docs:details:stateproofs:light_client.md │ │ │ │ │ ├── developer:docs:details:technical_faq.md │ │ │ │ │ ├── developer:docs:details:transactions:index.md │ │ │ │ │ ├── developer:docs:details:transactions:offline_transactions.md │ │ │ │ │ ├── developer:docs:details:transactions:payment_prompts.md │ │ │ │ │ ├── developer:docs:details:transactions:signatures.md │ │ │ │ │ ├── developer:docs:details:transactions:transactions.md │ │ │ │ │ ├── developer:docs:details:useful_resources.md │ │ │ │ │ ├── developer:docs:get-started:algokit.md │ │ │ │ │ ├── developer:docs:get-started:basics:what_is_blockchain.md │ │ │ │ │ ├── developer:docs:get-started:basics:whats_a_dapp.md │ │ │ │ │ ├── developer:docs:get-started:basics:where_to_start.md │ │ │ │ │ ├── developer:docs:get-started:basics:why_algorand.md │ │ │ │ │ ├── developer:docs:get-started:tokenization:ft.md │ │ │ │ │ ├── developer:docs:get-started:tokenization:nft.md │ │ │ │ │ ├── developer:docs:index.md │ │ │ │ │ ├── developer:docs:rest-apis:algod.md │ │ │ │ │ ├── developer:docs:rest-apis:indexer.md │ │ │ │ │ ├── developer:docs:rest-apis:kmd.md │ │ │ │ │ ├── developer:docs:rest-apis:restendpoints.md │ │ │ │ │ ├── developer:docs:run-a-node:operations:catchup.md │ │ │ │ │ ├── developer:docs:run-a-node:operations:switch_networks.md │ │ │ │ │ ├── developer:docs:run-a-node:participate:generate_keys.md │ │ │ │ │ ├── developer:docs:run-a-node:participate:index.md │ │ │ │ │ ├── developer:docs:run-a-node:participate:offline.md │ │ │ │ │ ├── developer:docs:run-a-node:participate:online.md │ │ │ │ │ ├── developer:docs:run-a-node:participate:renew.md │ │ │ │ │ ├── developer:docs:run-a-node:reference:artifacts.md │ │ │ │ │ ├── developer:docs:run-a-node:reference:config.md │ │ │ │ │ ├── developer:docs:run-a-node:reference:relay.md │ │ │ │ │ ├── developer:docs:run-a-node:reference:telemetry-config.md │ │ │ │ │ ├── developer:docs:run-a-node:setup:indexer.md │ │ │ │ │ ├── developer:docs:run-a-node:setup:install.md │ │ │ │ │ ├── developer:docs:run-a-node:setup:node-troubleshooting.md │ │ │ │ │ ├── developer:docs:run-a-node:setup:types.md │ │ │ │ │ ├── developer:docs:sdks:go:index.md │ │ │ │ │ ├── developer:docs:sdks:index.md │ │ │ │ │ ├── developer:docs:sdks:java:index.md │ │ │ │ │ ├── developer:docs:sdks:javascript:index.md │ │ │ │ │ ├── developer:docs:sdks:python:index.md │ │ │ │ │ ├── developer:python:code:example:accounts.md │ │ │ │ │ ├── developer:python:code:example:arc4_types.md │ │ │ │ │ ├── developer:python:code:example:assets.md │ │ │ │ │ ├── developer:python:code:example:box_storage.md │ │ │ │ │ ├── developer:python:code:example:control_flow.md │ │ │ │ │ ├── developer:python:code:example:crypto:merkle_tree.md │ │ │ │ │ ├── developer:python:code:example:defi:amm.md │ │ │ │ │ ├── developer:python:code:example:defi:auction.md │ │ │ │ │ ├── developer:python:code:example:defi:htlc_logicsig.md │ │ │ │ │ ├── developer:python:code:example:defi:marketplace.md │ │ │ │ │ ├── developer:python:code:example:events:arc28_events.md │ │ │ │ │ ├── developer:python:code:example:global_storage.md │ │ │ │ │ ├── developer:python:code:example:governance:simple_voting.md │ │ │ │ │ ├── developer:python:code:example:hello_world.md │ │ │ │ │ ├── developer:python:code:example:inner_transactions.md │ │ │ │ │ ├── developer:python:code:example:local_storage.md │ │ │ │ │ ├── developer:python:code:example:nft:proof_of_attendance.md │ │ │ │ │ ├── developer:python:code:example:privacy:zk_whitelist.md │ │ │ │ │ ├── developer:python:code:example:scratch_storage.md │ │ │ │ │ ├── developer:python:code:example:self_payment.md │ │ │ │ │ ├── developer:python:code:example:struct_in_box.md │ │ │ │ │ ├── developer:python:code:example:subsidize_app_call.md │ │ │ │ │ ├── developer:python:code:example:transactions.md │ │ │ │ │ ├── developer:python:code:example:utility:calculator.md │ │ │ │ │ ├── devportal-code-examples:projects:python-contract-examples:README.md │ │ │ │ │ ├── devportal-code-examples:README.md │ │ │ │ │ ├── docs:.walletconnect:index.md │ │ │ │ │ ├── docs:.walletconnect:walletconnect-schema.md │ │ │ │ │ ├── docs:README.md │ │ │ │ │ ├── docs:scripts:example_tracker:example_list.md │ │ │ │ │ ├── docs:scripts:README.md │ │ │ │ │ ├── index.md │ │ │ │ │ ├── liquid_auth_index.md │ │ │ │ │ ├── liquid-auth:ARCHITECTURE.md │ │ │ │ │ ├── liquid-auth:decisions:1-Service-Authentication.md │ │ │ │ │ ├── liquid-auth:decisions:2-Bidirectional-Communication.md │ │ │ │ │ ├── liquid-auth:decisions:3-Peer-to-Peer-Signaling.md │ │ │ │ │ ├── liquid-auth:decisions:4-Fido-Extension.md │ │ │ │ │ ├── liquid-auth:decisions:README.md │ │ │ │ │ ├── liquid-auth:docs:architecture.md │ │ │ │ │ ├── liquid-auth:docs:clients:android:provider-service:authenticate.md │ │ │ │ │ ├── liquid-auth:docs:clients:android:provider-service:register.md │ │ │ │ │ ├── liquid-auth:docs:clients:browser:authentication.md │ │ │ │ │ ├── liquid-auth:docs:clients:browser:example.md │ │ │ │ │ ├── liquid-auth:docs:introduction.md │ │ │ │ │ ├── liquid-auth:docs:README.md │ │ │ │ │ ├── liquid-auth:docs:server:environment-variables.md │ │ │ │ │ ├── liquid-auth:docs:server:integrations.md │ │ │ │ │ ├── liquid-auth:docs:server:introduction.md │ │ │ │ │ ├── liquid-auth:docs:server:running-locally.md │ │ │ │ │ ├── liquid-auth:README.md │ │ │ │ │ ├── liquid-auth:SEQUENCE.md │ │ │ │ │ ├── liquid-auth:services:liquid-auth-api-js:src:assertion:assertion.controller.post.request.md │ │ │ │ │ ├── liquid-auth:services:liquid-auth-api-js:src:assertion:assertion.controller.post.response.md │ │ │ │ │ ├── liquid-auth:services:liquid-auth-api-js:src:attestation:attestation.controller.post.request.md │ │ │ │ │ ├── liquid-auth:services:liquid-auth-api-js:src:auth:auth.controller.get.user.md │ │ │ │ │ ├── liquid-auth:sites:express-dapp:README.md │ │ │ │ │ ├── liquid-auth:VISION.md │ │ │ │ │ ├── puya_index.md │ │ │ │ │ ├── puya:docs:algopy_testing:index.md │ │ │ │ │ ├── puya:docs:api-algopy.arc4.md │ │ │ │ │ ├── puya:docs:api-algopy.gtxn.md │ │ │ │ │ ├── puya:docs:api-algopy.itxn.md │ │ │ │ │ ├── puya:docs:api-algopy.md │ │ │ │ │ ├── puya:docs:api-algopy.op.md │ │ │ │ │ ├── puya:docs:api.md │ │ │ │ │ ├── puya:docs:compiler.md │ │ │ │ │ ├── puya:docs:index.md │ │ │ │ │ ├── puya:docs:language-guide.md │ │ │ │ │ ├── puya:docs:lg-arc28.md │ │ │ │ │ ├── puya:docs:lg-arc4.md │ │ │ │ │ ├── puya:docs:lg-builtins.md │ │ │ │ │ ├── puya:docs:lg-calling-apps.md │ │ │ │ │ ├── puya:docs:lg-compile.md │ │ │ │ │ ├── puya:docs:lg-control.md │ │ │ │ │ ├── puya:docs:lg-errors.md │ │ │ │ │ ├── puya:docs:lg-logs.md │ │ │ │ │ ├── puya:docs:lg-modules.md │ │ │ │ │ ├── puya:docs:lg-opcode-budget.md │ │ │ │ │ ├── puya:docs:lg-ops.md │ │ │ │ │ ├── puya:docs:lg-storage.md │ │ │ │ │ ├── puya:docs:lg-structure.md │ │ │ │ │ ├── puya:docs:lg-transactions.md │ │ │ │ │ ├── puya:docs:lg-types.md │ │ │ │ │ ├── puya:docs:lg-unsupported-python-features.md │ │ │ │ │ ├── puya:docs:principles.md │ │ │ │ │ ├── puya:examples:auction:README.md │ │ │ │ │ ├── puya:python:testing:docs:algopy.md │ │ │ │ │ ├── puya:python:testing:docs:api.md │ │ │ │ │ ├── puya:python:testing:docs:coverage.md │ │ │ │ │ ├── puya:python:testing:docs:examples.md │ │ │ │ │ ├── puya:python:testing:docs:faq.md │ │ │ │ │ ├── puya:python:testing:docs:index.md │ │ │ │ │ ├── puya:python:testing:docs:testing-guide:arc4-types.md │ │ │ │ │ ├── puya:python:testing:docs:testing-guide:avm-types.md │ │ │ │ │ ├── puya:python:testing:docs:testing-guide:concepts.md │ │ │ │ │ ├── puya:python:testing:docs:testing-guide:contract-testing.md │ │ │ │ │ ├── puya:python:testing:docs:testing-guide:index.md │ │ │ │ │ ├── puya:python:testing:docs:testing-guide:opcodes.md │ │ │ │ │ ├── puya:python:testing:docs:testing-guide:signature-testing.md │ │ │ │ │ ├── puya:python:testing:docs:testing-guide:state-management.md │ │ │ │ │ ├── puya:python:testing:docs:testing-guide:subroutines.md │ │ │ │ │ ├── puya:python:testing:docs:testing-guide:transactions.md │ │ │ │ │ ├── puya:python:testing:examples:README.md │ │ │ │ │ ├── puya:python:testing:README.md │ │ │ │ │ ├── puya:README.md │ │ │ │ │ ├── puya:src:puya:ARCHITECTURE.md │ │ │ │ │ ├── puya:src:puyapy:_typeshed:README.md │ │ │ │ │ ├── puya:src:puyapy:_vendor:mypy:typeshed:stdlib:_typeshed:README.md │ │ │ │ │ ├── puya:src:puyapy:awst_build:README.md │ │ │ │ │ ├── puya:stubs:README.md │ │ │ │ │ ├── puya:tests:test_expected_output:README.md │ │ │ │ │ ├── puya:typescript:docs:architecture-decisions:2024-05-21_primitive-bytes-and-strings.md │ │ │ │ │ ├── puya:typescript:docs:architecture-decisions:2024-05-21_primitive-integer-types.md │ │ │ │ │ ├── puya:typescript:docs:README.md │ │ │ │ │ ├── puya:typescript:packages:algo-ts:readme.md │ │ │ │ │ ├── puya:typescript:README.md │ │ │ │ │ ├── SDKs:javascript:classes:ABIAddressType.md │ │ │ │ │ ├── SDKs:javascript:classes:ABIArrayDynamicType.md │ │ │ │ │ ├── SDKs:javascript:classes:ABIArrayStaticType.md │ │ │ │ │ ├── SDKs:javascript:classes:ABIBoolType.md │ │ │ │ │ ├── SDKs:javascript:classes:ABIByteType.md │ │ │ │ │ ├── SDKs:javascript:classes:ABIContract.md │ │ │ │ │ ├── SDKs:javascript:classes:ABIInterface.md │ │ │ │ │ ├── SDKs:javascript:classes:ABIMethod.md │ │ │ │ │ ├── SDKs:javascript:classes:ABIStringType.md │ │ │ │ │ ├── SDKs:javascript:classes:ABITupleType.md │ │ │ │ │ ├── SDKs:javascript:classes:ABIType.md │ │ │ │ │ ├── SDKs:javascript:classes:ABIUfixedType.md │ │ │ │ │ ├── SDKs:javascript:classes:ABIUintType.md │ │ │ │ │ ├── SDKs:javascript:classes:Algodv2.md │ │ │ │ │ ├── SDKs:javascript:classes:AtomicTransactionComposer.md │ │ │ │ │ ├── SDKs:javascript:classes:DryrunResult.md │ │ │ │ │ ├── SDKs:javascript:classes:Indexer.md │ │ │ │ │ ├── SDKs:javascript:classes:indexerModels.Account.md │ │ │ │ │ ├── SDKs:javascript:classes:indexerModels.AccountParticipation.md │ │ │ │ │ ├── SDKs:javascript:classes:indexerModels.AccountResponse.md │ │ │ │ │ ├── SDKs:javascript:classes:indexerModels.AccountsResponse.md │ │ │ │ │ ├── SDKs:javascript:classes:indexerModels.AccountStateDelta.md │ │ │ │ │ ├── SDKs:javascript:classes:indexerModels.Application.md │ │ │ │ │ ├── SDKs:javascript:classes:indexerModels.ApplicationLocalState.md │ │ │ │ │ ├── SDKs:javascript:classes:indexerModels.ApplicationLocalStatesResponse.md │ │ │ │ │ ├── SDKs:javascript:classes:indexerModels.ApplicationLogData.md │ │ │ │ │ ├── SDKs:javascript:classes:indexerModels.ApplicationLogsResponse.md │ │ │ │ │ ├── SDKs:javascript:classes:indexerModels.ApplicationParams.md │ │ │ │ │ ├── SDKs:javascript:classes:indexerModels.ApplicationResponse.md │ │ │ │ │ ├── SDKs:javascript:classes:indexerModels.ApplicationsResponse.md │ │ │ │ │ ├── SDKs:javascript:classes:indexerModels.ApplicationStateSchema.md │ │ │ │ │ ├── SDKs:javascript:classes:indexerModels.Asset.md │ │ │ │ │ ├── SDKs:javascript:classes:indexerModels.AssetBalancesResponse.md │ │ │ │ │ ├── SDKs:javascript:classes:indexerModels.AssetHolding.md │ │ │ │ │ ├── SDKs:javascript:classes:indexerModels.AssetHoldingsResponse.md │ │ │ │ │ ├── SDKs:javascript:classes:indexerModels.AssetParams.md │ │ │ │ │ ├── SDKs:javascript:classes:indexerModels.AssetResponse.md │ │ │ │ │ ├── SDKs:javascript:classes:indexerModels.AssetsResponse.md │ │ │ │ │ ├── SDKs:javascript:classes:indexerModels.Block.md │ │ │ │ │ ├── SDKs:javascript:classes:indexerModels.BlockRewards.md │ │ │ │ │ ├── SDKs:javascript:classes:indexerModels.BlockUpgradeState.md │ │ │ │ │ ├── SDKs:javascript:classes:indexerModels.BlockUpgradeVote.md │ │ │ │ │ ├── SDKs:javascript:classes:indexerModels.Box.md │ │ │ │ │ ├── SDKs:javascript:classes:indexerModels.BoxDescriptor.md │ │ │ │ │ ├── SDKs:javascript:classes:indexerModels.BoxesResponse.md │ │ │ │ │ ├── SDKs:javascript:classes:indexerModels.ErrorResponse.md │ │ │ │ │ ├── SDKs:javascript:classes:indexerModels.EvalDelta.md │ │ │ │ │ ├── SDKs:javascript:classes:indexerModels.EvalDeltaKeyValue.md │ │ │ │ │ ├── SDKs:javascript:classes:indexerModels.HashFactory.md │ │ │ │ │ ├── SDKs:javascript:classes:indexerModels.HealthCheck.md │ │ │ │ │ ├── SDKs:javascript:classes:indexerModels.IndexerStateProofMessage.md │ │ │ │ │ ├── SDKs:javascript:classes:indexerModels.MerkleArrayProof.md │ │ │ │ │ ├── SDKs:javascript:classes:indexerModels.MiniAssetHolding.md │ │ │ │ │ ├── SDKs:javascript:classes:indexerModels.ParticipationUpdates.md │ │ │ │ │ ├── SDKs:javascript:classes:indexerModels.StateProofFields.md │ │ │ │ │ ├── SDKs:javascript:classes:indexerModels.StateProofParticipant.md │ │ │ │ │ ├── SDKs:javascript:classes:indexerModels.StateProofReveal.md │ │ │ │ │ ├── SDKs:javascript:classes:indexerModels.StateProofSignature.md │ │ │ │ │ ├── SDKs:javascript:classes:indexerModels.StateProofSigSlot.md │ │ │ │ │ ├── SDKs:javascript:classes:indexerModels.StateProofTracking.md │ │ │ │ │ ├── SDKs:javascript:classes:indexerModels.StateProofVerifier.md │ │ │ │ │ ├── SDKs:javascript:classes:indexerModels.StateSchema.md │ │ │ │ │ ├── SDKs:javascript:classes:indexerModels.TealKeyValue.md │ │ │ │ │ ├── SDKs:javascript:classes:indexerModels.TealValue.md │ │ │ │ │ ├── SDKs:javascript:classes:indexerModels.Transaction.md │ │ │ │ │ ├── SDKs:javascript:classes:indexerModels.TransactionApplication.md │ │ │ │ │ ├── SDKs:javascript:classes:indexerModels.TransactionAssetConfig.md │ │ │ │ │ ├── SDKs:javascript:classes:indexerModels.TransactionAssetFreeze.md │ │ │ │ │ ├── SDKs:javascript:classes:indexerModels.TransactionAssetTransfer.md │ │ │ │ │ ├── SDKs:javascript:classes:indexerModels.TransactionKeyreg.md │ │ │ │ │ ├── SDKs:javascript:classes:indexerModels.TransactionPayment.md │ │ │ │ │ ├── SDKs:javascript:classes:indexerModels.TransactionResponse.md │ │ │ │ │ ├── SDKs:javascript:classes:indexerModels.TransactionSignature.md │ │ │ │ │ ├── SDKs:javascript:classes:indexerModels.TransactionSignatureLogicsig.md │ │ │ │ │ ├── SDKs:javascript:classes:indexerModels.TransactionSignatureMultisig.md │ │ │ │ │ ├── SDKs:javascript:classes:indexerModels.TransactionSignatureMultisigSubsignature.md │ │ │ │ │ ├── SDKs:javascript:classes:indexerModels.TransactionsResponse.md │ │ │ │ │ ├── SDKs:javascript:classes:indexerModels.TransactionStateProof.md │ │ │ │ │ ├── SDKs:javascript:classes:Kmd.md │ │ │ │ │ ├── SDKs:javascript:classes:LogicSig.md │ │ │ │ │ ├── SDKs:javascript:classes:LogicSigAccount.md │ │ │ │ │ ├── SDKs:javascript:classes:modelsv2.Account.md │ │ │ │ │ ├── SDKs:javascript:classes:modelsv2.AccountApplicationResponse.md │ │ │ │ │ ├── SDKs:javascript:classes:modelsv2.AccountAssetHolding.md │ │ │ │ │ ├── SDKs:javascript:classes:modelsv2.AccountAssetResponse.md │ │ │ │ │ ├── SDKs:javascript:classes:modelsv2.AccountAssetsInformationResponse.md │ │ │ │ │ ├── SDKs:javascript:classes:modelsv2.AccountParticipation.md │ │ │ │ │ ├── SDKs:javascript:classes:modelsv2.AccountStateDelta.md │ │ │ │ │ ├── SDKs:javascript:classes:modelsv2.AppCallLogs.md │ │ │ │ │ ├── SDKs:javascript:classes:modelsv2.Application.md │ │ │ │ │ ├── SDKs:javascript:classes:modelsv2.ApplicationInitialStates.md │ │ │ │ │ ├── SDKs:javascript:classes:modelsv2.ApplicationKVStorage.md │ │ │ │ │ ├── SDKs:javascript:classes:modelsv2.ApplicationLocalReference.md │ │ │ │ │ ├── SDKs:javascript:classes:modelsv2.ApplicationLocalState.md │ │ │ │ │ ├── SDKs:javascript:classes:modelsv2.ApplicationParams.md │ │ │ │ │ ├── SDKs:javascript:classes:modelsv2.ApplicationStateOperation.md │ │ │ │ │ ├── SDKs:javascript:classes:modelsv2.ApplicationStateSchema.md │ │ │ │ │ ├── SDKs:javascript:classes:modelsv2.Asset.md │ │ │ │ │ ├── SDKs:javascript:classes:modelsv2.AssetHolding.md │ │ │ │ │ ├── SDKs:javascript:classes:modelsv2.AssetHoldingReference.md │ │ │ │ │ ├── SDKs:javascript:classes:modelsv2.AssetParams.md │ │ │ │ │ ├── SDKs:javascript:classes:modelsv2.AvmKeyValue.md │ │ │ │ │ ├── SDKs:javascript:classes:modelsv2.AvmValue.md │ │ │ │ │ ├── SDKs:javascript:classes:modelsv2.BlockHashResponse.md │ │ │ │ │ ├── SDKs:javascript:classes:modelsv2.BlockLogsResponse.md │ │ │ │ │ ├── SDKs:javascript:classes:modelsv2.BlockResponse.md │ │ │ │ │ ├── SDKs:javascript:classes:modelsv2.BlockTxidsResponse.md │ │ │ │ │ ├── SDKs:javascript:classes:modelsv2.Box.md │ │ │ │ │ ├── SDKs:javascript:classes:modelsv2.BoxDescriptor.md │ │ │ │ │ ├── SDKs:javascript:classes:modelsv2.BoxesResponse.md │ │ │ │ │ ├── SDKs:javascript:classes:modelsv2.BoxReference.md │ │ │ │ │ ├── SDKs:javascript:classes:modelsv2.BuildVersion.md │ │ │ │ │ ├── SDKs:javascript:classes:modelsv2.CompileResponse.md │ │ │ │ │ ├── SDKs:javascript:classes:modelsv2.DisassembleResponse.md │ │ │ │ │ ├── SDKs:javascript:classes:modelsv2.DryrunRequest.md │ │ │ │ │ ├── SDKs:javascript:classes:modelsv2.DryrunResponse.md │ │ │ │ │ ├── SDKs:javascript:classes:modelsv2.DryrunSource.md │ │ │ │ │ ├── SDKs:javascript:classes:modelsv2.DryrunState.md │ │ │ │ │ ├── SDKs:javascript:classes:modelsv2.DryrunTxnResult.md │ │ │ │ │ ├── SDKs:javascript:classes:modelsv2.ErrorResponse.md │ │ │ │ │ ├── SDKs:javascript:classes:modelsv2.EvalDelta.md │ │ │ │ │ ├── SDKs:javascript:classes:modelsv2.EvalDeltaKeyValue.md │ │ │ │ │ ├── SDKs:javascript:classes:modelsv2.GetBlockTimeStampOffsetResponse.md │ │ │ │ │ ├── SDKs:javascript:classes:modelsv2.GetSyncRoundResponse.md │ │ │ │ │ ├── SDKs:javascript:classes:modelsv2.KvDelta.md │ │ │ │ │ ├── SDKs:javascript:classes:modelsv2.LedgerStateDeltaForTransactionGroup.md │ │ │ │ │ ├── SDKs:javascript:classes:modelsv2.LightBlockHeaderProof.md │ │ │ │ │ ├── SDKs:javascript:classes:modelsv2.NodeStatusResponse.md │ │ │ │ │ ├── SDKs:javascript:classes:modelsv2.PendingTransactionResponse.md │ │ │ │ │ ├── SDKs:javascript:classes:modelsv2.PendingTransactionsResponse.md │ │ │ │ │ ├── SDKs:javascript:classes:modelsv2.PostTransactionsResponse.md │ │ │ │ │ ├── SDKs:javascript:classes:modelsv2.ScratchChange.md │ │ │ │ │ ├── SDKs:javascript:classes:modelsv2.SimulateInitialStates.md │ │ │ │ │ ├── SDKs:javascript:classes:modelsv2.SimulateRequest.md │ │ │ │ │ ├── SDKs:javascript:classes:modelsv2.SimulateRequestTransactionGroup.md │ │ │ │ │ ├── SDKs:javascript:classes:modelsv2.SimulateResponse.md │ │ │ │ │ ├── SDKs:javascript:classes:modelsv2.SimulateTraceConfig.md │ │ │ │ │ ├── SDKs:javascript:classes:modelsv2.SimulateTransactionGroupResult.md │ │ │ │ │ ├── SDKs:javascript:classes:modelsv2.SimulateTransactionResult.md │ │ │ │ │ ├── SDKs:javascript:classes:modelsv2.SimulateUnnamedResourcesAccessed.md │ │ │ │ │ ├── SDKs:javascript:classes:modelsv2.SimulationEvalOverrides.md │ │ │ │ │ ├── SDKs:javascript:classes:modelsv2.SimulationOpcodeTraceUnit.md │ │ │ │ │ ├── SDKs:javascript:classes:modelsv2.SimulationTransactionExecTrace.md │ │ │ │ │ ├── SDKs:javascript:classes:modelsv2.StateProof.md │ │ │ │ │ ├── SDKs:javascript:classes:modelsv2.StateProofMessage.md │ │ │ │ │ ├── SDKs:javascript:classes:modelsv2.SupplyResponse.md │ │ │ │ │ ├── SDKs:javascript:classes:modelsv2.TealKeyValue.md │ │ │ │ │ ├── SDKs:javascript:classes:modelsv2.TealValue.md │ │ │ │ │ ├── SDKs:javascript:classes:modelsv2.TransactionGroupLedgerStateDeltasForRoundResponse.md │ │ │ │ │ ├── SDKs:javascript:classes:modelsv2.TransactionParametersResponse.md │ │ │ │ │ ├── SDKs:javascript:classes:modelsv2.TransactionProofResponse.md │ │ │ │ │ ├── SDKs:javascript:classes:modelsv2.Version.md │ │ │ │ │ ├── SDKs:javascript:classes:SourceMap.md │ │ │ │ │ ├── SDKs:javascript:classes:Transaction.md │ │ │ │ │ ├── SDKs:javascript:enums:ABIReferenceType.md │ │ │ │ │ ├── SDKs:javascript:enums:ABITransactionType.md │ │ │ │ │ ├── SDKs:javascript:enums:AtomicTransactionComposerStatus.md │ │ │ │ │ ├── SDKs:javascript:enums:IntDecoding.md │ │ │ │ │ ├── SDKs:javascript:enums:OnApplicationComplete.md │ │ │ │ │ ├── SDKs:javascript:enums:TransactionType.md │ │ │ │ │ ├── SDKs:javascript:examples:README.md │ │ │ │ │ ├── SDKs:javascript:FAQ.md │ │ │ │ │ ├── SDKs:javascript:interfaces:ABIContractNetworkInfo.md │ │ │ │ │ ├── SDKs:javascript:interfaces:ABIContractNetworks.md │ │ │ │ │ ├── SDKs:javascript:interfaces:ABIContractParams.md │ │ │ │ │ ├── SDKs:javascript:interfaces:ABIInterfaceParams.md │ │ │ │ │ ├── SDKs:javascript:interfaces:ABIMethodArgParams.md │ │ │ │ │ ├── SDKs:javascript:interfaces:ABIMethodParams.md │ │ │ │ │ ├── SDKs:javascript:interfaces:ABIMethodReturnParams.md │ │ │ │ │ ├── SDKs:javascript:interfaces:ABIResult.md │ │ │ │ │ ├── SDKs:javascript:interfaces:Account.md │ │ │ │ │ ├── SDKs:javascript:interfaces:Address.md │ │ │ │ │ ├── SDKs:javascript:interfaces:AlgodTokenHeader.md │ │ │ │ │ ├── SDKs:javascript:interfaces:BaseHTTPClient.md │ │ │ │ │ ├── SDKs:javascript:interfaces:BaseHTTPClientError.md │ │ │ │ │ ├── SDKs:javascript:interfaces:BaseHTTPClientResponse.md │ │ │ │ │ ├── SDKs:javascript:interfaces:BoxReference.md │ │ │ │ │ ├── SDKs:javascript:interfaces:CustomTokenHeader.md │ │ │ │ │ ├── SDKs:javascript:interfaces:EncodedAssetParams.md │ │ │ │ │ ├── SDKs:javascript:interfaces:EncodedBoxReference.md │ │ │ │ │ ├── SDKs:javascript:interfaces:EncodedGlobalStateSchema.md │ │ │ │ │ ├── SDKs:javascript:interfaces:EncodedLocalStateSchema.md │ │ │ │ │ ├── SDKs:javascript:interfaces:EncodedLogicSig.md │ │ │ │ │ ├── SDKs:javascript:interfaces:EncodedLogicSigAccount.md │ │ │ │ │ ├── SDKs:javascript:interfaces:EncodedMultisig.md │ │ │ │ │ ├── SDKs:javascript:interfaces:EncodedSignedTransaction.md │ │ │ │ │ ├── SDKs:javascript:interfaces:EncodedSubsig.md │ │ │ │ │ ├── SDKs:javascript:interfaces:EncodedTransaction.md │ │ │ │ │ ├── SDKs:javascript:interfaces:IndexerTokenHeader.md │ │ │ │ │ ├── SDKs:javascript:interfaces:KMDTokenHeader.md │ │ │ │ │ ├── SDKs:javascript:interfaces:MultisigMetadata.md │ │ │ │ │ ├── SDKs:javascript:interfaces:SignedTransaction.md │ │ │ │ │ ├── SDKs:javascript:interfaces:SuggestedParams.md │ │ │ │ │ ├── SDKs:javascript:interfaces:TransactionParams.md │ │ │ │ │ ├── SDKs:javascript:interfaces:TransactionWithSigner.md │ │ │ │ │ ├── SDKs:javascript:modules:indexerModels.md │ │ │ │ │ ├── SDKs:javascript:modules:modelsv2.md │ │ │ │ │ ├── SDKs:javascript:modules.md │ │ │ │ │ ├── SDKs:javascript:README.md │ │ │ │ │ ├── SDKs:python:algosdk:v2client:harness:README.md │ │ │ │ │ ├── SDKs:python:examples:README.md │ │ │ │ │ ├── SDKs:python:README.md │ │ │ │ │ ├── tealscript:examples_amm_README.md │ │ │ │ │ ├── tealscript:examples_auction_README.md │ │ │ │ │ ├── tealscript:examples_big_box_README.md │ │ │ │ │ ├── tealscript:examples_itxns_README.md │ │ │ │ │ ├── tealscript:examples_lsig_with_app_README.md │ │ │ │ │ ├── tealscript:examples_reti_README.md │ │ │ │ │ ├── tealscript:FEATURES.md │ │ │ │ │ ├── tealscript:guides_atomic_txn.md │ │ │ │ │ ├── tealscript:guides_features.md │ │ │ │ │ ├── tealscript:guides_getting_started.md │ │ │ │ │ ├── tealscript:guides_inner_transactions.md │ │ │ │ │ ├── tealscript:guides_lifecycle.md │ │ │ │ │ ├── tealscript:guides_math.md │ │ │ │ │ ├── tealscript:guides_methods.md │ │ │ │ │ ├── tealscript:guides_multiple_contracts.md │ │ │ │ │ ├── tealscript:guides_pyteal.md │ │ │ │ │ ├── tealscript:guides_storage.md │ │ │ │ │ ├── tealscript:guides_Supported Types_arrays.md │ │ │ │ │ ├── tealscript:guides_Supported Types_numbers.md │ │ │ │ │ ├── TEALScript:README.md │ │ │ │ │ ├── tealscript:tests_test_package_README.md │ │ │ │ │ ├── tealscript:tutorials_Hello World_0001-intro.md │ │ │ │ │ ├── tealscript:tutorials_Hello World_0002-init.md │ │ │ │ │ ├── tealscript:tutorials_Hello World_0003-contract.md │ │ │ │ │ ├── tealscript:tutorials_Hello World_0004-artifacts.md │ │ │ │ │ ├── tealscript:tutorials_Hello World_0005-hello.md │ │ │ │ │ └── tealscript:tutorials_Hello World_0006-test.md │ │ │ │ └── taxonomy-categories │ │ │ │ ├── algokit-utils.json │ │ │ │ ├── algokit.json │ │ │ │ ├── arcs.json │ │ │ │ ├── clis.json │ │ │ │ ├── details.json │ │ │ │ ├── developers.json │ │ │ │ ├── liquid-auth.json │ │ │ │ ├── nodes.json │ │ │ │ ├── puya.json │ │ │ │ ├── python.json │ │ │ │ ├── sdks.json │ │ │ │ └── tealscript.json │ │ │ └── wallet │ │ │ └── index.ts │ │ ├── tools │ │ │ ├── accountManager.ts │ │ │ ├── algodManager.ts │ │ │ ├── apiManager │ │ │ │ ├── algod │ │ │ │ │ ├── account.ts │ │ │ │ │ ├── application.ts │ │ │ │ │ ├── asset.ts │ │ │ │ │ ├── index.ts │ │ │ │ │ └── transaction.ts │ │ │ │ ├── example │ │ │ │ │ ├── get-balance.ts │ │ │ │ │ └── index.ts │ │ │ │ ├── index.ts │ │ │ │ ├── indexer │ │ │ │ │ ├── account.ts │ │ │ │ │ ├── application.ts │ │ │ │ │ ├── asset.ts │ │ │ │ │ ├── index.ts │ │ │ │ │ └── transaction.ts │ │ │ │ ├── nfd │ │ │ │ │ └── index.ts │ │ │ │ ├── tinyman │ │ │ │ │ ├── analytics.ts │ │ │ │ │ ├── bootstrap.ts │ │ │ │ │ ├── index.ts │ │ │ │ │ ├── liquidity.ts │ │ │ │ │ ├── opt_in.ts │ │ │ │ │ ├── pool.ts │ │ │ │ │ ├── remove_liquidity.ts │ │ │ │ │ └── swap.ts │ │ │ │ ├── ultrade │ │ │ │ │ ├── index.ts │ │ │ │ │ ├── market.ts │ │ │ │ │ ├── system.ts │ │ │ │ │ └── wallet.ts │ │ │ │ └── vestige │ │ │ │ ├── assets.ts │ │ │ │ ├── balances.ts │ │ │ │ ├── index.ts │ │ │ │ ├── networks.ts │ │ │ │ ├── notes.ts │ │ │ │ ├── pools.ts │ │ │ │ ├── protocols.ts │ │ │ │ ├── swaps.ts │ │ │ │ └── vaults.ts │ │ │ ├── arc26Manager.ts │ │ │ ├── index.ts │ │ │ ├── knowledgeManager.ts │ │ │ ├── transactionManager │ │ │ │ ├── accountTransactions.ts │ │ │ │ ├── appTransactions │ │ │ │ │ ├── callTxn.ts │ │ │ │ │ ├── clearTxn.ts │ │ │ │ │ ├── closeOutTxn.ts │ │ │ │ │ ├── createTxn.ts │ │ │ │ │ ├── deleteTxn.ts │ │ │ │ │ ├── index.ts │ │ │ │ │ ├── optInTxn.ts │ │ │ │ │ ├── test │ │ │ │ │ │ ├── counter_approval.teal │ │ │ │ │ │ ├── counter_clear.teal │ │ │ │ │ │ ├── storage_test_approval_v2.teal │ │ │ │ │ │ ├── storage_test_approval.teal │ │ │ │ │ │ └── storage_test_clear.teal │ │ │ │ │ ├── types.ts │ │ │ │ │ └── updateTxn.ts │ │ │ │ ├── assetTransactions.ts │ │ │ │ ├── generalTransaction.ts │ │ │ │ └── index.ts │ │ │ └── utilityManager.ts │ │ ├── types.ts │ │ └── utils │ │ └── responseProcessor.ts │ ├── tests │ │ ├── resources │ │ │ ├── algod │ │ │ │ ├── account.test.ts │ │ │ │ ├── application.test.ts │ │ │ │ ├── asset.test.ts │ │ │ │ └── transaction.test.ts │ │ │ └── indexer │ │ │ ├── account.test.ts │ │ │ ├── application.test.ts │ │ │ ├── asset.test.ts │ │ │ └── transaction.test.ts │ │ └── tools │ │ ├── accountManager.test.ts │ │ ├── algodManager.test.ts │ │ ├── apiManager │ │ │ └── example │ │ │ └── get-balance.test.ts │ │ ├── transactionManager │ │ │ ├── accountTransactionManager.test.ts │ │ │ ├── appTransactionManager.test.ts │ │ │ ├── assetTransactionManager.test.ts │ │ │ ├── generalTransactionManager.test.ts │ │ │ └── transactionManager.test.ts │ │ └── utilityManager.test.ts │ └── tsconfig.json ├── README.md ├── rename_files.sh └── tsconfig.json ``` # Files -------------------------------------------------------------------------------- /packages/server/src/resources/knowledge/taxonomy-categories/liquid-auth.json: -------------------------------------------------------------------------------- ```json { "name": "Liquid Auth", "description": "Authentication system for Algorand applications", "path": "liquid-auth", "documents": [ {"name": "README", "path": "liquid-auth:README.md"}, {"name": "Architecture", "path": "liquid-auth:ARCHITECTURE.md"}, {"name": "Vision", "path": "liquid-auth:VISION.md"}, {"name": "Sequence", "path": "liquid-auth:SEQUENCE.md"} ], "subcategories": { "decisions": { "name": "Architecture Decisions", "description": "Architecture decision records", "path": "liquid-auth:decisions", "documents": [ {"name": "Overview", "path": "liquid-auth:decisions:README.md"}, {"name": "Service Authentication", "path": "liquid-auth:decisions:1-Service-Authentication.md"}, {"name": "Bidirectional Communication", "path": "liquid-auth:decisions:2-Bidirectional-Communication.md"}, {"name": "Peer to Peer Signaling", "path": "liquid-auth:decisions:3-Peer-to-Peer-Signaling.md"}, {"name": "FIDO Extension", "path": "liquid-auth:decisions:4-Fido-Extension.md"} ] }, "docs": { "name": "Documentation", "description": "General documentation", "path": "liquid-auth:docs", "documents": [ {"name": "Overview", "path": "liquid-auth:docs:README.md"}, {"name": "Architecture", "path": "liquid-auth:docs:architecture.md"}, {"name": "Introduction", "path": "liquid-auth:docs:introduction.md"} ], "subcategories": { "clients": { "name": "Client Documentation", "description": "Client implementation guides", "path": "liquid-auth:docs:clients", "subcategories": { "browser": { "name": "Browser Client", "description": "Browser client documentation", "path": "liquid-auth:docs:clients:browser", "documents": [ {"name": "Authentication", "path": "liquid-auth:docs:clients:browser:authentication.md"}, {"name": "Example", "path": "liquid-auth:docs:clients:browser:example.md"} ] }, "android": { "name": "Android Client", "description": "Android client documentation", "path": "liquid-auth:docs:clients:android", "subcategories": { "provider-service": { "name": "Provider Service", "description": "Android provider service documentation", "path": "liquid-auth:docs:clients:android:provider-service", "documents": [ {"name": "Authentication", "path": "liquid-auth:docs:clients:android:provider-service:authenticate.md"}, {"name": "Registration", "path": "liquid-auth:docs:clients:android:provider-service:register.md"} ] } } } } }, "server": { "name": "Server Documentation", "description": "Server implementation guides", "path": "liquid-auth:docs:server", "documents": [ {"name": "Environment Variables", "path": "liquid-auth:docs:server:environment-variables.md"}, {"name": "Integrations", "path": "liquid-auth:docs:server:integrations.md"}, {"name": "Introduction", "path": "liquid-auth:docs:server:introduction.md"}, {"name": "Running Locally", "path": "liquid-auth:docs:server:running-locally.md"} ] } } }, "services": { "name": "Services", "description": "Service implementations", "path": "liquid-auth:services", "subcategories": { "api": { "name": "JavaScript API", "description": "JavaScript API implementation", "path": "liquid-auth:services:liquid-auth-api-js:src", "subcategories": { "auth": { "name": "Auth Controllers", "description": "Authentication controllers", "path": "liquid-auth:services:liquid-auth-api-js:src:auth", "documents": [ {"name": "Get User", "path": "liquid-auth:services:liquid-auth-api-js:src:auth:auth.controller.get.user.md"} ] }, "assertion": { "name": "Assertion Controllers", "description": "Assertion controllers", "path": "liquid-auth:services:liquid-auth-api-js:src:assertion", "documents": [ {"name": "Request", "path": "liquid-auth:services:liquid-auth-api-js:src:assertion:assertion.controller.post.request.md"}, {"name": "Response", "path": "liquid-auth:services:liquid-auth-api-js:src:assertion:assertion.controller.post.response.md"} ] }, "attestation": { "name": "Attestation Controllers", "description": "Attestation controllers", "path": "liquid-auth:services:liquid-auth-api-js:src:attestation", "documents": [ {"name": "Request", "path": "liquid-auth:services:liquid-auth-api-js:src:attestation:attestation.controller.post.request.md"} ] } } } } }, "sites": { "name": "Example Sites", "description": "Example implementations", "path": "liquid-auth:sites", "documents": [ {"name": "Express dApp", "path": "liquid-auth:sites:express-dapp:README.md"} ] } } } ``` -------------------------------------------------------------------------------- /packages/server/src/tools/transactionManager/appTransactions/createTxn.ts: -------------------------------------------------------------------------------- ```typescript import { Transaction, makeApplicationCreateTxnFromObject, OnApplicationComplete } from 'algosdk'; import { McpError, ErrorCode } from '@modelcontextprotocol/sdk/types.js'; import { AppCreateTxnParams } from './types.js'; /** * Creates an application creation transaction * @param params The parameters for creating the application * @returns The created transaction * @throws {McpError} If the transaction creation fails */ export function makeApplicationCreateTxn(params: AppCreateTxnParams): Transaction { try { // Validate schema parameters if (typeof params.numGlobalInts !== 'number' || params.numGlobalInts < 0) { throw new Error('Invalid numGlobalInts'); } if (typeof params.numGlobalByteSlices !== 'number' || params.numGlobalByteSlices < 0) { throw new Error('Invalid numGlobalByteSlices'); } if (typeof params.numLocalInts !== 'number' || params.numLocalInts < 0) { throw new Error('Invalid numLocalInts'); } if (typeof params.numLocalByteSlices !== 'number' || params.numLocalByteSlices < 0) { throw new Error('Invalid numLocalByteSlices'); } // Create a new object with the required structure const txnParams = { from: params.from, approvalProgram: params.approvalProgram, clearProgram: params.clearProgram, suggestedParams: params.suggestedParams, note: params.note, lease: params.lease, rekeyTo: params.rekeyTo, appArgs: params.appArgs, accounts: params.accounts, foreignApps: params.foreignApps, foreignAssets: params.foreignAssets, boxes: params.boxes, extraPages: params.extraPages, onComplete: OnApplicationComplete.NoOpOC, // Schema parameters numGlobalInts: params.numGlobalInts, numGlobalByteSlices: params.numGlobalByteSlices, numLocalInts: params.numLocalInts, numLocalByteSlices: params.numLocalByteSlices }; return makeApplicationCreateTxnFromObject(txnParams); } catch (error) { console.error('[MCP Error] Failed to create application transaction:', error); throw new McpError( ErrorCode.InternalError, `Failed to create application transaction: ${error instanceof Error ? error.message : 'Unknown error'}` ); } } /** * Handles the application creation tool request * @param args The tool arguments * @param suggestedParams The suggested transaction parameters * @returns The transaction parameters * @throws {McpError} If the parameters are invalid */ export function handleCreateTxn(args: Record<string, unknown>, suggestedParams: any): Record<string, any> { try { if (!args.from || !args.approvalProgram || !args.clearProgram || typeof args.numGlobalInts !== 'number' || typeof args.numGlobalByteSlices !== 'number' || typeof args.numLocalInts !== 'number' || typeof args.numLocalByteSlices !== 'number') { console.error('[MCP Error] Invalid application creation parameters'); throw new McpError(ErrorCode.InvalidParams, 'Invalid application creation parameters'); } // Create transaction with proper parameter handling const txnParams: Record<string, any> = { from: String(args.from), fee: suggestedParams.fee, firstRound: suggestedParams.firstRound, lastRound: suggestedParams.lastRound, genesisID: suggestedParams.genesisID, genesisHash: suggestedParams.genesisHash, type: 'appl', onComplete: OnApplicationComplete.NoOpOC, // Schema parameters numGlobalInts: Number(args.numGlobalInts), numGlobalByteSlices: Number(args.numGlobalByteSlices), numLocalInts: Number(args.numLocalInts), numLocalByteSlices: Number(args.numLocalByteSlices) }; // Handle required program fields - keep as base64 strings txnParams.approvalProgram = args.approvalProgram as string; txnParams.clearProgram = args.clearProgram as string; // Handle optional fields if (typeof args.extraPages === 'number') { txnParams.extraPages = args.extraPages; } if (typeof args.note === 'string') { const noteBytes = new TextEncoder().encode(args.note); txnParams.note = Buffer.from(noteBytes).toString('base64'); } if (typeof args.lease === 'string') { const leaseBytes = new TextEncoder().encode(args.lease); txnParams.lease = Buffer.from(leaseBytes).toString('base64'); } if (typeof args.rekeyTo === 'string') { txnParams.rekeyTo = String(args.rekeyTo); } if (Array.isArray(args.appArgs)) { txnParams.appArgs = args.appArgs.map(arg => { const bytes = new TextEncoder().encode(String(arg)); return Buffer.from(bytes).toString('base64'); }); } if (Array.isArray(args.accounts)) { txnParams.accounts = args.accounts.filter((acc): acc is string => typeof acc === 'string'); } if (Array.isArray(args.foreignApps)) { txnParams.foreignApps = args.foreignApps.filter((app): app is number => typeof app === 'number'); } if (Array.isArray(args.foreignAssets)) { txnParams.foreignAssets = args.foreignAssets.filter((asset): asset is number => typeof asset === 'number'); } return txnParams; } catch (error) { if (error instanceof McpError) { throw error; } console.error('[MCP Error] Failed to handle application creation:', error); throw new McpError( ErrorCode.InternalError, `Failed to handle application creation: ${error instanceof Error ? error.message : 'Unknown error'}` ); } } ``` -------------------------------------------------------------------------------- /packages/server/src/resources/knowledge/taxonomy/algokit:utils:typescript:code:classes:types_config.UpdatableConfig.md: -------------------------------------------------------------------------------- ```markdown [@algorandfoundation/algokit-utils](../README.md) / [types/config](../modules/types_config.md) / UpdatableConfig # Class: UpdatableConfig [types/config](../modules/types_config.md).UpdatableConfig Updatable AlgoKit config ## Implements - `Readonly`\<[`Config`](../interfaces/types_config.Config.md)\> ## Table of contents ### Constructors - [constructor](types_config.UpdatableConfig.md#constructor) ### Properties - [config](types_config.UpdatableConfig.md#config) ### Accessors - [debug](types_config.UpdatableConfig.md#debug) - [events](types_config.UpdatableConfig.md#events) - [logger](types_config.UpdatableConfig.md#logger) - [maxSearchDepth](types_config.UpdatableConfig.md#maxsearchdepth) - [populateAppCallResources](types_config.UpdatableConfig.md#populateappcallresources) - [projectRoot](types_config.UpdatableConfig.md#projectroot) - [traceAll](types_config.UpdatableConfig.md#traceall) - [traceBufferSizeMb](types_config.UpdatableConfig.md#tracebuffersizemb) ### Methods - [configure](types_config.UpdatableConfig.md#configure) - [getLogger](types_config.UpdatableConfig.md#getlogger) - [withDebug](types_config.UpdatableConfig.md#withdebug) ## Constructors ### constructor • **new UpdatableConfig**(): [`UpdatableConfig`](types_config.UpdatableConfig.md) #### Returns [`UpdatableConfig`](types_config.UpdatableConfig.md) #### Defined in [src/types/config.ts:90](https://github.com/algorandfoundation/algokit-utils-ts/blob/main/src/types/config.ts#L90) ## Properties ### config • `Private` **config**: [`Config`](../interfaces/types_config.Config.md) #### Defined in [src/types/config.ts:29](https://github.com/algorandfoundation/algokit-utils-ts/blob/main/src/types/config.ts#L29) ## Accessors ### debug • `get` **debug**(): `boolean` #### Returns `boolean` #### Implementation of Readonly.debug #### Defined in [src/types/config.ts:39](https://github.com/algorandfoundation/algokit-utils-ts/blob/main/src/types/config.ts#L39) ___ ### events • `get` **events**(): [`AsyncEventEmitter`](types_async_event_emitter.AsyncEventEmitter.md) #### Returns [`AsyncEventEmitter`](types_async_event_emitter.AsyncEventEmitter.md) #### Implementation of Readonly.events #### Defined in [src/types/config.ts:59](https://github.com/algorandfoundation/algokit-utils-ts/blob/main/src/types/config.ts#L59) ___ ### logger • `get` **logger**(): [`Logger`](../modules/types_logging.md#logger) #### Returns [`Logger`](../modules/types_logging.md#logger) #### Implementation of Readonly.logger #### Defined in [src/types/config.ts:35](https://github.com/algorandfoundation/algokit-utils-ts/blob/main/src/types/config.ts#L35) ___ ### maxSearchDepth • `get` **maxSearchDepth**(): `number` #### Returns `number` #### Implementation of Readonly.maxSearchDepth #### Defined in [src/types/config.ts:55](https://github.com/algorandfoundation/algokit-utils-ts/blob/main/src/types/config.ts#L55) ___ ### populateAppCallResources • `get` **populateAppCallResources**(): `boolean` #### Returns `boolean` #### Implementation of Readonly.populateAppCallResources #### Defined in [src/types/config.ts:31](https://github.com/algorandfoundation/algokit-utils-ts/blob/main/src/types/config.ts#L31) ___ ### projectRoot • `get` **projectRoot**(): ``null`` \| `string` #### Returns ``null`` \| `string` #### Implementation of Readonly.projectRoot #### Defined in [src/types/config.ts:43](https://github.com/algorandfoundation/algokit-utils-ts/blob/main/src/types/config.ts#L43) ___ ### traceAll • `get` **traceAll**(): `boolean` #### Returns `boolean` #### Implementation of Readonly.traceAll #### Defined in [src/types/config.ts:47](https://github.com/algorandfoundation/algokit-utils-ts/blob/main/src/types/config.ts#L47) ___ ### traceBufferSizeMb • `get` **traceBufferSizeMb**(): `number` #### Returns `number` #### Implementation of Readonly.traceBufferSizeMb #### Defined in [src/types/config.ts:51](https://github.com/algorandfoundation/algokit-utils-ts/blob/main/src/types/config.ts#L51) ## Methods ### configure ▸ **configure**(`newConfig`): `void` Update the AlgoKit configuration with your own configuration settings #### Parameters | Name | Type | Description | | :------ | :------ | :------ | | `newConfig` | `Partial`\<[`Config`](../interfaces/types_config.Config.md)\> | Partial or complete config to replace | #### Returns `void` #### Defined in [src/types/config.ts:107](https://github.com/algorandfoundation/algokit-utils-ts/blob/main/src/types/config.ts#L107) ___ ### getLogger ▸ **getLogger**(`returnNullLogger?`): [`Logger`](../modules/types_logging.md#logger) Returns the current logger, or the null logger if true is passed in to `returnNullLogger` #### Parameters | Name | Type | Description | | :------ | :------ | :------ | | `returnNullLogger?` | `boolean` | Whether or not to return the null logger | #### Returns [`Logger`](../modules/types_logging.md#logger) The requested logger #### Defined in [src/types/config.ts:68](https://github.com/algorandfoundation/algokit-utils-ts/blob/main/src/types/config.ts#L68) ___ ### withDebug ▸ **withDebug**(`lambda`): `void` Temporarily run with debug set to true. #### Parameters | Name | Type | Description | | :------ | :------ | :------ | | `lambda` | () => `unknown` | A lambda expression with code to run with debug config set to true | #### Returns `void` #### Defined in [src/types/config.ts:80](https://github.com/algorandfoundation/algokit-utils-ts/blob/main/src/types/config.ts#L80) ``` -------------------------------------------------------------------------------- /llms.txt: -------------------------------------------------------------------------------- ``` # llms.txt - Optimized Documentation for AI Developer Tools project_name: algorand-mcp version: 2.7.6 description: Model Context Protocol (MCP) server for Algorand blockchain interactions, providing tools and resources for account management, asset operations, application interactions, and transaction handling base_url: https://github.com/GoPlausible/algorand-mcp docs_url: https://github.com/GoPlausible/algorand-mcp/blob/main/packages/server/README.md # API Endpoints ## Tools ### Transaction Tools - /tools/transaction/account - make_payment_txn - Create payment transactions - make_keyreg_txn - Create key registration transactions - /tools/transaction/asset - make_asset_create_txn - Create new assets - make_asset_config_txn - Modify asset configuration - make_asset_destroy_txn - Remove assets - make_asset_freeze_txn - Freeze/unfreeze assets - make_asset_transfer_txn - Transfer assets between accounts - /tools/transaction/application - make_app_create_txn - Deploy new applications - make_app_update_txn - Update application code - make_app_delete_txn - Remove applications - make_app_optin_txn - Opt into applications - make_app_closeout_txn - Close out from applications - make_app_clear_txn - Clear application state - make_app_call_txn - Call application methods - /tools/transaction/general - assign_group_id - Assign group ID to transactions - sign_transaction - Sign transactions - sign_bytes - Sign arbitrary bytes - encode_obj - Encode objects to msgpack - decode_obj - Decode msgpack to objects ### API Tools - /tools/algod - api_algod_get_account_info - Get account information - api_algod_get_account_application_info - Get account's application info - api_algod_get_account_asset_info - Get account's asset info - api_algod_get_application_by_id - Get application information - api_algod_get_application_box - Get application box - api_algod_get_application_boxes - Get all application boxes - api_algod_get_asset_by_id - Get asset information - api_algod_get_pending_transaction - Get pending transaction - api_algod_get_pending_transactions - Get all pending transactions - api_algod_get_transaction_params - Get suggested parameters - api_algod_get_node_status - Get node status - /tools/indexer - api_indexer_lookup_account_by_id - Get account details - api_indexer_lookup_account_assets - Get account assets - api_indexer_lookup_account_created_applications - Get created apps - api_indexer_lookup_applications - Get application info - api_indexer_lookup_asset_by_id - Get asset details - api_indexer_lookup_asset_balances - Get asset holders - api_indexer_search_for_transactions - Search transactions - api_indexer_lookup_transaction_by_id - Get transaction details ### Utility Tools - /tools/utility - validate_address - Validate Algorand addresses - encode_address - Encode public key to address - decode_address - Decode address to public key - get_application_address - Get app address from ID - bytes_to_bigint - Convert bytes to BigInt - bigint_to_bytes - Convert BigInt to bytes - encode_uint64 - Encode uint64 to bytes - decode_uint64 - Decode bytes to uint64 ### ARC-26 Tools - /tools/arc26 - generate_algorand_uri - Generate Algorand URI - generate_qr_code - Generate QR code for URI ## Resources ### Wallet Resources - algorand://wallet/secretkey - Secret key of the wallet in hex format - algorand://wallet/publickey - Public key of the wallet in hex format - algorand://wallet/mnemonic - Mnemonic phrase of the wallet - algorand://wallet/address - Algorand address of the wallet - algorand://wallet/account - Algorand account balance and asset holdings - algorand://wallet/assets - Asset holdings for Wallet account ### Knowledge Resources - algorand://knowledge/taxonomy - Full knowledge taxonomy - algorand://knowledge/taxonomy/arcs - Algorand Request for Comments (ARCs) - algorand://knowledge/taxonomy/sdks - Software Development Kits documentation - algorand://knowledge/taxonomy/algokit - AlgoKit development tools and CLI - algorand://knowledge/taxonomy/algokit-utils - AlgoKit utility libraries - algorand://knowledge/taxonomy/tealscript - TEALScript smart contract language - algorand://knowledge/taxonomy/puya - Puya smart contract language - algorand://knowledge/taxonomy/liquid-auth - Liquid authentication system - algorand://knowledge/taxonomy/python - Python development resources - algorand://knowledge/taxonomy/developers - Comprehensive developer documentation - algorand://knowledge/taxonomy/clis - CLI tools documentation - algorand://knowledge/taxonomy/nodes - Node management documentation - algorand://knowledge/taxonomy/details - Detailed technical documentation # Authentication auth_method: Environment Variables auth_details: Requires Algorand node access credentials configured via environment variables # Rate Limits rate_limit: Determined by connected Algorand node rate_limit_upgrade_url: N/A - Self-hosted # SDKs sdks: - language: JavaScript/TypeScript sdk_url: https://www.npmjs.com/package/algosdk version: 2.9.0 - language: TypeScript sdk_url: https://www.npmjs.com/package/@modelcontextprotocol/sdk version: 1.6.1 # Support support_contact: GitHub Issues support_url: https://github.com/GoPlausible/algorand-mcp/issues ``` -------------------------------------------------------------------------------- /packages/server/src/resources/knowledge/taxonomy/SDKs:javascript:classes:modelsv2.SimulateUnnamedResourcesAccessed.md: -------------------------------------------------------------------------------- ```markdown [algosdk](../README.md) / [Exports](../modules.md) / [modelsv2](../modules/modelsv2.md) / SimulateUnnamedResourcesAccessed # Class: SimulateUnnamedResourcesAccessed [modelsv2](../modules/modelsv2.md).SimulateUnnamedResourcesAccessed These are resources that were accessed by this group that would normally have caused failure, but were allowed in simulation. Depending on where this object is in the response, the unnamed resources it contains may or may not qualify for group resource sharing. If this is a field in SimulateTransactionGroupResult, the resources do qualify, but if this is a field in SimulateTransactionResult, they do not qualify. In order to make this group valid for actual submission, resources that qualify for group sharing can be made available by any transaction of the group; otherwise, resources must be placed in the same transaction which accessed them. ## Hierarchy - `default` ↳ **`SimulateUnnamedResourcesAccessed`** ## Table of contents ### Constructors - [constructor](modelsv2.SimulateUnnamedResourcesAccessed.md#constructor) ### Properties - [accounts](modelsv2.SimulateUnnamedResourcesAccessed.md#accounts) - [appLocals](modelsv2.SimulateUnnamedResourcesAccessed.md#applocals) - [apps](modelsv2.SimulateUnnamedResourcesAccessed.md#apps) - [assetHoldings](modelsv2.SimulateUnnamedResourcesAccessed.md#assetholdings) - [assets](modelsv2.SimulateUnnamedResourcesAccessed.md#assets) - [attribute\_map](modelsv2.SimulateUnnamedResourcesAccessed.md#attribute_map) - [boxes](modelsv2.SimulateUnnamedResourcesAccessed.md#boxes) - [extraBoxRefs](modelsv2.SimulateUnnamedResourcesAccessed.md#extraboxrefs) ### Methods - [get\_obj\_for\_encoding](modelsv2.SimulateUnnamedResourcesAccessed.md#get_obj_for_encoding) - [from\_obj\_for\_encoding](modelsv2.SimulateUnnamedResourcesAccessed.md#from_obj_for_encoding) ## Constructors ### constructor • **new SimulateUnnamedResourcesAccessed**(`«destructured»`) Creates a new `SimulateUnnamedResourcesAccessed` object. #### Parameters | Name | Type | | :------ | :------ | | `«destructured»` | `Object` | | › `accounts?` | `string`[] | | › `appLocals?` | [`ApplicationLocalReference`](modelsv2.ApplicationLocalReference.md)[] | | › `apps?` | (`number` \| `bigint`)[] | | › `assetHoldings?` | [`AssetHoldingReference`](modelsv2.AssetHoldingReference.md)[] | | › `assets?` | (`number` \| `bigint`)[] | | › `boxes?` | [`BoxReference`](modelsv2.BoxReference.md)[] | | › `extraBoxRefs?` | `number` \| `bigint` | #### Overrides BaseModel.constructor #### Defined in client/v2/algod/models/types.ts:4945 ## Properties ### accounts • `Optional` **accounts**: `string`[] The unnamed accounts that were referenced. The order of this array is arbitrary. #### Defined in client/v2/algod/models/types.ts:4893 ___ ### appLocals • `Optional` **appLocals**: [`ApplicationLocalReference`](modelsv2.ApplicationLocalReference.md)[] The unnamed application local states that were referenced. The order of this array is arbitrary. #### Defined in client/v2/algod/models/types.ts:4899 ___ ### apps • `Optional` **apps**: (`number` \| `bigint`)[] The unnamed applications that were referenced. The order of this array is arbitrary. #### Defined in client/v2/algod/models/types.ts:4905 ___ ### assetHoldings • `Optional` **assetHoldings**: [`AssetHoldingReference`](modelsv2.AssetHoldingReference.md)[] The unnamed asset holdings that were referenced. The order of this array is arbitrary. #### Defined in client/v2/algod/models/types.ts:4911 ___ ### assets • `Optional` **assets**: (`number` \| `bigint`)[] The unnamed assets that were referenced. The order of this array is arbitrary. #### Defined in client/v2/algod/models/types.ts:4916 ___ ### attribute\_map • **attribute\_map**: `Record`\<`string`, `string`\> #### Inherited from BaseModel.attribute\_map #### Defined in client/v2/basemodel.ts:56 ___ ### boxes • `Optional` **boxes**: [`BoxReference`](modelsv2.BoxReference.md)[] The unnamed boxes that were referenced. The order of this array is arbitrary. #### Defined in client/v2/algod/models/types.ts:4921 ___ ### extraBoxRefs • `Optional` **extraBoxRefs**: `number` \| `bigint` The number of extra box references used to increase the IO budget. This is in addition to the references defined in the input transaction group and any referenced to unnamed boxes. #### Defined in client/v2/algod/models/types.ts:4928 ## Methods ### get\_obj\_for\_encoding ▸ **get_obj_for_encoding**(`binary?`): `Record`\<`string`, `any`\> Get an object ready for encoding to either JSON or msgpack. #### Parameters | Name | Type | Default value | Description | | :------ | :------ | :------ | :------ | | `binary` | `boolean` | `false` | Use true to indicate that the encoding can handle raw binary objects (Uint8Arrays). Use false to indicate that raw binary objects should be converted to base64 strings. True should be used for objects that will be encoded with msgpack, and false should be used for objects that will be encoded with JSON. | #### Returns `Record`\<`string`, `any`\> #### Inherited from BaseModel.get\_obj\_for\_encoding #### Defined in client/v2/basemodel.ts:65 ___ ### from\_obj\_for\_encoding ▸ `Static` **from_obj_for_encoding**(`data`): [`SimulateUnnamedResourcesAccessed`](modelsv2.SimulateUnnamedResourcesAccessed.md) #### Parameters | Name | Type | | :------ | :------ | | `data` | `Record`\<`string`, `any`\> | #### Returns [`SimulateUnnamedResourcesAccessed`](modelsv2.SimulateUnnamedResourcesAccessed.md) #### Defined in client/v2/algod/models/types.ts:4983 ``` -------------------------------------------------------------------------------- /packages/server/src/resources/knowledge/taxonomy/algokit:utils:typescript:capabilities:indexer.md: -------------------------------------------------------------------------------- ```markdown # Indexer lookups / searching Indexer lookups / searching is a higher-order use case capability provided by AlgoKit Utils that builds on top of the core capabilities. It provides type-safe indexer API wrappers (no more `Record<string, any>` pain), including automatic pagination control. To see some usage examples check out the [automated tests](../../src/indexer-lookup.spec.ts). To import the indexer functions you can: ```typescript import { indexer } from '@algorandfoundation/algokit-utils' ``` All of the indexer functions require you to pass in an indexer SDK client, which you can get from [`AlgorandClient`](./algorand-client.md) via `algorand.client.indexer`. These calls are not made more easy to call by exposing via `AlgorandClient` and thus not requiring the indexer SDK client to be passed in. This is because we want to add a tiny bit of friction to using indexer, given it's an expensive API to run for node providers, the data from it can sometimes be slow and stale, and there are alternatives [that](https://github.com/algorandfoundation/algokit-subscriber-ts) [allow](https://github.com/algorand/conduit) individual projects to index subsets of chain data specific to them as a preferred option. In saying that, it's a very useful API for doing ad hoc data retrieval, writing automated tests, and many other uses. ## Indexer wrapper functions There is a subset of [indexer API calls](https://developer.algorand.org/docs/rest-apis/indexer) that are exposed as easy to use methods with correct typing exposed and automatic pagination for multi item returns. - [`indexer.lookupTransactionById(transactionId, algorand.client.indexer)`](../code/modules/index.md#lookuptransactionbyid) - Finds a transaction by ID - [`indexer.lookupAccountByAddress(accountAddress, algorand.client.indexer)`](../code/modules/index.md#lookupaccountbyaddress) - Finds an account by address - [`indexer.lookupAccountCreatedApplicationByAddress(algorand.client.indexer, address, getAll?, paginationLimit?)`](../code/modules/index.md#lookupaccountcreatedapplicationbyaddress) - Finds all applications created for an account - [`indexer.lookupAssetHoldings(algorand.client.indexer, assetId, options?, paginationLimit?)`](../code/modules/index.md#lookupassetholdings) - Finds all asset holdings for the given asset - [`indexer.searchTransactions(algorand.client.indexer, searchCriteria, paginationLimit?)`](../code/modules/index.md#searchtransactions) - Search for transactions with a given set of criteria - [`indexer.executePaginatedRequest(extractItems, buildRequest)`](../code/modules/index.md#executepaginatedrequest) - Execute the given indexer request with automatic pagination ### Search transactions example To use the `indexer.searchTransaction` method, you can follow this example as a starting point: ```typescript const transactions = await indexer.searchTransactions(algorand.client.indexer, (s) => s.txType('pay').addressRole('sender').address(myAddress), ) ``` ### Automatic pagination example To use the `indexer.executePaginatedRequest` method, you can follow this example as a starting point: ```typescript const transactions = await executePaginatedRequest( (response: TransactionSearchResults) => { return response.transactions }, (nextToken) => { let s = algorand.client.indexer.searchForTransactions().txType('pay').address(myAddress).limit(1000) if (nextToken) { s = s.nextToken(nextToken) } return s }, ) ``` It takes the first lambda to translate the raw response into the array that should keep getting appended as the pagination is followed and the second lambda constructs the request (without the `.do()` call), including populating the pagination token. ## Indexer API response types The response model type definitions for the majority of [indexer API](https://developer.algorand.org/docs/rest-apis/indexer) are exposed from the `types/indexer` namespace in AlgoKit Utils. This is so that you can have a much better experience than the default response type of `Record<string, any>` from the indexer client in `algosdk`. If there is a type you want to use that is missing feel free to [submit a pull request](https://github.com/algorandfoundation/algokit-utils-ts/pulls) to [add the type(s)](https://github.com/algorandfoundation/algokit-utils-ts/blob/main/src/types/indexer.ts). To access these types you can import them: ```typescript import { /* ... */ } '@algorandfoundation/algokit-utils/types/indexer' ``` As a general convention, the response types are named `{TypeName}Result` for a single item result and `{TypeName}Results` for a multiple item result where `{TypeName}` is: - `{Entity}Lookup` for an API call response that returns a lookup for a single entity e.g. `AssetLookupResult` - `{Entity}Search` for an API call response that searches for a type of entity e.g. `TransactionSearchResults` - The `UpperCamelCase` name of a given model type as specified in the [official documentation](https://developer.algorand.org/docs/rest-apis/indexer) for any sub-types within a response e.g. `ApplicationResult` The reason `Result/Results` is suffixed to the type is to avoid type name clashes for commonly used types from `algosdk` like `Transaction`. To use these types with an indexer call you simply need to find the right result type and cast the response from `.do()` for the call in question, e.g.: ```typescript import { TransactionLookupResult } from '@algorandfoundation/algokit-utils/types/indexer' ... const transaction = (await algorand.client.indexer.lookupTransactionByID(transactionId).do()) as TransactionLookupResult ``` ``` -------------------------------------------------------------------------------- /packages/server/src/resources/knowledge/taxonomy/ARCs:specs:arc-0079.md: -------------------------------------------------------------------------------- ```markdown --- arc: 79 title: URI scheme, App NoOp call extension description: A specification for encoding NoOp Application call Transactions in a URI format. author: MG (@emg110) discussions-to: https://github.com/algorandfoundation/ARCs/issues/319 status: Final type: Standards Track category: Interface sub-category: General created: 2024-09-11 extends: 26 --- ## Abstract NoOp calls are Generic application calls to execute the Algorand smart contract ApprovalPrograms. This URI specification proposes an extension to the base Algorand URI encoding standard ([ARC-26](./arc-0026.md)) that specifies encoding of application NoOp transactions into <a href="https://www.rfc-editor.org/rfc/rfc3986">RFC 3986</a> standard URIs. ## Specification ### General format As in [ARC-26](./arc-0026.md), URIs follow the general format for URIs as set forth in <a href="https://www.rfc-editor.org/rfc/rfc3986">RFC 3986</a>. The path component consists of an Algorand address, and the query component provides additional transaction parameters. Elements of the query component may contain characters outside the valid range. These are encoded differently depending on their expected character set. The text components (note, xnote) must first be encoded according to UTF-8, and then each octet of the corresponding UTF-8 sequence **MUST** be percent-encoded as described in RFC 3986. The binary components (args, refs, etc.) **MUST** be encoded with base64url as specified in <a href="https://www.rfc-editor.org/rfc/rfc4648.html#section-5">RFC 4648 section 5</a>. ### ABNF Grammar ``` algorandurn = "algorand://" algorandaddress [ "?" noopparams ] algorandaddress = *base32 noopparams = noopparam [ "&" noopparams ] noopparam = [ typeparam / appparam / methodparam / argparam / boxparam / assetarrayparam / accountarrayparam / apparrayparam / feeparam / otherparam ] typeparam = "type=appl" appparam = "app=" *digit methodparam = "method=" *qchar boxparam = "box=" *qbase64url argparam = "arg=" (*qchar | *digit) feeparam = "fee=" *digit accountparam = "account=" *base32 assetparam = "asset=" *digit otherparam = qchar *qchar [ "=" *qchar ] ``` - "qchar" corresponds to valid characters of an RFC 3986 URI query component, excluding the "=" and "&" characters, which this specification takes as separators. - "qbase64url" corresponds to valid characters of "base64url" encoding, as defined in <a href="https://www.rfc-editor.org/rfc/rfc4648.html#section-5">RFC 4648 section 5</a> - All params from the base [ARC-26](./arc-0026.md) standard, are supported and usable if fit the NoOp application call context (e.g. note) - As in the base [ARC-26](./arc-0026.md) standard, the scheme component ("algorand:") is case-insensitive, and implementations **MUST** accept any combination of uppercase and lowercase letters. The rest of the URI is case-sensitive, including the query parameter keys. ### Query Keys - address: Algorand address of transaction sender - type: fixed to "appl". Used to disambiguate the transaction type from the base [ARC-26](./arc-0026.md) standard and other possible extensions - app: The first reference is set to specify the called application (Algorand Smart Contract) ID and is mandatory. Additional references are optional and will be used in the Application NoOp call's foreign applications array. - method: Specify the full method expression (e.g "example_method(uint64,uint64)void"). - arg: specify args used for calling NoOp method, to be encoded within URI. - box: Box references to be used in Application NoOp method call box array. - asset: Asset reference to be used in Application NoOp method call foreign assets array. - account: Account or nfd address to be used in Application NoOp method call foreign accounts array. - fee: Optional. An optional static fee to set for the transaction in microAlgos. - (others): optional, for future extensions Note 1: If the fee is omitted , it means that Minimum Fee is preferred to be used for transaction. ### Template URI vs actionable URI If the URI is constructed so that other dApps, wallets or protocols could use it with their runtime Algorand entities of interest, then : - The placeholder account/app address in URI **MUST** be ZeroAddress ("AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAY5HFKQ"). Since ZeroAddress cannot initiate any action this approach is considered non-vulnerable and secure. ### Example Call claim(uint64,uint64)byte[] method on contract 11111111 paying a fee of 10000 micro ALGO from an specific address ``` algorand://TMTAD6N22HCS2LKH7677L2KFLT3PAQWY6M4JFQFXQS32ECBFC23F57RYX4?type=appl&app=11111111&method=claim(uint64,uint64)byte[]&arg=20000&arg=474567&asset=45&fee=10000 ``` Call the same claim(uint64,uint64)byte[] method on contract 11111111 paying a default 1000 micro algo fee ``` algorand://TMTAD6N22HCS2LKH7677L2KFLT3PAQWY6M4JFQFXQS32ECBFC23F57RYX4?type=appl&app=11111111&method=claim(uint64,uint64)byte[]&arg=20000&arg=474567&asset=45&app=22222222&app=33333333 ``` ## Rationale Algorand application NoOp method calls cover the majority of application transactions in Algorand and have a wide range of use-cases. For use-cases where the runtime knows exactly what the called application needs in terms of arguments and transaction arrays and there are no direct interactions, this extension will be required since ARC-26 standard does not currently support application calls. ## Security Considerations None. ## Copyright Copyright and related rights waived via <a href="https://creativecommons.org/publicdomain/zero/1.0/">CCO</a>. ``` -------------------------------------------------------------------------------- /packages/server/src/resources/knowledge/taxonomy/algokit:utils:typescript:code:modules:index.indexer.md: -------------------------------------------------------------------------------- ```markdown [@algorandfoundation/algokit-utils](../README.md) / [index](index.md) / indexer # Namespace: indexer [index](index.md).indexer ## Table of contents ### Type Aliases - [SearchForTransactions](index.indexer.md#searchfortransactions) ### Functions - [executePaginatedRequest](index.indexer.md#executepaginatedrequest) - [lookupAccountByAddress](index.indexer.md#lookupaccountbyaddress) - [lookupAccountCreatedApplicationByAddress](index.indexer.md#lookupaccountcreatedapplicationbyaddress) - [lookupAssetHoldings](index.indexer.md#lookupassetholdings) - [lookupTransactionById](index.indexer.md#lookuptransactionbyid) - [searchTransactions](index.indexer.md#searchtransactions) ## Type Aliases ### SearchForTransactions Ƭ **SearchForTransactions**: `ReturnType`\<`Indexer`[``"searchForTransactions"``]\> #### Defined in [src/indexer-lookup.ts:4](https://github.com/algorandfoundation/algokit-utils-ts/blob/main/src/indexer-lookup.ts#L4) ## Functions ### executePaginatedRequest ▸ **executePaginatedRequest**\<`TResult`, `TRequest`\>(`extractItems`, `buildRequest`): `Promise`\<`TResult`[]\> #### Type parameters | Name | Type | | :------ | :------ | | `TResult` | `TResult` | | `TRequest` | extends `Object` | #### Parameters | Name | Type | | :------ | :------ | | `extractItems` | (`response`: `any`) => `TResult`[] | | `buildRequest` | (`nextToken?`: `string`) => `TRequest` | #### Returns `Promise`\<`TResult`[]\> #### Defined in [src/indexer-lookup.ts:145](https://github.com/algorandfoundation/algokit-utils-ts/blob/main/src/indexer-lookup.ts#L145) ___ ### lookupAccountByAddress ▸ **lookupAccountByAddress**(`accountAddress`, `indexer`): `Promise`\<`AccountResponse`\> #### Parameters | Name | Type | Description | | :------ | :------ | :------ | | `accountAddress` | `string` \| `Address` | The address of the account to look up | | `indexer` | `IndexerClient` | An indexer client | #### Returns `Promise`\<`AccountResponse`\> The result of the look-up **`Deprecated`** Use `indexer.lookupAccountByID(accountAddress).do()`. Looks up an account by address using Indexer. #### Defined in [src/indexer-lookup.ts:26](https://github.com/algorandfoundation/algokit-utils-ts/blob/main/src/indexer-lookup.ts#L26) ___ ### lookupAccountCreatedApplicationByAddress ▸ **lookupAccountCreatedApplicationByAddress**(`indexer`, `address`, `getAll?`, `paginationLimit?`): `Promise`\<`algosdk.indexerModels.Application`[]\> Looks up applications that were created by the given address; will automatically paginate through all data. #### Parameters | Name | Type | Default value | Description | | :------ | :------ | :------ | :------ | | `indexer` | `IndexerClient` | `undefined` | An indexer instance | | `address` | `string` \| `Address` | `undefined` | The address of the creator to look up | | `getAll` | `undefined` \| `boolean` | `undefined` | Whether or not to include deleted applications | | `paginationLimit?` | `number` | `undefined` | The number of records to return per paginated request, default 1000 | #### Returns `Promise`\<`algosdk.indexerModels.Application`[]\> The list of application results #### Defined in [src/indexer-lookup.ts:38](https://github.com/algorandfoundation/algokit-utils-ts/blob/main/src/indexer-lookup.ts#L38) ___ ### lookupAssetHoldings ▸ **lookupAssetHoldings**(`indexer`, `assetId`, `options?`, `paginationLimit?`): `Promise`\<`algosdk.indexerModels.MiniAssetHolding`[]\> Looks up asset holdings for the given asset; will automatically paginate through all data. #### Parameters | Name | Type | Description | | :------ | :------ | :------ | | `indexer` | `IndexerClient` | An indexer instance | | `assetId` | `number` \| `bigint` | The ID of the asset to look up holdings for | | `options?` | [`LookupAssetHoldingsOptions`](../interfaces/types_indexer.LookupAssetHoldingsOptions.md) | Optional options to control the lookup | | `paginationLimit?` | `number` | The number of records to return per paginated request, default 1000 | #### Returns `Promise`\<`algosdk.indexerModels.MiniAssetHolding`[]\> The list of application results #### Defined in [src/indexer-lookup.ts:72](https://github.com/algorandfoundation/algokit-utils-ts/blob/main/src/indexer-lookup.ts#L72) ___ ### lookupTransactionById ▸ **lookupTransactionById**(`transactionId`, `indexer`): `Promise`\<`TransactionResponse`\> #### Parameters | Name | Type | Description | | :------ | :------ | :------ | | `transactionId` | `string` | The ID of the transaction to look up | | `indexer` | `IndexerClient` | An indexer client | #### Returns `Promise`\<`TransactionResponse`\> The result of the look-up **`Deprecated`** Use `indexer.lookupTransactionByID(transactionId).do()`. Looks up a transaction by ID using Indexer. #### Defined in [src/indexer-lookup.ts:15](https://github.com/algorandfoundation/algokit-utils-ts/blob/main/src/indexer-lookup.ts#L15) ___ ### searchTransactions ▸ **searchTransactions**(`indexer`, `searchCriteria`, `paginationLimit?`): `Promise`\<`algosdk.indexerModels.TransactionsResponse`\> Allows transactions to be searched for the given criteria. #### Parameters | Name | Type | Description | | :------ | :------ | :------ | | `indexer` | `IndexerClient` | An indexer client | | `searchCriteria` | (`s`: `default`) => `default` | The criteria to search for | | `paginationLimit?` | `number` | The number of records to return per paginated request, default 1000 | #### Returns `Promise`\<`algosdk.indexerModels.TransactionsResponse`\> The search results #### Defined in [src/indexer-lookup.ts:111](https://github.com/algorandfoundation/algokit-utils-ts/blob/main/src/indexer-lookup.ts#L111) ``` -------------------------------------------------------------------------------- /packages/server/src/resources/knowledge/taxonomy/docs:.walletconnect:walletconnect-schema.md: -------------------------------------------------------------------------------- ```markdown title: Schema # Background - [WalletConnect](https://docs.walletconnect.org/) is an open protocol to communicate securely between mobile wallets and decentralized applications (dApps) using QR code scanning (desktop) or deep linking (mobile). It’s main use case allows users to sign transactions on web apps using a mobile wallet. - v1 of WC (currently deployed) has first-party support for Ethereum chains, but it can be extended to other chains through custom message schema. [Binance Chain does this with their custom schema](https://docs.binance.org/guides/concepts/walletconnect.html#protocol-differences). # Purpose The purpose of this document is to define a custom WalletConnect schema for Algorand. The schema in this document is based on the [Algorand Foundation’s Wallet Transaction Signing API](https://github.com/algorandfoundation/ARCs/blob/main/ARCs/arc-0001.md), and it attempts to be as similar to that as possible. The main contribution of this document is to define how that schema can be used with WalletConnect. # Schema !!! Note All interfaces are defined in TypeScript. These interfaces are designed to be serializable to and from valid JSON objects. A WalletConnect schema is a set of JSON-RPC 2.0 requests and responses. WalletConnect will send requests to the Algorand Wallet and will receive either signed transactions or failures as responses. All requests adhere to the following structure: ``` interface JsonRpcRequest { id: number; jsonrpc: "2.0"; method: string; params: any[]; } ``` A successful request will return a response that adheres to the following structure: ``` interface JsonRpcResponse { id: number; // will be the same as the request's id jsonrpc: "2.0"; result: any; } ``` The Algorand schema consists of the requests and responses below. ## algo_signTxn This request is used to ask a wallet to sign one or more transactions in an atomic transaction group. ### Request This request adheres to the following structure: ``` interface AlgoSignTxnRequest { id: number; jsonrpc: "2.0"; method: "algo_signTxn"; params: SignTxnParams; } ``` The parameters `SignTxnParams`, are defined as: `type SignTxnParams = [WalletTransaction[], SignTxnOpts?];` !!! Note `SignTxnParams` is a [tuple with an optional element](https://www.typescriptlang.org/docs/handbook/release-notes/typescript-3-0.html#optional-elements-in-tuple-types), meaning its length can be 1 or 2. The first element in the tuple is an array of `WalletTransaction` objects. The length of this array must be between 1 and 16 (inclusive on both ends). Each transaction in the group (even ones not being signed by the wallet) must be an element in this array. The second element in the tuple is an `SignTxnOpts` object, which is optional. The `WalletTransaction` and `SignTxnOpts` types are defined as: ``` interface WalletTransaction { /** * Base64 encoding of the canonical msgpack encoding of a * Transaction. */ txn: string; /** * Optional authorized address used to sign the transaction when * the account is rekeyed. Also called the signor/sgnr. */ authAddr?: AlgorandAddress; /** * Optional multisig metadata used to sign the transaction */ msig?: MultisigMetadata; /** * Optional list of addresses that must sign the transactions */ signers?: AlgorandAddress[]; /** * Optional message explaining the reason of the transaction */ message?: string; } interface SignTxnOpts { /** * Optional message explaining the reason of the group of * transactions. */ message?: string; // other options may be present, but are not standard } ``` The above interfaces reference AlgorandAddress and MultisigMetadata types. These are defined as: ``` /** * AlgorandAddress is a 58-character base32 string that represents an * Algorand address with a checksum. */ type AlgorandAddress = string; /** * Options for creating and using a multisignature account. */ interface MultisigMetadata { /** * Multisig version. */ version: number; /** * Multisig threshold value. Authorization requires a subset of * signatures, equal to or greater than the threshold value. */ threshold: number; /** * List of Algorand addresses of possible signers for this * multisig. Order is important. */ addrs: AlgorandAddress[]; } ``` A description for each parameter in `WalletTransaction` can be found here: https://github.com/algorandfoundation/ARCs/blob/main/ARCs/arc-0001.md#interface-wallettransaction ### Response If the wallet approves the request, it will send back the following response: ``` interface AlgoSignTxnResponse { id: number; jsonrpc: "2.0"; result: Array<string | null>; } ``` In this response, result is an array with the same length as the request params. For every integer `i` such that `0 <= i < result.length`: - If the transaction at index `i` in the group should be signed by the wallet (i.e. `params[0][i].signers` is not an empty array) : `result[i]` will be a base64-encoded string containing the msgpack-encoded signed transaction `params[i].txn`. - Otherwise: `result[i]` will be null, since the wallet was not requested to sign this transaction. If the wallet does not approve signing every transaction whose signature is being requested, the request must fail. A failure like this should be indicated in the rejection message as described [here](https://github.com/algorandfoundation/ARCs/blob/main/ARCs/arc-0001.md#error-standards). # Future Additions Possible future additions to the schema may include: - A request type for wallets to sign a LogicSig program, resulting in a delegated LogicSig spending program for an account. ``` -------------------------------------------------------------------------------- /packages/server/src/resources/knowledge/taxonomy/developer:python:code:example:global_storage.md: -------------------------------------------------------------------------------- ```markdown # Global Storage in Algorand Smart Contracts This guide demonstrates how to work with global state in Algorand smart contracts using Python. Global state allows contracts to store and manage data that is accessible across all interactions with the contract. ## Initializing Global State ```python from algopy import ( Account, Application, ARC4Contract, Asset, Bytes, GlobalState, UInt64, arc4, ) class GlobalStorage(ARC4Contract): def __init__(self) -> None: # Integer storage self.global_int_full = GlobalState(UInt64(50)) # With default value self.global_int_simplified = UInt64(10) # Simplified syntax self.global_int_no_default = GlobalState(UInt64) # No default value # Bytes storage self.global_bytes_full = GlobalState(Bytes(b"Hello")) # With default value self.global_bytes_simplified = Bytes(b"Hello") # Simplified syntax self.global_bytes_no_default = GlobalState(Bytes) # No default value # Boolean storage self.global_bool_simplified = True # Simplified boolean self.global_bool_no_default = GlobalState(bool) # No default value # Special types self.global_asset = GlobalState(Asset) # Asset reference self.global_application = GlobalState(Application) # Application reference self.global_account = GlobalState(Account) # Account reference ``` ### Key Points about Initialization - Can use `GlobalState` with or without default values - Simplified syntax available for basic types - Supports various data types including integers, bytes, booleans - Special types for assets, applications, and accounts ## Reading Global State ### Basic Reading ```python @arc4.abimethod def get_global_state(self) -> UInt64: # Get value with default if not set return self.global_int_full.get(default=UInt64(0)) @arc4.abimethod def maybe_global_state(self) -> tuple[UInt64, bool]: # Get value and existence flag int_value, int_exists = self.global_int_full.maybe() if not int_exists: int_value = UInt64(0) return int_value, int_exists ``` ### Reading Different Types ```python @arc4.abimethod def get_global_state_example(self) -> bool: # Reading integers assert self.global_int_full.get(default=UInt64(0)) == 50 assert self.global_int_simplified == UInt64(10) # Reading bytes assert self.global_bytes_full.get(Bytes(b"default")) == b"Hello" # Reading special types asset_value, exists = self.global_asset.maybe() assert asset_value == Asset(UInt64(10)) app_value, exists = self.global_application.maybe() assert app_value == Application(UInt64(10)) return True ``` ## Writing Global State ### Basic Writing ```python @arc4.abimethod def set_global_state(self, value: Bytes) -> None: self.global_bytes_full.value = value @arc4.abimethod def set_global_state_example( self, value_bytes: Bytes, value_asset: Asset, *, value_bool: bool, ) -> None: # Setting different types self.global_bytes_no_default.value = value_bytes self.global_bool_no_default.value = value_bool self.global_asset.value = value_asset ``` ## Deleting Global State ```python @arc4.abimethod def del_global_state(self) -> bool: # Delete a single value del self.global_int_full.value return True @arc4.abimethod def del_global_state_example(self) -> bool: # Delete multiple values del self.global_bytes_no_default.value del self.global_bool_no_default.value del self.global_asset.value return True ``` ## Value Property Access ```python @arc4.abimethod def check_global_state_example(self) -> bool: # Direct value access assert self.global_int_full.value == 50 assert self.global_bytes_full.value == Bytes(b"Hello") # Simplified syntax access assert self.global_int_simplified == 10 assert self.global_bytes_simplified == b"Hello" assert bool(self.global_bool_simplified) # Check existence assert not self.global_int_no_default assert not self.global_bytes_no_default # Special types access assert self.global_asset.value == Asset(UInt64(10)) assert self.global_application.value == Application(UInt64(10)) assert self.global_account.value == Account(Bytes(b"Hello")) return True ``` ## Best Practices 1. **Initialization**: - Use appropriate types for your data - Consider whether default values are needed - Use simplified syntax when appropriate - Document the purpose of each state variable 2. **Reading State**: - Use `get()` with default values for safe access - Use `maybe()` when you need to check existence - Handle non-existent values gracefully - Verify type consistency 3. **Writing State**: - Validate data before writing - Use appropriate type conversions - Consider storage costs - Update related state consistently 4. **Deleting State**: - Clean up unused state to save storage - Verify deletion success - Handle deletion errors gracefully - Consider impact on related state 5. **Type Safety**: - Use proper type annotations - Verify type compatibility - Handle type conversions explicitly - Test with various data types 6. **Performance**: - Minimize state operations - Use appropriate data structures - Consider storage costs - Optimize state access patterns This guide demonstrates the various aspects of working with global state in Algorand smart contracts using Python. Understanding these concepts is crucial for developing efficient and reliable smart contracts. ``` -------------------------------------------------------------------------------- /packages/server/src/resources/knowledge/taxonomy/docs:.walletconnect:index.md: -------------------------------------------------------------------------------- ```markdown title: WalletConnect ## What is WalletConnect protocol? [WalletConnect](https://walletconnect.org/) is an open protocol to communicate securely between mobile wallets and decentralized applications (dApps) using QR code scanning (desktop) or deep linking (mobile); It’s not an app, not a blockchain and has no token. The protocol is implemented directly within the official Algorand Wallet and allows any dApp developer to add it to their application workflows. ## Why should I care? From an end user standpoint, they really don’t need to understand _how_ it works, but they will need to accept the _connection request_ initiated by the dApp within their mobile wallet. As a dApp developer you’ll want to understand some basics about the protocol for a successful integration and provide a seamless user experience. Algorand provides a [custom WalletConnect schema](./walletconnect-schema.md) and a [quick start guide](#quick-start-for-dapp-devs) for accelerating integrations. <center></center> The official Algorand Wallet is among the leading crypto wallets supporting the WalletConnect protocol as the industry standard for secure payment prompts and application call transactions. Importantly, user's private keys never leave their mobile device and are never exposed to connected dApps. Adding a Ledger Nano device to the Algorand Wallet further extends the user's security profile while maintaining connection simplicity enabled by the WalletConnect integration. ## How it works Communication between the dApp and the mobile wallet (_peers_) happens over a _bridge server_ that relays messages without access to their content. Message contents are symmetrically encrypted through a shared key between the two peers using session data. The connection is initiated by the dApp displaying a QR Code or deep link with a standard WalletConnect URI and is established when the user approves this connection request within their Algorand Wallet. Public bridge servers are maintained by WalletConnect and dApp developers may also deploy their own. Information exchange between the peers typically consists of an unsigned atomic transaction group from the dApp to the mobile wallet, which is then inspected by the user, signed and returned back to the dApp. The dApp will submit the signed object for confirmation by the Algorand network which will effect balances and state accordingly. <center></center> ## Quick start for dApp devs The TypeScript sample code below should allow a dApp developer to establish a connection and request a simple payment transaction for signature. ### Install === "yarn" ```bash yarn add @walletconnect/client algorand-walletconnect-qrcode-modal algosdk @json-rpc-tools/utils ``` === "npm" ```bash npm install --save @walletconnect/client algorand-walletconnect-qrcode-modal algosdk @json-rpc-tools/utils ``` !!! Info Developers are encouraged to watch the [walletconnect-monorepo](https://github.com/WalletConnect/walletconnect-monorepo/releases) for new releases. Rebuild and deploy your dApp to utilize new features and performance enhancements. ### Initiate Connection ```typescript import WalletConnect from "@walletconnect/client"; import QRCodeModal from "algorand-walletconnect-qrcode-modal"; import algosdk from "algosdk"; import { formatJsonRpcRequest } from "@json-rpc-tools/utils"; // Create a connector const connector = new WalletConnect({ bridge: "https://bridge.walletconnect.org", // Required qrcodeModal: QRCodeModal, }); // Check if connection is already established if (!connector.connected) { // create new session connector.createSession(); } // Subscribe to connection events connector.on("connect", (error, payload) => { if (error) { throw error; } // Get provided accounts const { accounts } = payload.params[0]; }); connector.on("session_update", (error, payload) => { if (error) { throw error; } // Get updated accounts const { accounts } = payload.params[0]; }); connector.on("disconnect", (error, payload) => { if (error) { throw error; } }); ``` ### Sign Transaction ```typescript // Draft transaction const txn = algosdk.makePaymentTxnWithSuggestedParamsFromObject({ from: "ALICEU3WMO5XYJVSODKJSYLFILIXXBEXHKIVSMX7GMGXJAYGFCJKVSQTUE", to: "HZ57J3K46JIJXILONBBZOHX6BKPXEM2VVXNRFSUED6DKFD5ZD24PMJ3MVA", amount: 100000, suggestedParams, }); // Sign transaction // txns is an array of algosdk.Transaction like below // i.e txns = [txn, ...someotherTxns], but we've only built one transaction in our case const txns = [txn] const txnsToSign = txns.map(txn => { const encodedTxn = Buffer.from(algosdk.encodeUnsignedTransaction(txn)).toString("base64"); return { txn: encodedTxn, message: 'Description of transaction being signed', // Note: if the transaction does not need to be signed (because it's part of an atomic group // that will be signed by another party), specify an empty singers array like so: // signers: [], }; }); const requestParams = [txnsToSign]; const request = formatJsonRpcRequest("algo_signTxn", requestParams); const result: Array<string | null> = await this.connector.sendCustomRequest(request); const decodedResult = result.map(element => { return element ? new Uint8Array(Buffer.from(element, "base64")) : null; }); ``` ### Close Connection ```TypeScript // Delete connector connector.killSession(); ``` ## Next Steps A [detailed example](https://github.com/algorand/walletconnect-example-dapp) is offered in React and a [live demo](https://algorand.github.io/walletconnect-example-dapp/) is available on TestNet. ``` -------------------------------------------------------------------------------- /packages/server/src/resources/knowledge/taxonomy/developer:python:code:example:accounts.md: -------------------------------------------------------------------------------- ```markdown # Algorand Account Management with Python This guide covers various aspects of account management in Algorand using Python, including creating accounts, funding them, managing keys and signatures, working with multisignature accounts, and account rekeying. ## Creating Accounts There are several ways to create or access Algorand accounts: ```python from algokit_utils import AlgorandClient # Initialize client for LocalNet algorand_client = AlgorandClient.default_localnet() # Create a random account random_account = algorand_client.account.random() # Get or create an account from KMD kmd_account = algorand_client.account.from_kmd(name="ACCOUNT_NAME") # Get or create an account from environment variables env_account = algorand_client.account.from_environment( name="MY_ACCOUNT", fund_with=AlgoAmount(algo=10) ) # Create an account from mnemonic mnemonic_account = algorand_client.account.from_mnemonic(mnemonic="MNEMONIC_PHRASE") ``` ### KMD Wallet Operations ```python # Create a new wallet algorand_client.client.kmd.create_wallet(name="ACCOUNT_NAME", pswd="password") # Rename a wallet algorand_client.client.kmd.rename_wallet( id="WALLET_ID", password="new_password", new_name="NEW_ACCOUNT_NAME" ) ``` ## Funding Accounts ### LocalNet Funding ```python # Get LocalNet dispenser account localnet_dispenser = algorand_client.account.localnet_dispenser() # Get dispenser account from environment dispenser = algorand_client.account.dispenser_from_environment() # Send payment from dispenser algorand_client.send.payment( PaymentParams( sender=localnet_dispenser.address, receiver=random_account.address, amount=AlgoAmount(algo=10) ) ) # Ensure account has minimum balance algorand_client.account.ensure_funded( account_to_fund=random_account.address, dispenser_account=localnet_dispenser.address, min_spending_balance=AlgoAmount(algo=10) ) ``` ### TestNet Funding ```python # Get TestNet dispenser testnet_dispenser = algorand_client.client.get_testnet_dispenser() # Fund using TestNet dispenser API algorand_client.account.ensure_funded_from_testnet_dispenser_api( account_to_fund=random_account.address, dispenser_client=testnet_dispenser, min_spending_balance=AlgoAmount(algo=10) ) # Direct funding using TestNet dispenser testnet_dispenser.fund(address=random_account.address, amount=10, asset_id=0) ``` ## Keys and Signing ### Managing Transaction Signers ```python # Set default signer algorand_client.account.set_default_signer(account_a.signer) # Register multiple signers algorand_client.account.set_signer_from_account(account_a) algorand_client.account.set_signer_from_account(account_b) algorand_client.account.set_signer_from_account(account_c) # Get signer for an address signer = algorand_client.account.get_signer(account_a.address) ``` ### Manual Transaction Signing ```python # Create unsigned transaction payment_txn = algorand_client.create_transaction.payment( PaymentParams( sender=account_a.address, receiver=account_b.address, amount=AlgoAmount(algo=1), note=b"Payment from A to B" ) ) # Send with custom signer algorand_client.new_group().add_transaction( transaction=payment_txn, signer=account_a_signer ).send() ``` ## Multisignature Accounts Create and use multisig accounts that require multiple signatures: ```python # Create 2-of-3 multisig account multisig_account = algorand_client.account.multisig( metadata=MultisigMetadata( version=1, threshold=2, addresses=[ account_a.address, account_b.address, account_c.address ] ), signing_accounts=[account_a, account_b, account_c] ) # Send from multisig account algorand_client.send.payment( PaymentParams( sender=multisig_account.address, receiver=account_a.address, amount=AlgoAmount(algo=1) ) ) ``` ## Account Rekeying Rekey an account to use a different address for signing: ```python # Rekey account_a to be controlled by account_b's private key algorand_client.account.rekey_account( account=account_a.address, rekey_to=account_b ) # Send transaction using new signing key payment_txn = algorand_client.create_transaction.payment( PaymentParams( sender=account_a.address, receiver=account_b.address, amount=AlgoAmount(algo=1), signer=account_b.signer ) ) algorand_client.new_group().add_transaction( transaction=payment_txn, signer=account_b.signer ).send() ``` ## Best Practices 1. **Account Creation**: - Use environment variables for sensitive information - Store mnemonics securely - Use KMD for development and testing 2. **Account Funding**: - Always ensure accounts have sufficient minimum balance - Use appropriate funding methods for different networks (LocalNet, TestNet) - Handle funding errors gracefully 3. **Transaction Signing**: - Set up default signers for convenience - Use explicit signers for critical operations - Verify transaction parameters before signing 4. **Multisig Accounts**: - Choose appropriate threshold values - Keep track of all signing accounts - Test multisig operations thoroughly 5. **Account Rekeying**: - Document rekeying operations - Maintain secure backup of original keys - Verify rekeying success before proceeding 6. **Security**: - Never expose private keys or mnemonics - Use secure methods for key storage - Implement proper access controls This guide provides a comprehensive overview of account management in Algorand using Python. The examples demonstrate the flexibility and security features available through the Algorand Python SDK and AlgoKit utilities. ``` -------------------------------------------------------------------------------- /packages/server/src/resources/knowledge/taxonomy/ARCs:specs:arc-0010.md: -------------------------------------------------------------------------------- ```markdown --- arc: 10 title: Algorand Wallet Reach Minimum Requirements description: Minimum requirements for Reach to function with a given wallet. author: DanBurton (@DanBurton) discussions-to: https://github.com/algorandfoundation/ARCs/issues/52 status: Deprecated type: Standards Track category: Interface created: 2021-08-09 --- # Algorand Wallet Reach Minimum Requirements ## Abstract An amalgamation of APIs which comprise the minimum requirements for Reach to be able to function correctly with a given wallet. ## Specification A group of related functions: * `enable` (**REQUIRED**) * `enableNetwork` (**OPTIONAL**) * `enableAccounts` (**OPTIONAL**) * `signAndPostTxns` (**REQUIRED**) * `getAlgodv2Client` (**REQUIRED**) * `getIndexerClient` (**REQUIRED**) * `signTxns` (**OPTIONAL**) * `postTxns` (**OPTIONAL**) * `enable`: as specified in [ARC-0006](./arc-0006.md#interface-enablefunction). * `signAndPostTxns`: as specified in [ARC-0008](./arc-0008.md#interface-signandposttxnsfunction). * `getAlgodv2Client` and `getIndexerClient`: as specified in [ARC-0009](./arc-0009.md#specification). * `signTxns`: as specified in [ARC-0005](./arc-0005.md#interface-signtxnsfunction) / [ARC-0001](./arc-0001.md#interface-signtxnsfunction). * `postTxns`: as specified in [ARC-0007](./arc-0007.md#interface-posttxnsfunction). There are additional semantics for using these functions together. ### Semantic Requirements * `enable` **SHOULD** be called before calling the other functions and upon refresh of the dApp. * Calling `enableNetwork` and then `enableAccounts` **MUST** be equivalent to calling `enable`. * If used instead of `enable`: `enableNetwork` **SHOULD** be called before `enableAccounts` and `getIndexerClient`. Both `enableNetwork` and `enableAccounts` **SHOULD** be called before the other functions. * If `signAndPostTxns`, `getAlgodv2Client`, `getIndexerClient`, `signTxns`, or `postTxns` are called before `enable` (or `enableAccounts`), they **SHOULD** throw an error object with property `code=4202`. (See Error Standards in [ARC-0001](arc-0001.md#error-standards)). * `getAlgodv2Client` and `getIndexerClient` **MUST** return connections to the network indicated by the `network` result of `enable`. * `signAndPostTxns` **MUST** post transactions to the network indicated by the `network` result of `enable` * The result of `getAlgodv2Client` **SHOULD** only be used to query the network. `postTxns` (if available) and `signAndPostTxns` **SHOULD** be used to send transactions to the network. The `Algodv2Client` object **MAY** be modified to throw exceptions if the caller tries to use it to post transactions. * `signTxns` and `postTxns` **MAY** or **MAY NOT** be provided. When one is provided, they both **MUST** be provided. In addition, `signTxns` **MAY** display a warning that the transactions are returned to the dApp rather than posted directly to the blockchain. ### Additional requirements regarding LogicSigs `signAndPostTxns` must also be able to handle logic sigs, and more generally transactions signed by the DApp itself. In case of logic sigs, callers are expected to sign the logic sig by themselves, rather than expecting the wallet to do so on their behalf. To handle these cases, we adopt and extend the [ARC-0001](./arc-0001.md#interface-wallettransaction) format for `WalletTransaction`s that do not need to be signed: ```json { "txn": "...", "signers": [], "stxn": "..." } ``` * `stxn` is a `SignedTxnStr`, as specified in [ARC-0007](./arc-0007.md#string-specification-signedtxnstr). * For production wallets, `stxn` **MUST** be checked to match `txn`, as specified in [ARC-0001](./arc-0001.md#semantic-and-security-requirements). `signAndPostTxns` **MAY** reject when none of the transactions need to be signed by the user. ## Rationale In order for a wallet to be useable by a DApp, it must support features for account discovery, signing and posting transactions, and querying the network. To whatever extent possible, the end users of a DApp should be empowered to select their own wallet, accounts, and network to be used with the DApp. Furthermore, said users should be able to use their preferred network node connection, without exposing their connection details and secrets (such as endpoint URLs and API tokens) to the DApp. The APIs presented in this document and related documents are sufficient to cover the needed functionality, while protecting user choice and remaining compatible with best security practices. Most DApps indeed always need to post transactions immediately after signing. `signAndPostTxns` allows this goal without revealing the signed transactions to the DApp, which prevents surprises to the user: there is no risk the DApp keeps in memory the transactions and post it later without the user knowing it (either to achieve a malicious goal such as forcing double spending, or just because the DApp has a bug). However, there are cases where `signTxns` and `postTxns` need to be used: for example when multiple users need to coordinate to sign an atomic transfer. ## Reference Implementation ```js async function main(wallet) { // Account discovery const enabled = await wallet.enable({genesisID: 'testnet-v1.0'}); const from = enabled.accounts[0]; // Querying const algodv2 = new algosdk.Algodv2(await wallet.getAlgodv2Client()); const suggestedParams = await algodv2.getTransactionParams().do(); const txns = makeTxns(from, suggestedParams); // Sign and post const res = await wallet.signAndPost(txns); console.log(res); }; ``` Where `makeTxns` is comparable to what is seen in [ARC-0001](./arc-0001.md#reference-implementation)'s sample code. ## Security Considerations None. ## Copyright Copyright and related rights waived via <a href="https://creativecommons.org/publicdomain/zero/1.0/">CCO</a>. ``` -------------------------------------------------------------------------------- /packages/server/src/resources/knowledge/taxonomy/developer:python:code:example:box_storage.md: -------------------------------------------------------------------------------- ```markdown # Box Storage in Algorand Smart Contracts Box storage is a feature in Algorand that allows smart contracts to store and manage data in separate "boxes" outside of the application's global and local state. This guide demonstrates how to use box storage in Algorand Python smart contracts. ## Box Storage Types ```python from algopy import ( ARC4Contract, Box, BoxMap, BoxRef, Bytes, String, UInt64, arc4, ) # Example of a struct that can be stored in a box class UserStruct(arc4.Struct): name: arc4.String id: arc4.UInt64 asset: arc4.UInt64 ``` ### Initializing Box Storage ```python class BoxStorage(ARC4Contract): def __init__(self) -> None: # Basic box types self.box_int = Box(UInt64) self.box_dynamic_bytes = Box[arc4.DynamicBytes](arc4.DynamicBytes, key="b") self.box_string = Box(arc4.String, key=b"BOX_C") self.box_bytes = Box(Bytes) # Box map with uint as key and string as value self.box_map = BoxMap(UInt64, String, key_prefix="") # Box reference for direct manipulation self.box_ref = BoxRef() # Box map for storing structs self.box_map_struct = BoxMap(arc4.UInt64, UserStruct, key_prefix="users") ``` ## Basic Box Operations ### Getting Values ```python @arc4.abimethod def get_box_example(self) -> tuple[UInt64, Bytes, arc4.String]: return ( self.box_int.value, # Get integer value self.box_dynamic_bytes.value.native, # Get bytes value self.box_string.value, # Get string value ) @arc4.abimethod def get_box_map_example(self) -> bool: key_1 = UInt64(1) # Get value with default if not found value = self.box_map.get(key_1, default=String("default")) return True ``` ### Setting Values ```python @arc4.abimethod def set_box_example( self, value_int: UInt64, value_dbytes: arc4.DynamicBytes, value_string: arc4.String, ) -> None: # Set values in different box types self.box_int.value = value_int self.box_dynamic_bytes.value = value_dbytes.copy() self.box_string.value = value_string self.box_bytes.value = value_dbytes.native # Increment value self.box_int.value += 3 @arc4.abimethod def set_box_map_struct(self, key: arc4.UInt64, value: UserStruct) -> bool: # Store struct in box map self.box_map_struct[key] = value.copy() return True ``` ### Deleting Values ```python @arc4.abimethod def delete_box(self) -> None: # Delete values from boxes del self.box_int.value del self.box_dynamic_bytes.value del self.box_string.value # Verify deletion by checking default values assert self.box_int.get(default=UInt64(42)) == 42 assert self.box_dynamic_bytes.get(default=arc4.DynamicBytes(b"42")).native == b"42" assert self.box_string.get(default=arc4.String("42")) == "42" @arc4.abimethod def delete_box_map(self, key: UInt64) -> None: # Delete value from box map del self.box_map[key] ``` ## Advanced Box Operations ### Maybe Operations (Safe Access) ```python @arc4.abimethod def maybe_box(self) -> tuple[UInt64, bool]: # Get value and existence flag box_int_value, box_int_exists = self.box_int.maybe() return box_int_value, box_int_exists @arc4.abimethod def maybe_box_map(self) -> tuple[String, bool]: key_1 = UInt64(1) # Get value and existence flag from map value, exists = self.box_map.maybe(key_1) if not exists: value = String("") return value, exists ``` ### Box References ```python @arc4.abimethod def manipulate_box_ref(self) -> None: box_ref = BoxRef(key=String("blob")) assert box_ref.create(size=32) # Manipulate data sender_bytes = Txn.sender.bytes app_address = Global.current_application_address.bytes value_3 = Bytes(b"hello") # Replace and splice operations box_ref.replace(0, sender_bytes) box_ref.splice(0, 0, app_address) box_ref.replace(64, value_3) # Extract data prefix = box_ref.extract(0, 32 * 2 + value_3.length) # Delete and recreate box_ref.delete() box_ref.put(sender_bytes + app_address) ``` ### Length Operations ```python @arc4.abimethod def box_map_length(self) -> UInt64: key_0 = UInt64(0) if key_0 not in self.box_map: return UInt64(0) return self.box_map.length(key_0) @arc4.abimethod def length_box_ref(self) -> UInt64: box_ref = BoxRef(key=String("blob")) assert box_ref.create(size=32) return box_ref.length ``` ## Best Practices 1. **Memory Management**: - Use appropriate box sizes to minimize storage costs - Delete unused boxes to free up space - Consider using box references for large data manipulations 2. **Data Safety**: - Use `maybe()` operations when accessing potentially non-existent values - Provide default values when getting box contents - Verify box existence before operations 3. **Struct Storage**: - Use `copy()` when storing struct values to ensure data integrity - Verify struct storage with assertions - Use appropriate key prefixes for organization 4. **Box References**: - Create boxes with appropriate sizes - Use extract and splice operations carefully - Clean up unused box references 5. **Performance**: - Minimize box operations to reduce costs - Use appropriate data types for storage - Consider using box maps for related data 6. **Error Handling**: - Include assertions for critical operations - Handle non-existent boxes gracefully - Verify operation success This guide demonstrates the various capabilities of box storage in Algorand smart contracts using Python. Box storage provides a flexible way to manage contract data while maintaining efficiency and organization. ``` -------------------------------------------------------------------------------- /packages/server/src/resources/knowledge/taxonomy/developer:docs:details:dapps:smart-contracts:index.md: -------------------------------------------------------------------------------- ```markdown title: Introduction Algorand Smart Contracts (ASC1) are small programs that serve various functions on the blockchain and operate on layer-1. Smart contracts are separated into two main categories, smart contracts, and smart signatures. These types are also referred to as stateful and stateless contracts respectively. The type of contract that is written will determine when and how the logic of the program is evaluated. See the following sections to understand how each type of contract is used on the Algorand blockchain. Both types of contracts are written in the [Transaction Execution Approval Language (TEAL)](../avm/teal), which is an assembly-like language that is interpreted by the [Algorand Virtual Machine (AVM)](../avm) running within an Algorand node. TEAL programs can be written by hand or by using the Python language with the PyTEAL compiler. !!! warning When writing smart contracts, make sure to follow [TEAL guidelines](../avm/teal/guidelines). This is very important in order to prevent smart contracts from being compromised. # Quick start videos If you prefer videos, take a look at this 6 minute guide to learn about Smart Contracts Overview. <iframe width="100%" style="aspect-ratio:16/9" src="https://www.youtube-nocookie.com/embed/_8vLEeJDjlc" title="YouTube video player" frameborder="0" allow="accelerometer; autoplay; clipboard-write; encrypted-media; gyroscope; picture-in-picture; web-share" allowfullscreen></iframe> # Smart contracts Smart contracts are contracts that, once deployed, are remotely callable from any node in the Algorand blockchain. Once deployed, the on-chain instantiation of the contract is referred to as an Application and assigned an Application Id. These applications are triggered by a specific type of transaction called an Application Call transaction. These on-chain applications handle the primary decentralized logic of a dApp. - Applications can [modify state](./apps/#modifying-state-in-smart-contract) associated with the application (global state) or a per application+account (local state) basis. - Applications can [access](./apps/#using-assets-in-smart-contracts) on-chain values, such as account balances, asset configuration parameters, or the latest block time. - Applications can [execute transactions](./apps/#inner-transactions) as part of the execution of the logic. One type of transaction they can perform, as of AVM 1.1, is an Application Call transaction which allows one application to call another. This ability to call other applications enables composability between applications. - Applications have an associated [Application Account](./apps/#using-a-smart-contract-as-an-escrow) that can hold Algos or ASAs balances and can be used as on-chain escrow accounts. To provide a standard method for exposing an API and encoding/decoding data types from application call transactions, the [ABI](/docs/get-details/dapps/smart-contracts/ABI/) should be used. For more information on smart contracts, see the [smart contract documentation](./apps). For more information on building smart contracts in PyTeal see the [build with python documentation](/docs/get-details/dapps/writing-contracts/pyteal). For more information on using smart contracts with the SDKs see the [Interacting with smart contracts documentation](./frontend/smartsigs.md). For more information on debugging a smart contract, see the [debugging](./debugging.md) page. # Smart signatures Smart signatures contain logic that is used to sign transactions, primarily for signature delegation. The logic of the smart signature is submitted with a transaction. While the logic in the smart signature is stored on the chain as part of resolving the transaction, the logic is not remotely callable. Any new transaction that relies on the same smart signature would resubmit the logic. When the logic is submitted to a node the AVM evaluates the logic, where it either fails or succeeds. If a smart signature’s logic fails when executed by the AVM, the associated transaction will not be executed. Smart signatures can be used in two different modes. When compiled smart signatures produce an Algorand account that functions similar to any other account on the blockchain. These accounts can hold Algos or assets. These funds are only allowed to leave the account if a transaction occurs from the account that successfully executes the logic within the smart signature. This is similar in functionality to a smart contract escrow, but the logic must be submitted for every transaction from the account. Smart signatures can also also be used to delegate some portion of authority to another account. In this case, an account can sign the smart signature which can then be used at a later time to sign a transaction from the original signer’s account. This is referred to as account delegation. See the [modes of use documentation](./smartsigs/modes.md) for more details on these two types of smart signatures. Once a transaction that is signed with a smart signature, is submitted it is evaluated by an Algorand node using the Algorand Virtual Machine. These contracts only have access to a few global variables, some temporary scratch space, and the properties of the transaction(s) they are submitted with. For more information on smart signatures, see the [smart signature documentation](./smartsigs). For more information on building contracts in PyTeal see the [build with Python documentation](/docs/get-details/dapps/writing-contracts/pyteal). For more information on using smart signatures with the SDKs see the [Interacting with smart signature documentation](./frontend/smartsigs). For more information on debugging a smart contract, see the [debugging](./debugging.md) page. For more information on the [AVM](../avm) or the [TEAL language](../avm/teal) see the developer documentation. ``` -------------------------------------------------------------------------------- /packages/server/src/resources/knowledge/taxonomy/algokit:utils:typescript:code:modules:types_app_factory.md: -------------------------------------------------------------------------------- ```markdown [@algorandfoundation/algokit-utils](../README.md) / types/app-factory # Module: types/app-factory ## Table of contents ### Classes - [AppFactory](../classes/types_app_factory.AppFactory.md) ### Interfaces - [AppFactoryParams](../interfaces/types_app_factory.AppFactoryParams.md) ### Type Aliases - [AppFactoryAppClientParams](types_app_factory.md#appfactoryappclientparams) - [AppFactoryCreateMethodCallParams](types_app_factory.md#appfactorycreatemethodcallparams) - [AppFactoryCreateParams](types_app_factory.md#appfactorycreateparams) - [AppFactoryDeployParams](types_app_factory.md#appfactorydeployparams) - [AppFactoryResolveAppClientByCreatorAndNameParams](types_app_factory.md#appfactoryresolveappclientbycreatorandnameparams) - [CreateOnComplete](types_app_factory.md#createoncomplete) - [CreateSchema](types_app_factory.md#createschema) ## Type Aliases ### AppFactoryAppClientParams Ƭ **AppFactoryAppClientParams**: [`Expand`](types_expand.md#expand)\<`Omit`\<[`AppClientParams`](../interfaces/types_app_client.AppClientParams.md), ``"algorand"`` \| ``"appSpec"``\>\> Params to get an app client by ID from an app factory. #### Defined in [src/types/app-factory.ts:134](https://github.com/algorandfoundation/algokit-utils-ts/blob/main/src/types/app-factory.ts#L134) ___ ### AppFactoryCreateMethodCallParams Ƭ **AppFactoryCreateMethodCallParams**: [`Expand`](types_expand.md#expand)\<[`AppClientMethodCallParams`](types_app_client.md#appclientmethodcallparams) & [`AppClientCompilationParams`](../interfaces/types_app_client.AppClientCompilationParams.md) & [`CreateOnComplete`](types_app_factory.md#createoncomplete) & [`CreateSchema`](types_app_factory.md#createschema)\> Params to specify a create method call for an app #### Defined in [src/types/app-factory.ts:129](https://github.com/algorandfoundation/algokit-utils-ts/blob/main/src/types/app-factory.ts#L129) ___ ### AppFactoryCreateParams Ƭ **AppFactoryCreateParams**: [`Expand`](types_expand.md#expand)\<[`AppClientBareCallParams`](types_app_client.md#appclientbarecallparams) & [`AppClientCompilationParams`](../interfaces/types_app_client.AppClientCompilationParams.md) & [`CreateOnComplete`](types_app_factory.md#createoncomplete) & [`CreateSchema`](types_app_factory.md#createschema)\> Params to specify a bare (raw) create call for an app #### Defined in [src/types/app-factory.ts:126](https://github.com/algorandfoundation/algokit-utils-ts/blob/main/src/types/app-factory.ts#L126) ___ ### AppFactoryDeployParams Ƭ **AppFactoryDeployParams**: [`Expand`](types_expand.md#expand)\<`Omit`\<[`AppDeployParams`](types_app_deployer.md#appdeployparams), ``"createParams"`` \| ``"updateParams"`` \| ``"deleteParams"`` \| ``"metadata"``\> & \{ `appName?`: `string` ; `createParams?`: [`Expand`](types_expand.md#expand)\<[`AppClientMethodCallParams`](types_app_client.md#appclientmethodcallparams) & [`CreateOnComplete`](types_app_factory.md#createoncomplete) & [`CreateSchema`](types_app_factory.md#createschema)\> \| [`Expand`](types_expand.md#expand)\<[`AppClientBareCallParams`](types_app_client.md#appclientbarecallparams) & [`CreateOnComplete`](types_app_factory.md#createoncomplete) & [`CreateSchema`](types_app_factory.md#createschema)\> ; `deletable?`: `boolean` ; `deleteParams?`: [`AppClientMethodCallParams`](types_app_client.md#appclientmethodcallparams) \| [`AppClientBareCallParams`](types_app_client.md#appclientbarecallparams) ; `updatable?`: `boolean` ; `updateParams?`: [`AppClientMethodCallParams`](types_app_client.md#appclientmethodcallparams) \| [`AppClientBareCallParams`](types_app_client.md#appclientbarecallparams) }\> Parameters to define a deployment for an `AppFactory` #### Defined in [src/types/app-factory.ts:140](https://github.com/algorandfoundation/algokit-utils-ts/blob/main/src/types/app-factory.ts#L140) ___ ### AppFactoryResolveAppClientByCreatorAndNameParams Ƭ **AppFactoryResolveAppClientByCreatorAndNameParams**: [`Expand`](types_expand.md#expand)\<`Omit`\<[`ResolveAppClientByCreatorAndName`](types_app_client.md#resolveappclientbycreatorandname), ``"algorand"`` \| ``"appSpec"``\>\> Params to get an app client by creator address and name from an app factory. #### Defined in [src/types/app-factory.ts:137](https://github.com/algorandfoundation/algokit-utils-ts/blob/main/src/types/app-factory.ts#L137) ___ ### CreateOnComplete Ƭ **CreateOnComplete**: `Object` onComplete parameter for a create app call #### Type declaration | Name | Type | | :------ | :------ | | `onComplete?` | `Exclude`\<`OnApplicationComplete`, `OnApplicationComplete.ClearStateOC`\> | #### Defined in [src/types/app-factory.ts:102](https://github.com/algorandfoundation/algokit-utils-ts/blob/main/src/types/app-factory.ts#L102) ___ ### CreateSchema Ƭ **CreateSchema**: `Object` Specifies a schema used for creating an app #### Type declaration | Name | Type | Description | | :------ | :------ | :------ | | `extraProgramPages?` | `number` | Number of extra pages required for the programs. Defaults to the number needed for the programs in this call if not specified. This is immutable once the app is created. | | `schema?` | \{ `globalByteSlices`: `number` ; `globalInts`: `number` ; `localByteSlices`: `number` ; `localInts`: `number` } | The state schema for the app. This is immutable once the app is created. By default uses the ARC32/ARC-56 spec. | | `schema.globalByteSlices` | `number` | The number of byte slices saved in global state. | | `schema.globalInts` | `number` | The number of integers saved in global state. | | `schema.localByteSlices` | `number` | The number of byte slices saved in local state. | | `schema.localInts` | `number` | The number of integers saved in local state. | #### Defined in [src/types/app-factory.ts:107](https://github.com/algorandfoundation/algokit-utils-ts/blob/main/src/types/app-factory.ts#L107) ``` -------------------------------------------------------------------------------- /packages/server/src/resources/knowledge/taxonomy/developer:docs:index.md: -------------------------------------------------------------------------------- ```markdown title: Algorand Developer Docs <div class="docs-homepage__challenge-box"> <div class="challenge-overview-icon"></div> <div> <p class="button--large docs-homepage__challenge-box__title">Complete Challenges and Earn Badges</p> <p class="typography--regular-body docs-homepage__challenge-box__description">Become a master Algorand Developer by completing coding challenges and getting rewarded with on-chain Badges along the way!</p> </div> <a href="/challenges/" class="button--small button--primary docs-homepage__challenge-box__link">View Challenges</a> </div> # Top-level sections <ul class="docs-homepage__card-list"> <li class="docs-homepage__card-list-item"> <a class="docs-homepage__card" href="./get-started/basics/what_is_blockchain/"> <div class="docs-homepage__card__icon-container docs-homepage__card__icon-container--purple"> <span class="create-smart-contract-overview-icon"></span> </div> <p class="docs-homepage__card__title text-gray--main typography--large-button">Get started</p> <p class="typography--regular-body docs-homepage__card__description">Start here to learn the basics</p> </a> </li> <li class="docs-homepage__card-list-item"> <a class="docs-homepage__card" href="./get-details/"> <div class="docs-homepage__card__icon-container docs-homepage__card__icon-container--purple"> <span class="stateless-smart-contracts-icon"></span> </div> <p class="docs-homepage__card__title text-gray--main typography--large-button">Get details</p> <p class="typography--regular-body docs-homepage__card__description">In-depth guides and explanations of all features</p> </a> </li> <li class="docs-homepage__card-list-item"> <a class="docs-homepage__card" href="./run-a-node/setup/types/"> <div class="docs-homepage__card__icon-container docs-homepage__card__icon-container--purple"> <span class="stateful-smart-contracts-icon"></span> </div> <p class="docs-homepage__card__title text-gray--main typography--large-button">Run a node</p> <p class="typography--regular-body docs-homepage__card__description">Setup a node and participate in consensus</p> </a> </li> </ul> # Spotlight <ul class="docs-homepage__card-list"> <li class="docs-homepage__card-list-item"> <a class="docs-homepage__card" href="./get-details/dapps/avm/"> <div class="docs-homepage__card__icon-container docs-homepage__card__icon-container--turquoise"> <span class="payment-with-algos-icon"></span> </div> <p class="docs-homepage__card__title text-gray--main typography--large-button">The AVM</p> <p class="typography--regular-body docs-homepage__card__description">The Algorand Virtual Machine</p> </a> </li> <li class="docs-homepage__card-list-item"> <a class="docs-homepage__card" href="./get-started/algokit/"> <div class="docs-homepage__card__icon-container docs-homepage__card__icon-container--turquoise"> <span class="payment-with-algos-icon"></span> </div> <p class="docs-homepage__card__title text-gray--main typography--large-button">AlgoKit</p> <p class="typography--regular-body docs-homepage__card__description">Spin up a dev environment and start writing contracts quickly </p> </a> </li> <li class="docs-homepage__card-list-item"> <a class="docs-homepage__card" href="./get-details/dapps/writing-contracts/beaker/"> <div class="docs-homepage__card__icon-container docs-homepage__card__icon-container--turquoise"> <span class="payment-with-algos-icon"></span> </div> <p class="docs-homepage__card__title text-gray--main typography--large-button">Beaker</p> <p class="typography--regular-body docs-homepage__card__description">Write smart contracts with the Beaker framework</p> </a> </li> <li class="docs-homepage__card-list-item"> <a class="docs-homepage__card" href="./get-details/accounts/rekey/"> <div class="docs-homepage__card__icon-container docs-homepage__card__icon-container--turquoise"> <span class="payment-with-algos-icon"></span> </div> <p class="docs-homepage__card__title text-gray--main typography--large-button">Rekeying</p> <p class="typography--regular-body docs-homepage__card__description">Change the spending key for any account</p> </a> </li> <li class="docs-homepage__card-list-item"> <a class="docs-homepage__card" href="./get-details/asa"> <div class="docs-homepage__card__icon-container docs-homepage__card__icon-container--turquoise"> <span class="payment-with-algos-icon"></span> </div> <p class="docs-homepage__card__title text-gray--main typography--large-button">ASAs</p> <p class="typography--regular-body docs-homepage__card__description">Tokenize FTs, NFTs, and more with a built-in standard</p> </a> </li> <li class="docs-homepage__card-list-item"> <a class="docs-homepage__card" href="./get-details/atomic_transfers/"> <div class="docs-homepage__card__icon-container docs-homepage__card__icon-container--turquoise"> <span class="payment-with-algos-icon"></span> </div> <p class="docs-homepage__card__title text-gray--main typography--large-button">Atomic Transfers</p> <p class="typography--regular-body docs-homepage__card__description">Group up to 16 transactions that will either all succeed or all fail</p> </a> </li> </ul> ``` -------------------------------------------------------------------------------- /packages/client/src/LocalWallet.ts: -------------------------------------------------------------------------------- ```typescript import algosdk, { Transaction } from 'algosdk'; export class LocalWallet { private fsPromises: typeof import('fs/promises') | null = null; private path: typeof import('path') | null = null; private connectedAddress: string | null = null; private isBrowser: boolean; constructor() { this.isBrowser = typeof window !== 'undefined'; } private async initNodeModules(): Promise<void> { if (!this.isBrowser && !this.fsPromises) { this.fsPromises = await import('fs/promises'); this.path = await import('path'); } } private async listStoredAccounts(): Promise<string[]> { if (this.isBrowser) { try { const creds = await navigator.credentials.get({ password: true, mediation: 'optional' } as CredentialRequestOptions) as { id: string; password: string }[] | null; return creds ? creds.map(cred => cred.id) : []; } catch { return []; } } else { try { await this.initNodeModules(); const mnemonicPath = this.path!.join(process.cwd(), '.mnemonic'); const files = await this.fsPromises!.readdir(mnemonicPath); return files.map((file: string) => file.replace('.mnemonic', '')); } catch { return []; } } } private async storeMnemonic(address: string, mnemonic: string): Promise<void> { if (this.isBrowser) { // Store mnemonic using PasswordCredential const credInit = { id: address, name: `Algorand Account ${address}`, origin: window.location.origin, password: mnemonic }; await navigator.credentials.create({ password: credInit } as CredentialCreationOptions); } else { // Use filesystem in non-browser environment await this.initNodeModules(); const mnemonicPath = this.path!.join(process.cwd(), '.mnemonic'); await this.fsPromises!.mkdir(mnemonicPath, { recursive: true }); await this.fsPromises!.writeFile( this.path!.join(mnemonicPath, `${address}.mnemonic`), mnemonic, { mode: 0o600 } ); } } private async retrieveMnemonic(address: string): Promise<string | null> { if (this.isBrowser) { try { // Retrieve mnemonic using PasswordCredential const cred = await navigator.credentials.get({ password: true } as CredentialRequestOptions) as { id: string; password: string } | null; if (cred && cred.id === address) { return cred.password; } return null; } catch { return null; } } else { try { await this.initNodeModules(); const mnemonicPath = this.path!.join(process.cwd(), '.mnemonic', `${address}.mnemonic`); const mnemonic = await this.fsPromises!.readFile(mnemonicPath, 'utf8'); return mnemonic; } catch { return null; } } } async connect(): Promise<string[]> { try { // Check for existing accounts first const existingAccounts = await this.listStoredAccounts(); if (existingAccounts.length > 0) { this.connectedAddress = existingAccounts[0]; return [this.connectedAddress]; } // Create new account if none exists const account = algosdk.generateAccount(); const mnemonic = algosdk.secretKeyToMnemonic(account.sk); await this.storeMnemonic(account.addr, mnemonic); this.connectedAddress = account.addr; return [account.addr]; } catch (error) { throw new Error(`Failed to connect to LocalWallet: ${error instanceof Error ? error.message : String(error)}`); } } async reconnectSession(): Promise<string[]> { try { const accounts = await this.listStoredAccounts(); if (accounts.length === 0) { throw new Error('No local accounts found. Call connect() first.'); } this.connectedAddress = accounts[0]; return [this.connectedAddress]; } catch (error) { throw new Error(`Failed to reconnect session: ${error instanceof Error ? error.message : String(error)}`); } } async disconnect(): Promise<void> { this.connectedAddress = null; } async makeTransactionSigner(): Promise<(txnGroup: Transaction[], indexesToSign: number[]) => Promise<Uint8Array[]>> { if (!this.connectedAddress) { throw new Error('No local account exists. Call connect() first.'); } try { const mnemonic = await this.retrieveMnemonic(this.connectedAddress); if (!mnemonic) { throw new Error('Failed to retrieve account mnemonic'); } const account = algosdk.mnemonicToSecretKey(mnemonic); return algosdk.makeBasicAccountTransactionSigner(account); } catch (error) { throw new Error(`Failed to create transaction signer: ${error instanceof Error ? error.message : String(error)}`); } } async signTransactions( transactions: { txn: Transaction; message?: string }[][] ): Promise<Uint8Array[][]> { if (!this.connectedAddress) { throw new Error('No local account exists. Call connect() first.'); } try { const mnemonic = await this.retrieveMnemonic(this.connectedAddress); if (!mnemonic) { throw new Error('Failed to retrieve account mnemonic'); } const account = algosdk.mnemonicToSecretKey(mnemonic); return Promise.all(transactions.map(async (group) => { return group.map(({ txn }) => { const signedTxn = algosdk.signTransaction(txn, account.sk); return signedTxn.blob; }); })); } catch (error) { throw new Error(`Failed to sign transactions: ${error instanceof Error ? error.message : String(error)}`); } } // Backward compatibility async signTransaction( transactions: { txn: Transaction; message?: string }[] ): Promise<Uint8Array[]> { const results = await this.signTransactions([transactions]); return results[0]; } } ``` -------------------------------------------------------------------------------- /packages/server/src/resources/knowledge/taxonomy/algokit:cli:features:project:bootstrap.md: -------------------------------------------------------------------------------- ```markdown # AlgoKit Project Bootstrap The AlgoKit Project Bootstrap feature allows you to bootstrap different project dependencies by looking up specific files in your current directory and immediate sub directories by convention. This is useful to allow for expedited initial setup for each developer e.g. when they clone a repository for the first time. It's also useful to provide a quick getting started experience when initialising a new project via [AlgoKit Init](./init.md) and meeting our goal of "nothing to debugging code in 5 minutes". It can bootstrap one or all of the following (with other options potentially being added in the future): - Python Poetry projects - Installs Poetry via pipx if its not present and then runs `poetry install` - Node.js project - Checks if npm is installed and runs `npm install` - dotenv (.env) file - Checks for `.env.template` files, copies them to `.env` (which should be in `.gitignore` so developers can safely make local specific changes) and prompts for any blank values (so the developer has an easy chance to fill in their initial values where there isn't a clear default). > **Note**: Invoking bootstrap from `algokit bootstrap` is not recommended. Please prefer using `algokit project bootstrap` instead. ## Usage Available commands and possible usage as follows: ``` $ ~ algokit project bootstrap Usage: algokit project bootstrap [OPTIONS] COMMAND [ARGS]... Options: -h, --help Show this message and exit. Commands: all Bootstrap all aspects of the current directory and immediate sub directories by convention. env Bootstrap .env file in the current working directory. npm Bootstrap Node.js project in the current working directory. poetry Bootstrap Python Poetry and install in the current working directory. ``` ## Functionality ### Bootstrap .env file The command `algokit project bootstrap env` runs two main tasks in the current directory: - Searching for `.env.template` file in the current directory and use it as template to create a new `.env` file in the same directory. - Prompting the user to enter a value for any empty token values in the `env.` including printing the comments above that empty token For instance, a sample `.env.template` file as follows: ``` SERVER_URL=https://myserver.com # This is a mandatory field to run the server, please enter a value # For example: 5000 SERVER_PORT= ``` Running the `algokit project bootstrap env` command while the above `.env.template` file in the current directory will result in the following: ``` $ ~ algokit project bootstrap env Copying /Users/me/my-project/.env.template to /Users/me/my-project/.env and prompting for empty values # This is a mandatory field to run the server, please enter a value value # For example: 5000 ? Please provide a value for SERVER_PORT: ``` And when the user enters a value for `SERVER_PORT`, a new `.env` file will be created as follows (e.g. if they entered `4000` as the value): ``` SERVER_URL=https://myserver.com # This is a mandatory field to run the server, please enter a value # For example: 5000 SERVER_PORT=4000 ``` ### Bootstrap Node.js project The command `algokit project bootstrap npm` installs Node.js project dependencies if there is a `package.json` file in the current directory by running `npm install` command to install all node modules specified in that file. If you don't have npm available it will show a clear error message and resolution instructions. Here is an example outcome of running `algokit project bootstrap npm` command: ``` $ ~ algokit project bootstrap npm Installing npm dependencies npm: npm: added 17 packages, and audited 18 packages in 3s npm: npm: 2 packages are looking for funding npm: run `npm fund` for details npm: npm: found 0 vulnerabilities ``` ### Bootstrap Python poetry project The command `algokit project bootstrap poetry` does two main actions: - Checking for Poetry version by running `poetry --version` and upgrades it if required - Installing Python dependencies and setting up Python virtual environment via Poetry in the current directory by running `poetry install`. Here is an example of running `algokit project bootstrap poetry` command: ``` $ ~ algokit project bootstrap poetry Installing Python dependencies and setting up Python virtual environment via Poetry poetry: poetry: Installing dependencies from lock file poetry: poetry: Package operations: 1 installs, 1 update, 0 removals poetry: poetry: • Installing pytz (2022.7) poetry: • Updating copier (7.0.1 -> 7.1.0a0) poetry: poetry: Installing the current project: algokit (0.1.0) ``` ### Bootstrap all Execute `algokit project bootstrap all` to initiate `algokit project bootstrap env`, `algokit project bootstrap npm`, and `algokit project bootstrap poetry` commands within the current directory and all its immediate sub-directories. This comprehensive command is automatically triggered following the initialization of a new project through the [AlgoKit Init](./init.md) command. #### Filtering Options The `algokit project bootstrap all` command includes flags for more granular control over the bootstrapping process within [AlgoKit workspaces](../init.md#workspaces): - `--project-name`: This flag allows you to specify one or more project names to bootstrap. Only projects matching the provided names will be bootstrapped. This is particularly useful in monorepos or when working with multiple projects in the same directory structure. - `--type`: Use this flag to limit the bootstrapping process to projects of a specific type (e.g., `frontend`, `backend`, `contract`). This option streamlines the setup process by focusing on relevant project types, reducing the overall bootstrapping time. These new flags enhance the flexibility and efficiency of the bootstrapping process, enabling developers to tailor the setup according to project-specific needs. ## Further Reading To learn more about the `algokit project bootstrap` command, please refer to [bootstrap](../../cli/index.md#bootstrap) in the AlgoKit CLI reference documentation. ```