├── .dockerignore ├── .env.example ├── .github ├── dependabot.yml └── workflows │ └── docker-image.yml ├── .gitignore ├── .npmignore ├── CONTRIBUTING.md ├── Dockerfile ├── README.md ├── bun.lock ├── bun.lockb ├── package-lock.json ├── package.json ├── src ├── aibtc-cohort-0 │ ├── agent-account │ │ ├── public │ │ │ ├── acct-buy-asset.ts │ │ │ ├── acct-sell-asset.ts │ │ │ ├── conclude-action-proposal.ts │ │ │ ├── create-action-proposal.ts │ │ │ ├── deposit-ft.ts │ │ │ ├── deposit-stx.ts │ │ │ ├── veto-action-proposal.ts │ │ │ └── vote-on-action-proposal.ts │ │ └── read-only │ │ │ ├── get-configuration.ts │ │ │ ├── is-approved-asset.ts │ │ │ └── is-approved-dex.ts │ ├── api │ │ └── client.ts │ ├── contract-tools │ │ ├── deploy-agent-account.ts │ │ ├── deploy-dao-contracts.ts │ │ ├── generate-agent-account.ts │ │ └── generate-dao-contracts.ts │ ├── dao-tools │ │ ├── base-dao │ │ │ ├── public │ │ │ │ └── construct.ts │ │ │ └── read-only │ │ │ │ ├── executed-at.ts │ │ │ │ └── is-extension.ts │ │ └── extensions │ │ │ └── action-proposal-voting │ │ │ ├── public │ │ │ ├── conclude-action-proposal.ts │ │ │ ├── create-action-proposal.ts │ │ │ ├── veto-action-proposal.ts │ │ │ └── vote-on-action-proposal.ts │ │ │ └── read-only │ │ │ ├── get-liquid-supply.ts │ │ │ ├── get-proposal.ts │ │ │ ├── get-total-proposals.ts │ │ │ ├── get-veto-vote-record.ts │ │ │ ├── get-vote-record.ts │ │ │ ├── get-vote-records.ts │ │ │ ├── get-voting-configuration.ts │ │ │ └── get-voting-power.ts │ └── utils │ │ ├── deploy-contract.ts │ │ └── save-contract.ts ├── aibtc-dao │ ├── README.md │ ├── base-dao │ │ ├── public │ │ │ └── construct.ts │ │ └── read-only │ │ │ ├── executed-at.ts │ │ │ └── is-extension.ts │ ├── deploy-dao.ts │ ├── extensions │ │ ├── action-proposals │ │ │ ├── public │ │ │ │ ├── conclude-proposal.ts │ │ │ │ ├── propose-action-add-resource.ts │ │ │ │ ├── propose-action-allow-asset.ts │ │ │ │ ├── propose-action-send-message.ts │ │ │ │ ├── propose-action-set-account-holder.ts │ │ │ │ ├── propose-action-set-withdrawal-amount.ts │ │ │ │ ├── propose-action-set-withdrawal-period.ts │ │ │ │ ├── propose-action-toggle-resource-by-name.ts │ │ │ │ └── vote-on-proposal.ts │ │ │ └── read-only │ │ │ │ ├── get-last-proposal-created.ts │ │ │ │ ├── get-liquid-supply.ts │ │ │ │ ├── get-proposal-bond.ts │ │ │ │ ├── get-proposal.ts │ │ │ │ ├── get-total-proposals.ts │ │ │ │ ├── get-vote-record.ts │ │ │ │ ├── get-voting-configuration.ts │ │ │ │ └── get-voting-power.ts │ │ ├── core-proposals │ │ │ ├── deploy-core-proposal.ts │ │ │ ├── generate-all-core-proposals.ts │ │ │ ├── generate-core-proposal.ts │ │ │ ├── public │ │ │ │ ├── conclude-proposal.ts │ │ │ │ ├── create-proposal.ts │ │ │ │ └── vote-on-proposal.ts │ │ │ └── read-only │ │ │ │ ├── get-last-proposal-created.ts │ │ │ │ ├── get-liquid-supply.ts │ │ │ │ ├── get-proposal-bond.ts │ │ │ │ ├── get-proposal.ts │ │ │ │ ├── get-total-proposals.ts │ │ │ │ ├── get-vote-record.ts │ │ │ │ ├── get-voting-configuration.ts │ │ │ │ └── get-voting-power.ts │ │ ├── dao-charter │ │ │ └── read-only │ │ │ │ ├── get-current-dao-charter-version.ts │ │ │ │ ├── get-current-dao-charter.ts │ │ │ │ └── get-dao-charter.ts │ │ ├── onchain-messaging │ │ │ └── public │ │ │ │ └── send.ts │ │ ├── payment-processor │ │ │ ├── public │ │ │ │ ├── pay-invoice-by-resource-name-dao.ts │ │ │ │ ├── pay-invoice-by-resource-name-sbtc.ts │ │ │ │ ├── pay-invoice-by-resource-name-stx.ts │ │ │ │ ├── pay-invoice-by-resource-name.ts │ │ │ │ ├── pay-invoice-dao.ts │ │ │ │ ├── pay-invoice-sbtc.ts │ │ │ │ ├── pay-invoice-stx.ts │ │ │ │ └── pay-invoice.ts │ │ │ └── read-only │ │ │ │ ├── get-contract-data.ts │ │ │ │ ├── get-invoice.ts │ │ │ │ ├── get-payment-address.ts │ │ │ │ ├── get-recent-payment-data-by-address.ts │ │ │ │ ├── get-recent-payment-data.ts │ │ │ │ ├── get-recent-payment.ts │ │ │ │ ├── get-resource-by-name.ts │ │ │ │ ├── get-resource-index.ts │ │ │ │ ├── get-resource.ts │ │ │ │ ├── get-total-invoices.ts │ │ │ │ ├── get-total-resources.ts │ │ │ │ ├── get-total-revenue.ts │ │ │ │ ├── get-total-users.ts │ │ │ │ ├── get-user-data-by-address.ts │ │ │ │ ├── get-user-data.ts │ │ │ │ └── get-user-index.ts │ │ ├── timed-vault │ │ │ ├── public │ │ │ │ ├── deposit-stx.ts │ │ │ │ └── withdraw-stx.ts │ │ │ └── read-only │ │ │ │ └── get-account-terms.ts │ │ └── treasury │ │ │ ├── public │ │ │ ├── deposit-ft.ts │ │ │ ├── deposit-nft.ts │ │ │ └── deposit-stx.ts │ │ │ └── read-only │ │ │ ├── get-allowed-asset.ts │ │ │ └── is-allowed-asset.ts │ ├── generate-dao.ts │ ├── registries │ │ ├── dao-contract-registry.ts │ │ ├── dao-contract-registry │ │ │ ├── actions.ts │ │ │ ├── deployment-order.ts │ │ │ ├── extensions.ts │ │ │ └── token.ts │ │ ├── dao-core-proposal-registry.ts │ │ └── dao-core-proposal-registry │ │ │ ├── action-proposals.ts │ │ │ ├── base-dao.ts │ │ │ ├── core-proposals.ts │ │ │ ├── dao-charter.ts │ │ │ ├── onchain-messaging.ts │ │ │ ├── payment-processor.ts │ │ │ ├── timed-vault.ts │ │ │ ├── token-owner.ts │ │ │ └── treasury.ts │ ├── services │ │ ├── dao-contract-deployer.ts │ │ ├── dao-contract-generator.ts │ │ ├── dao-core-proposal-deployer.ts │ │ ├── dao-core-proposal-generator.ts │ │ ├── smart-wallet-deployer.ts │ │ └── smart-wallet-generator.ts │ ├── smart-wallet │ │ ├── deploy-my-smart-wallet.ts │ │ ├── deploy-smart-wallet.ts │ │ ├── generate-my-smart-wallet.ts │ │ ├── generate-smart-wallet.ts │ │ ├── public │ │ │ ├── approve-asset.ts │ │ │ ├── conclude-action-proposal.ts │ │ │ ├── conclude-core-proposal.ts │ │ │ ├── deposit-ft.ts │ │ │ ├── deposit-stx.ts │ │ │ ├── proxy-create-proposal.ts │ │ │ ├── proxy-propose-action-add-resource.ts │ │ │ ├── proxy-propose-action-allow-asset.ts │ │ │ ├── proxy-propose-action-send-message.ts │ │ │ ├── proxy-propose-action-set-account-holder.ts │ │ │ ├── proxy-propose-action-set-withdrawal-amount.ts │ │ │ ├── proxy-propose-action-set-withdrawal-period.ts │ │ │ ├── proxy-propose-action-toggle-resource-by-name.ts │ │ │ ├── revoke-asset.ts │ │ │ ├── vote-on-action-proposal.ts │ │ │ ├── vote-on-core-proposal.ts │ │ │ ├── withdraw-ft.ts │ │ │ └── withdraw-stx.ts │ │ └── read-only │ │ │ ├── get-balance-stx.ts │ │ │ ├── get-configuration.ts │ │ │ └── is-approved-asset.ts │ ├── templates │ │ ├── bitflow-stx-wrapper.clar │ │ ├── bitflow-xyk-core-v-1-2.clar │ │ ├── dao │ │ │ ├── aibtc-base-dao.clar │ │ │ ├── extensions │ │ │ │ ├── actions │ │ │ │ │ ├── aibtc-action-configure-timed-vault-dao.clar │ │ │ │ │ ├── aibtc-action-configure-timed-vault-sbtc.clar │ │ │ │ │ ├── aibtc-action-configure-timed-vault-stx.clar │ │ │ │ │ ├── aibtc-action-pmt-dao-add-resource.clar │ │ │ │ │ ├── aibtc-action-pmt-dao-toggle-resource.clar │ │ │ │ │ ├── aibtc-action-pmt-sbtc-add-resource.clar │ │ │ │ │ ├── aibtc-action-pmt-sbtc-toggle-resource.clar │ │ │ │ │ ├── aibtc-action-pmt-stx-add-resource.clar │ │ │ │ │ ├── aibtc-action-pmt-stx-toggle-resource.clar │ │ │ │ │ ├── aibtc-action-send-message.clar │ │ │ │ │ └── aibtc-action-treasury-allow-asset.clar │ │ │ │ ├── aibtc-action-proposals-v2.clar │ │ │ │ ├── aibtc-action-proposals.clar │ │ │ │ ├── aibtc-core-proposals-v2.clar │ │ │ │ ├── aibtc-core-proposals.clar │ │ │ │ ├── aibtc-dao-charter.clar │ │ │ │ ├── aibtc-onchain-messaging.clar │ │ │ │ ├── aibtc-payment-processor-dao.clar │ │ │ │ ├── aibtc-payment-processor-sbtc.clar │ │ │ │ ├── aibtc-payment-processor-stx.clar │ │ │ │ ├── aibtc-timed-vault-dao.clar │ │ │ │ ├── aibtc-timed-vault-sbtc.clar │ │ │ │ ├── aibtc-timed-vault-stx.clar │ │ │ │ ├── aibtc-token-owner.clar │ │ │ │ └── aibtc-treasury.clar │ │ │ ├── proposals │ │ │ │ ├── aibtc-action-proposals-set-proposal-bond.clar │ │ │ │ ├── aibtc-base-add-new-extension.clar │ │ │ │ ├── aibtc-base-bootstrap-initialization-v2.clar │ │ │ │ ├── aibtc-base-disable-extension.clar │ │ │ │ ├── aibtc-base-enable-extension.clar │ │ │ │ ├── aibtc-base-replace-extension-proposal-voting.clar │ │ │ │ ├── aibtc-base-replace-extension.clar │ │ │ │ ├── aibtc-core-proposals-set-proposal-bond.clar │ │ │ │ ├── aibtc-dao-charter-set-dao-charter.clar │ │ │ │ ├── aibtc-onchain-messaging-send.clar │ │ │ │ ├── aibtc-pmt-dao-add-resource.clar │ │ │ │ ├── aibtc-pmt-dao-set-payment-address.clar │ │ │ │ ├── aibtc-pmt-dao-toggle-resource-by-name.clar │ │ │ │ ├── aibtc-pmt-dao-toggle-resource.clar │ │ │ │ ├── aibtc-pmt-sbtc-add-resource.clar │ │ │ │ ├── aibtc-pmt-sbtc-set-payment-address.clar │ │ │ │ ├── aibtc-pmt-sbtc-toggle-resource-by-name.clar │ │ │ │ ├── aibtc-pmt-sbtc-toggle-resource.clar │ │ │ │ ├── aibtc-pmt-stx-add-resource.clar │ │ │ │ ├── aibtc-pmt-stx-set-payment-address.clar │ │ │ │ ├── aibtc-pmt-stx-toggle-resource-by-name.clar │ │ │ │ ├── aibtc-pmt-stx-toggle-resource.clar │ │ │ │ ├── aibtc-timed-vault-dao-initialize-new-vault.clar │ │ │ │ ├── aibtc-timed-vault-dao-override-last-withdrawal-block.clar │ │ │ │ ├── aibtc-timed-vault-dao-set-account-holder.clar │ │ │ │ ├── aibtc-timed-vault-dao-set-withdrawal-amount.clar │ │ │ │ ├── aibtc-timed-vault-dao-set-withdrawal-period.clar │ │ │ │ ├── aibtc-timed-vault-dao-withdraw.clar │ │ │ │ ├── aibtc-timed-vault-initialize-new-account.clar │ │ │ │ ├── aibtc-timed-vault-override-last-withdrawal-block.clar │ │ │ │ ├── aibtc-timed-vault-sbtc-initialize-new-vault.clar │ │ │ │ ├── aibtc-timed-vault-sbtc-override-last-withdrawal-block.clar │ │ │ │ ├── aibtc-timed-vault-sbtc-set-account-holder.clar │ │ │ │ ├── aibtc-timed-vault-sbtc-set-withdrawal-amount.clar │ │ │ │ ├── aibtc-timed-vault-sbtc-set-withdrawal-period.clar │ │ │ │ ├── aibtc-timed-vault-sbtc-withdraw.clar │ │ │ │ ├── aibtc-timed-vault-set-account-holder.clar │ │ │ │ ├── aibtc-timed-vault-set-withdrawal-amount.clar │ │ │ │ ├── aibtc-timed-vault-set-withdrawal-period.clar │ │ │ │ ├── aibtc-timed-vault-stx-initialize-new-vault.clar │ │ │ │ ├── aibtc-timed-vault-stx-override-last-withdrawal-block.clar │ │ │ │ ├── aibtc-timed-vault-stx-set-account-holder.clar │ │ │ │ ├── aibtc-timed-vault-stx-set-withdrawal-amount.clar │ │ │ │ ├── aibtc-timed-vault-stx-set-withdrawal-period.clar │ │ │ │ ├── aibtc-timed-vault-stx-withdraw.clar │ │ │ │ ├── aibtc-token-owner-set-token-uri.clar │ │ │ │ ├── aibtc-token-owner-transfer-ownership.clar │ │ │ │ ├── aibtc-treasury-allow-asset.clar │ │ │ │ ├── aibtc-treasury-delegate-stx.clar │ │ │ │ ├── aibtc-treasury-disable-asset.clar │ │ │ │ ├── aibtc-treasury-revoke-delegation.clar │ │ │ │ ├── aibtc-treasury-withdraw-ft.clar │ │ │ │ ├── aibtc-treasury-withdraw-nft.clar │ │ │ │ └── aibtc-treasury-withdraw-stx.clar │ │ │ └── token │ │ │ │ ├── aibtc-bitflow-pool.clar │ │ │ │ ├── aibtc-pre-dex.clar │ │ │ │ ├── aibtc-token-dex.clar │ │ │ │ └── aibtc-token.clar │ │ └── smart-wallet │ │ │ └── aibtc-user-agent-smart-wallet.clar │ └── types │ │ └── dao-types.ts ├── api │ ├── contract-calls-client.ts │ └── token-info-service.ts ├── dexterity │ ├── add-liquidity.ts │ ├── client.ts │ ├── deploy-engine.ts │ ├── deploy-vault.ts │ ├── get-swap-quote.ts │ ├── get-tokens.ts │ ├── get-vaults.ts │ ├── remove-liquidity.ts │ └── swap-tokens.ts ├── index.ts ├── jing │ ├── README.md │ ├── ask.ts │ ├── bid.ts │ ├── cancel-ask.ts │ ├── cancel-bid.ts │ ├── debug.ts │ ├── get-ask.ts │ ├── get-bid.ts │ ├── get-market.ts │ ├── get-pending-orders.ts │ ├── get-private-offers.ts │ ├── get-user-offers.ts │ ├── list-markets.ts │ ├── reprice-ask.ts │ ├── reprice-bid.ts │ ├── submit-ask.ts │ └── submit-bid.ts ├── sip-009-nft │ ├── get-last-token-id.ts │ ├── get-owner.ts │ ├── get-token-uri.ts │ └── transfer.ts ├── sip-010-ft │ ├── deploy.ts │ ├── get-balance.ts │ ├── get-ft-holders.ts │ ├── get-token-info.ts │ └── transfer.ts ├── stacks-alex │ ├── get-all-possible-routes.ts │ ├── get-all-swaps.ts │ ├── get-amount-to.ts │ ├── get-balances.ts │ ├── get-fee-rate.ts │ ├── get-latest-prices.ts │ ├── get-route.ts │ ├── get-routes-with-details.ts │ ├── get-swappable-currencies.ts │ ├── get-token-info.ts │ ├── get-way-points.ts │ ├── run-swap.ts │ ├── sponsored-broadcast.ts │ └── sponsored-swap.ts ├── stacks-bitflow │ ├── exec-swap.ts │ ├── get-swap-options.ts │ ├── get-swap-params.ts │ ├── get-swap-route-quote.ts │ ├── get-swap-routes.ts │ ├── get-swaps.ts │ └── get-tokens.ts ├── stacks-contracts │ ├── deploy-contract-from-file.ts │ ├── deploy-contract.ts │ ├── get-contract-source-code.ts │ └── services │ │ └── contract-deployer.ts ├── stacks-faktory │ ├── README.md │ ├── exec-buy-stx.ts │ ├── exec-buy.ts │ ├── exec-sell.ts │ ├── get-buy-quote-stx.ts │ ├── get-buy-quote.ts │ ├── get-dao-tokens.ts │ ├── get-faktory-sbtc.ts │ ├── get-sell-quote.ts │ ├── get-token-trades.ts │ └── get-token.ts ├── stacks-stacking │ ├── pox-4 │ │ ├── allow-contract-caller.ts │ │ ├── delegate-stack-stx.ts │ │ ├── delegate-stx.ts │ │ └── revoke-delegate-stx.ts │ └── stacking-dao │ │ ├── deposit.ts │ │ ├── initiateWithdraw.ts │ │ ├── stacking-dao-utilities.ts │ │ └── withdraw.ts ├── stacks-transactions │ ├── get-transaction-status.ts │ ├── get-transaction.ts │ └── get-transactions-by-address.ts ├── stacks-wallet │ ├── get-address-balance-detailed.ts │ ├── get-address-balance.ts │ ├── get-contest-wallet-addresses.ts │ ├── get-my-wallet-address.ts │ ├── get-my-wallet-balance.ts │ ├── get-my-wallet-status.ts │ ├── get-my-wallet-transactions.ts │ ├── sign-message-example.ts │ ├── sign-message.ts │ ├── sign.ts │ ├── testnet-stx-faucet-me.ts │ ├── testnet-stx-faucet.ts │ ├── transfer-my-stx.ts │ └── verify.ts └── utilities.ts ├── tsconfig.json └── tsup.config.ts /.dockerignore: -------------------------------------------------------------------------------- 1 | node_modules 2 | Dockerfile* 3 | docker-compose* 4 | .dockerignore 5 | .git 6 | .gitignore 7 | README.md 8 | LICENSE 9 | .vscode 10 | Makefile 11 | helm-charts 12 | .env 13 | .editorconfig 14 | .idea 15 | coverage* 16 | dist 17 | bun.lockb -------------------------------------------------------------------------------- /.env.example: -------------------------------------------------------------------------------- 1 | # testnet or mainnet 2 | NETWORK=testnet 3 | # seed phrase for scripts to use 4 | MNEMONIC=use a twelve or twenty four word seed phrase for the scripts and be sure to keep it safe and never share with anyone 5 | # the index of the account to use for the scripts 6 | # first account = index 0 7 | ACCOUNT_INDEX=0 8 | 9 | # bitflow keys you can get from their discord 10 | BITFLOW_API_HOST= 11 | BITFLOW_API_KEY= 12 | BITFLOW_STACKS_API_HOST=https://api.hiro.so/ 13 | BITFLOW_READONLY_CALL_API_HOST= 14 | 15 | JING_API_URL=https://backend-neon-ecru.vercel.app/api 16 | JING_API_KEY=dev-api-token 17 | 18 | HIRO_API_KEY=your-api-key 19 | 20 | AIBTC_DEFAULT_FEE=100000 # in uSTX = 0.1 STX 21 | AIBTC_FAKTORY_API_KEY=your-api-key 22 | AIBTC_CORE_API_KEY=your-api-key 23 | -------------------------------------------------------------------------------- /.github/dependabot.yml: -------------------------------------------------------------------------------- 1 | # To get started with Dependabot version updates, you'll need to specify which 2 | # package ecosystems to update and where the package manifests are located. 3 | # Please see the documentation for all configuration options: 4 | # https://docs.github.com/code-security/dependabot/dependabot-version-updates/configuration-options-for-the-dependabot.yml-file 5 | 6 | version: 2 7 | updates: 8 | - package-ecosystem: "bun" # See documentation for possible values 9 | directory: "/" # Location of package manifests 10 | schedule: 11 | interval: "daily" 12 | target-branch: "main" 13 | groups: 14 | dev-dependencies: 15 | patterns: 16 | - "*" -------------------------------------------------------------------------------- /.github/workflows/docker-image.yml: -------------------------------------------------------------------------------- 1 | name: Docker Image CI 2 | 3 | on: 4 | push: 5 | branches: [ "main", "staging" ] 6 | pull_request: 7 | branches: [ "main", "staging" ] 8 | 9 | jobs: 10 | 11 | build: 12 | 13 | runs-on: ubuntu-latest 14 | 15 | steps: 16 | - uses: actions/checkout@v4 17 | with: 18 | submodules: true 19 | - name: Build the Docker image 20 | run: docker build . --file Dockerfile --tag my-image-name:$(date +%s) 21 | -------------------------------------------------------------------------------- /.gitignore: -------------------------------------------------------------------------------- 1 | .env 2 | node_modules 3 | .DS_Store 4 | dist 5 | .aider* 6 | # generated clarity contracts for debugging 7 | generated 8 | -------------------------------------------------------------------------------- /.npmignore: -------------------------------------------------------------------------------- 1 | # Source 2 | src/ 3 | generated/ 4 | tests/ 5 | 6 | # Config files 7 | .gitignore 8 | .prettierrc 9 | .eslintrc 10 | tsconfig.json 11 | bun.lockb 12 | 13 | # Dev files 14 | *.test.ts 15 | *.spec.ts 16 | 17 | # IDE 18 | .vscode/ 19 | .idea/ 20 | 21 | # Logs 22 | *.log -------------------------------------------------------------------------------- /Dockerfile: -------------------------------------------------------------------------------- 1 | # Use the official Bun image 2 | FROM oven/bun:latest AS base 3 | WORKDIR /usr/src/app 4 | COPY package.json bun.lock ./ 5 | RUN bun install --frozen-lockfile 6 | COPY . . 7 | 8 | # Set ENTRYPOINT to bun run for CLI usage 9 | ENTRYPOINT ["bun", "run"] -------------------------------------------------------------------------------- /bun.lockb: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/aibtcdev/agent-tools-ts/2b0d11f5d1ef063a49455fb1e4ac77367ac6d521/bun.lockb -------------------------------------------------------------------------------- /package.json: -------------------------------------------------------------------------------- 1 | { 2 | "name": "@aibtc/agent-tools", 3 | "version": "0.0.1", 4 | "private": false, 5 | "publishConfig": { 6 | "access": "public" 7 | }, 8 | "main": "./dist/index.js", 9 | "module": "./dist/index.js", 10 | "types": "./dist/index.d.ts", 11 | "exports": { 12 | ".": { 13 | "types": "./dist/index.d.ts", 14 | "require": "./dist/index.cjs", 15 | "import": "./dist/index.js", 16 | "default": "./dist/index.js" 17 | } 18 | }, 19 | "files": [ 20 | "dist" 21 | ], 22 | "dependencies": { 23 | "@bitflowlabs/core-sdk": "^2.2.0", 24 | "@faktoryfun/core-sdk": "^0.3.1", 25 | "@jingcash/core-sdk": "^0.1.10", 26 | "@stacks/blockchain-api-client": "^8.11.1", 27 | "@stacks/bns": "^7.1.0", 28 | "@stacks/connect": "^8.1.9", 29 | "@stacks/encryption": "^7.1.0", 30 | "@stacks/stacking": "^7.1.0", 31 | "@stacks/stacks-blockchain-api-types": "^7.14.1", 32 | "@stacks/transactions": "^7.1.0", 33 | "@stacks/wallet-sdk": "^7.1.0", 34 | "alex-sdk": "^3.2.1", 35 | "bitflow-sdk": "^1.6.1", 36 | "chalk": "^5.4.1", 37 | "commander": "^14.0.0", 38 | "dexterity-sdk": "0.8.28", 39 | "dotenv": "^16.5.0", 40 | "eta": "^3.5.0", 41 | "ora": "^8.2.0", 42 | "stxcity-sdk": "^1.0.10", 43 | "tslib": "^2.8.1" 44 | }, 45 | "devDependencies": { 46 | "@aibtc/types": "^0.2.13", 47 | "@types/bun": "^1.2.15", 48 | "@types/node": "^22.15.30", 49 | "bun-types": "^1.2.15", 50 | "tsup": "^8.5.0", 51 | "typescript": "^5.8.3" 52 | }, 53 | "scripts": { 54 | "build": "tsup", 55 | "dev": "tsup --watch", 56 | "typecheck": "tsc --noEmit", 57 | "test": "echo \"No tests specified - skipping tests\" && exit 0", 58 | "version:patch": "npm version patch -m \"chore: release v%s\"", 59 | "version:minor": "npm version minor -m \"chore: release v%s\"", 60 | "version:major": "npm version major -m \"chore: release v%s\"", 61 | "release:patch": "npm run build && npm run version:patch && npm publish && git push --follow-tags", 62 | "release:minor": "npm run build && npm run version:minor && npm publish && git push --follow-tags", 63 | "release:major": "npm run build && npm run version:major && npm publish && git push --follow-tags", 64 | "preversion": "npm run build && npm test", 65 | "postversion": "git push && git push --tags", 66 | "prepublishOnly": "npm run build && npm test" 67 | } 68 | } 69 | -------------------------------------------------------------------------------- /src/aibtc-cohort-0/agent-account/read-only/get-configuration.ts: -------------------------------------------------------------------------------- 1 | import { fetchCallReadOnlyFunction, cvToValue } from "@stacks/transactions"; 2 | import { 3 | CONFIG, 4 | createErrorResponse, 5 | deriveChildAccount, 6 | getNetwork, 7 | isValidContractPrincipal, 8 | sendToLLM, 9 | ToolResponse, 10 | } from "../../../utilities"; 11 | 12 | const usage = "Usage: bun run get-configuration.ts "; 13 | const usageExample = 14 | "Example: bun run get-configuration.ts ST1PQHQKV0RJXZFY1DGX8MNSNYVE3VGZJSRTPGZGM.aibtc-agent-account-test"; 15 | 16 | interface ExpectedArgs { 17 | agentAccountContract: string; 18 | } 19 | 20 | interface AgentAccountConfiguration { 21 | account: string; 22 | agent: string; 23 | owner: string; 24 | daoToken: string; 25 | daoTokenDex: string; 26 | sbtcToken: string; 27 | } 28 | 29 | function validateArgs(): ExpectedArgs { 30 | const [agentAccountContract] = process.argv.slice(2); 31 | if (!agentAccountContract) { 32 | const errorMessage = [ 33 | `Invalid arguments: ${process.argv.slice(2).join(" ")}`, 34 | usage, 35 | usageExample, 36 | ].join("\n"); 37 | throw new Error(errorMessage); 38 | } 39 | 40 | if (!isValidContractPrincipal(agentAccountContract)) { 41 | const errorMessage = [ 42 | `Invalid agent account contract address: ${agentAccountContract}`, 43 | usage, 44 | usageExample, 45 | ].join("\n"); 46 | throw new Error(errorMessage); 47 | } 48 | 49 | return { 50 | agentAccountContract, 51 | }; 52 | } 53 | 54 | async function main(): Promise> { 55 | const args = validateArgs(); 56 | const [contractAddress, contractName] = args.agentAccountContract.split("."); 57 | 58 | const networkObj = getNetwork(CONFIG.NETWORK); 59 | const { address } = await deriveChildAccount( 60 | CONFIG.NETWORK, 61 | CONFIG.MNEMONIC, 62 | CONFIG.ACCOUNT_INDEX 63 | ); 64 | 65 | const result = await fetchCallReadOnlyFunction({ 66 | contractAddress, 67 | contractName, 68 | functionName: "get-configuration", 69 | functionArgs: [], 70 | senderAddress: address, 71 | network: networkObj, 72 | }); 73 | 74 | const configuration = cvToValue(result) as AgentAccountConfiguration; 75 | return { 76 | success: true, 77 | message: "Agent account configuration retrieved successfully", 78 | data: configuration, 79 | }; 80 | } 81 | 82 | main() 83 | .then(sendToLLM) 84 | .catch((error) => { 85 | sendToLLM(createErrorResponse(error)); 86 | process.exit(1); 87 | }); 88 | -------------------------------------------------------------------------------- /src/aibtc-cohort-0/agent-account/read-only/is-approved-asset.ts: -------------------------------------------------------------------------------- 1 | import { fetchCallReadOnlyFunction, Cl, cvToValue } from "@stacks/transactions"; 2 | import { 3 | CONFIG, 4 | createErrorResponse, 5 | deriveChildAccount, 6 | getNetwork, 7 | isValidContractPrincipal, 8 | sendToLLM, 9 | ToolResponse, 10 | } from "../../../utilities"; 11 | 12 | const usage = 13 | "Usage: bun run is-approved-asset.ts "; 14 | const usageExample = 15 | "Example: bun run is-approved-asset.ts ST1PQHQKV0RJXZFY1DGX8MNSNYVE3VGZJSRTPGZGM.aibtc-agent-account-test ST35K818S3K2GSNEBC3M35GA3W8Q7X72KF4RVM3QA.aibtc-token"; 16 | 17 | interface ExpectedArgs { 18 | agentAccountContract: string; 19 | assetContract: string; 20 | } 21 | 22 | function validateArgs(): ExpectedArgs { 23 | const [agentAccountContract, assetContract] = process.argv.slice(2); 24 | if (!agentAccountContract || !assetContract) { 25 | const errorMessage = [ 26 | `Invalid arguments: ${process.argv.slice(2).join(" ")}`, 27 | usage, 28 | usageExample, 29 | ].join("\n"); 30 | throw new Error(errorMessage); 31 | } 32 | 33 | if (!isValidContractPrincipal(agentAccountContract)) { 34 | const errorMessage = [ 35 | `Invalid agent account contract address: ${agentAccountContract}`, 36 | usage, 37 | usageExample, 38 | ].join("\n"); 39 | throw new Error(errorMessage); 40 | } 41 | if (!isValidContractPrincipal(assetContract)) { 42 | const errorMessage = [ 43 | `Invalid asset contract address: ${assetContract}`, 44 | usage, 45 | usageExample, 46 | ].join("\n"); 47 | throw new Error(errorMessage); 48 | } 49 | 50 | return { 51 | agentAccountContract, 52 | assetContract, 53 | }; 54 | } 55 | 56 | async function main(): Promise> { 57 | const args = validateArgs(); 58 | const [contractAddress, contractName] = args.agentAccountContract.split("."); 59 | 60 | const networkObj = getNetwork(CONFIG.NETWORK); 61 | const { address } = await deriveChildAccount( 62 | CONFIG.NETWORK, 63 | CONFIG.MNEMONIC, 64 | CONFIG.ACCOUNT_INDEX 65 | ); 66 | 67 | const result = await fetchCallReadOnlyFunction({ 68 | contractAddress, 69 | contractName, 70 | functionName: "is-approved-asset", 71 | functionArgs: [Cl.principal(args.assetContract)], 72 | senderAddress: address, 73 | network: networkObj, 74 | }); 75 | 76 | const isApproved = cvToValue(result, true) as boolean; 77 | return { 78 | success: true, 79 | message: "Asset approval status retrieved successfully", 80 | data: isApproved, 81 | }; 82 | } 83 | 84 | main() 85 | .then(sendToLLM) 86 | .catch((error) => { 87 | sendToLLM(createErrorResponse(error)); 88 | process.exit(1); 89 | }); 90 | -------------------------------------------------------------------------------- /src/aibtc-cohort-0/agent-account/read-only/is-approved-dex.ts: -------------------------------------------------------------------------------- 1 | import { fetchCallReadOnlyFunction, Cl, cvToValue } from "@stacks/transactions"; 2 | import { 3 | CONFIG, 4 | createErrorResponse, 5 | deriveChildAccount, 6 | getNetwork, 7 | isValidContractPrincipal, 8 | sendToLLM, 9 | ToolResponse, 10 | } from "../../../utilities"; 11 | 12 | const usage = 13 | "Usage: bun run is-approved-dex.ts "; 14 | const usageExample = 15 | "Example: bun run is-approved-dex.ts ST1PQHQKV0RJXZFY1DGX8MNSNYVE3VGZJSRTPGZGM.aibtc-agent-account-test ST3DD7MASYJADCFXN3745R11RVM4PCXCPVRS3V27K.facey-faktory-dex"; 16 | 17 | interface ExpectedArgs { 18 | agentAccountContract: string; 19 | dexContract: string; 20 | } 21 | 22 | function validateArgs(): ExpectedArgs { 23 | const [agentAccountContract, dexContract] = process.argv.slice(2); 24 | if (!agentAccountContract || !dexContract) { 25 | const errorMessage = [ 26 | `Invalid arguments: ${process.argv.slice(2).join(" ")}`, 27 | usage, 28 | usageExample, 29 | ].join("\n"); 30 | throw new Error(errorMessage); 31 | } 32 | 33 | if (!isValidContractPrincipal(agentAccountContract)) { 34 | const errorMessage = [ 35 | `Invalid agent account contract address: ${agentAccountContract}`, 36 | usage, 37 | usageExample, 38 | ].join("\n"); 39 | throw new Error(errorMessage); 40 | } 41 | if (!isValidContractPrincipal(dexContract)) { 42 | const errorMessage = [ 43 | `Invalid DEX contract address: ${dexContract}`, 44 | usage, 45 | usageExample, 46 | ].join("\n"); 47 | throw new Error(errorMessage); 48 | } 49 | 50 | return { 51 | agentAccountContract, 52 | dexContract, 53 | }; 54 | } 55 | 56 | async function main(): Promise> { 57 | const args = validateArgs(); 58 | const [contractAddress, contractName] = args.agentAccountContract.split("."); 59 | 60 | const networkObj = getNetwork(CONFIG.NETWORK); 61 | const { address } = await deriveChildAccount( 62 | CONFIG.NETWORK, 63 | CONFIG.MNEMONIC, 64 | CONFIG.ACCOUNT_INDEX 65 | ); 66 | 67 | const result = await fetchCallReadOnlyFunction({ 68 | contractAddress, 69 | contractName, 70 | functionName: "is-approved-dex", 71 | functionArgs: [Cl.principal(args.dexContract)], 72 | senderAddress: address, 73 | network: networkObj, 74 | }); 75 | 76 | const isApproved = cvToValue(result, true) as boolean; 77 | return { 78 | success: true, 79 | message: "DEX approval status retrieved successfully", 80 | data: isApproved, 81 | }; 82 | } 83 | 84 | main() 85 | .then(sendToLLM) 86 | .catch((error) => { 87 | sendToLLM(createErrorResponse(error)); 88 | process.exit(1); 89 | }); 90 | -------------------------------------------------------------------------------- /src/aibtc-cohort-0/utils/deploy-contract.ts: -------------------------------------------------------------------------------- 1 | import { 2 | ClarityVersion, 3 | makeContractDeploy, 4 | PostConditionMode, 5 | } from "@stacks/transactions"; 6 | import { 7 | AibtcCorePostResponse, 8 | broadcastTx, 9 | getNetwork, 10 | ToolResponse, 11 | TxBroadcastResultWithLink, 12 | } from "../../utilities"; 13 | import { ContractResponse } from "@aibtc/types"; 14 | import { validateNetwork } from "@faktoryfun/core-sdk"; 15 | 16 | export type BroadcastedContractResponse = ContractResponse & 17 | TxBroadcastResultWithLink; 18 | 19 | export type BroadcastedAndPostedResponse = { 20 | broadcastedContracts: Record; 21 | aibtcCoreResponse: AibtcCorePostResponse; 22 | }; 23 | 24 | export type DeploymentOptions = { 25 | address: string; 26 | key: string; 27 | network: string; 28 | nonce: number; 29 | }; 30 | 31 | function validateClarityVersion( 32 | version: number | ClarityVersion 33 | ): ClarityVersion { 34 | const validVersions = Object.values(ClarityVersion); 35 | if (!validVersions.includes(version)) { 36 | throw new Error( 37 | `Invalid Clarity version: ${version}. Valid versions are: ${validVersions.join( 38 | ", " 39 | )}` 40 | ); 41 | } 42 | return version as ClarityVersion; 43 | } 44 | 45 | export async function deployContract( 46 | contract: ContractResponse, 47 | deploymentOptions: DeploymentOptions 48 | ): Promise> { 49 | const { name, displayName, source } = contract; 50 | const { address, key, network, nonce } = deploymentOptions; 51 | //console.log(`Deploying contract ${name} from address: ${address}`); 52 | 53 | // Setup the contract deployer 54 | const validNetwork = validateNetwork(network); 55 | const networkObj = getNetwork(validNetwork); 56 | const validClarityVersion = validateClarityVersion( 57 | contract.clarityVersion ?? 3 // default to latest 58 | ); 59 | if (!source) { 60 | throw new Error(`Contract source code is empty`); 61 | } 62 | 63 | const transaction = await makeContractDeploy({ 64 | contractName: displayName ?? name, 65 | codeBody: source, 66 | senderKey: key, 67 | nonce: nonce ?? 0, 68 | network: validNetwork, 69 | clarityVersion: validClarityVersion, 70 | postConditions: [], // empty, no transfers expected 71 | postConditionMode: PostConditionMode.Deny, 72 | }); 73 | 74 | const broadcastResponse = await broadcastTx(transaction, networkObj); 75 | 76 | const fullResponse: BroadcastedContractResponse = { 77 | ...contract, 78 | ...broadcastResponse.data!, 79 | }; 80 | 81 | return { 82 | success: broadcastResponse.success, 83 | message: broadcastResponse.message, 84 | data: fullResponse, 85 | }; 86 | } 87 | -------------------------------------------------------------------------------- /src/aibtc-dao/extensions/action-proposals/read-only/get-proposal-bond.ts: -------------------------------------------------------------------------------- 1 | import { fetchCallReadOnlyFunction, cvToValue } from "@stacks/transactions"; 2 | import { 3 | CONFIG, 4 | createErrorResponse, 5 | deriveChildAccount, 6 | getNetwork, 7 | sendToLLM, 8 | ToolResponse, 9 | } from "../../../../utilities"; 10 | 11 | const usage = 12 | "Usage: bun run get-proposal-bond.ts "; 13 | const usageExample = 14 | "Example: bun run get-proposal-bond.ts ST35K818S3K2GSNEBC3M35GA3W8Q7X72KF4RVM3QA.aibtc-action-proposals-v2"; 15 | 16 | interface ExpectedArgs { 17 | daoActionProposalsExtensionContract: string; 18 | } 19 | 20 | function validateArgs(): ExpectedArgs { 21 | // verify all required arguments are provided 22 | const [daoActionProposalsExtensionContract] = process.argv.slice(2); 23 | if (!daoActionProposalsExtensionContract) { 24 | const errorMessage = [ 25 | `Invalid arguments: ${process.argv.slice(2).join(" ")}`, 26 | usage, 27 | usageExample, 28 | ].join("\n"); 29 | throw new Error(errorMessage); 30 | } 31 | // verify contract addresses extracted from arguments 32 | const [extensionAddress, extensionName] = 33 | daoActionProposalsExtensionContract.split("."); 34 | if (!extensionAddress || !extensionName) { 35 | const errorMessage = [ 36 | `Invalid contract address: ${daoActionProposalsExtensionContract}`, 37 | usage, 38 | usageExample, 39 | ].join("\n"); 40 | throw new Error(errorMessage); 41 | } 42 | // return validated arguments 43 | return { 44 | daoActionProposalsExtensionContract, 45 | }; 46 | } 47 | 48 | async function main(): Promise> { 49 | // validate and store provided args 50 | const args = validateArgs(); 51 | const [extensionAddress, extensionName] = 52 | args.daoActionProposalsExtensionContract.split("."); 53 | // setup network and wallet info 54 | const networkObj = getNetwork(CONFIG.NETWORK); 55 | const { address } = await deriveChildAccount( 56 | CONFIG.NETWORK, 57 | CONFIG.MNEMONIC, 58 | CONFIG.ACCOUNT_INDEX 59 | ); 60 | // call read-only function 61 | const result = await fetchCallReadOnlyFunction({ 62 | contractAddress: extensionAddress, 63 | contractName: extensionName, 64 | functionName: "get-proposal-bond", 65 | functionArgs: [], 66 | senderAddress: address, 67 | network: networkObj, 68 | }); 69 | // extract and return response 70 | const proposalBond = parseInt(cvToValue(result, true)); 71 | if (isNaN(proposalBond)) { 72 | throw new Error(`Failed to retrieve proposal bond: ${result}`); 73 | } 74 | return { 75 | success: true, 76 | message: "Proposal bond successfully retrieved", 77 | data: proposalBond, 78 | }; 79 | } 80 | 81 | main() 82 | .then(sendToLLM) 83 | .catch((error) => { 84 | sendToLLM(createErrorResponse(error)); 85 | process.exit(1); 86 | }); 87 | -------------------------------------------------------------------------------- /src/aibtc-dao/extensions/action-proposals/read-only/get-voting-configuration.ts: -------------------------------------------------------------------------------- 1 | import { fetchCallReadOnlyFunction, cvToJSON } from "@stacks/transactions"; 2 | import { 3 | CONFIG, 4 | createErrorResponse, 5 | deriveChildAccount, 6 | getNetwork, 7 | sendToLLM, 8 | ToolResponse, 9 | } from "../../../../utilities"; 10 | 11 | const usage = 12 | "Usage: bun run get-voting-configuration.ts "; 13 | const usageExample = 14 | "Example: bun run get-voting-configuration.ts ST35K818S3K2GSNEBC3M35GA3W8Q7X72KF4RVM3QA.aibtc-action-proposals-v2"; 15 | 16 | interface ExpectedArgs { 17 | daoActionProposalsExtensionContract: string; 18 | } 19 | 20 | function validateArgs(): ExpectedArgs { 21 | // verify all required arguments are provided 22 | const [daoActionProposalsExtensionContract] = process.argv.slice(2); 23 | if (!daoActionProposalsExtensionContract) { 24 | const errorMessage = [ 25 | `Invalid arguments: ${process.argv.slice(2).join(" ")}`, 26 | usage, 27 | usageExample, 28 | ].join("\n"); 29 | throw new Error(errorMessage); 30 | } 31 | // verify contract addresses extracted from arguments 32 | const [extensionAddress, extensionName] = 33 | daoActionProposalsExtensionContract.split("."); 34 | if (!extensionAddress || !extensionName) { 35 | const errorMessage = [ 36 | `Invalid contract address: ${daoActionProposalsExtensionContract}`, 37 | usage, 38 | usageExample, 39 | ].join("\n"); 40 | throw new Error(errorMessage); 41 | } 42 | // return validated arguments 43 | return { 44 | daoActionProposalsExtensionContract, 45 | }; 46 | } 47 | 48 | // TODO: type this based on voting config object 49 | async function main(): Promise> { 50 | // validate and store provided args 51 | const args = validateArgs(); 52 | const [extensionAddress, extensionName] = 53 | args.daoActionProposalsExtensionContract.split("."); 54 | // setup network and wallet info 55 | const networkObj = getNetwork(CONFIG.NETWORK); 56 | const { address } = await deriveChildAccount( 57 | CONFIG.NETWORK, 58 | CONFIG.MNEMONIC, 59 | CONFIG.ACCOUNT_INDEX 60 | ); 61 | // get voting configuration 62 | const result = await fetchCallReadOnlyFunction({ 63 | contractAddress: extensionAddress, 64 | contractName: extensionName, 65 | functionName: "get-voting-configuration", 66 | functionArgs: [], 67 | senderAddress: address, 68 | network: networkObj, 69 | }); 70 | // return voting configuration 71 | const votingConfig = cvToJSON(result); 72 | return { 73 | success: true, 74 | message: "Voting configuration retrieved successfully", 75 | data: votingConfig, 76 | }; 77 | } 78 | 79 | main() 80 | .then(sendToLLM) 81 | .catch((error) => { 82 | sendToLLM(createErrorResponse(error)); 83 | process.exit(1); 84 | }); 85 | -------------------------------------------------------------------------------- /src/aibtc-dao/extensions/core-proposals/read-only/get-proposal-bond.ts: -------------------------------------------------------------------------------- 1 | import { fetchCallReadOnlyFunction, cvToValue } from "@stacks/transactions"; 2 | import { 3 | CONFIG, 4 | createErrorResponse, 5 | deriveChildAccount, 6 | getNetwork, 7 | sendToLLM, 8 | ToolResponse, 9 | } from "../../../../utilities"; 10 | 11 | const usage = 12 | "Usage: bun run get-proposal-bond.ts "; 13 | const usageExample = 14 | "Example: bun run get-proposal-bond.ts ST35K818S3K2GSNEBC3M35GA3W8Q7X72KF4RVM3QA.aibtc-core-proposals-v2"; 15 | 16 | interface ExpectedArgs { 17 | daoCoreProposalsExtensionContract: string; 18 | } 19 | 20 | function validateArgs(): ExpectedArgs { 21 | // verify all required arguments are provided 22 | const [daoCoreProposalsExtensionContract] = process.argv.slice(2); 23 | if (!daoCoreProposalsExtensionContract) { 24 | const errorMessage = [ 25 | `Invalid arguments: ${process.argv.slice(2).join(" ")}`, 26 | usage, 27 | usageExample, 28 | ].join("\n"); 29 | throw new Error(errorMessage); 30 | } 31 | // verify contract addresses extracted from arguments 32 | const [extensionAddress, extensionName] = 33 | daoCoreProposalsExtensionContract.split("."); 34 | if (!extensionAddress || !extensionName) { 35 | const errorMessage = [ 36 | `Invalid contract address: ${daoCoreProposalsExtensionContract}`, 37 | usage, 38 | usageExample, 39 | ].join("\n"); 40 | throw new Error(errorMessage); 41 | } 42 | // return validated arguments 43 | return { 44 | daoCoreProposalsExtensionContract, 45 | }; 46 | } 47 | 48 | async function main(): Promise> { 49 | // validate and store provided args 50 | const args = validateArgs(); 51 | const [extensionAddress, extensionName] = 52 | args.daoCoreProposalsExtensionContract.split("."); 53 | // setup network and wallet info 54 | const networkObj = getNetwork(CONFIG.NETWORK); 55 | const { address } = await deriveChildAccount( 56 | CONFIG.NETWORK, 57 | CONFIG.MNEMONIC, 58 | CONFIG.ACCOUNT_INDEX 59 | ); 60 | // call read-only function 61 | const result = await fetchCallReadOnlyFunction({ 62 | contractAddress: extensionAddress, 63 | contractName: extensionName, 64 | functionName: "get-proposal-bond", 65 | functionArgs: [], 66 | senderAddress: address, 67 | network: networkObj, 68 | }); 69 | // extract and return result 70 | const proposalBond = parseInt(cvToValue(result, true)); 71 | if (isNaN(proposalBond)) { 72 | throw new Error(`Failed to retrieve proposal bond: ${result}`); 73 | } 74 | return { 75 | success: true, 76 | message: "Proposal bond successfully retrieved", 77 | data: proposalBond, 78 | }; 79 | } 80 | 81 | main() 82 | .then(sendToLLM) 83 | .catch((error) => { 84 | sendToLLM(createErrorResponse(error)); 85 | process.exit(1); 86 | }); 87 | -------------------------------------------------------------------------------- /src/aibtc-dao/extensions/core-proposals/read-only/get-voting-configuration.ts: -------------------------------------------------------------------------------- 1 | import { fetchCallReadOnlyFunction, cvToJSON } from "@stacks/transactions"; 2 | import { 3 | CONFIG, 4 | createErrorResponse, 5 | deriveChildAccount, 6 | getNetwork, 7 | sendToLLM, 8 | ToolResponse, 9 | } from "../../../../utilities"; 10 | 11 | const usage = 12 | "Usage: bun run get-voting-configuration.ts "; 13 | const usageExample = 14 | "Example: bun run get-voting-configuration.ts ST35K818S3K2GSNEBC3M35GA3W8Q7X72KF4RVM3QA.aibtc-core-proposals-v2"; 15 | 16 | interface ExpectedArgs { 17 | daoCoreProposalsExtensionContract: string; 18 | } 19 | 20 | function validateArgs(): ExpectedArgs { 21 | // verify all required arguments are provided 22 | const [daoCoreProposalsExtensionContract] = process.argv.slice(2); 23 | if (!daoCoreProposalsExtensionContract) { 24 | const errorMessage = [ 25 | `Invalid arguments: ${process.argv.slice(2).join(" ")}`, 26 | usage, 27 | usageExample, 28 | ].join("\n"); 29 | throw new Error(errorMessage); 30 | } 31 | // verify contract addresses extracted from arguments 32 | const [extensionAddress, extensionName] = 33 | daoCoreProposalsExtensionContract.split("."); 34 | if (!extensionAddress || !extensionName) { 35 | const errorMessage = [ 36 | `Invalid contract address: ${daoCoreProposalsExtensionContract}`, 37 | usage, 38 | usageExample, 39 | ].join("\n"); 40 | throw new Error(errorMessage); 41 | } 42 | // return validated arguments 43 | return { 44 | daoCoreProposalsExtensionContract, 45 | }; 46 | } 47 | 48 | // TODO: type this based on voting config object 49 | async function main(): Promise> { 50 | // validate and store provided args 51 | const args = validateArgs(); 52 | const [extensionAddress, extensionName] = 53 | args.daoCoreProposalsExtensionContract.split("."); 54 | // setup network and wallet info 55 | const networkObj = getNetwork(CONFIG.NETWORK); 56 | const { address } = await deriveChildAccount( 57 | CONFIG.NETWORK, 58 | CONFIG.MNEMONIC, 59 | CONFIG.ACCOUNT_INDEX 60 | ); 61 | // get voting configuration 62 | const result = await fetchCallReadOnlyFunction({ 63 | contractAddress: extensionAddress, 64 | contractName: extensionName, 65 | functionName: "get-voting-configuration", 66 | functionArgs: [], 67 | senderAddress: address, 68 | network: networkObj, 69 | }); 70 | // return voting configuration 71 | const votingConfig = cvToJSON(result); 72 | return { 73 | success: true, 74 | message: "Voting configuration retrieved successfully", 75 | data: votingConfig, 76 | }; 77 | } 78 | 79 | main() 80 | .then(sendToLLM) 81 | .catch((error) => { 82 | sendToLLM(createErrorResponse(error)); 83 | process.exit(1); 84 | }); 85 | -------------------------------------------------------------------------------- /src/aibtc-dao/extensions/dao-charter/read-only/get-current-dao-charter-version.ts: -------------------------------------------------------------------------------- 1 | import { 2 | fetchCallReadOnlyFunction, 3 | ClarityType, 4 | cvToValue, 5 | } from "@stacks/transactions"; 6 | import { 7 | CONFIG, 8 | createErrorResponse, 9 | deriveChildAccount, 10 | getNetwork, 11 | sendToLLM, 12 | ToolResponse, 13 | } from "../../../../utilities"; 14 | 15 | const usage = 16 | "Usage: bun run get-current-dao-charter-version.ts "; 17 | const usageExample = 18 | "Example: bun run get-current-dao-charter-version.ts ST35K818S3K2GSNEBC3M35GA3W8Q7X72KF4RVM3QA.aibtc-charter"; 19 | 20 | interface ExpectedArgs { 21 | daoCharterContract: string; 22 | } 23 | 24 | function validateArgs(): ExpectedArgs { 25 | // verify all required arguments are provided 26 | const [daoCharterContract] = process.argv.slice(2); 27 | if (!daoCharterContract) { 28 | const errorMessage = [ 29 | `Invalid arguments: ${process.argv.slice(2).join(" ")}`, 30 | usage, 31 | usageExample, 32 | ].join("\n"); 33 | throw new Error(errorMessage); 34 | } 35 | // verify contract addresses extracted from arguments 36 | const [contractAddress, contractName] = daoCharterContract.split("."); 37 | if (!contractAddress || !contractName) { 38 | const errorMessage = [ 39 | `Invalid contract address: ${daoCharterContract}`, 40 | usage, 41 | usageExample, 42 | ].join("\n"); 43 | throw new Error(errorMessage); 44 | } 45 | // return validated arguments 46 | return { 47 | daoCharterContract, 48 | }; 49 | } 50 | 51 | async function main(): Promise> { 52 | // validate and store provided args 53 | const args = validateArgs(); 54 | const [contractAddress, contractName] = args.daoCharterContract.split("."); 55 | // setup network and wallet info 56 | const networkObj = getNetwork(CONFIG.NETWORK); 57 | const { address } = await deriveChildAccount( 58 | CONFIG.NETWORK, 59 | CONFIG.MNEMONIC, 60 | CONFIG.ACCOUNT_INDEX 61 | ); 62 | // get current version 63 | const result = await fetchCallReadOnlyFunction({ 64 | contractAddress, 65 | contractName, 66 | functionName: "get-current-dao-charter-version", 67 | functionArgs: [], 68 | senderAddress: address, 69 | network: networkObj, 70 | }); 71 | // extract and return version 72 | if (result.type === ClarityType.OptionalSome) { 73 | const version = cvToValue(result.value, true); 74 | return { 75 | success: true, 76 | message: "Current DAO charter version retrieved successfully", 77 | data: version, 78 | }; 79 | } else { 80 | return { 81 | success: true, 82 | message: "No DAO charter version found", 83 | data: null, 84 | }; 85 | } 86 | } 87 | 88 | main() 89 | .then(sendToLLM) 90 | .catch((error) => { 91 | sendToLLM(createErrorResponse(error)); 92 | process.exit(1); 93 | }); 94 | -------------------------------------------------------------------------------- /src/aibtc-dao/extensions/dao-charter/read-only/get-current-dao-charter.ts: -------------------------------------------------------------------------------- 1 | import { 2 | fetchCallReadOnlyFunction, 3 | ClarityType, 4 | cvToValue, 5 | } from "@stacks/transactions"; 6 | import { 7 | CONFIG, 8 | createErrorResponse, 9 | deriveChildAccount, 10 | getNetwork, 11 | sendToLLM, 12 | ToolResponse, 13 | } from "../../../../utilities"; 14 | 15 | const usage = "Usage: bun run get-current-dao-charter.ts "; 16 | const usageExample = 17 | "Example: bun run get-current-dao-charter.ts ST35K818S3K2GSNEBC3M35GA3W8Q7X72KF4RVM3QA.aibtc-charter"; 18 | 19 | interface ExpectedArgs { 20 | daoCharterContract: string; 21 | } 22 | 23 | function validateArgs(): ExpectedArgs { 24 | // verify all required arguments are provided 25 | const [daoCharterContract] = process.argv.slice(2); 26 | if (!daoCharterContract) { 27 | const errorMessage = [ 28 | `Invalid arguments: ${process.argv.slice(2).join(" ")}`, 29 | usage, 30 | usageExample, 31 | ].join("\n"); 32 | throw new Error(errorMessage); 33 | } 34 | // verify contract addresses extracted from arguments 35 | const [contractAddress, contractName] = daoCharterContract.split("."); 36 | if (!contractAddress || !contractName) { 37 | const errorMessage = [ 38 | `Invalid contract address: ${daoCharterContract}`, 39 | usage, 40 | usageExample, 41 | ].join("\n"); 42 | throw new Error(errorMessage); 43 | } 44 | // return validated arguments 45 | return { 46 | daoCharterContract, 47 | }; 48 | } 49 | 50 | async function main(): Promise> { 51 | // validate and store provided args 52 | const args = validateArgs(); 53 | const [contractAddress, contractName] = args.daoCharterContract.split("."); 54 | // setup network and wallet info 55 | const networkObj = getNetwork(CONFIG.NETWORK); 56 | const { address } = await deriveChildAccount( 57 | CONFIG.NETWORK, 58 | CONFIG.MNEMONIC, 59 | CONFIG.ACCOUNT_INDEX 60 | ); 61 | // get current charter 62 | const result = await fetchCallReadOnlyFunction({ 63 | contractAddress, 64 | contractName, 65 | functionName: "get-current-dao-charter", 66 | functionArgs: [], 67 | senderAddress: address, 68 | network: networkObj, 69 | }); 70 | // extract and return charter 71 | if (result.type === ClarityType.OptionalSome) { 72 | const charter = cvToValue(result.value, true); 73 | return { 74 | success: true, 75 | message: "Current DAO charter retrieved successfully", 76 | data: charter, 77 | }; 78 | } else { 79 | return { 80 | success: true, 81 | message: "No DAO charter found", 82 | data: null, 83 | }; 84 | } 85 | } 86 | 87 | main() 88 | .then(sendToLLM) 89 | .catch((error) => { 90 | sendToLLM(createErrorResponse(error)); 91 | process.exit(1); 92 | }); 93 | -------------------------------------------------------------------------------- /src/aibtc-dao/extensions/payment-processor/read-only/get-contract-data.ts: -------------------------------------------------------------------------------- 1 | import { 2 | fetchCallReadOnlyFunction, 3 | ClarityType, 4 | cvToValue, 5 | } from "@stacks/transactions"; 6 | import { 7 | CONFIG, 8 | createErrorResponse, 9 | deriveChildAccount, 10 | getNetwork, 11 | isValidContractPrincipal, 12 | sendToLLM, 13 | ToolResponse, 14 | } from "../../../../utilities"; 15 | 16 | const usage = "Usage: bun run get-contract-data.ts "; 17 | const usageExample = 18 | "Example: bun run get-contract-data.ts ST35K818S3K2GSNEBC3M35GA3W8Q7X72KF4RVM3QA.aibtc-payment-processor-stx"; 19 | 20 | interface ExpectedArgs { 21 | paymentProcessorContract: string; 22 | } 23 | 24 | function validateArgs(): ExpectedArgs { 25 | // verify all required arguments are provided 26 | const [paymentProcessorContract] = process.argv.slice(2); 27 | if (!paymentProcessorContract) { 28 | const errorMessage = [ 29 | `Invalid arguments: ${process.argv.slice(2).join(" ")}`, 30 | usage, 31 | usageExample, 32 | ].join("\n"); 33 | throw new Error(errorMessage); 34 | } 35 | // verify contract addresses extracted from arguments 36 | if (!isValidContractPrincipal(paymentProcessorContract)) { 37 | const errorMessage = [ 38 | `Invalid contract address: ${paymentProcessorContract}`, 39 | usage, 40 | usageExample, 41 | ].join("\n"); 42 | throw new Error(errorMessage); 43 | } 44 | // return validated arguments 45 | return { 46 | paymentProcessorContract, 47 | }; 48 | } 49 | 50 | async function main(): Promise> { 51 | // validate and store provided args 52 | const args = validateArgs(); 53 | const [contractAddress, contractName] = 54 | args.paymentProcessorContract.split("."); 55 | // setup network and wallet info 56 | const networkObj = getNetwork(CONFIG.NETWORK); 57 | const { address } = await deriveChildAccount( 58 | CONFIG.NETWORK, 59 | CONFIG.MNEMONIC, 60 | CONFIG.ACCOUNT_INDEX 61 | ); 62 | // get contract data 63 | const result = await fetchCallReadOnlyFunction({ 64 | contractAddress, 65 | contractName, 66 | functionName: "get-contract-data", 67 | functionArgs: [], 68 | senderAddress: address, 69 | network: networkObj, 70 | }); 71 | // extract and return contract data 72 | if (result.type === ClarityType.ResponseOk) { 73 | const contractData = cvToValue(result.value, true); 74 | return { 75 | success: true, 76 | message: "Contract data retrieved successfully", 77 | data: contractData, 78 | }; 79 | } else { 80 | const errorMessage = `Failed to retrieve contract data: ${JSON.stringify( 81 | result 82 | )}`; 83 | throw new Error(errorMessage); 84 | } 85 | } 86 | 87 | main() 88 | .then(sendToLLM) 89 | .catch((error) => { 90 | sendToLLM(createErrorResponse(error)); 91 | process.exit(1); 92 | }); 93 | -------------------------------------------------------------------------------- /src/aibtc-dao/extensions/payment-processor/read-only/get-payment-address.ts: -------------------------------------------------------------------------------- 1 | import { 2 | fetchCallReadOnlyFunction, 3 | ClarityType, 4 | cvToValue, 5 | } from "@stacks/transactions"; 6 | import { 7 | CONFIG, 8 | createErrorResponse, 9 | deriveChildAccount, 10 | getNetwork, 11 | isValidContractPrincipal, 12 | sendToLLM, 13 | ToolResponse, 14 | } from "../../../../utilities"; 15 | 16 | const usage = 17 | "Usage: bun run get-payment-address.ts "; 18 | const usageExample = 19 | "Example: bun run get-payment-address.ts ST35K818S3K2GSNEBC3M35GA3W8Q7X72KF4RVM3QA.aibtc-payment-processor-stx"; 20 | 21 | interface ExpectedArgs { 22 | paymentProcessorContract: string; 23 | } 24 | 25 | function validateArgs(): ExpectedArgs { 26 | // verify all required arguments are provided 27 | const [paymentProcessorContract] = process.argv.slice(2); 28 | if (!paymentProcessorContract) { 29 | const errorMessage = [ 30 | `Invalid arguments: ${process.argv.slice(2).join(" ")}`, 31 | usage, 32 | usageExample, 33 | ].join("\n"); 34 | throw new Error(errorMessage); 35 | } 36 | // verify contract addresses extracted from arguments 37 | if (!isValidContractPrincipal(paymentProcessorContract)) { 38 | const errorMessage = [ 39 | `Invalid contract address: ${paymentProcessorContract}`, 40 | usage, 41 | usageExample, 42 | ].join("\n"); 43 | throw new Error(errorMessage); 44 | } 45 | // return validated arguments 46 | return { 47 | paymentProcessorContract, 48 | }; 49 | } 50 | 51 | async function main(): Promise> { 52 | // validate and store provided args 53 | const args = validateArgs(); 54 | const [contractAddress, contractName] = 55 | args.paymentProcessorContract.split("."); 56 | // setup network and wallet info 57 | const networkObj = getNetwork(CONFIG.NETWORK); 58 | const { address } = await deriveChildAccount( 59 | CONFIG.NETWORK, 60 | CONFIG.MNEMONIC, 61 | CONFIG.ACCOUNT_INDEX 62 | ); 63 | // get payment address 64 | const result = await fetchCallReadOnlyFunction({ 65 | contractAddress, 66 | contractName, 67 | functionName: "get-payment-address", 68 | functionArgs: [], 69 | senderAddress: address, 70 | network: networkObj, 71 | }); 72 | // extract and return payment address 73 | if (result.type === ClarityType.OptionalSome) { 74 | const paymentAddress = cvToValue(result.value); 75 | return { 76 | success: true, 77 | message: "Payment address retrieved successfully", 78 | data: paymentAddress, 79 | }; 80 | } else { 81 | const errorMessage = "Payment address not found"; 82 | throw new Error(errorMessage); 83 | } 84 | } 85 | 86 | main() 87 | .then(sendToLLM) 88 | .catch((error) => { 89 | sendToLLM(createErrorResponse(error)); 90 | process.exit(1); 91 | }); 92 | -------------------------------------------------------------------------------- /src/aibtc-dao/extensions/payment-processor/read-only/get-total-invoices.ts: -------------------------------------------------------------------------------- 1 | import { fetchCallReadOnlyFunction, cvToValue } from "@stacks/transactions"; 2 | import { 3 | CONFIG, 4 | createErrorResponse, 5 | deriveChildAccount, 6 | getNetwork, 7 | isValidContractPrincipal, 8 | sendToLLM, 9 | ToolResponse, 10 | } from "../../../../utilities"; 11 | 12 | const usage = "Usage: bun run get-total-invoices.ts "; 13 | const usageExample = 14 | "Example: bun run get-total-invoices.ts ST35K818S3K2GSNEBC3M35GA3W8Q7X72KF4RVM3QA.aibtc-payment-processor-stx"; 15 | 16 | interface ExpectedArgs { 17 | paymentProcessorContract: string; 18 | } 19 | 20 | function validateArgs(): ExpectedArgs { 21 | // verify all required arguments are provided 22 | const [paymentProcessorContract] = process.argv.slice(2); 23 | if (!paymentProcessorContract) { 24 | const errorMessage = [ 25 | `Invalid arguments: ${process.argv.slice(2).join(" ")}`, 26 | usage, 27 | usageExample, 28 | ].join("\n"); 29 | throw new Error(errorMessage); 30 | } 31 | // verify contract addresses extracted from arguments 32 | if (!isValidContractPrincipal(paymentProcessorContract)) { 33 | const errorMessage = [ 34 | `Invalid contract address: ${paymentProcessorContract}`, 35 | usage, 36 | usageExample, 37 | ].join("\n"); 38 | throw new Error(errorMessage); 39 | } 40 | // return validated arguments 41 | return { 42 | paymentProcessorContract, 43 | }; 44 | } 45 | 46 | async function main(): Promise> { 47 | // validate and store provided args 48 | const args = validateArgs(); 49 | const [contractAddress, contractName] = 50 | args.paymentProcessorContract.split("."); 51 | // setup network and wallet info 52 | const networkObj = getNetwork(CONFIG.NETWORK); 53 | const { address } = await deriveChildAccount( 54 | CONFIG.NETWORK, 55 | CONFIG.MNEMONIC, 56 | CONFIG.ACCOUNT_INDEX 57 | ); 58 | // get total invoices 59 | const result = await fetchCallReadOnlyFunction({ 60 | contractAddress, 61 | contractName, 62 | functionName: "get-total-invoices", 63 | functionArgs: [], 64 | senderAddress: address, 65 | network: networkObj, 66 | }); 67 | // extract and return total invoices 68 | const totalInvoices = cvToValue(result); 69 | return { 70 | success: true, 71 | message: "Total invoices retrieved successfully", 72 | data: totalInvoices, 73 | }; 74 | } 75 | 76 | main() 77 | .then(sendToLLM) 78 | .catch((error) => { 79 | sendToLLM(createErrorResponse(error)); 80 | process.exit(1); 81 | }); 82 | -------------------------------------------------------------------------------- /src/aibtc-dao/extensions/payment-processor/read-only/get-total-resources.ts: -------------------------------------------------------------------------------- 1 | import { fetchCallReadOnlyFunction, cvToValue } from "@stacks/transactions"; 2 | import { 3 | CONFIG, 4 | createErrorResponse, 5 | deriveChildAccount, 6 | getNetwork, 7 | isValidContractPrincipal, 8 | sendToLLM, 9 | ToolResponse, 10 | } from "../../../../utilities"; 11 | 12 | const usage = 13 | "Usage: bun run get-total-resources.ts "; 14 | const usageExample = 15 | "Example: bun run get-total-resources.ts ST35K818S3K2GSNEBC3M35GA3W8Q7X72KF4RVM3QA.aibtc-payment-processor-stx"; 16 | 17 | interface ExpectedArgs { 18 | paymentProcessorContract: string; 19 | } 20 | 21 | function validateArgs(): ExpectedArgs { 22 | // verify all required arguments are provided 23 | const [paymentProcessorContract] = process.argv.slice(2); 24 | if (!paymentProcessorContract) { 25 | const errorMessage = [ 26 | `Invalid arguments: ${process.argv.slice(2).join(" ")}`, 27 | usage, 28 | usageExample, 29 | ].join("\n"); 30 | throw new Error(errorMessage); 31 | } 32 | // verify contract addresses extracted from arguments 33 | if (!isValidContractPrincipal(paymentProcessorContract)) { 34 | const errorMessage = [ 35 | `Invalid contract address: ${paymentProcessorContract}`, 36 | usage, 37 | usageExample, 38 | ].join("\n"); 39 | throw new Error(errorMessage); 40 | } 41 | // return validated arguments 42 | return { 43 | paymentProcessorContract, 44 | }; 45 | } 46 | 47 | async function main(): Promise> { 48 | // validate and store provided args 49 | const args = validateArgs(); 50 | const [contractAddress, contractName] = 51 | args.paymentProcessorContract.split("."); 52 | // setup network and wallet info 53 | const networkObj = getNetwork(CONFIG.NETWORK); 54 | const { address } = await deriveChildAccount( 55 | CONFIG.NETWORK, 56 | CONFIG.MNEMONIC, 57 | CONFIG.ACCOUNT_INDEX 58 | ); 59 | // get total resources 60 | const result = await fetchCallReadOnlyFunction({ 61 | contractAddress, 62 | contractName, 63 | functionName: "get-total-resources", 64 | functionArgs: [], 65 | senderAddress: address, 66 | network: networkObj, 67 | }); 68 | // extract and return total resources 69 | const totalResources = cvToValue(result); 70 | return { 71 | success: true, 72 | message: "Total resources retrieved successfully", 73 | data: totalResources, 74 | }; 75 | } 76 | 77 | main() 78 | .then(sendToLLM) 79 | .catch((error) => { 80 | sendToLLM(createErrorResponse(error)); 81 | process.exit(1); 82 | }); 83 | -------------------------------------------------------------------------------- /src/aibtc-dao/extensions/payment-processor/read-only/get-total-revenue.ts: -------------------------------------------------------------------------------- 1 | import { fetchCallReadOnlyFunction, cvToValue } from "@stacks/transactions"; 2 | import { 3 | CONFIG, 4 | createErrorResponse, 5 | deriveChildAccount, 6 | getNetwork, 7 | isValidContractPrincipal, 8 | sendToLLM, 9 | ToolResponse, 10 | } from "../../../../utilities"; 11 | 12 | const usage = "Usage: bun run get-total-revenue.ts "; 13 | const usageExample = 14 | "Example: bun run get-total-revenue.ts ST35K818S3K2GSNEBC3M35GA3W8Q7X72KF4RVM3QA.aibtc-payment-processor-stx"; 15 | 16 | interface ExpectedArgs { 17 | paymentProcessorContract: string; 18 | } 19 | 20 | function validateArgs(): ExpectedArgs { 21 | // verify all required arguments are provided 22 | const [paymentProcessorContract] = process.argv.slice(2); 23 | if (!paymentProcessorContract) { 24 | const errorMessage = [ 25 | `Invalid arguments: ${process.argv.slice(2).join(" ")}`, 26 | usage, 27 | usageExample, 28 | ].join("\n"); 29 | throw new Error(errorMessage); 30 | } 31 | // verify contract addresses extracted from arguments 32 | if (!isValidContractPrincipal(paymentProcessorContract)) { 33 | const errorMessage = [ 34 | `Invalid contract address: ${paymentProcessorContract}`, 35 | usage, 36 | usageExample, 37 | ].join("\n"); 38 | throw new Error(errorMessage); 39 | } 40 | // return validated arguments 41 | return { 42 | paymentProcessorContract, 43 | }; 44 | } 45 | 46 | async function main(): Promise> { 47 | // validate and store provided args 48 | const args = validateArgs(); 49 | const [contractAddress, contractName] = 50 | args.paymentProcessorContract.split("."); 51 | // setup network and wallet info 52 | const networkObj = getNetwork(CONFIG.NETWORK); 53 | const { address } = await deriveChildAccount( 54 | CONFIG.NETWORK, 55 | CONFIG.MNEMONIC, 56 | CONFIG.ACCOUNT_INDEX 57 | ); 58 | // get total revenue 59 | const result = await fetchCallReadOnlyFunction({ 60 | contractAddress, 61 | contractName, 62 | functionName: "get-total-revenue", 63 | functionArgs: [], 64 | senderAddress: address, 65 | network: networkObj, 66 | }); 67 | // extract and return total revenue 68 | const totalRevenue = cvToValue(result); 69 | return { 70 | success: true, 71 | message: "Total revenue retrieved successfully", 72 | data: totalRevenue, 73 | }; 74 | } 75 | 76 | main() 77 | .then(sendToLLM) 78 | .catch((error) => { 79 | sendToLLM(createErrorResponse(error)); 80 | process.exit(1); 81 | }); 82 | -------------------------------------------------------------------------------- /src/aibtc-dao/extensions/payment-processor/read-only/get-total-users.ts: -------------------------------------------------------------------------------- 1 | import { fetchCallReadOnlyFunction, cvToValue } from "@stacks/transactions"; 2 | import { 3 | CONFIG, 4 | createErrorResponse, 5 | deriveChildAccount, 6 | getNetwork, 7 | isValidContractPrincipal, 8 | sendToLLM, 9 | ToolResponse, 10 | } from "../../../../utilities"; 11 | 12 | const usage = "Usage: bun run get-total-users.ts "; 13 | const usageExample = 14 | "Example: bun run get-total-users.ts ST35K818S3K2GSNEBC3M35GA3W8Q7X72KF4RVM3QA.aibtc-payment-processor-stx"; 15 | 16 | interface ExpectedArgs { 17 | paymentProcessorContract: string; 18 | } 19 | 20 | function validateArgs(): ExpectedArgs { 21 | // verify all required arguments are provided 22 | const [paymentProcessorContract] = process.argv.slice(2); 23 | if (!paymentProcessorContract) { 24 | const errorMessage = [ 25 | `Invalid arguments: ${process.argv.slice(2).join(" ")}`, 26 | usage, 27 | usageExample, 28 | ].join("\n"); 29 | throw new Error(errorMessage); 30 | } 31 | // verify contract addresses extracted from arguments 32 | if (!isValidContractPrincipal(paymentProcessorContract)) { 33 | const errorMessage = [ 34 | `Invalid contract address: ${paymentProcessorContract}`, 35 | usage, 36 | usageExample, 37 | ].join("\n"); 38 | throw new Error(errorMessage); 39 | } 40 | // return validated arguments 41 | return { 42 | paymentProcessorContract, 43 | }; 44 | } 45 | 46 | async function main(): Promise> { 47 | // validate and store provided args 48 | const args = validateArgs(); 49 | const [contractAddress, contractName] = 50 | args.paymentProcessorContract.split("."); 51 | // setup network and wallet info 52 | const networkObj = getNetwork(CONFIG.NETWORK); 53 | const { address } = await deriveChildAccount( 54 | CONFIG.NETWORK, 55 | CONFIG.MNEMONIC, 56 | CONFIG.ACCOUNT_INDEX 57 | ); 58 | // get total users 59 | const result = await fetchCallReadOnlyFunction({ 60 | contractAddress, 61 | contractName, 62 | functionName: "get-total-users", 63 | functionArgs: [], 64 | senderAddress: address, 65 | network: networkObj, 66 | }); 67 | // extract and return total users 68 | const totalUsers = cvToValue(result); 69 | return { 70 | success: true, 71 | message: "Total users retrieved successfully", 72 | data: totalUsers, 73 | }; 74 | } 75 | 76 | main() 77 | .then(sendToLLM) 78 | .catch((error) => { 79 | sendToLLM(createErrorResponse(error)); 80 | process.exit(1); 81 | }); 82 | -------------------------------------------------------------------------------- /src/aibtc-dao/extensions/timed-vault/public/withdraw-stx.ts: -------------------------------------------------------------------------------- 1 | import { 2 | AnchorMode, 3 | makeContractCall, 4 | SignedContractCallOptions, 5 | } from "@stacks/transactions"; 6 | import { 7 | broadcastTx, 8 | CONFIG, 9 | createErrorResponse, 10 | deriveChildAccount, 11 | getNetwork, 12 | getNextNonce, 13 | sendToLLM, 14 | } from "../../../../utilities"; 15 | 16 | const usage = "Usage: bun run withdraw-stx.ts "; 17 | const usageExample = 18 | "Example: bun run withdraw-stx.ts ST35K818S3K2GSNEBC3M35GA3W8Q7X72KF4RVM3QA.aibtc-timed-vault"; 19 | 20 | interface ExpectedArgs { 21 | timedVaultContract: string; 22 | } 23 | 24 | function validateArgs(): ExpectedArgs { 25 | // verify all required arguments are provided 26 | const [timedVaultContract] = process.argv.slice(2); 27 | if (!timedVaultContract) { 28 | const errorMessage = [ 29 | `Invalid arguments: ${process.argv.slice(2).join(" ")}`, 30 | usage, 31 | usageExample, 32 | ].join("\n"); 33 | throw new Error(errorMessage); 34 | } 35 | // verify contract addresses extracted from arguments 36 | const [contractAddress, contractName] = timedVaultContract.split("."); 37 | if (!contractAddress || !contractName) { 38 | const errorMessage = [ 39 | `Invalid contract address: ${timedVaultContract}`, 40 | usage, 41 | usageExample, 42 | ].join("\n"); 43 | throw new Error(errorMessage); 44 | } 45 | // return validated arguments 46 | return { 47 | timedVaultContract, 48 | }; 49 | } 50 | 51 | // withdraws STX from the timed vault contract 52 | async function main() { 53 | // validate and store provided args 54 | const args = validateArgs(); 55 | const [contractAddress, contractName] = args.timedVaultContract.split("."); 56 | // setup network and wallet info 57 | const networkObj = getNetwork(CONFIG.NETWORK); 58 | const { address, key } = await deriveChildAccount( 59 | CONFIG.NETWORK, 60 | CONFIG.MNEMONIC, 61 | CONFIG.ACCOUNT_INDEX 62 | ); 63 | const nextPossibleNonce = await getNextNonce(CONFIG.NETWORK, address); 64 | // configure contract call options 65 | const txOptions: SignedContractCallOptions = { 66 | contractAddress, 67 | contractName, 68 | functionName: "withdraw-stx", 69 | functionArgs: [], 70 | network: networkObj, 71 | nonce: nextPossibleNonce, 72 | senderKey: key, 73 | }; 74 | // broadcast transaction and return response 75 | const transaction = await makeContractCall(txOptions); 76 | const broadcastResponse = await broadcastTx(transaction, networkObj); 77 | return broadcastResponse; 78 | } 79 | 80 | main() 81 | .then(sendToLLM) 82 | .catch((error) => { 83 | sendToLLM(createErrorResponse(error)); 84 | process.exit(1); 85 | }); 86 | -------------------------------------------------------------------------------- /src/aibtc-dao/extensions/timed-vault/read-only/get-account-terms.ts: -------------------------------------------------------------------------------- 1 | import { 2 | fetchCallReadOnlyFunction, 3 | ClarityType, 4 | cvToValue, 5 | } from "@stacks/transactions"; 6 | import { 7 | CONFIG, 8 | createErrorResponse, 9 | deriveChildAccount, 10 | getNetwork, 11 | sendToLLM, 12 | ToolResponse, 13 | } from "../../../../utilities"; 14 | 15 | const usage = "Usage: bun run get-account-terms.ts "; 16 | const usageExample = 17 | "Example: bun run get-account-terms.ts ST35K818S3K2GSNEBC3M35GA3W8Q7X72KF4RVM3QA.aibtc-timed-vault"; 18 | 19 | interface ExpectedArgs { 20 | timedVaultContract: string; 21 | } 22 | 23 | function validateArgs(): ExpectedArgs { 24 | // verify all required arguments are provided 25 | const [timedVaultContract] = process.argv.slice(2); 26 | if (!timedVaultContract) { 27 | const errorMessage = [ 28 | `Invalid arguments: ${process.argv.slice(2).join(" ")}`, 29 | usage, 30 | usageExample, 31 | ].join("\n"); 32 | throw new Error(errorMessage); 33 | } 34 | // verify contract addresses extracted from arguments 35 | const [contractAddress, contractName] = timedVaultContract.split("."); 36 | if (!contractAddress || !contractName) { 37 | const errorMessage = [ 38 | `Invalid contract address: ${timedVaultContract}`, 39 | usage, 40 | usageExample, 41 | ].join("\n"); 42 | throw new Error(errorMessage); 43 | } 44 | // return validated arguments 45 | return { 46 | timedVaultContract, 47 | }; 48 | } 49 | 50 | async function main(): Promise> { 51 | // validate and store provided args 52 | const args = validateArgs(); 53 | const [contractAddress, contractName] = args.timedVaultContract.split("."); 54 | // setup network and wallet info 55 | const networkObj = getNetwork(CONFIG.NETWORK); 56 | const { address } = await deriveChildAccount( 57 | CONFIG.NETWORK, 58 | CONFIG.MNEMONIC, 59 | CONFIG.ACCOUNT_INDEX 60 | ); 61 | // get account terms 62 | const result = await fetchCallReadOnlyFunction({ 63 | contractAddress, 64 | contractName, 65 | functionName: "get-account-terms", 66 | functionArgs: [], 67 | senderAddress: address, 68 | network: networkObj, 69 | }); 70 | // extract and return account terms 71 | if (result.type === ClarityType.ResponseOk) { 72 | const accountTerms = cvToValue(result.value, true); 73 | return { 74 | success: true, 75 | message: "Account terms retrieved successfully", 76 | data: accountTerms, 77 | }; 78 | } else { 79 | const errorMessage = `Failed to retrieve account terms: ${JSON.stringify( 80 | result 81 | )}`; 82 | throw new Error(errorMessage); 83 | } 84 | } 85 | 86 | main() 87 | .then(sendToLLM) 88 | .catch((error) => { 89 | sendToLLM(createErrorResponse(error)); 90 | process.exit(1); 91 | }); 92 | -------------------------------------------------------------------------------- /src/aibtc-dao/extensions/treasury/read-only/is-allowed-asset.ts: -------------------------------------------------------------------------------- 1 | import { fetchCallReadOnlyFunction, Cl, cvToValue } from "@stacks/transactions"; 2 | import { 3 | CONFIG, 4 | createErrorResponse, 5 | deriveChildAccount, 6 | getNetwork, 7 | sendToLLM, 8 | ToolResponse, 9 | } from "../../../../utilities"; 10 | 11 | const usage = 12 | "Usage: bun run is-allowed-asset.ts "; 13 | const usageExample = 14 | "Example: bun run is-allowed-asset.ts ST35K818S3K2GSNEBC3M35GA3W8Q7X72KF4RVM3QA.aibtc-treasury ST35K818S3K2GSNEBC3M35GA3W8Q7X72KF4RVM3QA.aibtc-token"; 15 | 16 | interface ExpectedArgs { 17 | treasuryContract: string; 18 | assetContract: string; 19 | } 20 | 21 | function validateArgs(): ExpectedArgs { 22 | // verify all required arguments are provided 23 | const [treasuryContract, assetContract] = process.argv.slice(2); 24 | if (!treasuryContract || !assetContract) { 25 | const errorMessage = [ 26 | `Invalid arguments: ${process.argv.slice(2).join(" ")}`, 27 | usage, 28 | usageExample, 29 | ].join("\n"); 30 | throw new Error(errorMessage); 31 | } 32 | // verify contract addresses extracted from arguments 33 | const [treasuryAddress, treasuryName] = treasuryContract.split("."); 34 | const [assetAddress, assetName] = assetContract.split("."); 35 | if (!treasuryAddress || !treasuryName || !assetAddress || !assetName) { 36 | const errorMessage = [ 37 | `Invalid contract addresses: ${treasuryContract} ${assetContract}`, 38 | usage, 39 | usageExample, 40 | ].join("\n"); 41 | throw new Error(errorMessage); 42 | } 43 | // return validated arguments 44 | return { 45 | treasuryContract, 46 | assetContract, 47 | }; 48 | } 49 | 50 | async function main(): Promise> { 51 | // validate and store provided args 52 | const args = validateArgs(); 53 | const [contractAddress, contractName] = args.treasuryContract.split("."); 54 | // setup network and wallet info 55 | const networkObj = getNetwork(CONFIG.NETWORK); 56 | const { address } = await deriveChildAccount( 57 | CONFIG.NETWORK, 58 | CONFIG.MNEMONIC, 59 | CONFIG.ACCOUNT_INDEX 60 | ); 61 | // get allowed asset status 62 | const result = await fetchCallReadOnlyFunction({ 63 | contractAddress, 64 | contractName, 65 | functionName: "is-allowed-asset", 66 | functionArgs: [Cl.principal(args.assetContract)], 67 | senderAddress: address, 68 | network: networkObj, 69 | }); 70 | // extract and return allowed status 71 | const isAllowed = cvToValue(result, true); 72 | return { 73 | success: true, 74 | message: "Asset allowed status retrieved successfully", 75 | data: isAllowed, 76 | }; 77 | } 78 | 79 | main() 80 | .then(sendToLLM) 81 | .catch((error) => { 82 | sendToLLM(createErrorResponse(error)); 83 | process.exit(1); 84 | }); 85 | -------------------------------------------------------------------------------- /src/aibtc-dao/registries/dao-core-proposal-registry/action-proposals.ts: -------------------------------------------------------------------------------- 1 | import { BaseCoreProposalRegistryEntry } from "../dao-core-proposal-registry"; 2 | 3 | // Action Proposals 4 | export const COREPROPOSALS_ACTION_PROPOSALS: BaseCoreProposalRegistryEntry[] = [ 5 | { 6 | name: "aibtc-action-proposals-set-proposal-bond", 7 | friendlyName: "Action Proposals: Set Proposal Bond", 8 | templatePath: "dao/proposals/aibtc-action-proposals-set-proposal-bond.clar", 9 | requiredRuntimeValues: [{ key: "bond_amount" }], 10 | requiredTraits: [{ ref: "DAO_PROPOSAL", key: "dao_proposal_trait" }], 11 | requiredContractAddresses: [ 12 | { 13 | key: "message_contract", 14 | category: "EXTENSIONS", 15 | subcategory: "MESSAGING", 16 | }, 17 | { 18 | key: "action_proposal_contract", 19 | category: "EXTENSIONS", 20 | subcategory: "ACTION_PROPOSALS", 21 | }, 22 | ], 23 | }, 24 | ]; 25 | -------------------------------------------------------------------------------- /src/aibtc-dao/registries/dao-core-proposal-registry/core-proposals.ts: -------------------------------------------------------------------------------- 1 | import { BaseCoreProposalRegistryEntry } from "../dao-core-proposal-registry"; 2 | 3 | // Core Proposals 4 | export const COREPROPOSALS_CORE_PROPOSALS: BaseCoreProposalRegistryEntry[] = [ 5 | { 6 | name: "aibtc-core-proposals-set-proposal-bond", 7 | friendlyName: "Core Proposals: Set Proposal Bond", 8 | templatePath: "dao/proposals/aibtc-core-proposals-set-proposal-bond.clar", 9 | requiredRuntimeValues: [{ key: "bond_amount" }], 10 | requiredTraits: [{ ref: "DAO_PROPOSAL", key: "dao_proposal_trait" }], 11 | requiredContractAddresses: [ 12 | { 13 | key: "message_contract", 14 | category: "EXTENSIONS", 15 | subcategory: "MESSAGING", 16 | }, 17 | { 18 | key: "core_proposals_contract", 19 | category: "EXTENSIONS", 20 | subcategory: "CORE_PROPOSALS", 21 | }, 22 | ], 23 | }, 24 | ]; 25 | -------------------------------------------------------------------------------- /src/aibtc-dao/registries/dao-core-proposal-registry/dao-charter.ts: -------------------------------------------------------------------------------- 1 | import { BaseCoreProposalRegistryEntry } from "../dao-core-proposal-registry"; 2 | 3 | // DAO Charter Proposals 4 | export const COREPROPOSALS_DAO_CHARTER: BaseCoreProposalRegistryEntry[] = [ 5 | { 6 | name: "aibtc-dao-charter-set-dao-charter", 7 | friendlyName: "DAO Charter: Set DAO Charter", 8 | templatePath: "proposals/aibtc-dao-charter-set-dao-charter.clar", 9 | requiredRuntimeValues: [ 10 | { key: "dao_charter_text" }, 11 | { key: "dao_charter_inscription_id" }, 12 | ], 13 | requiredTraits: [{ ref: "DAO_PROPOSAL", key: "dao_proposal_trait" }], 14 | requiredContractAddresses: [ 15 | { 16 | key: "message_contract", 17 | category: "EXTENSIONS", 18 | subcategory: "MESSAGING", 19 | }, 20 | { 21 | key: "charter_contract", 22 | category: "EXTENSIONS", 23 | subcategory: "CHARTER", 24 | }, 25 | ], 26 | }, 27 | ]; 28 | -------------------------------------------------------------------------------- /src/aibtc-dao/registries/dao-core-proposal-registry/onchain-messaging.ts: -------------------------------------------------------------------------------- 1 | import { BaseCoreProposalRegistryEntry } from "../dao-core-proposal-registry"; 2 | 3 | // Messaging Proposals 4 | export const COREPROPOSALS_ONCHAIN_MESSAGING: BaseCoreProposalRegistryEntry[] = 5 | [ 6 | { 7 | name: "aibtc-onchain-messaging-send", 8 | friendlyName: "Onchain Messaging: Send Message", 9 | templatePath: "proposals/aibtc-onchain-messaging-send.clar", 10 | requiredRuntimeValues: [{ key: "message_to_send" }], 11 | requiredTraits: [{ ref: "DAO_PROPOSAL", key: "dao_proposal_trait" }], 12 | requiredContractAddresses: [ 13 | { 14 | key: "message_contract", 15 | category: "EXTENSIONS", 16 | subcategory: "MESSAGING", 17 | }, 18 | ], 19 | }, 20 | ]; 21 | -------------------------------------------------------------------------------- /src/aibtc-dao/registries/dao-core-proposal-registry/token-owner.ts: -------------------------------------------------------------------------------- 1 | import { BaseCoreProposalRegistryEntry } from "../dao-core-proposal-registry"; 2 | 3 | // Token Owner Proposals 4 | export const COREPROPOSALS_TOKEN_OWNER: BaseCoreProposalRegistryEntry[] = [ 5 | { 6 | name: "aibtc-token-owner-set-token-uri", 7 | friendlyName: "Token Owner: Set Token URI", 8 | templatePath: "proposals/aibtc-token-owner-set-token-uri.clar", 9 | requiredRuntimeValues: [{ key: "token_uri" }], 10 | requiredTraits: [{ ref: "DAO_PROPOSAL", key: "dao_proposal_trait" }], 11 | requiredContractAddresses: [ 12 | { 13 | key: "message_contract", 14 | category: "EXTENSIONS", 15 | subcategory: "MESSAGING", 16 | }, 17 | { 18 | key: "token_owner_contract", 19 | category: "EXTENSIONS", 20 | subcategory: "TOKEN_OWNER", 21 | }, 22 | ], 23 | }, 24 | { 25 | name: "aibtc-token-owner-transfer-ownership", 26 | friendlyName: "Token Owner: Transfer Ownership", 27 | templatePath: "proposals/aibtc-token-owner-transfer-ownership.clar", 28 | requiredRuntimeValues: [{ key: "new_owner_address" }], 29 | requiredTraits: [{ ref: "DAO_PROPOSAL", key: "dao_proposal_trait" }], 30 | requiredContractAddresses: [ 31 | { 32 | key: "message_contract", 33 | category: "EXTENSIONS", 34 | subcategory: "MESSAGING", 35 | }, 36 | { 37 | key: "token_owner_contract", 38 | category: "EXTENSIONS", 39 | subcategory: "TOKEN_OWNER", 40 | }, 41 | ], 42 | }, 43 | ]; 44 | -------------------------------------------------------------------------------- /src/aibtc-dao/smart-wallet/read-only/get-balance-stx.ts: -------------------------------------------------------------------------------- 1 | import { fetchCallReadOnlyFunction, cvToValue } from "@stacks/transactions"; 2 | import { 3 | CONFIG, 4 | createErrorResponse, 5 | deriveChildAccount, 6 | getNetwork, 7 | isValidContractPrincipal, 8 | sendToLLM, 9 | ToolResponse, 10 | } from "../../../utilities"; 11 | 12 | const usage = "Usage: bun run get-balance-stx.ts "; 13 | const usageExample = 14 | "Example: bun run get-balance-stx.ts ST35K818S3K2GSNEBC3M35GA3W8Q7X72KF4RVM3QA.aibtc-user-agent-smart-wallet"; 15 | 16 | interface ExpectedArgs { 17 | smartWalletContract: string; 18 | } 19 | 20 | function validateArgs(): ExpectedArgs { 21 | // verify all required arguments are provided 22 | const [smartWalletContract] = process.argv.slice(2); 23 | if (!smartWalletContract) { 24 | const errorMessage = [ 25 | `Invalid arguments: ${process.argv.slice(2).join(" ")}`, 26 | usage, 27 | usageExample, 28 | ].join("\n"); 29 | throw new Error(errorMessage); 30 | } 31 | // verify contract addresses extracted from arguments 32 | if (!isValidContractPrincipal(smartWalletContract)) { 33 | const errorMessage = [ 34 | `Invalid contract address: ${smartWalletContract}`, 35 | usage, 36 | usageExample, 37 | ].join("\n"); 38 | throw new Error(errorMessage); 39 | } 40 | // return validated arguments 41 | return { 42 | smartWalletContract, 43 | }; 44 | } 45 | 46 | async function main(): Promise> { 47 | // validate and store provided args 48 | const args = validateArgs(); 49 | const [contractAddress, contractName] = args.smartWalletContract.split("."); 50 | // setup network and wallet info 51 | const networkObj = getNetwork(CONFIG.NETWORK); 52 | const { address } = await deriveChildAccount( 53 | CONFIG.NETWORK, 54 | CONFIG.MNEMONIC, 55 | CONFIG.ACCOUNT_INDEX 56 | ); 57 | // get STX balance 58 | const result = await fetchCallReadOnlyFunction({ 59 | contractAddress, 60 | contractName, 61 | functionName: "get-balance-stx", 62 | functionArgs: [], 63 | senderAddress: address, 64 | network: networkObj, 65 | }); 66 | // extract and return balance 67 | const balance = cvToValue(result); 68 | return { 69 | success: true, 70 | message: "STX balance retrieved successfully", 71 | data: balance, 72 | }; 73 | } 74 | 75 | main() 76 | .then(sendToLLM) 77 | .catch((error) => { 78 | sendToLLM(createErrorResponse(error)); 79 | process.exit(1); 80 | }); 81 | -------------------------------------------------------------------------------- /src/aibtc-dao/smart-wallet/read-only/get-configuration.ts: -------------------------------------------------------------------------------- 1 | import { fetchCallReadOnlyFunction, cvToValue } from "@stacks/transactions"; 2 | import { 3 | CONFIG, 4 | createErrorResponse, 5 | deriveChildAccount, 6 | getNetwork, 7 | isValidContractPrincipal, 8 | sendToLLM, 9 | ToolResponse, 10 | } from "../../../utilities"; 11 | 12 | const usage = "Usage: bun run get-configuration.ts "; 13 | const usageExample = 14 | "Example: bun run get-configuration.ts ST35K818S3K2GSNEBC3M35GA3W8Q7X72KF4RVM3QA.aibtc-user-agent-smart-wallet"; 15 | 16 | interface ExpectedArgs { 17 | smartWalletContract: string; 18 | } 19 | 20 | interface WalletConfiguration { 21 | agent: string; 22 | user: string; 23 | smartWallet: string; 24 | daoToken: string; 25 | sbtcToken: string; 26 | } 27 | 28 | function validateArgs(): ExpectedArgs { 29 | // verify all required arguments are provided 30 | const [smartWalletContract] = process.argv.slice(2); 31 | if (!smartWalletContract) { 32 | const errorMessage = [ 33 | `Invalid arguments: ${process.argv.slice(2).join(" ")}`, 34 | usage, 35 | usageExample, 36 | ].join("\n"); 37 | throw new Error(errorMessage); 38 | } 39 | // verify contract addresses extracted from arguments 40 | if (!isValidContractPrincipal(smartWalletContract)) { 41 | const errorMessage = [ 42 | `Invalid contract address: ${smartWalletContract}`, 43 | usage, 44 | usageExample, 45 | ].join("\n"); 46 | throw new Error(errorMessage); 47 | } 48 | // return validated arguments 49 | return { 50 | smartWalletContract, 51 | }; 52 | } 53 | 54 | async function main(): Promise> { 55 | // validate and store provided args 56 | const args = validateArgs(); 57 | const [contractAddress, contractName] = args.smartWalletContract.split("."); 58 | // setup network and wallet info 59 | const networkObj = getNetwork(CONFIG.NETWORK); 60 | const { address } = await deriveChildAccount( 61 | CONFIG.NETWORK, 62 | CONFIG.MNEMONIC, 63 | CONFIG.ACCOUNT_INDEX 64 | ); 65 | // get wallet configuration 66 | const result = await fetchCallReadOnlyFunction({ 67 | contractAddress, 68 | contractName, 69 | functionName: "get-configuration", 70 | functionArgs: [], 71 | senderAddress: address, 72 | network: networkObj, 73 | }); 74 | // extract and return configuration 75 | const configuration = cvToValue(result); 76 | return { 77 | success: true, 78 | message: "Smart wallet configuration retrieved successfully", 79 | data: configuration, 80 | }; 81 | } 82 | 83 | main() 84 | .then(sendToLLM) 85 | .catch((error) => { 86 | sendToLLM(createErrorResponse(error)); 87 | process.exit(1); 88 | }); 89 | -------------------------------------------------------------------------------- /src/aibtc-dao/templates/dao/extensions/actions/aibtc-action-configure-timed-vault-dao.clar: -------------------------------------------------------------------------------- 1 | (impl-trait '<%= it.extension_trait %>) 2 | (impl-trait '<%= it.action_trait %>) 3 | 4 | (define-constant ERR_UNAUTHORIZED (err u10001)) 5 | (define-constant ERR_INVALID_PARAMS (err u10002)) 6 | 7 | (define-constant CFG_MESSAGE "Executed Action Proposal: Updated configuration in <%= it.dao_token_name %> timed vault extension") 8 | 9 | (define-public (callback (sender principal) (memo (buff 34))) (ok true)) 10 | 11 | (define-public (run (parameters (buff 2048))) 12 | (let 13 | ( 14 | (paramsTuple (unwrap! (from-consensus-buff? 15 | { accountHolder: (optional principal), amount: (optional uint), period: (optional uint) } 16 | parameters) ERR_INVALID_PARAMS)) 17 | (optAccountHolder (get accountHolder paramsTuple)) 18 | (optAmount (get amount paramsTuple)) 19 | (optPeriod (get period paramsTuple)) 20 | ) 21 | (try! (is-dao-or-extension)) 22 | ;; have to provide at least one 23 | (asserts! (or (is-some optAccountHolder) (is-some optAmount) (is-some optPeriod)) ERR_INVALID_PARAMS) 24 | ;; send the message 25 | (try! (contract-call? '<%= it.messaging_contract %> send CFG_MESSAGE true)) 26 | ;; set account holder if present 27 | (and (is-some optAccountHolder) 28 | (let ((accountHolder (unwrap! optAccountHolder ERR_INVALID_PARAMS))) 29 | (try! (contract-call? '<%= it.timed_vault_dao %> set-account-holder accountHolder)) 30 | ) 31 | ) 32 | ;; set amounts if present and within limits 33 | (and (is-some optAmount) 34 | (let ((amount (unwrap! optAmount ERR_INVALID_PARAMS))) 35 | (asserts! (>= amount u100000000) ERR_INVALID_PARAMS) 36 | (asserts! (<= amount u1000000000000) ERR_INVALID_PARAMS) 37 | (try! (contract-call? '<%= it.timed_vault_dao %> set-withdrawal-amount amount)) 38 | ) 39 | ) 40 | ;; set period if present and within limits 41 | (and (is-some optPeriod) 42 | (let ((period (unwrap! optPeriod ERR_INVALID_PARAMS))) 43 | (asserts! (>= period u6) ERR_INVALID_PARAMS) 44 | (asserts! (<= period u8064) ERR_INVALID_PARAMS) 45 | (try! (contract-call? '<%= it.timed_vault_dao %> set-withdrawal-period period)) 46 | ) 47 | ) 48 | (ok true) 49 | ) 50 | ) 51 | 52 | (define-private (is-dao-or-extension) 53 | (ok (asserts! (or (is-eq tx-sender '<%= it.base_dao_contract %>) 54 | (contract-call? '<%= it.base_dao_contract %> is-extension contract-caller)) ERR_UNAUTHORIZED 55 | )) 56 | ) 57 | -------------------------------------------------------------------------------- /src/aibtc-dao/templates/dao/extensions/actions/aibtc-action-configure-timed-vault-sbtc.clar: -------------------------------------------------------------------------------- 1 | (impl-trait '<%= it.extension_trait %>) 2 | (impl-trait '<%= it.action_trait %>) 3 | 4 | (define-constant ERR_UNAUTHORIZED (err u10001)) 5 | (define-constant ERR_INVALID_PARAMS (err u10002)) 6 | 7 | (define-constant CFG_MESSAGE "Executed Action Proposal: Updated configuration in BTC timed vault extension") 8 | 9 | (define-public (callback (sender principal) (memo (buff 34))) (ok true)) 10 | 11 | (define-public (run (parameters (buff 2048))) 12 | (let 13 | ( 14 | (paramsTuple (unwrap! (from-consensus-buff? 15 | { accountHolder: (optional principal), amount: (optional uint), period: (optional uint) } 16 | parameters) ERR_INVALID_PARAMS)) 17 | (optAccountHolder (get accountHolder paramsTuple)) 18 | (optAmount (get amount paramsTuple)) 19 | (optPeriod (get period paramsTuple)) 20 | ) 21 | (try! (is-dao-or-extension)) 22 | ;; have to provide at least one 23 | (asserts! (or (is-some optAccountHolder) (is-some optAmount) (is-some optPeriod)) ERR_INVALID_PARAMS) 24 | ;; send the message 25 | (try! (contract-call? '<%= it.messaging_contract %> send CFG_MESSAGE true)) 26 | ;; set account holder if present 27 | (and (is-some optAccountHolder) 28 | (let ((accountHolder (unwrap! optAccountHolder ERR_INVALID_PARAMS))) 29 | (try! (contract-call? '<%= it.timed_vault_sbtc %> set-account-holder accountHolder)) 30 | ) 31 | ) 32 | ;; set amounts if present and within limits 33 | (and (is-some optAmount) 34 | (let ((amount (unwrap! optAmount ERR_INVALID_PARAMS))) 35 | (asserts! (>= amount u1000) ERR_INVALID_PARAMS) 36 | (asserts! (<= amount u10000000) ERR_INVALID_PARAMS) 37 | (try! (contract-call? '<%= it.timed_vault_sbtc %> set-withdrawal-amount amount)) 38 | ) 39 | ) 40 | ;; set period if present and within limits 41 | (and (is-some optPeriod) 42 | (let ((period (unwrap! optPeriod ERR_INVALID_PARAMS))) 43 | (asserts! (>= period u6) ERR_INVALID_PARAMS) 44 | (asserts! (<= period u8064) ERR_INVALID_PARAMS) 45 | (try! (contract-call? '<%= it.timed_vault_sbtc %> set-withdrawal-period period)) 46 | ) 47 | ) 48 | (ok true) 49 | ) 50 | ) 51 | 52 | (define-private (is-dao-or-extension) 53 | (ok (asserts! (or (is-eq tx-sender '<%= it.base_dao_contract %>) 54 | (contract-call? '<%= it.base_dao_contract %> is-extension contract-caller)) ERR_UNAUTHORIZED 55 | )) 56 | ) 57 | -------------------------------------------------------------------------------- /src/aibtc-dao/templates/dao/extensions/actions/aibtc-action-configure-timed-vault-stx.clar: -------------------------------------------------------------------------------- 1 | (impl-trait '<%= it.extension_trait %>) 2 | (impl-trait '<%= it.action_trait %>) 3 | 4 | (define-constant ERR_UNAUTHORIZED (err u10001)) 5 | (define-constant ERR_INVALID_PARAMS (err u10002)) 6 | 7 | (define-constant CFG_MESSAGE "Executed Action Proposal: Updated configuration in STX timed vault extension") 8 | 9 | (define-public (callback (sender principal) (memo (buff 34))) (ok true)) 10 | 11 | (define-public (run (parameters (buff 2048))) 12 | (let 13 | ( 14 | (paramsTuple (unwrap! (from-consensus-buff? 15 | { accountHolder: (optional principal), amount: (optional uint), period: (optional uint) } 16 | parameters) ERR_INVALID_PARAMS)) 17 | (optAccountHolder (get accountHolder paramsTuple)) 18 | (optAmount (get amount paramsTuple)) 19 | (optPeriod (get period paramsTuple)) 20 | ) 21 | (try! (is-dao-or-extension)) 22 | ;; have to provide at least one 23 | (asserts! (or (is-some optAccountHolder) (is-some optAmount) (is-some optPeriod)) ERR_INVALID_PARAMS) 24 | ;; send the message 25 | (try! (contract-call? '<%= it.messaging_contract %> send CFG_MESSAGE true)) 26 | ;; set account holder if present 27 | (and (is-some optAccountHolder) 28 | (let ((accountHolder (unwrap! optAccountHolder ERR_INVALID_PARAMS))) 29 | (try! (contract-call? '<%= it.timed_vault_stx %> set-account-holder accountHolder)) 30 | ) 31 | ) 32 | ;; set amounts if present and within limits 33 | (and (is-some optAmount) 34 | (let ((amount (unwrap! optAmount ERR_INVALID_PARAMS))) 35 | (asserts! (>= amount u1000000) ERR_INVALID_PARAMS) 36 | (asserts! (<= amount u100000000) ERR_INVALID_PARAMS) 37 | (try! (contract-call? '<%= it.timed_vault_stx %> set-withdrawal-amount amount)) 38 | ) 39 | ) 40 | ;; set period if present and within limits 41 | (and (is-some optPeriod) 42 | (let ((period (unwrap! optPeriod ERR_INVALID_PARAMS))) 43 | (asserts! (>= period u6) ERR_INVALID_PARAMS) 44 | (asserts! (<= period u8064) ERR_INVALID_PARAMS) 45 | (try! (contract-call? '<%= it.timed_vault_stx %> set-withdrawal-period period)) 46 | ) 47 | ) 48 | (ok true) 49 | ) 50 | ) 51 | 52 | (define-private (is-dao-or-extension) 53 | (ok (asserts! (or (is-eq tx-sender '<%= it.base_dao_contract %>) 54 | (contract-call? '<%= it.base_dao_contract %> is-extension contract-caller)) ERR_UNAUTHORIZED 55 | )) 56 | ) 57 | -------------------------------------------------------------------------------- /src/aibtc-dao/templates/dao/extensions/actions/aibtc-action-pmt-dao-add-resource.clar: -------------------------------------------------------------------------------- 1 | (impl-trait '<%= it.extension_trait %>) 2 | (impl-trait '<%= it.action_trait %>) 3 | 4 | (define-constant ERR_UNAUTHORIZED (err u10001)) 5 | (define-constant ERR_INVALID_PARAMS (err u10002)) 6 | 7 | (define-constant CFG_MESSAGE "Executed Action Proposal: Added a resource in the DAO payment processor extension") 8 | 9 | (define-public (callback (sender principal) (memo (buff 34))) (ok true)) 10 | 11 | (define-public (run (parameters (buff 2048))) 12 | (let 13 | ( 14 | (paramsTuple (unwrap! (from-consensus-buff? 15 | { name: (string-utf8 50), description: (string-utf8 255), price: uint, url: (optional (string-utf8 255)) } 16 | parameters) ERR_INVALID_PARAMS)) 17 | ) 18 | (try! (is-dao-or-extension)) 19 | (try! (contract-call? '<%= it.messaging_contract %> send CFG_MESSAGE true)) 20 | (try! (contract-call? '<%= it.payments_contract %> add-resource (get name paramsTuple) (get description paramsTuple) (get price paramsTuple) (get url paramsTuple))) 21 | (ok true) 22 | ) 23 | ) 24 | 25 | (define-private (is-dao-or-extension) 26 | (ok (asserts! (or (is-eq tx-sender '<%= it.base_dao_contract %>) 27 | (contract-call? '<%= it.base_dao_contract %> is-extension contract-caller)) ERR_UNAUTHORIZED 28 | )) 29 | ) 30 | -------------------------------------------------------------------------------- /src/aibtc-dao/templates/dao/extensions/actions/aibtc-action-pmt-dao-toggle-resource.clar: -------------------------------------------------------------------------------- 1 | (impl-trait '<%= it.extension_trait %>) 2 | (impl-trait '<%= it.action_trait %>) 3 | 4 | (define-constant ERR_UNAUTHORIZED (err u10001)) 5 | (define-constant ERR_INVALID_PARAMS (err u10002)) 6 | 7 | (define-constant CFG_MESSAGE "Executed Action Proposal: Toggled resource status by name in the DAO payment processor extension") 8 | 9 | (define-public (callback (sender principal) (memo (buff 34))) (ok true)) 10 | 11 | (define-public (run (parameters (buff 2048))) 12 | (let 13 | ( 14 | (resourceName (unwrap! (from-consensus-buff? (string-utf8 50) parameters) ERR_INVALID_PARAMS)) 15 | ) 16 | (try! (is-dao-or-extension)) 17 | (try! (contract-call? '<%= it.messaging_contract %> send CFG_MESSAGE true)) 18 | (contract-call? '<%= it.payments_contract %> toggle-resource-by-name resourceName) 19 | ) 20 | ) 21 | 22 | (define-private (is-dao-or-extension) 23 | (ok (asserts! (or (is-eq tx-sender '<%= it.base_dao_contract %>) 24 | (contract-call? '<%= it.base_dao_contract %> is-extension contract-caller)) ERR_UNAUTHORIZED 25 | )) 26 | ) 27 | -------------------------------------------------------------------------------- /src/aibtc-dao/templates/dao/extensions/actions/aibtc-action-pmt-sbtc-add-resource.clar: -------------------------------------------------------------------------------- 1 | (impl-trait '<%= it.extension_trait %>) 2 | (impl-trait '<%= it.action_trait %>) 3 | 4 | (define-constant ERR_UNAUTHORIZED (err u10001)) 5 | (define-constant ERR_INVALID_PARAMS (err u10002)) 6 | 7 | (define-constant CFG_MESSAGE "Executed Action Proposal: Added a resource in the BTC payment processor extension") 8 | 9 | (define-public (callback (sender principal) (memo (buff 34))) (ok true)) 10 | 11 | (define-public (run (parameters (buff 2048))) 12 | (let 13 | ( 14 | (paramsTuple (unwrap! (from-consensus-buff? 15 | { name: (string-utf8 50), description: (string-utf8 255), price: uint, url: (optional (string-utf8 255)) } 16 | parameters) ERR_INVALID_PARAMS)) 17 | ) 18 | (try! (is-dao-or-extension)) 19 | (try! (contract-call? '<%= it.messaging_contract %> send CFG_MESSAGE true)) 20 | (try! (contract-call? '<%= it.payments_contract %> add-resource (get name paramsTuple) (get description paramsTuple) (get price paramsTuple) (get url paramsTuple))) 21 | (ok true) 22 | ) 23 | ) 24 | 25 | (define-private (is-dao-or-extension) 26 | (ok (asserts! (or (is-eq tx-sender '<%= it.base_dao_contract %>) 27 | (contract-call? '<%= it.base_dao_contract %> is-extension contract-caller)) ERR_UNAUTHORIZED 28 | )) 29 | ) 30 | -------------------------------------------------------------------------------- /src/aibtc-dao/templates/dao/extensions/actions/aibtc-action-pmt-sbtc-toggle-resource.clar: -------------------------------------------------------------------------------- 1 | (impl-trait '<%= it.extension_trait %>) 2 | (impl-trait '<%= it.action_trait %>) 3 | 4 | (define-constant ERR_UNAUTHORIZED (err u10001)) 5 | (define-constant ERR_INVALID_PARAMS (err u10002)) 6 | 7 | (define-constant CFG_MESSAGE "Executed Action Proposal: Toggled resource status by name in the BTC payment processor extension") 8 | 9 | (define-public (callback (sender principal) (memo (buff 34))) (ok true)) 10 | 11 | (define-public (run (parameters (buff 2048))) 12 | (let 13 | ( 14 | (resourceName (unwrap! (from-consensus-buff? (string-utf8 50) parameters) ERR_INVALID_PARAMS)) 15 | ) 16 | (try! (is-dao-or-extension)) 17 | (try! (contract-call? '<%= it.messaging_contract %> send CFG_MESSAGE true)) 18 | (contract-call? '<%= it.payments_contract %> toggle-resource-by-name resourceName) 19 | ) 20 | ) 21 | 22 | (define-private (is-dao-or-extension) 23 | (ok (asserts! (or (is-eq tx-sender '<%= it.base_dao_contract %>) 24 | (contract-call? '<%= it.base_dao_contract %> is-extension contract-caller)) ERR_UNAUTHORIZED 25 | )) 26 | ) 27 | -------------------------------------------------------------------------------- /src/aibtc-dao/templates/dao/extensions/actions/aibtc-action-pmt-stx-add-resource.clar: -------------------------------------------------------------------------------- 1 | (impl-trait '<%= it.extension_trait %>) 2 | (impl-trait '<%= it.action_trait %>) 3 | 4 | (define-constant ERR_UNAUTHORIZED (err u10001)) 5 | (define-constant ERR_INVALID_PARAMS (err u10002)) 6 | 7 | (define-constant CFG_MESSAGE "Executed Action Proposal: Added a resource in the STX payment processor extension") 8 | 9 | (define-public (callback (sender principal) (memo (buff 34))) (ok true)) 10 | 11 | (define-public (run (parameters (buff 2048))) 12 | (let 13 | ( 14 | (paramsTuple (unwrap! (from-consensus-buff? 15 | { name: (string-utf8 50), description: (string-utf8 255), price: uint, url: (optional (string-utf8 255)) } 16 | parameters) ERR_INVALID_PARAMS)) 17 | ) 18 | (try! (is-dao-or-extension)) 19 | (try! (contract-call? '<%= it.messaging_contract %> send CFG_MESSAGE true)) 20 | (try! (contract-call? '<%= it.payments_contract %> add-resource (get name paramsTuple) (get description paramsTuple) (get price paramsTuple) (get url paramsTuple))) 21 | (ok true) 22 | ) 23 | ) 24 | 25 | (define-private (is-dao-or-extension) 26 | (ok (asserts! (or (is-eq tx-sender '<%= it.base_dao_contract %>) 27 | (contract-call? '<%= it.base_dao_contract %> is-extension contract-caller)) ERR_UNAUTHORIZED 28 | )) 29 | ) 30 | -------------------------------------------------------------------------------- /src/aibtc-dao/templates/dao/extensions/actions/aibtc-action-pmt-stx-toggle-resource.clar: -------------------------------------------------------------------------------- 1 | (impl-trait '<%= it.extension_trait %>) 2 | (impl-trait '<%= it.action_trait %>) 3 | 4 | (define-constant ERR_UNAUTHORIZED (err u10001)) 5 | (define-constant ERR_INVALID_PARAMS (err u10002)) 6 | 7 | (define-constant CFG_MESSAGE "Executed Action Proposal: Toggled resource status by name in the STX payment processor extension") 8 | 9 | (define-public (callback (sender principal) (memo (buff 34))) (ok true)) 10 | 11 | (define-public (run (parameters (buff 2048))) 12 | (let 13 | ( 14 | (resourceName (unwrap! (from-consensus-buff? (string-utf8 50) parameters) ERR_INVALID_PARAMS)) 15 | ) 16 | (try! (is-dao-or-extension)) 17 | (try! (contract-call? '<%= it.messaging_contract %> send CFG_MESSAGE true)) 18 | (contract-call? '<%= it.payments_contract %> toggle-resource-by-name resourceName) 19 | ) 20 | ) 21 | 22 | (define-private (is-dao-or-extension) 23 | (ok (asserts! (or (is-eq tx-sender '<%= it.base_dao_contract %>) 24 | (contract-call? '<%= it.base_dao_contract %> is-extension contract-caller)) ERR_UNAUTHORIZED 25 | )) 26 | ) 27 | -------------------------------------------------------------------------------- /src/aibtc-dao/templates/dao/extensions/actions/aibtc-action-send-message.clar: -------------------------------------------------------------------------------- 1 | (impl-trait '<%= it.extension_trait %>) 2 | (impl-trait '<%= it.action_trait %>) 3 | 4 | (define-constant ERR_UNAUTHORIZED (err u10001)) 5 | (define-constant ERR_INVALID_PARAMS (err u10002)) 6 | 7 | (define-public (callback (sender principal) (memo (buff 34))) (ok true)) 8 | 9 | (define-public (run (parameters (buff 2048))) 10 | (let 11 | ( 12 | (message (unwrap! (from-consensus-buff? (string-ascii 2043) parameters) ERR_INVALID_PARAMS)) 13 | ) 14 | (try! (is-dao-or-extension)) 15 | (contract-call? '<%= it.messaging_contract %> send message true) 16 | ) 17 | ) 18 | 19 | (define-private (is-dao-or-extension) 20 | (ok (asserts! (or (is-eq tx-sender '<%= it.base_dao_contract %>) 21 | (contract-call? '<%= it.base_dao_contract %> is-extension contract-caller)) ERR_UNAUTHORIZED 22 | )) 23 | ) 24 | -------------------------------------------------------------------------------- /src/aibtc-dao/templates/dao/extensions/actions/aibtc-action-treasury-allow-asset.clar: -------------------------------------------------------------------------------- 1 | (impl-trait '<%= it.extension_trait %>) 2 | (impl-trait '<%= it.action_trait %>) 3 | 4 | (define-constant ERR_UNAUTHORIZED (err u10001)) 5 | (define-constant ERR_INVALID_PARAMS (err u10002)) 6 | 7 | (define-constant CFG_MESSAGE "Executed Action Proposal: Allowed or enabled asset for use in the treasury") 8 | 9 | (define-public (callback (sender principal) (memo (buff 34))) (ok true)) 10 | 11 | (define-public (run (parameters (buff 2048))) 12 | (let 13 | ( 14 | (asset (unwrap! (from-consensus-buff? principal parameters) ERR_INVALID_PARAMS)) 15 | ) 16 | (try! (is-dao-or-extension)) 17 | (try! (contract-call? '<%= it.messaging_contract %> send CFG_MESSAGE true)) 18 | (contract-call? '<%= it.treasury_contract %> allow-asset asset true) 19 | ) 20 | ) 21 | 22 | (define-private (is-dao-or-extension) 23 | (ok (asserts! (or (is-eq tx-sender '<%= it.base_dao_contract %>) 24 | (contract-call? '<%= it.base_dao_contract %> is-extension contract-caller)) ERR_UNAUTHORIZED 25 | )) 26 | ) 27 | -------------------------------------------------------------------------------- /src/aibtc-dao/templates/dao/extensions/aibtc-onchain-messaging.clar: -------------------------------------------------------------------------------- 1 | ;; title: aibtc-onchain-messaging 2 | ;; version: 1.0.0 3 | ;; summary: An extension to send messages on-chain to anyone listening to this contract. 4 | 5 | ;; traits 6 | ;; 7 | (impl-trait '<%= it.extension_trait %>) 8 | (impl-trait '<%= it.messaging_trait %>) 9 | 10 | ;; constants 11 | ;; 12 | (define-constant INPUT_ERROR (err u4000)) 13 | (define-constant ERR_UNAUTHORIZED (err u4001)) 14 | 15 | ;; public functions 16 | 17 | (define-public (callback (sender principal) (memo (buff 34))) 18 | (ok true) 19 | ) 20 | 21 | (define-public (send (msg (string-ascii 1048576)) (isFromDao bool)) 22 | (begin 23 | (and isFromDao (try! (is-dao-or-extension))) 24 | (asserts! (> (len msg) u0) INPUT_ERROR) 25 | ;; print the message as the first event 26 | (print msg) 27 | ;; print the envelope info for the message 28 | (print { 29 | notification: "send", 30 | payload: { 31 | caller: contract-caller, 32 | height: stacks-block-height, 33 | isFromDao: isFromDao, 34 | sender: tx-sender, 35 | } 36 | }) 37 | (ok true) 38 | ) 39 | ) 40 | 41 | ;; private functions 42 | ;; 43 | 44 | (define-private (is-dao-or-extension) 45 | (ok (asserts! (or (is-eq tx-sender '<%= it.base_dao_contract %>) 46 | (contract-call? '<%= it.base_dao_contract %> is-extension contract-caller)) ERR_UNAUTHORIZED 47 | )) 48 | ) 49 | -------------------------------------------------------------------------------- /src/aibtc-dao/templates/dao/extensions/aibtc-token-owner.clar: -------------------------------------------------------------------------------- 1 | ;; title: aibtc-token-owner 2 | ;; version: 1.0.0 3 | ;; summary: An extension that provides management functions for the dao token 4 | 5 | ;; traits 6 | ;; 7 | (impl-trait '<%= it.extension_trait %>) 8 | (impl-trait '<%= it.token_owner_trait %>) 9 | 10 | ;; constants 11 | ;; 12 | 13 | (define-constant ERR_UNAUTHORIZED (err u7000)) 14 | 15 | ;; public functions 16 | ;; 17 | 18 | (define-public (callback (sender principal) (memo (buff 34))) 19 | (ok true) 20 | ) 21 | 22 | (define-public (set-token-uri (value (string-utf8 256))) 23 | (begin 24 | ;; check if caller is authorized 25 | (try! (is-dao-or-extension)) 26 | ;; update token uri 27 | (try! (as-contract (contract-call? '<%= it.token_contract %> set-token-uri value))) 28 | (ok true) 29 | ) 30 | ) 31 | 32 | ;; keeping old format for trait adherance 33 | (define-public (transfer-ownership (new-owner principal)) 34 | (begin 35 | ;; check if caller is authorized 36 | (try! (is-dao-or-extension)) 37 | ;; transfer ownership 38 | (try! (as-contract (contract-call? '<%= it.token_contract %> set-contract-owner new-owner))) 39 | (ok true) 40 | ) 41 | ) 42 | 43 | ;; private functions 44 | ;; 45 | 46 | (define-private (is-dao-or-extension) 47 | (ok (asserts! (or (is-eq tx-sender '<%= it.base_dao_contract %>) 48 | (contract-call? '<%= it.base_dao_contract %> is-extension contract-caller)) ERR_UNAUTHORIZED 49 | )) 50 | ) 51 | -------------------------------------------------------------------------------- /src/aibtc-dao/templates/dao/proposals/aibtc-action-proposals-set-proposal-bond.clar: -------------------------------------------------------------------------------- 1 | (impl-trait '<%= it.dao_proposal_trait %>) 2 | 3 | ;; template vars 4 | ;; 5 | (define-constant CFG_MESSAGE "Executed Core Proposal: Updated proposal bond amount in the action proposals extension") 6 | (define-constant CFG_BOND_AMOUNT u<%= it.bond_amount %>) 7 | 8 | (define-public (execute (sender principal)) 9 | (begin 10 | ;; send a message from the dao 11 | (try! (contract-call? '<%= it.message_contract %> send CFG_MESSAGE true)) 12 | ;; update proposal bond amount 13 | (contract-call? '<%= it.action_proposal_contract %> set-proposal-bond CFG_BOND_AMOUNT) 14 | ) 15 | ) 16 | -------------------------------------------------------------------------------- /src/aibtc-dao/templates/dao/proposals/aibtc-base-add-new-extension.clar: -------------------------------------------------------------------------------- 1 | (impl-trait '<%= it.dao_proposal_trait %>) 2 | 3 | ;; template vars 4 | ;; 5 | (define-constant CFG_MESSAGE "Executed Core Proposal: Added new extension in the base DAO") 6 | (define-constant CFG_NEW_EXTENSION '<%= it.new_extension_contract %>) 7 | 8 | (define-public (execute (sender principal)) 9 | (begin 10 | ;; send a message from the dao 11 | (try! (contract-call? '<%= it.message_contract %> send CFG_MESSAGE true)) 12 | ;; adds and enables a new extension to the DAO 13 | (contract-call? '<%= it.base_dao_contract %> set-extension CFG_NEW_EXTENSION true) 14 | ) 15 | ) 16 | -------------------------------------------------------------------------------- /src/aibtc-dao/templates/dao/proposals/aibtc-base-disable-extension.clar: -------------------------------------------------------------------------------- 1 | (impl-trait '<%= it.dao_proposal_trait %>) 2 | 3 | ;; template vars 4 | ;; 5 | (define-constant CFG_MESSAGE "Executed Core Proposal: Disabled extension in the base DAO") 6 | (define-constant CFG_EXTENSION '<%= it.extension_contract %>) 7 | 8 | ;; errors 9 | (define-constant ERR_EXTENSION_NOT_FOUND (err u3003)) 10 | 11 | (define-public (execute (sender principal)) 12 | (begin 13 | ;; send a message from the dao 14 | (try! (contract-call? '<%= it.message_contract %> send CFG_MESSAGE true)) 15 | ;; update extension status 16 | (try! (contract-call? '<%= it.base_dao_contract %> set-extension CFG_EXTENSION false)) 17 | (ok true) 18 | ) 19 | ) 20 | -------------------------------------------------------------------------------- /src/aibtc-dao/templates/dao/proposals/aibtc-base-enable-extension.clar: -------------------------------------------------------------------------------- 1 | (impl-trait '<%= it.dao_proposal_trait %>) 2 | 3 | ;; template vars 4 | ;; 5 | (define-constant CFG_MESSAGE "Executed Core Proposal: Enabled extension in the base DAO") 6 | (define-constant CFG_EXTENSION '<%= it.extension_contract %>) 7 | 8 | (define-public (execute (sender principal)) 9 | ;; enables an extension in the DAO 10 | (begin 11 | ;; send a message from the dao 12 | (try! (contract-call? '<%= it.message_contract %> send CFG_MESSAGE true)) 13 | ;; update extension status 14 | (try! (contract-call? '<%= it.base_dao_contract %> set-extension CFG_EXTENSION true)) 15 | (ok true) 16 | ) 17 | ) 18 | -------------------------------------------------------------------------------- /src/aibtc-dao/templates/dao/proposals/aibtc-base-replace-extension-proposal-voting.clar: -------------------------------------------------------------------------------- 1 | (impl-trait '<%= it.dao_proposal_trait %>) 2 | 3 | ;; template vars 4 | ;; 5 | (define-constant CFG_MESSAGE "Executed Core Proposal: Replaced core and action proposal voting extensions in the base DAO") 6 | (define-constant CFG_OLD_ACTION_PROPOSALS '<%= it.old_action_proposals_contract %>) 7 | (define-constant CFG_OLD_CORE_PROPOSALS '<%= it.old_core_proposals_contract %>) 8 | (define-constant CFG_NEW_ACTION_PROPOSALS '<%= it.new_action_proposals_contract %>) 9 | (define-constant CFG_NEW_CORE_PROPOSALS '<%= it.new_core_proposals_contract %>) 10 | 11 | ;; errors 12 | (define-constant ERR_EXTENSION_NOT_FOUND (err u30003)) 13 | 14 | (define-public (execute (sender principal)) 15 | ;; replaces the core and action voting proposals in a dao 16 | (begin 17 | ;; send a message from the dao 18 | (try! (contract-call? '<%= it.message_contract %> send CFG_MESSAGE true)) 19 | ;; check that old extensions exist 20 | (asserts! (contract-call? '<%= it.base_dao_contract %> is-extension CFG_OLD_ACTION_PROPOSALS) ERR_EXTENSION_NOT_FOUND) 21 | (asserts! (contract-call? '<%= it.base_dao_contract %> is-extension CFG_OLD_CORE_PROPOSALS) ERR_EXTENSION_NOT_FOUND) 22 | ;; disable old extensions 23 | (try! (contract-call? '<%= it.base_dao_contract %> set-extension CFG_OLD_ACTION_PROPOSALS false)) 24 | (try! (contract-call? '<%= it.base_dao_contract %> set-extension CFG_OLD_CORE_PROPOSALS false)) 25 | ;; add new extensions 26 | (try! (contract-call? '<%= it.base_dao_contract %> set-extension CFG_NEW_ACTION_PROPOSALS true)) 27 | (try! (contract-call? '<%= it.base_dao_contract %> set-extension CFG_NEW_CORE_PROPOSALS true)) 28 | (ok true) 29 | ) 30 | ) 31 | -------------------------------------------------------------------------------- /src/aibtc-dao/templates/dao/proposals/aibtc-base-replace-extension.clar: -------------------------------------------------------------------------------- 1 | (impl-trait '<%= it.dao_proposal_trait %>) 2 | 3 | ;; template vars 4 | ;; 5 | (define-constant CFG_MESSAGE "Executed Core Proposal: Replaced extension in the base DAO") 6 | (define-constant CFG_OLD_EXTENSION '<%= it.old_extension_contract %>) 7 | (define-constant CFG_NEW_EXTENSION '<%= it.new_extension_contract %>) 8 | 9 | ;; errors 10 | (define-constant ERR_EXTENSION_NOT_FOUND (err u30003)) 11 | 12 | (define-public (execute (sender principal)) 13 | ;; replaces an extension in the DAO 14 | (begin 15 | ;; send a message from the dao 16 | (try! (contract-call? '<%= it.message_contract %> send CFG_MESSAGE true)) 17 | ;; check that old extension exists 18 | (asserts! (contract-call? '<%= it.base_dao_contract %> is-extension CFG_OLD_EXTENSION) ERR_EXTENSION_NOT_FOUND) 19 | ;; update extension status to false 20 | (try! (contract-call? '<%= it.base_dao_contract %> set-extension CFG_OLD_EXTENSION false)) 21 | ;; add new extension to the dao 22 | (try! (contract-call? '<%= it.base_dao_contract %> set-extension CFG_NEW_EXTENSION true)) 23 | (ok true) 24 | ) 25 | ) 26 | -------------------------------------------------------------------------------- /src/aibtc-dao/templates/dao/proposals/aibtc-core-proposals-set-proposal-bond.clar: -------------------------------------------------------------------------------- 1 | (impl-trait '<%= it.dao_proposal_trait %>) 2 | 3 | ;; template vars 4 | ;; 5 | (define-constant CFG_MESSAGE "Executed Core Proposal: Updated proposal bond amount in the core proposals extension") 6 | (define-constant CFG_BOND_AMOUNT u<%= it.bond_amount %>) 7 | 8 | (define-public (execute (sender principal)) 9 | (begin 10 | ;; send a message from the dao 11 | (try! (contract-call? '<%= it.message_contract %> send CFG_MESSAGE true)) 12 | ;; update proposal bond amount 13 | (contract-call? '<%= it.core_proposals_contract %> set-proposal-bond CFG_BOND_AMOUNT) 14 | ) 15 | ) 16 | -------------------------------------------------------------------------------- /src/aibtc-dao/templates/dao/proposals/aibtc-dao-charter-set-dao-charter.clar: -------------------------------------------------------------------------------- 1 | (impl-trait '<%= it.dao_proposal_trait %>) 2 | 3 | ;; template vars 4 | ;; 5 | (define-constant CFG_MESSAGE "Executed Core Proposal: Set or updated the DAO charter extension") 6 | (define-constant CFG_CHARTER_TEXT "<%= it.dao_charter_text %>") 7 | (define-constant CFG_CHARTER_INSCRIPTION_ID "<%= it.dao_charter_inscription_id %>") 8 | 9 | (define-public (execute (sender principal)) 10 | (begin 11 | ;; send a message from the dao 12 | (try! (contract-call? '<%= it.message_contract %> send CFG_MESSAGE true)) 13 | ;; updates the charter for a dao 14 | (if (> (len CFG_CHARTER_INSCRIPTION_ID) u0) 15 | (contract-call? '<%= it.charter_contract %> set-dao-charter CFG_CHARTER_TEXT (some CFG_CHARTER_INSCRIPTION_ID)) 16 | (contract-call? '<%= it.charter_contract %> set-dao-charter CFG_CHARTER_TEXT none) 17 | ) 18 | ) 19 | ) 20 | -------------------------------------------------------------------------------- /src/aibtc-dao/templates/dao/proposals/aibtc-onchain-messaging-send.clar: -------------------------------------------------------------------------------- 1 | (impl-trait '<%= it.dao_proposal_trait %>) 2 | 3 | ;; template vars 4 | ;; 5 | (define-constant CFG_MESSAGE "<%= it.message_to_send %>") 6 | 7 | (define-public (execute (sender principal)) 8 | ;; sends a verified message from the dao 9 | (contract-call? '<%= it.message_contract %> send CFG_MESSAGE true) 10 | ) 11 | -------------------------------------------------------------------------------- /src/aibtc-dao/templates/dao/proposals/aibtc-pmt-dao-add-resource.clar: -------------------------------------------------------------------------------- 1 | (impl-trait '<%= it.dao_proposal_trait %>) 2 | 3 | ;; template vars 4 | ;; 5 | (define-constant CFG_MESSAGE "Executed Core Proposal: Added a new resource available in the DAO payment processor") 6 | (define-constant CFG_RESOURCE_NAME u"<%= it.resource_name %>") ;; name of the resource 7 | (define-constant CFG_RESOURCE_DESCRIPTION u"<%= it.resource_description %>") ;; description of the resource 8 | (define-constant CFG_RESOURCE_AMOUNT u<%= it.resource_amount %>) ;; 1,000 DAO tokens (8 decimals) 9 | (define-constant CFG_RESOURCE_URL <% if (it.resource_url) { %> (some u"<%= it.resource_url %>") <% } else { %> none <% } %>) 10 | 11 | (define-public (execute (sender principal)) 12 | ;; adds a resource that can be used to pay invoices 13 | (begin 14 | ;; send a message from the dao 15 | (try! (contract-call? '<%= it.messaging_contract %> send CFG_MESSAGE true)) 16 | ;; add a resource to the payments contract 17 | (try! (contract-call? '<%= it.payments_dao_contract %> add-resource CFG_RESOURCE_NAME CFG_RESOURCE_DESCRIPTION CFG_RESOURCE_AMOUNT CFG_RESOURCE_URL)) 18 | (ok true) 19 | ) 20 | ) 21 | -------------------------------------------------------------------------------- /src/aibtc-dao/templates/dao/proposals/aibtc-pmt-dao-set-payment-address.clar: -------------------------------------------------------------------------------- 1 | (impl-trait '<%= it.dao_proposal_trait %>) 2 | 3 | ;; template vars 4 | ;; 5 | (define-constant CFG_MESSAGE "Executed Core Proposal: Updated the payment address in the DAO payment processor") 6 | (define-constant CFG_PAYOUT_ADDRESS '<%= it.payout_address %>) 7 | 8 | (define-public (execute (sender principal)) 9 | (begin 10 | ;; send a message from the dao 11 | (try! (contract-call? '<%= it.messaging_contract %> send CFG_MESSAGE true)) 12 | ;; set the payment address for invoices 13 | (contract-call? '<%= it.payments_dao_contract %> set-payment-address CFG_PAYOUT_ADDRESS) 14 | ) 15 | ) 16 | -------------------------------------------------------------------------------- /src/aibtc-dao/templates/dao/proposals/aibtc-pmt-dao-toggle-resource-by-name.clar: -------------------------------------------------------------------------------- 1 | (impl-trait '<%= it.dao_proposal_trait %>) 2 | 3 | ;; template vars 4 | ;; 5 | (define-constant CFG_MESSAGE "Executed Core Proposal: Toggled a resource status by name in the DAO payment processor") 6 | (define-constant CFG_RESOURCE_NAME u"<%= it.resource_name %>") ;; name of the resource 7 | 8 | (define-public (execute (sender principal)) 9 | (begin 10 | ;; send a message from the dao 11 | (try! (contract-call? '<%= it.messaging_contract %> send CFG_MESSAGE true)) 12 | ;; toggle a resource enabled status by name 13 | (contract-call? '<%= it.payments_dao_contract %> toggle-resource-by-name CFG_RESOURCE_NAME) 14 | ) 15 | ) 16 | -------------------------------------------------------------------------------- /src/aibtc-dao/templates/dao/proposals/aibtc-pmt-dao-toggle-resource.clar: -------------------------------------------------------------------------------- 1 | (impl-trait '<%= it.dao_proposal_trait %>) 2 | 3 | ;; template vars 4 | ;; 5 | (define-constant CFG_MESSAGE "Executed Core Proposal: Toggled a resource status by index in the DAO payment processor") 6 | (define-constant CFG_RESOURCE_INDEX u"<%= it.resource_index %>") ;; index of the resource 7 | 8 | (define-public (execute (sender principal)) 9 | (begin 10 | ;; send a message from the dao 11 | (try! (contract-call? '<%= it.messaging_contract %> send CFG_MESSAGE true)) 12 | ;; toggle a resource enabled status by index 13 | (contract-call? '<%= it.payments_dao_contract %> toggle-resource CFG_RESOURCE_INDEX) 14 | ) 15 | ) 16 | -------------------------------------------------------------------------------- /src/aibtc-dao/templates/dao/proposals/aibtc-pmt-sbtc-add-resource.clar: -------------------------------------------------------------------------------- 1 | (impl-trait '<%= it.dao_proposal_trait %>) 2 | 3 | ;; template vars 4 | ;; 5 | (define-constant CFG_MESSAGE "Executed Core Proposal: Added a new resource available in the BTC payment processor") 6 | (define-constant CFG_RESOURCE_NAME u"<%= it.resource_name %>") ;; name of the resource 7 | (define-constant CFG_RESOURCE_DESCRIPTION u"<%= it.resource_description %>") ;; description of the resource 8 | (define-constant CFG_RESOURCE_AMOUNT u<%= it.resource_amount %>) ;; 0.01 BTC (8 decimals) 9 | (define-constant CFG_RESOURCE_URL <% if (it.resource_url) { %> (some u"<%= it.resource_url %>") <% } else { %> none <% } %>) 10 | 11 | (define-public (execute (sender principal)) 12 | ;; adds a resource that can be used to pay invoices 13 | (begin 14 | ;; send a message from the dao 15 | (try! (contract-call? '<%= it.messaging_contract %> send CFG_MESSAGE true)) 16 | ;; add a resource to the payments contract 17 | (try! (contract-call? '<%= it.payments_sbtc_contract %> add-resource CFG_RESOURCE_NAME CFG_RESOURCE_DESCRIPTION CFG_RESOURCE_AMOUNT CFG_RESOURCE_URL)) 18 | (ok true) 19 | ) 20 | ) 21 | -------------------------------------------------------------------------------- /src/aibtc-dao/templates/dao/proposals/aibtc-pmt-sbtc-set-payment-address.clar: -------------------------------------------------------------------------------- 1 | (impl-trait '<%= it.dao_proposal_trait %>) 2 | 3 | ;; template vars 4 | ;; 5 | (define-constant CFG_MESSAGE "Executed Core Proposal: Updated the payment address in the BTC payment processor") 6 | (define-constant CFG_PAYOUT_ADDRESS '<%= it.payout_address %>) 7 | 8 | (define-public (execute (sender principal)) 9 | (begin 10 | ;; send a message from the dao 11 | (try! (contract-call? '<%= it.messaging_contract %> send CFG_MESSAGE true)) 12 | ;; set the payment address for invoices 13 | (contract-call? '<%= it.payments_sbtc_contract %> set-payment-address CFG_PAYOUT_ADDRESS) 14 | ) 15 | ) 16 | -------------------------------------------------------------------------------- /src/aibtc-dao/templates/dao/proposals/aibtc-pmt-sbtc-toggle-resource-by-name.clar: -------------------------------------------------------------------------------- 1 | (impl-trait '<%= it.dao_proposal_trait %>) 2 | 3 | ;; template vars 4 | ;; 5 | (define-constant CFG_MESSAGE "Executed Core Proposal: Toggled a resource status by name in the BTC payment processor") 6 | (define-constant CFG_RESOURCE_NAME u"<%= it.resource_name %>") ;; name of the resource 7 | 8 | (define-public (execute (sender principal)) 9 | (begin 10 | ;; send a message from the dao 11 | (try! (contract-call? '<%= it.messaging_contract %> send CFG_MESSAGE true)) 12 | ;; toggle a resource enabled status by name 13 | (contract-call? '<%= it.payments_sbtc_contract %> toggle-resource-by-name CFG_RESOURCE_NAME) 14 | ) 15 | ) 16 | -------------------------------------------------------------------------------- /src/aibtc-dao/templates/dao/proposals/aibtc-pmt-sbtc-toggle-resource.clar: -------------------------------------------------------------------------------- 1 | (impl-trait '<%= it.dao_proposal_trait %>) 2 | 3 | ;; template vars 4 | ;; 5 | (define-constant CFG_MESSAGE "Executed Core Proposal: Toggled a resource status by index in the BTC payment processor") 6 | (define-constant CFG_RESOURCE_INDEX u<%= it.resource_index %>) ;; index of the resource 7 | 8 | (define-public (execute (sender principal)) 9 | (begin 10 | ;; send a message from the dao 11 | (try! (contract-call? '<%= it.messaging_contract %> send CFG_MESSAGE true)) 12 | ;; toggle a resource enabled status by index 13 | (contract-call? '<%= it.payments_sbtc_contract %> toggle-resource CFG_RESOURCE_INDEX) 14 | ) 15 | ) 16 | -------------------------------------------------------------------------------- /src/aibtc-dao/templates/dao/proposals/aibtc-pmt-stx-add-resource.clar: -------------------------------------------------------------------------------- 1 | (impl-trait '<%= it.dao_proposal_trait %>) 2 | 3 | ;; template vars 4 | ;; 5 | (define-constant CFG_MESSAGE "Executed Core Proposal: Added a new resource available in the STX payment processor") 6 | (define-constant CFG_RESOURCE_NAME u"<%= it.resource_name %>") ;; name of the resource 7 | (define-constant CFG_RESOURCE_DESCRIPTION u"<%= it.resource_description %>") ;; description of the resource 8 | (define-constant CFG_RESOURCE_AMOUNT u<%= it.resource_amount %>) ;; microSTX (8 decimals) 9 | (define-constant CFG_RESOURCE_URL <% if (it.resource_url) { %> (some u"<%= it.resource_url %>") <% } else { %> none <% } %>) 10 | 11 | (define-public (execute (sender principal)) 12 | ;; adds a resource that can be used to pay invoices 13 | (begin 14 | ;; send a message from the dao 15 | (try! (contract-call? '<%= it.messaging_contract %> send CFG_MESSAGE true)) 16 | ;; add a resource to the payments contract 17 | (try! (contract-call? '<%= it.payments_stx_contract %> add-resource CFG_RESOURCE_NAME CFG_RESOURCE_DESCRIPTION CFG_RESOURCE_AMOUNT CFG_RESOURCE_URL)) 18 | (ok true) 19 | ) 20 | ) 21 | -------------------------------------------------------------------------------- /src/aibtc-dao/templates/dao/proposals/aibtc-pmt-stx-set-payment-address.clar: -------------------------------------------------------------------------------- 1 | (impl-trait '<%= it.dao_proposal_trait %>) 2 | 3 | ;; template vars 4 | ;; 5 | (define-constant CFG_MESSAGE "Executed Core Proposal: Updated the payment address in the STX payment processor") 6 | (define-constant CFG_PAYOUT_ADDRESS '<%= it.payout_address %>) 7 | 8 | (define-public (execute (sender principal)) 9 | (begin 10 | ;; send a message from the dao 11 | (try! (contract-call? '<%= it.messaging_contract %> send CFG_MESSAGE true)) 12 | ;; set the payment address for invoices 13 | (contract-call? '<%= it.payments_stx_contract %> set-payment-address CFG_PAYOUT_ADDRESS) 14 | ) 15 | ) 16 | -------------------------------------------------------------------------------- /src/aibtc-dao/templates/dao/proposals/aibtc-pmt-stx-toggle-resource-by-name.clar: -------------------------------------------------------------------------------- 1 | (impl-trait '<%= it.dao_proposal_trait %>) 2 | 3 | ;; template vars 4 | ;; 5 | (define-constant CFG_MESSAGE "Executed Core Proposal: Toggled a resource status by name in the STX payment processor") 6 | (define-constant CFG_RESOURCE_NAME u"<%= it.resource_name %>") ;; name of the resource 7 | 8 | (define-public (execute (sender principal)) 9 | (begin 10 | ;; send a message from the dao 11 | (try! (contract-call? '<%= it.messaging_contract %> send CFG_MESSAGE true)) 12 | ;; toggle a resource enabled status by name 13 | (contract-call? '<%= it.payments_stx_contract %> toggle-resource-by-name CFG_RESOURCE_NAME) 14 | ) 15 | ) 16 | -------------------------------------------------------------------------------- /src/aibtc-dao/templates/dao/proposals/aibtc-pmt-stx-toggle-resource.clar: -------------------------------------------------------------------------------- 1 | (impl-trait '<%= it.dao_proposal_trait %>) 2 | 3 | ;; template vars 4 | ;; 5 | (define-constant CFG_MESSAGE "Executed Core Proposal: Toggled a resource status by index in the STX payment processor") 6 | (define-constant CFG_RESOURCE_INDEX u<%= it.resource_index %>) ;; index of the resource 7 | 8 | (define-public (execute (sender principal)) 9 | (begin 10 | ;; send a message from the dao 11 | (try! (contract-call? '<%= it.messaging_contract %> send CFG_MESSAGE true)) 12 | ;; toggle a resource enabled status by index 13 | (contract-call? '<%= it.payments_stx_contract %> toggle-resource CFG_RESOURCE_INDEX) 14 | ) 15 | ) 16 | -------------------------------------------------------------------------------- /src/aibtc-dao/templates/dao/proposals/aibtc-timed-vault-dao-initialize-new-vault.clar: -------------------------------------------------------------------------------- 1 | (impl-trait '<%= it.dao_proposal_trait %>) 2 | 3 | ;; template vars 4 | ;; 5 | (define-constant CFG_MESSAGE "Executed Core Proposal: Initialized a new DAO token timed vault in the base dao and funded it from the treasury") 6 | (define-constant CFG_ACCOUNT_HOLDER <%= it.account_holder %>) ;; the account holder of the vault 7 | (define-constant CFG_AMOUNT_TO_FUND_DAO u<%= it.amount_to_fund %>) ;; set to 0 to skip, in microDAO tokens 8 | 9 | (define-public (execute (sender principal)) 10 | (begin 11 | ;; send a message from the dao 12 | (try! (contract-call? '<%= it.messaging_contract %> send CFG_MESSAGE true)) 13 | ;; set the account holder in the timed vault 14 | (try! (contract-call? '<%= it.timed_vault_contract %> set-account-holder CFG_ACCOUNT_HOLDER)) 15 | ;; enable the extension in the dao 16 | (try! (contract-call? <%= it.base_dao_contract %> set-extension '<%= it.timed_vault_contract %> true)) 17 | ;; fund the extension from the treasury 18 | (and (> CFG_AMOUNT_TO_FUND_DAO u0) 19 | (try! (contract-call? <%= it.treasury_contract %> withdraw-ft '<%= it.token_contract %> CFG_AMOUNT_TO_FUND_DAO '<%= it.timed_vault_contract %>))) 20 | (ok true) 21 | ) 22 | ) 23 | -------------------------------------------------------------------------------- /src/aibtc-dao/templates/dao/proposals/aibtc-timed-vault-dao-override-last-withdrawal-block.clar: -------------------------------------------------------------------------------- 1 | (impl-trait '<%= it.dao_proposal_trait %>) 2 | 3 | ;; template vars 4 | ;; 5 | (define-constant CFG_MESSAGE "Executed Core Proposal: Overwrote last withdrawal block in the DAO token timed vault extension") 6 | (define-constant CFG_LAST_WITHDRAWAL_BLOCK u<%= it.last_withdrawal_block %>) ;; the last withdrawal block to set 7 | 8 | (define-public (execute (sender principal)) 9 | (begin 10 | ;; send a message from the dao 11 | (try! (contract-call? '<%= it.messaging_contract %> send CFG_MESSAGE true)) 12 | ;; override last withdrawal block in the timed vault 13 | (contract-call? '<%= it.timed_vault_contract %> override-last-withdrawal-block CFG_LAST_WITHDRAWAL_BLOCK) 14 | ) 15 | ) 16 | -------------------------------------------------------------------------------- /src/aibtc-dao/templates/dao/proposals/aibtc-timed-vault-dao-set-account-holder.clar: -------------------------------------------------------------------------------- 1 | (impl-trait '<%= it.dao_proposal_trait %>) 2 | 3 | ;; template vars 4 | ;; 5 | (define-constant CFG_MESSAGE "Executed Core Proposal: Set or updated the account holder in the DAO token timed vault extension") 6 | (define-constant CFG_ACCOUNT_HOLDER '<%= it.account_holder %>) ;; the account holder of the vault 7 | 8 | (define-public (execute (sender principal)) 9 | (begin 10 | ;; send a message from the dao 11 | (try! (contract-call? '<%= it.messaging_contract %> send CFG_MESSAGE true)) 12 | ;; set the account holder 13 | (contract-call? '<%= it.timed_vault_contract %> set-account-holder CFG_ACCOUNT_HOLDER) 14 | ) 15 | ) 16 | -------------------------------------------------------------------------------- /src/aibtc-dao/templates/dao/proposals/aibtc-timed-vault-dao-set-withdrawal-amount.clar: -------------------------------------------------------------------------------- 1 | (impl-trait '<%= it.dao_proposal_trait %>) 2 | 3 | ;; template vars 4 | ;; 5 | (define-constant CFG_MESSAGE "Executed Core Proposal: Set withdrawal amount in the DAO token timed vault extension") 6 | (define-constant CFG_WITHDRAWAL_AMOUNT u<%= it.withdrawal_amount %>) 7 | 8 | (define-public (execute (sender principal)) 9 | (begin 10 | ;; send a message from the dao 11 | (try! (contract-call? '<%= it.messaging_contract %> send CFG_MESSAGE true)) 12 | ;; set the withdrawal amount 13 | (contract-call? '<%= it.timed_vault_contract %> set-withdrawal-amount CFG_WITHDRAWAL_AMOUNT) 14 | ) 15 | ) 16 | -------------------------------------------------------------------------------- /src/aibtc-dao/templates/dao/proposals/aibtc-timed-vault-dao-set-withdrawal-period.clar: -------------------------------------------------------------------------------- 1 | (impl-trait '<%= it.dao_proposal_trait %>) 2 | 3 | ;; template vars 4 | ;; 5 | (define-constant CFG_MESSAGE "Executed Core Proposal: Set withdrawal period in the DAO token timed vault extension") 6 | (define-constant CFG_WITHDRAWAL_PERIOD u<%= it.withdrawal_period %>) ;; the withdrawal period to set 7 | 8 | (define-public (execute (sender principal)) 9 | (begin 10 | ;; send a message from the dao 11 | (try! (contract-call? '<%= it.messaging_contract %> send CFG_MESSAGE true)) 12 | ;; set the withdrawal period 13 | (contract-call? '<%= it.timed_vault_contract %> set-withdrawal-period CFG_WITHDRAWAL_PERIOD) 14 | ) 15 | ) 16 | -------------------------------------------------------------------------------- /src/aibtc-dao/templates/dao/proposals/aibtc-timed-vault-dao-withdraw.clar: -------------------------------------------------------------------------------- 1 | (impl-trait '<%= it.dao_proposal_trait %>) 2 | 3 | ;; template vars 4 | ;; 5 | (define-constant CFG_MESSAGE "Executed Core Proposal: Withdrew DAO tokens from the timed vault extension") 6 | 7 | (define-public (execute (sender principal)) 8 | (begin 9 | ;; send a message from the dao 10 | (try! (contract-call? '<%= it.messaging_contract %> send CFG_MESSAGE true)) 11 | ;; withdraw DAO tokens from the timed vault 12 | (contract-call? '<%= it.timed_vault_contract %> withdraw) 13 | ) 14 | ) 15 | -------------------------------------------------------------------------------- /src/aibtc-dao/templates/dao/proposals/aibtc-timed-vault-initialize-new-account.clar: -------------------------------------------------------------------------------- 1 | (impl-trait <%= it.dao_proposal_trait %>) 2 | 3 | ;; template vars 4 | ;; 5 | (define-constant CFG_MESSAGE "Initialized a new timed vault in the base dao and funded it from the treasury") 6 | (define-constant CFG_ACCOUNT_HOLDER '<%= it.account_holder %>) 7 | (define-constant CFG_TIMED_VAULT_CONTRACT '<%= it.timed_vault_contract %>) 8 | (define-constant CFG_AMOUNT_TO_FUND_STX u<%= it.amount_to_fund_stx %>) ;; set to 0 to skip, in microSTX 9 | (define-constant CFG_AMOUNT_TO_FUND_FT u<%= it.amount_to_fund_ft %>) ;; set to 0 to skip, in microFT 10 | 11 | (define-public (execute (sender principal)) 12 | (begin 13 | ;; send a message from the dao 14 | (try! (contract-call? '<%= it.message_contract %> send CFG_MESSAGE true)) 15 | ;; set the account holder in the timed vault 16 | (try! (contract-call? '<%= it.timed_vault_contract %> set-account-holder CFG_ACCOUNT_HOLDER)) 17 | ;; enable the extension in the dao 18 | (try! (contract-call? '<%= it.base_dao_contract %> set-extension CFG_TIMED_VAULT_CONTRACT true)) 19 | ;; fund the extension from the treasury 20 | (and (> CFG_AMOUNT_TO_FUND_STX u0) 21 | (try! (contract-call? '<%= it.treasury_contract %> withdraw-stx CFG_AMOUNT_TO_FUND_STX CFG_TIMED_VAULT_CONTRACT))) 22 | (and (> CFG_AMOUNT_TO_FUND_FT u0) 23 | (try! (contract-call? '<%= it.treasury_contract %> withdraw-ft <%= it.token_contract %> CFG_AMOUNT_TO_FUND_FT CFG_TIMED_VAULT_CONTRACT))) 24 | (ok true) 25 | ) 26 | ) 27 | -------------------------------------------------------------------------------- /src/aibtc-dao/templates/dao/proposals/aibtc-timed-vault-override-last-withdrawal-block.clar: -------------------------------------------------------------------------------- 1 | (impl-trait <%= it.dao_proposal_trait %>) 2 | 3 | ;; template vars 4 | ;; 5 | (define-constant CFG_MESSAGE "Executed Core Proposal: Override last withdrawal block in the timed vault extension") 6 | (define-constant CFG_LAST_WITHDRAWAL_BLOCK u<%= it.last_withdrawal_block %>) 7 | 8 | (define-public (execute (sender principal)) 9 | (begin 10 | ;; send a message from the dao 11 | (try! (contract-call? '<%= it.message_contract %> send CFG_MESSAGE true)) 12 | ;; override last withdrawal block in the timed vault 13 | (contract-call? '<%= it.timed_vault_contract %> override-last-withdrawal-block CFG_LAST_WITHDRAWAL_BLOCK) 14 | ) 15 | ) 16 | -------------------------------------------------------------------------------- /src/aibtc-dao/templates/dao/proposals/aibtc-timed-vault-sbtc-initialize-new-vault.clar: -------------------------------------------------------------------------------- 1 | (impl-trait '<%= it.dao_proposal_trait %>) 2 | 3 | ;; template vars 4 | ;; 5 | (define-constant CFG_MESSAGE "Executed Core Proposal: Initialized a new BTC timed vault in the base dao and funded it from the treasury") 6 | (define-constant CFG_ACCOUNT_HOLDER '<%= it.account_holder %>) ;; the account holder of the vault 7 | (define-constant CFG_AMOUNT_TO_FUND_SBTC u<%= it.amount_to_fund %>) ;; set to 0 to skip, in microsBTC 8 | 9 | (define-public (execute (sender principal)) 10 | (begin 11 | ;; send a message from the dao 12 | (try! (contract-call? '<%= it.messaging_contract %> send CFG_MESSAGE true)) 13 | ;; set the account holder in the timed vault 14 | (try! (contract-call? '<%= it.timed_vault_contract %> set-account-holder CFG_ACCOUNT_HOLDER)) 15 | ;; enable the extension in the dao 16 | (try! (contract-call? <%= it.base_dao_contract %> set-extension '<%= it.timed_vault_contract %> true)) 17 | ;; fund the extension from the treasury 18 | (and (> CFG_AMOUNT_TO_FUND_SBTC u0) 19 | (try! (contract-call? <%= it.treasury_contract %> withdraw-ft 'STV9K21TBFAK4KNRJXF5DFP8N7W46G4V9RJ5XDY2.sbtc-token CFG_AMOUNT_TO_FUND_SBTC '<%= it.timed_vault_contract %>))) 20 | (ok true) 21 | ) 22 | ) 23 | -------------------------------------------------------------------------------- /src/aibtc-dao/templates/dao/proposals/aibtc-timed-vault-sbtc-override-last-withdrawal-block.clar: -------------------------------------------------------------------------------- 1 | (impl-trait '<%= it.dao_proposal_trait %>) 2 | 3 | ;; template vars 4 | ;; 5 | (define-constant CFG_MESSAGE "Executed Core Proposal: Overwrote last withdrawal block in the BTC timed vault extension") 6 | (define-constant CFG_LAST_WITHDRAWAL_BLOCK u<%= it.last_withdrawal_block %>) ;; the last withdrawal block to set 7 | 8 | (define-public (execute (sender principal)) 9 | (begin 10 | ;; send a message from the dao 11 | (try! (contract-call? '<%= it.messaging_contract %> send CFG_MESSAGE true)) 12 | ;; override last withdrawal block in the timed vault 13 | (contract-call? '<%= it.timed_vault_contract %> override-last-withdrawal-block CFG_LAST_WITHDRAWAL_BLOCK) 14 | ) 15 | ) 16 | -------------------------------------------------------------------------------- /src/aibtc-dao/templates/dao/proposals/aibtc-timed-vault-sbtc-set-account-holder.clar: -------------------------------------------------------------------------------- 1 | (impl-trait '<%= it.dao_proposal_trait %>) 2 | 3 | ;; template vars 4 | ;; 5 | (define-constant CFG_MESSAGE "Executed Core Proposal: Set or updated the account holder in the BTC timed vault extension") 6 | (define-constant CFG_ACCOUNT_HOLDER '<%= it.account_holder %>) ;; the account holder of the vault 7 | 8 | (define-public (execute (sender principal)) 9 | (begin 10 | ;; send a message from the dao 11 | (try! (contract-call? '<%= it.messaging_contract %> send CFG_MESSAGE true)) 12 | ;; set the account holder 13 | (contract-call? '<%= it.timed_vault_contract %> set-account-holder CFG_ACCOUNT_HOLDER) 14 | ) 15 | ) 16 | -------------------------------------------------------------------------------- /src/aibtc-dao/templates/dao/proposals/aibtc-timed-vault-sbtc-set-withdrawal-amount.clar: -------------------------------------------------------------------------------- 1 | (impl-trait '<%= it.dao_proposal_trait %>) 2 | 3 | ;; template vars 4 | ;; 5 | (define-constant CFG_MESSAGE "Executed Core Proposal: Set withdrawal amount in the BTC timed vault extension") 6 | (define-constant CFG_WITHDRAWAL_AMOUNT u<%= it.withdrawal_amount %>) ;; the withdrawal amount to set 7 | 8 | (define-public (execute (sender principal)) 9 | (begin 10 | ;; send a message from the dao 11 | (try! (contract-call? '<%= it.messaging_contract %> send CFG_MESSAGE true)) 12 | ;; set the withdrawal amount 13 | (contract-call? '<%= it.timed_vault_contract %> set-withdrawal-amount CFG_WITHDRAWAL_AMOUNT) 14 | ) 15 | ) 16 | -------------------------------------------------------------------------------- /src/aibtc-dao/templates/dao/proposals/aibtc-timed-vault-sbtc-set-withdrawal-period.clar: -------------------------------------------------------------------------------- 1 | (impl-trait '<%= it.dao_proposal_trait %>) 2 | 3 | ;; template vars 4 | ;; 5 | (define-constant CFG_MESSAGE "Executed Core Proposal: Set withdrawal period in the BTC timed vault extension") 6 | (define-constant CFG_WITHDRAWAL_PERIOD u<%= it.withdrawal_period %>) ;; the withdrawal period to set 7 | 8 | (define-public (execute (sender principal)) 9 | (begin 10 | ;; send a message from the dao 11 | (try! (contract-call? '<%= it.messaging_contract %> send CFG_MESSAGE true)) 12 | ;; set the withdrawal period 13 | (contract-call? '<%= it.timed_vault_contract %> set-withdrawal-period CFG_WITHDRAWAL_PERIOD) 14 | ) 15 | ) 16 | -------------------------------------------------------------------------------- /src/aibtc-dao/templates/dao/proposals/aibtc-timed-vault-sbtc-withdraw.clar: -------------------------------------------------------------------------------- 1 | (impl-trait '<%= it.dao_proposal_trait %>) 2 | 3 | ;; template vars 4 | ;; 5 | (define-constant CFG_MESSAGE "Executed Core Proposal: Withdrew BTC from the timed vault extension") 6 | 7 | (define-public (execute (sender principal)) 8 | (begin 9 | ;; send a message from the dao 10 | (try! (contract-call? '<%= it.messaging_contract %> send CFG_MESSAGE true)) 11 | ;; withdraw sBTC from the timed vault 12 | (contract-call? '<%= it.timed_vault_contract %> withdraw) 13 | ) 14 | ) 15 | -------------------------------------------------------------------------------- /src/aibtc-dao/templates/dao/proposals/aibtc-timed-vault-set-account-holder.clar: -------------------------------------------------------------------------------- 1 | (impl-trait <%= it.dao_proposal_trait %>) 2 | 3 | ;; template vars 4 | ;; 5 | (define-constant CFG_MESSAGE "Executed Core Proposal: Set or updated the account holder in the timed vault extension") 6 | (define-constant CFG_ACCOUNT_HOLDER '<%= it.account_holder %>) 7 | 8 | (define-public (execute (sender principal)) 9 | (begin 10 | ;; send a message from the dao 11 | (try! (contract-call? '<%= it.message_contract %> send CFG_MESSAGE true)) 12 | ;; set the account holder 13 | (contract-call? '<%= it.timed_vault_contract %> set-account-holder CFG_ACCOUNT_HOLDER) 14 | ) 15 | ) 16 | -------------------------------------------------------------------------------- /src/aibtc-dao/templates/dao/proposals/aibtc-timed-vault-set-withdrawal-amount.clar: -------------------------------------------------------------------------------- 1 | (impl-trait <%= it.dao_proposal_trait %>) 2 | 3 | ;; template vars 4 | ;; 5 | (define-constant CFG_MESSAGE "Executed Core Proposal: Set withdrawal amount in the timed vault extension") 6 | (define-constant CFG_WITHDRAWAL_AMOUNT u<%= it.withdrawal_amount %>) 7 | 8 | (define-public (execute (sender principal)) 9 | (begin 10 | ;; send a message from the dao 11 | (try! (contract-call? '<%= it.message_contract %> send CFG_MESSAGE true)) 12 | ;; set the withdrawal amount 13 | (contract-call? '<%= it.timed_vault_contract %> set-withdrawal-amount CFG_WITHDRAWAL_AMOUNT) 14 | ) 15 | ) 16 | -------------------------------------------------------------------------------- /src/aibtc-dao/templates/dao/proposals/aibtc-timed-vault-set-withdrawal-period.clar: -------------------------------------------------------------------------------- 1 | (impl-trait <%= it.dao_proposal_trait %>) 2 | 3 | ;; template vars 4 | ;; 5 | (define-constant CFG_MESSAGE "Executed Core Proposal: Set withdrawal period in the timed vault extension") 6 | (define-constant CFG_WITHDRAWAL_PERIOD u<%= it.withdrawal_period %>) 7 | 8 | (define-public (execute (sender principal)) 9 | (begin 10 | ;; send a message from the dao 11 | (try! (contract-call? '<%= it.message_contract %> send CFG_MESSAGE true)) 12 | ;; set the withdrawal period 13 | (contract-call? '<%= it.timed_vault_contract %> set-withdrawal-period CFG_WITHDRAWAL_PERIOD) 14 | ) 15 | ) 16 | -------------------------------------------------------------------------------- /src/aibtc-dao/templates/dao/proposals/aibtc-timed-vault-stx-initialize-new-vault.clar: -------------------------------------------------------------------------------- 1 | (impl-trait '<%= it.dao_proposal_trait %>) 2 | 3 | ;; template vars 4 | ;; 5 | (define-constant CFG_MESSAGE "Executed Core Proposal: Initialized a new STX timed vault in the base dao and funded it from the treasury") 6 | (define-constant CFG_ACCOUNT_HOLDER '<%= it.account_holder %>) ;; the account holder of the vault 7 | (define-constant CFG_AMOUNT_TO_FUND_STX u<%= it.amount_to_fund_stx %>) ;; set to 0 to skip, in microSTX 8 | (define-constant CFG_AMOUNT_TO_FUND_FT u<%= it.amount_to_fund_ft %>) ;; set to 0 to skip, in microFT 9 | 10 | (define-public (execute (sender principal)) 11 | (begin 12 | ;; send a message from the dao 13 | (try! (contract-call? '<%= it.messaging_contract %> send CFG_MESSAGE true)) ;; CFG_MESSAGE_CONTRACT 14 | ;; set the account holder in the timed vault 15 | (try! (contract-call? '<%= it.timed_vault_contract %> set-account-holder CFG_ACCOUNT_HOLDER)) ;; CFG_NEW_TIMED_VAULT_CONTRACT 16 | ;; enable the extension in the dao 17 | (try! (contract-call? <%= it.base_dao_contract %> set-extension '<%= it.timed_vault_contract %> true)) ;; CFG_BASE_DAO, CFG_NEW_TIMED_VAULT_CONTRACT 18 | ;; fund the extension from the treasury 19 | (and (> CFG_AMOUNT_TO_FUND_STX u0) 20 | (try! (contract-call? <%= it.treasury_contract %> withdraw-stx CFG_AMOUNT_TO_FUND_STX '<%= it.timed_vault_contract %>))) ;; CFG_TREASURY_CONTRACT, CFG_NEW_TIMED_VAULT_CONTRACT 21 | (and (> CFG_AMOUNT_TO_FUND_FT u0) 22 | (try! (contract-call? <%= it.treasury_contract %> withdraw-ft '<%= it.token_contract %>-token CFG_AMOUNT_TO_FUND_FT '<%= it.timed_vault_contract %>))) ;; CFG_TREASURY_CONTRACT, CFG_TOKEN_CONTRACT, CFG_NEW_TIMED_VAULT_CONTRACT 23 | (ok true) 24 | ) 25 | ) 26 | -------------------------------------------------------------------------------- /src/aibtc-dao/templates/dao/proposals/aibtc-timed-vault-stx-override-last-withdrawal-block.clar: -------------------------------------------------------------------------------- 1 | (impl-trait '<%= it.dao_proposal_trait %>) 2 | 3 | ;; template vars 4 | ;; 5 | (define-constant CFG_MESSAGE "Executed Core Proposal: Overwrote last withdrawal block in the STX timed vault extension") 6 | (define-constant CFG_LAST_WITHDRAWAL_BLOCK u<%= it.last_withdrawal_block %>) ;; the last withdrawal block to set 7 | 8 | (define-public (execute (sender principal)) 9 | (begin 10 | ;; send a message from the dao 11 | (try! (contract-call? '<%= it.messaging_contract %> send CFG_MESSAGE true)) ;; CFG_MESSAGE_CONTRACT 12 | ;; override last withdrawal block in the timed vault 13 | (contract-call? '<%= it.timed_vault_contract %> override-last-withdrawal-block CFG_LAST_WITHDRAWAL_BLOCK) ;; CFG_TIMED_VAULT_CONTRACT 14 | ) 15 | ) 16 | -------------------------------------------------------------------------------- /src/aibtc-dao/templates/dao/proposals/aibtc-timed-vault-stx-set-account-holder.clar: -------------------------------------------------------------------------------- 1 | (impl-trait '<%= it.dao_proposal_trait %>) 2 | 3 | ;; template vars 4 | ;; 5 | (define-constant CFG_MESSAGE "Executed Core Proposal: Set or updated the account holder in the STX timed vault extension") 6 | (define-constant CFG_ACCOUNT_HOLDER '<%= it.account_holder %>) ;; the account holder of the vault 7 | 8 | (define-public (execute (sender principal)) 9 | (begin 10 | ;; send a message from the dao 11 | (try! (contract-call? '<%= it.messaging_contract %> send CFG_MESSAGE true)) 12 | ;; set the account holder 13 | (contract-call? '<%= it.timed_vault_contract %> set-account-holder CFG_ACCOUNT_HOLDER) 14 | ) 15 | ) 16 | -------------------------------------------------------------------------------- /src/aibtc-dao/templates/dao/proposals/aibtc-timed-vault-stx-set-withdrawal-amount.clar: -------------------------------------------------------------------------------- 1 | (impl-trait '<%= it.dao_proposal_trait %>) 2 | 3 | ;; template vars 4 | ;; 5 | (define-constant CFG_MESSAGE "Executed Core Proposal: Set withdrawal amount in the STX timed vault extension") 6 | (define-constant CFG_WITHDRAWAL_AMOUNT u<%= it.withdrawal_amount %>) ;; 10 STX (6 decimals) 7 | 8 | (define-public (execute (sender principal)) 9 | (begin 10 | ;; send a message from the dao 11 | (try! (contract-call? '<%= it.messaging_contract %> send CFG_MESSAGE true)) 12 | ;; set the withdrawal amount 13 | (contract-call? '<%= it.timed_vault_contract %> set-withdrawal-amount CFG_WITHDRAWAL_AMOUNT) 14 | ) 15 | ) 16 | -------------------------------------------------------------------------------- /src/aibtc-dao/templates/dao/proposals/aibtc-timed-vault-stx-set-withdrawal-period.clar: -------------------------------------------------------------------------------- 1 | (impl-trait '<%= it.dao_proposal_trait %>) 2 | 3 | ;; template vars 4 | ;; 5 | (define-constant CFG_MESSAGE "Executed Core Proposal: Set withdrawal period in the STX timed vault extension") 6 | (define-constant CFG_WITHDRAWAL_PERIOD u<%= it.withdrawal_period %>) ;; the withdrawal period to set 7 | 8 | (define-public (execute (sender principal)) 9 | (begin 10 | ;; send a message from the dao 11 | (try! (contract-call? '<%= it.messaging_contract %> send CFG_MESSAGE true)) 12 | ;; set the withdrawal period 13 | (contract-call? '<%= it.timed_vault_contract %> set-withdrawal-period CFG_WITHDRAWAL_PERIOD) 14 | ) 15 | ) 16 | -------------------------------------------------------------------------------- /src/aibtc-dao/templates/dao/proposals/aibtc-timed-vault-stx-withdraw.clar: -------------------------------------------------------------------------------- 1 | (impl-trait '<%= it.dao_proposal_trait %>) 2 | 3 | ;; template vars 4 | ;; 5 | (define-constant CFG_MESSAGE "Executed Core Proposal: Withdrew STX from the timed vault extension") 6 | 7 | (define-public (execute (sender principal)) 8 | (begin 9 | ;; send a message from the dao 10 | (try! (contract-call? '<%= it.messaging_contract %> send CFG_MESSAGE true)) 11 | ;; withdraw STX from the timed vault 12 | (contract-call? '<%= it.timed_vault_contract %> withdraw) 13 | ) 14 | ) 15 | -------------------------------------------------------------------------------- /src/aibtc-dao/templates/dao/proposals/aibtc-token-owner-set-token-uri.clar: -------------------------------------------------------------------------------- 1 | (impl-trait '<%= it.dao_proposal_trait %>) 2 | 3 | ;; template vars 4 | ;; 5 | (define-constant CFG_MESSAGE "Executed Core Proposal: Set token URI in the DAO token contract") 6 | (define-constant CFG_TOKEN_URI "<%= it.token_uri %>") 7 | 8 | (define-public (execute (sender principal)) 9 | (begin 10 | ;; send a message from the dao 11 | (try! (contract-call? '<%= it.message_contract %> send CFG_MESSAGE true)) 12 | ;; set token uri in the token owner contract 13 | (contract-call? '<%= it.token_owner_contract %> set-token-uri CFG_TOKEN_URI) 14 | ) 15 | ) 16 | -------------------------------------------------------------------------------- /src/aibtc-dao/templates/dao/proposals/aibtc-token-owner-transfer-ownership.clar: -------------------------------------------------------------------------------- 1 | (impl-trait '<%= it.dao_proposal_trait %>) 2 | 3 | ;; template vars 4 | ;; 5 | (define-constant CFG_MESSAGE "Executed Core Proposal: Transferred token ownership to new owner in the DAO token contract") 6 | (define-constant CFG_NEW_OWNER '<%= it.new_owner_address %>) 7 | 8 | (define-public (execute (sender principal)) 9 | (begin 10 | ;; send a message from the dao 11 | (try! (contract-call? '<%= it.message_contract %> send CFG_MESSAGE true)) 12 | ;; transfer ownership to new owner 13 | (contract-call? '<%= it.token_owner_contract %> transfer-ownership <%= it.new_owner %>) 14 | ) 15 | ) 16 | -------------------------------------------------------------------------------- /src/aibtc-dao/templates/dao/proposals/aibtc-treasury-allow-asset.clar: -------------------------------------------------------------------------------- 1 | (impl-trait '<%= it.dao_proposal_trait %>) 2 | 3 | ;; template vars 4 | ;; 5 | (define-constant CFG_MESSAGE "Executed Core Proposal: Allowed or enabled asset for use in the treasury extension") 6 | (define-constant CFG_ASSET '<%= it.asset_contract %>) 7 | 8 | (define-public (execute (sender principal)) 9 | (begin 10 | ;; send a message from the dao 11 | (try! (contract-call? '<%= it.message_contract %> send CFG_MESSAGE true)) 12 | ;; allow an asset for deposit and withdrawal in the treasury 13 | (contract-call? '<%= it.treasury_contract %> allow-asset CFG_ASSET true) 14 | ) 15 | ) 16 | -------------------------------------------------------------------------------- /src/aibtc-dao/templates/dao/proposals/aibtc-treasury-delegate-stx.clar: -------------------------------------------------------------------------------- 1 | (impl-trait '<%= it.dao_proposal_trait %>) 2 | 3 | ;; template vars 4 | ;; 5 | (define-constant CFG_MESSAGE "Executed Core Proposal: Delegated STX for stacking in the treasury extension") 6 | (define-constant CFG_AMOUNT u<%= it.delegate_amount %>) 7 | (define-constant CFG_DELEGATE_TO '<%= it.delegate_to %>) 8 | 9 | (define-public (execute (sender principal)) 10 | (begin 11 | ;; send a message from the dao 12 | (try! (contract-call? '<%= it.message_contract %> send CFG_MESSAGE true)) 13 | ;; delegate STX for stacking 14 | (contract-call? '<%= it.treasury_contract %> delegate-stx CFG_AMOUNT CFG_DELEGATE_TO) 15 | ) 16 | ) 17 | -------------------------------------------------------------------------------- /src/aibtc-dao/templates/dao/proposals/aibtc-treasury-disable-asset.clar: -------------------------------------------------------------------------------- 1 | (impl-trait '<%= it.dao_proposal_trait %>) 2 | 3 | ;; template vars 4 | ;; 5 | (define-constant CFG_MESSAGE "Executed Core Proposal: Disabled an asset for deposit and withdrawal in the treasury") 6 | (define-constant CFG_ASSET_CONTRACT '<%= it.asset_contract %>) 7 | 8 | (define-public (execute (sender principal)) 9 | (begin 10 | ;; send a message from the dao 11 | (try! (contract-call? '<%= it.message_contract %> send CFG_MESSAGE true)) 12 | ;; disable an asset for deposit and withdrawal in the treasury 13 | (contract-call? '<%= it.treasury_contract %> allow-asset CFG_ASSET_CONTRACT false) 14 | ) 15 | ) 16 | -------------------------------------------------------------------------------- /src/aibtc-dao/templates/dao/proposals/aibtc-treasury-revoke-delegation.clar: -------------------------------------------------------------------------------- 1 | (impl-trait '<%= it.dao_proposal_trait %>) 2 | 3 | ;; template vars 4 | ;; 5 | (define-constant CFG_MESSAGE "Executed Core Proposal: Revoked STX for stacking in the treasury extension") 6 | 7 | (define-public (execute (sender principal)) 8 | (begin 9 | ;; send a message from the dao 10 | (try! (contract-call? '<%= it.message_contract %> send CFG_MESSAGE true)) 11 | ;; revoke STX delegation 12 | (contract-call? '<%= it.treasury_contract %> revoke-delegate-stx) 13 | ) 14 | ) 15 | -------------------------------------------------------------------------------- /src/aibtc-dao/templates/dao/proposals/aibtc-treasury-withdraw-ft.clar: -------------------------------------------------------------------------------- 1 | (impl-trait '<%= it.dao_proposal_trait %>) 2 | 3 | ;; template vars 4 | ;; 5 | (define-constant CFG_MESSAGE "Executed Core Proposal: Withdrew fungible tokens in the treasury extension") 6 | (define-constant CFG_TOKEN_AMOUNT u<%= it.token_amount %>) ;; in microFT 7 | (define-constant CFG_RECIPIENT '<%= it.recipient_address %>) 8 | (define-constant CFG_TOKEN_CONTRACT '<%= it.token_contract %>) 9 | 10 | (define-public (execute (sender principal)) 11 | (begin 12 | ;; send a message from the dao 13 | (try! (contract-call? '<%= it.message_contract %> send CFG_MESSAGE true)) 14 | ;; withdraw fungible tokens from the treasury 15 | (contract-call? '<%= it.treasury_contract %> withdraw-ft CFG_TOKEN_CONTRACT CFG_TOKEN_AMOUNT CFG_RECIPIENT) 16 | ) 17 | ) 18 | -------------------------------------------------------------------------------- /src/aibtc-dao/templates/dao/proposals/aibtc-treasury-withdraw-nft.clar: -------------------------------------------------------------------------------- 1 | (impl-trait '<%= it.dao_proposal_trait %>) 2 | 3 | ;; template vars 4 | ;; 5 | (define-constant CFG_MESSAGE "Executed Core Proposal: Withdrew an NFT in the treasury extension") 6 | (define-constant CFG_NFT_ID <%= it.nft_id %>) 7 | (define-constant CFG_NFT_CONTRACT '<%= it.nft_contract %>) 8 | (define-constant CFG_RECIPIENT '<%= it.recipient_address %>) 9 | 10 | (define-public (execute (sender principal)) 11 | (begin 12 | ;; send a message from the dao 13 | (try! (contract-call? '<%= it.message_contract %> send CFG_MESSAGE true)) 14 | ;; withdraw an NFT from the treasury 15 | (contract-call? '<%= it.treasury_contract %> withdraw-nft CFG_NFT_CONTRACT CFG_NFT_ID CFG_RECIPIENT) 16 | ) 17 | ) 18 | -------------------------------------------------------------------------------- /src/aibtc-dao/templates/dao/proposals/aibtc-treasury-withdraw-stx.clar: -------------------------------------------------------------------------------- 1 | (impl-trait '<%= it.dao_proposal_trait %>) 2 | 3 | ;; template vars 4 | ;; 5 | (define-constant CFG_MESSAGE "Executed Core Proposal: Withdrew STX in the treasury extension") 6 | (define-constant CFG_STX_AMOUNT u<%= it.stx_amount %>) ;; in microSTX 7 | (define-constant CFG_RECIPIENT '<%= it.recipient_address %>) 8 | 9 | (define-public (execute (sender principal)) 10 | (begin 11 | ;; send a message from the dao 12 | (try! (contract-call? '<%= it.message_contract %> send CFG_MESSAGE true)) 13 | ;; withdraw STX from the treasury 14 | (contract-call? '<%= it.treasury_contract %> withdraw-stx CFG_STX_AMOUNT CFG_RECIPIENT) 15 | ) 16 | ) 17 | -------------------------------------------------------------------------------- /src/dexterity/add-liquidity.ts: -------------------------------------------------------------------------------- 1 | import { ContractId, Opcode } from "dexterity-sdk"; 2 | import Dexterity from "./client"; 3 | 4 | try { 5 | const vaultId = process.argv[2] as ContractId; 6 | const tokenAmount = Number(process.argv[3]); 7 | 8 | if (!vaultId || !tokenAmount) { 9 | throw new Error(`Invalid inputs, please provide: `) 10 | } 11 | 12 | const result = await Dexterity.getVault(vaultId)?.executeTransaction(Opcode.addLiquidity(), tokenAmount, {}) 13 | console.log(JSON.stringify(result, null, 2)) 14 | } catch (error) { 15 | console.error(error) 16 | } 17 | -------------------------------------------------------------------------------- /src/dexterity/client.ts: -------------------------------------------------------------------------------- 1 | import { Dexterity } from "dexterity-sdk"; 2 | import { CONFIG, deriveChildAccount, getNetwork } from "../utilities"; 3 | 4 | try { 5 | const { address, key } = await deriveChildAccount( 6 | CONFIG.NETWORK, 7 | CONFIG.MNEMONIC, 8 | CONFIG.ACCOUNT_INDEX 9 | ); 10 | await Dexterity.configure({ 11 | privateKey: key, 12 | stxAddress: address, 13 | apiKeyRotation: 'loop', 14 | parallelRequests: 10, 15 | maxHops: 4, 16 | }); 17 | await Dexterity.discover() 18 | } catch (error) { 19 | console.error(error) 20 | } 21 | 22 | export default Dexterity; 23 | -------------------------------------------------------------------------------- /src/dexterity/deploy-engine.ts: -------------------------------------------------------------------------------- 1 | import { ContractId } from "dexterity-sdk"; 2 | import Dexterity from "./client"; 3 | 4 | // farming rewards engine 5 | 6 | try { 7 | const vaultId = process.argv[3] as ContractId; 8 | 9 | if (!vaultId) { 10 | throw new Error(`Invalid inputs, please provide: `) 11 | } 12 | 13 | // deploy engine 14 | const result = await Dexterity.getVault(vaultId)?.deployHoldToEarnContract() 15 | console.log(JSON.stringify(result, null, 2)) 16 | 17 | // configure vault metadata 18 | const vault = Dexterity.getVault(vaultId) 19 | const contractName = vaultId.split('.')[1] 20 | const engineContractId = `${Dexterity.config.stxAddress}.${contractName}-hold-to-earn` 21 | const config: any = { properties: { engineContractId } } 22 | await vault?.updateMetadataWithStorage(config) 23 | } catch (error) { 24 | console.error(error) 25 | } 26 | -------------------------------------------------------------------------------- /src/dexterity/deploy-vault.ts: -------------------------------------------------------------------------------- 1 | import { ContractId, LPToken, TokenMetadata, Vault } from "dexterity-sdk"; 2 | import Dexterity from "./client"; 3 | 4 | // decentralized liquidity pool 5 | 6 | try { 7 | const name = process.argv[2] as string; 8 | const symbol = process.argv[3] as string; 9 | const image = process.argv[4] as string; 10 | const fee = parseInt(process.argv[5]); 11 | const tokenIdA = process.argv[6] as string; 12 | const tokenIdB = process.argv[7] as string; 13 | const reservesA = parseInt(process.argv[8]); 14 | const reservesB = parseInt(process.argv[9]); 15 | 16 | if (!name || !symbol || !image || !fee || !tokenIdA || !tokenIdB || !reservesA || !reservesB) { 17 | throw new Error(`Invalid inputs, please provide: `) 18 | } 19 | 20 | const safeName = name.replace(/[^a-zA-Z0-9]/g, '-').toLowerCase(); 21 | const description = `Liquidity vault for ${name}`; 22 | 23 | const config: LPToken = { 24 | contractId: `${Dexterity.config.stxAddress}.${safeName}`, 25 | name, 26 | symbol, 27 | decimals: 6, 28 | identifier: symbol, 29 | description, 30 | image, 31 | fee, 32 | liquidity: [ 33 | {...await Dexterity.getTokenInfo(tokenIdA), reserves: reservesA}, 34 | {...await Dexterity.getTokenInfo(tokenIdB), reserves: reservesB} 35 | ], 36 | } 37 | 38 | const metadata: TokenMetadata = { 39 | name: config.name, 40 | symbol: config.symbol, 41 | decimals: config.decimals, 42 | identifier: config.identifier, 43 | description: config.description!, 44 | image: config.image!, 45 | properties: { 46 | lpRebatePercent: config.fee, 47 | tokenAContract: tokenIdA, 48 | tokenBContract: tokenIdB, 49 | } 50 | } 51 | 52 | // setup vault metadata 53 | const vault = new Vault(config) 54 | console.log(JSON.stringify(vault, null, 2)) 55 | await vault.updateMetadataWithStorage(metadata) 56 | 57 | // deploy vault 58 | const tx = await vault.deployContract() 59 | console.log(JSON.stringify(tx, null, 2)) 60 | } catch (error) { 61 | console.error(error) 62 | } 63 | -------------------------------------------------------------------------------- /src/dexterity/get-swap-quote.ts: -------------------------------------------------------------------------------- 1 | import { ContractId } from "dexterity-sdk"; 2 | import Dexterity from "./client"; 3 | 4 | try { 5 | const tokenX = process.argv[2] as ContractId; 6 | const tokenY = process.argv[3] as ContractId; 7 | const amount = Number(process.argv[4]); 8 | if (!tokenX || !tokenY || !amount) { 9 | throw new Error(`Invalid inputs, please use full contract ids and amountIn as a integer: `) 10 | } 11 | const quote = await Dexterity.getQuote(tokenX, tokenY, amount); 12 | console.log(JSON.stringify(quote, null, 2)); 13 | } catch (error) { 14 | console.error(error) 15 | } -------------------------------------------------------------------------------- /src/dexterity/get-tokens.ts: -------------------------------------------------------------------------------- 1 | import Dexterity from "./client"; 2 | 3 | try { 4 | const tokens = await Dexterity.getTokens() 5 | console.log(JSON.stringify(tokens, null, 2)); 6 | } catch (error) { 7 | console.error(error) 8 | } 9 | -------------------------------------------------------------------------------- /src/dexterity/get-vaults.ts: -------------------------------------------------------------------------------- 1 | import Dexterity from "./client"; 2 | 3 | try { 4 | const vaults = await Dexterity.getVaults() 5 | console.log(JSON.stringify(vaults, null, 2)); 6 | } catch (error) { 7 | console.error(error) 8 | } 9 | -------------------------------------------------------------------------------- /src/dexterity/remove-liquidity.ts: -------------------------------------------------------------------------------- 1 | import { ContractId, Opcode } from "dexterity-sdk"; 2 | import Dexterity from "./client"; 3 | 4 | try { 5 | const vaultId = process.argv[2] as ContractId; 6 | const tokenAmount = Number(process.argv[3]); 7 | 8 | if (!vaultId || !tokenAmount) { 9 | throw new Error(`Invalid inputs, please provide: `) 10 | } 11 | 12 | const result = await Dexterity.getVault(vaultId)?.executeTransaction(Opcode.removeLiquidity(), tokenAmount, {}) 13 | console.log(JSON.stringify(result, null, 2)) 14 | } catch (error) { 15 | console.error(error) 16 | } 17 | -------------------------------------------------------------------------------- /src/dexterity/swap-tokens.ts: -------------------------------------------------------------------------------- 1 | import { ContractId } from "dexterity-sdk"; 2 | import Dexterity from "./client"; 3 | 4 | try { 5 | const tokenX = process.argv[2] as ContractId; 6 | const tokenY = process.argv[3] as ContractId; 7 | const amount = Number(process.argv[4]); 8 | if (!tokenX || !tokenY || !amount) { 9 | throw new Error(`Invalid inputs, please use full contract ids and amountIn as a integer: `) 10 | } 11 | const result = await Dexterity.executeSwap(tokenX, tokenY, amount) 12 | console.log(JSON.stringify(result, null, 2)) 13 | } catch (error) { 14 | console.error(error) 15 | } -------------------------------------------------------------------------------- /src/index.ts: -------------------------------------------------------------------------------- 1 | // export main scripts from aibtc-dao 2 | export * from "./aibtc-dao/generate-dao"; 3 | export * from "./aibtc-dao/deploy-dao"; 4 | 5 | // export services used in main scripts 6 | export * from "./aibtc-dao/registries/dao-contract-registry"; 7 | export * from "./aibtc-dao/services/dao-contract-generator"; 8 | export * from "./aibtc-dao/services/dao-contract-deployer"; 9 | 10 | // export types 11 | export * from "./aibtc-dao/types/dao-types"; 12 | 13 | // export cohort-0 modules 14 | export * from "./aibtc-cohort-0"; 15 | -------------------------------------------------------------------------------- /src/jing/get-pending-orders.ts: -------------------------------------------------------------------------------- 1 | import { CONFIG, deriveChildAccount } from "../utilities"; 2 | import { JingCashSDK, FormattedOrder } from "@jingcash/core-sdk"; 3 | 4 | async function getPendingOrders() { 5 | const { address } = await deriveChildAccount( 6 | CONFIG.NETWORK, 7 | CONFIG.MNEMONIC, 8 | CONFIG.ACCOUNT_INDEX 9 | ); 10 | 11 | const sdk = new JingCashSDK({ 12 | API_HOST: 13 | process.env.JING_API_URL || "https://backend-neon-ecru.vercel.app/api", 14 | API_KEY: process.env.JING_API_KEY || "dev-api-token", 15 | defaultAddress: address, 16 | network: CONFIG.NETWORK, 17 | }); 18 | 19 | try { 20 | const pendingOrders = await sdk.getPendingOrders(); 21 | 22 | const asks = pendingOrders.results.filter( 23 | (order: FormattedOrder) => order.type === "Ask" 24 | ); 25 | const bids = pendingOrders.results.filter( 26 | (order: FormattedOrder) => order.type === "Bid" 27 | ); 28 | 29 | console.log("\nOrder Summary:"); 30 | console.log(`Total Orders: ${pendingOrders.results.length}`); 31 | console.log(`Total Asks: ${asks.length}`); 32 | console.log(`Total Bids: ${bids.length}`); 33 | 34 | console.log("\nDetailed Orders:"); 35 | pendingOrders.results.forEach((order: FormattedOrder) => { 36 | console.log(`\nSwap ID: ${order.id}`); 37 | console.log(`Type: ${order.type}`); 38 | console.log(`Market: ${order.market}`); 39 | 40 | // For Bids: STX first, then Token 41 | if (order.type === "Bid") { 42 | console.log(`${order.displayStxAmount}`); 43 | console.log(`${order.displayAmount}`); 44 | } 45 | // For Asks: Token first, then STX 46 | else { 47 | console.log(`${order.displayAmount}`); 48 | console.log(`${order.displayStxAmount}`); 49 | } 50 | 51 | console.log(`${order.displayPrice}`); 52 | console.log(`Status: ${order.status}`); 53 | if (order.processedAt) { 54 | console.log( 55 | `Processed At: ${new Date(order.processedAt).toISOString()}` 56 | ); 57 | } 58 | if (order.txId) { 59 | console.log(`TX ID: ${order.txId}`); 60 | } 61 | }); 62 | } catch (error) { 63 | console.log(error); 64 | } 65 | } 66 | 67 | getPendingOrders() 68 | .then(() => process.exit(0)) 69 | .catch((error) => { 70 | console.error("\nError:", error.message); 71 | process.exit(1); 72 | }); 73 | -------------------------------------------------------------------------------- /src/jing/get-user-offers.ts: -------------------------------------------------------------------------------- 1 | import { CONFIG, deriveChildAccount } from "../utilities"; 2 | import { JingCashSDK } from "@jingcash/core-sdk"; 3 | 4 | if (!process.env.JING_API_URL || !process.env.JING_API_KEY) { 5 | console.log("Please set JING_API_URL and JING_API_KEY in your .env file"); 6 | process.exit(1); 7 | } 8 | 9 | const [pair, userAddress] = process.argv.slice(2); 10 | 11 | if (!pair || !userAddress) { 12 | console.log("Usage: get-user-offers "); 13 | console.log( 14 | "Example: bun src/jing/get-user-offers.ts PEPE-STX SP29D6YMDNAKN1P045T6Z817RTE1AC0JAA99WAX2B" 15 | ); 16 | process.exit(1); 17 | } 18 | 19 | const { address } = await deriveChildAccount( 20 | CONFIG.NETWORK, 21 | CONFIG.MNEMONIC, 22 | CONFIG.ACCOUNT_INDEX 23 | ); 24 | 25 | const jingcash = new JingCashSDK({ 26 | API_HOST: process.env.JING_API_URL, 27 | API_KEY: process.env.JING_API_KEY, 28 | defaultAddress: address, 29 | network: CONFIG.NETWORK, 30 | }); 31 | 32 | try { 33 | const userOffers = await jingcash.getUserOffers(pair, userAddress); 34 | console.log(JSON.stringify(userOffers, null, 2)); 35 | } catch (error) { 36 | console.log(error); 37 | } 38 | -------------------------------------------------------------------------------- /src/jing/list-markets.ts: -------------------------------------------------------------------------------- 1 | import { CONFIG, deriveChildAccount } from "../utilities"; 2 | import { JingCashSDK } from "@jingcash/core-sdk"; 3 | 4 | async function listAvailableMarkets() { 5 | const { address } = await deriveChildAccount( 6 | CONFIG.NETWORK, 7 | CONFIG.MNEMONIC, 8 | CONFIG.ACCOUNT_INDEX 9 | ); 10 | 11 | const sdk = new JingCashSDK({ 12 | API_HOST: 13 | process.env.JING_API_URL || "https://backend-neon-ecru.vercel.app/api", 14 | API_KEY: process.env.JING_API_KEY || "dev-api-token", 15 | defaultAddress: address, 16 | network: CONFIG.NETWORK, 17 | }); 18 | 19 | try { 20 | const markets = await sdk.getAvailableMarkets(); 21 | 22 | console.log("\n=== Available Markets on Jing.Cash ==="); 23 | console.log("Pair | Base Token Contract"); 24 | console.log("---------------------------------------------"); 25 | 26 | for (const market of markets) { 27 | console.log(`${market.pair.padEnd(13)} | ${market.baseToken.contract}`); 28 | } 29 | 30 | // Usage instructions 31 | console.log("\n=== How to Use ==="); 32 | console.log("1. To view orderbook for a specific market:"); 33 | console.log(" bun run src/jing/view-orderbook.ts "); 34 | console.log(" Example: bun run src/jing/view-orderbook.ts WELSH-STX"); 35 | console.log("\n2. To place orders:"); 36 | console.log( 37 | " - Create Ask (Sell): bun run src/jing/create-ask.ts " 38 | ); 39 | console.log( 40 | " - Create Bid (Buy): bun run src/jing/create-bid.ts " 41 | ); 42 | 43 | return markets; 44 | } catch (error) { 45 | console.error("Error fetching markets:", error); 46 | throw error; 47 | } 48 | } 49 | 50 | // If running directly (not imported) 51 | if (require.main === module) { 52 | listAvailableMarkets() 53 | .then(() => process.exit(0)) 54 | .catch((error) => { 55 | console.error("\nError:", error.message); 56 | process.exit(1); 57 | }); 58 | } 59 | 60 | export { listAvailableMarkets }; 61 | -------------------------------------------------------------------------------- /src/sip-009-nft/get-last-token-id.ts: -------------------------------------------------------------------------------- 1 | import { fetchCallReadOnlyFunction, cvToJSON } from "@stacks/transactions"; 2 | import { CONFIG, getNetwork, deriveChildAccount } from "../utilities"; 3 | 4 | async function getLastTokenId(contractAddress: string, contractName: string) { 5 | const network = getNetwork(CONFIG.NETWORK); 6 | const { address } = await deriveChildAccount( 7 | CONFIG.NETWORK, 8 | CONFIG.MNEMONIC, 9 | CONFIG.ACCOUNT_INDEX 10 | ); 11 | 12 | try { 13 | const result = await fetchCallReadOnlyFunction({ 14 | contractAddress, 15 | contractName, 16 | functionName: "get-last-token-id", 17 | functionArgs: [], 18 | network, 19 | senderAddress: address, 20 | }); 21 | 22 | const jsonResult = cvToJSON(result); 23 | console.log(jsonResult.value); 24 | } catch (error: unknown) { 25 | if (error instanceof Error) { 26 | console.error(`Error fetching last token ID: ${error.message}`); 27 | } else { 28 | console.error(`An unknown error occurred while fetching last token ID`); 29 | } 30 | } 31 | } 32 | 33 | const [contractAddress, contractName] = process.argv[2]?.split(".") || []; 34 | 35 | if (contractAddress && contractName) { 36 | getLastTokenId(contractAddress, contractName); 37 | } else { 38 | console.error("Please provide a contract address and name as 'address.name'"); 39 | } 40 | -------------------------------------------------------------------------------- /src/sip-009-nft/get-owner.ts: -------------------------------------------------------------------------------- 1 | import { 2 | fetchCallReadOnlyFunction, 3 | cvToJSON, 4 | uintCV, 5 | } from "@stacks/transactions"; 6 | import { CONFIG, getNetwork, deriveChildAccount } from "../utilities"; 7 | 8 | async function getOwner( 9 | contractAddress: string, 10 | contractName: string, 11 | tokenId: number 12 | ) { 13 | const network = getNetwork(CONFIG.NETWORK); 14 | const { address } = await deriveChildAccount( 15 | CONFIG.NETWORK, 16 | CONFIG.MNEMONIC, 17 | CONFIG.ACCOUNT_INDEX 18 | ); 19 | 20 | try { 21 | const result = await fetchCallReadOnlyFunction({ 22 | contractAddress, 23 | contractName, 24 | functionName: "get-owner", 25 | functionArgs: [uintCV(tokenId)], 26 | network, 27 | senderAddress: address, 28 | }); 29 | 30 | const jsonResult = cvToJSON(result); 31 | 32 | if ( 33 | jsonResult.type === "(response (optional principal) UnknownType)" && 34 | jsonResult.success 35 | ) { 36 | const ownerAddress = jsonResult.value.value.value; 37 | console.log(ownerAddress); 38 | } else { 39 | console.log("No owner found or unexpected result"); 40 | } 41 | } catch (error: unknown) { 42 | if (error instanceof Error) { 43 | console.error(`Error fetching owner: ${error.message}`); 44 | } else { 45 | console.error(`An unknown error occurred while fetching owner`); 46 | } 47 | } 48 | } 49 | 50 | const [contractAddress, contractName] = process.argv[2]?.split(".") || []; 51 | const tokenId = process.argv[3] ? parseInt(process.argv[3]) : null; 52 | 53 | if (contractAddress && contractName && tokenId !== null) { 54 | getOwner(contractAddress, contractName, tokenId); 55 | } else { 56 | console.error("Please provide a contract address.name and a token ID"); 57 | } 58 | -------------------------------------------------------------------------------- /src/sip-009-nft/get-token-uri.ts: -------------------------------------------------------------------------------- 1 | import { 2 | fetchCallReadOnlyFunction, 3 | cvToJSON, 4 | uintCV, 5 | } from "@stacks/transactions"; 6 | import { CONFIG, getNetwork, deriveChildAccount } from "../utilities"; 7 | 8 | async function getLastTokenId( 9 | contractAddress: string, 10 | contractName: string, 11 | senderAddress: string 12 | ) { 13 | const network = getNetwork(CONFIG.NETWORK); 14 | 15 | try { 16 | const result = await fetchCallReadOnlyFunction({ 17 | contractAddress, 18 | contractName, 19 | functionName: "get-last-token-id", 20 | functionArgs: [], 21 | network, 22 | senderAddress, 23 | }); 24 | 25 | const jsonResult = cvToJSON(result); 26 | return parseInt(jsonResult.value); 27 | } catch (error: unknown) { 28 | if (error instanceof Error) { 29 | console.error(`Error fetching last token ID: ${error.message}`); 30 | } else { 31 | console.error(`An unknown error occurred while fetching last token ID`); 32 | } 33 | return null; 34 | } 35 | } 36 | 37 | async function getTokenUri( 38 | contractAddress: string, 39 | contractName: string, 40 | tokenId: number | null 41 | ) { 42 | const network = getNetwork(CONFIG.NETWORK); 43 | const { address } = await deriveChildAccount( 44 | CONFIG.NETWORK, 45 | CONFIG.MNEMONIC, 46 | CONFIG.ACCOUNT_INDEX 47 | ); 48 | 49 | if (tokenId === null) { 50 | tokenId = await getLastTokenId(contractAddress, contractName, address); 51 | if (tokenId === null) { 52 | console.error("Failed to get last token ID. Cannot proceed."); 53 | return; 54 | } 55 | } 56 | 57 | try { 58 | const result = await fetchCallReadOnlyFunction({ 59 | contractAddress, 60 | contractName, 61 | functionName: "get-token-uri", 62 | functionArgs: [uintCV(tokenId)], 63 | network, 64 | senderAddress: address, 65 | }); 66 | 67 | const jsonResult = cvToJSON(result); 68 | console.log(`Token URI for token ID ${tokenId}:`); 69 | console.log(jsonResult.value); 70 | } catch (error: unknown) { 71 | if (error instanceof Error) { 72 | console.error(`Error fetching token URI: ${error.message}`); 73 | } else { 74 | console.error(`An unknown error occurred while fetching token URI`); 75 | } 76 | } 77 | } 78 | 79 | const [contractAddress, contractName] = process.argv[2]?.split(".") || []; 80 | const tokenId = process.argv[3] ? parseInt(process.argv[3]) : null; 81 | 82 | if (contractAddress && contractName) { 83 | getTokenUri(contractAddress, contractName, tokenId); 84 | } else { 85 | console.error( 86 | "Please provide a contract address.name and optionally a token ID" 87 | ); 88 | } 89 | -------------------------------------------------------------------------------- /src/sip-009-nft/transfer.ts: -------------------------------------------------------------------------------- 1 | import { 2 | makeContractCall, 3 | broadcastTransaction, 4 | AnchorMode, 5 | PostConditionMode, 6 | uintCV, 7 | standardPrincipalCV, 8 | } from "@stacks/transactions"; 9 | import { 10 | CONFIG, 11 | getNetwork, 12 | deriveChildAccount, 13 | getNextNonce, 14 | } from "../utilities"; 15 | 16 | async function transferNft( 17 | contractAddress: string, 18 | contractName: string, 19 | tokenId: number, 20 | recipient: string, 21 | accountIndex: number 22 | ) { 23 | const network = getNetwork(CONFIG.NETWORK); 24 | const { address, key } = await deriveChildAccount( 25 | CONFIG.NETWORK, 26 | CONFIG.MNEMONIC, 27 | accountIndex 28 | ); 29 | const nonce = await getNextNonce(CONFIG.NETWORK, address); 30 | 31 | console.log( 32 | `Preparing to transfer NFT from account index ${accountIndex} (${address})` 33 | ); 34 | 35 | const txOptions = { 36 | contractAddress, 37 | contractName, 38 | functionName: "transfer", 39 | functionArgs: [ 40 | uintCV(tokenId), 41 | standardPrincipalCV(address), 42 | standardPrincipalCV(recipient), 43 | ], 44 | senderKey: key, 45 | validateWithAbi: true, 46 | network, 47 | postConditionMode: PostConditionMode.Allow, 48 | nonce, 49 | }; 50 | 51 | try { 52 | console.log("Creating contract call..."); 53 | const transaction = await makeContractCall(txOptions); 54 | console.log("Broadcasting transaction..."); 55 | const broadcastResponse = await broadcastTransaction({ 56 | transaction, 57 | network, 58 | }); 59 | console.log("Transaction broadcast successfully!"); 60 | console.log("Transaction ID:", broadcastResponse.txid); 61 | console.log( 62 | `NFT transfer initiated. Check the transaction status at: https://explorer.stacks.co/txid/${broadcastResponse.txid}` 63 | ); 64 | } catch (error: unknown) { 65 | if (error instanceof Error) { 66 | console.error(`Error transferring NFT: ${error.message}`); 67 | } else { 68 | console.error(`An unknown error occurred while transferring NFT`); 69 | } 70 | } 71 | } 72 | 73 | const [contractAddress, contractName] = process.argv[2]?.split(".") || []; 74 | const tokenId = process.argv[3] ? parseInt(process.argv[3]) : null; 75 | const recipient = process.argv[4]; 76 | const accountIndex = process.argv[5] ? parseInt(process.argv[5]) : 0; // Default to 0 if not provided 77 | 78 | if (contractAddress && contractName && tokenId !== null && recipient) { 79 | transferNft(contractAddress, contractName, tokenId, recipient, accountIndex); 80 | } else { 81 | console.error( 82 | "Please provide: contract address.name, token ID, recipient address, and optionally account index" 83 | ); 84 | } 85 | -------------------------------------------------------------------------------- /src/sip-010-ft/get-balance.ts: -------------------------------------------------------------------------------- 1 | import { 2 | fetchCallReadOnlyFunction, 3 | cvToJSON, 4 | standardPrincipalCV, 5 | } from "@stacks/transactions"; 6 | import { CONFIG, getNetwork, deriveChildAccount } from "../utilities"; 7 | 8 | async function getBalance( 9 | contractAddress: string, 10 | contractName: string, 11 | address: string 12 | ) { 13 | const network = getNetwork(CONFIG.NETWORK); 14 | const { address: senderAddress } = await deriveChildAccount( 15 | CONFIG.NETWORK, 16 | CONFIG.MNEMONIC, 17 | CONFIG.ACCOUNT_INDEX 18 | ); 19 | 20 | try { 21 | const result = await fetchCallReadOnlyFunction({ 22 | contractAddress, 23 | contractName, 24 | functionName: "get-balance", 25 | functionArgs: [standardPrincipalCV(address)], 26 | senderAddress, 27 | network, 28 | }); 29 | 30 | const jsonResult = cvToJSON(result); 31 | 32 | if (jsonResult.value && jsonResult.value.value) { 33 | console.log(`balance: ${jsonResult.value.value}`); 34 | } else { 35 | console.log("balance: 0"); 36 | } 37 | } catch (error: any) { 38 | console.error(`Error fetching balance: ${error.message}`); 39 | } 40 | } 41 | 42 | const [contractAddress, contractName] = process.argv[2]?.split(".") || []; 43 | const address = process.argv[3]; 44 | 45 | if (contractAddress && contractName && address) { 46 | getBalance(contractAddress, contractName, address); 47 | } else { 48 | console.error("Please provide a contract address.name and an address"); 49 | } 50 | -------------------------------------------------------------------------------- /src/sip-010-ft/get-ft-holders.ts: -------------------------------------------------------------------------------- 1 | // CONFIGURATION 2 | 3 | import { CONFIG, getApiUrl } from "../utilities"; 4 | 5 | type FungibleTokenHoldersResponse = { 6 | limit: number; 7 | offset: number; 8 | total: number; 9 | total_supply: string; 10 | results: { 11 | address: string; 12 | balance: string; 13 | }[]; 14 | }; 15 | 16 | // gets fungible token holders from the API 17 | async function getFungibleTokenHolders( 18 | network: string, 19 | token: string, 20 | limit: number = 200, 21 | offset: number = 0 22 | ) { 23 | const apiUrl = getApiUrl(network); 24 | const response = await fetch( 25 | `${apiUrl}/extended/v1/tokens/ft/${token}/holders?limit=${limit}&offset=${offset}` 26 | ); 27 | if (!response.ok) { 28 | throw new Error( 29 | `Failed to get fungible token holders: ${response.statusText}` 30 | ); 31 | } 32 | const data = await response.json(); 33 | return data as FungibleTokenHoldersResponse; 34 | } 35 | 36 | async function main() { 37 | // expect txId as first argument 38 | const address = process.argv[2]; 39 | const limit = Number(process.argv[3]) || 200; 40 | const offset = Number(process.argv[4]) || 0; 41 | 42 | if (!address) { 43 | console.error("No address provided, exiting..."); 44 | return; 45 | } 46 | 47 | // get transaction info from API 48 | try { 49 | const response = await getFungibleTokenHolders( 50 | CONFIG.NETWORK, 51 | address, 52 | limit, 53 | offset 54 | ); 55 | console.log(response); 56 | } catch (error) { 57 | // report error 58 | console.error(`General/Unexpected Failure: ${error}`); 59 | } 60 | } 61 | 62 | main(); 63 | -------------------------------------------------------------------------------- /src/sip-010-ft/get-token-info.ts: -------------------------------------------------------------------------------- 1 | import { CONFIG, getHiroTokenMetadata } from "../utilities"; 2 | 3 | async function getTokenInfo(contractAddress: string, contractName: string) { 4 | try { 5 | const contractId = `${contractAddress}.${contractName}`; 6 | const tokenInfo = await getHiroTokenMetadata(contractId); 7 | 8 | console.log(`name: ${tokenInfo.name}`); 9 | console.log(`asset_identifier: ${tokenInfo.asset_identifier}`); 10 | console.log(`symbol: ${tokenInfo.symbol}`); 11 | console.log(`decimals: ${tokenInfo.decimals}`); 12 | console.log(`supply: ${tokenInfo.total_supply}`); 13 | console.log(`description: ${tokenInfo.description}`); 14 | console.log(`image: ${tokenInfo.image_uri}`); 15 | } catch (error: any) { 16 | console.error(`Error fetching token info: ${error.message}`); 17 | } 18 | } 19 | 20 | const [contractAddress, contractName] = process.argv[2]?.split(".") || []; 21 | 22 | if (contractAddress && contractName) { 23 | getTokenInfo(contractAddress, contractName); 24 | } else { 25 | console.error("Please provide a contract address.name"); 26 | } 27 | -------------------------------------------------------------------------------- /src/stacks-alex/get-all-possible-routes.ts: -------------------------------------------------------------------------------- 1 | import { AlexSDK, Currency } from "alex-sdk"; 2 | 3 | async function getAllPossibleRoutes(fromCurrency: string, toCurrency: string) { 4 | try { 5 | // Initialize the SDK 6 | const alex = new AlexSDK(); 7 | 8 | // Validate currencies 9 | if (!(fromCurrency in Currency) || !(toCurrency in Currency)) { 10 | throw new Error( 11 | "Invalid currency. Use one of: " + Object.keys(Currency).join(", ") 12 | ); 13 | } 14 | 15 | // Get all possible routes for swapping between currencies 16 | const allRoutes = await alex.getAllPossibleRoutes( 17 | Currency[fromCurrency as keyof typeof Currency], 18 | Currency[toCurrency as keyof typeof Currency] 19 | ); 20 | 21 | console.log(`All possible routes from ${fromCurrency} to ${toCurrency}:`); 22 | console.log(JSON.stringify(allRoutes, null, 2)); 23 | 24 | // Also display route count 25 | console.log(`\nFound ${allRoutes.length} possible swap route(s)`); 26 | 27 | return allRoutes; 28 | } catch (error) { 29 | console.error("Error getting all possible routes:", error); 30 | process.exit(1); 31 | } 32 | } 33 | 34 | // Parse command line arguments 35 | const args = process.argv.slice(2); 36 | if (args.length < 2) { 37 | console.log( 38 | "Usage: bun get-all-possible-routes.ts " 39 | ); 40 | console.log("Example: bun get-all-possible-routes.ts STX ALEX"); 41 | process.exit(1); 42 | } 43 | 44 | const fromCurrency = args[0]; 45 | const toCurrency = args[1]; 46 | 47 | // Execute the function 48 | await getAllPossibleRoutes(fromCurrency, toCurrency); 49 | 50 | export {}; 51 | -------------------------------------------------------------------------------- /src/stacks-alex/get-all-swaps.ts: -------------------------------------------------------------------------------- 1 | type Swap = { 2 | id: number; 3 | base: string; 4 | baseSymbol: string; 5 | baseId: string; 6 | quote: string; 7 | quoteSymbol: string; 8 | quoteId: string; 9 | baseVolume: number; 10 | quoteVolume: number; 11 | lastBasePriceInUSD: number; 12 | lastQuotePriceInUSD: number; 13 | }; 14 | 15 | async function getAllSwaps() { 16 | const response = await fetch("https://api.alexgo.io/v1/allswaps", { 17 | headers: { 18 | Accept: "application/json", 19 | }, 20 | }); 21 | if (!response.ok) { 22 | throw new Error(`Failed to get all swaps: ${response.statusText}`); 23 | } 24 | const data = (await response.json()) as Swap[]; 25 | 26 | return data; 27 | } 28 | 29 | const swaps = await getAllSwaps(); 30 | for (const swap of swaps) { 31 | console.log(`id: ${swap.id}`); 32 | console.log(`base: ${swap.base}`); 33 | console.log(`baseSymbol: ${swap.baseSymbol}`); 34 | console.log(`baseId: ${swap.baseId}`); 35 | console.log(`quote: ${swap.quote}`); 36 | console.log(`quoteSymbol: ${swap.quoteSymbol}`); 37 | console.log(`quoteId: ${swap.quoteId}`); 38 | console.log(`baseVolume: ${swap.baseVolume}`); 39 | console.log(`quoteVolume: ${swap.quoteVolume}`); 40 | console.log(`lastBasePriceInUSD: ${swap.lastBasePriceInUSD}`); 41 | console.log(`lastQuotePriceInUSD: ${swap.lastQuotePriceInUSD}`); 42 | console.log("---"); // Separator for readability 43 | } 44 | 45 | // Make this file a module so top-level await works 46 | export {}; 47 | -------------------------------------------------------------------------------- /src/stacks-alex/get-amount-to.ts: -------------------------------------------------------------------------------- 1 | import { AlexSDK, Currency } from "alex-sdk"; 2 | 3 | async function getAmountTo( 4 | fromCurrency: string, 5 | amount: string, 6 | toCurrency: string 7 | ) { 8 | try { 9 | // Initialize the SDK 10 | const alex = new AlexSDK(); 11 | 12 | // Validate currencies 13 | if (!(fromCurrency in Currency) || !(toCurrency in Currency)) { 14 | throw new Error( 15 | "Invalid currency. Use one of: " + Object.keys(Currency).join(", ") 16 | ); 17 | } 18 | 19 | // Parse amount 20 | const parsedAmount = parseFloat(amount); 21 | if (isNaN(parsedAmount)) { 22 | throw new Error("Invalid amount. Please provide a valid number."); 23 | } 24 | 25 | // Convert to microunits (most tokens use 8 decimal places) 26 | const microunits = BigInt(Math.floor(parsedAmount * 1e8)); 27 | 28 | // Get the amount that will be received when swapping 29 | const amountTo = await alex.getAmountTo( 30 | Currency[fromCurrency as keyof typeof Currency], 31 | microunits, 32 | Currency[toCurrency as keyof typeof Currency] 33 | ); 34 | 35 | // Convert back from microunits for display 36 | const readableAmount = Number(amountTo) / 1e8; 37 | 38 | console.log( 39 | `When swapping ${parsedAmount} ${fromCurrency} to ${toCurrency}, you'll receive: ${readableAmount} ${toCurrency}` 40 | ); 41 | return readableAmount; 42 | } catch (error) { 43 | console.error("Error getting amount to receive:", error); 44 | process.exit(1); 45 | } 46 | } 47 | 48 | // Parse command line arguments 49 | const args = process.argv.slice(2); 50 | if (args.length < 3) { 51 | console.log( 52 | "Usage: bun get-amount-to.ts " 53 | ); 54 | console.log("Example: bun get-amount-to.ts STX 100 ALEX"); 55 | process.exit(1); 56 | } 57 | 58 | const fromCurrency = args[0]; 59 | const amount = args[1]; 60 | const toCurrency = args[2]; 61 | 62 | // Execute the function 63 | await getAmountTo(fromCurrency, amount, toCurrency); 64 | 65 | export {}; 66 | -------------------------------------------------------------------------------- /src/stacks-alex/get-balances.ts: -------------------------------------------------------------------------------- 1 | import { AlexSDK } from "alex-sdk"; 2 | 3 | async function getBalances(stxAddress: string) { 4 | try { 5 | // Validate address format (basic check) 6 | if (!stxAddress.startsWith("ST") && !stxAddress.startsWith("SM")) { 7 | throw new Error( 8 | "Invalid STX address format. Address should start with ST or SM." 9 | ); 10 | } 11 | 12 | // Initialize the SDK 13 | const alex = new AlexSDK(); 14 | 15 | // Get balances for the specified STX address 16 | const balances = await alex.getBalances(stxAddress); 17 | 18 | console.log(`Balances for address ${stxAddress}:`); 19 | console.log(JSON.stringify(balances, null, 2)); 20 | 21 | // Also display in a more readable format if available 22 | if (balances && typeof balances === "object") { 23 | console.log("\nSummary:"); 24 | Object.entries(balances).forEach(([currency, balance]) => { 25 | // Convert from microunits if applicable 26 | const readableBalance = 27 | typeof balance === "bigint" ? Number(balance) / 1e8 : balance; 28 | 29 | console.log(`${currency}: ${readableBalance}`); 30 | }); 31 | } 32 | 33 | return balances; 34 | } catch (error) { 35 | console.error("Error getting balances:", error); 36 | process.exit(1); 37 | } 38 | } 39 | 40 | // Parse command line arguments 41 | const args = process.argv.slice(2); 42 | if (args.length < 1) { 43 | console.log("Usage: bun get-balances.ts "); 44 | console.log( 45 | "Example: bun get-balances.ts ST2CY5V39NHDPWSXMW9QDT3HC3GD6Q6XX4CFRK9AG" 46 | ); 47 | process.exit(1); 48 | } 49 | 50 | const stxAddress = args[0]; 51 | 52 | // Execute the function 53 | await getBalances(stxAddress); 54 | 55 | export {}; 56 | -------------------------------------------------------------------------------- /src/stacks-alex/get-fee-rate.ts: -------------------------------------------------------------------------------- 1 | import { AlexSDK, Currency } from "alex-sdk"; 2 | 3 | async function getFeeRate(fromCurrency: string, toCurrency: string) { 4 | try { 5 | // Initialize the SDK 6 | const alex = new AlexSDK(); 7 | 8 | // Validate currencies 9 | if (!(fromCurrency in Currency) || !(toCurrency in Currency)) { 10 | throw new Error( 11 | "Invalid currency. Use one of: " + Object.keys(Currency).join(", ") 12 | ); 13 | } 14 | 15 | // Get swap fee between currencies 16 | const feeRate = await alex.getFeeRate( 17 | Currency[fromCurrency as keyof typeof Currency], 18 | Currency[toCurrency as keyof typeof Currency] 19 | ); 20 | 21 | console.log(`Swap fee from ${fromCurrency} to ${toCurrency}: ${feeRate}`); 22 | return feeRate; 23 | } catch (error) { 24 | console.error("Error getting fee rate:", error); 25 | process.exit(1); 26 | } 27 | } 28 | 29 | // Parse command line arguments 30 | const args = process.argv.slice(2); 31 | if (args.length < 2) { 32 | console.log("Usage: bun get-fee-rate.ts "); 33 | console.log("Example: bun get-fee-rate.ts STX ALEX"); 34 | process.exit(1); 35 | } 36 | 37 | const fromCurrency = args[0]; 38 | const toCurrency = args[1]; 39 | 40 | // Execute the function 41 | await getFeeRate(fromCurrency, toCurrency); 42 | 43 | export {}; 44 | -------------------------------------------------------------------------------- /src/stacks-alex/get-latest-prices.ts: -------------------------------------------------------------------------------- 1 | import { AlexSDK } from "alex-sdk"; 2 | 3 | async function getLatestPrices() { 4 | try { 5 | // Initialize the SDK 6 | const alex = new AlexSDK(); 7 | 8 | // Get the latest prices for all supported currencies 9 | const latestPrices = await alex.getLatestPrices(); 10 | 11 | console.log("Latest prices for all supported currencies:"); 12 | console.log(JSON.stringify(latestPrices, null, 2)); 13 | 14 | // Also display in a more readable format 15 | console.log("\nSummary:"); 16 | Object.entries(latestPrices).forEach(([currency, priceData]) => { 17 | console.log(`${currency}: $${priceData.priceInUSD.toFixed(4)} USD`); 18 | }); 19 | 20 | return latestPrices; 21 | } catch (error) { 22 | console.error("Error getting latest prices:", error); 23 | process.exit(1); 24 | } 25 | } 26 | 27 | // No arguments needed for this command 28 | console.log("Fetching latest prices from Alex..."); 29 | await getLatestPrices(); 30 | 31 | export {}; 32 | -------------------------------------------------------------------------------- /src/stacks-alex/get-route.ts: -------------------------------------------------------------------------------- 1 | import { AlexSDK, Currency } from "alex-sdk"; 2 | 3 | async function getRoute(fromCurrency: string, toCurrency: string) { 4 | try { 5 | // Initialize the SDK 6 | const alex = new AlexSDK(); 7 | 8 | // Validate currencies 9 | if (!(fromCurrency in Currency) || !(toCurrency in Currency)) { 10 | throw new Error( 11 | "Invalid currency. Use one of: " + Object.keys(Currency).join(", ") 12 | ); 13 | } 14 | 15 | // Get the router path for swapping between currencies 16 | const router = await alex.getRoute( 17 | Currency[fromCurrency as keyof typeof Currency], 18 | Currency[toCurrency as keyof typeof Currency] 19 | ); 20 | 21 | console.log(`Router path from ${fromCurrency} to ${toCurrency}:`); 22 | console.log(JSON.stringify(router, null, 2)); 23 | return router; 24 | } catch (error) { 25 | console.error("Error getting route:", error); 26 | process.exit(1); 27 | } 28 | } 29 | 30 | // Parse command line arguments 31 | const args = process.argv.slice(2); 32 | if (args.length < 2) { 33 | console.log("Usage: bun get-route.ts "); 34 | console.log("Example: bun get-route.ts STX ALEX"); 35 | process.exit(1); 36 | } 37 | 38 | const fromCurrency = args[0]; 39 | const toCurrency = args[1]; 40 | 41 | // Execute the function 42 | await getRoute(fromCurrency, toCurrency); 43 | 44 | export {}; 45 | -------------------------------------------------------------------------------- /src/stacks-alex/get-swappable-currencies.ts: -------------------------------------------------------------------------------- 1 | import { AlexSDK } from "alex-sdk"; 2 | 3 | async function getSwappableCurrencies() { 4 | try { 5 | // Initialize the SDK 6 | const alex = new AlexSDK(); 7 | 8 | // Fetch information about all swappable currencies 9 | const swappableCurrencies = await alex.fetchSwappableCurrency(); 10 | 11 | console.log("Available swappable currencies on Alex:"); 12 | console.log(JSON.stringify(swappableCurrencies, null, 2)); 13 | 14 | // Also display a simplified list if available 15 | if (swappableCurrencies && Array.isArray(swappableCurrencies)) { 16 | console.log("\nCurrency List:"); 17 | swappableCurrencies.forEach((currency) => { 18 | if (currency && typeof currency === "object" && "name" in currency) { 19 | console.log(`- ${currency.name} (${currency.symbol || "No symbol"})`); 20 | if ("contractAddress" in currency) { 21 | console.log(` Contract: ${currency.contractAddress}`); 22 | } 23 | } 24 | }); 25 | } 26 | 27 | return swappableCurrencies; 28 | } catch (error) { 29 | console.error("Error getting swappable currencies:", error); 30 | process.exit(1); 31 | } 32 | } 33 | 34 | // No arguments needed for this command 35 | console.log("Fetching swappable currencies from Alex..."); 36 | await getSwappableCurrencies(); 37 | 38 | export {}; 39 | -------------------------------------------------------------------------------- /src/stacks-alex/get-token-info.ts: -------------------------------------------------------------------------------- 1 | import { AlexSDK } from "alex-sdk"; 2 | 3 | async function getTokenInfo(tokenAddress: string) { 4 | try { 5 | // Initialize the SDK 6 | const alex = new AlexSDK(); 7 | 8 | // Get token info for the specified token address 9 | const tokenInfo = await alex.fetchTokenInfo(tokenAddress); 10 | 11 | if (!tokenInfo) { 12 | console.log(`No token information found for address: ${tokenAddress}`); 13 | return null; 14 | } 15 | 16 | console.log(`Token information for ${tokenAddress}:`); 17 | console.log(JSON.stringify(tokenInfo, null, 2)); 18 | 19 | // Display a more readable summary 20 | console.log("\nSummary:"); 21 | console.log(`Name: ${tokenInfo.name}`); 22 | console.log(`ID: ${tokenInfo.id}`); 23 | console.log(`Wrap Token: ${tokenInfo.wrapToken}`); 24 | console.log(`Underlying Token: ${tokenInfo.underlyingToken}`); 25 | 26 | return tokenInfo; 27 | } catch (error) { 28 | console.error("Error getting token info:", error); 29 | process.exit(1); 30 | } 31 | } 32 | 33 | // Parse command line arguments 34 | const args = process.argv.slice(2); 35 | if (args.length < 1) { 36 | console.log("Usage: bun get-token-info.ts "); 37 | console.log( 38 | "Example: bun get-token-info.ts SP2C2YFP12AJZB4MABJBAJ55XECVS7E4PMMZ89YZR.arkadiko-token" 39 | ); 40 | process.exit(1); 41 | } 42 | 43 | const tokenAddress = args[0]; 44 | 45 | // Execute the function 46 | await getTokenInfo(tokenAddress); 47 | 48 | export {}; 49 | -------------------------------------------------------------------------------- /src/stacks-alex/get-way-points.ts: -------------------------------------------------------------------------------- 1 | import { AlexSDK, Currency, AMMRoute } from "alex-sdk"; 2 | 3 | async function getWayPointsForRoute(fromCurrency: string, toCurrency: string) { 4 | try { 5 | // Initialize the SDK 6 | const alex = new AlexSDK(); 7 | 8 | // Validate currencies 9 | if (!(fromCurrency in Currency) || !(toCurrency in Currency)) { 10 | throw new Error( 11 | "Invalid currency. Use one of: " + Object.keys(Currency).join(", ") 12 | ); 13 | } 14 | 15 | // First get a route between the currencies 16 | const route = await alex.getRoute( 17 | Currency[fromCurrency as keyof typeof Currency], 18 | Currency[toCurrency as keyof typeof Currency] 19 | ); 20 | 21 | if (!route || !Array.isArray(route) || route.length === 0) { 22 | throw new Error( 23 | `No route found between ${fromCurrency} and ${toCurrency}` 24 | ); 25 | } 26 | 27 | // Get way points for the route 28 | const wayPoints = await alex.getWayPoints(route as AMMRoute); 29 | 30 | console.log( 31 | `Way points for the route from ${fromCurrency} to ${toCurrency}:` 32 | ); 33 | console.log("Route:", JSON.stringify(route, null, 2)); 34 | console.log("Way Points:", JSON.stringify(wayPoints, null, 2)); 35 | 36 | return { route, wayPoints }; 37 | } catch (error) { 38 | console.error("Error getting way points:", error); 39 | process.exit(1); 40 | } 41 | } 42 | 43 | // Parse command line arguments 44 | const args = process.argv.slice(2); 45 | if (args.length < 2) { 46 | console.log("Usage: bun get-way-points.ts "); 47 | console.log("Example: bun get-way-points.ts STX ALEX"); 48 | process.exit(1); 49 | } 50 | 51 | const fromCurrency = args[0]; 52 | const toCurrency = args[1]; 53 | 54 | // Execute the function 55 | await getWayPointsForRoute(fromCurrency, toCurrency); 56 | 57 | export {}; 58 | -------------------------------------------------------------------------------- /src/stacks-alex/sponsored-broadcast.ts: -------------------------------------------------------------------------------- 1 | import { AlexSDK } from "alex-sdk"; 2 | 3 | async function broadcastSponsoredTransaction(signedTx: string) { 4 | try { 5 | // Initialize the SDK 6 | const alex = new AlexSDK(); 7 | 8 | // Check if sponsored transaction service is available 9 | const isSponsorAvailable = await alex.isSponsoredTxServiceAvailable(); 10 | if (!isSponsorAvailable) { 11 | throw new Error("Sponsored transaction service is currently unavailable"); 12 | } 13 | 14 | // Basic validation 15 | if (!signedTx || typeof signedTx !== "string" || signedTx.trim() === "") { 16 | throw new Error( 17 | "Invalid transaction. Please provide a valid signed transaction string." 18 | ); 19 | } 20 | 21 | console.log(`Broadcasting sponsored transaction...`); 22 | 23 | // Broadcast the transaction 24 | const txId = await alex.broadcastSponsoredTx(signedTx); 25 | 26 | console.log(`\nTransaction successfully broadcasted!`); 27 | console.log(`Transaction ID: ${txId}`); 28 | console.log(`\nYou can view your transaction at:`); 29 | console.log(`https://explorer.stacks.co/txid/${txId}`); 30 | 31 | return txId; 32 | } catch (error) { 33 | console.error("Error broadcasting sponsored transaction:", error); 34 | process.exit(1); 35 | } 36 | } 37 | 38 | // Parse command line arguments 39 | const args = process.argv.slice(2); 40 | if (args.length < 1) { 41 | console.log("Usage: bun sponsored-broadcast.ts "); 42 | console.log("Example: bun sponsored-broadcast.ts 00000000010400...."); 43 | process.exit(1); 44 | } 45 | 46 | const signedTx = args[0]; 47 | 48 | // Execute the function 49 | await broadcastSponsoredTransaction(signedTx); 50 | 51 | export {}; 52 | -------------------------------------------------------------------------------- /src/stacks-bitflow/get-swap-options.ts: -------------------------------------------------------------------------------- 1 | import { BitflowSDK } from "bitflow-sdk"; 2 | 3 | const bitflow = new BitflowSDK({ 4 | API_HOST: process.env.BITFLOW_API_HOST, 5 | API_KEY: process.env.BITFLOW_API_KEY, 6 | STACKS_API_HOST: process.env.BITFLOW_STACKS_API_HOST, 7 | READONLY_CALL_API_HOST: process.env.BITFLOW_READONLY_CALL_API_HOST, 8 | }); 9 | 10 | const token = process.argv[2]; 11 | 12 | if (!token) { 13 | console.log("Please provide a token name as argument"); 14 | process.exit(1); 15 | } 16 | 17 | try { 18 | const swapOptions = await bitflow.getPossibleSwaps(token); 19 | console.log(JSON.stringify(swapOptions, null, 2)); 20 | } catch (error) { 21 | console.log(error); 22 | } 23 | -------------------------------------------------------------------------------- /src/stacks-bitflow/get-swap-params.ts: -------------------------------------------------------------------------------- 1 | import { BitflowSDK, SwapExecutionData } from "@bitflowlabs/core-sdk"; 2 | import { CONFIG, deriveChildAccount } from "../utilities"; 3 | 4 | const bitflow = new BitflowSDK({ 5 | BITFLOW_API_HOST: process.env.BITFLOW_API_HOST, 6 | BITFLOW_API_KEY: process.env.BITFLOW_API_KEY, 7 | READONLY_CALL_API_HOST: process.env.BITFLOW_READONLY_CALL_API_HOST, 8 | }); 9 | 10 | const slippage = Number(process.argv[2]) || 0.01; // 1% 11 | const swapExecutionDataString = process.argv[3]; 12 | 13 | function isSwapExecutionData(data: any): data is SwapExecutionData { 14 | return ( 15 | typeof data === "object" && 16 | data !== null && 17 | "route" in data && 18 | "amount" in data && 19 | "tokenXDecimals" in data && 20 | "tokenYDecimals" in data 21 | ); 22 | } 23 | 24 | (async () => { 25 | try { 26 | const { address } = await deriveChildAccount( 27 | CONFIG.NETWORK, 28 | CONFIG.MNEMONIC, 29 | CONFIG.ACCOUNT_INDEX 30 | ); 31 | 32 | const swapExecutionData = JSON.parse(swapExecutionDataString); 33 | 34 | if (!isSwapExecutionData(swapExecutionData)) { 35 | throw new Error("Invalid SwapExecutionData"); 36 | } 37 | 38 | const swapParams = await bitflow.getSwapParams( 39 | swapExecutionData, 40 | address, 41 | slippage 42 | ); 43 | 44 | console.log(swapParams); 45 | } catch (error) { 46 | console.log(error); 47 | } 48 | })(); 49 | -------------------------------------------------------------------------------- /src/stacks-bitflow/get-swap-route-quote.ts: -------------------------------------------------------------------------------- 1 | import { BitflowSDK } from "bitflow-sdk"; 2 | 3 | const bitflow = new BitflowSDK({ 4 | API_HOST: process.env.BITFLOW_API_HOST, 5 | API_KEY: process.env.BITFLOW_API_KEY, 6 | STACKS_API_HOST: process.env.BITFLOW_STACKS_API_HOST, 7 | READONLY_CALL_API_HOST: process.env.BITFLOW_READONLY_CALL_API_HOST, 8 | }); 9 | 10 | const tokenX = process.argv[2]; 11 | const tokenY = process.argv[3]; 12 | const amount = Number(process.argv[4]); 13 | 14 | if (!tokenX || !tokenY || !amount) { 15 | console.log("Please provide two token names and an amount as arguments"); 16 | process.exit(1); 17 | } 18 | 19 | try { 20 | const routeQuote = await bitflow.getQuoteForRoute(tokenX, tokenY, amount); 21 | console.log(JSON.stringify(routeQuote, null, 2)); 22 | } catch (error) { 23 | console.log(error); 24 | } 25 | -------------------------------------------------------------------------------- /src/stacks-bitflow/get-swap-routes.ts: -------------------------------------------------------------------------------- 1 | import { BitflowSDK } from "bitflow-sdk"; 2 | 3 | const bitflow = new BitflowSDK({ 4 | API_HOST: process.env.BITFLOW_API_HOST, 5 | API_KEY: process.env.BITFLOW_API_KEY, 6 | STACKS_API_HOST: process.env.BITFLOW_STACKS_API_HOST, 7 | READONLY_CALL_API_HOST: process.env.BITFLOW_READONLY_CALL_API_HOST, 8 | }); 9 | 10 | const tokenX = process.argv[2]; 11 | const tokenY = process.argv[3]; 12 | 13 | if (!tokenX || !tokenY) { 14 | console.log("Please provide two token names as arguments"); 15 | process.exit(1); 16 | } 17 | 18 | try { 19 | const routes = await bitflow.getAllPossibleTokenYRoutes(tokenX, tokenY); 20 | console.log(JSON.stringify(routes, null, 2)); 21 | } catch (error) { 22 | console.log(error); 23 | } 24 | -------------------------------------------------------------------------------- /src/stacks-bitflow/get-swaps.ts: -------------------------------------------------------------------------------- 1 | import { BitflowSDK } from "bitflow-sdk"; 2 | 3 | const bitflow = new BitflowSDK({ 4 | API_HOST: process.env.BITFLOW_API_HOST, 5 | API_KEY: process.env.BITFLOW_API_KEY, 6 | STACKS_API_HOST: process.env.BITFLOW_STACKS_API_HOST, 7 | READONLY_CALL_API_HOST: process.env.BITFLOW_READONLY_CALL_API_HOST, 8 | }); 9 | 10 | const token = process.argv[2]; 11 | 12 | if (!token) { 13 | console.log("Please provide a token name as argument"); 14 | process.exit(1); 15 | } 16 | 17 | try { 18 | const possibleTokens = await bitflow.getAllPossibleTokenY(token); 19 | console.log(JSON.stringify(possibleTokens, null, 2)); 20 | } catch (error) { 21 | console.log(error); 22 | } 23 | -------------------------------------------------------------------------------- /src/stacks-bitflow/get-tokens.ts: -------------------------------------------------------------------------------- 1 | import { BitflowSDK } from "bitflow-sdk"; 2 | 3 | const bitflow = new BitflowSDK({ 4 | API_HOST: process.env.BITFLOW_API_HOST, 5 | API_KEY: process.env.BITFLOW_API_KEY, 6 | STACKS_API_HOST: process.env.BITFLOW_STACKS_API_HOST, 7 | READONLY_CALL_API_HOST: process.env.BITFLOW_READONLY_CALL_API_HOST, 8 | }); 9 | 10 | try { 11 | const tokens = await bitflow.getAvailableTokens(); 12 | console.log(JSON.stringify(tokens, null, 2)); 13 | } catch (error) { 14 | console.log(error); 15 | } 16 | -------------------------------------------------------------------------------- /src/stacks-contracts/get-contract-source-code.ts: -------------------------------------------------------------------------------- 1 | import { 2 | createErrorResponse, 3 | getApiUrl, 4 | getNetworkByPrincipal, 5 | sendToLLM, 6 | ToolResponse, 7 | } from "../utilities"; 8 | 9 | const usage = "Usage: bun run get-contract-source-code.ts "; 10 | const usageExample = 11 | "Example: bun run get-contract-source-code.ts ST35K818S3K2GSNEBC3M35GA3W8Q7X72KF4RVM3QA.aibtcdao-charter"; 12 | 13 | interface ExpectedArgs { 14 | contractAddress: string; 15 | } 16 | 17 | interface ContractSourceResponse { 18 | source: string; 19 | publish_height: number; 20 | proof: string; 21 | } 22 | 23 | function validateArgs(): ExpectedArgs { 24 | // verify all required arguments are provided 25 | const [contractAddress] = process.argv.slice(2); 26 | if (!contractAddress) { 27 | const errorMessage = [ 28 | `Invalid arguments: ${process.argv.slice(2).join(" ")}`, 29 | usage, 30 | usageExample, 31 | ].join("\n"); 32 | throw new Error(errorMessage); 33 | } 34 | // verify contract addresses extracted from arguments 35 | const [address, name] = contractAddress.split("."); 36 | if (!address || !name) { 37 | const errorMessage = [ 38 | `Invalid contract address: ${contractAddress}`, 39 | usage, 40 | usageExample, 41 | ].join("\n"); 42 | throw new Error(errorMessage); 43 | } 44 | // return validated arguments 45 | return { 46 | contractAddress, 47 | }; 48 | } 49 | 50 | export async function main(): Promise> { 51 | // validate and store provided args 52 | const args = validateArgs(); 53 | const [contractAddress, contractName] = args.contractAddress.split("."); 54 | const networkFromAddress = getNetworkByPrincipal(contractAddress); 55 | const apiUrl = getApiUrl(networkFromAddress); 56 | const response = await fetch( 57 | `${apiUrl}/v2/contracts/source/${contractAddress}/${contractName}`, 58 | { 59 | headers: { 60 | Accept: "application/json", 61 | }, 62 | } 63 | ); 64 | if (!response.ok) { 65 | throw new Error(`Failed to get contract source: ${response.statusText}`); 66 | } 67 | const data = (await response.json()) as ContractSourceResponse; 68 | return { 69 | success: true, 70 | message: `Contract source retrieved successfully for ${contractAddress}.${contractName}`, 71 | data, 72 | }; 73 | } 74 | 75 | main() 76 | .then(sendToLLM) 77 | .catch((error) => { 78 | sendToLLM(createErrorResponse(error)); 79 | process.exit(1); 80 | }); 81 | -------------------------------------------------------------------------------- /src/stacks-contracts/services/contract-deployer.ts: -------------------------------------------------------------------------------- 1 | import { StacksNetworkName } from "@stacks/network"; 2 | import { 3 | AnchorMode, 4 | broadcastTransaction, 5 | ClarityVersion, 6 | makeContractDeploy, 7 | PostConditionMode, 8 | } from "@stacks/transactions"; 9 | 10 | // used for one-off contract deployments 11 | export type SingleContract = { 12 | name: string; 13 | source: string; 14 | hash?: string; 15 | clarityVersion?: ClarityVersion; 16 | }; 17 | 18 | export type DeployedSingleContract = SingleContract & { 19 | txId: string; 20 | contractAddress: string; 21 | sender: string; 22 | }; 23 | 24 | /** 25 | * Contract deployment service for single contracts 26 | */ 27 | export class ContractDeployer { 28 | private network: string; 29 | private senderAddress: string; 30 | private senderKey: string; 31 | 32 | /** 33 | * Create a new ContractDeployer instance 34 | * 35 | * @param network Network instance to use for deployments 36 | * @param senderAddress Address that will deploy the contracts 37 | * @param senderKey Private key for the sender address 38 | */ 39 | constructor( 40 | network: string, 41 | senderAddress: string, 42 | senderKey: string 43 | ) { 44 | this.network = network; 45 | this.senderAddress = senderAddress; 46 | this.senderKey = senderKey; 47 | } 48 | 49 | /** 50 | * Deploy a contract to the blockchain 51 | * 52 | * @param contract The generated contract to deploy 53 | * @param nonce Optional nonce for the transaction 54 | */ 55 | async deployContract( 56 | contract: SingleContract, 57 | nonce?: number 58 | ): Promise { 59 | // Create the contract deployment transaction 60 | const transaction = await makeContractDeploy({ 61 | contractName: contract.name, 62 | codeBody: contract.source, 63 | senderKey: this.senderKey, 64 | nonce: nonce === 0 ? 0 : nonce ? nonce : undefined, 65 | network: this.network, 66 | postConditions: [], // empty, no transfers expected 67 | postConditionMode: PostConditionMode.Deny, 68 | }); 69 | 70 | // Broadcast the transaction 71 | const broadcastResponse = await broadcastTransaction({ 72 | transaction, 73 | network: this.network, 74 | }); 75 | 76 | if ("error" in broadcastResponse) { 77 | throw new Error( 78 | `Failed to deploy contract: ${(broadcastResponse as any).reason}` 79 | ); 80 | } 81 | // Return the deployed contract details 82 | return { 83 | ...contract, 84 | txId: broadcastResponse.txid, 85 | contractAddress: `${this.senderAddress}.${contract.name}`, 86 | sender: this.senderAddress, 87 | }; 88 | } 89 | } 90 | -------------------------------------------------------------------------------- /src/stacks-faktory/get-dao-tokens.ts: -------------------------------------------------------------------------------- 1 | import { FaktorySDK } from "@faktoryfun/core-sdk"; 2 | import { CONFIG } from "../utilities"; 3 | import dotenv from "dotenv"; 4 | 5 | dotenv.config(); 6 | 7 | const page = Number(process.argv[2]) || 1; 8 | const limit = Number(process.argv[3]) || 10; 9 | const search = process.argv[4]; 10 | const sortOrder = process.argv[5]; 11 | 12 | if (!page) { 13 | console.error("\nPlease provide parameters:"); 14 | console.error( 15 | "bun run src/stacks-faktory/get-dao-tokens.ts [page] [limit] [search] [sortOrder]" 16 | ); 17 | process.exit(1); 18 | } 19 | 20 | /* 21 | console.log("\n=== DAO Query Parameters ==="); 22 | console.log("Page:", page); 23 | console.log("Limit:", limit); 24 | console.log("Search term:", search || "none"); 25 | console.log("Sort order:", sortOrder || "default"); 26 | console.log("Network:", CONFIG.NETWORK); 27 | */ 28 | 29 | const sdk = new FaktorySDK({ 30 | network: CONFIG.NETWORK as "mainnet" | "testnet", 31 | hiroApiKey: CONFIG.HIRO_API_KEY, 32 | }); 33 | 34 | (async () => { 35 | try { 36 | //console.log("\n=== Fetching DAO Tokens ==="); 37 | const daoTokens = await sdk.getDaoTokens({ 38 | page, 39 | limit, 40 | search, 41 | sortOrder, 42 | }); 43 | 44 | //console.log("\n=== Response ==="); 45 | const result = { 46 | success: true, 47 | daoTokens, 48 | }; 49 | console.log(JSON.stringify(result, null, 2)); 50 | } catch (error) { 51 | console.error("\nError fetching DAO tokens:", error); 52 | process.exit(1); 53 | } 54 | })(); 55 | -------------------------------------------------------------------------------- /src/stacks-faktory/get-faktory-sbtc.ts: -------------------------------------------------------------------------------- 1 | import { 2 | AnchorMode, 3 | makeContractCall, 4 | SignedContractCallOptions, 5 | } from "@stacks/transactions"; 6 | import { 7 | broadcastTx, 8 | CONFIG, 9 | createErrorResponse, 10 | deriveChildAccount, 11 | getFaktorySbtcContract, 12 | getNetwork, 13 | getNextNonce, 14 | sendToLLM, 15 | } from "../utilities"; 16 | 17 | const usage = "Usage: bun run get-faktory-sbtc.ts"; 18 | const usageExample = "Example: bun run get-faktory-sbtc.ts"; 19 | 20 | function validateArgs() { 21 | // verify all required arguments are provided 22 | if (process.argv.length !== 2) { 23 | const errorMessage = [ 24 | `Invalid arguments: ${process.argv.slice(2).join(" ")}`, 25 | usage, 26 | usageExample, 27 | ].join("\n"); 28 | throw new Error(errorMessage); 29 | } 30 | } 31 | 32 | async function main() { 33 | // validate args (not expecting any) 34 | validateArgs(); 35 | const [sbtcContractAddress, sbtcContractName] = getFaktorySbtcContract( 36 | CONFIG.NETWORK 37 | ); 38 | // setup network and wallet info 39 | const networkObj = getNetwork(CONFIG.NETWORK); 40 | const { address, key } = await deriveChildAccount( 41 | CONFIG.NETWORK, 42 | CONFIG.MNEMONIC, 43 | CONFIG.ACCOUNT_INDEX 44 | ); 45 | const nextPossibleNonce = await getNextNonce(CONFIG.NETWORK, address); 46 | // configure contract call options 47 | const txOptions: SignedContractCallOptions = { 48 | contractAddress: sbtcContractAddress, 49 | contractName: sbtcContractName, 50 | functionName: "faucet", 51 | functionArgs: [], 52 | network: networkObj, 53 | nonce: nextPossibleNonce, 54 | senderKey: key, 55 | }; 56 | // broadcast transaction and return response 57 | const transaction = await makeContractCall(txOptions); 58 | const broadcastResponse = await broadcastTx(transaction, networkObj); 59 | return broadcastResponse; 60 | } 61 | 62 | main() 63 | .then(sendToLLM) 64 | .catch((error) => { 65 | sendToLLM(createErrorResponse(error)); 66 | process.exit(1); 67 | }); 68 | -------------------------------------------------------------------------------- /src/stacks-faktory/get-token.ts: -------------------------------------------------------------------------------- 1 | import { FaktorySDK } from "@faktoryfun/core-sdk"; 2 | import { CONFIG } from "../utilities"; 3 | import dotenv from "dotenv"; 4 | 5 | dotenv.config(); 6 | 7 | const dexContract = process.argv[2]; 8 | 9 | if (!dexContract) { 10 | console.error("\nPlease provide parameters:"); 11 | console.error("bun run src/stacks-faktory/get-token.ts [dexContract]"); 12 | process.exit(1); 13 | } 14 | 15 | //console.log("\n=== Token Query Parameters ==="); 16 | //console.log("DEX Contract:", dexContract); 17 | //console.log("Network:", CONFIG.NETWORK); 18 | 19 | const sdk = new FaktorySDK({ 20 | network: CONFIG.NETWORK as "mainnet" | "testnet", 21 | hiroApiKey: CONFIG.HIRO_API_KEY, 22 | }); 23 | 24 | (async () => { 25 | try { 26 | //console.log("\n=== Fetching Token ==="); 27 | const token = await sdk.getToken(dexContract); 28 | 29 | //console.log("\n=== Response ==="); 30 | const result = { 31 | success: true, 32 | token, 33 | }; 34 | console.log(JSON.stringify(result, null, 2)); 35 | } catch (error) { 36 | console.error("\nError fetching token:", error); 37 | process.exit(1); 38 | } 39 | })(); 40 | -------------------------------------------------------------------------------- /src/stacks-stacking/pox-4/delegate-stx.ts: -------------------------------------------------------------------------------- 1 | import { TxBroadcastResult } from "@stacks/transactions"; 2 | import { 3 | CONFIG, 4 | deriveChildAccount, 5 | getNetwork, 6 | logBroadCastResult, 7 | stxToMicroStx, 8 | } from "../../utilities"; 9 | import { StackingClient } from "@stacks/stacking"; 10 | 11 | // CONFIGURATION 12 | const networkObj = getNetwork(CONFIG.NETWORK); 13 | 14 | type DelegateResponse = TxBroadcastResult & { 15 | from: string; 16 | }; 17 | 18 | // handles delegating STX to a pool 19 | async function delegateSTX( 20 | delegateTo: string, 21 | amountSTX: Number 22 | ): Promise { 23 | try { 24 | // get account info from env 25 | const network = CONFIG.NETWORK; 26 | const mnemonic = CONFIG.MNEMONIC; 27 | const accountIndex = CONFIG.ACCOUNT_INDEX; 28 | 29 | // get account address and private key 30 | const { address, key } = await deriveChildAccount( 31 | network, 32 | mnemonic, 33 | accountIndex 34 | ); 35 | 36 | // convert amount to microSTX 37 | const amountInMicroStx = stxToMicroStx(Number(amountSTX)); 38 | const client = new StackingClient({ 39 | address, 40 | network: networkObj, 41 | }); 42 | const delegetateResponse = await client.delegateStx({ 43 | amountMicroStx: amountInMicroStx, 44 | delegateTo, 45 | privateKey: key, 46 | }); 47 | return { 48 | from: address, 49 | ...delegetateResponse, 50 | }; 51 | } catch (error) { 52 | console.error(`Error delegating STX : ${error}`); 53 | return null; 54 | } 55 | } 56 | 57 | async function main() { 58 | // Get the poolAddress , amount(stx) in order from command line arguments and call delegateSTX 59 | const args = process.argv.slice(2); 60 | if (args.length < 2) { 61 | console.log("Usage: bun run delegate-stx.ts '"); 62 | return; 63 | } 64 | 65 | const recipient = args[0]; 66 | const amount = Number(args[1]); 67 | if (!recipient && !amount) { 68 | console.error("Please provide a recipient and amount as arguments."); 69 | return; 70 | } 71 | let delegateResponse = await delegateSTX(recipient, amount); 72 | //return if response is null as the error is logged by the returning function 73 | if (!delegateResponse) { 74 | return; 75 | } 76 | //handle response 77 | logBroadCastResult(delegateResponse, delegateResponse.from); 78 | } 79 | 80 | main(); 81 | -------------------------------------------------------------------------------- /src/stacks-stacking/pox-4/revoke-delegate-stx.ts: -------------------------------------------------------------------------------- 1 | import { TxBroadcastResult } from "@stacks/transactions"; 2 | import { 3 | CONFIG, 4 | deriveChildAccount, 5 | getNetwork, 6 | logBroadCastResult, 7 | } from "../../utilities"; 8 | import { StackingClient } from "@stacks/stacking"; 9 | 10 | // CONFIGURATION 11 | const networkObj = getNetwork(CONFIG.NETWORK); 12 | 13 | type DelegateResponse = TxBroadcastResult & { 14 | from: string; 15 | }; 16 | 17 | //sends transaction to revoke stx authority 18 | async function revokeDelegate(): Promise { 19 | try { 20 | // get account info from env 21 | const network = CONFIG.NETWORK; 22 | const mnemonic = CONFIG.MNEMONIC; 23 | const accountIndex = CONFIG.ACCOUNT_INDEX; 24 | 25 | // get account address and private key 26 | const { address, key } = await deriveChildAccount( 27 | network, 28 | mnemonic, 29 | accountIndex 30 | ); 31 | 32 | const client = new StackingClient({ 33 | address, 34 | network: networkObj, 35 | }); 36 | const delegetateResponse = await client.revokeDelegateStx(key); 37 | return { 38 | from: address, 39 | ...delegetateResponse, 40 | }; 41 | } catch (error) { 42 | console.error(`Error revoking: ${error}`); 43 | return null; 44 | } 45 | } 46 | 47 | async function main() { 48 | let revokeReponse = await revokeDelegate(); 49 | //return if response is null as the error is logged by the returning function 50 | if (!revokeReponse) { 51 | return; 52 | } 53 | //handle response 54 | logBroadCastResult(revokeReponse, revokeReponse.from); 55 | } 56 | 57 | main(); 58 | -------------------------------------------------------------------------------- /src/stacks-stacking/stacking-dao/stacking-dao-utilities.ts: -------------------------------------------------------------------------------- 1 | export const stakingDaoContractAddress = 2 | "SP4SZE494VC2YC5JYG7AYFQ44F5Q4PYV7DVMDPBG"; 3 | export const stakingDaoContractNames = { 4 | baseContract: `stacking-dao-core-v2`, 5 | reserveContract: `reserve-v1`, 6 | commissionContract: `commission-v1`, 7 | stakingContract: `staking-v0`, 8 | directHelpers: `direct-helpers-v1`, 9 | }; 10 | /** 11 | * returns joining address and name 12 | */ 13 | export function getStakingDaoContractID(name: string) { 14 | return `${stakingDaoContractAddress}.${name}`; 15 | } 16 | -------------------------------------------------------------------------------- /src/stacks-transactions/get-transaction-status.ts: -------------------------------------------------------------------------------- 1 | import { Transaction } from "@stacks/stacks-blockchain-api-types"; 2 | import { 3 | CONFIG, 4 | createErrorResponse, 5 | getApiUrl, 6 | sendToLLM, 7 | ToolResponse 8 | } from "../utilities"; 9 | 10 | const usage = "Usage: bun run get-transaction-status.ts "; 11 | const usageExample = "Example: bun run get-transaction-status.ts 0x1234567890abcdef1234567890abcdef1234567890abcdef1234567890abcdef"; 12 | 13 | interface ExpectedArgs { 14 | txId: string; 15 | } 16 | 17 | function validateArgs(): ExpectedArgs { 18 | const [txId] = process.argv.slice(2); 19 | if (!txId) { 20 | const errorMessage = [ 21 | "No transaction ID provided", 22 | usage, 23 | usageExample 24 | ].join("\n"); 25 | throw new Error(errorMessage); 26 | } 27 | return { txId }; 28 | } 29 | 30 | // gets transaction data from the API 31 | async function getTransaction(network: string, txId: string): Promise { 32 | const apiUrl = getApiUrl(network); 33 | const response = await fetch(`${apiUrl}/extended/v1/tx/${txId}`); 34 | if (!response.ok) { 35 | throw new Error(`Failed to get transaction: ${response.statusText}`); 36 | } 37 | const data = await response.json(); 38 | return data as Transaction; 39 | } 40 | 41 | async function main(): Promise> { 42 | // validate and store provided args 43 | const args = validateArgs(); 44 | 45 | // get transaction info from API 46 | const txResponse = await getTransaction(CONFIG.NETWORK, args.txId); 47 | 48 | // get transaction status from object 49 | const txStatus = txResponse.tx_status; 50 | 51 | return { 52 | success: true, 53 | message: `Transaction status retrieved successfully`, 54 | data: { txStatus } 55 | }; 56 | } 57 | 58 | main() 59 | .then(sendToLLM) 60 | .catch((error) => { 61 | sendToLLM(createErrorResponse(error)); 62 | process.exit(1); 63 | }); 64 | -------------------------------------------------------------------------------- /src/stacks-transactions/get-transaction.ts: -------------------------------------------------------------------------------- 1 | import { Transaction } from "@stacks/stacks-blockchain-api-types"; 2 | import { 3 | CONFIG, 4 | createErrorResponse, 5 | getApiUrl, 6 | sendToLLM, 7 | ToolResponse 8 | } from "../utilities"; 9 | 10 | const usage = "Usage: bun run get-transaction.ts "; 11 | const usageExample = "Example: bun run get-transaction.ts 0x1234567890abcdef1234567890abcdef1234567890abcdef1234567890abcdef"; 12 | 13 | interface ExpectedArgs { 14 | txId: string; 15 | } 16 | 17 | function validateArgs(): ExpectedArgs { 18 | const [txId] = process.argv.slice(2); 19 | if (!txId) { 20 | const errorMessage = [ 21 | "No transaction ID provided", 22 | usage, 23 | usageExample 24 | ].join("\n"); 25 | throw new Error(errorMessage); 26 | } 27 | return { txId }; 28 | } 29 | 30 | // gets transaction data from the API 31 | async function getTransaction(network: string, txId: string): Promise { 32 | const apiUrl = getApiUrl(network); 33 | const response = await fetch(`${apiUrl}/extended/v1/tx/${txId}`); 34 | if (!response.ok) { 35 | throw new Error(`Failed to get transaction: ${response.statusText}`); 36 | } 37 | const data = await response.json(); 38 | return data as Transaction; 39 | } 40 | 41 | async function main(): Promise> { 42 | // validate and store provided args 43 | const args = validateArgs(); 44 | 45 | // get transaction info from API 46 | const txResponse = await getTransaction(CONFIG.NETWORK, args.txId); 47 | 48 | return { 49 | success: true, 50 | message: `Transaction retrieved successfully`, 51 | data: txResponse 52 | }; 53 | } 54 | 55 | main() 56 | .then(sendToLLM) 57 | .catch((error) => { 58 | sendToLLM(createErrorResponse(error)); 59 | process.exit(1); 60 | }); 61 | -------------------------------------------------------------------------------- /src/stacks-wallet/get-address-balance.ts: -------------------------------------------------------------------------------- 1 | // CONFIGURATION 2 | 3 | import { StackingClient } from "@stacks/stacking"; 4 | import { CONFIG, getNetwork } from "../utilities"; 5 | 6 | // Function to get the balance of an address 7 | async function getAddressBalance(network: string, address: string) { 8 | const stacksNetwork = getNetwork(network); 9 | const client = new StackingClient({ 10 | address, 11 | network: stacksNetwork, 12 | }); 13 | 14 | try { 15 | const balance = await client.getAccountBalance(); 16 | const lockedBalance = await client.getAccountBalanceLocked(); 17 | const unlocked = balance - lockedBalance; 18 | return { 19 | total: balance.toString(), 20 | locked: lockedBalance.toString(), 21 | unlocked: unlocked.toString(), 22 | }; 23 | } catch (error) { 24 | throw new Error(`Failed to get address balance: ${error}`); 25 | } 26 | } 27 | 28 | async function main() { 29 | // expect txId as first argument 30 | const addr = process.argv[2]; 31 | if (!addr) { 32 | console.error("No address provided, exiting..."); 33 | return; 34 | } 35 | 36 | // get transaction info from API 37 | try { 38 | const balance = await getAddressBalance(CONFIG.NETWORK, addr); 39 | console.log(balance); 40 | } catch (error) { 41 | // report error 42 | console.error(`General/Unexpected Failure: ${error}`); 43 | } 44 | } 45 | 46 | main(); 47 | -------------------------------------------------------------------------------- /src/stacks-wallet/get-contest-wallet-addresses.ts: -------------------------------------------------------------------------------- 1 | import { CONFIG, deriveChildAccounts } from "../utilities"; 2 | 3 | // get first 10 account addresses from wallet 4 | 5 | // MAIN SCRIPT (DO NOT EDIT BELOW) 6 | 7 | async function main() { 8 | // get account info from env 9 | const network = CONFIG.NETWORK; 10 | const mnemonic = CONFIG.MNEMONIC; 11 | const desiredIndex = 200; 12 | 13 | // check that values exist for each 14 | if (!network) { 15 | throw new Error("No network provided in environment variables"); 16 | } 17 | if (!mnemonic) { 18 | throw new Error("No mnemonic provided in environment variables"); 19 | } 20 | 21 | // get account addresses 22 | const addresses = await deriveChildAccounts(network, mnemonic, desiredIndex); 23 | 24 | // log account addresses with their index 25 | addresses.forEach((address, index) => { 26 | console.log(`${index},${address}`); 27 | }); 28 | } 29 | 30 | main(); 31 | -------------------------------------------------------------------------------- /src/stacks-wallet/get-my-wallet-address.ts: -------------------------------------------------------------------------------- 1 | import { CONFIG, deriveChildAccount } from "../utilities"; 2 | 3 | // get address for a given account index in the wallet 4 | 5 | async function main() { 6 | // get account info from env 7 | const network = CONFIG.NETWORK; 8 | const mnemonic = CONFIG.MNEMONIC; 9 | const accountIndex = CONFIG.ACCOUNT_INDEX; 10 | 11 | // check that values exist for each 12 | if (!network) { 13 | throw new Error("No network provided in environment variables"); 14 | } 15 | if (!mnemonic) { 16 | throw new Error("No mnemonic provided in environment variables"); 17 | } 18 | 19 | // get account address 20 | const { address } = await deriveChildAccount(network, mnemonic, accountIndex); 21 | 22 | // log account address with account index 23 | console.log(`${address}`); 24 | } 25 | 26 | main(); 27 | -------------------------------------------------------------------------------- /src/stacks-wallet/get-my-wallet-status.ts: -------------------------------------------------------------------------------- 1 | import { CONFIG, deriveChildAccount, getNextNonce } from "../utilities"; 2 | 3 | // get currently selected wallet info from env file 4 | 5 | // MAIN SCRIPT (DO NOT EDIT BELOW) 6 | 7 | async function main() { 8 | // get account info from env 9 | const network = CONFIG.NETWORK; 10 | const mnemonic = CONFIG.MNEMONIC; 11 | const accountIndex = CONFIG.ACCOUNT_INDEX; 12 | // check that values exist for each 13 | if (!network) { 14 | throw new Error("No network provided in environment variables"); 15 | } 16 | if (!mnemonic) { 17 | throw new Error("No mnemonic provided in environment variables"); 18 | } 19 | 20 | // get account address 21 | const { address } = await deriveChildAccount(network, mnemonic, accountIndex); 22 | // get the current nonce for the account 23 | const nonce = await getNextNonce(network, address); 24 | // log the account info 25 | console.log(`Account index: ${accountIndex}`); 26 | console.log(`Account address: ${address}`); 27 | console.log(`Nonce: ${nonce}`); 28 | } 29 | 30 | main(); 31 | -------------------------------------------------------------------------------- /src/stacks-wallet/get-my-wallet-transactions.ts: -------------------------------------------------------------------------------- 1 | // CONFIGURATION 2 | 3 | import { Transaction } from "@stacks/stacks-blockchain-api-types"; 4 | import { CONFIG, getApiUrl, deriveChildAccount } from "../utilities"; 5 | 6 | // gets transaction data from the API 7 | interface TransactionsResponse { 8 | results: Transaction[]; 9 | } 10 | 11 | async function getWalletTransactions(network: string, address: string) { 12 | const apiUrl = getApiUrl(network); 13 | const response = await fetch( 14 | `${apiUrl}/extended/v2/addresses/${address}/transactions` 15 | ); 16 | if (!response.ok) { 17 | throw new Error(`Failed to get transactions: ${response.statusText}`); 18 | } 19 | const data = (await response.json()) as TransactionsResponse; 20 | return data.results; 21 | } 22 | 23 | // MAIN SCRIPT (DO NOT EDIT) 24 | 25 | async function main() { 26 | // get account info from env 27 | const network = CONFIG.NETWORK; 28 | const mnemonic = CONFIG.MNEMONIC; 29 | const accountIndex = CONFIG.ACCOUNT_INDEX; 30 | 31 | // check that values exist for each 32 | if (!network) { 33 | throw new Error("No network provided in environment variables"); 34 | } 35 | if (!mnemonic) { 36 | throw new Error("No mnemonic provided in environment variables"); 37 | } 38 | 39 | try { 40 | // Get wallet address 41 | const { address } = await deriveChildAccount( 42 | network, 43 | mnemonic, 44 | accountIndex 45 | ); 46 | 47 | // Get transactions for the address 48 | const txResponse = await getWalletTransactions(network, address); 49 | console.log(JSON.stringify(txResponse, null, 2)); 50 | } catch (error) { 51 | // report error 52 | console.error(`General/Unexpected Failure: ${error}`); 53 | } 54 | } 55 | 56 | main(); 57 | -------------------------------------------------------------------------------- /src/stacks-wallet/sign-message.ts: -------------------------------------------------------------------------------- 1 | import { 2 | signStructuredData, 3 | stringAsciiCV, 4 | tupleCV, 5 | uintCV, 6 | } from "@stacks/transactions"; 7 | import { generateSecretKey } from "@stacks/wallet-sdk"; 8 | 9 | import { 10 | CONFIG, 11 | deriveChildAccount, 12 | getNetwork, 13 | getTxVersion, 14 | } from "../utilities"; 15 | 16 | // MAIN SCRIPT (DO NOT EDIT BELOW) 17 | 18 | async function main() { 19 | // ACCOUNT INFO 20 | 21 | // get account info from env 22 | const network = CONFIG.NETWORK; 23 | const mnemonic = CONFIG.MNEMONIC; 24 | const accountIndex = CONFIG.ACCOUNT_INDEX; 25 | // check that values exist for each 26 | if (!network) { 27 | throw new Error("No network provided in environment variables"); 28 | } 29 | if (!mnemonic) { 30 | throw new Error("No mnemonic provided in environment variables"); 31 | } 32 | 33 | // get network object 34 | const networkObj = getNetwork(network); 35 | // get tx version object 36 | const txVersion = getTxVersion(network); 37 | // get account address and private key 38 | const { address, key: privateKeyString } = await deriveChildAccount( 39 | network, 40 | mnemonic, 41 | accountIndex 42 | ); 43 | 44 | // SIGNING THE MESSAGE 45 | 46 | // create private key obj for signature function 47 | const privateKey = privateKeyString; 48 | // create a domain object as a clarity value 49 | // based on @stacks.js/transactions signature test 50 | // https://github.com/hirosystems/stacks.js/blob/fc7e50cb1dca6402677451be06534f0a8f1346b3/packages/transactions/tests/structuredDataSignature.test.ts#L214-L242 51 | const domain = tupleCV({ 52 | name: stringAsciiCV("aibtcdev"), 53 | version: stringAsciiCV("0.0.2"), 54 | "chain-id": uintCV(networkObj.chainId), 55 | }); 56 | // create the message to be signed as a clarity value 57 | const message = stringAsciiCV(address); 58 | // sign the message 59 | // this is type 10: StructuredDataSignature 60 | const signedMessage = signStructuredData({ 61 | message, 62 | domain, 63 | privateKey, 64 | }); 65 | // output signed message data 66 | console.log(signedMessage); 67 | } 68 | 69 | main(); 70 | -------------------------------------------------------------------------------- /src/stacks-wallet/sign.ts: -------------------------------------------------------------------------------- 1 | import { 2 | signStructuredData, 3 | stringAsciiCV, 4 | tupleCV, 5 | uintCV, 6 | } from "@stacks/transactions"; 7 | import { deriveChildAccount, getNetwork, CONFIG } from "../utilities.js"; 8 | 9 | async function signMessage() { 10 | const { NETWORK, MNEMONIC, ACCOUNT_INDEX } = CONFIG; 11 | 12 | // Ensure config values are present 13 | if (!NETWORK) { 14 | throw new Error("No network provided in environment variables"); 15 | } 16 | if (!MNEMONIC) { 17 | throw new Error("No mnemonic provided in environment variables"); 18 | } 19 | if (!ACCOUNT_INDEX) { 20 | throw new Error("No account index provided in environment variables"); 21 | } 22 | 23 | const networkObj = getNetwork(NETWORK); 24 | const { address, key: privateKeyString } = await deriveChildAccount( 25 | NETWORK, 26 | MNEMONIC, 27 | ACCOUNT_INDEX 28 | ); 29 | 30 | // Use privateKeyString directly instead of createStacksPrivateKey 31 | const privateKey = privateKeyString; 32 | 33 | // Domain and message values 34 | const domain = tupleCV({ 35 | name: stringAsciiCV("aibtcdev"), 36 | version: stringAsciiCV("0.0.2"), 37 | "chain-id": uintCV(networkObj.chainId), 38 | }); 39 | 40 | const message = stringAsciiCV(address); 41 | 42 | const signedMessage = signStructuredData({ 43 | message, 44 | domain, 45 | privateKey, 46 | }); 47 | 48 | return { signedMessage, address }; 49 | } 50 | 51 | signMessage() 52 | .then(({ signedMessage, address }) => { 53 | console.log(`Signed Message: ${signedMessage}`); 54 | console.log(`Signed By: ${address}`); 55 | }) 56 | .catch(console.error); 57 | -------------------------------------------------------------------------------- /src/stacks-wallet/testnet-stx-faucet-me.ts: -------------------------------------------------------------------------------- 1 | // CONFIGURATION 2 | 3 | import { CONFIG, getApiUrl, deriveChildAccount } from "../utilities"; 4 | 5 | async function getFaucetDrop( 6 | network: string, 7 | address: string, 8 | ) { 9 | if (network !== "testnet") { 10 | throw new Error("Faucet drops are only available on the testnet."); 11 | } 12 | 13 | const apiUrl = getApiUrl(network); 14 | const response = await fetch( 15 | `${apiUrl}/extended/v1/faucets/stx?address=${address}`, 16 | { 17 | method: "POST", 18 | headers: { 19 | Accept: "application/json", 20 | }, 21 | } 22 | ); 23 | 24 | if (!response.ok) { 25 | throw new Error(`Failed to get faucet drop: ${response.statusText}`); 26 | } 27 | 28 | const data = await response.json(); 29 | return data; 30 | } 31 | 32 | async function main() { 33 | // get account info from env 34 | const network = CONFIG.NETWORK; 35 | const mnemonic = CONFIG.MNEMONIC; 36 | const accountIndex = CONFIG.ACCOUNT_INDEX; 37 | 38 | // check that values exist for each 39 | if (!network) { 40 | throw new Error("No network provided in environment variables"); 41 | } 42 | if (!mnemonic) { 43 | throw new Error("No mnemonic provided in environment variables"); 44 | } 45 | 46 | // get account address 47 | const { address } = await deriveChildAccount(network, mnemonic, accountIndex); 48 | 49 | // get transaction info from API 50 | try { 51 | const balance = await getFaucetDrop(CONFIG.NETWORK, address); 52 | console.log(balance); 53 | } catch (error) { 54 | // report error 55 | console.error(`General/Unexpected Failure: ${error}`); 56 | } 57 | } 58 | 59 | main(); 60 | -------------------------------------------------------------------------------- /src/stacks-wallet/testnet-stx-faucet.ts: -------------------------------------------------------------------------------- 1 | // CONFIGURATION 2 | 3 | import { CONFIG, getApiUrl } from "../utilities"; 4 | 5 | async function getFaucetDrop( 6 | network: string, 7 | address: string, 8 | unanchored: boolean = true 9 | ) { 10 | if (network !== "testnet") { 11 | throw new Error("Faucet drops are only available on the testnet."); 12 | } 13 | 14 | const apiUrl = getApiUrl(network); 15 | const response = await fetch( 16 | `${apiUrl}/extended/v1/faucets/stx?address=${address}&unanchored=${unanchored}`, 17 | { 18 | method: "POST", 19 | headers: { 20 | Accept: "application/json", 21 | }, 22 | } 23 | ); 24 | 25 | if (!response.ok) { 26 | throw new Error(`Failed to get faucet drop: ${response.statusText}`); 27 | } 28 | 29 | const data = await response.json(); 30 | return data; 31 | } 32 | 33 | async function main() { 34 | // expect txId as first argument 35 | const addr = process.argv[2]; 36 | if (!addr) { 37 | console.error("No address provided, exiting..."); 38 | return; 39 | } 40 | 41 | // get transaction info from API 42 | try { 43 | const balance = await getFaucetDrop(CONFIG.NETWORK, addr); 44 | console.log(balance); 45 | } catch (error) { 46 | // report error 47 | console.error(`General/Unexpected Failure: ${error}`); 48 | } 49 | } 50 | 51 | main(); 52 | -------------------------------------------------------------------------------- /tsconfig.json: -------------------------------------------------------------------------------- 1 | { 2 | "compilerOptions": { 3 | "target": "esnext", 4 | "module": "esnext", 5 | "lib": ["esnext"], 6 | "declaration": true, 7 | "declarationMap": true, 8 | "sourceMap": true, 9 | "outDir": "./dist", 10 | "rootDir": "./src", 11 | "strict": true, 12 | "moduleResolution": "node", 13 | "esModuleInterop": true, 14 | "skipLibCheck": true, 15 | "forceConsistentCasingInFileNames": true 16 | }, 17 | "include": ["src/**/*"], 18 | "exclude": ["node_modules", "dist", "**/*.test.ts"] 19 | } 20 | -------------------------------------------------------------------------------- /tsup.config.ts: -------------------------------------------------------------------------------- 1 | import { defineConfig } from "tsup"; 2 | 3 | export default defineConfig({ 4 | entry: ["src/index.ts"], 5 | format: ["cjs", "esm"], 6 | dts: true, 7 | clean: true, 8 | sourcemap: true, 9 | treeshake: true, 10 | external: [ 11 | "@stacks/blockchain-api-client", 12 | "@stacks/network", 13 | "@stacks/transactions", 14 | ], 15 | outExtension({ format }) { 16 | return { 17 | js: format === "cjs" ? ".cjs" : ".js", 18 | }; 19 | }, 20 | }); 21 | --------------------------------------------------------------------------------