This is page 19 of 93. Use http://codebase.md/goplausible/algorand-mcp?lines=true&page={x} to view the full context. # Directory Structure ``` ├── .gitignore ├── CONTRIBUTING.md ├── LICENSE ├── llms-install.md ├── llms.txt ├── package.json ├── packages │ ├── client │ │ ├── .env.example │ │ ├── package.json │ │ ├── README.md │ │ ├── src │ │ │ ├── env.ts │ │ │ ├── index.ts │ │ │ └── LocalWallet.ts │ │ └── tsconfig.json │ └── server │ ├── .env.example │ ├── API specs │ │ ├── algod_api.json │ │ ├── indexer_api.json │ │ ├── mcp.json │ │ ├── nfd_api.json │ │ ├── ultrade_api.json │ │ ├── vestige_api.json │ │ └── vestige_free_api.json │ ├── Dockerfile │ ├── jest.config.js │ ├── package.json │ ├── README.md │ ├── smithery.yaml │ ├── src │ │ ├── algorand-client.ts │ │ ├── env.ts │ │ ├── index.ts │ │ ├── resources │ │ │ ├── index.ts │ │ │ ├── knowledge │ │ │ │ ├── ARCs.txt │ │ │ │ ├── developers-algokit-architecture-decisions.txt │ │ │ │ ├── developers-algokit-cli.txt │ │ │ │ ├── developers-algokit-utils-python.txt │ │ │ │ ├── developers-algokit-utils-typescript.txt │ │ │ │ ├── developers-clis.txt │ │ │ │ ├── developers-details.txt │ │ │ │ ├── developers-liquid-auth.txt │ │ │ │ ├── developers-nodes.txt │ │ │ │ ├── developers-puya.txt │ │ │ │ ├── developers-python.txt │ │ │ │ ├── developers-sdks-js.txt │ │ │ │ ├── developers-sdks-python.txt │ │ │ │ ├── developers-tealscript.txt │ │ │ │ ├── developers.txt │ │ │ │ ├── index.ts │ │ │ │ ├── taxonomy │ │ │ │ │ ├── algokit-cli:README.md │ │ │ │ │ ├── algokit:cli:algokit.md │ │ │ │ │ ├── algokit:cli:architecture-decisions:2022-11-14_sandbox-approach.md │ │ │ │ │ ├── algokit:cli:architecture-decisions:2022-11-22_beaker-testing-strategy.md │ │ │ │ │ ├── algokit:cli:architecture-decisions:2023-01-11_beaker_productionisation_review.md │ │ │ │ │ ├── algokit:cli:architecture-decisions:2023-01-11_brew_install.md │ │ │ │ │ ├── algokit:cli:architecture-decisions:2023-01-12_smart-contract-deployment.md │ │ │ │ │ ├── algokit:cli:architecture-decisions:2023-06-06_frontend-templates.md │ │ │ │ │ ├── algokit:cli:architecture-decisions:2023-07-19_advanced_generate_command.md │ │ │ │ │ ├── algokit:cli:architecture-decisions:2024-01-13_native_binaries.md │ │ │ │ │ ├── algokit:cli:architecture-decisions:2024-01-23_init-wizard-v2.md │ │ │ │ │ ├── algokit:cli:architecture-decisions:2024-01-31_binary_distribution.md │ │ │ │ │ ├── algokit:cli:architecture-decisions:2024-03-06_local_dev_ui_packaging.md │ │ │ │ │ ├── algokit:cli:articles:output_stability.md │ │ │ │ │ ├── algokit:cli:cli:index.md │ │ │ │ │ ├── algokit:cli:features:compile.md │ │ │ │ │ ├── algokit:cli:features:completions.md │ │ │ │ │ ├── algokit:cli:features:config.md │ │ │ │ │ ├── algokit:cli:features:dispenser.md │ │ │ │ │ ├── algokit:cli:features:doctor.md │ │ │ │ │ ├── algokit:cli:features:explore.md │ │ │ │ │ ├── algokit:cli:features:generate.md │ │ │ │ │ ├── algokit:cli:features:goal.md │ │ │ │ │ ├── algokit:cli:features:init.md │ │ │ │ │ ├── algokit:cli:features:localnet.md │ │ │ │ │ ├── algokit:cli:features:project:bootstrap.md │ │ │ │ │ ├── algokit:cli:features:project:deploy.md │ │ │ │ │ ├── algokit:cli:features:project:link.md │ │ │ │ │ ├── algokit:cli:features:project:list.md │ │ │ │ │ ├── algokit:cli:features:project:run.md │ │ │ │ │ ├── algokit:cli:features:project.md │ │ │ │ │ ├── algokit:cli:features:tasks:analyze.md │ │ │ │ │ ├── algokit:cli:features:tasks:ipfs.md │ │ │ │ │ ├── algokit:cli:features:tasks:mint.md │ │ │ │ │ ├── algokit:cli:features:tasks:nfd.md │ │ │ │ │ ├── algokit:cli:features:tasks:opt.md │ │ │ │ │ ├── algokit:cli:features:tasks:send.md │ │ │ │ │ ├── algokit:cli:features:tasks:sign.md │ │ │ │ │ ├── algokit:cli:features:tasks:transfer.md │ │ │ │ │ ├── algokit:cli:features:tasks:vanity_address.md │ │ │ │ │ ├── algokit:cli:features:tasks:wallet.md │ │ │ │ │ ├── algokit:cli:features:tasks.md │ │ │ │ │ ├── algokit:cli:tutorials:algokit-template.md │ │ │ │ │ ├── algokit:cli:tutorials:intro.md │ │ │ │ │ ├── algokit:cli:tutorials:smart-contracts.md │ │ │ │ │ ├── algokit:docs:testnet_api.md │ │ │ │ │ ├── algokit:lora:README.md │ │ │ │ │ ├── algokit:README.md │ │ │ │ │ ├── algokit:utils:python:markdown:apidocs:algokit_utils:algokit_utils.md │ │ │ │ │ ├── algokit:utils:python:markdown:capabilities:account.md │ │ │ │ │ ├── algokit:utils:python:markdown:capabilities:app-client.md │ │ │ │ │ ├── algokit:utils:python:markdown:capabilities:app-deploy.md │ │ │ │ │ ├── algokit:utils:python:markdown:capabilities:client.md │ │ │ │ │ ├── algokit:utils:python:markdown:capabilities:debugger.md │ │ │ │ │ ├── algokit:utils:python:markdown:capabilities:dispenser-client.md │ │ │ │ │ ├── algokit:utils:python:markdown:capabilities:transfer.md │ │ │ │ │ ├── algokit:utils:python:markdown:index.md │ │ │ │ │ ├── algokit:utils:python:README.md │ │ │ │ │ ├── algokit:utils:python:source:capabilities:account.md │ │ │ │ │ ├── algokit:utils:python:source:capabilities:app-client.md │ │ │ │ │ ├── algokit:utils:python:source:capabilities:app-deploy.md │ │ │ │ │ ├── algokit:utils:python:source:capabilities:client.md │ │ │ │ │ ├── algokit:utils:python:source:capabilities:debugger.md │ │ │ │ │ ├── algokit:utils:python:source:capabilities:dispenser-client.md │ │ │ │ │ ├── algokit:utils:python:source:capabilities:transfer.md │ │ │ │ │ ├── algokit:utils:python:source:index.md │ │ │ │ │ ├── algokit:utils:typescript:capabilities:account.md │ │ │ │ │ ├── algokit:utils:typescript:capabilities:algorand-client.md │ │ │ │ │ ├── algokit:utils:typescript:capabilities:amount.md │ │ │ │ │ ├── algokit:utils:typescript:capabilities:app-client.md │ │ │ │ │ ├── algokit:utils:typescript:capabilities:app-deploy.md │ │ │ │ │ ├── algokit:utils:typescript:capabilities:app.md │ │ │ │ │ ├── algokit:utils:typescript:capabilities:asset.md │ │ │ │ │ ├── algokit:utils:typescript:capabilities:client.md │ │ │ │ │ ├── algokit:utils:typescript:capabilities:debugging.md │ │ │ │ │ ├── algokit:utils:typescript:capabilities:dispenser-client.md │ │ │ │ │ ├── algokit:utils:typescript:capabilities:event-emitter.md │ │ │ │ │ ├── algokit:utils:typescript:capabilities:indexer.md │ │ │ │ │ ├── algokit:utils:typescript:capabilities:testing.md │ │ │ │ │ ├── algokit:utils:typescript:capabilities:transaction-composer.md │ │ │ │ │ ├── algokit:utils:typescript:capabilities:transaction.md │ │ │ │ │ ├── algokit:utils:typescript:capabilities:transfer.md │ │ │ │ │ ├── algokit:utils:typescript:capabilities:typed-app-clients.md │ │ │ │ │ ├── algokit:utils:typescript:code:classes:testing.TestLogger.md │ │ │ │ │ ├── algokit:utils:typescript:code:classes:testing.TransactionLogger.md │ │ │ │ │ ├── algokit:utils:typescript:code:classes:types_account_manager.AccountManager.md │ │ │ │ │ ├── algokit:utils:typescript:code:classes:types_account.MultisigAccount.md │ │ │ │ │ ├── algokit:utils:typescript:code:classes:types_account.SigningAccount.md │ │ │ │ │ ├── algokit:utils:typescript:code:classes:types_algo_http_client_with_retry.AlgoHttpClientWithRetry.md │ │ │ │ │ ├── algokit:utils:typescript:code:classes:types_algorand_client_transaction_creator.AlgorandClientTransactionCreator.md │ │ │ │ │ ├── algokit:utils:typescript:code:classes:types_algorand_client_transaction_sender.AlgorandClientTransactionSender.md │ │ │ │ │ ├── algokit:utils:typescript:code:classes:types_algorand_client.AlgorandClient.md │ │ │ │ │ ├── algokit:utils:typescript:code:classes:types_amount.AlgoAmount.md │ │ │ │ │ ├── algokit:utils:typescript:code:classes:types_app_arc56.Arc56Method.md │ │ │ │ │ ├── algokit:utils:typescript:code:classes:types_app_client.AppClient.md │ │ │ │ │ ├── algokit:utils:typescript:code:classes:types_app_client.ApplicationClient.md │ │ │ │ │ ├── algokit:utils:typescript:code:classes:types_app_deployer.AppDeployer.md │ │ │ │ │ ├── algokit:utils:typescript:code:classes:types_app_factory.AppFactory.md │ │ │ │ │ ├── algokit:utils:typescript:code:classes:types_app_manager.AppManager.md │ │ │ │ │ ├── algokit:utils:typescript:code:classes:types_asset_manager.AssetManager.md │ │ │ │ │ ├── algokit:utils:typescript:code:classes:types_async_event_emitter.AsyncEventEmitter.md │ │ │ │ │ ├── algokit:utils:typescript:code:classes:types_client_manager.ClientManager.md │ │ │ │ │ ├── algokit:utils:typescript:code:classes:types_composer.TransactionComposer.md │ │ │ │ │ ├── algokit:utils:typescript:code:classes:types_config.UpdatableConfig.md │ │ │ │ │ ├── algokit:utils:typescript:code:classes:types_dispenser_client.TestNetDispenserApiClient.md │ │ │ │ │ ├── algokit:utils:typescript:code:classes:types_kmd_account_manager.KmdAccountManager.md │ │ │ │ │ ├── algokit:utils:typescript:code:classes:types_logic_error.LogicError.md │ │ │ │ │ ├── algokit:utils:typescript:code:enums:types_app.OnSchemaBreak.md │ │ │ │ │ ├── algokit:utils:typescript:code:enums:types_app.OnUpdate.md │ │ │ │ │ ├── algokit:utils:typescript:code:enums:types_indexer.AccountStatus.md │ │ │ │ │ ├── algokit:utils:typescript:code:enums:types_indexer.ApplicationOnComplete.md │ │ │ │ │ ├── algokit:utils:typescript:code:enums:types_indexer.SignatureType.md │ │ │ │ │ ├── algokit:utils:typescript:code:enums:types_lifecycle_events.EventType.md │ │ │ │ │ ├── algokit:utils:typescript:code:interfaces:types_account_manager.EnsureFundedResult.md │ │ │ │ │ ├── algokit:utils:typescript:code:interfaces:types_account.AccountConfig.md │ │ │ │ │ ├── algokit:utils:typescript:code:interfaces:types_account.TransactionSignerAccount.md │ │ │ │ │ ├── algokit:utils:typescript:code:interfaces:types_algorand_client_interface.AlgorandClientInterface.md │ │ │ │ │ ├── algokit:utils:typescript:code:interfaces:types_app_arc56.Arc56Contract.md │ │ │ │ │ ├── algokit:utils:typescript:code:interfaces:types_app_arc56.Event.md │ │ │ │ │ ├── algokit:utils:typescript:code:interfaces:types_app_arc56.Method.md │ │ │ │ │ ├── algokit:utils:typescript:code:interfaces:types_app_arc56.ProgramSourceInfo.md │ │ │ │ │ ├── algokit:utils:typescript:code:interfaces:types_app_arc56.StorageKey.md │ │ │ │ │ ├── algokit:utils:typescript:code:interfaces:types_app_arc56.StorageMap.md │ │ │ │ │ ├── algokit:utils:typescript:code:interfaces:types_app_arc56.StructField.md │ │ │ │ │ ├── algokit:utils:typescript:code:interfaces:types_app_client.AppClientCallABIArgs.md │ │ │ │ │ ├── algokit:utils:typescript:code:interfaces:types_app_client.AppClientCallCoreParams.md │ │ │ │ │ ├── algokit:utils:typescript:code:interfaces:types_app_client.AppClientCompilationParams.md │ │ │ │ │ ├── algokit:utils:typescript:code:interfaces:types_app_client.AppClientCompilationResult.md │ │ │ │ │ ├── algokit:utils:typescript:code:interfaces:types_app_client.AppClientDeployCallInterfaceParams.md │ │ │ │ │ ├── algokit:utils:typescript:code:interfaces:types_app_client.AppClientDeployCoreParams.md │ │ │ │ │ ├── algokit:utils:typescript:code:interfaces:types_app_client.AppClientDeployParams.md │ │ │ │ │ ├── algokit:utils:typescript:code:interfaces:types_app_client.AppClientParams.md │ │ │ │ │ ├── algokit:utils:typescript:code:interfaces:types_app_client.AppSourceMaps.md │ │ │ │ │ ├── algokit:utils:typescript:code:interfaces:types_app_client.FundAppAccountParams.md │ │ │ │ │ ├── algokit:utils:typescript:code:interfaces:types_app_client.ResolveAppById.md │ │ │ │ │ ├── algokit:utils:typescript:code:interfaces:types_app_client.ResolveAppByIdBase.md │ │ │ │ │ ├── algokit:utils:typescript:code:interfaces:types_app_client.SourceMapExport.md │ │ │ │ │ ├── algokit:utils:typescript:code:interfaces:types_app_deployer.AppLookup.md │ │ │ │ │ ├── algokit:utils:typescript:code:interfaces:types_app_deployer.AppMetadata.md │ │ │ │ │ ├── algokit:utils:typescript:code:interfaces:types_app_factory.AppFactoryParams.md │ │ │ │ │ ├── algokit:utils:typescript:code:interfaces:types_app_manager.AppInformation.md │ │ │ │ │ ├── algokit:utils:typescript:code:interfaces:types_app_manager.BoxReference.md │ │ │ │ │ ├── algokit:utils:typescript:code:interfaces:types_app_manager.BoxValueRequestParams.md │ │ │ │ │ ├── algokit:utils:typescript:code:interfaces:types_app_manager.BoxValuesRequestParams.md │ │ │ │ │ ├── algokit:utils:typescript:code:interfaces:types_app_spec.AppSources.md │ │ │ │ │ ├── algokit:utils:typescript:code:interfaces:types_app_spec.AppSpec.md │ │ │ │ │ ├── algokit:utils:typescript:code:interfaces:types_app_spec.CallConfig.md │ │ │ │ │ ├── algokit:utils:typescript:code:interfaces:types_app_spec.DeclaredSchemaValueSpec.md │ │ │ │ │ ├── algokit:utils:typescript:code:interfaces:types_app_spec.Hint.md │ │ │ │ │ ├── algokit:utils:typescript:code:interfaces:types_app_spec.ReservedSchemaValueSpec.md │ │ │ │ │ ├── algokit:utils:typescript:code:interfaces:types_app_spec.Schema.md │ │ │ │ │ ├── algokit:utils:typescript:code:interfaces:types_app_spec.SchemaSpec.md │ │ │ │ │ ├── algokit:utils:typescript:code:interfaces:types_app_spec.StateSchemaSpec.md │ │ │ │ │ ├── algokit:utils:typescript:code:interfaces:types_app_spec.Struct.md │ │ │ │ │ ├── algokit:utils:typescript:code:interfaces:types_app.AppCallParams.md │ │ │ │ │ ├── algokit:utils:typescript:code:interfaces:types_app.AppCallTransactionResultOfType.md │ │ │ │ │ ├── algokit:utils:typescript:code:interfaces:types_app.AppCompilationResult.md │ │ │ │ │ ├── algokit:utils:typescript:code:interfaces:types_app.AppDeploymentParams.md │ │ │ │ │ ├── algokit:utils:typescript:code:interfaces:types_app.AppDeployMetadata.md │ │ │ │ │ ├── algokit:utils:typescript:code:interfaces:types_app.AppLookup.md │ │ │ │ │ ├── algokit:utils:typescript:code:interfaces:types_app.AppMetadata.md │ │ │ │ │ ├── algokit:utils:typescript:code:interfaces:types_app.AppReference.md │ │ │ │ │ ├── algokit:utils:typescript:code:interfaces:types_app.AppState.md │ │ │ │ │ ├── algokit:utils:typescript:code:interfaces:types_app.AppStorageSchema.md │ │ │ │ │ ├── algokit:utils:typescript:code:interfaces:types_app.BoxName.md │ │ │ │ │ ├── algokit:utils:typescript:code:interfaces:types_app.BoxReference.md │ │ │ │ │ ├── algokit:utils:typescript:code:interfaces:types_app.BoxValueRequestParams.md │ │ │ │ │ ├── algokit:utils:typescript:code:interfaces:types_app.BoxValuesRequestParams.md │ │ │ │ │ ├── algokit:utils:typescript:code:interfaces:types_app.CompiledTeal.md │ │ │ │ │ ├── algokit:utils:typescript:code:interfaces:types_app.CoreAppCallArgs.md │ │ │ │ │ ├── algokit:utils:typescript:code:interfaces:types_app.CreateAppParams.md │ │ │ │ │ ├── algokit:utils:typescript:code:interfaces:types_app.RawAppCallArgs.md │ │ │ │ │ ├── algokit:utils:typescript:code:interfaces:types_app.TealTemplateParams.md │ │ │ │ │ ├── algokit:utils:typescript:code:interfaces:types_app.UpdateAppParams.md │ │ │ │ │ ├── algokit:utils:typescript:code:interfaces:types_asset_manager.AssetInformation.md │ │ │ │ │ ├── algokit:utils:typescript:code:interfaces:types_asset_manager.BulkAssetOptInOutResult.md │ │ │ │ │ ├── algokit:utils:typescript:code:interfaces:types_asset.AssetBulkOptInOutParams.md │ │ │ │ │ ├── algokit:utils:typescript:code:interfaces:types_asset.AssetOptInParams.md │ │ │ │ │ ├── algokit:utils:typescript:code:interfaces:types_asset.AssetOptOutParams.md │ │ │ │ │ ├── algokit:utils:typescript:code:interfaces:types_asset.CreateAssetParams.md │ │ │ │ │ ├── algokit:utils:typescript:code:interfaces:types_client_manager.AlgoSdkClients.md │ │ │ │ │ ├── algokit:utils:typescript:code:interfaces:types_client_manager.TypedAppClient.md │ │ │ │ │ ├── algokit:utils:typescript:code:interfaces:types_client_manager.TypedAppFactory.md │ │ │ │ │ ├── algokit:utils:typescript:code:interfaces:types_composer.BuiltTransactions.md │ │ │ │ │ ├── algokit:utils:typescript:code:interfaces:types_config.Config.md │ │ │ │ │ ├── algokit:utils:typescript:code:interfaces:types_debugging.AVMTracesEventData.md │ │ │ │ │ ├── algokit:utils:typescript:code:interfaces:types_debugging.TealSourceDebugEventData.md │ │ │ │ │ ├── algokit:utils:typescript:code:interfaces:types_debugging.TealSourcesDebugEventData.md │ │ │ │ │ ├── algokit:utils:typescript:code:interfaces:types_dispenser_client.DispenserFundResponse.md │ │ │ │ │ ├── algokit:utils:typescript:code:interfaces:types_dispenser_client.DispenserLimitResponse.md │ │ │ │ │ ├── algokit:utils:typescript:code:interfaces:types_dispenser_client.TestNetDispenserApiClientParams.md │ │ │ │ │ ├── algokit:utils:typescript:code:interfaces:types_indexer.LookupAssetHoldingsOptions.md │ │ │ │ │ ├── algokit:utils:typescript:code:interfaces:types_logic_error.LogicErrorDetails.md │ │ │ │ │ ├── algokit:utils:typescript:code:interfaces:types_network_client.AlgoClientConfig.md │ │ │ │ │ ├── algokit:utils:typescript:code:interfaces:types_network_client.AlgoConfig.md │ │ │ │ │ ├── algokit:utils:typescript:code:interfaces:types_network_client.NetworkDetails.md │ │ │ │ │ ├── algokit:utils:typescript:code:interfaces:types_testing.AlgoKitLogCaptureFixture.md │ │ │ │ │ ├── algokit:utils:typescript:code:interfaces:types_testing.AlgorandFixture.md │ │ │ │ │ ├── algokit:utils:typescript:code:interfaces:types_testing.AlgorandFixtureConfig.md │ │ │ │ │ ├── algokit:utils:typescript:code:interfaces:types_testing.AlgorandTestAutomationContext.md │ │ │ │ │ ├── algokit:utils:typescript:code:interfaces:types_testing.GetTestAccountParams.md │ │ │ │ │ ├── algokit:utils:typescript:code:interfaces:types_testing.LogSnapshotConfig.md │ │ │ │ │ ├── algokit:utils:typescript:code:interfaces:types_transaction.AtomicTransactionComposerToSend.md │ │ │ │ │ ├── algokit:utils:typescript:code:interfaces:types_transaction.ConfirmedTransactionResult.md │ │ │ │ │ ├── algokit:utils:typescript:code:interfaces:types_transaction.ConfirmedTransactionResults.md │ │ │ │ │ ├── algokit:utils:typescript:code:interfaces:types_transaction.SendAtomicTransactionComposerResults.md │ │ │ │ │ ├── algokit:utils:typescript:code:interfaces:types_transaction.SendParams.md │ │ │ │ │ ├── algokit:utils:typescript:code:interfaces:types_transaction.SendTransactionParams.md │ │ │ │ │ ├── algokit:utils:typescript:code:interfaces:types_transaction.SendTransactionResult.md │ │ │ │ │ ├── algokit:utils:typescript:code:interfaces:types_transaction.SendTransactionResults.md │ │ │ │ │ ├── algokit:utils:typescript:code:interfaces:types_transaction.TransactionGroupToSend.md │ │ │ │ │ ├── algokit:utils:typescript:code:interfaces:types_transaction.TransactionToSign.md │ │ │ │ │ ├── algokit:utils:typescript:code:interfaces:types_transfer.AlgoRekeyParams.md │ │ │ │ │ ├── algokit:utils:typescript:code:interfaces:types_transfer.AlgoTransferParams.md │ │ │ │ │ ├── algokit:utils:typescript:code:interfaces:types_transfer.EnsureFundedParams.md │ │ │ │ │ ├── algokit:utils:typescript:code:interfaces:types_transfer.EnsureFundedReturnType.md │ │ │ │ │ ├── algokit:utils:typescript:code:interfaces:types_transfer.TransferAssetParams.md │ │ │ │ │ ├── algokit:utils:typescript:code:modules:index.indexer.md │ │ │ │ │ ├── algokit:utils:typescript:code:modules:index.md │ │ │ │ │ ├── algokit:utils:typescript:code:modules:testing.md │ │ │ │ │ ├── algokit:utils:typescript:code:modules:types_account_manager_spec.md │ │ │ │ │ ├── algokit:utils:typescript:code:modules:types_account_manager.md │ │ │ │ │ ├── algokit:utils:typescript:code:modules:types_account.md │ │ │ │ │ ├── algokit:utils:typescript:code:modules:types_algo_http_client_with_retry.md │ │ │ │ │ ├── algokit:utils:typescript:code:modules:types_algorand_client_asset_spec.md │ │ │ │ │ ├── algokit:utils:typescript:code:modules:types_algorand_client_interface.md │ │ │ │ │ ├── algokit:utils:typescript:code:modules:types_algorand_client_spec.md │ │ │ │ │ ├── algokit:utils:typescript:code:modules:types_algorand_client_transaction_creator.md │ │ │ │ │ ├── algokit:utils:typescript:code:modules:types_algorand_client_transaction_sender.md │ │ │ │ │ ├── algokit:utils:typescript:code:modules:types_algorand_client_transfer_spec.md │ │ │ │ │ ├── algokit:utils:typescript:code:modules:types_algorand_client.md │ │ │ │ │ ├── algokit:utils:typescript:code:modules:types_amount_spec.md │ │ │ │ │ ├── algokit:utils:typescript:code:modules:types_amount.md │ │ │ │ │ ├── algokit:utils:typescript:code:modules:types_app_arc56.md │ │ │ │ │ ├── algokit:utils:typescript:code:modules:types_app_client_spec.md │ │ │ │ │ ├── algokit:utils:typescript:code:modules:types_app_client.md │ │ │ │ │ ├── algokit:utils:typescript:code:modules:types_app_deployer.md │ │ │ │ │ ├── algokit:utils:typescript:code:modules:types_app_factory_and_client_spec.md │ │ │ │ │ ├── algokit:utils:typescript:code:modules:types_app_factory.md │ │ │ │ │ ├── algokit:utils:typescript:code:modules:types_app_manager.md │ │ │ │ │ ├── algokit:utils:typescript:code:modules:types_app_spec.md │ │ │ │ │ ├── algokit:utils:typescript:code:modules:types_app.md │ │ │ │ │ ├── algokit:utils:typescript:code:modules:types_asset_manager.md │ │ │ │ │ ├── algokit:utils:typescript:code:modules:types_asset.md │ │ │ │ │ ├── algokit:utils:typescript:code:modules:types_async_event_emitter_spec.md │ │ │ │ │ ├── algokit:utils:typescript:code:modules:types_async_event_emitter.md │ │ │ │ │ ├── algokit:utils:typescript:code:modules:types_client_manager_spec.md │ │ │ │ │ ├── algokit:utils:typescript:code:modules:types_client_manager.md │ │ │ │ │ ├── algokit:utils:typescript:code:modules:types_composer.md │ │ │ │ │ ├── algokit:utils:typescript:code:modules:types_config.md │ │ │ │ │ ├── algokit:utils:typescript:code:modules:types_debugging.md │ │ │ │ │ ├── algokit:utils:typescript:code:modules:types_dispenser_client_spec.md │ │ │ │ │ ├── algokit:utils:typescript:code:modules:types_dispenser_client.md │ │ │ │ │ ├── algokit:utils:typescript:code:modules:types_expand.md │ │ │ │ │ ├── algokit:utils:typescript:code:modules:types_indexer.md │ │ │ │ │ ├── algokit:utils:typescript:code:modules:types_kmd_account_manager.md │ │ │ │ │ ├── algokit:utils:typescript:code:modules:types_lifecycle_events.md │ │ │ │ │ ├── algokit:utils:typescript:code:modules:types_logging.md │ │ │ │ │ ├── algokit:utils:typescript:code:modules:types_logic_error.md │ │ │ │ │ ├── algokit:utils:typescript:code:modules:types_network_client.md │ │ │ │ │ ├── algokit:utils:typescript:code:modules:types_testing.md │ │ │ │ │ ├── algokit:utils:typescript:code:modules:types_transaction.md │ │ │ │ │ ├── algokit:utils:typescript:code:modules:types_transfer.md │ │ │ │ │ ├── algokit:utils:typescript:code:README.md │ │ │ │ │ ├── algokit:utils:typescript:README.md │ │ │ │ │ ├── algokit:utils:typescript:v7-migration.md │ │ │ │ │ ├── algokit:utils:typescript:v8-migration.md │ │ │ │ │ ├── ARCs:ARC-template.md │ │ │ │ │ ├── ARCs:assets:arc-0012:README.md │ │ │ │ │ ├── ARCs:assets:arc-0034:TemplateForm.md │ │ │ │ │ ├── ARCs:assets:arc-0062:README.md │ │ │ │ │ ├── ARCs:pages:nfts.md │ │ │ │ │ ├── ARCs:pages:wallets.md │ │ │ │ │ ├── ARCs:README.md │ │ │ │ │ ├── ARCs:specs:arc-0000.md │ │ │ │ │ ├── ARCs:specs:arc-0001.md │ │ │ │ │ ├── ARCs:specs:arc-0002.md │ │ │ │ │ ├── ARCs:specs:arc-0003.md │ │ │ │ │ ├── ARCs:specs:arc-0004.md │ │ │ │ │ ├── ARCs:specs:arc-0005.md │ │ │ │ │ ├── ARCs:specs:arc-0006.md │ │ │ │ │ ├── ARCs:specs:arc-0007.md │ │ │ │ │ ├── ARCs:specs:arc-0008.md │ │ │ │ │ ├── ARCs:specs:arc-0009.md │ │ │ │ │ ├── ARCs:specs:arc-0010.md │ │ │ │ │ ├── ARCs:specs:arc-0011.md │ │ │ │ │ ├── ARCs:specs:arc-0012.md │ │ │ │ │ ├── ARCs:specs:arc-0015.md │ │ │ │ │ ├── ARCs:specs:arc-0016.md │ │ │ │ │ ├── ARCs:specs:arc-0018.md │ │ │ │ │ ├── ARCs:specs:arc-0019.md │ │ │ │ │ ├── ARCs:specs:arc-0020.md │ │ │ │ │ ├── ARCs:specs:arc-0021.md │ │ │ │ │ ├── ARCs:specs:arc-0022.md │ │ │ │ │ ├── ARCs:specs:arc-0023.md │ │ │ │ │ ├── ARCs:specs:arc-0025.md │ │ │ │ │ ├── ARCs:specs:arc-0026.md │ │ │ │ │ ├── ARCs:specs:arc-0028.md │ │ │ │ │ ├── ARCs:specs:arc-0032.md │ │ │ │ │ ├── ARCs:specs:arc-0033.md │ │ │ │ │ ├── ARCs:specs:arc-0034.md │ │ │ │ │ ├── ARCs:specs:arc-0035.md │ │ │ │ │ ├── ARCs:specs:arc-0036.md │ │ │ │ │ ├── ARCs:specs:arc-0042.md │ │ │ │ │ ├── ARCs:specs:arc-0047.md │ │ │ │ │ ├── ARCs:specs:arc-0048.md │ │ │ │ │ ├── ARCs:specs:arc-0049.md │ │ │ │ │ ├── ARCs:specs:arc-0054.md │ │ │ │ │ ├── ARCs:specs:arc-0055.md │ │ │ │ │ ├── ARCs:specs:arc-0056.md │ │ │ │ │ ├── ARCs:specs:arc-0059.md │ │ │ │ │ ├── ARCs:specs:arc-0062.md │ │ │ │ │ ├── ARCs:specs:arc-0065.md │ │ │ │ │ ├── ARCs:specs:arc-0069.md │ │ │ │ │ ├── ARCs:specs:arc-0072.md │ │ │ │ │ ├── ARCs:specs:arc-0073.md │ │ │ │ │ ├── ARCs:specs:arc-0074.md │ │ │ │ │ ├── ARCs:specs:arc-0076.md │ │ │ │ │ ├── ARCs:specs:arc-0078.md │ │ │ │ │ ├── ARCs:specs:arc-0079.md │ │ │ │ │ ├── ARCs:specs:arc-0200.md │ │ │ │ │ ├── clis_index.md │ │ │ │ │ ├── developer:docs:about.md │ │ │ │ │ ├── developer:docs:clis:algokey:algokey.md │ │ │ │ │ ├── developer:docs:clis:algokey:generate.md │ │ │ │ │ ├── developer:docs:clis:algokey:import.md │ │ │ │ │ ├── developer:docs:clis:algokey:multisig:append-auth-addr.md │ │ │ │ │ ├── developer:docs:clis:algokey:multisig:multisig.md │ │ │ │ │ ├── developer:docs:clis:algokey:part:info.md │ │ │ │ │ ├── developer:docs:clis:algokey:part:part.md │ │ │ │ │ ├── developer:docs:clis:algokey:part:reparent.md │ │ │ │ │ ├── developer:docs:clis:algokey:sign.md │ │ │ │ │ ├── developer:docs:clis:conduit:conduit.md │ │ │ │ │ ├── developer:docs:clis:conduit:init.md │ │ │ │ │ ├── developer:docs:clis:conduit:list:exporters.md │ │ │ │ │ ├── developer:docs:clis:conduit:list:importers.md │ │ │ │ │ ├── developer:docs:clis:conduit:list:list.md │ │ │ │ │ ├── developer:docs:clis:conduit:list:processors.md │ │ │ │ │ ├── developer:docs:clis:diagcfg:diagcfg.md │ │ │ │ │ ├── developer:docs:clis:diagcfg:metric:disable.md │ │ │ │ │ ├── developer:docs:clis:diagcfg:metric:enable.md │ │ │ │ │ ├── developer:docs:clis:diagcfg:metric:metric.md │ │ │ │ │ ├── developer:docs:clis:diagcfg:metric:status.md │ │ │ │ │ ├── developer:docs:clis:diagcfg:telemetry:disable.md │ │ │ │ │ ├── developer:docs:clis:diagcfg:telemetry:enable.md │ │ │ │ │ ├── developer:docs:clis:diagcfg:telemetry:endpoint.md │ │ │ │ │ ├── developer:docs:clis:diagcfg:telemetry:name.md │ │ │ │ │ ├── developer:docs:clis:diagcfg:telemetry:status.md │ │ │ │ │ ├── developer:docs:clis:diagcfg:telemetry:telemetry.md │ │ │ │ │ ├── developer:docs:clis:goal:node:restart.md │ │ │ │ │ ├── developer:docs:clis:goal:node:start.md │ │ │ │ │ ├── developer:docs:clis:goal:node:status.md │ │ │ │ │ ├── developer:docs:clis:goal:node:stop.md │ │ │ │ │ ├── developer:docs:clis:goal:node:wait.md │ │ │ │ │ ├── developer:docs:clis:goal:protocols.md │ │ │ │ │ ├── developer:docs:clis:goal:report.md │ │ │ │ │ ├── developer:docs:clis:goal:version.md │ │ │ │ │ ├── developer:docs:clis:goal:wallet:list.md │ │ │ │ │ ├── developer:docs:clis:goal:wallet:new.md │ │ │ │ │ ├── developer:docs:clis:goal:wallet:wallet.md │ │ │ │ │ ├── developer:docs:clis:indexer:api-config.md │ │ │ │ │ ├── developer:docs:clis:indexer:daemon.md │ │ │ │ │ ├── developer:docs:clis:indexer:indexer.md │ │ │ │ │ ├── developer:docs:clis:indexer:util:util.md │ │ │ │ │ ├── developer:docs:clis:indexer:util:validator.md │ │ │ │ │ ├── developer:docs:clis:kmd.md │ │ │ │ │ ├── developer:docs:clis:tealdbg:debug.md │ │ │ │ │ ├── developer:docs:clis:tealdbg:remote.md │ │ │ │ │ ├── developer:docs:clis:tealdbg:tealdbg.md │ │ │ │ │ ├── developer:docs:details:accounts:create.md │ │ │ │ │ ├── developer:docs:details:accounts:index.md │ │ │ │ │ ├── developer:docs:details:accounts:rekey.md │ │ │ │ │ ├── developer:docs:details:algorand_consensus.md │ │ │ │ │ ├── developer:docs:details:algorand-networks:betanet.md │ │ │ │ │ ├── developer:docs:details:algorand-networks:index.md │ │ │ │ │ ├── developer:docs:details:algorand-networks:mainnet.md │ │ │ │ │ ├── developer:docs:details:algorand-networks:testnet.md │ │ │ │ │ ├── developer:docs:details:asa.md │ │ │ │ │ ├── developer:docs:details:atc.md │ │ │ │ │ ├── developer:docs:details:atomic_transfers.md │ │ │ │ │ ├── developer:docs:details:conduit.md │ │ │ │ │ ├── developer:docs:details:crust.md │ │ │ │ │ ├── developer:docs:details:dapps:avm:index.md │ │ │ │ │ ├── developer:docs:details:dapps:avm:teal:guidelines.md │ │ │ │ │ ├── developer:docs:details:dapps:avm:teal:index.md │ │ │ │ │ ├── developer:docs:details:dapps:avm:teal:jsonspec.md │ │ │ │ │ ├── developer:docs:details:dapps:avm:teal:opcodes:index.md │ │ │ │ │ ├── developer:docs:details:dapps:avm:teal:opcodes:v1.md │ │ │ │ │ ├── developer:docs:details:dapps:avm:teal:opcodes:v10.md │ │ │ │ │ ├── developer:docs:details:dapps:avm:teal:opcodes:v2.md │ │ │ │ │ ├── developer:docs:details:dapps:avm:teal:opcodes:v3.md │ │ │ │ │ ├── developer:docs:details:dapps:avm:teal:opcodes:v4.md │ │ │ │ │ ├── developer:docs:details:dapps:avm:teal:opcodes:v5.md │ │ │ │ │ ├── developer:docs:details:dapps:avm:teal:opcodes:v6.md │ │ │ │ │ ├── developer:docs:details:dapps:avm:teal:opcodes:v7.md │ │ │ │ │ ├── developer:docs:details:dapps:avm:teal:opcodes:v8.md │ │ │ │ │ ├── developer:docs:details:dapps:avm:teal:opcodes:v9.md │ │ │ │ │ ├── developer:docs:details:dapps:avm:teal:specification.md │ │ │ │ │ ├── developer:docs:details:dapps:smart-contracts:ABI:index.md │ │ │ │ │ ├── developer:docs:details:dapps:smart-contracts:apps:create.md │ │ │ │ │ ├── developer:docs:details:dapps:smart-contracts:apps:index.md │ │ │ │ │ ├── developer:docs:details:dapps:smart-contracts:apps:innertx.md │ │ │ │ │ ├── developer:docs:details:dapps:smart-contracts:apps:state.md │ │ │ │ │ ├── developer:docs:details:dapps:smart-contracts:apps:txs.md │ │ │ │ │ ├── developer:docs:details:dapps:smart-contracts:debugging.md │ │ │ │ │ ├── developer:docs:details:dapps:smart-contracts:frontend:apps.md │ │ │ │ │ ├── developer:docs:details:dapps:smart-contracts:frontend:smartsigs.md │ │ │ │ │ ├── developer:docs:details:dapps:smart-contracts:guidelines.md │ │ │ │ │ ├── developer:docs:details:dapps:smart-contracts:index.md │ │ │ │ │ ├── developer:docs:details:dapps:smart-contracts:smartsigs:index.md │ │ │ │ │ ├── developer:docs:details:dapps:smart-contracts:smartsigs:modes.md │ │ │ │ │ ├── developer:docs:details:dapps:smart-contracts:smartsigs:walkthrough.md │ │ │ │ │ ├── developer:docs:details:dapps:writing-contracts:beaker.md │ │ │ │ │ ├── developer:docs:details:dapps:writing-contracts:pyteal.md │ │ │ │ │ ├── developer:docs:details:dapps:writing-contracts:python.md │ │ │ │ │ ├── developer:docs:details:encoding.md │ │ │ │ │ ├── developer:docs:details:ethereum_to_algorand.md │ │ │ │ │ ├── developer:docs:details:index.md │ │ │ │ │ ├── developer:docs:details:indexer.md │ │ │ │ │ ├── developer:docs:details:parameter_tables.md │ │ │ │ │ ├── developer:docs:details:stateproofs:index.md │ │ │ │ │ ├── developer:docs:details:stateproofs:light_client.md │ │ │ │ │ ├── developer:docs:details:technical_faq.md │ │ │ │ │ ├── developer:docs:details:transactions:index.md │ │ │ │ │ ├── developer:docs:details:transactions:offline_transactions.md │ │ │ │ │ ├── developer:docs:details:transactions:payment_prompts.md │ │ │ │ │ ├── developer:docs:details:transactions:signatures.md │ │ │ │ │ ├── developer:docs:details:transactions:transactions.md │ │ │ │ │ ├── developer:docs:details:useful_resources.md │ │ │ │ │ ├── developer:docs:get-started:algokit.md │ │ │ │ │ ├── developer:docs:get-started:basics:what_is_blockchain.md │ │ │ │ │ ├── developer:docs:get-started:basics:whats_a_dapp.md │ │ │ │ │ ├── developer:docs:get-started:basics:where_to_start.md │ │ │ │ │ ├── developer:docs:get-started:basics:why_algorand.md │ │ │ │ │ ├── developer:docs:get-started:tokenization:ft.md │ │ │ │ │ ├── developer:docs:get-started:tokenization:nft.md │ │ │ │ │ ├── developer:docs:index.md │ │ │ │ │ ├── developer:docs:rest-apis:algod.md │ │ │ │ │ ├── developer:docs:rest-apis:indexer.md │ │ │ │ │ ├── developer:docs:rest-apis:kmd.md │ │ │ │ │ ├── developer:docs:rest-apis:restendpoints.md │ │ │ │ │ ├── developer:docs:run-a-node:operations:catchup.md │ │ │ │ │ ├── developer:docs:run-a-node:operations:switch_networks.md │ │ │ │ │ ├── developer:docs:run-a-node:participate:generate_keys.md │ │ │ │ │ ├── developer:docs:run-a-node:participate:index.md │ │ │ │ │ ├── developer:docs:run-a-node:participate:offline.md │ │ │ │ │ ├── developer:docs:run-a-node:participate:online.md │ │ │ │ │ ├── developer:docs:run-a-node:participate:renew.md │ │ │ │ │ ├── developer:docs:run-a-node:reference:artifacts.md │ │ │ │ │ ├── developer:docs:run-a-node:reference:config.md │ │ │ │ │ ├── developer:docs:run-a-node:reference:relay.md │ │ │ │ │ ├── developer:docs:run-a-node:reference:telemetry-config.md │ │ │ │ │ ├── developer:docs:run-a-node:setup:indexer.md │ │ │ │ │ ├── developer:docs:run-a-node:setup:install.md │ │ │ │ │ ├── developer:docs:run-a-node:setup:node-troubleshooting.md │ │ │ │ │ ├── developer:docs:run-a-node:setup:types.md │ │ │ │ │ ├── developer:docs:sdks:go:index.md │ │ │ │ │ ├── developer:docs:sdks:index.md │ │ │ │ │ ├── developer:docs:sdks:java:index.md │ │ │ │ │ ├── developer:docs:sdks:javascript:index.md │ │ │ │ │ ├── developer:docs:sdks:python:index.md │ │ │ │ │ ├── developer:python:code:example:accounts.md │ │ │ │ │ ├── developer:python:code:example:arc4_types.md │ │ │ │ │ ├── developer:python:code:example:assets.md │ │ │ │ │ ├── developer:python:code:example:box_storage.md │ │ │ │ │ ├── developer:python:code:example:control_flow.md │ │ │ │ │ ├── developer:python:code:example:crypto:merkle_tree.md │ │ │ │ │ ├── developer:python:code:example:defi:amm.md │ │ │ │ │ ├── developer:python:code:example:defi:auction.md │ │ │ │ │ ├── developer:python:code:example:defi:htlc_logicsig.md │ │ │ │ │ ├── developer:python:code:example:defi:marketplace.md │ │ │ │ │ ├── developer:python:code:example:events:arc28_events.md │ │ │ │ │ ├── developer:python:code:example:global_storage.md │ │ │ │ │ ├── developer:python:code:example:governance:simple_voting.md │ │ │ │ │ ├── developer:python:code:example:hello_world.md │ │ │ │ │ ├── developer:python:code:example:inner_transactions.md │ │ │ │ │ ├── developer:python:code:example:local_storage.md │ │ │ │ │ ├── developer:python:code:example:nft:proof_of_attendance.md │ │ │ │ │ ├── developer:python:code:example:privacy:zk_whitelist.md │ │ │ │ │ ├── developer:python:code:example:scratch_storage.md │ │ │ │ │ ├── developer:python:code:example:self_payment.md │ │ │ │ │ ├── developer:python:code:example:struct_in_box.md │ │ │ │ │ ├── developer:python:code:example:subsidize_app_call.md │ │ │ │ │ ├── developer:python:code:example:transactions.md │ │ │ │ │ ├── developer:python:code:example:utility:calculator.md │ │ │ │ │ ├── devportal-code-examples:projects:python-contract-examples:README.md │ │ │ │ │ ├── devportal-code-examples:README.md │ │ │ │ │ ├── docs:.walletconnect:index.md │ │ │ │ │ ├── docs:.walletconnect:walletconnect-schema.md │ │ │ │ │ ├── docs:README.md │ │ │ │ │ ├── docs:scripts:example_tracker:example_list.md │ │ │ │ │ ├── docs:scripts:README.md │ │ │ │ │ ├── index.md │ │ │ │ │ ├── liquid_auth_index.md │ │ │ │ │ ├── liquid-auth:ARCHITECTURE.md │ │ │ │ │ ├── liquid-auth:decisions:1-Service-Authentication.md │ │ │ │ │ ├── liquid-auth:decisions:2-Bidirectional-Communication.md │ │ │ │ │ ├── liquid-auth:decisions:3-Peer-to-Peer-Signaling.md │ │ │ │ │ ├── liquid-auth:decisions:4-Fido-Extension.md │ │ │ │ │ ├── liquid-auth:decisions:README.md │ │ │ │ │ ├── liquid-auth:docs:architecture.md │ │ │ │ │ ├── liquid-auth:docs:clients:android:provider-service:authenticate.md │ │ │ │ │ ├── liquid-auth:docs:clients:android:provider-service:register.md │ │ │ │ │ ├── liquid-auth:docs:clients:browser:authentication.md │ │ │ │ │ ├── liquid-auth:docs:clients:browser:example.md │ │ │ │ │ ├── liquid-auth:docs:introduction.md │ │ │ │ │ ├── liquid-auth:docs:README.md │ │ │ │ │ ├── liquid-auth:docs:server:environment-variables.md │ │ │ │ │ ├── liquid-auth:docs:server:integrations.md │ │ │ │ │ ├── liquid-auth:docs:server:introduction.md │ │ │ │ │ ├── liquid-auth:docs:server:running-locally.md │ │ │ │ │ ├── liquid-auth:README.md │ │ │ │ │ ├── liquid-auth:SEQUENCE.md │ │ │ │ │ ├── liquid-auth:services:liquid-auth-api-js:src:assertion:assertion.controller.post.request.md │ │ │ │ │ ├── liquid-auth:services:liquid-auth-api-js:src:assertion:assertion.controller.post.response.md │ │ │ │ │ ├── liquid-auth:services:liquid-auth-api-js:src:attestation:attestation.controller.post.request.md │ │ │ │ │ ├── liquid-auth:services:liquid-auth-api-js:src:auth:auth.controller.get.user.md │ │ │ │ │ ├── liquid-auth:sites:express-dapp:README.md │ │ │ │ │ ├── liquid-auth:VISION.md │ │ │ │ │ ├── puya_index.md │ │ │ │ │ ├── puya:docs:algopy_testing:index.md │ │ │ │ │ ├── puya:docs:api-algopy.arc4.md │ │ │ │ │ ├── puya:docs:api-algopy.gtxn.md │ │ │ │ │ ├── puya:docs:api-algopy.itxn.md │ │ │ │ │ ├── puya:docs:api-algopy.md │ │ │ │ │ ├── puya:docs:api-algopy.op.md │ │ │ │ │ ├── puya:docs:api.md │ │ │ │ │ ├── puya:docs:compiler.md │ │ │ │ │ ├── puya:docs:index.md │ │ │ │ │ ├── puya:docs:language-guide.md │ │ │ │ │ ├── puya:docs:lg-arc28.md │ │ │ │ │ ├── puya:docs:lg-arc4.md │ │ │ │ │ ├── puya:docs:lg-builtins.md │ │ │ │ │ ├── puya:docs:lg-calling-apps.md │ │ │ │ │ ├── puya:docs:lg-compile.md │ │ │ │ │ ├── puya:docs:lg-control.md │ │ │ │ │ ├── puya:docs:lg-errors.md │ │ │ │ │ ├── puya:docs:lg-logs.md │ │ │ │ │ ├── puya:docs:lg-modules.md │ │ │ │ │ ├── puya:docs:lg-opcode-budget.md │ │ │ │ │ ├── puya:docs:lg-ops.md │ │ │ │ │ ├── puya:docs:lg-storage.md │ │ │ │ │ ├── puya:docs:lg-structure.md │ │ │ │ │ ├── puya:docs:lg-transactions.md │ │ │ │ │ ├── puya:docs:lg-types.md │ │ │ │ │ ├── puya:docs:lg-unsupported-python-features.md │ │ │ │ │ ├── puya:docs:principles.md │ │ │ │ │ ├── puya:examples:auction:README.md │ │ │ │ │ ├── puya:python:testing:docs:algopy.md │ │ │ │ │ ├── puya:python:testing:docs:api.md │ │ │ │ │ ├── puya:python:testing:docs:coverage.md │ │ │ │ │ ├── puya:python:testing:docs:examples.md │ │ │ │ │ ├── puya:python:testing:docs:faq.md │ │ │ │ │ ├── puya:python:testing:docs:index.md │ │ │ │ │ ├── puya:python:testing:docs:testing-guide:arc4-types.md │ │ │ │ │ ├── puya:python:testing:docs:testing-guide:avm-types.md │ │ │ │ │ ├── puya:python:testing:docs:testing-guide:concepts.md │ │ │ │ │ ├── puya:python:testing:docs:testing-guide:contract-testing.md │ │ │ │ │ ├── puya:python:testing:docs:testing-guide:index.md │ │ │ │ │ ├── puya:python:testing:docs:testing-guide:opcodes.md │ │ │ │ │ ├── puya:python:testing:docs:testing-guide:signature-testing.md │ │ │ │ │ ├── puya:python:testing:docs:testing-guide:state-management.md │ │ │ │ │ ├── puya:python:testing:docs:testing-guide:subroutines.md │ │ │ │ │ ├── puya:python:testing:docs:testing-guide:transactions.md │ │ │ │ │ ├── puya:python:testing:examples:README.md │ │ │ │ │ ├── puya:python:testing:README.md │ │ │ │ │ ├── puya:README.md │ │ │ │ │ ├── puya:src:puya:ARCHITECTURE.md │ │ │ │ │ ├── puya:src:puyapy:_typeshed:README.md │ │ │ │ │ ├── puya:src:puyapy:_vendor:mypy:typeshed:stdlib:_typeshed:README.md │ │ │ │ │ ├── puya:src:puyapy:awst_build:README.md │ │ │ │ │ ├── puya:stubs:README.md │ │ │ │ │ ├── puya:tests:test_expected_output:README.md │ │ │ │ │ ├── puya:typescript:docs:architecture-decisions:2024-05-21_primitive-bytes-and-strings.md │ │ │ │ │ ├── puya:typescript:docs:architecture-decisions:2024-05-21_primitive-integer-types.md │ │ │ │ │ ├── puya:typescript:docs:README.md │ │ │ │ │ ├── puya:typescript:packages:algo-ts:readme.md │ │ │ │ │ ├── puya:typescript:README.md │ │ │ │ │ ├── SDKs:javascript:classes:ABIAddressType.md │ │ │ │ │ ├── SDKs:javascript:classes:ABIArrayDynamicType.md │ │ │ │ │ ├── SDKs:javascript:classes:ABIArrayStaticType.md │ │ │ │ │ ├── SDKs:javascript:classes:ABIBoolType.md │ │ │ │ │ ├── SDKs:javascript:classes:ABIByteType.md │ │ │ │ │ ├── SDKs:javascript:classes:ABIContract.md │ │ │ │ │ ├── SDKs:javascript:classes:ABIInterface.md │ │ │ │ │ ├── SDKs:javascript:classes:ABIMethod.md │ │ │ │ │ ├── SDKs:javascript:classes:ABIStringType.md │ │ │ │ │ ├── SDKs:javascript:classes:ABITupleType.md │ │ │ │ │ ├── SDKs:javascript:classes:ABIType.md │ │ │ │ │ ├── SDKs:javascript:classes:ABIUfixedType.md │ │ │ │ │ ├── SDKs:javascript:classes:ABIUintType.md │ │ │ │ │ ├── SDKs:javascript:classes:Algodv2.md │ │ │ │ │ ├── SDKs:javascript:classes:AtomicTransactionComposer.md │ │ │ │ │ ├── SDKs:javascript:classes:DryrunResult.md │ │ │ │ │ ├── SDKs:javascript:classes:Indexer.md │ │ │ │ │ ├── SDKs:javascript:classes:indexerModels.Account.md │ │ │ │ │ ├── SDKs:javascript:classes:indexerModels.AccountParticipation.md │ │ │ │ │ ├── SDKs:javascript:classes:indexerModels.AccountResponse.md │ │ │ │ │ ├── SDKs:javascript:classes:indexerModels.AccountsResponse.md │ │ │ │ │ ├── SDKs:javascript:classes:indexerModels.AccountStateDelta.md │ │ │ │ │ ├── SDKs:javascript:classes:indexerModels.Application.md │ │ │ │ │ ├── SDKs:javascript:classes:indexerModels.ApplicationLocalState.md │ │ │ │ │ ├── SDKs:javascript:classes:indexerModels.ApplicationLocalStatesResponse.md │ │ │ │ │ ├── SDKs:javascript:classes:indexerModels.ApplicationLogData.md │ │ │ │ │ ├── SDKs:javascript:classes:indexerModels.ApplicationLogsResponse.md │ │ │ │ │ ├── SDKs:javascript:classes:indexerModels.ApplicationParams.md │ │ │ │ │ ├── SDKs:javascript:classes:indexerModels.ApplicationResponse.md │ │ │ │ │ ├── SDKs:javascript:classes:indexerModels.ApplicationsResponse.md │ │ │ │ │ ├── SDKs:javascript:classes:indexerModels.ApplicationStateSchema.md │ │ │ │ │ ├── SDKs:javascript:classes:indexerModels.Asset.md │ │ │ │ │ ├── SDKs:javascript:classes:indexerModels.AssetBalancesResponse.md │ │ │ │ │ ├── SDKs:javascript:classes:indexerModels.AssetHolding.md │ │ │ │ │ ├── SDKs:javascript:classes:indexerModels.AssetHoldingsResponse.md │ │ │ │ │ ├── SDKs:javascript:classes:indexerModels.AssetParams.md │ │ │ │ │ ├── SDKs:javascript:classes:indexerModels.AssetResponse.md │ │ │ │ │ ├── SDKs:javascript:classes:indexerModels.AssetsResponse.md │ │ │ │ │ ├── SDKs:javascript:classes:indexerModels.Block.md │ │ │ │ │ ├── SDKs:javascript:classes:indexerModels.BlockRewards.md │ │ │ │ │ ├── SDKs:javascript:classes:indexerModels.BlockUpgradeState.md │ │ │ │ │ ├── SDKs:javascript:classes:indexerModels.BlockUpgradeVote.md │ │ │ │ │ ├── SDKs:javascript:classes:indexerModels.Box.md │ │ │ │ │ ├── SDKs:javascript:classes:indexerModels.BoxDescriptor.md │ │ │ │ │ ├── SDKs:javascript:classes:indexerModels.BoxesResponse.md │ │ │ │ │ ├── SDKs:javascript:classes:indexerModels.ErrorResponse.md │ │ │ │ │ ├── SDKs:javascript:classes:indexerModels.EvalDelta.md │ │ │ │ │ ├── SDKs:javascript:classes:indexerModels.EvalDeltaKeyValue.md │ │ │ │ │ ├── SDKs:javascript:classes:indexerModels.HashFactory.md │ │ │ │ │ ├── SDKs:javascript:classes:indexerModels.HealthCheck.md │ │ │ │ │ ├── SDKs:javascript:classes:indexerModels.IndexerStateProofMessage.md │ │ │ │ │ ├── SDKs:javascript:classes:indexerModels.MerkleArrayProof.md │ │ │ │ │ ├── SDKs:javascript:classes:indexerModels.MiniAssetHolding.md │ │ │ │ │ ├── SDKs:javascript:classes:indexerModels.ParticipationUpdates.md │ │ │ │ │ ├── SDKs:javascript:classes:indexerModels.StateProofFields.md │ │ │ │ │ ├── SDKs:javascript:classes:indexerModels.StateProofParticipant.md │ │ │ │ │ ├── SDKs:javascript:classes:indexerModels.StateProofReveal.md │ │ │ │ │ ├── SDKs:javascript:classes:indexerModels.StateProofSignature.md │ │ │ │ │ ├── SDKs:javascript:classes:indexerModels.StateProofSigSlot.md │ │ │ │ │ ├── SDKs:javascript:classes:indexerModels.StateProofTracking.md │ │ │ │ │ ├── SDKs:javascript:classes:indexerModels.StateProofVerifier.md │ │ │ │ │ ├── SDKs:javascript:classes:indexerModels.StateSchema.md │ │ │ │ │ ├── SDKs:javascript:classes:indexerModels.TealKeyValue.md │ │ │ │ │ ├── SDKs:javascript:classes:indexerModels.TealValue.md │ │ │ │ │ ├── SDKs:javascript:classes:indexerModels.Transaction.md │ │ │ │ │ ├── SDKs:javascript:classes:indexerModels.TransactionApplication.md │ │ │ │ │ ├── SDKs:javascript:classes:indexerModels.TransactionAssetConfig.md │ │ │ │ │ ├── SDKs:javascript:classes:indexerModels.TransactionAssetFreeze.md │ │ │ │ │ ├── SDKs:javascript:classes:indexerModels.TransactionAssetTransfer.md │ │ │ │ │ ├── SDKs:javascript:classes:indexerModels.TransactionKeyreg.md │ │ │ │ │ ├── SDKs:javascript:classes:indexerModels.TransactionPayment.md │ │ │ │ │ ├── SDKs:javascript:classes:indexerModels.TransactionResponse.md │ │ │ │ │ ├── SDKs:javascript:classes:indexerModels.TransactionSignature.md │ │ │ │ │ ├── SDKs:javascript:classes:indexerModels.TransactionSignatureLogicsig.md │ │ │ │ │ ├── SDKs:javascript:classes:indexerModels.TransactionSignatureMultisig.md │ │ │ │ │ ├── SDKs:javascript:classes:indexerModels.TransactionSignatureMultisigSubsignature.md │ │ │ │ │ ├── SDKs:javascript:classes:indexerModels.TransactionsResponse.md │ │ │ │ │ ├── SDKs:javascript:classes:indexerModels.TransactionStateProof.md │ │ │ │ │ ├── SDKs:javascript:classes:Kmd.md │ │ │ │ │ ├── SDKs:javascript:classes:LogicSig.md │ │ │ │ │ ├── SDKs:javascript:classes:LogicSigAccount.md │ │ │ │ │ ├── SDKs:javascript:classes:modelsv2.Account.md │ │ │ │ │ ├── SDKs:javascript:classes:modelsv2.AccountApplicationResponse.md │ │ │ │ │ ├── SDKs:javascript:classes:modelsv2.AccountAssetHolding.md │ │ │ │ │ ├── SDKs:javascript:classes:modelsv2.AccountAssetResponse.md │ │ │ │ │ ├── SDKs:javascript:classes:modelsv2.AccountAssetsInformationResponse.md │ │ │ │ │ ├── SDKs:javascript:classes:modelsv2.AccountParticipation.md │ │ │ │ │ ├── SDKs:javascript:classes:modelsv2.AccountStateDelta.md │ │ │ │ │ ├── SDKs:javascript:classes:modelsv2.AppCallLogs.md │ │ │ │ │ ├── SDKs:javascript:classes:modelsv2.Application.md │ │ │ │ │ ├── SDKs:javascript:classes:modelsv2.ApplicationInitialStates.md │ │ │ │ │ ├── SDKs:javascript:classes:modelsv2.ApplicationKVStorage.md │ │ │ │ │ ├── SDKs:javascript:classes:modelsv2.ApplicationLocalReference.md │ │ │ │ │ ├── SDKs:javascript:classes:modelsv2.ApplicationLocalState.md │ │ │ │ │ ├── SDKs:javascript:classes:modelsv2.ApplicationParams.md │ │ │ │ │ ├── SDKs:javascript:classes:modelsv2.ApplicationStateOperation.md │ │ │ │ │ ├── SDKs:javascript:classes:modelsv2.ApplicationStateSchema.md │ │ │ │ │ ├── SDKs:javascript:classes:modelsv2.Asset.md │ │ │ │ │ ├── SDKs:javascript:classes:modelsv2.AssetHolding.md │ │ │ │ │ ├── SDKs:javascript:classes:modelsv2.AssetHoldingReference.md │ │ │ │ │ ├── SDKs:javascript:classes:modelsv2.AssetParams.md │ │ │ │ │ ├── SDKs:javascript:classes:modelsv2.AvmKeyValue.md │ │ │ │ │ ├── SDKs:javascript:classes:modelsv2.AvmValue.md │ │ │ │ │ ├── SDKs:javascript:classes:modelsv2.BlockHashResponse.md │ │ │ │ │ ├── SDKs:javascript:classes:modelsv2.BlockLogsResponse.md │ │ │ │ │ ├── SDKs:javascript:classes:modelsv2.BlockResponse.md │ │ │ │ │ ├── SDKs:javascript:classes:modelsv2.BlockTxidsResponse.md │ │ │ │ │ ├── SDKs:javascript:classes:modelsv2.Box.md │ │ │ │ │ ├── SDKs:javascript:classes:modelsv2.BoxDescriptor.md │ │ │ │ │ ├── SDKs:javascript:classes:modelsv2.BoxesResponse.md │ │ │ │ │ ├── SDKs:javascript:classes:modelsv2.BoxReference.md │ │ │ │ │ ├── SDKs:javascript:classes:modelsv2.BuildVersion.md │ │ │ │ │ ├── SDKs:javascript:classes:modelsv2.CompileResponse.md │ │ │ │ │ ├── SDKs:javascript:classes:modelsv2.DisassembleResponse.md │ │ │ │ │ ├── SDKs:javascript:classes:modelsv2.DryrunRequest.md │ │ │ │ │ ├── SDKs:javascript:classes:modelsv2.DryrunResponse.md │ │ │ │ │ ├── SDKs:javascript:classes:modelsv2.DryrunSource.md │ │ │ │ │ ├── SDKs:javascript:classes:modelsv2.DryrunState.md │ │ │ │ │ ├── SDKs:javascript:classes:modelsv2.DryrunTxnResult.md │ │ │ │ │ ├── SDKs:javascript:classes:modelsv2.ErrorResponse.md │ │ │ │ │ ├── SDKs:javascript:classes:modelsv2.EvalDelta.md │ │ │ │ │ ├── SDKs:javascript:classes:modelsv2.EvalDeltaKeyValue.md │ │ │ │ │ ├── SDKs:javascript:classes:modelsv2.GetBlockTimeStampOffsetResponse.md │ │ │ │ │ ├── SDKs:javascript:classes:modelsv2.GetSyncRoundResponse.md │ │ │ │ │ ├── SDKs:javascript:classes:modelsv2.KvDelta.md │ │ │ │ │ ├── SDKs:javascript:classes:modelsv2.LedgerStateDeltaForTransactionGroup.md │ │ │ │ │ ├── SDKs:javascript:classes:modelsv2.LightBlockHeaderProof.md │ │ │ │ │ ├── SDKs:javascript:classes:modelsv2.NodeStatusResponse.md │ │ │ │ │ ├── SDKs:javascript:classes:modelsv2.PendingTransactionResponse.md │ │ │ │ │ ├── SDKs:javascript:classes:modelsv2.PendingTransactionsResponse.md │ │ │ │ │ ├── SDKs:javascript:classes:modelsv2.PostTransactionsResponse.md │ │ │ │ │ ├── SDKs:javascript:classes:modelsv2.ScratchChange.md │ │ │ │ │ ├── SDKs:javascript:classes:modelsv2.SimulateInitialStates.md │ │ │ │ │ ├── SDKs:javascript:classes:modelsv2.SimulateRequest.md │ │ │ │ │ ├── SDKs:javascript:classes:modelsv2.SimulateRequestTransactionGroup.md │ │ │ │ │ ├── SDKs:javascript:classes:modelsv2.SimulateResponse.md │ │ │ │ │ ├── SDKs:javascript:classes:modelsv2.SimulateTraceConfig.md │ │ │ │ │ ├── SDKs:javascript:classes:modelsv2.SimulateTransactionGroupResult.md │ │ │ │ │ ├── SDKs:javascript:classes:modelsv2.SimulateTransactionResult.md │ │ │ │ │ ├── SDKs:javascript:classes:modelsv2.SimulateUnnamedResourcesAccessed.md │ │ │ │ │ ├── SDKs:javascript:classes:modelsv2.SimulationEvalOverrides.md │ │ │ │ │ ├── SDKs:javascript:classes:modelsv2.SimulationOpcodeTraceUnit.md │ │ │ │ │ ├── SDKs:javascript:classes:modelsv2.SimulationTransactionExecTrace.md │ │ │ │ │ ├── SDKs:javascript:classes:modelsv2.StateProof.md │ │ │ │ │ ├── SDKs:javascript:classes:modelsv2.StateProofMessage.md │ │ │ │ │ ├── SDKs:javascript:classes:modelsv2.SupplyResponse.md │ │ │ │ │ ├── SDKs:javascript:classes:modelsv2.TealKeyValue.md │ │ │ │ │ ├── SDKs:javascript:classes:modelsv2.TealValue.md │ │ │ │ │ ├── SDKs:javascript:classes:modelsv2.TransactionGroupLedgerStateDeltasForRoundResponse.md │ │ │ │ │ ├── SDKs:javascript:classes:modelsv2.TransactionParametersResponse.md │ │ │ │ │ ├── SDKs:javascript:classes:modelsv2.TransactionProofResponse.md │ │ │ │ │ ├── SDKs:javascript:classes:modelsv2.Version.md │ │ │ │ │ ├── SDKs:javascript:classes:SourceMap.md │ │ │ │ │ ├── SDKs:javascript:classes:Transaction.md │ │ │ │ │ ├── SDKs:javascript:enums:ABIReferenceType.md │ │ │ │ │ ├── SDKs:javascript:enums:ABITransactionType.md │ │ │ │ │ ├── SDKs:javascript:enums:AtomicTransactionComposerStatus.md │ │ │ │ │ ├── SDKs:javascript:enums:IntDecoding.md │ │ │ │ │ ├── SDKs:javascript:enums:OnApplicationComplete.md │ │ │ │ │ ├── SDKs:javascript:enums:TransactionType.md │ │ │ │ │ ├── SDKs:javascript:examples:README.md │ │ │ │ │ ├── SDKs:javascript:FAQ.md │ │ │ │ │ ├── SDKs:javascript:interfaces:ABIContractNetworkInfo.md │ │ │ │ │ ├── SDKs:javascript:interfaces:ABIContractNetworks.md │ │ │ │ │ ├── SDKs:javascript:interfaces:ABIContractParams.md │ │ │ │ │ ├── SDKs:javascript:interfaces:ABIInterfaceParams.md │ │ │ │ │ ├── SDKs:javascript:interfaces:ABIMethodArgParams.md │ │ │ │ │ ├── SDKs:javascript:interfaces:ABIMethodParams.md │ │ │ │ │ ├── SDKs:javascript:interfaces:ABIMethodReturnParams.md │ │ │ │ │ ├── SDKs:javascript:interfaces:ABIResult.md │ │ │ │ │ ├── SDKs:javascript:interfaces:Account.md │ │ │ │ │ ├── SDKs:javascript:interfaces:Address.md │ │ │ │ │ ├── SDKs:javascript:interfaces:AlgodTokenHeader.md │ │ │ │ │ ├── SDKs:javascript:interfaces:BaseHTTPClient.md │ │ │ │ │ ├── SDKs:javascript:interfaces:BaseHTTPClientError.md │ │ │ │ │ ├── SDKs:javascript:interfaces:BaseHTTPClientResponse.md │ │ │ │ │ ├── SDKs:javascript:interfaces:BoxReference.md │ │ │ │ │ ├── SDKs:javascript:interfaces:CustomTokenHeader.md │ │ │ │ │ ├── SDKs:javascript:interfaces:EncodedAssetParams.md │ │ │ │ │ ├── SDKs:javascript:interfaces:EncodedBoxReference.md │ │ │ │ │ ├── SDKs:javascript:interfaces:EncodedGlobalStateSchema.md │ │ │ │ │ ├── SDKs:javascript:interfaces:EncodedLocalStateSchema.md │ │ │ │ │ ├── SDKs:javascript:interfaces:EncodedLogicSig.md │ │ │ │ │ ├── SDKs:javascript:interfaces:EncodedLogicSigAccount.md │ │ │ │ │ ├── SDKs:javascript:interfaces:EncodedMultisig.md │ │ │ │ │ ├── SDKs:javascript:interfaces:EncodedSignedTransaction.md │ │ │ │ │ ├── SDKs:javascript:interfaces:EncodedSubsig.md │ │ │ │ │ ├── SDKs:javascript:interfaces:EncodedTransaction.md │ │ │ │ │ ├── SDKs:javascript:interfaces:IndexerTokenHeader.md │ │ │ │ │ ├── SDKs:javascript:interfaces:KMDTokenHeader.md │ │ │ │ │ ├── SDKs:javascript:interfaces:MultisigMetadata.md │ │ │ │ │ ├── SDKs:javascript:interfaces:SignedTransaction.md │ │ │ │ │ ├── SDKs:javascript:interfaces:SuggestedParams.md │ │ │ │ │ ├── SDKs:javascript:interfaces:TransactionParams.md │ │ │ │ │ ├── SDKs:javascript:interfaces:TransactionWithSigner.md │ │ │ │ │ ├── SDKs:javascript:modules:indexerModels.md │ │ │ │ │ ├── SDKs:javascript:modules:modelsv2.md │ │ │ │ │ ├── SDKs:javascript:modules.md │ │ │ │ │ ├── SDKs:javascript:README.md │ │ │ │ │ ├── SDKs:python:algosdk:v2client:harness:README.md │ │ │ │ │ ├── SDKs:python:examples:README.md │ │ │ │ │ ├── SDKs:python:README.md │ │ │ │ │ ├── tealscript:examples_amm_README.md │ │ │ │ │ ├── tealscript:examples_auction_README.md │ │ │ │ │ ├── tealscript:examples_big_box_README.md │ │ │ │ │ ├── tealscript:examples_itxns_README.md │ │ │ │ │ ├── tealscript:examples_lsig_with_app_README.md │ │ │ │ │ ├── tealscript:examples_reti_README.md │ │ │ │ │ ├── tealscript:FEATURES.md │ │ │ │ │ ├── tealscript:guides_atomic_txn.md │ │ │ │ │ ├── tealscript:guides_features.md │ │ │ │ │ ├── tealscript:guides_getting_started.md │ │ │ │ │ ├── tealscript:guides_inner_transactions.md │ │ │ │ │ ├── tealscript:guides_lifecycle.md │ │ │ │ │ ├── tealscript:guides_math.md │ │ │ │ │ ├── tealscript:guides_methods.md │ │ │ │ │ ├── tealscript:guides_multiple_contracts.md │ │ │ │ │ ├── tealscript:guides_pyteal.md │ │ │ │ │ ├── tealscript:guides_storage.md │ │ │ │ │ ├── tealscript:guides_Supported Types_arrays.md │ │ │ │ │ ├── tealscript:guides_Supported Types_numbers.md │ │ │ │ │ ├── TEALScript:README.md │ │ │ │ │ ├── tealscript:tests_test_package_README.md │ │ │ │ │ ├── tealscript:tutorials_Hello World_0001-intro.md │ │ │ │ │ ├── tealscript:tutorials_Hello World_0002-init.md │ │ │ │ │ ├── tealscript:tutorials_Hello World_0003-contract.md │ │ │ │ │ ├── tealscript:tutorials_Hello World_0004-artifacts.md │ │ │ │ │ ├── tealscript:tutorials_Hello World_0005-hello.md │ │ │ │ │ └── tealscript:tutorials_Hello World_0006-test.md │ │ │ │ └── taxonomy-categories │ │ │ │ ├── algokit-utils.json │ │ │ │ ├── algokit.json │ │ │ │ ├── arcs.json │ │ │ │ ├── clis.json │ │ │ │ ├── details.json │ │ │ │ ├── developers.json │ │ │ │ ├── liquid-auth.json │ │ │ │ ├── nodes.json │ │ │ │ ├── puya.json │ │ │ │ ├── python.json │ │ │ │ ├── sdks.json │ │ │ │ └── tealscript.json │ │ │ └── wallet │ │ │ └── index.ts │ │ ├── tools │ │ │ ├── accountManager.ts │ │ │ ├── algodManager.ts │ │ │ ├── apiManager │ │ │ │ ├── algod │ │ │ │ │ ├── account.ts │ │ │ │ │ ├── application.ts │ │ │ │ │ ├── asset.ts │ │ │ │ │ ├── index.ts │ │ │ │ │ └── transaction.ts │ │ │ │ ├── example │ │ │ │ │ ├── get-balance.ts │ │ │ │ │ └── index.ts │ │ │ │ ├── index.ts │ │ │ │ ├── indexer │ │ │ │ │ ├── account.ts │ │ │ │ │ ├── application.ts │ │ │ │ │ ├── asset.ts │ │ │ │ │ ├── index.ts │ │ │ │ │ └── transaction.ts │ │ │ │ ├── nfd │ │ │ │ │ └── index.ts │ │ │ │ ├── tinyman │ │ │ │ │ ├── analytics.ts │ │ │ │ │ ├── bootstrap.ts │ │ │ │ │ ├── index.ts │ │ │ │ │ ├── liquidity.ts │ │ │ │ │ ├── opt_in.ts │ │ │ │ │ ├── pool.ts │ │ │ │ │ ├── remove_liquidity.ts │ │ │ │ │ └── swap.ts │ │ │ │ ├── ultrade │ │ │ │ │ ├── index.ts │ │ │ │ │ ├── market.ts │ │ │ │ │ ├── system.ts │ │ │ │ │ └── wallet.ts │ │ │ │ └── vestige │ │ │ │ ├── assets.ts │ │ │ │ ├── balances.ts │ │ │ │ ├── index.ts │ │ │ │ ├── networks.ts │ │ │ │ ├── notes.ts │ │ │ │ ├── pools.ts │ │ │ │ ├── protocols.ts │ │ │ │ ├── swaps.ts │ │ │ │ └── vaults.ts │ │ │ ├── arc26Manager.ts │ │ │ ├── index.ts │ │ │ ├── knowledgeManager.ts │ │ │ ├── transactionManager │ │ │ │ ├── accountTransactions.ts │ │ │ │ ├── appTransactions │ │ │ │ │ ├── callTxn.ts │ │ │ │ │ ├── clearTxn.ts │ │ │ │ │ ├── closeOutTxn.ts │ │ │ │ │ ├── createTxn.ts │ │ │ │ │ ├── deleteTxn.ts │ │ │ │ │ ├── index.ts │ │ │ │ │ ├── optInTxn.ts │ │ │ │ │ ├── test │ │ │ │ │ │ ├── counter_approval.teal │ │ │ │ │ │ ├── counter_clear.teal │ │ │ │ │ │ ├── storage_test_approval_v2.teal │ │ │ │ │ │ ├── storage_test_approval.teal │ │ │ │ │ │ └── storage_test_clear.teal │ │ │ │ │ ├── types.ts │ │ │ │ │ └── updateTxn.ts │ │ │ │ ├── assetTransactions.ts │ │ │ │ ├── generalTransaction.ts │ │ │ │ └── index.ts │ │ │ └── utilityManager.ts │ │ ├── types.ts │ │ └── utils │ │ └── responseProcessor.ts │ ├── tests │ │ ├── resources │ │ │ ├── algod │ │ │ │ ├── account.test.ts │ │ │ │ ├── application.test.ts │ │ │ │ ├── asset.test.ts │ │ │ │ └── transaction.test.ts │ │ │ └── indexer │ │ │ ├── account.test.ts │ │ │ ├── application.test.ts │ │ │ ├── asset.test.ts │ │ │ └── transaction.test.ts │ │ └── tools │ │ ├── accountManager.test.ts │ │ ├── algodManager.test.ts │ │ ├── apiManager │ │ │ └── example │ │ │ └── get-balance.test.ts │ │ ├── transactionManager │ │ │ ├── accountTransactionManager.test.ts │ │ │ ├── appTransactionManager.test.ts │ │ │ ├── assetTransactionManager.test.ts │ │ │ ├── generalTransactionManager.test.ts │ │ │ └── transactionManager.test.ts │ │ └── utilityManager.test.ts │ └── tsconfig.json ├── README.md ├── rename_files.sh └── tsconfig.json ``` # Files -------------------------------------------------------------------------------- /packages/server/src/resources/knowledge/taxonomy/ARCs:specs:arc-0076.md: -------------------------------------------------------------------------------- ```markdown 1 | --- 2 | arc: 76 3 | title: Password Account 4 | description: Password account using PBKDF2 5 | author: Ludovit Scholtz (@scholtz) 6 | discussions-to: https://github.com/algorandfoundation/ARCs/issues/208 7 | status: Deprecated 8 | type: Standards Track 9 | category: Core 10 | created: 2023-06-12 11 | --- 12 | 13 | ## Abstract 14 | This standard specifies a computation for seed bytes for Password Account. For general adoption it is better for people to remember passphrase than mnemonic. With this standard person can hash the passphrase and receive the seed bytes for X25529 algorand account. 15 | 16 | ## Motivation 17 | By providing a clear and precise computation process, Password Account empowers individuals to effortlessly obtain their seed bytes for algorand account. In the realm of practicality and widespread adoption, the standard highlights the immense advantages of utilizing a passphrase rather than a mnemonic. Remembering a passphrase becomes the key to unlocking a world of possibilities. With this groundbreaking standard, individuals can take control of their X25529 Algorand account by simply hashing their passphrase and effortlessly receiving the corresponding seed bytes. It's time to embrace this new era of accessibility and security, empowering yourself to reach new heights in the world of Password Accounts. Let this standard serve as your guiding light, motivating community to embark on a journey of limitless possibilities and unparalleled success. 18 | 19 | This standard seek the synchronization between wallets which may provide password protected accounts. 20 | 21 | ## Specification 22 | 23 | Seed bytes generation is calculated with algorithm: 24 | 25 | ``` 26 | const init = `ARC-0076-${password}-{slotId}-PBKDF2-999999`; 27 | const salt = `ARC-0076-{slotId}-PBKDF2-999999`; 28 | const iterations = 999999; 29 | const cryptoKey = await window.crypto.subtle.importKey( 30 | "raw", 31 | Buffer.from(init, "utf-8"), 32 | "PBKDF2", 33 | false, 34 | ["deriveBits", "deriveKey"] 35 | ); 36 | const masterBits = await window.crypto.subtle.deriveBits( 37 | { 38 | name: "PBKDF2", 39 | hash: "SHA-256", 40 | salt: Buffer.from(salt, "utf-8"), 41 | iterations: iterations, 42 | }, 43 | cryptoKey, 44 | 256 45 | ); 46 | 47 | const uint8 = new Uint8Array(masterBits); 48 | const mnemonic = algosdk.mnemonicFromSeed(uint8); 49 | const genAccount = algosdk.mnemonicToSecretKey(mnemonic); 50 | ``` 51 | 52 | Length of the data section SHOULD be at least 16 bytes long. 53 | 54 | Slot ID is account iteration. Default is "0". 55 | 56 | ### Email Password account 57 | 58 | Email Password account is account generated from the original data 59 | 60 | ``` 61 | const init = `ARC-0076-${email}-${password}-{slotId}-PBKDF2-999999`; 62 | const salt = `ARC-0076-${email}-{slotId}-PBKDF2-999999`; 63 | ``` 64 | 65 | The email part can be published to the service provider backend and verified by the service provider. Password MUST NOT be transferred over the network. 66 | 67 | Length of the password SHOULD be at least 16 bytes long. 68 | 69 | ### Sample data 70 | This sample data may be used for verification of the ```ARC-0076``` implementation. 71 | 72 | ``` 73 | const email = "[email protected]"; 74 | const password = "12345678901234567890123456789012345678901234567890"; 75 | const slotId = "0"; 76 | const init = `ARC-0076-${email}-${password}-{slotId}-PBKDF2-999999`; 77 | const salt = `ARC-0076-${email}-{slotId}-PBKDF2-999999`; 78 | ``` 79 | 80 | Results in: 81 | 82 | ``` 83 | masterBits = [225,7,139,154,245,210,181,138,188,129,145,53,246,184,243,88,163,163,109,208,77,71,7,235,81,244,129,215,102,168,105,21] 84 | account.addr = "5AHWQJ5D52K4GRW4JWQ5GMR53F7PDSJEGT4PXVFSBQYE7VXDVG3WSPWSBM" 85 | ``` 86 | 87 | ## Rationale 88 | This standard was designed to allow the wallets to provide password protected accounts which does not require general population to store the mnemonic. Email extension allows service providers to bind specific account with the email address, and user experience to feel the basic authentication form with email and password they are already used to from web2 usecases. 89 | 90 | ## Backwards Compatibility 91 | We expect future extensions to be compatible with Password account. The hash mechanism for the future algorighms should be suffixed such as ```-PBKDF2-999999```. 92 | 93 | ## Security Considerations 94 | This standard moves the security of strength of the account to how user generates the password. 95 | 96 | This standard relies on randomness and collision resistance of PBKDF2 and 'SHA-256'. User MUST be informed about the risks associated with this type of account. 97 | 98 | ## Copyright 99 | Copyright and related rights waived via <a href="https://creativecommons.org/publicdomain/zero/1.0/">CCO</a>. 100 | ``` -------------------------------------------------------------------------------- /packages/server/src/resources/knowledge/taxonomy/tealscript:guides_storage.md: -------------------------------------------------------------------------------- ```markdown 1 | --- 2 | title: On-Chain Storage 3 | --- 4 | 5 | There are three storage types available for Algorand smart contracts: global, local, and box. To read more about these storage types, you can go to [this page](https://developer.algorand.org/docs/get-details/dapps/smart-contracts/apps/state/) on the developer portal. 6 | 7 | In general, you want to use global storage for small values (< 128 byte) when you have a known amount of key/value pairs and otherwise use box storage. There are exceptions of course when local storage makes sense, but most developers should start with global and box storage. 8 | 9 | For each storage type, there are two classess in TEALScript for interacting with contract state `Key` and `Map`. Classes ending with `Key` point to a single key in storage and `Map` is a mapping of an undefined amount of keys to their respective values. 10 | 11 | ## Key Declaration 12 | 13 | All `Key` functions `GlobalStateKey`, `BoxKey`, `LocalStateKey`) are generic functions with one type argument that corresponds to the type of the value held in the respective value. 14 | 15 | These functions all take an optional argument `key`. By default, the property name will be used for the on-chain key name. The `key` property, however, can be used to override what value is used as the on-chain key. This is paticularly useful when you want small keys on-chain but longer more-descriptive keys in TEALScript. If you want the key to be a non-string value, use `Map`s 16 | 17 | ### Examples 18 | 19 | #### Key Declaration 20 | 21 | ```ts 22 | class MyApp extends Contract { 23 | someKey = GlobalStateKey<string>() 24 | 25 | setSomeKey(value: string): void { 26 | this.someKey.value = value // On chain: "someKey" now contains value 27 | } 28 | } 29 | ``` 30 | 31 | #### Modified On-Chain Key 32 | 33 | ```ts 34 | class MyApp extends Contract { 35 | someKey = GlobalStateKey<string>({ key: 'sk' }) 36 | 37 | setSomeKey(value: string): void { 38 | this.someKey.value = value // On chain: "sk" now contains value 39 | } 40 | } 41 | ``` 42 | 43 | ## Map Declaration 44 | 45 | All `Map` functions (`GlobalStateMap`, `BoxMap`, `LocalStateMap`) are generic functions with two type arguments that corresponds to the type of the key and the type of the value, respectively. 46 | 47 | These functions all take an optional argument `prefix`. The value given to `prefix` is a string that will prefix each key accessed via this `Map`. This is useful when you have two different maps that might have the same key type. The compiler will throw an error if two `Map`s of the same storage type have the same key type and no prefix. 48 | 49 | #### Map Declaration 50 | 51 | ```ts 52 | class MyApp extends Contract { 53 | favoriteColor = BoxMap<Address, string>() 54 | 55 | setColor(color: string): void { 56 | this.favoriteColor(this.txn.sender).value = color // on chain: sender's address now points to their favorite color 57 | } 58 | } 59 | ``` 60 | 61 | #### Map Prefix Declaration 62 | 63 | ```ts 64 | class MyApp extends Contract { 65 | favoriteColor = BoxMap<Address, string>({ prefix: 'c' }) 66 | favoriteNumber = BoxMap<Address, string>({ prefix: 'n' }) 67 | 68 | setColor(color: string): void { 69 | this.favoriteColor(this.txn.sender).value = color // on chain: ("c" + sender's address) now points to their favorite color 70 | } 71 | 72 | setNumber(number: uint64): void { 73 | this.favoriteNumber(this.txn.sender).value = number // on chain: ("n" + sender's address) now points to their favorite number 74 | } 75 | } 76 | ``` 77 | 78 | #### Incorrect: Overlapping Key Types 79 | 80 | ```ts 81 | class MyApp extends Contract { 82 | favoriteColor = BoxMap<Address, string>() // ERROR: same key type as favoriteNumber and no prefix 83 | favoriteNumber = BoxMap<Address, string>() // ERROR: same key type as favoriteColor and no prefix 84 | } 85 | ``` 86 | 87 | ## Box defaultSize Parameter 88 | 89 | `BoxKey` and `BoxMap` have an additional option that is not applicable to global or local storage. 90 | 91 | `dynamicSize` is an optional parameter that indicates whether TEALScript should call `box_del` before each `box_put`. By default, this value will be false when the value type is static and true when the value type is dynamic. This means in most cases, you shouldn't need to manually set this parameter unless you want to manually manage box resizing via `.delete()` 92 | 93 | ## StateMap maxKeys Parameter 94 | 95 | `GlobalStateMap` and `LocalStateMap` have an additional parameter `maxKeys`. 96 | 97 | `maxKeys` is a required parameter that indicates how many keys should be reserved for this map. 98 | 99 | ```ts 100 | // Reserve 3 keys for this map 101 | class MyApp extends Contract { 102 | data = GlobalStateMap<bytes, bytes>({ maxKeys: 3 }) 103 | 104 | createApplication(){ 105 | this.data('name').value = 'MyApp' 106 | this.data('version').value = '1.0.0' 107 | this.data('author').value = 'Me' 108 | } 109 | } 110 | ``` 111 | ``` -------------------------------------------------------------------------------- /packages/server/src/tools/apiManager/algod/account.ts: -------------------------------------------------------------------------------- ```typescript 1 | import { ErrorCode, McpError } from '@modelcontextprotocol/sdk/types.js'; 2 | import { algodClient } from '../../../algorand-client.js'; 3 | import type { 4 | Account, 5 | AccountApplicationResponse, 6 | AccountAssetResponse 7 | } from 'algosdk/dist/types/client/v2/algod/models/types'; 8 | import algosdk from 'algosdk'; 9 | 10 | export const accountTools = [ 11 | { 12 | name: 'api_algod_get_account_info', 13 | description: 'Get current account balance, assets, and auth address from algod', 14 | inputSchema: { 15 | type: 'object', 16 | properties: { 17 | address: { 18 | type: 'string', 19 | description: 'The account public key' 20 | } 21 | }, 22 | required: ['address'] 23 | } 24 | }, 25 | { 26 | name: 'api_algod_get_account_application_info', 27 | description: 'Get account-specific application information from algod', 28 | inputSchema: { 29 | type: 'object', 30 | properties: { 31 | address: { 32 | type: 'string', 33 | description: 'The account public key' 34 | }, 35 | appId: { 36 | type: 'integer', 37 | description: 'The application ID' 38 | } 39 | }, 40 | required: ['address', 'appId'] 41 | } 42 | }, 43 | { 44 | name: 'api_algod_get_account_asset_info', 45 | description: 'Get account-specific asset information from algod', 46 | inputSchema: { 47 | type: 'object', 48 | properties: { 49 | address: { 50 | type: 'string', 51 | description: 'The account public key' 52 | }, 53 | assetId: { 54 | type: 'integer', 55 | description: 'The asset ID' 56 | } 57 | }, 58 | required: ['address', 'assetId'] 59 | } 60 | } 61 | ]; 62 | 63 | export async function getAccountInfo(address: string): Promise<Account> { 64 | try { 65 | // Validate address format 66 | if (!algosdk.isValidAddress(address)) { 67 | throw new McpError( 68 | ErrorCode.InvalidRequest, 69 | 'Invalid Algorand address format' 70 | ); 71 | } 72 | 73 | console.log('Fetching account info from algod for address:', address); 74 | // Get account information from algod 75 | const response = await algodClient.accountInformation(address).do() as Account; 76 | console.log('Algod response:', JSON.stringify(response, null, 2)); 77 | return response; 78 | } catch (error) { 79 | console.error('Algod error:', error); 80 | if (error instanceof McpError) { 81 | throw error; 82 | } 83 | throw new McpError( 84 | ErrorCode.InternalError, 85 | `Failed to get account information: ${error instanceof Error ? error.message : String(error)}` 86 | ); 87 | } 88 | } 89 | 90 | export async function getAccountApplicationInfo(address: string, appId: number): Promise<AccountApplicationResponse> { 91 | try { 92 | // Validate address format 93 | if (!algosdk.isValidAddress(address)) { 94 | throw new McpError( 95 | ErrorCode.InvalidRequest, 96 | 'Invalid Algorand address format' 97 | ); 98 | } 99 | 100 | const response = await algodClient.accountApplicationInformation(address, appId).do() as AccountApplicationResponse; 101 | return response; 102 | } catch (error) { 103 | if (error instanceof McpError) { 104 | throw error; 105 | } 106 | throw new McpError( 107 | ErrorCode.InternalError, 108 | `Failed to get account application info: ${error instanceof Error ? error.message : String(error)}` 109 | ); 110 | } 111 | } 112 | 113 | export async function getAccountAssetInfo(address: string, assetId: number): Promise<AccountAssetResponse> { 114 | try { 115 | // Validate address format 116 | if (!algosdk.isValidAddress(address)) { 117 | throw new McpError( 118 | ErrorCode.InvalidRequest, 119 | 'Invalid Algorand address format' 120 | ); 121 | } 122 | 123 | const response = await algodClient.accountAssetInformation(address, assetId).do() as AccountAssetResponse; 124 | return response; 125 | } catch (error) { 126 | if (error instanceof McpError) { 127 | throw error; 128 | } 129 | throw new McpError( 130 | ErrorCode.InternalError, 131 | `Failed to get account asset info: ${error instanceof Error ? error.message : String(error)}` 132 | ); 133 | } 134 | } 135 | 136 | export async function handleAccountTools(name: string, args: any): Promise<any> { 137 | switch (name) { 138 | case 'api_algod_get_account_info': { 139 | const { address } = args; 140 | const info = await getAccountInfo(address); 141 | return info; 142 | } 143 | case 'api_algod_get_account_application_info': { 144 | const { address, appId } = args; 145 | const info = await getAccountApplicationInfo(address, appId); 146 | return info; 147 | } 148 | case 'api_algod_get_account_asset_info': { 149 | const { address, assetId } = args; 150 | const info = await getAccountAssetInfo(address, assetId); 151 | return info; 152 | } 153 | default: 154 | throw new McpError( 155 | ErrorCode.MethodNotFound, 156 | `Unknown tool: ${name}` 157 | ); 158 | } 159 | } 160 | ``` -------------------------------------------------------------------------------- /packages/server/src/resources/knowledge/taxonomy/SDKs:javascript:classes:indexerModels.ApplicationParams.md: -------------------------------------------------------------------------------- ```markdown 1 | [algosdk](../README.md) / [Exports](../modules.md) / [indexerModels](../modules/indexerModels.md) / ApplicationParams 2 | 3 | # Class: ApplicationParams 4 | 5 | [indexerModels](../modules/indexerModels.md).ApplicationParams 6 | 7 | Stores the global information associated with an application. 8 | 9 | ## Hierarchy 10 | 11 | - `default` 12 | 13 | ↳ **`ApplicationParams`** 14 | 15 | ## Table of contents 16 | 17 | ### Constructors 18 | 19 | - [constructor](indexerModels.ApplicationParams.md#constructor) 20 | 21 | ### Properties 22 | 23 | - [approvalProgram](indexerModels.ApplicationParams.md#approvalprogram) 24 | - [attribute\_map](indexerModels.ApplicationParams.md#attribute_map) 25 | - [clearStateProgram](indexerModels.ApplicationParams.md#clearstateprogram) 26 | - [creator](indexerModels.ApplicationParams.md#creator) 27 | - [extraProgramPages](indexerModels.ApplicationParams.md#extraprogrampages) 28 | - [globalState](indexerModels.ApplicationParams.md#globalstate) 29 | - [globalStateSchema](indexerModels.ApplicationParams.md#globalstateschema) 30 | - [localStateSchema](indexerModels.ApplicationParams.md#localstateschema) 31 | 32 | ### Methods 33 | 34 | - [get\_obj\_for\_encoding](indexerModels.ApplicationParams.md#get_obj_for_encoding) 35 | - [from\_obj\_for\_encoding](indexerModels.ApplicationParams.md#from_obj_for_encoding) 36 | 37 | ## Constructors 38 | 39 | ### constructor 40 | 41 | • **new ApplicationParams**(`«destructured»`) 42 | 43 | Creates a new `ApplicationParams` object. 44 | 45 | #### Parameters 46 | 47 | | Name | Type | 48 | | :------ | :------ | 49 | | `«destructured»` | `Object` | 50 | | › `approvalProgram` | `string` \| `Uint8Array` | 51 | | › `clearStateProgram` | `string` \| `Uint8Array` | 52 | | › `creator?` | `string` | 53 | | › `extraProgramPages?` | `number` \| `bigint` | 54 | | › `globalState?` | [`TealKeyValue`](indexerModels.TealKeyValue.md)[] | 55 | | › `globalStateSchema?` | [`ApplicationStateSchema`](indexerModels.ApplicationStateSchema.md) | 56 | | › `localStateSchema?` | [`ApplicationStateSchema`](indexerModels.ApplicationStateSchema.md) | 57 | 58 | #### Overrides 59 | 60 | BaseModel.constructor 61 | 62 | #### Defined in 63 | 64 | client/v2/indexer/models/types.ts:1213 65 | 66 | ## Properties 67 | 68 | ### approvalProgram 69 | 70 | • **approvalProgram**: `Uint8Array` 71 | 72 | approval program. 73 | 74 | #### Defined in 75 | 76 | client/v2/indexer/models/types.ts:1169 77 | 78 | ___ 79 | 80 | ### attribute\_map 81 | 82 | • **attribute\_map**: `Record`\<`string`, `string`\> 83 | 84 | #### Inherited from 85 | 86 | BaseModel.attribute\_map 87 | 88 | #### Defined in 89 | 90 | client/v2/basemodel.ts:56 91 | 92 | ___ 93 | 94 | ### clearStateProgram 95 | 96 | • **clearStateProgram**: `Uint8Array` 97 | 98 | clear state program. 99 | 100 | #### Defined in 101 | 102 | client/v2/indexer/models/types.ts:1174 103 | 104 | ___ 105 | 106 | ### creator 107 | 108 | • `Optional` **creator**: `string` 109 | 110 | The address that created this application. This is the address where the 111 | parameters and global state for this application can be found. 112 | 113 | #### Defined in 114 | 115 | client/v2/indexer/models/types.ts:1180 116 | 117 | ___ 118 | 119 | ### extraProgramPages 120 | 121 | • `Optional` **extraProgramPages**: `number` \| `bigint` 122 | 123 | the number of extra program pages available to this app. 124 | 125 | #### Defined in 126 | 127 | client/v2/indexer/models/types.ts:1185 128 | 129 | ___ 130 | 131 | ### globalState 132 | 133 | • `Optional` **globalState**: [`TealKeyValue`](indexerModels.TealKeyValue.md)[] 134 | 135 | global state 136 | 137 | #### Defined in 138 | 139 | client/v2/indexer/models/types.ts:1190 140 | 141 | ___ 142 | 143 | ### globalStateSchema 144 | 145 | • `Optional` **globalStateSchema**: [`ApplicationStateSchema`](indexerModels.ApplicationStateSchema.md) 146 | 147 | global schema 148 | 149 | #### Defined in 150 | 151 | client/v2/indexer/models/types.ts:1195 152 | 153 | ___ 154 | 155 | ### localStateSchema 156 | 157 | • `Optional` **localStateSchema**: [`ApplicationStateSchema`](indexerModels.ApplicationStateSchema.md) 158 | 159 | local schema 160 | 161 | #### Defined in 162 | 163 | client/v2/indexer/models/types.ts:1200 164 | 165 | ## Methods 166 | 167 | ### get\_obj\_for\_encoding 168 | 169 | ▸ **get_obj_for_encoding**(`binary?`): `Record`\<`string`, `any`\> 170 | 171 | Get an object ready for encoding to either JSON or msgpack. 172 | 173 | #### Parameters 174 | 175 | | Name | Type | Default value | Description | 176 | | :------ | :------ | :------ | :------ | 177 | | `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. | 178 | 179 | #### Returns 180 | 181 | `Record`\<`string`, `any`\> 182 | 183 | #### Inherited from 184 | 185 | BaseModel.get\_obj\_for\_encoding 186 | 187 | #### Defined in 188 | 189 | client/v2/basemodel.ts:65 190 | 191 | ___ 192 | 193 | ### from\_obj\_for\_encoding 194 | 195 | ▸ `Static` **from_obj_for_encoding**(`data`): [`ApplicationParams`](indexerModels.ApplicationParams.md) 196 | 197 | #### Parameters 198 | 199 | | Name | Type | 200 | | :------ | :------ | 201 | | `data` | `Record`\<`string`, `any`\> | 202 | 203 | #### Returns 204 | 205 | [`ApplicationParams`](indexerModels.ApplicationParams.md) 206 | 207 | #### Defined in 208 | 209 | client/v2/indexer/models/types.ts:1257 210 | ``` -------------------------------------------------------------------------------- /packages/server/src/resources/knowledge/taxonomy-categories/algokit.json: -------------------------------------------------------------------------------- ```json 1 | { 2 | "name": "AlgoKit", 3 | "description": "Development tools and CLI for Algorand blockchain", 4 | "path": "algokit", 5 | "documents": [ 6 | {"name": "README", "path": "algokit:README.md"}, 7 | {"name": "Overview", "path": "algokit:cli:algokit.md"} 8 | ], 9 | "subcategories": { 10 | "cli": { 11 | "name": "Command Line Interface", 12 | "description": "AlgoKit CLI documentation", 13 | "path": "algokit:cli", 14 | "documents": [ 15 | {"name": "CLI Index", "path": "algokit:cli:cli:index.md"} 16 | ], 17 | "subcategories": { 18 | "features": { 19 | "name": "Features", 20 | "description": "CLI feature documentation", 21 | "path": "algokit:cli:features", 22 | "documents": [ 23 | {"name": "Compile", "path": "algokit:cli:features:compile.md"}, 24 | {"name": "Completions", "path": "algokit:cli:features:completions.md"}, 25 | {"name": "Config", "path": "algokit:cli:features:config.md"}, 26 | {"name": "Dispenser", "path": "algokit:cli:features:dispenser.md"}, 27 | {"name": "Doctor", "path": "algokit:cli:features:doctor.md"}, 28 | {"name": "Explore", "path": "algokit:cli:features:explore.md"}, 29 | {"name": "Generate", "path": "algokit:cli:features:generate.md"}, 30 | {"name": "Goal", "path": "algokit:cli:features:goal.md"}, 31 | {"name": "Init", "path": "algokit:cli:features:init.md"}, 32 | {"name": "Localnet", "path": "algokit:cli:features:localnet.md"}, 33 | {"name": "Project", "path": "algokit:cli:features:project.md"}, 34 | {"name": "Tasks", "path": "algokit:cli:features:tasks.md"} 35 | ], 36 | "subcategories": { 37 | "project": { 38 | "name": "Project Commands", 39 | "description": "Project-related commands", 40 | "path": "algokit:cli:features:project", 41 | "documents": [ 42 | {"name": "Bootstrap", "path": "algokit:cli:features:project:bootstrap.md"}, 43 | {"name": "Deploy", "path": "algokit:cli:features:project:deploy.md"}, 44 | {"name": "Link", "path": "algokit:cli:features:project:link.md"}, 45 | {"name": "List", "path": "algokit:cli:features:project:list.md"}, 46 | {"name": "Run", "path": "algokit:cli:features:project:run.md"} 47 | ] 48 | }, 49 | "tasks": { 50 | "name": "Task Commands", 51 | "description": "Task-related commands", 52 | "path": "algokit:cli:features:tasks", 53 | "documents": [ 54 | {"name": "Analyze", "path": "algokit:cli:features:tasks:analyze.md"}, 55 | {"name": "IPFS", "path": "algokit:cli:features:tasks:ipfs.md"}, 56 | {"name": "Mint", "path": "algokit:cli:features:tasks:mint.md"}, 57 | {"name": "NFD", "path": "algokit:cli:features:tasks:nfd.md"}, 58 | {"name": "Opt", "path": "algokit:cli:features:tasks:opt.md"}, 59 | {"name": "Send", "path": "algokit:cli:features:tasks:send.md"}, 60 | {"name": "Sign", "path": "algokit:cli:features:tasks:sign.md"}, 61 | {"name": "Transfer", "path": "algokit:cli:features:tasks:transfer.md"}, 62 | {"name": "Vanity Address", "path": "algokit:cli:features:tasks:vanity_address.md"}, 63 | {"name": "Wallet", "path": "algokit:cli:features:tasks:wallet.md"} 64 | ] 65 | } 66 | } 67 | }, 68 | "tutorials": { 69 | "name": "Tutorials", 70 | "description": "Getting started tutorials", 71 | "path": "algokit:cli:tutorials", 72 | "documents": [ 73 | {"name": "Introduction", "path": "algokit:cli:tutorials:intro.md"}, 74 | {"name": "Smart Contracts", "path": "algokit:cli:tutorials:smart-contracts.md"}, 75 | {"name": "AlgoKit Template", "path": "algokit:cli:tutorials:algokit-template.md"} 76 | ] 77 | }, 78 | "articles": { 79 | "name": "Articles", 80 | "description": "Technical articles and guides", 81 | "path": "algokit:cli:articles", 82 | "documents": [ 83 | {"name": "Output Stability", "path": "algokit:cli:articles:output_stability.md"} 84 | ] 85 | } 86 | } 87 | }, 88 | "lora": { 89 | "name": "Lora", 90 | "description": "AlgoKit Lora documentation", 91 | "path": "algokit:lora", 92 | "documents": [ 93 | {"name": "README", "path": "algokit:lora:README.md"} 94 | ] 95 | }, 96 | "docs": { 97 | "name": "Documentation", 98 | "description": "Additional AlgoKit documentation", 99 | "path": "algokit:docs", 100 | "documents": [ 101 | {"name": "Testnet API", "path": "algokit:docs:testnet_api.md"} 102 | ] 103 | } 104 | } 105 | } 106 | ``` -------------------------------------------------------------------------------- /packages/server/src/resources/knowledge/taxonomy/developer:docs:run-a-node:operations:switch_networks.md: -------------------------------------------------------------------------------- ```markdown 1 | title: Switch Networks 2 | By default, an Algorand installation is configured to run on MainNet. For most users, this is the desired outcome. Developers, however, need access to [TestNet or BetaNet networks](../../../archive/build-apps/setup/#choosing-a-network). This guide describes switching between networks. 3 | 4 | 5 | # Replacing the Genesis file 6 | Every Algorand node has a data directory that is used to store the ledger and other configuration information. As part of this configuration, a `genesis.json` file is used. The `genesis.json` file specifies the initial state of the blockchain - its ‘genesis block’. This is a JSON formatted file with the schema for the blockchain. It contains the network name and id, the protocol version and list of allocated addresses to start the chain with. Each address contains a list of things like address status and the amount of Algos owned by the address. 7 | 8 | As part of the installer, a `genesisfiles` directory is created under the node's installed location for binaries. This directory contains additional directories for each of the Algorand networks: BetaNet, TestNet, and MainNet. These directories contain the `genesis.json` file for each of the Algorand networks (eg `~/node/genesisfiles/mainnet/genesis.json`). 9 | 10 | !!! info 11 | The genesis file for *Debian* and *RPM* installs are stored in the `/var/lib/algorand/genesis/` directory. 12 | 13 | The network can be switched by either replacing the current genesis file located in the `data` directory with the specific network `genesis.json` or by creating a new `data` directory and copying the specific network `genesis.json` file to the new `data` directory. Replacing the current genesis file will not destroy the current network data, but will prevent running multiple networks on the same node. To run multiple networks at the same time multiple data directories are required. 14 | 15 | # Using a new Data Directory 16 | To construct a new data directory follow the steps described below that depend on the type of install that was used with the current node. 17 | 18 | ## Mac OS or Other Linux Distros 19 | Assume the node binaries are currently installed in `~/node` and the data directory is set to `~/node/data`. Create the new data directory for the network that is being switched to. (eg `~/node/testnetdata`). 20 | 21 | ``` 22 | cd ~/node 23 | ./goal node stop -d data 24 | mkdir testnetdata 25 | cp ~/node/genesisfiles/testnet/genesis.json ~/node/testnetdata 26 | ``` 27 | Startup the new node using the `-d` option to point at the new network. 28 | 29 | ``` 30 | ./goal node start -d ~/node/testnetdata 31 | ``` 32 | 33 | The node will restart and begin communicating with the TestNet network. It will need to sync with the network which will take time. Run the following command to check the current sync status. 34 | 35 | ``` 36 | ./goal node status -d ~/node/testnetdata 37 | ``` 38 | 39 | At this point, the original network can be stared as well using the standard data directory. 40 | 41 | ## Debian or RPM installs 42 | For *Debian* and *RPM* installs the data directory is set to `/var/lib/algorand`. With these installs, the genesis files are stored in `/var/lib/algorand/genesis/`. Create the new data directory for the network that is being switched to. (eg `/var/lib/algorand_testnet`). 43 | 44 | ``` 45 | ALGORAND_DATA=/var/lib/algorand_testnet 46 | sudo mkdir -p ${ALGORAND_DATA} 47 | ``` 48 | Copy the specific network genesis file to the new directory and set the ownership to the algorand account. 49 | 50 | ``` 51 | sudo cp -p /var/lib/algorand/genesis/testnet/genesis.json ${ALGORAND_DATA}/genesis.json 52 | sudo cp -p /var/lib/algorand/system.json ${ALGORAND_DATA}/system.json 53 | sudo chown -R algorand ${ALGORAND_DATA} 54 | ``` 55 | 56 | Use `systemctl` to enable the process and start it. 57 | 58 | ``` 59 | sudo systemctl enable algorand@$(systemd-escape ${ALGORAND_DATA}) 60 | sudo systemctl start algorand@$(systemd-escape ${ALGORAND_DATA}) 61 | ``` 62 | The process can be disabled or stopped using `systemctl` commands. 63 | 64 | ``` 65 | sudo systemctl stop algorand@$(systemd-escape ${ALGORAND_DATA}) 66 | sudo systemctl disable algorand@$(systemd-escape ${ALGORAND_DATA}) 67 | ``` 68 | 69 | # DNS Configuration for BetaNet 70 | 71 | For the BetaNet network, when installing a new node or relay, make the following modification to the `config.json` file located in the node's data directory. 72 | 73 | Edit the `config.json` file and replace the line 74 | ``` 75 | "DNSBootstrapID": "<network>.algorand.network", 76 | ``` 77 | with 78 | ``` 79 | "DNSBootstrapID": "<network>.algodev.network", 80 | ``` 81 | If former line is not present, just add the latter line. 82 | If there is no `config.json` in the Algorand data folder, just create a new one with the following content: 83 | ```json 84 | { 85 | "DNSBootstrapID": "<network>.algodev.network" 86 | } 87 | ``` 88 | 89 | This modification to the `DNSBootstrapID` is only for the BetaNet network. 90 | ``` -------------------------------------------------------------------------------- /packages/server/src/resources/knowledge/taxonomy/algokit:cli:features:compile.md: -------------------------------------------------------------------------------- ```markdown 1 | # AlgoKit Compile 2 | 3 | The AlgoKit Compile feature enables you to compile smart contracts (apps) and smart signatures (logic signatures) written in a supported high-level language to a format deployable on the Algorand Virtual Machine (AVM). 4 | 5 | When running the compile command, AlgoKit will take care of working out which compiler you need and dynamically resolve it. Additionally, AlgoKit will detect if a matching compiler version is already installed globally on your machine or is included in your project and use that. 6 | 7 | ## Prerequisites 8 | 9 | See [Compile Python - Prerequisites](#prerequisites-1) for details. 10 | 11 | ## What is Algorand Python & PuyaPy? 12 | 13 | Algorand Python is a semantically and syntactically compatible, typed Python language that works with standard Python tooling and allows you to express smart contracts (apps) and smart signatures (logic signatures) for deployment on the Algorand Virtual Machine (AVM). 14 | 15 | Algorand Python can be deployed to Algorand by using the PuyaPy optimising compiler, which takes Algorand Python and outputs [ARC-32](https://github.com/algorandfoundation/ARCs/blob/main/ARCs/arc-0032.md) application spec files (among other formats) which, [when deployed](https://github.com/algorandfoundation/algokit-cli/blob/main/docs/features/generate.md#1-typed-clients), will result in AVM bytecode execution semantics that match the given Python code. 16 | 17 | If you want to learn more, check out the [PuyaPy docs](https://github.com/algorandfoundation/puya/blob/main/docs/index.md). 18 | 19 | Below is an example Algorand Python smart contract. 20 | 21 | ```py 22 | from algopy import ARC4Contract, arc4 23 | 24 | class HelloWorldContract(ARC4Contract): 25 | @arc4.abimethod 26 | def hello(self, name: arc4.String) -> arc4.String: 27 | return "Hello, " + name 28 | ``` 29 | 30 | For more complex examples, see the [examples](https://github.com/algorandfoundation/puya/tree/main/examples) in the [PuyaPy repo](https://github.com/algorandfoundation/puya). 31 | 32 | ## Usage 33 | 34 | Available commands and possible usage are as follows: 35 | 36 | ``` 37 | Usage: algokit compile [OPTIONS] COMMAND [ARGS]... 38 | 39 | Compile smart contracts and smart signatures written in a supported high-level language to a format deployable on 40 | the Algorand Virtual Machine (AVM). 41 | 42 | Options: 43 | -v, --version TEXT The compiler version to pin to, for example, 1.0.0. If no version is specified, AlgoKit checks 44 | if the compiler is installed and runs the installed version. If the compiler is not installed, 45 | AlgoKit runs the latest version. If a version is specified, AlgoKit checks if an installed 46 | version matches and runs the installed version. Otherwise, AlgoKit runs the specified version. 47 | -h, --help Show this message and exit. 48 | 49 | Commands: 50 | py Compile Algorand Python contract(s) using the PuyaPy compiler. 51 | python Compile Algorand Python contract(s) using the PuyaPy compiler. 52 | ``` 53 | 54 | ### Compile Python 55 | 56 | The command `algokit compile python` or `algokit compile py` will run the [PuyaPy](https://github.com/algorandfoundation/puya) compiler against the supplied Algorand Python smart contract. 57 | 58 | All arguments supplied to the command are passed directly to PuyaPy, therefore this command supports all options supported by the PuyaPy compiler. 59 | 60 | Any errors detected by PuyaPy during the compilation process will be printed to the output. 61 | 62 | #### Prerequisites 63 | 64 | PuyaPy requires Python 3.12+, so please ensure your Python version satisfies this requirement. 65 | 66 | This command will attempt to resolve a matching installed PuyaPy compiler, either globally installed in the system or locally installed in your project (via [Poetry](https://python-poetry.org/)). If no appropriate match is found, the PuyaPy compiler will be dynamically run using [pipx](https://pipx.pypa.io/stable/). In this case pipx is also required. 67 | 68 | #### Examples 69 | 70 | To see a list of the supported PuyaPy options, run the following: 71 | 72 | ```shell 73 | algokit compile python -h 74 | ``` 75 | 76 | To determine the version of the PuyaPy compiler in use, execute the following command: 77 | 78 | ```shell 79 | algokit compile python --version 80 | ``` 81 | 82 | To compile a single Algorand Python smart contract and write the output to a specific location, run the following: 83 | 84 | ```shell 85 | algokit compile python hello_world/contract.py --out-dir hello_world/out 86 | ``` 87 | 88 | To compile multiple Algorand Python smart contracts and write the output to a specific location, run the following: 89 | 90 | ```shell 91 | algokit compile python hello_world/contract.py calculator/contract.py --out-dir my_contracts 92 | ``` 93 | 94 | To compile a directory of Algorand Python smart contracts and write the output to the default location, run the following: 95 | 96 | ```shell 97 | algokit compile python my_contracts 98 | ``` 99 | ``` -------------------------------------------------------------------------------- /packages/server/src/resources/knowledge/taxonomy/algokit:utils:python:source:index.md: -------------------------------------------------------------------------------- ```markdown 1 | # AlgoKit Python Utilities 2 | 3 | A set of core Algorand utilities written in Python and released via PyPi that make it easier to build solutions on Algorand. 4 | This project is part of [AlgoKit](https://github.com/algorandfoundation/algokit-cli). 5 | 6 | The goal of this library is to provide intuitive, productive utility functions that make it easier, quicker and safer to build applications on Algorand. 7 | Largely these functions wrap the underlying Algorand SDK, but provide a higher level interface with sensible defaults and capabilities for common tasks. 8 | 9 | ```{note} 10 | If you prefer TypeScript there's an equivalent [TypeScript utility library](https://github.com/algorandfoundation/algokit-utils-ts). 11 | ``` 12 | 13 | [Core principles](#core-principles) | [Installation](#installation) | [Usage](#usage) | [Capabilities](#capabilities) | [Reference docs](#reference-documentation) 14 | 15 | ```{toctree} 16 | --- 17 | maxdepth: 2 18 | caption: Contents 19 | --- 20 | 21 | capabilities/account 22 | capabilities/client 23 | capabilities/app-client 24 | capabilities/app-deploy 25 | capabilities/transfer 26 | capabilities/dispenser-client 27 | capabilities/debugger 28 | apidocs/algokit_utils/algokit_utils 29 | ``` 30 | 31 | (core-principles)= 32 | 33 | # Core principles 34 | 35 | This library is designed with the following principles: 36 | 37 | - **Modularity** - This library is a thin wrapper of modular building blocks over the Algorand SDK; the primitives from the underlying Algorand SDK are 38 | exposed and used wherever possible so you can opt-in to which parts of this library you want to use without having to use an all or nothing approach. 39 | - **Type-safety** - This library provides strong TypeScript support with effort put into creating types that provide good type safety and intellisense. 40 | - **Productivity** - This library is built to make solution developers highly productive; it has a number of mechanisms to make common code easier and terser to write 41 | 42 | (installation)= 43 | 44 | # Installation 45 | 46 | This library can be installed from PyPi using pip or poetry, e.g.: 47 | 48 | ``` 49 | pip install algokit-utils 50 | poetry add algokit-utils 51 | ``` 52 | 53 | (usage)= 54 | 55 | # Usage 56 | 57 | To use this library simply include the following at the top of your file: 58 | 59 | ```python 60 | import algokit_utils 61 | ``` 62 | 63 | Then you can use intellisense to auto-complete the various functions and types that are available by typing `algokit_utils.` in your favourite Integrated Development Environment (IDE), 64 | or you can refer to the [reference documentation](apidocs/algokit_utils/algokit_utils.md). 65 | 66 | ## Types 67 | 68 | The library contains extensive type hinting combined with a tool like MyPy this can help identify issues where incorrect types have been used, or used incorrectly. 69 | 70 | (capabilities)= 71 | 72 | # Capabilities 73 | 74 | The library helps you with the following capabilities: 75 | 76 | - Core capabilities 77 | - [**Client management**](capabilities/client.md) - Creation of algod, indexer and kmd clients against various networks resolved from environment or specified configuration 78 | - [**Account management**](capabilities/account.md) - Creation and use of accounts including mnemonic, multisig, transaction signer, idempotent KMD accounts and environment variable injected 79 | - Higher-order use cases 80 | - [**ARC-0032 Application Spec client**](capabilities/app-client.md) - Builds on top of the App management and App deployment capabilities to provide a high productivity application client that works with ARC-0032 application spec defined smart contracts (e.g. via Beaker) 81 | - [**App deployment**](capabilities/app-deploy.md) - Idempotent (safely retryable) deployment of an app, including deploy-time immutability and permanence control and TEAL template substitution 82 | - [**Algo transfers**](capabilities/transfer.md) - Ability to easily initiate algo transfers between accounts, including dispenser management and idempotent account funding 83 | - [**Debugger**](capabilities/debugger.md) - Provides a set of debugging tools that can be used to simulate and trace transactions on the Algorand blockchain. These tools and methods are optimized for developers who are building applications on Algorand and need to test and debug their smart contracts via [AVM Debugger extension](https://github.com/algorandfoundation/algokit-avm-vscode-debugger). 84 | 85 | (reference-documentation)= 86 | 87 | # Reference documentation 88 | 89 | We have [auto-generated reference documentation for the code](apidocs/algokit_utils/algokit_utils.md). 90 | 91 | # Roadmap 92 | 93 | This library will naturally evolve with any logical developer experience improvements needed to facilitate the [AlgoKit](https://github.com/algorandfoundation/algokit-cli) roadmap as it evolves. 94 | 95 | Likely future capability additions include: 96 | 97 | - Typed application client 98 | - Asset management 99 | - Expanded indexer API wrapper support 100 | 101 | # Indices and tables 102 | 103 | - {ref}`genindex` 104 | ``` -------------------------------------------------------------------------------- /packages/server/src/resources/knowledge/taxonomy/SDKs:javascript:classes:indexerModels.TransactionKeyreg.md: -------------------------------------------------------------------------------- ```markdown 1 | [algosdk](../README.md) / [Exports](../modules.md) / [indexerModels](../modules/indexerModels.md) / TransactionKeyreg 2 | 3 | # Class: TransactionKeyreg 4 | 5 | [indexerModels](../modules/indexerModels.md).TransactionKeyreg 6 | 7 | Fields for a keyreg transaction. 8 | Definition: 9 | data/transactions/keyreg.go : KeyregTxnFields 10 | 11 | ## Hierarchy 12 | 13 | - `default` 14 | 15 | ↳ **`TransactionKeyreg`** 16 | 17 | ## Table of contents 18 | 19 | ### Constructors 20 | 21 | - [constructor](indexerModels.TransactionKeyreg.md#constructor) 22 | 23 | ### Properties 24 | 25 | - [attribute\_map](indexerModels.TransactionKeyreg.md#attribute_map) 26 | - [nonParticipation](indexerModels.TransactionKeyreg.md#nonparticipation) 27 | - [selectionParticipationKey](indexerModels.TransactionKeyreg.md#selectionparticipationkey) 28 | - [stateProofKey](indexerModels.TransactionKeyreg.md#stateproofkey) 29 | - [voteFirstValid](indexerModels.TransactionKeyreg.md#votefirstvalid) 30 | - [voteKeyDilution](indexerModels.TransactionKeyreg.md#votekeydilution) 31 | - [voteLastValid](indexerModels.TransactionKeyreg.md#votelastvalid) 32 | - [voteParticipationKey](indexerModels.TransactionKeyreg.md#voteparticipationkey) 33 | 34 | ### Methods 35 | 36 | - [get\_obj\_for\_encoding](indexerModels.TransactionKeyreg.md#get_obj_for_encoding) 37 | - [from\_obj\_for\_encoding](indexerModels.TransactionKeyreg.md#from_obj_for_encoding) 38 | 39 | ## Constructors 40 | 41 | ### constructor 42 | 43 | • **new TransactionKeyreg**(`«destructured»`) 44 | 45 | Creates a new `TransactionKeyreg` object. 46 | 47 | #### Parameters 48 | 49 | | Name | Type | 50 | | :------ | :------ | 51 | | `«destructured»` | `Object` | 52 | | › `nonParticipation?` | `boolean` | 53 | | › `selectionParticipationKey?` | `string` \| `Uint8Array` | 54 | | › `stateProofKey?` | `string` \| `Uint8Array` | 55 | | › `voteFirstValid?` | `number` \| `bigint` | 56 | | › `voteKeyDilution?` | `number` \| `bigint` | 57 | | › `voteLastValid?` | `number` \| `bigint` | 58 | | › `voteParticipationKey?` | `string` \| `Uint8Array` | 59 | 60 | #### Overrides 61 | 62 | BaseModel.constructor 63 | 64 | #### Defined in 65 | 66 | client/v2/indexer/models/types.ts:5150 67 | 68 | ## Properties 69 | 70 | ### attribute\_map 71 | 72 | • **attribute\_map**: `Record`\<`string`, `string`\> 73 | 74 | #### Inherited from 75 | 76 | BaseModel.attribute\_map 77 | 78 | #### Defined in 79 | 80 | client/v2/basemodel.ts:56 81 | 82 | ___ 83 | 84 | ### nonParticipation 85 | 86 | • `Optional` **nonParticipation**: `boolean` 87 | 88 | (nonpart) Mark the account as participating or non-participating. 89 | 90 | #### Defined in 91 | 92 | client/v2/indexer/models/types.ts:5106 93 | 94 | ___ 95 | 96 | ### selectionParticipationKey 97 | 98 | • `Optional` **selectionParticipationKey**: `Uint8Array` 99 | 100 | (selkey) Public key used with the Verified Random Function (VRF) result during 101 | committee selection. 102 | 103 | #### Defined in 104 | 105 | client/v2/indexer/models/types.ts:5112 106 | 107 | ___ 108 | 109 | ### stateProofKey 110 | 111 | • `Optional` **stateProofKey**: `Uint8Array` 112 | 113 | (sprfkey) State proof key used in key registration transactions. 114 | 115 | #### Defined in 116 | 117 | client/v2/indexer/models/types.ts:5117 118 | 119 | ___ 120 | 121 | ### voteFirstValid 122 | 123 | • `Optional` **voteFirstValid**: `number` \| `bigint` 124 | 125 | (votefst) First round this participation key is valid. 126 | 127 | #### Defined in 128 | 129 | client/v2/indexer/models/types.ts:5122 130 | 131 | ___ 132 | 133 | ### voteKeyDilution 134 | 135 | • `Optional` **voteKeyDilution**: `number` \| `bigint` 136 | 137 | (votekd) Number of subkeys in each batch of participation keys. 138 | 139 | #### Defined in 140 | 141 | client/v2/indexer/models/types.ts:5127 142 | 143 | ___ 144 | 145 | ### voteLastValid 146 | 147 | • `Optional` **voteLastValid**: `number` \| `bigint` 148 | 149 | (votelst) Last round this participation key is valid. 150 | 151 | #### Defined in 152 | 153 | client/v2/indexer/models/types.ts:5132 154 | 155 | ___ 156 | 157 | ### voteParticipationKey 158 | 159 | • `Optional` **voteParticipationKey**: `Uint8Array` 160 | 161 | (votekey) Participation public key used in key registration transactions. 162 | 163 | #### Defined in 164 | 165 | client/v2/indexer/models/types.ts:5137 166 | 167 | ## Methods 168 | 169 | ### get\_obj\_for\_encoding 170 | 171 | ▸ **get_obj_for_encoding**(`binary?`): `Record`\<`string`, `any`\> 172 | 173 | Get an object ready for encoding to either JSON or msgpack. 174 | 175 | #### Parameters 176 | 177 | | Name | Type | Default value | Description | 178 | | :------ | :------ | :------ | :------ | 179 | | `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. | 180 | 181 | #### Returns 182 | 183 | `Record`\<`string`, `any`\> 184 | 185 | #### Inherited from 186 | 187 | BaseModel.get\_obj\_for\_encoding 188 | 189 | #### Defined in 190 | 191 | client/v2/basemodel.ts:65 192 | 193 | ___ 194 | 195 | ### from\_obj\_for\_encoding 196 | 197 | ▸ `Static` **from_obj_for_encoding**(`data`): [`TransactionKeyreg`](indexerModels.TransactionKeyreg.md) 198 | 199 | #### Parameters 200 | 201 | | Name | Type | 202 | | :------ | :------ | 203 | | `data` | `Record`\<`string`, `any`\> | 204 | 205 | #### Returns 206 | 207 | [`TransactionKeyreg`](indexerModels.TransactionKeyreg.md) 208 | 209 | #### Defined in 210 | 211 | client/v2/indexer/models/types.ts:5197 212 | ``` -------------------------------------------------------------------------------- /packages/server/src/tools/apiManager/tinyman/liquidity.ts: -------------------------------------------------------------------------------- ```typescript 1 | import { Tool, ErrorCode, McpError } from '@modelcontextprotocol/sdk/types.js'; 2 | import { AddLiquidity, poolUtils, SupportedNetwork } from '@tinymanorg/tinyman-js-sdk'; 3 | import { algodClient } from '../../../algorand-client.js'; 4 | import { env } from '../../../env.js'; 5 | 6 | async function getAssetDecimals(assetId: number): Promise<number> { 7 | try { 8 | if (assetId === 0) return 6; // Algo has 6 decimals 9 | const assetInfo = await algodClient.getAssetByID(assetId).do(); 10 | return assetInfo.params.decimals; 11 | } catch (error) { 12 | console.error(`Failed to get decimals for asset ${assetId}:`, error); 13 | return 6; // Default to 6 decimals if we can't get the info 14 | } 15 | } 16 | 17 | export const liquidityTools: Tool[] = [ 18 | { 19 | name: 'api_tinyman_get_liquidity_quote', 20 | description: 'Get quote for adding liquidity to a pool', 21 | inputSchema: { 22 | type: 'object', 23 | properties: { 24 | asset1Id: { 25 | type: 'integer', 26 | description: 'ID of the first asset' 27 | }, 28 | asset2Id: { 29 | type: 'integer', 30 | description: 'ID of the second asset' 31 | }, 32 | asset1Amount: { 33 | type: 'integer', 34 | description: 'Amount of first asset to add' 35 | }, 36 | asset2Amount: { 37 | type: 'integer', 38 | description: 'Amount of second asset to add' 39 | }, 40 | mode: { 41 | type: 'string', 42 | enum: ['initial', 'flexible', 'singleAsset'], 43 | description: 'Mode of adding liquidity' 44 | }, 45 | version: { 46 | type: 'string', 47 | enum: ['v1_1', 'v2'], 48 | description: 'Tinyman protocol version', 49 | default: 'v2' 50 | } 51 | }, 52 | required: ['asset1Id', 'asset2Id', 'mode'] 53 | } 54 | } 55 | ]; 56 | 57 | export async function handleLiquidityTools(args: any): Promise<any> { 58 | const { 59 | name, 60 | asset1Id, 61 | asset2Id, 62 | asset1Amount = 0, 63 | asset2Amount = 0, 64 | mode, 65 | version = 'v2' 66 | } = args; 67 | 68 | if (name === 'api_tinyman_get_liquidity_quote') { 69 | try { 70 | // Get pool information first 71 | const poolInfo = await (version === 'v2' 72 | ? poolUtils.v2.getPoolInfo({ 73 | client: algodClient, 74 | network: env.algorand_network as SupportedNetwork, 75 | asset1ID: asset1Id, 76 | asset2ID: asset2Id 77 | }) 78 | : poolUtils.v1_1.getPoolInfo({ 79 | client: algodClient, 80 | network: env.algorand_network as SupportedNetwork, 81 | asset1ID: asset1Id, 82 | asset2ID: asset2Id 83 | })); 84 | 85 | let quote; 86 | if (version === 'v2') { 87 | switch (mode) { 88 | case 'initial': 89 | quote = AddLiquidity.v2.initial.getQuote({ 90 | pool: poolInfo, 91 | asset1: { 92 | amount: BigInt(asset1Amount), 93 | decimals: await getAssetDecimals(asset1Id) 94 | }, 95 | asset2: { 96 | amount: BigInt(asset2Amount), 97 | decimals: await getAssetDecimals(asset2Id) 98 | } 99 | }); 100 | break; 101 | case 'flexible': 102 | quote = AddLiquidity.v2.flexible.getQuote({ 103 | pool: poolInfo, 104 | asset1: { 105 | amount: BigInt(asset1Amount), 106 | decimals: await getAssetDecimals(asset1Id) 107 | }, 108 | asset2: { 109 | amount: BigInt(asset2Amount), 110 | decimals: await getAssetDecimals(asset2Id) 111 | } 112 | }); 113 | break; 114 | case 'singleAsset': 115 | quote = AddLiquidity.v2.withSingleAsset.getQuote({ 116 | pool: poolInfo, 117 | assetIn: { 118 | id: asset1Id, 119 | amount: BigInt(asset1Amount) 120 | }, 121 | decimals: { 122 | asset1: await getAssetDecimals(asset1Id), 123 | asset2: await getAssetDecimals(asset2Id) 124 | } 125 | }); 126 | break; 127 | default: 128 | throw new McpError( 129 | ErrorCode.InvalidParams, 130 | `Invalid liquidity mode: ${mode}` 131 | ); 132 | } 133 | } else { 134 | // Get pool reserves for v1.1 135 | const reserves = await poolUtils.v1_1.getPoolReserves(algodClient, poolInfo); 136 | quote = AddLiquidity.v1_1.getQuote({ 137 | pool: poolInfo, 138 | reserves, 139 | asset1In: BigInt(asset1Amount), 140 | asset2In: BigInt(asset2Amount) 141 | }); 142 | } 143 | 144 | return quote; 145 | } catch (error) { 146 | throw new McpError( 147 | ErrorCode.InternalError, 148 | `Failed to get liquidity quote: ${error instanceof Error ? error.message : String(error)}` 149 | ); 150 | } 151 | } 152 | 153 | throw new McpError( 154 | ErrorCode.MethodNotFound, 155 | `Unknown liquidity tool: ${name}` 156 | ); 157 | } 158 | ``` -------------------------------------------------------------------------------- /packages/server/src/tools/apiManager/tinyman/swap.ts: -------------------------------------------------------------------------------- ```typescript 1 | import { Tool, ErrorCode, McpError } from '@modelcontextprotocol/sdk/types.js'; 2 | import { Swap, poolUtils, SwapType, SupportedNetwork } from '@tinymanorg/tinyman-js-sdk'; 3 | import { algodClient } from '../../../algorand-client.js'; 4 | import { env } from '../../../env.js'; 5 | 6 | async function getAssetDecimals(assetId: number): Promise<number> { 7 | try { 8 | if (assetId === 0) return 6; // Algo has 6 decimals 9 | const assetInfo = await algodClient.getAssetByID(assetId).do(); 10 | return assetInfo.params.decimals; 11 | } catch (error) { 12 | console.error(`Failed to get decimals for asset ${assetId}:`, error); 13 | return 6; // Default to 6 decimals if we can't get the info 14 | } 15 | } 16 | 17 | export const swapTools: Tool[] = [ 18 | { 19 | name: 'api_tinyman_get_swap_quote', 20 | description: 'Get quote for swapping assets', 21 | inputSchema: { 22 | type: 'object', 23 | properties: { 24 | assetIn: { 25 | type: 'integer', 26 | description: 'ID of the input asset' 27 | }, 28 | assetOut: { 29 | type: 'integer', 30 | description: 'ID of the output asset' 31 | }, 32 | amount: { 33 | type: 'integer', 34 | description: 'Amount to swap' 35 | }, 36 | mode: { 37 | type: 'string', 38 | enum: ['fixedInput', 'fixedOutput'], 39 | description: 'Mode of swap' 40 | }, 41 | version: { 42 | type: 'string', 43 | enum: ['v1_1', 'v2'], 44 | description: 'Tinyman protocol version', 45 | default: 'v2' 46 | } 47 | }, 48 | required: ['assetIn', 'assetOut', 'amount', 'mode'] 49 | } 50 | } 51 | ]; 52 | 53 | export async function handleSwapTools(args: any): Promise<any> { 54 | const { 55 | name, 56 | assetIn, 57 | assetOut, 58 | amount, 59 | mode, 60 | version = 'v2' 61 | } = args; 62 | 63 | if (name === 'api_tinyman_get_swap_quote') { 64 | try { 65 | // Get pool information first 66 | const poolInfo = await (version === 'v2' 67 | ? poolUtils.v2.getPoolInfo({ 68 | client: algodClient, 69 | network: env.algorand_network as SupportedNetwork, 70 | asset1ID: assetIn, 71 | asset2ID: assetOut 72 | }) 73 | : poolUtils.v1_1.getPoolInfo({ 74 | client: algodClient, 75 | network: env.algorand_network as SupportedNetwork, 76 | asset1ID: assetIn, 77 | asset2ID: assetOut 78 | })); 79 | 80 | // Get asset decimals 81 | const [assetInDecimals, assetOutDecimals] = await Promise.all([ 82 | getAssetDecimals(assetIn), 83 | getAssetDecimals(assetOut) 84 | ]); 85 | 86 | let quote; 87 | if (version === 'v2') { 88 | if (mode === 'fixedInput') { 89 | quote = await Swap.v2.getQuote({ 90 | assetIn: { 91 | id: assetIn, 92 | decimals: assetInDecimals 93 | }, 94 | assetOut: { 95 | id: assetOut, 96 | decimals: assetOutDecimals 97 | }, 98 | pool: poolInfo, 99 | amount: BigInt(amount), 100 | type: SwapType.FixedInput, 101 | network: env.algorand_network as SupportedNetwork, 102 | slippage: 0.01 // 1% slippage 103 | }); 104 | } else { 105 | quote = await Swap.v2.getQuote({ 106 | assetIn: { 107 | id: assetIn, 108 | decimals: assetInDecimals 109 | }, 110 | assetOut: { 111 | id: assetOut, 112 | decimals: assetOutDecimals 113 | }, 114 | pool: poolInfo, 115 | amount: BigInt(amount), 116 | type: SwapType.FixedOutput, 117 | network: env.algorand_network as SupportedNetwork, 118 | slippage: 0.01 119 | }); 120 | } 121 | } else { 122 | // Get pool reserves for v1.1 123 | const reserves = await poolUtils.v1_1.getPoolReserves(algodClient, poolInfo); 124 | if (mode === 'fixedInput') { 125 | quote = Swap.v1_1.getQuote( 126 | SwapType.FixedInput, 127 | poolInfo, 128 | reserves, 129 | { 130 | id: assetIn, 131 | amount: BigInt(amount) 132 | }, 133 | { 134 | assetIn: assetInDecimals, 135 | assetOut: assetOutDecimals 136 | } 137 | ); 138 | } else { 139 | quote = Swap.v1_1.getQuote( 140 | SwapType.FixedOutput, 141 | poolInfo, 142 | reserves, 143 | { 144 | id: assetOut, 145 | amount: BigInt(amount) 146 | }, 147 | { 148 | assetIn: assetInDecimals, 149 | assetOut: assetOutDecimals 150 | } 151 | ); 152 | } 153 | } 154 | 155 | return quote; 156 | } catch (error) { 157 | throw new McpError( 158 | ErrorCode.InternalError, 159 | `Failed to get swap quote: ${error instanceof Error ? error.message : String(error)}` 160 | ); 161 | } 162 | } 163 | 164 | throw new McpError( 165 | ErrorCode.MethodNotFound, 166 | `Unknown swap tool: ${name}` 167 | ); 168 | } 169 | ``` -------------------------------------------------------------------------------- /packages/server/src/resources/knowledge/taxonomy/ARCs:specs:arc-0073.md: -------------------------------------------------------------------------------- ```markdown 1 | --- 2 | arc: 73 3 | title: Algorand Interface Detection Spec 4 | description: A specification for smart contracts and indexers to detect interfaces of smart contracts. 5 | author: William G Hatch (@willghatch) 6 | discussions-to: https://github.com/algorandfoundation/ARCs/issues/165 7 | status: Final 8 | type: Standards Track 9 | category: Interface 10 | sub-category: Application 11 | created: 2023-01-10 12 | requires: 4, 22, 28 13 | --- 14 | 15 | # Algorand Interface Detection Spec 16 | 17 | ## Abstract 18 | 19 | This ARC specifies an interface detection interface based on <a href="https://eips.ethereum.org/EIPS/eip-165">ERC-165</a>. 20 | This interface allows smart contracts and indexers to detect whether a smart contract implements a particular interface based on an interface selector. 21 | 22 | 23 | ## Motivation 24 | 25 | [ARC-4](arc-0004.md) applications have associated Contract or Interface description JSON objects that allow users to call their methods. 26 | However, these JSON objects are communicated outside of the consensus network. 27 | Therefore indexers can not reliably identify contract instances of a particular interface, and smart contracts have no way to detect whether another contract supports a particular interface. 28 | An on-chain method to detect interfaces allows greater composability for smart contracts, and allows indexers to automatically detect implementations of interfaces of interest. 29 | 30 | 31 | ## Specification 32 | The key words "**MUST**", "**MUST NOT**", "**REQUIRED**", "**SHALL**", "**SHALL NOT**", "**SHOULD**", "**SHOULD NOT**", "**RECOMMENDED**", "**MAY**", and "**OPTIONAL**" in this document are to be interpreted as described in <a href="https://www.ietf.org/rfc/rfc2119.txt">RFC-2119</a>. 33 | 34 | 35 | ### How Interfaces are Identified 36 | 37 | The specification for interfaces is defined by [ARC-4](./arc-0004.md). 38 | This specification extends ARC-4 to define the concept of an interface selector. 39 | We define the interface selector as the XOR of all selectors in the interface. 40 | Selectors in the interface include selectors for methods, selectors for events as defined by [ARC-28](./arc-0028.md), and selectors for potential future kinds of interface components. 41 | 42 | As an example, consider an interface that has two methods and one event, `add(uint64,uint64)uint128`, `add3(uint64,uint64,uint64)uint128`, and `alert(uint64)`. 43 | The method selector for the `add` method is the first 4 bytes of the method signature's SHA-512/256 hash. 44 | The SHA-512/256 hash of `add(uint64,uint64)uint128` is `0x8aa3b61f0f1965c3a1cbfa91d46b24e54c67270184ff89dc114e877b1753254a`, so its method selector is `0x8aa3b61f`. 45 | The SHA-512/256 hash of `add3(uint64,uint64,uint64)uint128` is `0xa6fd1477731701dd2126f24facf3492d470cf526e7d4d849fea33d102b45f03d`, so its method selector is `0xa6fd1477` 46 | The SHA-512/256 hash of `alert(uint64)` is `0xc809efe9fd45417226d52b605658b83fff27850a01efeea30f694d1e112d5463`, so its method selector is `0xc809efe9` 47 | The interface selector is defined as the bitwise exclusive or of all method and event selectors, so the interface selector is `0x8aa3b61f XOR 0xa6fd1477 XOR 0xc809efe9`, which is `0xe4574d81`. 48 | 49 | ### How a Contract will Publish the Interfaces it Implements for Detection 50 | 51 | In addition to out-of-band JSON contract or interface description data, a contract that is compliant with this specification shall implement the following interface: 52 | 53 | ```json 54 | { 55 | "name": "ARC-73", 56 | "desc": "Interface for interface detection", 57 | "methods": [ 58 | { 59 | "name": "supportsInterface", 60 | "desc": "Detects support for an interface specified by selector.", 61 | "readonly": true, 62 | "args": [ 63 | { "type": "byte[4]", "name": "interfaceID", "desc": "The selector of the interface to detect." }, 64 | ], 65 | "returns": { "type": "bool", "desc": "Whether the contract supports the interface." } 66 | } 67 | ] 68 | } 69 | ``` 70 | 71 | The `supportsInterface` method must be `readonly` as specified by [ARC-22](./arc-0022.md). 72 | 73 | The implementing contract must have a `supportsInterface` method that returns: 74 | 75 | * `true` when `interfaceID` is `0x4e22a3ba` (the selector for [ARC-73](./arc-0073.md), this interface) 76 | * `false` when `interfaceID` is `0xffffffff` 77 | * `true` for any other `interfaceID` the contract implements 78 | * `false` for any other `interfaceID` 79 | 80 | 81 | ## Rationale 82 | 83 | This specification is nearly identical to the related specification for Ethereum, <a href="https://eips.ethereum.org/EIPS/eip-165">ERC-165</a>, merely adapted to Algorand. 84 | 85 | 86 | ## Security Considerations 87 | 88 | It is possible that a malicious contract may lie about interface support. 89 | This interface makes it easier for all kinds of actors, inclulding malicious ones, to interact with smart contracts that implement it. 90 | 91 | 92 | ## Copyright 93 | Copyright and related rights waived via <a href="https://creativecommons.org/publicdomain/zero/1.0/">CCO</a>. 94 | ``` -------------------------------------------------------------------------------- /packages/server/src/resources/knowledge/taxonomy/tealscript:guides_Supported Types_arrays.md: -------------------------------------------------------------------------------- ```markdown 1 | --- 2 | title: Arrays, Tuples, and Objects 3 | --- 4 | 5 | TEALScript supports various forms of arrays and tuples. In general, it is always recommended to use **static** types in arrays whenever possible and avoid booleans. Dynamic types and booleans are much more expensive to use and have some limitations listed below. 6 | 7 | ## Pass by Reference 8 | All arrays and objects are passed by reference even if in contract state, much like TypeScript. TEALScript, however, will not let a function mutate an array that was passed as an argument. 9 | 10 | If you wish to pass by value you can use `clone`. 11 | 12 | ```ts 13 | const x: uint64[] = [1,2,3]; 14 | const y = x; 15 | y[0] = 4 16 | 17 | log(y) // [4, 2, 3] 18 | log(x) // [4, 2, 3] 19 | 20 | const z = clone(x) 21 | z[1] = 5 22 | 23 | log(x) // [4, 2, 3] note x has NOT changed 24 | log(z) // [4, 5, 3] 25 | ``` 26 | 27 | ## Instantiation 28 | 29 | When instantiating an array or object, a type **MUST** be defined. For example, `const x: uint64[] = [1, 2, 3]`. If you omit the type, the compiler will throw an error `const x = [1, 2, 3] // ERROR` 30 | 31 | ## Static Arrays 32 | 33 | The most efficient and capable type of arrays are static arrays. To define a static array type in TEALScript you need to use the `StaticArray` generic type. For example, `StaticArray<uint64, 10>` for an array of 10 unsigned 64-bit integers. It should be noted that putting the length in a bracket (ie. `uint64[10]`) is **NOT** valid TypeScript syntax thus not officially supported by TEALScript. 34 | 35 | ### Partial Definition 36 | 37 | If you have a static array but only want to initialize some of the initial values, you can it instantiate with an array less than the defined length. The remaning values will be zero bytes. For example, the following instantiations create the same underlying byte array 38 | 39 | ```ts 40 | const x: <StaticArray, 3> = [1] 41 | const y: <StaticArray, 3> = [1, 0, 0] 42 | ``` 43 | 44 | ### forEach iteration 45 | 46 | The most efficient way to iterate over an array is to use `.forEach`. This is currently only supported on static arrays. `.forEach` also works on arrays larger than 4kb stored in boxes. 47 | 48 | ```ts 49 | staticForEach(): uint64 { 50 | const a: StaticArray<uint64, 3> = [1, 2, 3]; 51 | let sum = 0; 52 | 53 | a.forEach((v) => { 54 | sum += v; 55 | }); 56 | return sum; // 6 57 | } 58 | ``` 59 | 60 | 61 | It should be noted that the second argument (current index) is not currently supported. The iterator function must also be explicitly defined as an arrow function (rather than passing in another function). Both of these features are being considered for future releases. 62 | 63 | ### Supported Methods 64 | 65 | The following array methods are supported on static arrays (note the limitations on `forEach` above) 66 | 67 | * [length](https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Array/length) 68 | * [forEach](https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Array/forEach) 69 | 70 | ## Dynamic Arrays 71 | 72 | Dynamic arrays are supported in TEALScript but anything beyond dynamic arrays of static types is very inefficient. For example, `uint64[]` is fairly efficient but `uint64[][]` is much less efficient. 73 | 74 | ### Tecnical Explanation 75 | 76 | Under the hood, TEALScript will chop off the length prefix of dynamic arrays during runtime. This means `uint64[]` is just a bunch of 8-byte slices concatenated together. This makes all operations, whether its reading or writing, much more simple. Nested dynamic types are encoded as dynamic tuples, this requires much more opcodes to read/write the tuple head and tail values. 77 | 78 | ### Supported Methods 79 | 80 | Dynamic arrays in TEALScript support the following methods and they function just as they do in TypeScript. It should be noted that `splice` is rather heavy in terms of opcode cost so it should be used sparringly. 81 | 82 | * [pop](https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Array/pop) 83 | * [push](https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Array/push) 84 | * [splice](https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Array/splice) 85 | * [length](https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Array/length) 86 | 87 | ## Objects 88 | 89 | Object can be defined much like in TypeScript. The same efficiencies of static vs dynamic types also applies to objects. 90 | 91 | Currently no `Object` methods are supported in TEALScript. 92 | 93 | ### Technical Explanation 94 | 95 | Under the hood, TEALScript objects are just tuples. For example `[uint64, uint8]` is the same byteslice as `{ foo: uint64, bar: uint8 }`. The order of elements in the tuple depends on the order they are defined in the type defintion. For example, the following definitions result in the same byteslice. 96 | 97 | ```ts 98 | type MyType = { foo: uint64, bar: uint8 } 99 | 100 | ... 101 | 102 | const x: MyType = { foo: 1, bar: 2} 103 | const y: MyType = { bar: 2, foo: 1 } 104 | ``` 105 | ``` -------------------------------------------------------------------------------- /packages/server/src/resources/knowledge/taxonomy/algokit:lora:README.md: -------------------------------------------------------------------------------- ```markdown 1 | <div align="center"> 2 | <a href="https://github.com/algorandfoundation/algokit-lora"><img src="https://bafybeigi4s7alfr7fdir5mdi6xzmichoubnwndol4ts6ktz52y3qvd5soe.ipfs.nftstorage.link/" width=60%></a> 3 | </div> 4 | 5 | <p align="center"> 6 | <a target="_blank" href="https://github.com/algorandfoundation/algokit-lora/blob/main/README.md"><img src="https://img.shields.io/badge/docs-repository-00dc94?logo=github&style=flat.svg" /></a> 7 | <a target="_blank" href="https://developer.algorand.org/algokit/"><img src="https://img.shields.io/badge/learn-AlgoKit-00dc94?logo=algorand&mac=flat.svg" /></a> 8 | <a target="_blank" href="https://github.com/algorandfoundation/algokit-lora"><img src="https://img.shields.io/github/stars/algorandfoundation/algokit-lora?color=00dc94&logo=star&style=flat" /></a> 9 | <a target="_blank" href="https://developer.algorand.org/algokit/"><img src="https://api.visitorbadge.io/api/visitors?path=https%3A%2F%2Fgithub.com%2Falgorandfoundation%2Falgokit-lora&countColor=%2300dc94&style=flat" /></a> 10 | </p> 11 | 12 | --- 13 | 14 | Algorand AlgoKit lora is a live on-chain resource analyzer, that enables developers to explore and interact with a configured Algorand network in a visual way. 15 | 16 | ## What is lora? 17 | 18 | AlgoKit lora is a powerful visual tool designed to streamline the Algorand local development experience. 19 | It acts as both a network explorer and a tool for building and testing your Algorand applications. 20 | 21 | You can access lora by visiting [https://lora.algokit.io](https://lora.algokit.io) in your browser or by running `algokit explore` when you have the [AlgoKit CLI](https://github.com/algorandfoundation/algokit-cli) installed. 22 | 23 | ## Why did we build lora? 24 | 25 | An explorer is an essential tool for making blockchain data accessible and enables users to inspect and understand on-chain activities. Without these tools, it's difficult to interpret data or gather the information and insights to fully harness the potential of the blockchain. Therefore it makes sense to have a high quality, officially supported and fully open-source tool available to the community. 26 | 27 | Before developing lora, we evaluated the existing tools in the community, but none fully met our desires. 28 | 29 | As part of this evaluation we came up with several design goals, which are: 30 | 31 | - **Developer-Centric User Experience**: Offer a rich user experience tailored for developers, with support for LocalNet, TestNet, and MainNet. 32 | - **Open Source**: Fully open source and actively maintained. 33 | - **Operationally Simple**: Operate using algod and indexer directly, eliminating the need for additional setup, deployment, or maintenance. 34 | - **Visualize Complexity**: Enable Algorand developers to understand complex transactions and transaction groups by visually representing them. 35 | - **Contextual Linking**: Allow users to see live and historical transactions in the context of related accounts, assets, or applications. 36 | - **Performant**: Ensure a fast and seamless experience by minimizing requests to upstream services and utilizing caching to prevent unnecessary data fetching. Whenever possible, ancillary data should be fetched just in time with minimal over-fetching. 37 | - **Support the Learning Journey**: Assist developers in discovering and learning about the Algorand ecosystem. 38 | - **Seamless Integration**: Use and integrate seamlessly with the existing AlgoKit tools and enhance their usefulness. 39 | - **Local Installation**: Allow local installation alongside the AlgoKit CLI and your existing dev tools. 40 | 41 | ## Key features 42 | 43 | - Explore blocks, transactions, transaction groups, assets, accounts and applications on LocalNet, TestNet or MainNet. 44 | - Visualise and understand complex transactions and transaction groups with the visual transaction view. 45 | - View blocks in real time as they are produced on the connected network. 46 | - Monitor and inspect real-time transactions related to an asset, account, or application with the live transaction view. 47 | - Review historical transactions related to an asset, account, or application through the historical transaction view. 48 | - Access detailed asset information and metadata when the asset complies with one of the ASA ARCs. 49 | - Connected to your Algorand wallet and perform context specific actions. 50 | - Fund an account in LocalNet or TestNet. 51 | - Visually deploy, populate, simulate and call an app by uploading an ARC-4, ARC-32 or ARC-56 app spec via App lab. 52 | - Craft, simulate and send transaction groups using Transaction wizard. 53 | - Seamless integration into the existing AlgoKit ecosystem. 54 | 55 | ## Roadmap 56 | 57 | - Installable app with tighter AlgoKit tooling integration. 58 | 59 | ## Contributing 60 | 61 | See the [contributing page](./CONTRIBUTING.md) to learn about making improvements to the CLI tool itself, including developer setup instructions. 62 | ``` -------------------------------------------------------------------------------- /packages/server/src/resources/knowledge/taxonomy/algokit:utils:typescript:code:classes:types_app_arc56.Arc56Method.md: -------------------------------------------------------------------------------- ```markdown 1 | [@algorandfoundation/algokit-utils](../README.md) / [types/app-arc56](../modules/types_app_arc56.md) / Arc56Method 2 | 3 | # Class: Arc56Method 4 | 5 | [types/app-arc56](../modules/types_app_arc56.md).Arc56Method 6 | 7 | Wrapper around `algosdk.ABIMethod` that represents an ARC-56 ABI method. 8 | 9 | ## Hierarchy 10 | 11 | - `ABIMethod` 12 | 13 | ↳ **`Arc56Method`** 14 | 15 | ## Table of contents 16 | 17 | ### Constructors 18 | 19 | - [constructor](types_app_arc56.Arc56Method.md#constructor) 20 | 21 | ### Properties 22 | 23 | - [args](types_app_arc56.Arc56Method.md#args) 24 | - [description](types_app_arc56.Arc56Method.md#description) 25 | - [events](types_app_arc56.Arc56Method.md#events) 26 | - [method](types_app_arc56.Arc56Method.md#method) 27 | - [name](types_app_arc56.Arc56Method.md#name) 28 | - [readonly](types_app_arc56.Arc56Method.md#readonly) 29 | - [returns](types_app_arc56.Arc56Method.md#returns) 30 | 31 | ### Methods 32 | 33 | - [getSelector](types_app_arc56.Arc56Method.md#getselector) 34 | - [getSignature](types_app_arc56.Arc56Method.md#getsignature) 35 | - [toJSON](types_app_arc56.Arc56Method.md#tojson) 36 | - [txnCount](types_app_arc56.Arc56Method.md#txncount) 37 | - [fromSignature](types_app_arc56.Arc56Method.md#fromsignature) 38 | 39 | ## Constructors 40 | 41 | ### constructor 42 | 43 | • **new Arc56Method**(`method`): [`Arc56Method`](types_app_arc56.Arc56Method.md) 44 | 45 | #### Parameters 46 | 47 | | Name | Type | 48 | | :------ | :------ | 49 | | `method` | [`Method`](../interfaces/types_app_arc56.Method.md) | 50 | 51 | #### Returns 52 | 53 | [`Arc56Method`](types_app_arc56.Arc56Method.md) 54 | 55 | #### Overrides 56 | 57 | algosdk.ABIMethod.constructor 58 | 59 | #### Defined in 60 | 61 | [src/types/app-arc56.ts:26](https://github.com/algorandfoundation/algokit-utils-ts/blob/main/src/types/app-arc56.ts#L26) 62 | 63 | ## Properties 64 | 65 | ### args 66 | 67 | • `Readonly` **args**: \{ `defaultValue?`: \{ `data`: `string` ; `source`: ``"method"`` \| ``"box"`` \| ``"global"`` \| ``"local"`` \| ``"literal"`` ; `type?`: `string` } ; `desc?`: `string` ; `name?`: `string` ; `struct?`: `string` ; `type`: `ABIArgumentType` }[] 68 | 69 | #### Overrides 70 | 71 | algosdk.ABIMethod.args 72 | 73 | #### Defined in 74 | 75 | [src/types/app-arc56.ts:23](https://github.com/algorandfoundation/algokit-utils-ts/blob/main/src/types/app-arc56.ts#L23) 76 | 77 | ___ 78 | 79 | ### description 80 | 81 | • `Optional` `Readonly` **description**: `string` 82 | 83 | #### Inherited from 84 | 85 | algosdk.ABIMethod.description 86 | 87 | #### Defined in 88 | 89 | node_modules/algosdk/dist/types/abi/method.d.ts:28 90 | 91 | ___ 92 | 93 | ### events 94 | 95 | • `Optional` `Readonly` **events**: `ARC28Event`[] 96 | 97 | #### Inherited from 98 | 99 | algosdk.ABIMethod.events 100 | 101 | #### Defined in 102 | 103 | node_modules/algosdk/dist/types/abi/method.d.ts:38 104 | 105 | ___ 106 | 107 | ### method 108 | 109 | • **method**: [`Method`](../interfaces/types_app_arc56.Method.md) 110 | 111 | #### Defined in 112 | 113 | [src/types/app-arc56.ts:26](https://github.com/algorandfoundation/algokit-utils-ts/blob/main/src/types/app-arc56.ts#L26) 114 | 115 | ___ 116 | 117 | ### name 118 | 119 | • `Readonly` **name**: `string` 120 | 121 | #### Inherited from 122 | 123 | algosdk.ABIMethod.name 124 | 125 | #### Defined in 126 | 127 | node_modules/algosdk/dist/types/abi/method.d.ts:27 128 | 129 | ___ 130 | 131 | ### readonly 132 | 133 | • `Optional` `Readonly` **readonly**: `boolean` 134 | 135 | #### Inherited from 136 | 137 | algosdk.ABIMethod.readonly 138 | 139 | #### Defined in 140 | 141 | node_modules/algosdk/dist/types/abi/method.d.ts:39 142 | 143 | ___ 144 | 145 | ### returns 146 | 147 | • `Readonly` **returns**: `Object` 148 | 149 | #### Type declaration 150 | 151 | | Name | Type | Description | 152 | | :------ | :------ | :------ | 153 | | `desc?` | `string` | Optional, user-friendly description for the return value | 154 | | `struct?` | `string` | If the type is a struct, the name of the struct | 155 | | `type` | `ABIReturnType` | - | 156 | 157 | #### Overrides 158 | 159 | algosdk.ABIMethod.returns 160 | 161 | #### Defined in 162 | 163 | [src/types/app-arc56.ts:24](https://github.com/algorandfoundation/algokit-utils-ts/blob/main/src/types/app-arc56.ts#L24) 164 | 165 | ## Methods 166 | 167 | ### getSelector 168 | 169 | ▸ **getSelector**(): `Uint8Array` 170 | 171 | #### Returns 172 | 173 | `Uint8Array` 174 | 175 | #### Inherited from 176 | 177 | algosdk.ABIMethod.getSelector 178 | 179 | #### Defined in 180 | 181 | node_modules/algosdk/dist/types/abi/method.d.ts:42 182 | 183 | ___ 184 | 185 | ### getSignature 186 | 187 | ▸ **getSignature**(): `string` 188 | 189 | #### Returns 190 | 191 | `string` 192 | 193 | #### Inherited from 194 | 195 | algosdk.ABIMethod.getSignature 196 | 197 | #### Defined in 198 | 199 | node_modules/algosdk/dist/types/abi/method.d.ts:41 200 | 201 | ___ 202 | 203 | ### toJSON 204 | 205 | ▸ **toJSON**(): [`Method`](../interfaces/types_app_arc56.Method.md) 206 | 207 | #### Returns 208 | 209 | [`Method`](../interfaces/types_app_arc56.Method.md) 210 | 211 | #### Overrides 212 | 213 | algosdk.ABIMethod.toJSON 214 | 215 | #### Defined in 216 | 217 | [src/types/app-arc56.ts:38](https://github.com/algorandfoundation/algokit-utils-ts/blob/main/src/types/app-arc56.ts#L38) 218 | 219 | ___ 220 | 221 | ### txnCount 222 | 223 | ▸ **txnCount**(): `number` 224 | 225 | #### Returns 226 | 227 | `number` 228 | 229 | #### Inherited from 230 | 231 | algosdk.ABIMethod.txnCount 232 | 233 | #### Defined in 234 | 235 | node_modules/algosdk/dist/types/abi/method.d.ts:43 236 | 237 | ___ 238 | 239 | ### fromSignature 240 | 241 | ▸ **fromSignature**(`signature`): `ABIMethod` 242 | 243 | #### Parameters 244 | 245 | | Name | Type | 246 | | :------ | :------ | 247 | | `signature` | `string` | 248 | 249 | #### Returns 250 | 251 | `ABIMethod` 252 | 253 | #### Inherited from 254 | 255 | algosdk.ABIMethod.fromSignature 256 | 257 | #### Defined in 258 | 259 | node_modules/algosdk/dist/types/abi/method.d.ts:45 260 | ``` -------------------------------------------------------------------------------- /packages/server/src/resources/knowledge/taxonomy/ARCs:specs:arc-0015.md: -------------------------------------------------------------------------------- ```markdown 1 | --- 2 | arc: 15 3 | title: Encrypted Short Messages 4 | description: Scheme for encryption/decryption that allows for private messages. 5 | author: Stéphane Barroso (@sudoweezy), Paweł Pierścionek (@urtho) 6 | discussions-to: https://github.com/algorandfoundation/ARCs/issues/* 7 | status: Deprecated 8 | type: Standards Track 9 | category: Interface 10 | created: 2022-11-21 11 | requires: 4 12 | --- 13 | 14 | # Encrypted Short Messages 15 | 16 | ## Abstract 17 | 18 | The goal of this convention is to have a standard way for block explorers, wallets, exchanges, marketplaces, and more generally, client software to send, read & delete short encrypted messages. 19 | 20 | ## Specification 21 | The key words "**MUST**", "**MUST NOT**", "**REQUIRED**", "**SHALL**", "**SHALL NOT**", "**SHOULD**", "**SHOULD NOT**", "**RECOMMENDED**", "**MAY**", and "**OPTIONAL**" in this document are to be interpreted as described in <a href="https://www.ietf.org/rfc/rfc2119.txt">RFC-2119</a>. 22 | 23 | > Comments like this are non-normative. 24 | 25 | ### Account's message Application 26 | 27 | To receive a message, an Account **MUST** create an application that follows this convention: 28 | 29 | - A Local State named `public_key` **MUST** contain an *NACL Public Key (Curve 25519)* key 30 | - A Local State named `arc` **MUST** contain the value `arc15-nacl-curve25519` 31 | 32 | 33 | - A Box `inbox` where: 34 | - Keys is an ABI encoded of the tuple `(address,uint64)` containing the address of the sender and the round when the message is sent 35 | - Value is an encoded **text** 36 | 37 | > With this design, for each round, the sender can only write one message per round. 38 | > For the same round, an account can receive multiple messages if distinct sender sends them 39 | 40 | ### ABI Interface 41 | 42 | The associated smart contract **MUST** implement the following ABI interface: 43 | ```json 44 | { 45 | "name": "ARC_0015", 46 | "desc": "Interface for an encrypted messages application", 47 | "methods": [ 48 | { 49 | "name": "write", 50 | "desc": "Write encrypted text to the box inbox", 51 | "args": [ 52 | { "type": "byte[]", "name": "text", "desc": "Encrypted text provided by the sender." } 53 | ], 54 | "returns": { "type": "void" } 55 | }, 56 | { 57 | "name": "authorize", 58 | "desc": "Authorize an addresses to send a message", 59 | "args": [ 60 | { "type": "byte[]", "name": "address_to_add", "desc": "Address of a sender" }, 61 | { "type": "byte[]", "name": "info", "desc": "information about the sender" } 62 | ], 63 | "returns": { "type": "void" } 64 | }, 65 | { 66 | "name": "remove", 67 | "desc": "Delete the encrypted text sent by an account on a particular round. Send the MBR used for a box to the Application's owner.", 68 | "args": [ 69 | { "type": "byte[]", "name": "address", "desc": "Address of the sender"}, 70 | { "type": "uint64", "name": "round", "desc": "Round when the message was sent"} 71 | ], 72 | "returns": { "type": "void" } 73 | }, 74 | { 75 | "name": "set_public_key", 76 | "desc": "Register a NACL Public Key (Curve 25519) to the global value public_key", 77 | "args": [ 78 | { "type": "byte[]", "name": "public_key", "desc": "NACL Public Key (Curve 25519)" } 79 | ], 80 | "returns": { "type": "void" } 81 | } 82 | ] 83 | } 84 | ``` 85 | > Warning: The remove method only removes the box used for a message, but it is still possible to access it by looking at the indexer. 86 | 87 | ## Rationale 88 | Algorand blockchain unlocks many new use cases - anonymous user login to dApps and classical WEB2.0 solutions being one of them. For many use-cases, anonymous users still require asynchronous event notifications, and email seems to be the only standard option at the time of the creation of this ARC. With wallet adoption of this standard, users will enjoy real-time encrypted A2P (application-to-person) notifications without having to provide their email addresses and without any vendor lock-in. 89 | 90 | There is also a possibility to do a similar version of this ARC with one App which will store every message for every Account. 91 | 92 | Another approach was to use the note field for messages, but with box storage available, it was a more practical and secure design. 93 | 94 | ## Reference Implementation 95 | 96 | The following codes are not audited and are only here for information purposes. 97 | It **MUST** not be used in production. 98 | 99 | Here is an example of how the code can be run in python : 100 | [main.py](../assets/arc-0015/main.py). 101 | > The delete method is only for test purposes, it is not part of the ABI for an `ARC-15` Application. 102 | 103 | An example the application created using Beaker can be found here : 104 | [application.py](../assets/arc-0015/application.py). 105 | 106 | 107 | ## Security Considerations 108 | Even if the message is encrypted, it will stay on the blockchain. 109 | If the secret key used to decrypt is compromised at one point, every related message IS at risk. 110 | 111 | ## Copyright 112 | Copyright and related rights waived via <a href="https://creativecommons.org/publicdomain/zero/1.0/">CCO</a>. 113 | ``` -------------------------------------------------------------------------------- /packages/server/src/resources/knowledge/taxonomy/algokit:utils:typescript:code:modules:types_client_manager.md: -------------------------------------------------------------------------------- ```markdown 1 | [@algorandfoundation/algokit-utils](../README.md) / types/client-manager 2 | 3 | # Module: types/client-manager 4 | 5 | ## Table of contents 6 | 7 | ### Classes 8 | 9 | - [ClientManager](../classes/types_client_manager.ClientManager.md) 10 | 11 | ### Interfaces 12 | 13 | - [AlgoSdkClients](../interfaces/types_client_manager.AlgoSdkClients.md) 14 | - [TypedAppClient](../interfaces/types_client_manager.TypedAppClient.md) 15 | - [TypedAppFactory](../interfaces/types_client_manager.TypedAppFactory.md) 16 | 17 | ### Type Aliases 18 | 19 | - [ClientAppClientByNetworkParams](types_client_manager.md#clientappclientbynetworkparams) 20 | - [ClientAppClientParams](types_client_manager.md#clientappclientparams) 21 | - [ClientAppFactoryParams](types_client_manager.md#clientappfactoryparams) 22 | - [ClientResolveAppClientByCreatorAndNameParams](types_client_manager.md#clientresolveappclientbycreatorandnameparams) 23 | - [ClientTypedAppClientByCreatorAndNameParams](types_client_manager.md#clienttypedappclientbycreatorandnameparams) 24 | - [ClientTypedAppClientByNetworkParams](types_client_manager.md#clienttypedappclientbynetworkparams) 25 | - [ClientTypedAppClientParams](types_client_manager.md#clienttypedappclientparams) 26 | - [ClientTypedAppFactoryParams](types_client_manager.md#clienttypedappfactoryparams) 27 | 28 | ## Type Aliases 29 | 30 | ### ClientAppClientByNetworkParams 31 | 32 | Ƭ **ClientAppClientByNetworkParams**: [`Expand`](types_expand.md#expand)\<`Omit`\<[`AppClientParams`](../interfaces/types_app_client.AppClientParams.md), ``"algorand"`` \| ``"appId"``\>\> 33 | 34 | Params to get an app client by network from `ClientManager`. 35 | 36 | #### Defined in 37 | 38 | [src/types/client-manager.ts:33](https://github.com/algorandfoundation/algokit-utils-ts/blob/main/src/types/client-manager.ts#L33) 39 | 40 | ___ 41 | 42 | ### ClientAppClientParams 43 | 44 | Ƭ **ClientAppClientParams**: [`Expand`](types_expand.md#expand)\<`Omit`\<[`AppClientParams`](../interfaces/types_app_client.AppClientParams.md), ``"algorand"``\>\> 45 | 46 | Params to get an app client by ID from `ClientManager`. 47 | 48 | #### Defined in 49 | 50 | [src/types/client-manager.ts:30](https://github.com/algorandfoundation/algokit-utils-ts/blob/main/src/types/client-manager.ts#L30) 51 | 52 | ___ 53 | 54 | ### ClientAppFactoryParams 55 | 56 | Ƭ **ClientAppFactoryParams**: [`Expand`](types_expand.md#expand)\<`Omit`\<[`AppFactoryParams`](../interfaces/types_app_factory.AppFactoryParams.md), ``"algorand"``\>\> 57 | 58 | Params to get an app factory from `ClientManager`. 59 | 60 | #### Defined in 61 | 62 | [src/types/client-manager.ts:24](https://github.com/algorandfoundation/algokit-utils-ts/blob/main/src/types/client-manager.ts#L24) 63 | 64 | ___ 65 | 66 | ### ClientResolveAppClientByCreatorAndNameParams 67 | 68 | Ƭ **ClientResolveAppClientByCreatorAndNameParams**: [`Expand`](types_expand.md#expand)\<`Omit`\<[`ResolveAppClientByCreatorAndName`](types_app_client.md#resolveappclientbycreatorandname), ``"algorand"``\>\> 69 | 70 | Params to get an app client by creator address and name from `ClientManager`. 71 | 72 | #### Defined in 73 | 74 | [src/types/client-manager.ts:27](https://github.com/algorandfoundation/algokit-utils-ts/blob/main/src/types/client-manager.ts#L27) 75 | 76 | ___ 77 | 78 | ### ClientTypedAppClientByCreatorAndNameParams 79 | 80 | Ƭ **ClientTypedAppClientByCreatorAndNameParams**: [`Expand`](types_expand.md#expand)\<`Omit`\<[`ResolveAppClientByCreatorAndName`](types_app_client.md#resolveappclientbycreatorandname), ``"algorand"`` \| ``"appSpec"``\>\> 81 | 82 | Params to get a typed app client by creator address and name from `ClientManager`. 83 | 84 | #### Defined in 85 | 86 | [src/types/client-manager.ts:36](https://github.com/algorandfoundation/algokit-utils-ts/blob/main/src/types/client-manager.ts#L36) 87 | 88 | ___ 89 | 90 | ### ClientTypedAppClientByNetworkParams 91 | 92 | Ƭ **ClientTypedAppClientByNetworkParams**: [`Expand`](types_expand.md#expand)\<`Omit`\<[`AppClientParams`](../interfaces/types_app_client.AppClientParams.md), ``"algorand"`` \| ``"appSpec"`` \| ``"appId"``\>\> 93 | 94 | Params to get a typed app client by network from `ClientManager`. 95 | 96 | #### Defined in 97 | 98 | [src/types/client-manager.ts:42](https://github.com/algorandfoundation/algokit-utils-ts/blob/main/src/types/client-manager.ts#L42) 99 | 100 | ___ 101 | 102 | ### ClientTypedAppClientParams 103 | 104 | Ƭ **ClientTypedAppClientParams**: [`Expand`](types_expand.md#expand)\<`Omit`\<[`AppClientParams`](../interfaces/types_app_client.AppClientParams.md), ``"algorand"`` \| ``"appSpec"``\>\> 105 | 106 | Params to get a typed app client by ID from `ClientManager`. 107 | 108 | #### Defined in 109 | 110 | [src/types/client-manager.ts:39](https://github.com/algorandfoundation/algokit-utils-ts/blob/main/src/types/client-manager.ts#L39) 111 | 112 | ___ 113 | 114 | ### ClientTypedAppFactoryParams 115 | 116 | Ƭ **ClientTypedAppFactoryParams**: [`Expand`](types_expand.md#expand)\<`Omit`\<[`AppFactoryParams`](../interfaces/types_app_factory.AppFactoryParams.md), ``"algorand"`` \| ``"appSpec"``\>\> 117 | 118 | Params to get a typed app factory from `ClientManager`. 119 | 120 | #### Defined in 121 | 122 | [src/types/client-manager.ts:45](https://github.com/algorandfoundation/algokit-utils-ts/blob/main/src/types/client-manager.ts#L45) 123 | ```