This is page 23 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/developer:python:code:example:accounts.md: -------------------------------------------------------------------------------- ```markdown 1 | # Algorand Account Management with Python 2 | 3 | This guide covers various aspects of account management in Algorand using Python, including creating accounts, funding them, managing keys and signatures, working with multisignature accounts, and account rekeying. 4 | 5 | ## Creating Accounts 6 | 7 | There are several ways to create or access Algorand accounts: 8 | 9 | ```python 10 | from algokit_utils import AlgorandClient 11 | 12 | # Initialize client for LocalNet 13 | algorand_client = AlgorandClient.default_localnet() 14 | 15 | # Create a random account 16 | random_account = algorand_client.account.random() 17 | 18 | # Get or create an account from KMD 19 | kmd_account = algorand_client.account.from_kmd(name="ACCOUNT_NAME") 20 | 21 | # Get or create an account from environment variables 22 | env_account = algorand_client.account.from_environment( 23 | name="MY_ACCOUNT", 24 | fund_with=AlgoAmount(algo=10) 25 | ) 26 | 27 | # Create an account from mnemonic 28 | mnemonic_account = algorand_client.account.from_mnemonic(mnemonic="MNEMONIC_PHRASE") 29 | ``` 30 | 31 | ### KMD Wallet Operations 32 | 33 | ```python 34 | # Create a new wallet 35 | algorand_client.client.kmd.create_wallet(name="ACCOUNT_NAME", pswd="password") 36 | 37 | # Rename a wallet 38 | algorand_client.client.kmd.rename_wallet( 39 | id="WALLET_ID", 40 | password="new_password", 41 | new_name="NEW_ACCOUNT_NAME" 42 | ) 43 | ``` 44 | 45 | ## Funding Accounts 46 | 47 | ### LocalNet Funding 48 | 49 | ```python 50 | # Get LocalNet dispenser account 51 | localnet_dispenser = algorand_client.account.localnet_dispenser() 52 | 53 | # Get dispenser account from environment 54 | dispenser = algorand_client.account.dispenser_from_environment() 55 | 56 | # Send payment from dispenser 57 | algorand_client.send.payment( 58 | PaymentParams( 59 | sender=localnet_dispenser.address, 60 | receiver=random_account.address, 61 | amount=AlgoAmount(algo=10) 62 | ) 63 | ) 64 | 65 | # Ensure account has minimum balance 66 | algorand_client.account.ensure_funded( 67 | account_to_fund=random_account.address, 68 | dispenser_account=localnet_dispenser.address, 69 | min_spending_balance=AlgoAmount(algo=10) 70 | ) 71 | ``` 72 | 73 | ### TestNet Funding 74 | 75 | ```python 76 | # Get TestNet dispenser 77 | testnet_dispenser = algorand_client.client.get_testnet_dispenser() 78 | 79 | # Fund using TestNet dispenser API 80 | algorand_client.account.ensure_funded_from_testnet_dispenser_api( 81 | account_to_fund=random_account.address, 82 | dispenser_client=testnet_dispenser, 83 | min_spending_balance=AlgoAmount(algo=10) 84 | ) 85 | 86 | # Direct funding using TestNet dispenser 87 | testnet_dispenser.fund(address=random_account.address, amount=10, asset_id=0) 88 | ``` 89 | 90 | ## Keys and Signing 91 | 92 | ### Managing Transaction Signers 93 | 94 | ```python 95 | # Set default signer 96 | algorand_client.account.set_default_signer(account_a.signer) 97 | 98 | # Register multiple signers 99 | algorand_client.account.set_signer_from_account(account_a) 100 | algorand_client.account.set_signer_from_account(account_b) 101 | algorand_client.account.set_signer_from_account(account_c) 102 | 103 | # Get signer for an address 104 | signer = algorand_client.account.get_signer(account_a.address) 105 | ``` 106 | 107 | ### Manual Transaction Signing 108 | 109 | ```python 110 | # Create unsigned transaction 111 | payment_txn = algorand_client.create_transaction.payment( 112 | PaymentParams( 113 | sender=account_a.address, 114 | receiver=account_b.address, 115 | amount=AlgoAmount(algo=1), 116 | note=b"Payment from A to B" 117 | ) 118 | ) 119 | 120 | # Send with custom signer 121 | algorand_client.new_group().add_transaction( 122 | transaction=payment_txn, 123 | signer=account_a_signer 124 | ).send() 125 | ``` 126 | 127 | ## Multisignature Accounts 128 | 129 | Create and use multisig accounts that require multiple signatures: 130 | 131 | ```python 132 | # Create 2-of-3 multisig account 133 | multisig_account = algorand_client.account.multisig( 134 | metadata=MultisigMetadata( 135 | version=1, 136 | threshold=2, 137 | addresses=[ 138 | account_a.address, 139 | account_b.address, 140 | account_c.address 141 | ] 142 | ), 143 | signing_accounts=[account_a, account_b, account_c] 144 | ) 145 | 146 | # Send from multisig account 147 | algorand_client.send.payment( 148 | PaymentParams( 149 | sender=multisig_account.address, 150 | receiver=account_a.address, 151 | amount=AlgoAmount(algo=1) 152 | ) 153 | ) 154 | ``` 155 | 156 | ## Account Rekeying 157 | 158 | Rekey an account to use a different address for signing: 159 | 160 | ```python 161 | # Rekey account_a to be controlled by account_b's private key 162 | algorand_client.account.rekey_account( 163 | account=account_a.address, 164 | rekey_to=account_b 165 | ) 166 | 167 | # Send transaction using new signing key 168 | payment_txn = algorand_client.create_transaction.payment( 169 | PaymentParams( 170 | sender=account_a.address, 171 | receiver=account_b.address, 172 | amount=AlgoAmount(algo=1), 173 | signer=account_b.signer 174 | ) 175 | ) 176 | 177 | algorand_client.new_group().add_transaction( 178 | transaction=payment_txn, 179 | signer=account_b.signer 180 | ).send() 181 | ``` 182 | 183 | ## Best Practices 184 | 185 | 1. **Account Creation**: 186 | - Use environment variables for sensitive information 187 | - Store mnemonics securely 188 | - Use KMD for development and testing 189 | 190 | 2. **Account Funding**: 191 | - Always ensure accounts have sufficient minimum balance 192 | - Use appropriate funding methods for different networks (LocalNet, TestNet) 193 | - Handle funding errors gracefully 194 | 195 | 3. **Transaction Signing**: 196 | - Set up default signers for convenience 197 | - Use explicit signers for critical operations 198 | - Verify transaction parameters before signing 199 | 200 | 4. **Multisig Accounts**: 201 | - Choose appropriate threshold values 202 | - Keep track of all signing accounts 203 | - Test multisig operations thoroughly 204 | 205 | 5. **Account Rekeying**: 206 | - Document rekeying operations 207 | - Maintain secure backup of original keys 208 | - Verify rekeying success before proceeding 209 | 210 | 6. **Security**: 211 | - Never expose private keys or mnemonics 212 | - Use secure methods for key storage 213 | - Implement proper access controls 214 | 215 | This guide provides a comprehensive overview of account management in Algorand using Python. The examples demonstrate the flexibility and security features available through the Algorand Python SDK and AlgoKit utilities. 216 | ``` -------------------------------------------------------------------------------- /packages/server/src/resources/knowledge/taxonomy/ARCs:specs:arc-0010.md: -------------------------------------------------------------------------------- ```markdown 1 | --- 2 | arc: 10 3 | title: Algorand Wallet Reach Minimum Requirements 4 | description: Minimum requirements for Reach to function with a given wallet. 5 | author: DanBurton (@DanBurton) 6 | discussions-to: https://github.com/algorandfoundation/ARCs/issues/52 7 | status: Deprecated 8 | type: Standards Track 9 | category: Interface 10 | created: 2021-08-09 11 | --- 12 | 13 | # Algorand Wallet Reach Minimum Requirements 14 | 15 | ## Abstract 16 | 17 | An amalgamation of APIs which comprise the minimum requirements for Reach to be able to function correctly with a given wallet. 18 | 19 | ## Specification 20 | 21 | A group of related functions: 22 | 23 | * `enable` (**REQUIRED**) 24 | * `enableNetwork` (**OPTIONAL**) 25 | * `enableAccounts` (**OPTIONAL**) 26 | * `signAndPostTxns` (**REQUIRED**) 27 | * `getAlgodv2Client` (**REQUIRED**) 28 | * `getIndexerClient` (**REQUIRED**) 29 | * `signTxns` (**OPTIONAL**) 30 | * `postTxns` (**OPTIONAL**) 31 | 32 | * `enable`: as specified in [ARC-0006](./arc-0006.md#interface-enablefunction). 33 | * `signAndPostTxns`: as specified in [ARC-0008](./arc-0008.md#interface-signandposttxnsfunction). 34 | * `getAlgodv2Client` and `getIndexerClient`: as specified in [ARC-0009](./arc-0009.md#specification). 35 | * `signTxns`: as specified in [ARC-0005](./arc-0005.md#interface-signtxnsfunction) / [ARC-0001](./arc-0001.md#interface-signtxnsfunction). 36 | * `postTxns`: as specified in [ARC-0007](./arc-0007.md#interface-posttxnsfunction). 37 | 38 | There are additional semantics for using these functions together. 39 | 40 | ### Semantic Requirements 41 | 42 | * `enable` **SHOULD** be called before calling the other functions and upon refresh of the dApp. 43 | * Calling `enableNetwork` and then `enableAccounts` **MUST** be equivalent to calling `enable`. 44 | * If used instead of `enable`: `enableNetwork` **SHOULD** be called before `enableAccounts` and `getIndexerClient`. Both `enableNetwork` and `enableAccounts` **SHOULD** be called before the other functions. 45 | * If `signAndPostTxns`, `getAlgodv2Client`, `getIndexerClient`, `signTxns`, or `postTxns` are called before `enable` (or `enableAccounts`), they **SHOULD** throw an error object with property `code=4202`. (See Error Standards in [ARC-0001](arc-0001.md#error-standards)). 46 | * `getAlgodv2Client` and `getIndexerClient` **MUST** return connections to the network indicated by the `network` result of `enable`. 47 | * `signAndPostTxns` **MUST** post transactions to the network indicated by the `network` result of `enable` 48 | * The result of `getAlgodv2Client` **SHOULD** only be used to query the network. `postTxns` (if available) and `signAndPostTxns` **SHOULD** be used to send transactions to the network. The `Algodv2Client` object **MAY** be modified to throw exceptions if the caller tries to use it to post transactions. 49 | * `signTxns` and `postTxns` **MAY** or **MAY NOT** be provided. When one is provided, they both **MUST** be provided. In addition, `signTxns` **MAY** display a warning that the transactions are returned to the dApp rather than posted directly to the blockchain. 50 | 51 | ### Additional requirements regarding LogicSigs 52 | 53 | `signAndPostTxns` must also be able to handle logic sigs, and more generally transactions signed by the DApp itself. 54 | In case of logic sigs, callers are expected to sign the logic sig by themselves, rather than expecting the wallet to do so on their behalf. 55 | To handle these cases, we adopt and extend the [ARC-0001](./arc-0001.md#interface-wallettransaction) format for `WalletTransaction`s that do not need to be signed: 56 | 57 | ```json 58 | { 59 | "txn": "...", 60 | "signers": [], 61 | "stxn": "..." 62 | } 63 | ``` 64 | 65 | * `stxn` is a `SignedTxnStr`, as specified in [ARC-0007](./arc-0007.md#string-specification-signedtxnstr). 66 | * For production wallets, `stxn` **MUST** be checked to match `txn`, as specified in [ARC-0001](./arc-0001.md#semantic-and-security-requirements). 67 | 68 | `signAndPostTxns` **MAY** reject when none of the transactions need to be signed by the user. 69 | 70 | ## Rationale 71 | 72 | In order for a wallet to be useable by a DApp, it must support features for account discovery, signing and posting transactions, and querying the network. 73 | 74 | To whatever extent possible, the end users of a DApp should be empowered to select their own wallet, accounts, and network to be used with the DApp. 75 | Furthermore, said users should be able to use their preferred network node connection, without exposing their connection details and secrets (such as endpoint URLs and API tokens) to the DApp. 76 | 77 | The APIs presented in this document and related documents are sufficient to cover the needed functionality, while protecting user choice and remaining compatible with best security practices. 78 | Most DApps indeed always need to post transactions immediately after signing. 79 | `signAndPostTxns` allows this goal without revealing the signed transactions to the DApp, which prevents surprises to the user: there is no risk the DApp keeps in memory the transactions and post it later without the user knowing it (either to achieve a malicious goal such as forcing double spending, or just because the DApp has a bug). 80 | However, there are cases where `signTxns` and `postTxns` need to be used: for example when multiple users need to coordinate to sign an atomic transfer. 81 | 82 | ## Reference Implementation 83 | 84 | ```js 85 | async function main(wallet) { 86 | 87 | // Account discovery 88 | const enabled = await wallet.enable({genesisID: 'testnet-v1.0'}); 89 | const from = enabled.accounts[0]; 90 | 91 | // Querying 92 | const algodv2 = new algosdk.Algodv2(await wallet.getAlgodv2Client()); 93 | const suggestedParams = await algodv2.getTransactionParams().do(); 94 | const txns = makeTxns(from, suggestedParams); 95 | 96 | // Sign and post 97 | const res = await wallet.signAndPost(txns); 98 | console.log(res); 99 | 100 | }; 101 | ``` 102 | 103 | Where `makeTxns` is comparable to what is seen in [ARC-0001](./arc-0001.md#reference-implementation)'s sample code. 104 | 105 | ## Security Considerations 106 | 107 | None. 108 | 109 | ## Copyright 110 | 111 | Copyright and related rights waived via <a href="https://creativecommons.org/publicdomain/zero/1.0/">CCO</a>. 112 | ``` -------------------------------------------------------------------------------- /packages/server/src/resources/knowledge/taxonomy/developer:python:code:example:box_storage.md: -------------------------------------------------------------------------------- ```markdown 1 | # Box Storage in Algorand Smart Contracts 2 | 3 | Box storage is a feature in Algorand that allows smart contracts to store and manage data in separate "boxes" outside of the application's global and local state. This guide demonstrates how to use box storage in Algorand Python smart contracts. 4 | 5 | ## Box Storage Types 6 | 7 | ```python 8 | from algopy import ( 9 | ARC4Contract, 10 | Box, 11 | BoxMap, 12 | BoxRef, 13 | Bytes, 14 | String, 15 | UInt64, 16 | arc4, 17 | ) 18 | 19 | # Example of a struct that can be stored in a box 20 | class UserStruct(arc4.Struct): 21 | name: arc4.String 22 | id: arc4.UInt64 23 | asset: arc4.UInt64 24 | ``` 25 | 26 | ### Initializing Box Storage 27 | 28 | ```python 29 | class BoxStorage(ARC4Contract): 30 | def __init__(self) -> None: 31 | # Basic box types 32 | self.box_int = Box(UInt64) 33 | self.box_dynamic_bytes = Box[arc4.DynamicBytes](arc4.DynamicBytes, key="b") 34 | self.box_string = Box(arc4.String, key=b"BOX_C") 35 | self.box_bytes = Box(Bytes) 36 | 37 | # Box map with uint as key and string as value 38 | self.box_map = BoxMap(UInt64, String, key_prefix="") 39 | 40 | # Box reference for direct manipulation 41 | self.box_ref = BoxRef() 42 | 43 | # Box map for storing structs 44 | self.box_map_struct = BoxMap(arc4.UInt64, UserStruct, key_prefix="users") 45 | ``` 46 | 47 | ## Basic Box Operations 48 | 49 | ### Getting Values 50 | 51 | ```python 52 | @arc4.abimethod 53 | def get_box_example(self) -> tuple[UInt64, Bytes, arc4.String]: 54 | return ( 55 | self.box_int.value, # Get integer value 56 | self.box_dynamic_bytes.value.native, # Get bytes value 57 | self.box_string.value, # Get string value 58 | ) 59 | 60 | @arc4.abimethod 61 | def get_box_map_example(self) -> bool: 62 | key_1 = UInt64(1) 63 | # Get value with default if not found 64 | value = self.box_map.get(key_1, default=String("default")) 65 | return True 66 | ``` 67 | 68 | ### Setting Values 69 | 70 | ```python 71 | @arc4.abimethod 72 | def set_box_example( 73 | self, 74 | value_int: UInt64, 75 | value_dbytes: arc4.DynamicBytes, 76 | value_string: arc4.String, 77 | ) -> None: 78 | # Set values in different box types 79 | self.box_int.value = value_int 80 | self.box_dynamic_bytes.value = value_dbytes.copy() 81 | self.box_string.value = value_string 82 | self.box_bytes.value = value_dbytes.native 83 | 84 | # Increment value 85 | self.box_int.value += 3 86 | 87 | @arc4.abimethod 88 | def set_box_map_struct(self, key: arc4.UInt64, value: UserStruct) -> bool: 89 | # Store struct in box map 90 | self.box_map_struct[key] = value.copy() 91 | return True 92 | ``` 93 | 94 | ### Deleting Values 95 | 96 | ```python 97 | @arc4.abimethod 98 | def delete_box(self) -> None: 99 | # Delete values from boxes 100 | del self.box_int.value 101 | del self.box_dynamic_bytes.value 102 | del self.box_string.value 103 | 104 | # Verify deletion by checking default values 105 | assert self.box_int.get(default=UInt64(42)) == 42 106 | assert self.box_dynamic_bytes.get(default=arc4.DynamicBytes(b"42")).native == b"42" 107 | assert self.box_string.get(default=arc4.String("42")) == "42" 108 | 109 | @arc4.abimethod 110 | def delete_box_map(self, key: UInt64) -> None: 111 | # Delete value from box map 112 | del self.box_map[key] 113 | ``` 114 | 115 | ## Advanced Box Operations 116 | 117 | ### Maybe Operations (Safe Access) 118 | 119 | ```python 120 | @arc4.abimethod 121 | def maybe_box(self) -> tuple[UInt64, bool]: 122 | # Get value and existence flag 123 | box_int_value, box_int_exists = self.box_int.maybe() 124 | return box_int_value, box_int_exists 125 | 126 | @arc4.abimethod 127 | def maybe_box_map(self) -> tuple[String, bool]: 128 | key_1 = UInt64(1) 129 | # Get value and existence flag from map 130 | value, exists = self.box_map.maybe(key_1) 131 | if not exists: 132 | value = String("") 133 | return value, exists 134 | ``` 135 | 136 | ### Box References 137 | 138 | ```python 139 | @arc4.abimethod 140 | def manipulate_box_ref(self) -> None: 141 | box_ref = BoxRef(key=String("blob")) 142 | assert box_ref.create(size=32) 143 | 144 | # Manipulate data 145 | sender_bytes = Txn.sender.bytes 146 | app_address = Global.current_application_address.bytes 147 | value_3 = Bytes(b"hello") 148 | 149 | # Replace and splice operations 150 | box_ref.replace(0, sender_bytes) 151 | box_ref.splice(0, 0, app_address) 152 | box_ref.replace(64, value_3) 153 | 154 | # Extract data 155 | prefix = box_ref.extract(0, 32 * 2 + value_3.length) 156 | 157 | # Delete and recreate 158 | box_ref.delete() 159 | box_ref.put(sender_bytes + app_address) 160 | ``` 161 | 162 | ### Length Operations 163 | 164 | ```python 165 | @arc4.abimethod 166 | def box_map_length(self) -> UInt64: 167 | key_0 = UInt64(0) 168 | if key_0 not in self.box_map: 169 | return UInt64(0) 170 | return self.box_map.length(key_0) 171 | 172 | @arc4.abimethod 173 | def length_box_ref(self) -> UInt64: 174 | box_ref = BoxRef(key=String("blob")) 175 | assert box_ref.create(size=32) 176 | return box_ref.length 177 | ``` 178 | 179 | ## Best Practices 180 | 181 | 1. **Memory Management**: 182 | - Use appropriate box sizes to minimize storage costs 183 | - Delete unused boxes to free up space 184 | - Consider using box references for large data manipulations 185 | 186 | 2. **Data Safety**: 187 | - Use `maybe()` operations when accessing potentially non-existent values 188 | - Provide default values when getting box contents 189 | - Verify box existence before operations 190 | 191 | 3. **Struct Storage**: 192 | - Use `copy()` when storing struct values to ensure data integrity 193 | - Verify struct storage with assertions 194 | - Use appropriate key prefixes for organization 195 | 196 | 4. **Box References**: 197 | - Create boxes with appropriate sizes 198 | - Use extract and splice operations carefully 199 | - Clean up unused box references 200 | 201 | 5. **Performance**: 202 | - Minimize box operations to reduce costs 203 | - Use appropriate data types for storage 204 | - Consider using box maps for related data 205 | 206 | 6. **Error Handling**: 207 | - Include assertions for critical operations 208 | - Handle non-existent boxes gracefully 209 | - Verify operation success 210 | 211 | This guide demonstrates the various capabilities of box storage in Algorand smart contracts using Python. Box storage provides a flexible way to manage contract data while maintaining efficiency and organization. 212 | ``` -------------------------------------------------------------------------------- /packages/server/src/resources/knowledge/taxonomy/developer:docs:details:dapps:smart-contracts:index.md: -------------------------------------------------------------------------------- ```markdown 1 | title: Introduction 2 | 3 | Algorand Smart Contracts (ASC1) are small programs that serve various functions on the blockchain and operate on layer-1. Smart contracts are separated into two main categories, smart contracts, and smart signatures. These types are also referred to as stateful and stateless contracts respectively. The type of contract that is written will determine when and how the logic of the program is evaluated. See the following sections to understand how each type of contract is used on the Algorand blockchain. Both types of contracts are written in the [Transaction Execution Approval Language (TEAL)](../avm/teal), which is an assembly-like language that is interpreted by the [Algorand Virtual Machine (AVM)](../avm) running within an Algorand node. TEAL programs can be written by hand or by using the Python language with the PyTEAL compiler. 4 | 5 | 6 | !!! warning 7 | When writing smart contracts, make sure to follow [TEAL guidelines](../avm/teal/guidelines). This is very important in order to prevent smart contracts from being compromised. 8 | 9 | # Quick start videos 10 | 11 | If you prefer videos, take a look at this 6 minute guide to learn about Smart Contracts Overview. 12 | 13 | <iframe width="100%" style="aspect-ratio:16/9" src="https://www.youtube-nocookie.com/embed/_8vLEeJDjlc" title="YouTube video player" frameborder="0" allow="accelerometer; autoplay; clipboard-write; encrypted-media; gyroscope; picture-in-picture; web-share" allowfullscreen></iframe> 14 | 15 | # Smart contracts 16 | Smart contracts are contracts that, once deployed, are remotely callable from any node in the Algorand blockchain. Once deployed, the on-chain instantiation of the contract is referred to as an Application and assigned an Application Id. These applications are triggered by a specific type of transaction called an Application Call transaction. These on-chain applications handle the primary decentralized logic of a dApp. 17 | 18 | - Applications can [modify state](./apps/#modifying-state-in-smart-contract) associated with the application (global state) or a per application+account (local state) basis. 19 | - Applications can [access](./apps/#using-assets-in-smart-contracts) on-chain values, such as account balances, asset configuration parameters, or the latest block time. 20 | - Applications can [execute transactions](./apps/#inner-transactions) as part of the execution of the logic. One type of transaction they can perform, as of AVM 1.1, is an Application Call transaction which allows one application to call another. This ability to call other applications enables composability between applications. 21 | - Applications have an associated [Application Account](./apps/#using-a-smart-contract-as-an-escrow) that can hold Algos or ASAs balances and can be used as on-chain escrow accounts. 22 | 23 | To provide a standard method for exposing an API and encoding/decoding data types from application call transactions, the [ABI](/docs/get-details/dapps/smart-contracts/ABI/) should be used. 24 | 25 | For more information on smart contracts, see the [smart contract documentation](./apps). For more information on building smart contracts in PyTeal see the [build with python documentation](/docs/get-details/dapps/writing-contracts/pyteal). 26 | For more information on using smart contracts with the SDKs see the [Interacting with smart contracts documentation](./frontend/smartsigs.md). 27 | For more information on debugging a smart contract, see the [debugging](./debugging.md) page. 28 | 29 | # Smart signatures 30 | Smart signatures contain logic that is used to sign transactions, primarily for signature delegation. The logic of the smart signature is submitted with a transaction. While the logic in the smart signature is stored on the chain as part of resolving the transaction, the logic is not remotely callable. Any new transaction that relies on the same smart signature would resubmit the logic. When the logic is submitted to a node the AVM evaluates the logic, where it either fails or succeeds. If a smart signature’s logic fails when executed by the AVM, the associated transaction will not be executed. 31 | 32 | Smart signatures can be used in two different modes. When compiled smart signatures produce an Algorand account that functions similar to any other account on the blockchain. These accounts can hold Algos or assets. These funds are only allowed to leave the account if a transaction occurs from the account that successfully executes the logic within the smart signature. This is similar in functionality to a smart contract escrow, but the logic must be submitted for every transaction from the account. Smart signatures can also also be used to delegate some portion of authority to another account. In this case, an account can sign the smart signature which can then be used at a later time to sign a transaction from the original signer’s account. This is referred to as account delegation. See the [modes of use documentation](./smartsigs/modes.md) for more details on these two types of smart signatures. 33 | 34 | Once a transaction that is signed with a smart signature, is submitted it is evaluated by an Algorand node using the Algorand Virtual Machine. These contracts only have access to a few global variables, some temporary scratch space, and the properties of the transaction(s) they are submitted with. 35 | 36 | For more information on smart signatures, see the [smart signature documentation](./smartsigs). For more information on building contracts in PyTeal see the [build with Python documentation](/docs/get-details/dapps/writing-contracts/pyteal). 37 | For more information on using smart signatures with the SDKs see the [Interacting with smart signature documentation](./frontend/smartsigs). 38 | For more information on debugging a smart contract, see the [debugging](./debugging.md) page. 39 | 40 | 41 | For more information on the [AVM](../avm) or the [TEAL language](../avm/teal) see the developer documentation. 42 | ``` -------------------------------------------------------------------------------- /packages/server/src/resources/knowledge/taxonomy/algokit:utils:typescript:code:modules:types_app_factory.md: -------------------------------------------------------------------------------- ```markdown 1 | [@algorandfoundation/algokit-utils](../README.md) / types/app-factory 2 | 3 | # Module: types/app-factory 4 | 5 | ## Table of contents 6 | 7 | ### Classes 8 | 9 | - [AppFactory](../classes/types_app_factory.AppFactory.md) 10 | 11 | ### Interfaces 12 | 13 | - [AppFactoryParams](../interfaces/types_app_factory.AppFactoryParams.md) 14 | 15 | ### Type Aliases 16 | 17 | - [AppFactoryAppClientParams](types_app_factory.md#appfactoryappclientparams) 18 | - [AppFactoryCreateMethodCallParams](types_app_factory.md#appfactorycreatemethodcallparams) 19 | - [AppFactoryCreateParams](types_app_factory.md#appfactorycreateparams) 20 | - [AppFactoryDeployParams](types_app_factory.md#appfactorydeployparams) 21 | - [AppFactoryResolveAppClientByCreatorAndNameParams](types_app_factory.md#appfactoryresolveappclientbycreatorandnameparams) 22 | - [CreateOnComplete](types_app_factory.md#createoncomplete) 23 | - [CreateSchema](types_app_factory.md#createschema) 24 | 25 | ## Type Aliases 26 | 27 | ### AppFactoryAppClientParams 28 | 29 | Ƭ **AppFactoryAppClientParams**: [`Expand`](types_expand.md#expand)\<`Omit`\<[`AppClientParams`](../interfaces/types_app_client.AppClientParams.md), ``"algorand"`` \| ``"appSpec"``\>\> 30 | 31 | Params to get an app client by ID from an app factory. 32 | 33 | #### Defined in 34 | 35 | [src/types/app-factory.ts:134](https://github.com/algorandfoundation/algokit-utils-ts/blob/main/src/types/app-factory.ts#L134) 36 | 37 | ___ 38 | 39 | ### AppFactoryCreateMethodCallParams 40 | 41 | Ƭ **AppFactoryCreateMethodCallParams**: [`Expand`](types_expand.md#expand)\<[`AppClientMethodCallParams`](types_app_client.md#appclientmethodcallparams) & [`AppClientCompilationParams`](../interfaces/types_app_client.AppClientCompilationParams.md) & [`CreateOnComplete`](types_app_factory.md#createoncomplete) & [`CreateSchema`](types_app_factory.md#createschema)\> 42 | 43 | Params to specify a create method call for an app 44 | 45 | #### Defined in 46 | 47 | [src/types/app-factory.ts:129](https://github.com/algorandfoundation/algokit-utils-ts/blob/main/src/types/app-factory.ts#L129) 48 | 49 | ___ 50 | 51 | ### AppFactoryCreateParams 52 | 53 | Ƭ **AppFactoryCreateParams**: [`Expand`](types_expand.md#expand)\<[`AppClientBareCallParams`](types_app_client.md#appclientbarecallparams) & [`AppClientCompilationParams`](../interfaces/types_app_client.AppClientCompilationParams.md) & [`CreateOnComplete`](types_app_factory.md#createoncomplete) & [`CreateSchema`](types_app_factory.md#createschema)\> 54 | 55 | Params to specify a bare (raw) create call for an app 56 | 57 | #### Defined in 58 | 59 | [src/types/app-factory.ts:126](https://github.com/algorandfoundation/algokit-utils-ts/blob/main/src/types/app-factory.ts#L126) 60 | 61 | ___ 62 | 63 | ### AppFactoryDeployParams 64 | 65 | Ƭ **AppFactoryDeployParams**: [`Expand`](types_expand.md#expand)\<`Omit`\<[`AppDeployParams`](types_app_deployer.md#appdeployparams), ``"createParams"`` \| ``"updateParams"`` \| ``"deleteParams"`` \| ``"metadata"``\> & \{ `appName?`: `string` ; `createParams?`: [`Expand`](types_expand.md#expand)\<[`AppClientMethodCallParams`](types_app_client.md#appclientmethodcallparams) & [`CreateOnComplete`](types_app_factory.md#createoncomplete) & [`CreateSchema`](types_app_factory.md#createschema)\> \| [`Expand`](types_expand.md#expand)\<[`AppClientBareCallParams`](types_app_client.md#appclientbarecallparams) & [`CreateOnComplete`](types_app_factory.md#createoncomplete) & [`CreateSchema`](types_app_factory.md#createschema)\> ; `deletable?`: `boolean` ; `deleteParams?`: [`AppClientMethodCallParams`](types_app_client.md#appclientmethodcallparams) \| [`AppClientBareCallParams`](types_app_client.md#appclientbarecallparams) ; `updatable?`: `boolean` ; `updateParams?`: [`AppClientMethodCallParams`](types_app_client.md#appclientmethodcallparams) \| [`AppClientBareCallParams`](types_app_client.md#appclientbarecallparams) }\> 66 | 67 | Parameters to define a deployment for an `AppFactory` 68 | 69 | #### Defined in 70 | 71 | [src/types/app-factory.ts:140](https://github.com/algorandfoundation/algokit-utils-ts/blob/main/src/types/app-factory.ts#L140) 72 | 73 | ___ 74 | 75 | ### AppFactoryResolveAppClientByCreatorAndNameParams 76 | 77 | Ƭ **AppFactoryResolveAppClientByCreatorAndNameParams**: [`Expand`](types_expand.md#expand)\<`Omit`\<[`ResolveAppClientByCreatorAndName`](types_app_client.md#resolveappclientbycreatorandname), ``"algorand"`` \| ``"appSpec"``\>\> 78 | 79 | Params to get an app client by creator address and name from an app factory. 80 | 81 | #### Defined in 82 | 83 | [src/types/app-factory.ts:137](https://github.com/algorandfoundation/algokit-utils-ts/blob/main/src/types/app-factory.ts#L137) 84 | 85 | ___ 86 | 87 | ### CreateOnComplete 88 | 89 | Ƭ **CreateOnComplete**: `Object` 90 | 91 | onComplete parameter for a create app call 92 | 93 | #### Type declaration 94 | 95 | | Name | Type | 96 | | :------ | :------ | 97 | | `onComplete?` | `Exclude`\<`OnApplicationComplete`, `OnApplicationComplete.ClearStateOC`\> | 98 | 99 | #### Defined in 100 | 101 | [src/types/app-factory.ts:102](https://github.com/algorandfoundation/algokit-utils-ts/blob/main/src/types/app-factory.ts#L102) 102 | 103 | ___ 104 | 105 | ### CreateSchema 106 | 107 | Ƭ **CreateSchema**: `Object` 108 | 109 | Specifies a schema used for creating an app 110 | 111 | #### Type declaration 112 | 113 | | Name | Type | Description | 114 | | :------ | :------ | :------ | 115 | | `extraProgramPages?` | `number` | Number of extra pages required for the programs. Defaults to the number needed for the programs in this call if not specified. This is immutable once the app is created. | 116 | | `schema?` | \{ `globalByteSlices`: `number` ; `globalInts`: `number` ; `localByteSlices`: `number` ; `localInts`: `number` } | The state schema for the app. This is immutable once the app is created. By default uses the ARC32/ARC-56 spec. | 117 | | `schema.globalByteSlices` | `number` | The number of byte slices saved in global state. | 118 | | `schema.globalInts` | `number` | The number of integers saved in global state. | 119 | | `schema.localByteSlices` | `number` | The number of byte slices saved in local state. | 120 | | `schema.localInts` | `number` | The number of integers saved in local state. | 121 | 122 | #### Defined in 123 | 124 | [src/types/app-factory.ts:107](https://github.com/algorandfoundation/algokit-utils-ts/blob/main/src/types/app-factory.ts#L107) 125 | ``` -------------------------------------------------------------------------------- /packages/server/src/resources/knowledge/taxonomy/developer:docs:index.md: -------------------------------------------------------------------------------- ```markdown 1 | title: Algorand Developer Docs 2 | 3 | <div class="docs-homepage__challenge-box"> 4 | <div class="challenge-overview-icon"></div> 5 | <div> 6 | <p class="button--large docs-homepage__challenge-box__title">Complete Challenges and Earn Badges</p> 7 | <p class="typography--regular-body docs-homepage__challenge-box__description">Become a master Algorand Developer by completing coding challenges and getting rewarded with on-chain Badges along the way!</p> 8 | </div> 9 | <a href="/challenges/" class="button--small button--primary docs-homepage__challenge-box__link">View Challenges</a> 10 | </div> 11 | 12 | # Top-level sections 13 | <ul class="docs-homepage__card-list"> 14 | <li class="docs-homepage__card-list-item"> 15 | <a class="docs-homepage__card" href="./get-started/basics/what_is_blockchain/"> 16 | <div class="docs-homepage__card__icon-container docs-homepage__card__icon-container--purple"> 17 | <span class="create-smart-contract-overview-icon"></span> 18 | </div> 19 | <p class="docs-homepage__card__title text-gray--main typography--large-button">Get started</p> 20 | <p class="typography--regular-body docs-homepage__card__description">Start here to learn the basics</p> 21 | </a> 22 | </li> 23 | <li class="docs-homepage__card-list-item"> 24 | <a class="docs-homepage__card" href="./get-details/"> 25 | <div class="docs-homepage__card__icon-container docs-homepage__card__icon-container--purple"> 26 | <span class="stateless-smart-contracts-icon"></span> 27 | </div> 28 | <p class="docs-homepage__card__title text-gray--main typography--large-button">Get details</p> 29 | <p class="typography--regular-body docs-homepage__card__description">In-depth guides and explanations of all features</p> 30 | </a> 31 | </li> 32 | <li class="docs-homepage__card-list-item"> 33 | <a class="docs-homepage__card" href="./run-a-node/setup/types/"> 34 | <div class="docs-homepage__card__icon-container docs-homepage__card__icon-container--purple"> 35 | <span class="stateful-smart-contracts-icon"></span> 36 | </div> 37 | <p class="docs-homepage__card__title text-gray--main typography--large-button">Run a node</p> 38 | <p class="typography--regular-body docs-homepage__card__description">Setup a node and participate in consensus</p> 39 | </a> 40 | </li> 41 | </ul> 42 | 43 | # Spotlight 44 | 45 | <ul class="docs-homepage__card-list"> 46 | <li class="docs-homepage__card-list-item"> 47 | <a class="docs-homepage__card" href="./get-details/dapps/avm/"> 48 | <div class="docs-homepage__card__icon-container docs-homepage__card__icon-container--turquoise"> 49 | <span class="payment-with-algos-icon"></span> 50 | </div> 51 | <p class="docs-homepage__card__title text-gray--main typography--large-button">The AVM</p> 52 | <p class="typography--regular-body docs-homepage__card__description">The Algorand Virtual Machine</p> 53 | </a> 54 | </li> 55 | <li class="docs-homepage__card-list-item"> 56 | <a class="docs-homepage__card" href="./get-started/algokit/"> 57 | <div class="docs-homepage__card__icon-container docs-homepage__card__icon-container--turquoise"> 58 | <span class="payment-with-algos-icon"></span> 59 | </div> 60 | <p class="docs-homepage__card__title text-gray--main typography--large-button">AlgoKit</p> 61 | <p class="typography--regular-body docs-homepage__card__description">Spin up a dev environment and start writing contracts quickly </p> 62 | </a> 63 | </li> 64 | <li class="docs-homepage__card-list-item"> 65 | <a class="docs-homepage__card" href="./get-details/dapps/writing-contracts/beaker/"> 66 | <div class="docs-homepage__card__icon-container docs-homepage__card__icon-container--turquoise"> 67 | <span class="payment-with-algos-icon"></span> 68 | </div> 69 | <p class="docs-homepage__card__title text-gray--main typography--large-button">Beaker</p> 70 | <p class="typography--regular-body docs-homepage__card__description">Write smart contracts with the Beaker framework</p> 71 | </a> 72 | </li> 73 | <li class="docs-homepage__card-list-item"> 74 | <a class="docs-homepage__card" href="./get-details/accounts/rekey/"> 75 | <div class="docs-homepage__card__icon-container docs-homepage__card__icon-container--turquoise"> 76 | <span class="payment-with-algos-icon"></span> 77 | </div> 78 | <p class="docs-homepage__card__title text-gray--main typography--large-button">Rekeying</p> 79 | <p class="typography--regular-body docs-homepage__card__description">Change the spending key for any account</p> 80 | </a> 81 | </li> 82 | <li class="docs-homepage__card-list-item"> 83 | <a class="docs-homepage__card" href="./get-details/asa"> 84 | <div class="docs-homepage__card__icon-container docs-homepage__card__icon-container--turquoise"> 85 | <span class="payment-with-algos-icon"></span> 86 | </div> 87 | <p class="docs-homepage__card__title text-gray--main typography--large-button">ASAs</p> 88 | <p class="typography--regular-body docs-homepage__card__description">Tokenize FTs, NFTs, and more with a built-in standard</p> 89 | </a> 90 | </li> 91 | <li class="docs-homepage__card-list-item"> 92 | <a class="docs-homepage__card" href="./get-details/atomic_transfers/"> 93 | <div class="docs-homepage__card__icon-container docs-homepage__card__icon-container--turquoise"> 94 | <span class="payment-with-algos-icon"></span> 95 | </div> 96 | <p class="docs-homepage__card__title text-gray--main typography--large-button">Atomic Transfers</p> 97 | <p class="typography--regular-body docs-homepage__card__description">Group up to 16 transactions that will either all succeed or all fail</p> 98 | </a> 99 | </li> 100 | </ul> 101 | ``` -------------------------------------------------------------------------------- /packages/client/src/LocalWallet.ts: -------------------------------------------------------------------------------- ```typescript 1 | import algosdk, { Transaction } from 'algosdk'; 2 | 3 | export class LocalWallet { 4 | private fsPromises: typeof import('fs/promises') | null = null; 5 | private path: typeof import('path') | null = null; 6 | private connectedAddress: string | null = null; 7 | private isBrowser: boolean; 8 | 9 | constructor() { 10 | this.isBrowser = typeof window !== 'undefined'; 11 | } 12 | 13 | private async initNodeModules(): Promise<void> { 14 | if (!this.isBrowser && !this.fsPromises) { 15 | this.fsPromises = await import('fs/promises'); 16 | this.path = await import('path'); 17 | } 18 | } 19 | 20 | private async listStoredAccounts(): Promise<string[]> { 21 | if (this.isBrowser) { 22 | try { 23 | const creds = await navigator.credentials.get({ 24 | password: true, 25 | mediation: 'optional' 26 | } as CredentialRequestOptions) as { id: string; password: string }[] | null; 27 | 28 | return creds ? creds.map(cred => cred.id) : []; 29 | } catch { 30 | return []; 31 | } 32 | } else { 33 | try { 34 | await this.initNodeModules(); 35 | const mnemonicPath = this.path!.join(process.cwd(), '.mnemonic'); 36 | const files = await this.fsPromises!.readdir(mnemonicPath); 37 | return files.map((file: string) => file.replace('.mnemonic', '')); 38 | } catch { 39 | return []; 40 | } 41 | } 42 | } 43 | 44 | private async storeMnemonic(address: string, mnemonic: string): Promise<void> { 45 | if (this.isBrowser) { 46 | // Store mnemonic using PasswordCredential 47 | const credInit = { 48 | id: address, 49 | name: `Algorand Account ${address}`, 50 | origin: window.location.origin, 51 | password: mnemonic 52 | }; 53 | await navigator.credentials.create({ 54 | password: credInit 55 | } as CredentialCreationOptions); 56 | } else { 57 | // Use filesystem in non-browser environment 58 | await this.initNodeModules(); 59 | const mnemonicPath = this.path!.join(process.cwd(), '.mnemonic'); 60 | await this.fsPromises!.mkdir(mnemonicPath, { recursive: true }); 61 | await this.fsPromises!.writeFile( 62 | this.path!.join(mnemonicPath, `${address}.mnemonic`), 63 | mnemonic, 64 | { mode: 0o600 } 65 | ); 66 | } 67 | } 68 | 69 | private async retrieveMnemonic(address: string): Promise<string | null> { 70 | if (this.isBrowser) { 71 | try { 72 | // Retrieve mnemonic using PasswordCredential 73 | const cred = await navigator.credentials.get({ 74 | password: true 75 | } as CredentialRequestOptions) as { id: string; password: string } | null; 76 | 77 | if (cred && cred.id === address) { 78 | return cred.password; 79 | } 80 | return null; 81 | } catch { 82 | return null; 83 | } 84 | } else { 85 | try { 86 | await this.initNodeModules(); 87 | const mnemonicPath = this.path!.join(process.cwd(), '.mnemonic', `${address}.mnemonic`); 88 | const mnemonic = await this.fsPromises!.readFile(mnemonicPath, 'utf8'); 89 | return mnemonic; 90 | } catch { 91 | return null; 92 | } 93 | } 94 | } 95 | 96 | async connect(): Promise<string[]> { 97 | try { 98 | // Check for existing accounts first 99 | const existingAccounts = await this.listStoredAccounts(); 100 | if (existingAccounts.length > 0) { 101 | this.connectedAddress = existingAccounts[0]; 102 | return [this.connectedAddress]; 103 | } 104 | 105 | // Create new account if none exists 106 | const account = algosdk.generateAccount(); 107 | const mnemonic = algosdk.secretKeyToMnemonic(account.sk); 108 | 109 | await this.storeMnemonic(account.addr, mnemonic); 110 | this.connectedAddress = account.addr; 111 | return [account.addr]; 112 | } catch (error) { 113 | throw new Error(`Failed to connect to LocalWallet: ${error instanceof Error ? error.message : String(error)}`); 114 | } 115 | } 116 | 117 | async reconnectSession(): Promise<string[]> { 118 | try { 119 | const accounts = await this.listStoredAccounts(); 120 | if (accounts.length === 0) { 121 | throw new Error('No local accounts found. Call connect() first.'); 122 | } 123 | this.connectedAddress = accounts[0]; 124 | return [this.connectedAddress]; 125 | } catch (error) { 126 | throw new Error(`Failed to reconnect session: ${error instanceof Error ? error.message : String(error)}`); 127 | } 128 | } 129 | 130 | async disconnect(): Promise<void> { 131 | this.connectedAddress = null; 132 | } 133 | 134 | async makeTransactionSigner(): Promise<(txnGroup: Transaction[], indexesToSign: number[]) => Promise<Uint8Array[]>> { 135 | if (!this.connectedAddress) { 136 | throw new Error('No local account exists. Call connect() first.'); 137 | } 138 | 139 | try { 140 | const mnemonic = await this.retrieveMnemonic(this.connectedAddress); 141 | if (!mnemonic) { 142 | throw new Error('Failed to retrieve account mnemonic'); 143 | } 144 | 145 | const account = algosdk.mnemonicToSecretKey(mnemonic); 146 | return algosdk.makeBasicAccountTransactionSigner(account); 147 | } catch (error) { 148 | throw new Error(`Failed to create transaction signer: ${error instanceof Error ? error.message : String(error)}`); 149 | } 150 | } 151 | 152 | async signTransactions( 153 | transactions: { txn: Transaction; message?: string }[][] 154 | ): Promise<Uint8Array[][]> { 155 | if (!this.connectedAddress) { 156 | throw new Error('No local account exists. Call connect() first.'); 157 | } 158 | 159 | try { 160 | const mnemonic = await this.retrieveMnemonic(this.connectedAddress); 161 | if (!mnemonic) { 162 | throw new Error('Failed to retrieve account mnemonic'); 163 | } 164 | 165 | const account = algosdk.mnemonicToSecretKey(mnemonic); 166 | 167 | return Promise.all(transactions.map(async (group) => { 168 | return group.map(({ txn }) => { 169 | const signedTxn = algosdk.signTransaction(txn, account.sk); 170 | return signedTxn.blob; 171 | }); 172 | })); 173 | } catch (error) { 174 | throw new Error(`Failed to sign transactions: ${error instanceof Error ? error.message : String(error)}`); 175 | } 176 | } 177 | 178 | // Backward compatibility 179 | async signTransaction( 180 | transactions: { txn: Transaction; message?: string }[] 181 | ): Promise<Uint8Array[]> { 182 | const results = await this.signTransactions([transactions]); 183 | return results[0]; 184 | } 185 | } 186 | ``` -------------------------------------------------------------------------------- /packages/server/src/resources/knowledge/taxonomy/algokit:cli:features:project:bootstrap.md: -------------------------------------------------------------------------------- ```markdown 1 | # AlgoKit Project Bootstrap 2 | 3 | The AlgoKit Project Bootstrap feature allows you to bootstrap different project dependencies by looking up specific files in your current directory and immediate sub directories by convention. 4 | 5 | This is useful to allow for expedited initial setup for each developer e.g. when they clone a repository for the first time. It's also useful to provide a quick getting started experience when initialising a new project via [AlgoKit Init](./init.md) and meeting our goal of "nothing to debugging code in 5 minutes". 6 | 7 | It can bootstrap one or all of the following (with other options potentially being added in the future): 8 | 9 | - Python Poetry projects - Installs Poetry via pipx if its not present and then runs `poetry install` 10 | - Node.js project - Checks if npm is installed and runs `npm install` 11 | - dotenv (.env) file - Checks for `.env.template` files, copies them to `.env` (which should be in `.gitignore` so developers can safely make local specific changes) and prompts for any blank values (so the developer has an easy chance to fill in their initial values where there isn't a clear default). 12 | 13 | > **Note**: Invoking bootstrap from `algokit bootstrap` is not recommended. Please prefer using `algokit project bootstrap` instead. 14 | 15 | ## Usage 16 | 17 | Available commands and possible usage as follows: 18 | 19 | ``` 20 | $ ~ algokit project bootstrap 21 | Usage: algokit project bootstrap [OPTIONS] COMMAND [ARGS]... 22 | 23 | Options: 24 | -h, --help Show this message and exit. 25 | 26 | Commands: 27 | all Bootstrap all aspects of the current directory and immediate sub directories by convention. 28 | env Bootstrap .env file in the current working directory. 29 | npm Bootstrap Node.js project in the current working directory. 30 | poetry Bootstrap Python Poetry and install in the current working directory. 31 | ``` 32 | 33 | ## Functionality 34 | 35 | ### Bootstrap .env file 36 | 37 | The command `algokit project bootstrap env` runs two main tasks in the current directory: 38 | 39 | - Searching for `.env.template` file in the current directory and use it as template to create a new `.env` file in the same directory. 40 | - Prompting the user to enter a value for any empty token values in the `env.` including printing the comments above that empty token 41 | 42 | For instance, a sample `.env.template` file as follows: 43 | 44 | ``` 45 | SERVER_URL=https://myserver.com 46 | # This is a mandatory field to run the server, please enter a value 47 | # For example: 5000 48 | SERVER_PORT= 49 | ``` 50 | 51 | Running the `algokit project bootstrap env` command while the above `.env.template` file in the current directory will result in the following: 52 | 53 | ``` 54 | $ ~ algokit project bootstrap env 55 | Copying /Users/me/my-project/.env.template to /Users/me/my-project/.env and prompting for empty values 56 | # This is a mandatory field to run the server, please enter a value value 57 | # For example: 5000 58 | 59 | ? Please provide a value for SERVER_PORT: 60 | ``` 61 | 62 | And when the user enters a value for `SERVER_PORT`, a new `.env` file will be created as follows (e.g. if they entered `4000` as the value): 63 | 64 | ``` 65 | SERVER_URL=https://myserver.com 66 | # This is a mandatory field to run the server, please enter a value 67 | # For example: 5000 68 | SERVER_PORT=4000 69 | ``` 70 | 71 | ### Bootstrap Node.js project 72 | 73 | The command `algokit project bootstrap npm` installs Node.js project dependencies if there is a `package.json` file in the current directory by running `npm install` command to install all node modules specified in that file. If you don't have npm available it will show a clear error message and resolution instructions. 74 | 75 | Here is an example outcome of running `algokit project bootstrap npm` command: 76 | 77 | ``` 78 | $ ~ algokit project bootstrap npm 79 | Installing npm dependencies 80 | npm: 81 | npm: added 17 packages, and audited 18 packages in 3s 82 | npm: 83 | npm: 2 packages are looking for funding 84 | npm: run `npm fund` for details 85 | npm: 86 | npm: found 0 vulnerabilities 87 | ``` 88 | 89 | ### Bootstrap Python poetry project 90 | 91 | The command `algokit project bootstrap poetry` does two main actions: 92 | 93 | - Checking for Poetry version by running `poetry --version` and upgrades it if required 94 | - Installing Python dependencies and setting up Python virtual environment via Poetry in the current directory by running `poetry install`. 95 | 96 | Here is an example of running `algokit project bootstrap poetry` command: 97 | 98 | ``` 99 | $ ~ algokit project bootstrap poetry 100 | Installing Python dependencies and setting up Python virtual environment via Poetry 101 | poetry: 102 | poetry: Installing dependencies from lock file 103 | poetry: 104 | poetry: Package operations: 1 installs, 1 update, 0 removals 105 | poetry: 106 | poetry: • Installing pytz (2022.7) 107 | poetry: • Updating copier (7.0.1 -> 7.1.0a0) 108 | poetry: 109 | poetry: Installing the current project: algokit (0.1.0) 110 | ``` 111 | 112 | ### Bootstrap all 113 | 114 | Execute `algokit project bootstrap all` to initiate `algokit project bootstrap env`, `algokit project bootstrap npm`, and `algokit project bootstrap poetry` commands within the current directory and all its immediate sub-directories. This comprehensive command is automatically triggered following the initialization of a new project through the [AlgoKit Init](./init.md) command. 115 | 116 | #### Filtering Options 117 | 118 | The `algokit project bootstrap all` command includes flags for more granular control over the bootstrapping process within [AlgoKit workspaces](../init.md#workspaces): 119 | 120 | - `--project-name`: This flag allows you to specify one or more project names to bootstrap. Only projects matching the provided names will be bootstrapped. This is particularly useful in monorepos or when working with multiple projects in the same directory structure. 121 | 122 | - `--type`: Use this flag to limit the bootstrapping process to projects of a specific type (e.g., `frontend`, `backend`, `contract`). This option streamlines the setup process by focusing on relevant project types, reducing the overall bootstrapping time. 123 | 124 | These new flags enhance the flexibility and efficiency of the bootstrapping process, enabling developers to tailor the setup according to project-specific needs. 125 | 126 | ## Further Reading 127 | 128 | To learn more about the `algokit project bootstrap` command, please refer to [bootstrap](../../cli/index.md#bootstrap) in the AlgoKit CLI reference documentation. 129 | ``` -------------------------------------------------------------------------------- /packages/server/src/resources/knowledge/taxonomy/ARCs:specs:arc-0048.md: -------------------------------------------------------------------------------- ```markdown 1 | --- 2 | arc: 48 3 | title: Targeted DeFi Rewards 4 | description: Targeted DeFi Rewards, Terms and Conditions 5 | author: Stéphane BARROSO (@SudoWeezy) 6 | discussions-to: https://github.com/algorandfoundation/ARCs/issues/227 7 | status: Deprecated 8 | type: Informational 9 | created: 2023-07-19 10 | --- 11 | 12 | ## Abstract 13 | The Targeted DeFi Rewards is a temporary incentive program that distributes Algo to be deployed in targeted activities to attract new DeFi users from within and outside the ecosystem. 14 | The goal is to give DeFi projects more flexibility in how these rewards are structured and distributed among their user base, targeting rapid growth, deeper DEX liquidity, and incentives for users who come to Algorand in the middle of a governance period. 15 | 16 | ## Specification 17 | 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" target=_blank>RFC-2119</a>. 18 | 19 | ### Eligibility Criteria 20 | 21 | To be eligible to apply to this program, projects must abide by the <a href="https://www.algorand.foundation/disclaimers">Disclaimers</a> (in particular the “Excluded Jurisdictions” section) and be willing to enter into a binding contract in the form of the template provided by the Algorand Foundation. 22 | 23 | > The Algorand Foundation is temporarily allowing US-based entities to apply for this program. Approved projects will have their rewards swapped to USDCa on the day of the payment. This exception will be reviewed periodically. 24 | 25 | Projects must have at least 500K Algo equivalent in TVL of white-listed assets, at the time of the quarterly snapshot block, which happens on the 15th day of the last month of each calendar quarter. All related wallet addresses will be provided in advance for peer scrutiny. 26 | 27 | The DeFi Advisory Committee will review applications to verify each TVL claim, thus ensuring that claims are valid prior to application approval. 28 | 29 | For AMMs we will leverage the Eligible Liquidity Pool list that is currently adopted to allow the governors commitment of LP tokens in the DeFi Rewards program, with extension to the assets defined below. 30 | 31 | For Lending/Borrowing protocols, each project will provide a list of their assets and their holding wallet address(es). 32 | 33 | For Bridges, each project will provide a list of the bridged assets and their holding wallet address(es). 34 | 35 | ### Assets Selection 36 | 37 | The metrics used to select eligible assets to be used for Eligibility TVL Calculation (as per Eligibility Criteria above) were chosen to ensure that the selected tokens have a strong reputation, are difficult to manipulate, and are valuable to the ecosystem. This reputation is built on a combination of factors, including Total Value Locked (TVL), Market Cap, and listings. 38 | 39 | >Assets are expected to meet at least two of the three criteria below to be included in the white-list. 40 | 41 | |Criteria|| 42 | |:-|-:| 43 | |TVL|The total value locked in different Algorand protocols plays a key role. It's a good indicator of the token's popularity. Minimum TVL requirement: $100K across all the protocols.| 44 | |Market Cap|Market cap is a measure of a crypto token’s total circulating supply multiplied by its current market price. This parameter can be used to consider the positioning of the tokens on the entire crypto market. Minimum Market Cap requirement: USD 1MM.| 45 | |Listing|Tokens listed on multiple stable and respected exchanges are often seen as more established and trustworthy. This can also contribute to increased demand for the token and further the growth of its reputation within the ecosystem.| 46 | 47 | The following assets are qualified and meet the above criteria: 48 | - ALGO 49 | - gALGO - ASA ID 793124631 50 | - USDC - ASA ID 31566704 51 | - USDT - ASA ID 312769 52 | - goBTC - ASA ID 386192725 53 | - goETH - ASA ID 386195940 54 | - PLANETS - ASA ID 27165954 55 | - OPUL - ASA ID 287867876 56 | - VESTIGE - ASA ID 700965019 57 | - CHIPS - ASA ID 388592191 58 | - DEFLY - ASA ID 470842789 59 | - goUSD - ASA 672913181 60 | - WBTC - ASA 1058926737 61 | - WETH - ASA 887406851 62 | - GOLD$ - ASA 246516580 63 | - SILVER$ - ASA 246519683 64 | - PEPE - ASA 1096015467 65 | - COOP - ASA 796425061 66 | - GORA - ASA 1138500612 67 | 68 | > Applications for the above list can be submitted at any time <a href="https://forms.gle/kpEpZ8sih69M5xa39">using this form</a>. Cut off for the applications review is the 7th day of the last month of each calendar quarter, or one week before the quarterly snapshot date. 69 | 70 | ### Rewards Distribution 71 | 72 | Projects will receive 11250 Algo for each 500K Algo TVL as defined above, rounded down. In the event that the available Algo are not sufficient for all the projects, Algo rewards will be distributed to each protocol based on their weighted contribution of TVL to Algorand DeFi. 73 | 74 | Rewards per project are capped at 25% of the total rewards distributed under this program for that period. In the event of partial distribution of the allocated 7.5MM, the remaining funds will be distributed as regular DeFi governance rewards. For Governance Period 8, the AMM TVL count has doubled, when compared to lending/borrow and bridge projects, in recognition of their strategic role in providing liquidity for the ecosystem. This modification was approved by the DeFi Committee. 75 | 76 | Rewards under this program will be distributed to projects within 4 weeks of the scheduled start date of the new governance period and the project(s). The usage of these rewards will be made public, and they will be entirely dedicated to protocol provision, user rewards, and user engagement. The use of rewards and methodology for payment must be made public and approved by the Algorand DeFi advisory committee prior to distribution. 77 | 78 | ## Rationale 79 | This document was versioned using google doc, it made more sense to move it on github. 80 | 81 | ## Security Considerations 82 | Disclaimer: This document may be revised until the day before the voting session opens, as we are still collecting community feedback. 83 | 84 | ## Copyright 85 | Copyright and related rights waived via <a href="https://creativecommons.org/publicdomain/zero/1.0/">CCO</a>. 86 | ``` -------------------------------------------------------------------------------- /packages/server/src/tools/apiManager/vestige/swaps.ts: -------------------------------------------------------------------------------- ```typescript 1 | import { Tool, ErrorCode, McpError } from '@modelcontextprotocol/sdk/types.js'; 2 | import { ResponseProcessor } from '../../../utils/responseProcessor.js'; 3 | import { env } from '../../../env.js'; 4 | 5 | export const swapTools: Tool[] = [ 6 | { 7 | name: 'api_vestige_view_swaps', 8 | description: 'Get swaps', 9 | inputSchema: { 10 | type: 'object', 11 | properties: { 12 | network_id: { 13 | type: 'integer', 14 | description: 'Network ID' 15 | }, 16 | start: { 17 | type: 'integer', 18 | description: 'Start timestamp' 19 | }, 20 | end: { 21 | type: 'integer', 22 | description: 'Optional end timestamp' 23 | }, 24 | protocol_id: { 25 | type: 'integer', 26 | description: 'Optional protocol ID filter' 27 | }, 28 | asset_id: { 29 | type: 'integer', 30 | description: 'Optional asset ID filter' 31 | }, 32 | address: { 33 | type: 'string', 34 | description: 'Optional address filter' 35 | }, 36 | executor: { 37 | type: 'string', 38 | description: 'Optional executor filter' 39 | }, 40 | next: { 41 | type: 'string', 42 | description: 'Optional next token for pagination' 43 | }, 44 | denominating_asset_id: { 45 | type: 'integer', 46 | description: 'Optional denominating asset ID', 47 | default: 0 48 | }, 49 | limit: { 50 | type: 'integer', 51 | description: 'Maximum number of results', 52 | default: 50, 53 | maximum: 250, 54 | minimum: 1 55 | }, 56 | order_dir: { 57 | type: 'string', 58 | description: 'Order direction (asc/desc)', 59 | default: 'desc', 60 | pattern: '^(asc|desc)$' 61 | } 62 | }, 63 | required: ['network_id', 'start'] 64 | } 65 | }, 66 | { 67 | name: 'api_vestige_get_best_v4_swap_data', 68 | description: 'Get best V4 swap data', 69 | inputSchema: { 70 | type: 'object', 71 | properties: { 72 | from_asa: { 73 | type: 'integer', 74 | description: 'Source ASA ID' 75 | }, 76 | to_asa: { 77 | type: 'integer', 78 | description: 'Target ASA ID' 79 | }, 80 | amount: { 81 | type: 'integer', 82 | description: 'Amount to swap' 83 | }, 84 | mode: { 85 | type: 'string', 86 | description: 'Swap mode (sef/sfe)', 87 | pattern: '^(sef|sfe)$' 88 | }, 89 | denominating_asset_id: { 90 | type: 'integer', 91 | description: 'Optional denominating asset ID', 92 | default: 0 93 | }, 94 | enabled_providers: { 95 | type: 'string', 96 | description: 'Optional comma-separated list of enabled providers' 97 | }, 98 | disabled_providers: { 99 | type: 'string', 100 | description: 'Optional comma-separated list of disabled providers' 101 | } 102 | }, 103 | required: ['from_asa', 'to_asa', 'amount', 'mode'] 104 | } 105 | }, 106 | { 107 | name: 'api_vestige_get_v4_swap_discount', 108 | description: 'Get V4 swap discount', 109 | inputSchema: { 110 | type: 'object', 111 | properties: { 112 | address: { 113 | type: 'string', 114 | description: 'Account address' 115 | } 116 | }, 117 | required: ['address'] 118 | } 119 | }, 120 | { 121 | name: 'api_vestige_get_v4_swap_data_transactions', 122 | description: 'Get V4 swap data transactions', 123 | inputSchema: { 124 | type: 'object', 125 | properties: { 126 | sender: { 127 | type: 'string', 128 | description: 'Sender address' 129 | }, 130 | slippage: { 131 | type: 'number', 132 | description: 'Slippage tolerance' 133 | }, 134 | random_signer: { 135 | type: 'string', 136 | description: 'Optional random signer address' 137 | }, 138 | swap_data: { 139 | type: 'object', 140 | description: 'V4 swap data from get_best_v4_swap_data' 141 | } 142 | }, 143 | required: ['sender', 'slippage', 'swap_data'] 144 | } 145 | }, 146 | { 147 | name: 'api_vestige_get_aggregator_stats', 148 | description: 'Get aggregator stats', 149 | inputSchema: { 150 | type: 'object', 151 | properties: { 152 | denominating_asset_id: { 153 | type: 'integer', 154 | description: 'Optional denominating asset ID', 155 | default: 0 156 | } 157 | } 158 | } 159 | } 160 | ]; 161 | 162 | export const handleSwapTools = ResponseProcessor.wrapResourceHandler(async function handleSwapTools(args: any): Promise<any> { 163 | const name = args.name; 164 | const baseUrl = env.vestige_api_url; 165 | let endpoint = ''; 166 | let method = 'GET'; 167 | 168 | switch (name) { 169 | case 'api_vestige_view_swaps': 170 | endpoint = '/swaps'; 171 | break; 172 | case 'api_vestige_get_best_v4_swap_data': 173 | endpoint = '/swap/v4'; 174 | break; 175 | case 'api_vestige_get_v4_swap_discount': 176 | endpoint = '/swap/v4/fee'; 177 | break; 178 | case 'api_vestige_get_v4_swap_data_transactions': 179 | endpoint = '/swap/v4/transactions'; 180 | method = 'POST'; 181 | break; 182 | case 'api_vestige_get_aggregator_stats': 183 | endpoint = '/swap/v4/stats'; 184 | break; 185 | default: 186 | throw new McpError( 187 | ErrorCode.MethodNotFound, 188 | `Unknown tool: ${name}` 189 | ); 190 | } 191 | 192 | try { 193 | // Add query parameters if they exist 194 | const queryParams = new URLSearchParams(); 195 | for (const [key, value] of Object.entries(args)) { 196 | if (value !== undefined && key !== 'swap_data') { 197 | queryParams.append(key, String(value)); 198 | } 199 | } 200 | const url = `${baseUrl}${endpoint}${queryParams.toString() ? `?${queryParams.toString()}` : ''}`; 201 | 202 | const options: RequestInit = { 203 | method 204 | }; 205 | 206 | // Add body for POST requests 207 | if (method === 'POST' && args.swap_data) { 208 | options.body = JSON.stringify(args.swap_data); 209 | options.headers = { 210 | 'Content-Type': 'application/json' 211 | }; 212 | } 213 | 214 | const response = await fetch(url, options); 215 | if (!response.ok) { 216 | throw new McpError( 217 | ErrorCode.InternalError, 218 | `Vestige API error: ${response.status} ${response.statusText}` 219 | ); 220 | } 221 | const data = await response.json(); 222 | return data; 223 | } catch (error) { 224 | if (error instanceof McpError) { 225 | throw error; 226 | } 227 | throw new McpError( 228 | ErrorCode.InternalError, 229 | `Failed to fetch swap data: ${error instanceof Error ? error.message : String(error)}` 230 | ); 231 | } 232 | }); 233 | ``` -------------------------------------------------------------------------------- /packages/server/src/resources/knowledge/taxonomy/developer:docs:run-a-node:participate:index.md: -------------------------------------------------------------------------------- ```markdown 1 | title: Overview 2 | 3 | This section covers the procedure for registering an account to participate in the Algorand Consensus Protocol. It begins with a description of important concepts and best practices before getting started. 4 | 5 | !!! tldr 6 | - Accounts participate in the Algorand consensus protocol by generating a valid participation key and then registering that key online with a special online registration transaction. 7 | - Accounts mark themselves online by submitting an [online key registration transaction](../../get-details/transactions#register-account-online) for a valid participation key. 8 | - Accounts mark themselves offline by submitting an [offline key registration transaction](../../get-details/transactions#register-account-offline). 9 | - It is important to mark your account offline if it is not participating. Not doing so is bad network behavior and will decrease the honest/dishonest user ratio that underpins the liveness of the agreement protocol. 10 | - It is important to ensure that only the latest update of the participation key ever exists at any time. 11 | - In the event of node migration, hardware swap, or other similar events, it is preferable to have your participation key offline for a few rounds than to have it present on multiple nodes at the same time. 12 | 13 | # Important Concepts 14 | 15 | ## Online Participation 16 | In the context of this section, participation means participation in the Algorand consensus protocol. An account that participates in the Algorand consensus protocol is eligible and available to be selected to propose and vote on new blocks in the Algorand blockchain. Note that the likelihood that this account will be selected to propose and vote on blocks is proportional to its amount of stake. Read more about voting and block proposals in the [Algorand Consensus Protocol overview](../../get-details/algorand_consensus#the-algorand-consensus-protocol). 17 | 18 | !!! info 19 | Participation in consensus currently does not affect the proportion of participation rewards an account receives. Participation rewards are [based on the amount](https://algorand.foundation/rewards-faq) of stake an account has, irrespective of whether the account is marked online or offline. Furthermore, currently there are no participation rewards on MainNet. 20 | 21 | ## Online/Offline Status 22 | In order for an account to participate in consensus, it must first mark itself online. Marking an account online requires the account to have a valid participation key, which has been registered with the network by way of an [online key registration transaction](../../get-details/transactions#register-account-online), authorized by the participating account. Marking an account offline requires an [offline key registration transaction](../../get-details/transactions#register-account-offline) also authorized by the private key of the participating account. 23 | 24 | # Guidelines for a Healthy Network 25 | 26 | ## Ensure that Online Accounts are Participating 27 | If an account registers itself online, it is important that its participation key is online. _A participation key is online if there is a single fully-synchronized node on the Algorand network that has that key in its ledger directory._ You should always mark an account offline if it is not actually available to participate, since the network uses the online/offline status of an account to calculate block vote thresholds. If you are marked online but you are not participating, you would be considered a dishonest user and will negatively impact the voting threshold. Furthermore, if your node experiences issues you are not able to solve promptly, it is recommended that you register the account offline as soon as possible. 28 | 29 | !!! tip 30 | If you keep your private keys in cold storage, it is recommended that you generate and sign enough offline transactions to be able to take the account offline in case of emergencies. Learn more about generating transactions for future rounds in the [Transactions guide](../../get-details/transactions#). Learn how to create and authorize transactions offline in the [Authorizing Transactions Offline](../../get-details/transactions/offline_transactions) guide. 31 | 32 | ## Renew participation keys before they expire 33 | Participation keys are valid for a specific round range. Make sure to renew participation keys or mark the account offline before the current participation key expires. Your account will _not_ automatically be marked offline. 34 | 35 | _Visit the [Renew Participation Keys section](./renew.md) for detailed instructions._ 36 | 37 | ## Ensure that Participation Nodes are working properly 38 | 39 | Monitor your participation node to ensure high performance and consistent access to your registered participation key. 40 | The following should be monitored: 41 | 42 | * last committed block (`goal node status` or API) matches a third-party API service 43 | * CPU / RAM / disk use are within thresholds 44 | * clock is accurate (blocks are timestamped using the clock time from the block proposer's node, so keep your node clock accurate and on time) 45 | * the participation node is sending votes and proposing blocks at the expected frequency. 46 | 47 | ## Securely Store Participation Keys 48 | 49 | Registered participation keys that are in operation are regularly updated through the protocol so that they cannot be used to vote on earlier rounds. Essentially, the set of keys corresponding to earlier rounds are deleted after the round passes to ensure that the compromise of a participation key by a bad actor does not give the bad actor the potential to rewrite history. Because of this, it is important that there only exists a single instance of the participation key (files ending in `*.partkey`) at any time in the system. 50 | 51 | !!! warning 52 | Because of this, holding backups of participation keys is highly discouraged, unless appropriate procedures are setup to purge those backups on a regular basis. 53 | 54 | # Technical Procedure 55 | 56 | The rest of this section will describe how to [generate a participation key](./generate_keys.md) for an account, [mark or register the account online](./online.md) (with the generated participation key), [mark or register an account offline](./offline.md), and [renew a participation key](./renew.md) for an account. 57 | ``` -------------------------------------------------------------------------------- /packages/client/src/index.ts: -------------------------------------------------------------------------------- ```typescript 1 | import { PeraWalletConnect } from '@perawallet/connect'; 2 | import { DeflyWalletConnect } from '@blockshake/defly-connect'; 3 | import { DaffiWalletConnect } from '@daffiwallet/connect'; 4 | import algosdk, { Transaction } from 'algosdk'; 5 | import { LocalWallet } from './LocalWallet.js'; 6 | 7 | export type WalletType = 'pera' | 'defly' | 'daffi' | 'local'; 8 | 9 | export interface WalletConnectOptions { 10 | network: 'mainnet' | 'testnet'; 11 | } 12 | 13 | interface WalletProvider { 14 | connect(): Promise<string[]>; 15 | reconnectSession(): Promise<string[]>; 16 | disconnect(): Promise<void>; 17 | signTransactions(transactions: { txn: Transaction; message?: string }[][]): Promise<Uint8Array[][]>; 18 | } 19 | 20 | export class AlgorandMcpClient { 21 | private peraWallet: PeraWalletConnect; 22 | private deflyWallet: DeflyWalletConnect; 23 | private daffiWallet: DaffiWalletConnect; 24 | private activeWallet: WalletProvider | null = null; 25 | private localWallet: LocalWallet; 26 | private connectedAccounts: string[] = []; 27 | private activeWalletType: WalletType | null = null; 28 | 29 | constructor(options: WalletConnectOptions) { 30 | this.localWallet = new LocalWallet(); 31 | this.peraWallet = new PeraWalletConnect({ 32 | chainId: options.network === 'mainnet' ? 416001 : 416002 33 | }); 34 | this.deflyWallet = new DeflyWalletConnect({ 35 | chainId: options.network === 'mainnet' ? 416001 : 416002 36 | }); 37 | this.daffiWallet = new DaffiWalletConnect({ 38 | chainId: options.network === 'mainnet' ? 416001 : 416002 39 | }); 40 | } 41 | 42 | async connect(walletType: WalletType): Promise<string[]> { 43 | try { 44 | let accounts: string[] = []; 45 | 46 | switch (walletType) { 47 | case 'local': 48 | accounts = await this.localWallet.connect(); 49 | this.activeWallet = this.localWallet; 50 | break; 51 | case 'pera': 52 | accounts = await this.peraWallet.connect(); 53 | this.activeWallet = this.peraWallet as unknown as WalletProvider; 54 | break; 55 | case 'defly': 56 | accounts = await this.deflyWallet.connect(); 57 | this.activeWallet = this.deflyWallet as unknown as WalletProvider; 58 | break; 59 | case 'daffi': 60 | accounts = await this.daffiWallet.connect(); 61 | this.activeWallet = this.daffiWallet as unknown as WalletProvider; 62 | break; 63 | default: 64 | throw new Error('Unsupported wallet type'); 65 | } 66 | 67 | this.connectedAccounts = accounts; 68 | this.activeWalletType = walletType; 69 | return accounts; 70 | } catch (error: unknown) { 71 | throw new Error(`Failed to connect wallet: ${error instanceof Error ? error.message : String(error)}`); 72 | } 73 | } 74 | 75 | makeTransactionSigner = async (txnGroup: Uint8Array[], indexesToSign: number[]) => { 76 | if (!this.activeWallet || !this.activeWalletType) { 77 | throw new Error('No active wallet'); 78 | } 79 | 80 | if (this.activeWalletType === 'local') { 81 | const signer = await this.localWallet.makeTransactionSigner(); 82 | const decodedTxns = txnGroup.map(txn => algosdk.decodeUnsignedTransaction(txn)); 83 | return () => signer(decodedTxns, indexesToSign); 84 | } 85 | 86 | return async () => { 87 | if (!this.activeWallet) { 88 | throw new Error('Wallet not connected'); 89 | } 90 | 91 | try { 92 | // Decode transactions from Uint8Array 93 | const decodedTxns = txnGroup.map(txn => algosdk.decodeUnsignedTransaction(txn)); 94 | 95 | // Format transactions for signing 96 | const txnsToSign = decodedTxns.map(txn => ({ 97 | txn: txn, 98 | message: 'Please sign the transaction' 99 | })); 100 | 101 | const result = await this.activeWallet.signTransactions([txnsToSign]); 102 | return result[0]; 103 | } catch (error: any) { 104 | // Handle specific error cases 105 | if (error?.data?.type === "SIGN_MODAL_CLOSED") { 106 | console.error('Transaction signing cancelled'); 107 | return new Array(indexesToSign.length).fill(null); 108 | } 109 | 110 | const msg = error?.message || "Failed to sign transaction"; 111 | console.error(`Wallet signer error: ${msg}`); 112 | return new Array(indexesToSign.length).fill(null); 113 | } 114 | }; 115 | } 116 | 117 | getAccounts(): string[] { 118 | return this.connectedAccounts; 119 | } 120 | 121 | async signTransactions(transactions: { txn: Transaction; message?: string }[][]): Promise<Uint8Array[][]> { 122 | if (!this.activeWallet) { 123 | throw new Error('No active wallet connection. Call connect() first.'); 124 | } 125 | 126 | try { 127 | return await this.activeWallet.signTransactions(transactions); 128 | } catch (error: unknown) { 129 | throw new Error(`Failed to sign transactions: ${error instanceof Error ? error.message : String(error)}`); 130 | } 131 | } 132 | 133 | // Backward compatibility 134 | async signTransaction(txn: Transaction): Promise<Uint8Array> { 135 | const result = await this.signTransactions([[{ txn, message: 'Transaction to sign' }]]); 136 | return result[0][0]; 137 | } 138 | 139 | async disconnect(): Promise<void> { 140 | if (this.activeWallet) { 141 | await this.activeWallet.disconnect(); 142 | this.activeWallet = null; 143 | this.connectedAccounts = []; 144 | } 145 | } 146 | 147 | async reconnectSession(walletType: WalletType): Promise<string[]> { 148 | try { 149 | let accounts: string[] = []; 150 | 151 | switch (walletType) { 152 | case 'local': 153 | accounts = await this.localWallet.reconnectSession(); 154 | this.activeWallet = this.localWallet; 155 | break; 156 | case 'pera': 157 | accounts = await this.peraWallet.reconnectSession(); 158 | this.activeWallet = this.peraWallet as unknown as WalletProvider; 159 | break; 160 | case 'defly': 161 | accounts = await this.deflyWallet.reconnectSession(); 162 | this.activeWallet = this.deflyWallet as unknown as WalletProvider; 163 | break; 164 | case 'daffi': 165 | accounts = await this.daffiWallet.reconnectSession(); 166 | this.activeWallet = this.daffiWallet as unknown as WalletProvider; 167 | break; 168 | default: 169 | throw new Error('Unsupported wallet type'); 170 | } 171 | 172 | this.connectedAccounts = accounts; 173 | this.activeWalletType = walletType; 174 | return accounts; 175 | } catch (error: unknown) { 176 | throw new Error(`Failed to reconnect session: ${error instanceof Error ? error.message : String(error)}`); 177 | } 178 | } 179 | } 180 | ``` -------------------------------------------------------------------------------- /packages/server/src/resources/knowledge/taxonomy/algokit:cli:features:goal.md: -------------------------------------------------------------------------------- ```markdown 1 | # AlgoKit goal 2 | 3 | AlgoKit goal command provides the user with a mechanism to run [goal cli](https://developer.algorand.org/docs/clis/goal/goal/) commands against the current [AlgoKit LocalNet](./localnet.md). 4 | 5 | You can explore all possible goal commands by running `algokit goal` e.g.: 6 | 7 | ``` 8 | $ ~ algokit goal 9 | GOAL is the CLI for interacting Algorand software instance. The binary 'goal' is installed alongside the algod binary and is considered an integral part of the complete installation. The binaries should be used in tandem - you should not try to use a version of goal with a different version of algod. 10 | 11 | Usage: 12 | goal [flags] 13 | goal [command] 14 | 15 | Available Commands: 16 | account Control and manage Algorand accounts 17 | app Manage applications 18 | asset Manage assets 19 | clerk Provides the tools to control transactions 20 | completion Shell completion helper 21 | help Help about any command 22 | kmd Interact with kmd, the key management daemon 23 | ledger Access ledger-related details 24 | license Display license information 25 | logging Control and manage Algorand logging 26 | network Create and manage private, multi-node, locally-hosted networks 27 | node Manage a specified algorand node 28 | protocols 29 | report 30 | version The current version of the Algorand daemon (algod) 31 | wallet Manage wallets: encrypted collections of Algorand account keys 32 | 33 | Flags: 34 | -d, --datadir stringArray Data directory for the node 35 | -h, --help help for goal 36 | -k, --kmddir string Data directory for kmd 37 | -v, --version Display and write current build version and exit 38 | 39 | Use "goal [command] --help" for more information about a command. 40 | ``` 41 | 42 | For instance, running `algokit goal report` would result in output like: 43 | 44 | ``` 45 | $ ~ algokit goal report 46 | 12885688322 47 | 3.12.2.dev [rel/stable] (commit #181490e3) 48 | go-algorand is licensed with AGPLv3.0 49 | source code available at https://github.com/algorand/go-algorand 50 | 51 | Linux ff7828f2da17 5.15.49-linuxkit #1 SMP PREEMPT Tue Sep 13 07:51:32 UTC 2022 aarch64 GNU/Linux 52 | 53 | Genesis ID from genesis.json: sandnet-v1 54 | 55 | Last committed block: 0 56 | Time since last block: 0.0s 57 | Sync Time: 0.0s 58 | Last consensus protocol: future 59 | Next consensus protocol: future 60 | Round for next consensus protocol: 1 61 | Next consensus protocol supported: true 62 | Last Catchpoint: 63 | Genesis ID: sandnet-v1 64 | Genesis hash: vEg1NCh6SSXwS6O5HAfjYCCNAs4ug328s3RYMr9syBg= 65 | ``` 66 | 67 | If the AlgoKit Sandbox `algod` docker container is not present or not running, the command will fail with a clear error, e.g.: 68 | 69 | ``` 70 | $ ~ algokit goal 71 | Error: No such container: algokit_algod 72 | Error: Error executing goal; ensure the Sandbox is started by executing `algokit sandbox status` 73 | ``` 74 | 75 | ``` 76 | $ ~ algokit goal 77 | Error response from daemon: Container 5a73961536e2c98e371465739053d174066c40d00647c8742f2bb39eb793ed7e is not running 78 | Error: Error executing goal; ensure the Sandbox is started by executing `algokit sandbox status` 79 | ``` 80 | 81 | ## Working with Files in the Container 82 | 83 | When interacting with the container, especially if you're using tools like goal, you might need to reference files or directories. Here's how to efficiently deal with files and directories: 84 | 85 | ### Automatic File Mounting 86 | 87 | When you specify a file or directory path in your `goal` command, the system will automatically mount that path from your local filesystem into the container. This way, you don't need to copy files manually each time. 88 | 89 | For instance, if you want to compile a `teal` file: 90 | 91 | ``` 92 | algokit goal clerk compile /Path/to/inputfile/approval.teal -o /Path/to/outputfile/approval.compiled 93 | ``` 94 | 95 | Here, `/Path/to/inputfile/approval.teal` and `/Path/to/outputfile/approval.compiled` are paths on your local file system, and they will be automatically accessible to the `goal` command inside the container. 96 | 97 | ### Manual Copying of Files 98 | 99 | In case you want to manually copy files into the container, you can do so using `docker cp`: 100 | 101 | ``` 102 | docker cp foo.txt algokit_algod:/root 103 | ``` 104 | 105 | This command copies the `foo.txt` from your local system into the root directory of the `algokit_algod` container. 106 | 107 | Note: Manual copying is optional and generally only necessary if you have specific reasons for doing so since the system will auto-mount paths specified in commands. 108 | 109 | ## Running multiple commands 110 | 111 | If you want to run multiple commands or interact with the filesystem you can execute `algokit goal --console`. This will open a [Bash](https://www.gnu.org/software/bash/) shell session on the `algod` Docker container and from there you can execute goal directly, e.g.: 112 | 113 | ```bash 114 | $ algokit goal --console 115 | Opening Bash console on the algod node; execute `exit` to return to original console 116 | root@82d41336608a:~# goal account list 117 | [online] C62QEFC7MJBPHAUDMGVXGZ7WRWFAF3XYPBU3KZKOFHYVUYDGU5GNWS4NWU C62QEFC7MJBPHAUDMGVXGZ7WRWFAF3XYPBU3KZKOFHYVUYDGU5GNWS4NWU 4000000000000000 microAlgos 118 | [online] DVPJVKODAVEKWQHB4G7N6QA3EP7HKAHTLTZNWMV4IVERJQPNGKADGURU7Y DVPJVKODAVEKWQHB4G7N6QA3EP7HKAHTLTZNWMV4IVERJQPNGKADGURU7Y 4000000000000000 microAlgos 119 | [online] 4BH5IKMDDHEJEOZ7T5LLT4I7EVIH5XCOTX3TPVQB3HY5TUBVT4MYXJOZVA 4BH5IKMDDHEJEOZ7T5LLT4I7EVIH5XCOTX3TPVQB3HY5TUBVT4MYXJOZVA 2000000000000000 microAlgos 120 | ``` 121 | 122 | ## Interactive Mode 123 | 124 | Some `goal` commands require interactive input from the user. By default, AlgoKit will attempt to run commands in non-interactive mode first, and automatically switch to interactive mode if needed. You can force a command to run in interactive mode by using the `--interactive` flag: 125 | 126 | ```bash 127 | $ algokit goal --interactive wallet new algodev 128 | Please choose a password for wallet 'algodev': 129 | Please confirm the password: 130 | Creating wallet... 131 | Created wallet 'algodev' 132 | Your new wallet has a backup phrase that can be used for recovery. 133 | Keeping this backup phrase safe is extremely important. 134 | Would you like to see it now? (Y/n): n 135 | ``` 136 | 137 | This is particularly useful when you know a command will require user input, such as creating new accounts, importing keys, or signing transactions. 138 | 139 | For more details about the `AlgoKit goal` command, please refer to the [AlgoKit CLI reference documentation](../cli/index.md#goal). 140 | ``` -------------------------------------------------------------------------------- /packages/server/src/resources/knowledge/taxonomy/SDKs:javascript:classes:modelsv2.SimulationTransactionExecTrace.md: -------------------------------------------------------------------------------- ```markdown 1 | [algosdk](../README.md) / [Exports](../modules.md) / [modelsv2](../modules/modelsv2.md) / SimulationTransactionExecTrace 2 | 3 | # Class: SimulationTransactionExecTrace 4 | 5 | [modelsv2](../modules/modelsv2.md).SimulationTransactionExecTrace 6 | 7 | The execution trace of calling an app or a logic sig, containing the inner app 8 | call trace in a recursive way. 9 | 10 | ## Hierarchy 11 | 12 | - `default` 13 | 14 | ↳ **`SimulationTransactionExecTrace`** 15 | 16 | ## Table of contents 17 | 18 | ### Constructors 19 | 20 | - [constructor](modelsv2.SimulationTransactionExecTrace.md#constructor) 21 | 22 | ### Properties 23 | 24 | - [approvalProgramHash](modelsv2.SimulationTransactionExecTrace.md#approvalprogramhash) 25 | - [approvalProgramTrace](modelsv2.SimulationTransactionExecTrace.md#approvalprogramtrace) 26 | - [attribute\_map](modelsv2.SimulationTransactionExecTrace.md#attribute_map) 27 | - [clearStateProgramHash](modelsv2.SimulationTransactionExecTrace.md#clearstateprogramhash) 28 | - [clearStateProgramTrace](modelsv2.SimulationTransactionExecTrace.md#clearstateprogramtrace) 29 | - [clearStateRollback](modelsv2.SimulationTransactionExecTrace.md#clearstaterollback) 30 | - [clearStateRollbackError](modelsv2.SimulationTransactionExecTrace.md#clearstaterollbackerror) 31 | - [innerTrace](modelsv2.SimulationTransactionExecTrace.md#innertrace) 32 | - [logicSigHash](modelsv2.SimulationTransactionExecTrace.md#logicsighash) 33 | - [logicSigTrace](modelsv2.SimulationTransactionExecTrace.md#logicsigtrace) 34 | 35 | ### Methods 36 | 37 | - [get\_obj\_for\_encoding](modelsv2.SimulationTransactionExecTrace.md#get_obj_for_encoding) 38 | - [from\_obj\_for\_encoding](modelsv2.SimulationTransactionExecTrace.md#from_obj_for_encoding) 39 | 40 | ## Constructors 41 | 42 | ### constructor 43 | 44 | • **new SimulationTransactionExecTrace**(`«destructured»`) 45 | 46 | Creates a new `SimulationTransactionExecTrace` object. 47 | 48 | #### Parameters 49 | 50 | | Name | Type | 51 | | :------ | :------ | 52 | | `«destructured»` | `Object` | 53 | | › `approvalProgramHash?` | `string` \| `Uint8Array` | 54 | | › `approvalProgramTrace?` | [`SimulationOpcodeTraceUnit`](modelsv2.SimulationOpcodeTraceUnit.md)[] | 55 | | › `clearStateProgramHash?` | `string` \| `Uint8Array` | 56 | | › `clearStateProgramTrace?` | [`SimulationOpcodeTraceUnit`](modelsv2.SimulationOpcodeTraceUnit.md)[] | 57 | | › `clearStateRollback?` | `boolean` | 58 | | › `clearStateRollbackError?` | `string` | 59 | | › `innerTrace?` | [`SimulationTransactionExecTrace`](modelsv2.SimulationTransactionExecTrace.md)[] | 60 | | › `logicSigHash?` | `string` \| `Uint8Array` | 61 | | › `logicSigTrace?` | [`SimulationOpcodeTraceUnit`](modelsv2.SimulationOpcodeTraceUnit.md)[] | 62 | 63 | #### Overrides 64 | 65 | BaseModel.constructor 66 | 67 | #### Defined in 68 | 69 | client/v2/algod/models/types.ts:5288 70 | 71 | ## Properties 72 | 73 | ### approvalProgramHash 74 | 75 | • `Optional` **approvalProgramHash**: `Uint8Array` 76 | 77 | SHA512_256 hash digest of the approval program executed in transaction. 78 | 79 | #### Defined in 80 | 81 | client/v2/algod/models/types.ts:5226 82 | 83 | ___ 84 | 85 | ### approvalProgramTrace 86 | 87 | • `Optional` **approvalProgramTrace**: [`SimulationOpcodeTraceUnit`](modelsv2.SimulationOpcodeTraceUnit.md)[] 88 | 89 | Program trace that contains a trace of opcode effects in an approval program. 90 | 91 | #### Defined in 92 | 93 | client/v2/algod/models/types.ts:5231 94 | 95 | ___ 96 | 97 | ### attribute\_map 98 | 99 | • **attribute\_map**: `Record`\<`string`, `string`\> 100 | 101 | #### Inherited from 102 | 103 | BaseModel.attribute\_map 104 | 105 | #### Defined in 106 | 107 | client/v2/basemodel.ts:56 108 | 109 | ___ 110 | 111 | ### clearStateProgramHash 112 | 113 | • `Optional` **clearStateProgramHash**: `Uint8Array` 114 | 115 | SHA512_256 hash digest of the clear state program executed in transaction. 116 | 117 | #### Defined in 118 | 119 | client/v2/algod/models/types.ts:5236 120 | 121 | ___ 122 | 123 | ### clearStateProgramTrace 124 | 125 | • `Optional` **clearStateProgramTrace**: [`SimulationOpcodeTraceUnit`](modelsv2.SimulationOpcodeTraceUnit.md)[] 126 | 127 | Program trace that contains a trace of opcode effects in a clear state program. 128 | 129 | #### Defined in 130 | 131 | client/v2/algod/models/types.ts:5241 132 | 133 | ___ 134 | 135 | ### clearStateRollback 136 | 137 | • `Optional` **clearStateRollback**: `boolean` 138 | 139 | If true, indicates that the clear state program failed and any persistent state 140 | changes it produced should be reverted once the program exits. 141 | 142 | #### Defined in 143 | 144 | client/v2/algod/models/types.ts:5247 145 | 146 | ___ 147 | 148 | ### clearStateRollbackError 149 | 150 | • `Optional` **clearStateRollbackError**: `string` 151 | 152 | The error message explaining why the clear state program failed. This field will 153 | only be populated if clear-state-rollback is true and the failure was due to an 154 | execution error. 155 | 156 | #### Defined in 157 | 158 | client/v2/algod/models/types.ts:5254 159 | 160 | ___ 161 | 162 | ### innerTrace 163 | 164 | • `Optional` **innerTrace**: [`SimulationTransactionExecTrace`](modelsv2.SimulationTransactionExecTrace.md)[] 165 | 166 | An array of SimulationTransactionExecTrace representing the execution trace of 167 | any inner transactions executed. 168 | 169 | #### Defined in 170 | 171 | client/v2/algod/models/types.ts:5260 172 | 173 | ___ 174 | 175 | ### logicSigHash 176 | 177 | • `Optional` **logicSigHash**: `Uint8Array` 178 | 179 | SHA512_256 hash digest of the logic sig executed in transaction. 180 | 181 | #### Defined in 182 | 183 | client/v2/algod/models/types.ts:5265 184 | 185 | ___ 186 | 187 | ### logicSigTrace 188 | 189 | • `Optional` **logicSigTrace**: [`SimulationOpcodeTraceUnit`](modelsv2.SimulationOpcodeTraceUnit.md)[] 190 | 191 | Program trace that contains a trace of opcode effects in a logic sig. 192 | 193 | #### Defined in 194 | 195 | client/v2/algod/models/types.ts:5270 196 | 197 | ## Methods 198 | 199 | ### get\_obj\_for\_encoding 200 | 201 | ▸ **get_obj_for_encoding**(`binary?`): `Record`\<`string`, `any`\> 202 | 203 | Get an object ready for encoding to either JSON or msgpack. 204 | 205 | #### Parameters 206 | 207 | | Name | Type | Default value | Description | 208 | | :------ | :------ | :------ | :------ | 209 | | `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. | 210 | 211 | #### Returns 212 | 213 | `Record`\<`string`, `any`\> 214 | 215 | #### Inherited from 216 | 217 | BaseModel.get\_obj\_for\_encoding 218 | 219 | #### Defined in 220 | 221 | client/v2/basemodel.ts:65 222 | 223 | ___ 224 | 225 | ### from\_obj\_for\_encoding 226 | 227 | ▸ `Static` **from_obj_for_encoding**(`data`): [`SimulationTransactionExecTrace`](modelsv2.SimulationTransactionExecTrace.md) 228 | 229 | #### Parameters 230 | 231 | | Name | Type | 232 | | :------ | :------ | 233 | | `data` | `Record`\<`string`, `any`\> | 234 | 235 | #### Returns 236 | 237 | [`SimulationTransactionExecTrace`](modelsv2.SimulationTransactionExecTrace.md) 238 | 239 | #### Defined in 240 | 241 | client/v2/algod/models/types.ts:5343 242 | ```